@arbidocs/blocks 0.4.73 → 0.4.75
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.
- package/README.md +2 -1
- package/dist/agents/index.cjs +255 -254
- package/dist/agents/index.js +5 -4
- package/dist/agents/workflows/WorkflowRunner.d.ts +20 -4
- package/dist/agents/workflows/WorkflowStepBar.d.ts +23 -0
- package/dist/agents/workflows/run.d.ts +1 -0
- package/dist/agents/workflows/types.d.ts +2 -0
- package/dist/chat/index.cjs +124 -124
- package/dist/chat/index.js +3 -3
- package/dist/{chunk-3SFFTSOI.cjs → chunk-7CVF3DK2.cjs} +5 -5
- package/dist/{chunk-3SFFTSOI.cjs.map → chunk-7CVF3DK2.cjs.map} +1 -1
- package/dist/{chunk-V3L5DONY.cjs → chunk-B4SRYJLM.cjs} +31 -2
- package/dist/chunk-B4SRYJLM.cjs.map +1 -0
- package/dist/{chunk-IUR565UW.cjs → chunk-F4LUD3YC.cjs} +49 -48
- package/dist/chunk-F4LUD3YC.cjs.map +1 -0
- package/dist/{chunk-WOYUXVVQ.cjs → chunk-HITAN7JF.cjs} +4 -4
- package/dist/{chunk-WOYUXVVQ.cjs.map → chunk-HITAN7JF.cjs.map} +1 -1
- package/dist/{chunk-3VQYJBOI.js → chunk-HOXKR26S.js} +31 -4
- package/dist/chunk-HOXKR26S.js.map +1 -0
- package/dist/{chunk-KJ3QEKOJ.cjs → chunk-IPGKTUF7.cjs} +7 -33
- package/dist/chunk-IPGKTUF7.cjs.map +1 -0
- package/dist/{chunk-IA7RTPT3.cjs → chunk-IXALYQT7.cjs} +2 -200
- package/dist/chunk-IXALYQT7.cjs.map +1 -0
- package/dist/{chunk-QDNXEB3T.js → chunk-LT2UORRG.js} +7 -6
- package/dist/chunk-LT2UORRG.js.map +1 -0
- package/dist/{chunk-ORA2XE7U.js → chunk-MK6NJQGF.js} +3 -3
- package/dist/{chunk-ORA2XE7U.js.map → chunk-MK6NJQGF.js.map} +1 -1
- package/dist/chunk-NUNKSZKU.js +203 -0
- package/dist/chunk-NUNKSZKU.js.map +1 -0
- package/dist/{chunk-6OL5S7MJ.cjs → chunk-NYBIKDWI.cjs} +5 -2
- package/dist/chunk-NYBIKDWI.cjs.map +1 -0
- package/dist/{chunk-GTNUQBXI.cjs → chunk-P2RBE3FD.cjs} +254 -102
- package/dist/chunk-P2RBE3FD.cjs.map +1 -0
- package/dist/{chunk-D46ZAPEE.js → chunk-R3PDNQYT.js} +5 -2
- package/dist/chunk-R3PDNQYT.js.map +1 -0
- package/dist/{chunk-G5DP27DU.js → chunk-UIWLDSTF.js} +3 -29
- package/dist/chunk-UIWLDSTF.js.map +1 -0
- package/dist/chunk-V4ISCZJ7.cjs +207 -0
- package/dist/chunk-V4ISCZJ7.cjs.map +1 -0
- package/dist/{chunk-VRPRAU3J.js → chunk-WJEKRSPH.js} +3 -3
- package/dist/{chunk-VRPRAU3J.js.map → chunk-WJEKRSPH.js.map} +1 -1
- package/dist/{chunk-2P3T23C7.js → chunk-YWYVIQ7T.js} +256 -104
- package/dist/chunk-YWYVIQ7T.js.map +1 -0
- package/dist/{chunk-BUHKUKKB.js → chunk-ZPLG7QYF.js} +4 -199
- package/dist/chunk-ZPLG7QYF.js.map +1 -0
- package/dist/connect/index.cjs +96 -37
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +81 -22
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedWorkflowRunner.d.ts +5 -1
- package/dist/connection/useWorkflowThread.d.ts +4 -0
- package/dist/databases/DatabaseColumnDialog.d.ts +43 -0
- package/dist/databases/DatabaseList.d.ts +28 -0
- package/dist/databases/DatabaseTable.d.ts +38 -0
- package/dist/databases/DatabaseToolbar.d.ts +38 -0
- package/dist/databases/NewDatabaseDialog.d.ts +25 -0
- package/dist/databases/SelectCellEditor.d.ts +6 -0
- package/dist/databases/SelectChip.d.ts +4 -0
- package/dist/databases/column-types.d.ts +58 -0
- package/dist/databases/databaseColumns.d.ts +28 -0
- package/dist/databases/index.cjs +1081 -0
- package/dist/databases/index.cjs.map +1 -0
- package/dist/databases/index.d.ts +13 -0
- package/dist/databases/index.js +1055 -0
- package/dist/databases/index.js.map +1 -0
- package/dist/facts/index.cjs +7 -6
- package/dist/facts/index.cjs.map +1 -1
- package/dist/facts/index.js +3 -2
- package/dist/facts/index.js.map +1 -1
- package/dist/files/index.cjs +14 -13
- package/dist/files/index.cjs.map +1 -1
- package/dist/files/index.js +4 -2
- package/dist/files/index.js.map +1 -1
- package/dist/index.cjs +632 -631
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +12 -11
- package/dist/index.js.map +1 -1
- package/dist/settings/index.cjs +1 -1
- package/dist/settings/index.js +1 -1
- package/dist/shell/ActionCluster.d.ts +3 -1
- package/dist/shell/index.cjs +45 -45
- package/dist/shell/index.js +1 -1
- package/dist/studio/index.cjs +4 -4
- package/dist/studio/index.js +3 -3
- package/dist/workflow-canvas/StepInspector.d.ts +11 -0
- package/dist/workflow-canvas/WorkflowCanvas.d.ts +6 -2
- package/dist/workflow-canvas/index.cjs +202 -91
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workflow-canvas/index.js +170 -59
- package/dist/workflow-canvas/index.js.map +1 -1
- package/dist/workflow-canvas/viewport.d.ts +47 -0
- package/package.json +9 -4
- package/dist/chunk-2P3T23C7.js.map +0 -1
- package/dist/chunk-3VQYJBOI.js.map +0 -1
- package/dist/chunk-6OL5S7MJ.cjs.map +0 -1
- package/dist/chunk-BUHKUKKB.js.map +0 -1
- package/dist/chunk-D46ZAPEE.js.map +0 -1
- package/dist/chunk-G5DP27DU.js.map +0 -1
- package/dist/chunk-GTNUQBXI.cjs.map +0 -1
- package/dist/chunk-IA7RTPT3.cjs.map +0 -1
- package/dist/chunk-IUR565UW.cjs.map +0 -1
- package/dist/chunk-KJ3QEKOJ.cjs.map +0 -1
- package/dist/chunk-QDNXEB3T.js.map +0 -1
- package/dist/chunk-V3L5DONY.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agents/workflows/types.ts","../src/agents/workflows/workflow.ts","../src/agents/workflows/SchemaForm.tsx","../src/agents/workflows/run.ts","../src/agents/workflows/planSteps.ts","../src/agents/workflows/useWorkflowView.ts","../src/agents/workflows/WorkflowRunner.tsx"],"names":["jsx","Input","Textarea","Switch","jsxs","prefixedTestId","cn","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Label","Fragment","useState","testIdOr","FoldSection","compact","useRef","useEffect","useCallback","act","useMemo","Check","Loader2","AlertTriangle","MinusCircle","Card","CheckCircle2","Button","UploadDropzone","FileText","ArrowLeft","ArrowRight","RotateCw","GitBranch"],"mappings":"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","file":"chunk-GTNUQBXI.cjs","sourcesContent":["/**\n * The one workflow model: a skill with a declared input schema. Everything launchable (a quick\n * action, a slash skill, a task body, an agent's job) is a `WorkflowDefinition`.\n *\n * The shape maps 1:1 onto future SKILL.md frontmatter (`inputs:` etc., snake_case on disk; see\n * `workflowFromFrontmatter`), so the backend can adopt it without a UI change. Blocks hold no\n * domain wording: titles, labels and prompt text are data supplied by the host.\n */\n\nexport type WorkflowFieldType =\n 'text' | 'longtext' | 'boolean' | 'select' | 'number' | 'date' | 'scope' | 'documents'\n\n/**\n * What a launching surface can hand a workflow without asking the user: the files it is looking at\n * (`documents`), the text the user selected (`selection`), or the image on screen (`image`, a file\n * id). A field binds to one with `context`; a surface offers a workflow when it can supply one of\n * the kinds the workflow declares (`workflowAccepts`).\n */\nexport type WorkflowContextKind = 'documents' | 'selection' | 'image'\n\n/** Where the user ends up after launching. `current-chat` sends into the chat already on screen. */\nexport type WorkflowLanding = 'chat' | 'current-chat' | 'files'\n\n/** Which files a run is limited to. Empty folders and labels = every file. */\nexport interface WorkflowScope {\n /** Folder paths; `''` is the unfiled bucket. */\n folders: string[]\n /** Label (tag) ids. */\n labels: string[]\n /** Exactly these files (ids). When present it wins over folders and labels: a `documents` field or a context launch. */\n documents?: string[]\n}\n\nexport const EMPTY_WORKFLOW_SCOPE: WorkflowScope = { folders: [], labels: [] }\n\nexport type WorkflowInputValue = string | number | boolean | WorkflowScope\n\nexport interface WorkflowFieldOption {\n value: string\n label: string\n description?: string\n /** Prompt fragment substituted for `{{name}}` when chosen (falls back to the label). */\n text?: string\n /** Key into the host's icon map. */\n icon?: string\n}\n\nexport interface WorkflowField {\n /** Key in `inputs`; also the `{{placeholder}}` in the prompt template. */\n name: string\n type: WorkflowFieldType\n label: string\n description?: string\n placeholder?: string\n required?: boolean\n default?: WorkflowInputValue\n /** `select` only. */\n options?: WorkflowFieldOption[]\n /** `number` only. */\n min?: number\n max?: number\n /** `boolean`: prompt fragments substituted for `{{name}}`. */\n trueText?: string\n falseText?: string\n /** Fold behind a disclosure: advanced wording the common run does not need. */\n advanced?: boolean\n /** `scope` only: which dimensions are offered. Default both. */\n by?: Array<'folders' | 'labels'>\n /** `documents` only: what kind of file is offered; `max` is how many may be picked (default 1). */\n accept?: 'image'\n /** Prefilled by a launching surface that supplies this kind of context (see `WorkflowContextKind`). */\n context?: WorkflowContextKind\n}\n\nexport type WorkflowRun =\n /** Compose a message from `promptTemplate` and send it. */\n | { kind: 'prompt'; promptTemplate: string }\n /** The host performs it (bound by workflow id), e.g. create a label then generate. */\n | { kind: 'operation' }\n /**\n * A guided run of named steps that form a graph. A run is a work thread on the server: the\n * thread's plan carries the steps (`toPlanSteps`), its activity log records each step's progress,\n * and the work runner starts each agent step as a turn in the thread. A person does the form,\n * upload and review steps (`useWorkflowThread` / `WorkflowRunner`). Not schedulable from a single\n * form: a workflow (automation) carries the steps and its trigger (`WorkflowBuilder`).\n */\n | {\n kind: 'steps'\n /** The run thread's title, a template over the run's inputs; defaults to the workflow's. */\n threadTitle?: string\n /** In dependency order: a step only waits for steps listed before it (`orderSteps`). */\n steps: WorkflowStep[]\n completion?: WorkflowCompletion\n /** Where each step sits on the builder's canvas, by step id. */\n layout?: Record<string, { x: number; y: number }>\n }\n\n/* ------------------------------- steps ------------------------------- */\n\ninterface WorkflowStepBase {\n /** Unique within the workflow (`[a-z][a-z0-9_-]*`): the thread's progress is keyed by it. */\n id: string\n /** The step's name: the stepper and the thread's top bar show it. */\n title: string\n /** One line under the step's heading. */\n description?: string\n /** Key into the host's icon map. */\n icon?: string\n /**\n * The host commits this step before the run moves on (`commit[id]`), e.g. creates the record\n * later steps work in. Once committed the step's inputs are locked.\n */\n commit?: boolean\n /** Primary button text while on this step (until it is committed); defaults to \"Continue\". */\n nextLabel?: string\n /**\n * The steps this one waits for. Absent: the step before it in the list, so a plain list is a\n * sequence. `[]`: it starts with the run. A step waiting for several waits for them all.\n */\n after?: string[]\n}\n\n/** Ask for inputs. Every step's fields share the run's one input namespace (`{{name}}`). */\nexport interface WorkflowFormStep extends WorkflowStepBase {\n kind: 'form'\n inputs: WorkflowField[]\n}\n\n/** Add files to the run's workspace. Skippable unless `required`. */\nexport interface WorkflowUploadStep extends WorkflowStepBase {\n kind: 'upload'\n required?: boolean\n /** `accept` of the file picker, e.g. `.pdf,.docx`. */\n accept?: string\n /** Small muted line under the drop target. */\n hint?: string\n}\n\n/**\n * A turn the assistant takes in the run's thread. It runs a skill or another workflow\n * (`workflow`, its inputs filled from `with`) or its own `run`. It continues the thread's main\n * line, so it sees everything before it; a `branch` step runs off the main line instead and\n * delivers only its result back to it.\n */\nexport interface WorkflowAgentStep extends WorkflowStepBase {\n kind: 'agent'\n /** Id of the skill or workflow this step runs; its inputs come from `with`. */\n workflow?: string\n /**\n * The named workflow's inputs, each a template over the run's inputs: `{{client}}`, with\n * `{{a || b}}` falling back to `b` when `a` is blank. A bare `{{name}}` passes the value as is.\n */\n with?: Record<string, string>\n /** Used when no `workflow` is named. `operation`: the host composes the prompt (`compose`). */\n run?: Extract<WorkflowRun, { kind: 'prompt' } | { kind: 'operation' }>\n /** What the step shows: the answer (default) or the drafted document. */\n output?: 'answer' | 'artifact'\n /** Runs off the thread's main line and delivers only its result to it. */\n branch?: boolean\n}\n\n/** A person's review or approval: whoever completes it on the thread approves it. */\nexport interface WorkflowReviewStep extends WorkflowStepBase {\n kind: 'review'\n /** What to review, a template over the run's inputs. */\n instructions?: string\n}\n\nexport type WorkflowStep =\n WorkflowFormStep | WorkflowUploadStep | WorkflowAgentStep | WorkflowReviewStep\n\n/** The finish screen of a stepped run. */\nexport interface WorkflowCompletion {\n title: string\n description?: string\n icon?: string\n}\n\n/**\n * Where a step of a run is, as the thread records it: not reached yet (`pending`), `running`,\n * `done`, `skipped`, or `failed` (it can be retried or skipped).\n */\nexport type WorkflowStepStatus = 'pending' | 'running' | 'done' | 'skipped' | 'failed'\n\nexport interface WorkflowStepState {\n status: WorkflowStepStatus\n /** The step's answer in the thread (an agent step), or the result a branch delivered. */\n responseId?: string | null\n /** The answer's text, once read. */\n text?: string\n error?: string | null\n}\n\nexport interface WorkflowDefinition {\n /** Execute a document operation directly, without creating a chat. */\n documentAction?: 'annotate_documents' | 'email_documents'\n\n /** The skill slug. */\n id: string\n title: string\n /** One line: the tile text and the task picker's hint. */\n description: string\n /** Longer explanation shown in the dialog header; defaults to `description`. */\n details?: string\n /** Key into the host's icon map. */\n icon?: string\n /** Primary button text; defaults to the dialog's generic \"Start\". */\n startLabel?: string\n /** Shipped with the app/deployment (pinned, not deletable, forkable into the user's own skills). */\n builtin?: boolean\n /** Backed by a server skill (its slug): a task runs it as a skill rather than as a prompt. */\n skill?: string\n inputs: WorkflowField[]\n run: WorkflowRun\n /** Where the user ends up after launching by default; a launch may override it. */\n landing: WorkflowLanding\n /** A model this run asks for (a run option the host applies, e.g. a stronger one for summaries). */\n model?: string\n /** Only offered by this host (e.g. `'word'`); absent = offered everywhere. */\n host?: string\n /** Needs workspace files to make sense: the dialog offers the host's add-files slot when none. */\n requiresFiles?: boolean\n /** Default agent; absent = the user's own assistant. */\n defaultAgentId?: string\n /** A free-form entry (\"my own instruction\", \"remind me\"), not a named skill: it does not name the dialog. */\n generic?: boolean\n /** Can be the body of a task (unattended). `action` workflows are not. */\n schedulable?: boolean\n /** Run options the form offers (all shown by default). */\n options?: { agent?: boolean }\n}\n\n/** What `onLaunch` receives. The host performs the launch (chat, scoping, send). */\nexport interface WorkflowLaunch {\n workflow: WorkflowDefinition\n inputs: Record<string, WorkflowInputValue>\n /** The first `scope` field's value, hoisted: the host scopes documents with it. */\n scope: WorkflowScope\n /** `undefined` = the user's own assistant, in this chat. */\n agentId?: string\n /** Overrides `workflow.landing` for this launch (the empty chat sends in place). */\n landing?: WorkflowLanding\n}\n\nexport type OnWorkflowLaunch = (launch: WorkflowLaunch) => void | Promise<void>\n\nexport type WorkflowInputs = Record<string, WorkflowInputValue>\n\n/** Validation problem of one field: the dialog maps the code to a label. */\nexport type WorkflowFieldError = 'required' | 'min' | 'max' | 'number'\nexport type WorkflowErrors = Record<string, WorkflowFieldError>\n","import {\n EMPTY_WORKFLOW_SCOPE,\n type WorkflowDefinition,\n type WorkflowErrors,\n type WorkflowField,\n type WorkflowFieldOption,\n type WorkflowContextKind,\n type WorkflowFieldType,\n type WorkflowInputs,\n type WorkflowInputValue,\n type WorkflowLaunch,\n type WorkflowScope,\n} from './types'\n\nexport const isWorkflowScope = (value: unknown): value is WorkflowScope =>\n typeof value === 'object' &&\n value !== null &&\n Array.isArray((value as WorkflowScope).folders) &&\n Array.isArray((value as WorkflowScope).labels)\n\nexport const isEmptyWorkflowScope = (scope: WorkflowScope): boolean =>\n scope.folders.length === 0 && scope.labels.length === 0 && !scope.documents?.length\n\n/** A field that selects files: a folder/label scope or an explicit pick. */\nconst isFileField = (field: WorkflowField): boolean =>\n field.type === 'scope' || field.type === 'documents'\n\nfunction emptyValue(field: WorkflowField): WorkflowInputValue {\n switch (field.type) {\n case 'boolean':\n return false\n case 'scope':\n return { folders: [], labels: [] }\n case 'documents':\n return { folders: [], labels: [], documents: [] }\n default:\n return ''\n }\n}\n\n/** The inputs a fresh form starts with: each field's default, else an empty value of its type. */\nexport function defaultInputs(workflow: WorkflowDefinition): WorkflowInputs {\n const inputs: WorkflowInputs = {}\n for (const field of workflow.inputs) {\n const d = field.default\n inputs[field.name] =\n d === undefined\n ? emptyValue(field)\n : isWorkflowScope(d)\n ? { ...d }\n : (d as WorkflowInputValue)\n }\n return inputs\n}\n\n/** Required-field and range problems, keyed by field name. Empty object = launchable. */\nexport function validateInputs(\n workflow: WorkflowDefinition,\n inputs: WorkflowInputs\n): WorkflowErrors {\n const errors: WorkflowErrors = {}\n for (const field of workflow.inputs) {\n const value = inputs[field.name]\n if (field.type === 'number') {\n const blank = value === '' || value === undefined\n if (blank) {\n if (field.required) errors[field.name] = 'required'\n continue\n }\n const n = Number(value)\n if (Number.isNaN(n)) errors[field.name] = 'number'\n else if (field.min !== undefined && n < field.min) errors[field.name] = 'min'\n else if (field.max !== undefined && n > field.max) errors[field.name] = 'max'\n continue\n }\n if (!field.required) continue\n if (field.type === 'documents') {\n if (!isWorkflowScope(value) || !value.documents?.length) errors[field.name] = 'required'\n continue\n }\n if (field.type === 'boolean' || field.type === 'scope') continue\n if (typeof value !== 'string' || value.trim() === '') errors[field.name] = 'required'\n }\n return errors\n}\n\n/**\n * The field that holds what the user asks for: the first common (not folded away) free-text field.\n * Text typed after a slash pre-fills it; the form puts the cursor in it when it comes first.\n */\nexport function promptFieldName(workflow: WorkflowDefinition): string | undefined {\n return workflow.inputs.find((f) => !f.advanced && (f.type === 'text' || f.type === 'longtext'))\n ?.name\n}\n\n/** What the host knows that the inputs alone do not: file ids resolved to names for the wording. */\nexport interface WorkflowComposeContext {\n documentTitles?: Record<string, string>\n}\n\nconst quoteList = (names: string[]): string => {\n const quoted = names.map((n) => `\"${n}\"`)\n return quoted.length <= 1\n ? (quoted[0] ?? '')\n : `${quoted.slice(0, -1).join(', ')} and ${quoted[quoted.length - 1]}`\n}\n\nfunction fragment(\n field: WorkflowField,\n value: WorkflowInputValue | undefined,\n ctx: WorkflowComposeContext | undefined\n): string {\n switch (field.type) {\n case 'documents': {\n // The quoted file name(s): \"the document <name>\" reads the same whichever file was picked.\n const ids = isWorkflowScope(value) ? (value.documents ?? []) : []\n const names = ids.flatMap((id) => {\n const title = ctx?.documentTitles?.[id]\n return title ? [title] : []\n })\n return quoteList(names)\n }\n case 'boolean':\n return value ? (field.trueText ?? 'yes') : (field.falseText ?? 'no')\n case 'select': {\n const option = field.options?.find((o) => o.value === value)\n return option ? (option.text ?? option.label) : String(value ?? '')\n }\n case 'scope':\n // The scope decides WHICH files the run is given; naming it in the wording only churns it.\n return ''\n default:\n return typeof value === 'string' ? value.trim() : String(value ?? '')\n }\n}\n\n/**\n * The single place a prompt string is composed from (workflow, inputs): `{{name}}` placeholders in\n * the template are replaced by each field's text. Whitespace left by empty fragments is tidied.\n */\nexport function composeWorkflowPrompt(\n workflow: WorkflowDefinition,\n inputs: WorkflowInputs,\n ctx?: WorkflowComposeContext\n): string {\n if (workflow.run.kind !== 'prompt') return ''\n const byName = new Map(workflow.inputs.map((f) => [f.name, f]))\n const template = workflow.run.promptTemplate\n // Whitespace left by empty fragments is tidied in the template's own text only: what the user\n // typed or selected (tabs, runs of spaces) reaches the prompt exactly as it was.\n let out = ''\n let last = 0\n const append = (text: string, isValue: boolean) => {\n let t = text\n if (!isValue) {\n t = t.replace(/[ \\t]{2,}/g, ' ')\n if (/[ \\t]$/.test(out)) t = t.replace(/^[ \\t]+/, '')\n }\n out += t\n }\n for (const m of template.matchAll(/\\{\\{\\s*([a-z][a-z0-9_]*)\\s*\\}\\}/gi)) {\n append(template.slice(last, m.index), false)\n const field = byName.get(m[1])\n append(field ? fragment(field, inputs[m[1]], ctx) : '', true)\n last = m.index + m[0].length\n }\n append(template.slice(last), false)\n return out.trim()\n}\n\n/** Assemble the launch the host receives: inputs, the hoisted scope and the chosen agent. */\nexport function buildLaunch(\n workflow: WorkflowDefinition,\n inputs: WorkflowInputs,\n agentId?: string\n): WorkflowLaunch {\n const scopeField = workflow.inputs.find(isFileField)\n const raw = scopeField ? inputs[scopeField.name] : undefined\n const scope = isWorkflowScope(raw) ? raw : { ...EMPTY_WORKFLOW_SCOPE }\n return { workflow, inputs, scope, agentId: agentId || workflow.defaultAgentId || undefined }\n}\n\n/* --------------------------- context launch --------------------------- */\n\n/** What a surface hands a workflow: the files in view, the selected text, the image on screen. */\nexport interface WorkflowContext {\n documents?: string[]\n selection?: string\n /** A file id. */\n image?: string\n}\n\n/** The kinds of context a workflow declares it can be started from. */\nexport function workflowAccepts(workflow: WorkflowDefinition): WorkflowContextKind[] {\n const kinds = new Set<WorkflowContextKind>()\n for (const field of workflow.inputs) if (field.context) kinds.add(field.context)\n return [...kinds]\n}\n\n/** Workflows a surface can offer: those that accept at least one kind of context it supplies. */\nexport function workflowsAccepting(\n workflows: WorkflowDefinition[],\n supplied: WorkflowContextKind[]\n): WorkflowDefinition[] {\n return workflows.filter((w) => workflowAccepts(w).some((k) => supplied.includes(k)))\n}\n\n/** Workflows a host offers: its own plus every one that is not tied to another host. */\nexport function workflowsForHost(\n workflows: WorkflowDefinition[],\n host: string\n): WorkflowDefinition[] {\n return workflows.filter((w) => !w.host || w.host === host)\n}\n\n/**\n * The inputs a context pre-fills: each field bound to a kind the surface supplied. Fields it does\n * not supply are left to the form's defaults, so the dialog still asks for them.\n */\nexport function inputsFromContext(\n workflow: WorkflowDefinition,\n context: WorkflowContext\n): WorkflowInputs {\n const inputs: WorkflowInputs = {}\n for (const field of workflow.inputs) {\n if (!field.context) continue\n if (field.context === 'selection') {\n if (context.selection) inputs[field.name] = context.selection\n continue\n }\n const ids =\n field.context === 'image' ? (context.image ? [context.image] : []) : context.documents\n if (ids?.length && isFileField(field)) {\n inputs[field.name] = { folders: [], labels: [], documents: ids.slice(0, field.max ?? 1) }\n }\n }\n return inputs\n}\n\n/* ------------------------------ skills ------------------------------- */\n\n/** The slice of a skill listing row the model needs (`SkillSummaryResponse`). */\nexport interface SkillLike {\n name: string\n slug: string\n description?: string\n arg_hint?: string\n}\n\n/** The prompt field's label when a skill brings none of its own. */\nexport const SKILL_PROMPT_LABEL = 'What should it work on?'\nexport const SKILL_PROMPT_FALLBACK_PLACEHOLDER = 'Describe what you want'\n\n/** `<prompt>` / `[topic]` becomes `prompt` / `topic`: a hint reads as a placeholder, not syntax. */\nconst plainHint = (hint: string): string => hint.replace(/^[<[]\\s*|\\s*[>\\]]$/g, '').trim()\n\n/**\n * A skill is run WITH a prompt, so it always gets a one-field form: a required free-text field\n * (`args`) whose placeholder is the skill's `arg_hint` (brackets removed). Starting one with\n * nothing is never offered; text typed after the slash pre-fills the field.\n */\nexport function skillToWorkflow(skill: SkillLike): WorkflowDefinition {\n const hint = plainHint((skill.arg_hint ?? '').trim())\n const inputs: WorkflowField[] = [\n {\n name: 'args',\n type: 'longtext',\n label: SKILL_PROMPT_LABEL,\n placeholder: hint || SKILL_PROMPT_FALLBACK_PLACEHOLDER,\n required: true,\n },\n ]\n return {\n id: skill.slug,\n skill: skill.slug,\n title: skill.name || skill.slug,\n description: skill.description ?? '',\n inputs,\n run: { kind: 'prompt', promptTemplate: `/${skill.slug} {{args}}` },\n landing: 'chat',\n schedulable: true,\n }\n}\n\nconst FIELD_TYPES: WorkflowFieldType[] = [\n 'text',\n 'longtext',\n 'boolean',\n 'select',\n 'number',\n 'date',\n 'scope',\n 'documents',\n]\n\nconst str = (v: unknown): string | undefined => (typeof v === 'string' ? v : undefined)\nconst num = (v: unknown): number | undefined => (typeof v === 'number' ? v : undefined)\nconst bool = (v: unknown): boolean | undefined => (typeof v === 'boolean' ? v : undefined)\n\nfunction fieldFromFrontmatter(raw: unknown): WorkflowField | null {\n if (typeof raw !== 'object' || raw === null) return null\n const r = raw as Record<string, unknown>\n const name = str(r.name)\n const type = FIELD_TYPES.find((t) => t === r.type)\n if (!name || !/^[a-z][a-z0-9_]*$/.test(name) || !type) return null\n const options = Array.isArray(r.options)\n ? r.options.flatMap((o): WorkflowFieldOption[] => {\n const ro = o as Record<string, unknown>\n const value = str(ro?.value)\n const label = str(ro?.label)\n return value && label\n ? [\n {\n value,\n label,\n description: str(ro.description),\n text: str(ro.text),\n icon: str(ro.icon),\n },\n ]\n : []\n })\n : undefined\n return {\n name,\n type,\n label: str(r.label) ?? name,\n description: str(r.description),\n placeholder: str(r.placeholder),\n required: bool(r.required),\n default: r.default as WorkflowInputValue | undefined,\n options,\n min: num(r.min),\n max: num(r.max),\n trueText: str(r.true_text),\n falseText: str(r.false_text),\n advanced: bool(r.advanced),\n accept: r.accept === 'image' ? 'image' : undefined,\n context:\n r.context === 'documents' || r.context === 'selection' || r.context === 'image'\n ? r.context\n : undefined,\n by: Array.isArray(r.by)\n ? (r.by.filter((b) => b === 'folders' || b === 'labels') as Array<'folders' | 'labels'>)\n : undefined,\n }\n}\n\n/**\n * Build a workflow from parsed SKILL.md frontmatter (snake_case keys) and its body (the prompt\n * template). The inverse of what the backend will publish; seeded workflows use the same shape.\n */\nexport function workflowFromFrontmatter(\n id: string,\n frontmatter: Record<string, unknown>,\n body: string\n): WorkflowDefinition {\n const inputs = Array.isArray(frontmatter.inputs)\n ? frontmatter.inputs.flatMap((f) => {\n const field = fieldFromFrontmatter(f)\n return field ? [field] : []\n })\n : []\n return {\n id,\n title: str(frontmatter.name) ?? id,\n description: str(frontmatter.description) ?? '',\n icon: str(frontmatter.icon),\n inputs,\n run: { kind: 'prompt', promptTemplate: body.trim() },\n landing: frontmatter.landing === 'files' ? 'files' : 'chat',\n requiresFiles: bool(frontmatter.requires_files),\n schedulable: bool(frontmatter.schedulable) ?? true,\n }\n}\n\n/** snake_case keys of the on-disk form of a field (what `workflowFromFrontmatter` reads). */\nexport function fieldToFrontmatter(field: WorkflowField): Record<string, unknown> {\n return compact({\n name: field.name,\n type: field.type,\n label: field.label,\n description: field.description,\n placeholder: field.placeholder,\n required: field.required,\n default: field.default,\n options: field.options?.map((o) =>\n compact({\n value: o.value,\n label: o.label,\n description: o.description,\n text: o.text,\n icon: o.icon,\n })\n ),\n min: field.min,\n max: field.max,\n true_text: field.trueText,\n false_text: field.falseText,\n advanced: field.advanced,\n by: field.by,\n accept: field.accept,\n context: field.context,\n })\n}\n\nconst compact = (o: Record<string, unknown>): Record<string, unknown> =>\n Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined))\n","import { useState, type ReactNode } from 'react'\nimport {\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Switch,\n Textarea,\n cn,\n} from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../../chat/test-id'\nimport { FoldSection } from '../../home/FoldSection'\nimport { isWorkflowScope } from './workflow'\nimport type {\n WorkflowErrors,\n WorkflowField,\n WorkflowFieldError,\n WorkflowInputs,\n WorkflowInputValue,\n WorkflowScope,\n} from './types'\n\nexport interface SchemaFormLabels {\n /** Appended to the label of an optional field. */\n optional: string\n /** Heading of the folded block that holds `advanced` fields. */\n advanced: string\n errors: Record<WorkflowFieldError, string>\n}\n\nexport const DEFAULT_SCHEMA_FORM_LABELS: SchemaFormLabels = {\n optional: '(optional)',\n advanced: 'More options',\n errors: {\n required: 'This is needed to continue',\n min: 'Too small',\n max: 'Too large',\n number: 'Enter a number',\n },\n}\n\nexport interface SchemaFormProps {\n fields: WorkflowField[]\n values: WorkflowInputs\n onChange: (name: string, value: WorkflowInputValue) => void\n /** Per-field problems to show (the dialog passes them once a launch was attempted). */\n errors?: WorkflowErrors\n /** Renders a `scope` field: the host owns the file data behind the picker. */\n renderScope?: (\n field: WorkflowField,\n value: WorkflowScope,\n onChange: (s: WorkflowScope) => void\n ) => ReactNode\n /** Renders a `documents` field (an explicit file pick): the host owns the file list. */\n renderDocuments?: (\n field: WorkflowField,\n value: WorkflowScope,\n onChange: (s: WorkflowScope) => void\n ) => ReactNode\n /** Maps an option's `icon` key to a mark. */\n renderIcon?: (key: string) => ReactNode\n /**\n * Plain Enter in a multi-line field submits the form (Shift+Enter inserts the newline), the\n * chat's own convention. Single-line fields submit natively.\n */\n onEnterSubmit?: () => void\n /** Prefix of field ids: `<prefix>-<field name>`; default `workflow-field`. */\n testIdPrefix?: string\n labels?: Partial<SchemaFormLabels>\n className?: string\n}\n\n/** Selects with at most this many options render as tiles; more fall back to a dropdown. */\nconst TILE_MAX = 4\n\ninterface FieldProps {\n field: WorkflowField\n value: WorkflowInputValue | undefined\n error?: WorkflowFieldError\n onChange: (value: WorkflowInputValue) => void\n l: SchemaFormLabels\n idFor: (suffix?: string) => string\n renderScope: SchemaFormProps['renderScope']\n renderDocuments: SchemaFormProps['renderDocuments']\n renderIcon: SchemaFormProps['renderIcon']\n onEnterSubmit: SchemaFormProps['onEnterSubmit']\n}\n\nfunction FieldControl({\n field,\n value,\n error,\n onChange,\n l,\n idFor,\n renderScope,\n renderDocuments,\n renderIcon,\n onEnterSubmit,\n}: FieldProps) {\n const id = `${idFor()}-control`\n const testId = idFor()\n switch (field.type) {\n case 'text':\n return (\n <Input\n id={id}\n data-testid={testId}\n value={String(value ?? '')}\n placeholder={field.placeholder}\n aria-required={field.required || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? idFor('error') : undefined}\n onChange={(e) => onChange(e.target.value)}\n />\n )\n case 'longtext':\n return (\n <Textarea\n id={id}\n data-testid={testId}\n value={String(value ?? '')}\n placeholder={field.placeholder}\n aria-required={field.required || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? idFor('error') : undefined}\n className=\"min-h-[96px]\"\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (onEnterSubmit && e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n onEnterSubmit()\n }\n }}\n />\n )\n case 'number':\n return (\n <Input\n id={id}\n data-testid={testId}\n type=\"number\"\n inputMode=\"decimal\"\n min={field.min}\n max={field.max}\n value={value === undefined ? '' : String(value)}\n placeholder={field.placeholder}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? idFor('error') : undefined}\n onChange={(e) => onChange(e.target.value === '' ? '' : Number(e.target.value))}\n />\n )\n case 'date':\n return (\n <Input\n id={id}\n data-testid={testId}\n type=\"date\"\n value={String(value ?? '')}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? idFor('error') : undefined}\n onChange={(e) => onChange(e.target.value)}\n />\n )\n case 'boolean':\n return (\n <Switch\n id={id}\n data-testid={testId}\n checked={Boolean(value)}\n onCheckedChange={(checked) => onChange(checked)}\n />\n )\n case 'select': {\n const options = field.options ?? []\n if (options.length > 0 && options.length <= TILE_MAX) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={field.label}\n className=\"grid grid-cols-2 gap-2 sm:grid-cols-4\"\n data-testid={testId}\n >\n {options.map((option) => {\n const selected = value === option.value\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n data-testid={prefixedTestId(testId, option.value, {\n testId: `workflow-field-${field.name}-${option.value}`,\n })}\n onClick={() => {\n onChange(option.value)\n }}\n className={cn(\n 'flex min-h-24 flex-col items-center justify-center gap-1.5 rounded-lg border p-3 text-center transition-colors pointer-coarse:min-h-28 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected\n ? 'border-primary bg-primary/10'\n : 'border-border bg-card [&:hover]:border-primary [&:hover]:bg-muted'\n )}\n >\n {option.icon && renderIcon && (\n <span className=\"text-muted-foreground\">{renderIcon(option.icon)}</span>\n )}\n <span className=\"text-sm font-medium text-foreground\">{option.label}</span>\n {option.description && (\n <span className=\"text-xs text-muted-foreground\">{option.description}</span>\n )}\n </button>\n )\n })}\n </div>\n )\n }\n return (\n <Select value={String(value ?? '')} onValueChange={(v) => onChange(v)}>\n <SelectTrigger id={id} data-testid={testId} className=\"pointer-coarse:min-h-11\">\n <SelectValue placeholder={field.placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n case 'scope': {\n const scope = isWorkflowScope(value) ? value : { folders: [], labels: [] }\n return <div data-testid={testId}>{renderScope?.(field, scope, onChange)}</div>\n }\n case 'documents': {\n const picked = isWorkflowScope(value) ? value : { folders: [], labels: [], documents: [] }\n return <div data-testid={testId}>{renderDocuments?.(field, picked, onChange)}</div>\n }\n }\n}\n\nfunction FormField(props: FieldProps) {\n const { field, error, l, idFor } = props\n const isBoolean = field.type === 'boolean'\n const showOptional = !field.required && field.type !== 'boolean' && field.type !== 'scope'\n const label = (\n <Label\n htmlFor={`${idFor()}-control`}\n className={isBoolean ? 'cursor-pointer font-normal' : undefined}\n >\n {field.label}\n {showOptional && (\n <>\n {' '}\n <span className=\"font-normal text-muted-foreground\">{l.optional}</span>\n </>\n )}\n </Label>\n )\n return (\n <div className=\"flex flex-col gap-1.5\" data-slot=\"schema-field\" data-field={field.name}>\n {isBoolean ? (\n <div className=\"flex items-center gap-2.5 pointer-coarse:min-h-11\">\n <FieldControl {...props} />\n {label}\n </div>\n ) : (\n <>\n {field.type !== 'scope' && label}\n <FieldControl {...props} />\n </>\n )}\n {field.description && <p className=\"text-xs text-muted-foreground\">{field.description}</p>}\n {error && (\n <p\n id={idFor('error')}\n role=\"alert\"\n className=\"text-xs text-destructive\"\n data-testid={idFor('error')}\n >\n {l.errors[error]}\n </p>\n )}\n </div>\n )\n}\n\n/**\n * Renders a workflow's declared inputs as a form. Controlled: the caller owns `values` (see\n * `defaultInputs`) and decides when to validate (`validateInputs`) and show `errors`.\n */\nexport function SchemaForm({\n fields,\n values,\n onChange,\n errors,\n renderScope,\n renderDocuments,\n renderIcon,\n onEnterSubmit,\n testIdPrefix,\n labels,\n className,\n}: SchemaFormProps) {\n const l: SchemaFormLabels = {\n ...DEFAULT_SCHEMA_FORM_LABELS,\n ...labels,\n errors: { ...DEFAULT_SCHEMA_FORM_LABELS.errors, ...labels?.errors },\n }\n const [advancedOpen, setAdvancedOpen] = useState(false)\n const common = fields.filter((f) => !f.advanced)\n const advanced = fields.filter((f) => f.advanced)\n\n const render = (field: WorkflowField) => (\n <FormField\n key={field.name}\n field={field}\n value={values[field.name]}\n error={errors?.[field.name]}\n onChange={(v) => onChange(field.name, v)}\n l={l}\n idFor={(suffix) =>\n suffix\n ? `${testIdOr(testIdPrefix, { testId: 'workflow-field' })}-${field.name}-${suffix}`\n : `${testIdOr(testIdPrefix, { testId: 'workflow-field' })}-${field.name}`\n }\n renderScope={renderScope}\n renderDocuments={renderDocuments}\n renderIcon={renderIcon}\n onEnterSubmit={onEnterSubmit}\n />\n )\n\n return (\n <div className={cn('flex flex-col gap-4', className)} data-slot=\"schema-form\">\n {common.map(render)}\n {advanced.length > 0 && (\n <FoldSection\n label={l.advanced}\n open={advancedOpen}\n onOpenChange={setAdvancedOpen}\n testId={`${testIdOr(testIdPrefix, { testId: 'workflow-field' })}-advanced-toggle`}\n >\n <div className=\"flex flex-col gap-4\">{advanced.map(render)}</div>\n </FoldSection>\n )}\n </div>\n )\n}\n","/**\n * The model of a stepped workflow (`run: { kind: 'steps' }`): the steps form a graph (each waits\n * for the steps in its `after`), and a run's progress is each step's `WorkflowStepState`, as the\n * run's thread records it (`stepStatesFromActivity`). Pure functions, shared by the thread runner\n * (`useWorkflowThread`), the builder's preview and the thread's top bar.\n */\n\nimport type {\n WorkflowAgentStep,\n WorkflowDefinition,\n WorkflowErrors,\n WorkflowInputs,\n WorkflowInputValue,\n WorkflowReviewStep,\n WorkflowStep,\n WorkflowStepState,\n WorkflowStepStatus,\n} from './types'\nimport { composeWorkflowPrompt, defaultInputs, validateInputs } from './workflow'\n\n/** A stepped workflow's steps; empty for a single-run one. */\nexport function workflowSteps(workflow: WorkflowDefinition): WorkflowStep[] {\n return workflow.run.kind === 'steps' ? workflow.run.steps : []\n}\n\nexport const isSteppedWorkflow = (workflow: WorkflowDefinition): boolean =>\n workflow.run.kind === 'steps'\n\n/* ------------------------------- graph ------------------------------- */\n\n/** What a step waits for: its `after`, else the step before it in the list (a sequence). */\nexport function stepDependencies(steps: WorkflowStep[], id: string): string[] {\n const i = steps.findIndex((s) => s.id === id)\n if (i < 0) return []\n return steps[i].after ?? (i > 0 ? [steps[i - 1].id] : [])\n}\n\n/** `a` waits for `b`, directly or through other steps. */\nexport function dependsOn(steps: WorkflowStep[], a: string, b: string): boolean {\n const seen = new Set<string>()\n const stack = [...stepDependencies(steps, a)]\n while (stack.length) {\n const id = stack.pop() as string\n if (id === b) return true\n if (seen.has(id)) continue\n seen.add(id)\n stack.push(...stepDependencies(steps, id))\n }\n return false\n}\n\n/**\n * The steps in dependency order, keeping the given order wherever the graph allows (a stable\n * topological sort). Every implicit dependency is written out as `after` first, so reordering\n * never changes what a step waits for. Steps in a cycle keep their place at the end; validation\n * reports them.\n */\nexport function orderSteps(steps: WorkflowStep[]): WorkflowStep[] {\n const explicit = steps.map((s) => ({ ...s, after: stepDependencies(steps, s.id) }))\n const known = new Set(explicit.map((s) => s.id))\n const placed = new Set<string>()\n const out: WorkflowStep[] = []\n let progress = true\n while (out.length < explicit.length && progress) {\n progress = false\n for (const s of explicit) {\n if (placed.has(s.id)) continue\n if (s.after.every((d) => placed.has(d) || !known.has(d))) {\n out.push(s)\n placed.add(s.id)\n progress = true\n break\n }\n }\n }\n return [...out, ...explicit.filter((s) => !placed.has(s.id))]\n}\n\nexport type WorkflowGraphProblem =\n | { code: 'duplicate'; step: string }\n | { code: 'unknown'; step: string; dependency: string }\n | { code: 'cycle'; step: string }\n | { code: 'order'; step: string; dependency: string }\n\n/** What makes a stepped workflow unrunnable. Empty = valid. */\nexport function validateWorkflowGraph(steps: WorkflowStep[]): WorkflowGraphProblem[] {\n const problems: WorkflowGraphProblem[] = []\n const ids = new Set<string>()\n for (const s of steps) {\n if (ids.has(s.id)) problems.push({ code: 'duplicate', step: s.id })\n ids.add(s.id)\n }\n steps.forEach((s, i) => {\n for (const d of stepDependencies(steps, s.id)) {\n if (!ids.has(d)) problems.push({ code: 'unknown', step: s.id, dependency: d })\n else if (d === s.id || dependsOn(steps, d, s.id)) problems.push({ code: 'cycle', step: s.id })\n else if (steps.findIndex((x) => x.id === d) > i)\n problems.push({ code: 'order', step: s.id, dependency: d })\n }\n })\n return problems\n}\n\n/**\n * The steps by depth (the longest chain before each): what the stepper shows side by side.\n * A sequence is one step per level.\n */\nexport function stepLevels(steps: WorkflowStep[]): WorkflowStep[][] {\n const depth = new Map<string, number>()\n for (const s of steps) {\n const deps = stepDependencies(steps, s.id).filter((d) => depth.has(d))\n depth.set(s.id, deps.length ? Math.max(...deps.map((d) => depth.get(d) as number)) + 1 : 0)\n }\n const levels: WorkflowStep[][] = []\n for (const s of steps) (levels[depth.get(s.id) as number] ??= []).push(s)\n return levels.filter(Boolean)\n}\n\n/* ----------------------------- progress ----------------------------- */\n\n/** One entry of a thread's activity log, as far as steps are concerned. */\nexport interface WorkflowActivityEvent {\n kind: string\n detail?: Record<string, unknown> | null\n}\n\nconst STEP_EVENTS: Record<string, WorkflowStepStatus> = {\n step_started: 'running',\n step_done: 'done',\n step_skipped: 'skipped',\n step_failed: 'failed',\n}\n\n/** Each step's state from the thread's activity log (oldest first): its latest step event wins. */\nexport function stepStatesFromActivity(\n events: WorkflowActivityEvent[]\n): Record<string, WorkflowStepState> {\n const states: Record<string, WorkflowStepState> = {}\n for (const e of events) {\n const status = STEP_EVENTS[e.kind]\n const step = e.detail?.step\n if (!status || typeof step !== 'string') continue\n const responseId = typeof e.detail?.response_id === 'string' ? e.detail.response_id : undefined\n const error = typeof e.detail?.error === 'string' ? e.detail.error : null\n states[step] = { status, responseId: responseId ?? states[step]?.responseId ?? null, error }\n }\n return states\n}\n\n/** Every field the run asks for: the launch form's, then each form step's. */\nexport function runFields(workflow: WorkflowDefinition) {\n return [\n ...workflow.inputs,\n ...workflowSteps(workflow).flatMap((s) => (s.kind === 'form' ? s.inputs : [])),\n ]\n}\n\n/** A fresh run's inputs: every field at its default, then the prefills. */\nexport function initialRunInputs(\n workflow: WorkflowDefinition,\n inputs: WorkflowInputs = {}\n): WorkflowInputs {\n return { ...defaultInputs({ ...workflow, inputs: runFields(workflow) }), ...inputs }\n}\n\nconst finished = (s: WorkflowStepState | undefined): boolean =>\n s?.status === 'done' || s?.status === 'skipped'\n\n/**\n * Where a step stands: `blocked` until everything it waits for has finished (done or skipped),\n * then `ready`, then its own status.\n */\nexport type WorkflowStepPhase = 'blocked' | 'ready' | 'running' | 'done' | 'skipped' | 'failed'\n\nexport function stepPhase(\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>,\n id: string\n): WorkflowStepPhase {\n const s = states[id]\n if (s && s.status !== 'pending') return s.status\n return stepDependencies(steps, id).every((d) => finished(states[d])) ? 'ready' : 'blocked'\n}\n\nexport const isRunFinished = (\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>\n): boolean => steps.length > 0 && steps.every((s) => finished(states[s.id]))\n\n/** A step a person does (form, upload, review); agent steps run themselves. */\nexport const isPersonStep = (step: WorkflowStep): boolean => step.kind !== 'agent'\n\n/**\n * What the primary button does on the step in view:\n * - `complete`: finish this form, upload or review (approve) and move on;\n * - `move`: view the next step: this one is finished, or the next does not wait for it;\n * - `skip`: give up on this agent step (it failed) so what waits for it can go on;\n * - `finish`: show the completion (every step has finished);\n * - `wait`: nothing yet (this step is under way and the next waits for it, or it is blocked).\n */\nexport type WorkflowNextAction = 'complete' | 'move' | 'skip' | 'finish' | 'wait'\n\nexport function nextAction(\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>,\n current: string | null\n): WorkflowNextAction {\n const i = steps.findIndex((s) => s.id === current)\n const step = steps[i]\n if (!step) return 'wait'\n const phase = stepPhase(steps, states, step.id)\n if (phase === 'blocked') return 'wait'\n const following = steps[i + 1]\n const independentNext = !!following && !dependsOn(steps, following.id, step.id)\n if (phase === 'done' || phase === 'skipped') {\n if (following) return 'move'\n return isRunFinished(steps, states) ? 'finish' : 'wait'\n }\n if (isPersonStep(step)) return 'complete'\n // An agent step on its way (about to start, or running): look ahead if nothing there waits for it.\n if (phase !== 'failed') return independentNext ? 'move' : 'wait'\n const waitedFor = steps.slice(i + 1).some((s) => dependsOn(steps, s.id, step.id))\n return waitedFor || !following ? 'skip' : 'move'\n}\n\n/** A form step's problems (empty = it can move on); other steps have none. */\nexport function validateStep(step: WorkflowStep, inputs: WorkflowInputs): WorkflowErrors {\n if (step.kind !== 'form') return {}\n return validateInputs(\n {\n id: step.id,\n title: step.title,\n description: '',\n inputs: step.inputs,\n run: { kind: 'operation' },\n landing: 'chat',\n },\n inputs\n )\n}\n\n/* ----------------------------- composing ----------------------------- */\n\nconst asText = (value: WorkflowInputValue | undefined): string =>\n typeof value === 'string' ? value.trim() : typeof value === 'number' ? String(value) : ''\n\n/**\n * Fill a step's `with` templates from the run's inputs: `{{a}}`, `{{a || b}}` (first non-blank).\n * A template that is exactly one bare reference passes the value through untouched.\n */\nexport function fillStepInputs(\n templates: Record<string, string> | undefined,\n inputs: WorkflowInputs\n): WorkflowInputs {\n const out: WorkflowInputs = {}\n for (const [name, template] of Object.entries(templates ?? {})) {\n const bare = /^\\{\\{\\s*([a-z][a-z0-9_]*)\\s*\\}\\}$/i.exec(template)\n if (bare) {\n out[name] = inputs[bare[1]] ?? ''\n continue\n }\n out[name] = fillRunText(template, inputs)\n }\n return out\n}\n\n/** A template over the run's inputs, as text (`{{a}}`, `{{a || b}}`). */\nexport function fillRunText(template: string, inputs: WorkflowInputs): string {\n return template\n .replace(/\\{\\{([^}]*)\\}\\}/g, (_, expr: string) => {\n for (const ref of expr.split('||')) {\n const text = asText(inputs[ref.trim()])\n if (text) return text\n }\n return ''\n })\n .trim()\n}\n\n/** The run thread's title: the workflow's `threadTitle` template, else its title. */\nexport function runThreadTitle(workflow: WorkflowDefinition, inputs: WorkflowInputs): string {\n const template = workflow.run.kind === 'steps' ? workflow.run.threadTitle : undefined\n return (template && fillRunText(template, inputs)) || workflow.title\n}\n\n/** What a review asks for: its instructions filled from the run, else its title. */\nexport function reviewInstructions(step: WorkflowReviewStep, inputs: WorkflowInputs): string {\n return (step.instructions && fillRunText(step.instructions, inputs)) || step.title\n}\n\nexport interface StepComposeOptions {\n /** Looks up the workflow a step names (`step.workflow`). */\n resolveWorkflow?: (id: string) => WorkflowDefinition | undefined\n /**\n * The host's wording for `operation` runs: the named workflow's id (or the step's own id when it\n * runs inline), its filled inputs, and the whole run's inputs (e.g. to ground it in the record).\n */\n compose?: (id: string, inputs: WorkflowInputs, runInputs: WorkflowInputs) => string | undefined\n}\n\n/** The prompt an agent step of `workflow` sends; '' when nothing could compose it (no binding). */\nexport function composeStepPrompt(\n workflow: WorkflowDefinition,\n step: WorkflowAgentStep,\n runInputs: WorkflowInputs,\n { resolveWorkflow, compose }: StepComposeOptions = {}\n): string {\n if (step.workflow) {\n const target = resolveWorkflow?.(step.workflow)\n if (!target) return ''\n const inputs = { ...defaultInputs(target), ...fillStepInputs(step.with, runInputs) }\n return target.run.kind === 'prompt'\n ? composeWorkflowPrompt(target, inputs)\n : (compose?.(target.id, inputs, runInputs) ?? '')\n }\n if (step.run?.kind === 'prompt') {\n return composeWorkflowPrompt(\n { ...workflow, inputs: runFields(workflow), run: step.run },\n runInputs\n )\n }\n return compose?.(step.id, runInputs, runInputs) ?? ''\n}\n","/**\n * A stepped workflow as the plan a run thread carries (`TaskPlan.steps`) and back. The server reads\n * the structure to start each step: an agent step runs a skill (`skill` + `inputs` templates) or a\n * prompt (filled from the run's inputs as it starts); everything only a client shows (form fields,\n * icon, canvas position, which workflow a step names) rides along in `ui`.\n */\n\nimport type { components } from '@arbidocs/client'\nimport { composeStepPrompt, runFields, workflowSteps, type StepComposeOptions } from './run'\nimport type {\n WorkflowAgentStep,\n WorkflowDefinition,\n WorkflowField,\n WorkflowInputs,\n WorkflowStep,\n} from './types'\n\nexport type TaskPlanStep = components['schemas']['TaskPlanStep']\nexport type TaskPlan = components['schemas']['TaskPlan']\n\n/** What a step keeps for clients only (the server stores it as plain data). */\ninterface StepUi {\n description?: string\n icon?: string\n commit?: boolean\n next_label?: string\n fields?: WorkflowField[]\n required?: boolean\n accept?: string\n hint?: string\n output?: 'answer' | 'artifact'\n instructions?: string\n /** The skill or workflow an agent step names, and its input templates (the builder edits these). */\n workflow?: string\n with?: Record<string, string>\n prompt_template?: string\n position?: { x: number; y: number }\n}\n\nconst compact = <T extends object>(o: T): T =>\n Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined && v !== '')) as T\n\nexport interface ToPlanOptions extends StepComposeOptions {\n /**\n * The run's inputs when it starts: prompts are composed with them. Fields not given yet (or\n * absent altogether, saving a workflow to run later) keep `{{field}}` placeholders, which the\n * server fills from the run's inputs.\n */\n inputs?: WorkflowInputs\n}\n\n/** Each run field as its own `{{name}}` placeholder: composing with these keeps the template. */\nfunction placeholders(workflow: WorkflowDefinition): WorkflowInputs {\n return Object.fromEntries(runFields(workflow).map((f) => [f.name, `{{${f.name}}}`]))\n}\n\nfunction agentStep(\n workflow: WorkflowDefinition,\n step: WorkflowAgentStep,\n options: ToPlanOptions\n): Pick<TaskPlanStep, 'skill' | 'inputs' | 'prompt'> {\n const target = step.workflow ? options.resolveWorkflow?.(step.workflow) : undefined\n // A server skill: the server runs the skill itself with the step's inputs.\n if (target?.skill) return { skill: target.skill, inputs: step.with ?? {}, prompt: null }\n // A field still blank when the run starts (a later form fills it) keeps its placeholder, so the\n // server fills it from the run's inputs as the step starts.\n const given = Object.entries(options.inputs ?? {}).filter(\n ([, v]) => v !== undefined && v !== null && v !== ''\n )\n const inputs = { ...placeholders(workflow), ...Object.fromEntries(given) }\n return { skill: null, inputs: null, prompt: composeStepPrompt(workflow, step, inputs, options) }\n}\n\n/** The plan steps a run thread (or a saved workflow) carries for `workflow`. */\nexport function toPlanSteps(\n workflow: WorkflowDefinition,\n options: ToPlanOptions = {}\n): TaskPlanStep[] {\n const layout = workflow.run.kind === 'steps' ? workflow.run.layout : undefined\n return workflowSteps(workflow).map((step) => {\n const ui: StepUi = compact({\n description: step.description,\n icon: step.icon,\n commit: step.commit,\n next_label: step.nextLabel,\n position: layout?.[step.id],\n ...(step.kind === 'form' ? { fields: step.inputs } : {}),\n ...(step.kind === 'upload'\n ? { required: step.required, accept: step.accept, hint: step.hint }\n : {}),\n ...(step.kind === 'review' ? { instructions: step.instructions } : {}),\n ...(step.kind === 'agent'\n ? {\n output: step.output,\n workflow: step.workflow,\n with: step.with,\n prompt_template: step.run?.kind === 'prompt' ? step.run.promptTemplate : undefined,\n }\n : {}),\n })\n return {\n id: step.id,\n title: step.title,\n kind: step.kind,\n after: step.after ?? null,\n branch: step.kind === 'agent' && !!step.branch,\n requires_files: false,\n ui: ui as Record<string, unknown>,\n ...(step.kind === 'agent'\n ? agentStep(workflow, step, options)\n : { skill: null, inputs: null, prompt: null }),\n }\n })\n}\n\n/** Steps from a run's (or a saved workflow's) plan: what the runner, the builder and the top bar show. */\nexport function fromPlanSteps(steps: TaskPlanStep[] | null | undefined): WorkflowStep[] {\n return (steps ?? []).map((p): WorkflowStep => {\n const ui = (p.ui ?? {}) as StepUi\n const base = {\n id: p.id,\n title: p.title,\n description: ui.description,\n icon: ui.icon,\n commit: ui.commit,\n nextLabel: ui.next_label,\n ...(p.after != null ? { after: p.after } : {}),\n }\n switch (p.kind) {\n case 'form':\n return { ...base, kind: 'form', inputs: ui.fields ?? [] }\n case 'upload':\n return { ...base, kind: 'upload', required: ui.required, accept: ui.accept, hint: ui.hint }\n case 'review':\n return { ...base, kind: 'review', instructions: ui.instructions }\n default: {\n const promptTemplate = ui.prompt_template ?? p.prompt ?? undefined\n return {\n ...base,\n kind: 'agent',\n workflow: ui.workflow ?? p.skill ?? undefined,\n with: ui.with ?? (p.inputs as Record<string, string> | null) ?? undefined,\n run:\n !ui.workflow && !p.skill && promptTemplate\n ? { kind: 'prompt', promptTemplate }\n : undefined,\n output: ui.output,\n branch: p.branch || undefined,\n }\n }\n }\n })\n}\n\n/** Where each step sits on the builder's canvas, as the plan keeps it. */\nexport function layoutFromPlanSteps(\n steps: TaskPlanStep[] | null | undefined\n): Record<string, { x: number; y: number }> | undefined {\n const entries = (steps ?? []).flatMap((p) => {\n const position = (p.ui as StepUi | null | undefined)?.position\n return position ? [[p.id, position] as const] : []\n })\n return entries.length ? Object.fromEntries(entries) : undefined\n}\n","/**\n * The screen side of a stepped run: which step is in view, form problems, and what the primary\n * button does. The run itself happens elsewhere (the thread on the server, `useWorkflowThread`, or\n * the builder's preview): this hook gets each step's state and the host's actions, so every host\n * shows a run the same way (`WorkflowRunner`).\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n isRunFinished,\n nextAction,\n stepPhase,\n validateStep,\n type WorkflowNextAction,\n type WorkflowStepPhase,\n} from './run'\nimport type {\n WorkflowErrors,\n WorkflowInputValue,\n WorkflowInputs,\n WorkflowStep,\n WorkflowStepState,\n} from './types'\n\nexport interface UseWorkflowViewOptions {\n steps: WorkflowStep[]\n /** Each step's state (missing = pending). */\n states: Record<string, WorkflowStepState>\n inputs: WorkflowInputs\n setInput: (name: string, value: WorkflowInputValue) => void\n /** Finish a person's step (a form, an upload, a review's approval). A throw keeps the user on it. */\n complete: (step: WorkflowStep) => Promise<void>\n /** Give up on a step so what waits for it can go on. */\n skip: (stepId: string) => Promise<void>\n /** Run a failed agent step again. */\n retry?: (stepId: string) => Promise<void>\n /** A form step whose inputs can no longer change (committed, or recorded on the thread). */\n isLocked?: (stepId: string) => boolean\n}\n\n/** What `WorkflowRunner` shows and does. */\nexport interface WorkflowRunView {\n steps: WorkflowStep[]\n /** The step in view; `undefined` once the run's completion is shown. */\n step: WorkflowStep | undefined\n current: string | null\n isComplete: boolean\n inputs: WorkflowInputs\n setInput: (name: string, value: WorkflowInputValue) => void\n stateOf: (stepId: string) => WorkflowStepState | undefined\n phaseOf: (stepId: string) => WorkflowStepPhase\n isLocked: (stepId: string) => boolean\n /** The form step in view's problems, shown once moving on was attempted. */\n errors: WorkflowErrors\n /** An action is under way (completing, skipping). */\n busy: boolean\n actionError: string | null\n /** Some agent step is running. */\n isRunning: boolean\n action: WorkflowNextAction\n canBack: boolean\n next: () => Promise<void>\n back: () => void\n /** View a step (one further down the plan too: it can be skipped from there). */\n goTo: (stepId: string) => void\n skip: (stepId: string) => Promise<void>\n retry?: (stepId: string) => Promise<void>\n /** Show the run from the start again (a host that starts a new run resets its own state). */\n restart: () => void\n}\n\nconst errorMessage = (e: unknown): string =>\n e instanceof Error ? e.message : typeof e === 'string' ? e : 'Something went wrong.'\n\n/** The first step that is not finished yet: where a run opens. */\nfunction firstOpen(\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>\n): string | null {\n const open = steps.find((s) => !['done', 'skipped'].includes(states[s.id]?.status ?? 'pending'))\n return open?.id ?? (steps.length && isRunFinished(steps, states) ? null : (steps[0]?.id ?? null))\n}\n\nexport function useWorkflowView(options: UseWorkflowViewOptions): WorkflowRunView {\n const { steps, states, inputs, setInput } = options\n const [current, setCurrent] = useState<string | null>(() => firstOpen(steps, states))\n const [showErrors, setShowErrors] = useState(false)\n const [busy, setBusy] = useState(false)\n const [actionError, setActionError] = useState<string | null>(null)\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n // A run loaded after the first render (its thread arrived) opens where it is.\n const placed = useRef(steps.length > 0)\n useEffect(() => {\n if (placed.current || steps.length === 0) return\n placed.current = true\n setCurrent(firstOpen(steps, states))\n }, [steps, states])\n\n const step = steps.find((s) => s.id === current)\n const following = useCallback(\n (id: string | null): string | null => {\n const i = steps.findIndex((s) => s.id === id)\n return steps[i + 1]?.id ?? null\n },\n [steps]\n )\n const action: WorkflowNextAction = busy ? 'wait' : nextAction(steps, states, current)\n\n const next = useCallback(async () => {\n const { steps: s, states: st, inputs: values } = optionsRef.current\n const at = s.find((x) => x.id === current)\n const act = nextAction(s, st, current)\n if (!at || act === 'wait' || busy) return\n setActionError(null)\n if (act === 'finish') return setCurrent(null)\n if (act === 'move') return setCurrent(following(current))\n setBusy(true)\n try {\n if (act === 'skip') {\n await optionsRef.current.skip(at.id)\n } else {\n if (Object.keys(validateStep(at, values)).length > 0) {\n setShowErrors(true)\n return\n }\n await optionsRef.current.complete(at)\n }\n setShowErrors(false)\n setCurrent(following(current) ?? current)\n } catch (e) {\n setActionError(errorMessage(e))\n } finally {\n setBusy(false)\n }\n }, [current, busy, following])\n\n const goTo = useCallback((stepId: string) => {\n setShowErrors(false)\n setActionError(null)\n setCurrent(stepId)\n }, [])\n\n const index = steps.findIndex((s) => s.id === current)\n const back = useCallback(() => {\n const i = steps.findIndex((s) => s.id === current)\n const to = i < 0 ? steps[steps.length - 1] : steps[i - 1]\n if (to) goTo(to.id)\n }, [steps, current, goTo])\n\n const act = useCallback(\n (fn: ((id: string) => Promise<void>) | undefined) =>\n fn &&\n (async (stepId: string) => {\n setBusy(true)\n setActionError(null)\n try {\n await fn(stepId)\n } catch (e) {\n setActionError(errorMessage(e))\n } finally {\n setBusy(false)\n }\n }),\n []\n )\n const skip = useMemo(\n () => act((id) => optionsRef.current.skip(id)) as (id: string) => Promise<void>,\n [act]\n )\n const retry = useMemo(\n () =>\n options.retry ? act((id) => optionsRef.current.retry?.(id) ?? Promise.resolve()) : undefined,\n // Only whether the host offers retry matters here.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [act, !!options.retry]\n )\n\n const isLocked = useCallback(\n (stepId: string) => optionsRef.current.isLocked?.(stepId) ?? false,\n []\n )\n\n return {\n steps,\n step,\n current,\n isComplete: current === null,\n inputs,\n setInput,\n stateOf: (id) => states[id],\n phaseOf: (id) => stepPhase(steps, states, id),\n isLocked,\n errors: showErrors && step && !isLocked(step.id) ? validateStep(step, inputs) : {},\n busy,\n actionError,\n isRunning: Object.values(states).some((s) => s.status === 'running'),\n action,\n canBack: (current === null || index > 0) && !busy,\n next,\n back,\n goTo,\n skip,\n retry,\n restart: () => {\n setShowErrors(false)\n setActionError(null)\n setCurrent(steps[0]?.id ?? null)\n },\n }\n}\n","/**\n * A stepped workflow run, end to end: the stepper, the step in view (a form, an upload, an agent\n * step or a review) and moving on. The stepper lays the graph out by depth: a sequence is one row,\n * steps side by side stack in a column. The run comes from `useWorkflowThread` (a thread on the\n * server) or `useWorkflowPreview`; wording and the agent output's rendering come from the host.\n */\n\nimport type { ReactNode } from 'react'\nimport {\n AlertTriangle,\n ArrowLeft,\n ArrowRight,\n Check,\n CheckCircle2,\n FileText,\n GitBranch,\n Loader2,\n MinusCircle,\n RotateCw,\n} from 'lucide-react'\nimport { Button, Card, cn } from '@arbidocs/react/ui'\nimport { UploadDropzone } from '../../files/UploadDropzone'\nimport { SchemaForm, type SchemaFormProps } from './SchemaForm'\nimport { reviewInstructions, stepDependencies, stepLevels, type WorkflowStepPhase } from './run'\nimport type { WorkflowRunView } from './useWorkflowView'\nimport type {\n WorkflowAgentStep,\n WorkflowDefinition,\n WorkflowReviewStep,\n WorkflowStep,\n WorkflowStepState,\n WorkflowUploadStep,\n} from './types'\n\nexport interface WorkflowRunnerLabels {\n back: string\n next: string\n skip: string\n /** Skips the step in view (any unfinished step: the plan guides the thread, it does not hold it). */\n skipStep: string\n finish: string\n approve: string\n working: string\n /** An agent step about to start (the run will pick it up). */\n starting: string\n retry: string\n failed: string\n /** A step whose dependencies have not finished; `{steps}` is replaced with their titles. */\n blocked: string\n awaitingReview: string\n approved: string\n skipped: string\n /** An agent step that runs off the main line and delivers its result to it. */\n branch: string\n /** The default finish heading (the workflow's `completion.title` wins). */\n complete: string\n restart: string\n /** The upload step's file list heading; `{count}` is replaced. */\n filesHeading: string\n noFiles: string\n}\n\nexport const DEFAULT_WORKFLOW_RUNNER_LABELS: WorkflowRunnerLabels = {\n back: 'Back',\n next: 'Continue',\n skip: 'Skip',\n skipStep: 'Skip this step',\n finish: 'Finish',\n approve: 'Approve',\n working: 'Working…',\n starting: 'Starting…',\n retry: 'Retry',\n failed: 'This step did not finish.',\n blocked: 'Starts after {steps}.',\n awaitingReview: 'Waiting for approval.',\n approved: 'Approved.',\n skipped: 'Skipped.',\n branch: 'Runs alongside; its result joins the thread',\n complete: 'Done',\n restart: 'Start again',\n filesHeading: 'Files ({count})',\n noFiles: 'No files yet.',\n}\n\n/** A file the upload step lists (what is already in the run's workspace). */\nexport interface WorkflowRunnerFile {\n id: string\n name: string\n}\n\nexport interface WorkflowRunnerProps extends Pick<\n SchemaFormProps,\n 'renderScope' | 'renderDocuments' | 'renderIcon'\n> {\n workflow: WorkflowDefinition\n run: WorkflowRunView\n /** An agent step's output (its answer, a drafted document). */\n renderAgentOutput: (step: WorkflowAgentStep, state: WorkflowStepState | undefined) => ReactNode\n /** A review's extras while it waits (e.g. who to ask). */\n renderReview?: (step: WorkflowReviewStep) => ReactNode\n /** Upload step: the host performs the upload into the run's workspace. */\n onUpload?: (files: File[]) => void | Promise<void>\n uploading?: boolean\n /** What the run's workspace holds, listed on the upload step. */\n files?: WorkflowRunnerFile[]\n /** Replaces an upload step's body. */\n renderUpload?: (step: WorkflowUploadStep) => ReactNode\n /** Extra content under a step's body (e.g. what a commit created). */\n renderStepNote?: (step: WorkflowStep, run: WorkflowRunView) => ReactNode\n /** Replaces the finish screen. */\n renderComplete?: (run: WorkflowRunView) => ReactNode\n labels?: Partial<WorkflowRunnerLabels>\n /**\n * Test ids: `<prefix>-step-<id>` (pill), `<prefix>-<id>` (body), `<prefix>-field-<name>`,\n * `<prefix>-next` / `-back`, `<prefix>-done`.\n */\n testIdPrefix?: string\n className?: string\n}\n\nfunction PhaseMark({ phase, icon }: { phase: WorkflowStepPhase; icon?: ReactNode }) {\n if (phase === 'done') return <Check className=\"size-3.5\" />\n if (phase === 'running') return <Loader2 className=\"size-3.5 animate-spin\" />\n if (phase === 'failed') return <AlertTriangle className=\"size-3.5\" />\n if (phase === 'skipped') return <MinusCircle className=\"size-3.5\" />\n return icon ? (\n <span className=\"flex size-3.5 items-center justify-center [&_svg]:size-3.5\">{icon}</span>\n ) : null\n}\n\nexport function WorkflowRunner({\n workflow,\n run,\n renderAgentOutput,\n renderReview,\n onUpload,\n uploading = false,\n files,\n renderUpload,\n renderStepNote,\n renderComplete,\n renderScope,\n renderDocuments,\n renderIcon,\n labels,\n testIdPrefix = 'workflow-run',\n className,\n}: WorkflowRunnerProps) {\n const l = { ...DEFAULT_WORKFLOW_RUNNER_LABELS, ...labels }\n const { steps, step, isComplete, action } = run\n const completion = workflow.run.kind === 'steps' ? workflow.run.completion : undefined\n const tid = (suffix: string) => `${testIdPrefix}-${suffix}`\n const levels = stepLevels(steps)\n // A long workflow keeps its labels for the step in view; the rest are icons (named on hover and\n // to assistive technology), and the row scrolls rather than overflowing.\n const crowded = levels.length > 6\n const icon = (key?: string) => (key && renderIcon ? renderIcon(key) : undefined)\n\n const pill = (s: WorkflowStep) => {\n const phase = run.phaseOf(s.id)\n const current = s.id === run.current\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => run.goTo(s.id)}\n disabled={run.busy}\n className={cn(\n 'flex shrink-0 items-center gap-2 whitespace-nowrap rounded-full border px-2.5 py-1.5 text-xs font-medium transition-colors disabled:cursor-default',\n current\n ? 'border-primary bg-primary/10 text-primary'\n : phase === 'failed'\n ? 'border-destructive/40 text-destructive'\n : phase === 'done' || phase === 'skipped' || phase === 'running'\n ? 'border-primary/30 bg-primary/5 text-primary'\n : 'border-border text-muted-foreground'\n )}\n aria-current={current ? 'step' : undefined}\n aria-label={s.title}\n title={s.title}\n data-phase={phase}\n data-testid={tid(`step-${s.id}`)}\n >\n <PhaseMark phase={phase} icon={icon(s.icon)} />\n <span className={cn(current ? 'inline' : crowded ? 'hidden' : 'hidden @4xl:inline')}>\n {s.title}\n </span>\n </button>\n )\n }\n\n const nextLabel =\n action === 'skip'\n ? l.skip\n : action === 'finish'\n ? l.finish\n : action === 'complete' && step?.kind === 'review'\n ? l.approve\n : action === 'wait' && (run.isRunning || run.busy)\n ? l.working\n : ((step && !run.isLocked(step.id) ? step.nextLabel : undefined) ?? l.next)\n\n return (\n <div className={cn('space-y-6', className)} data-testid={testIdPrefix}>\n {/* By depth: one row at any width for a sequence; parallel steps stack in their column.\n Icons when narrow, the current label always, all labels once there is room. */}\n <div className=\"@container\">\n <ol\n className={cn('flex w-full items-center gap-1.5', crowded && 'overflow-x-auto pb-1')}\n data-testid={tid('steps')}\n >\n {[...levels, null].map((level, i) => (\n <li\n key={level ? level.map((s) => s.id).join('+') : 'done'}\n className={cn(\n 'flex items-center gap-1.5',\n i < levels.length && (crowded ? 'flex-none' : 'min-w-0 flex-1 @4xl:flex-none')\n )}\n >\n {level ? (\n <div className=\"flex flex-col items-start gap-1\">{level.map(pill)}</div>\n ) : (\n <div\n className={cn(\n 'flex shrink-0 items-center gap-2 whitespace-nowrap rounded-full border px-2.5 py-1.5 text-xs font-medium',\n isComplete\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground'\n )}\n aria-current={isComplete ? 'step' : undefined}\n data-testid={tid('step-done')}\n >\n <PhaseMark phase=\"ready\" icon={icon(completion?.icon)} />\n <span\n className={cn(\n isComplete ? 'inline' : crowded ? 'hidden' : 'hidden @4xl:inline'\n )}\n >\n {completion?.title ?? l.complete}\n </span>\n </div>\n )}\n {i < levels.length && (\n <div\n className={cn(\n 'h-px',\n crowded ? 'w-3 flex-none' : 'min-w-2 flex-1 @4xl:w-4 @4xl:flex-none',\n level?.every((s) => ['done', 'skipped'].includes(run.phaseOf(s.id)))\n ? 'bg-primary/40'\n : 'bg-border'\n )}\n />\n )}\n </li>\n ))}\n </ol>\n </div>\n\n {isComplete ? (\n (renderComplete?.(run) ?? (\n <Card className=\"mx-auto max-w-lg p-8 text-center\" data-testid={tid('done')}>\n <CheckCircle2 className=\"mx-auto size-12 text-primary\" />\n <h2 className=\"mt-4 text-xl font-semibold\">{completion?.title ?? l.complete}</h2>\n {completion?.description && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{completion.description}</p>\n )}\n <Button\n variant=\"outline\"\n className=\"mt-6\"\n onClick={run.restart}\n data-testid={tid('restart')}\n >\n {l.restart}\n </Button>\n </Card>\n ))\n ) : step ? (\n <div key={step.id} className=\"space-y-3\">\n {run.phaseOf(step.id) === 'blocked' ? (\n <Card className=\"max-w-2xl p-6\" data-testid={tid(step.id)}>\n <p className=\"text-sm text-muted-foreground\" data-testid={tid(`${step.id}-blocked`)}>\n {l.blocked.replace(\n '{steps}',\n stepDependencies(steps, step.id)\n .map((d) => steps.find((s) => s.id === d)?.title ?? d)\n .join(', ')\n )}\n </p>\n </Card>\n ) : step.kind === 'form' ? (\n <Card className=\"max-w-2xl space-y-4 p-6\" data-testid={tid(step.id)}>\n {step.description && (\n <p className=\"text-sm text-muted-foreground\">{step.description}</p>\n )}\n <fieldset disabled={run.isLocked(step.id)} className=\"contents\">\n <SchemaForm\n fields={step.inputs}\n values={run.inputs}\n onChange={run.setInput}\n errors={run.errors}\n renderScope={renderScope}\n renderDocuments={renderDocuments}\n renderIcon={renderIcon}\n onEnterSubmit={() => void run.next()}\n testIdPrefix={tid('field')}\n />\n </fieldset>\n {run.actionError && (\n <p className=\"text-sm text-destructive\" data-testid={tid('action-error')}>\n {run.actionError}\n </p>\n )}\n {renderStepNote?.(step, run)}\n </Card>\n ) : step.kind === 'upload' ? (\n <Card className=\"max-w-2xl space-y-4 p-6\" data-testid={tid(step.id)}>\n {renderUpload?.(step) ?? (\n <>\n <UploadDropzone\n onFiles={(picked) => void onUpload?.(picked)}\n uploading={uploading}\n disabled={!onUpload}\n accept={step.accept}\n title={step.title}\n description={step.description}\n hint={step.hint}\n testId={tid(`${step.id}-drop`)}\n />\n {files && (\n <div className=\"space-y-1\" data-testid={tid(`${step.id}-files`)}>\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {l.filesHeading.replace('{count}', String(files.length))}\n </p>\n {files.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">{l.noFiles}</p>\n )}\n {files.slice(0, 6).map((f) => (\n <div\n key={f.id}\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n >\n <FileText className=\"size-3.5 text-primary\" />\n <span className=\"truncate\">{f.name}</span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n {run.actionError && <p className=\"text-sm text-destructive\">{run.actionError}</p>}\n {renderStepNote?.(step, run)}\n </Card>\n ) : step.kind === 'review' ? (\n <Card className=\"max-w-2xl space-y-4 p-6\" data-testid={tid(step.id)}>\n <StepHeading step={step} icon={icon(step.icon)} />\n <p className=\"whitespace-pre-line text-sm text-muted-foreground\">\n {reviewInstructions(step, run.inputs)}\n </p>\n <p className=\"text-sm\" data-testid={tid(`${step.id}-status`)}>\n {run.phaseOf(step.id) === 'done'\n ? l.approved\n : run.phaseOf(step.id) === 'skipped'\n ? l.skipped\n : l.awaitingReview}\n </p>\n {run.phaseOf(step.id) === 'ready' && renderReview?.(step)}\n {run.actionError && <p className=\"text-sm text-destructive\">{run.actionError}</p>}\n {renderStepNote?.(step, run)}\n </Card>\n ) : (\n <AgentStepBody\n step={step}\n run={run}\n renderAgentOutput={renderAgentOutput}\n icon={icon(step.icon)}\n renderStepNote={renderStepNote}\n l={l}\n tid={tid}\n />\n )}\n </div>\n ) : null}\n\n {!isComplete && (\n <div className=\"flex items-center justify-between border-t border-border pt-4\">\n <Button\n variant=\"ghost\"\n onClick={run.back}\n disabled={!run.canBack}\n data-testid={tid('back')}\n >\n <ArrowLeft className=\"size-4\" /> {l.back}\n </Button>\n <div className=\"flex items-center gap-2\">\n {step &&\n action !== 'skip' &&\n // A step that commits (creates the matter, starts the thread) is what the run stands on.\n !step.commit &&\n ['ready', 'blocked', 'failed'].includes(run.phaseOf(step.id)) && (\n <Button\n variant=\"ghost\"\n onClick={() => void run.skip(step.id)}\n disabled={run.busy}\n data-testid={tid('skip-step')}\n >\n {l.skipStep}\n </Button>\n )}\n <Button\n onClick={() => void run.next()}\n disabled={action === 'wait'}\n data-testid={tid('next')}\n >\n {nextLabel}\n {action === 'wait' && (run.isRunning || run.busy) ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <ArrowRight className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction StepHeading({ step, icon }: { step: WorkflowStep; icon?: ReactNode }) {\n return (\n <div className=\"min-w-0\">\n <p className=\"flex items-center gap-2 text-sm font-medium\">\n {icon && (\n <span className=\"flex size-4 items-center justify-center text-primary [&_svg]:size-4\">\n {icon}\n </span>\n )}\n {step.title}\n </p>\n {step.description && <p className=\"mt-1 text-xs text-muted-foreground\">{step.description}</p>}\n </div>\n )\n}\n\nfunction AgentStepBody({\n step,\n run,\n renderAgentOutput,\n icon,\n renderStepNote,\n l,\n tid,\n}: {\n step: WorkflowAgentStep\n run: WorkflowRunView\n renderAgentOutput: WorkflowRunnerProps['renderAgentOutput']\n icon?: ReactNode\n renderStepNote?: WorkflowRunnerProps['renderStepNote']\n l: WorkflowRunnerLabels\n tid: (suffix: string) => string\n}) {\n const state = run.stateOf(step.id)\n const phase = run.phaseOf(step.id)\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <StepHeading step={step} icon={icon} />\n {phase === 'failed' && (\n <div className=\"flex shrink-0 items-center gap-2\">\n {run.retry && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void run.retry?.(step.id)}\n disabled={run.busy}\n data-testid={tid(`${step.id}-retry`)}\n >\n <RotateCw className=\"size-4\" /> {l.retry}\n </Button>\n )}\n </div>\n )}\n </div>\n )\n const status = (\n <div className=\"space-y-1\">\n {step.branch && (\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <GitBranch className=\"size-3.5\" /> {l.branch}\n </p>\n )}\n {(phase === 'ready' || phase === 'running') && !state?.text && (\n <p\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n data-testid={tid(`${step.id}-working`)}\n >\n <Loader2 className=\"size-4 animate-spin\" /> {phase === 'ready' ? l.starting : l.working}\n </p>\n )}\n {phase === 'failed' && (\n <p className=\"text-sm text-destructive\" data-testid={tid(`${step.id}-failed`)}>\n {state?.error || l.failed}\n </p>\n )}\n {phase === 'skipped' && <p className=\"text-sm text-muted-foreground\">{l.skipped}</p>}\n </div>\n )\n\n if (step.output === 'artifact') {\n return (\n <div\n className=\"grid gap-4 lg:grid-cols-[minmax(0,18rem)_minmax(0,1fr)]\"\n data-testid={tid(step.id)}\n >\n <Card className=\"h-fit space-y-3 p-5\">\n {header}\n {status}\n {renderStepNote?.(step, run)}\n </Card>\n <div className=\"min-w-0\">{renderAgentOutput(step, state)}</div>\n </div>\n )\n }\n return (\n <Card className=\"space-y-3 p-6\" data-testid={tid(step.id)}>\n {header}\n {status}\n {renderAgentOutput(step, state)}\n {renderStepNote?.(step, run)}\n </Card>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/files/grid-test-ids.ts","../src/files/GridView.tsx","../src/files/SelectionBar.tsx"],"names":["themeQuartz","useRef","useMediaQuery","BREAKPOINT_QUERIES","useMemo","useCallback","useEffect","jsxs","jsx","AgGridReact","AllCommunityModule","useState","useLayoutEffect","observeResize","cn","testIdOr","X","BookOpen","Tooltip","TooltipTrigger","Button","TooltipContent"],"mappings":"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","file":"chunk-IA7RTPT3.cjs","sourcesContent":["/**\n * Test-id hooks for AG Grid, which owns its row and cell DOM. AG Grid stamps every row with a\n * `row-id` attribute and every cell with `col-id`; these helpers turn them into `data-testid`s\n * a host chooses, so a custom UI keeps its own test-id scheme.\n */\n\nexport interface GridTestIdOptions<T> {\n /** Test id of the row for `item` (set on the centre-column row element). */\n getRowTestId?: (item: T) => string\n /** Test id of the cell in column `colId` of `item`. */\n getCellTestId?: (colId: string, item: T) => string\n}\n\n/** Stamp `data-testid`s onto the rows and cells under `root`. Idempotent. */\nexport function applyGridTestIds<T>(\n root: ParentNode,\n itemsById: Map<string, T>,\n { getRowTestId, getCellTestId }: GridTestIdOptions<T>\n): void {\n if (!getRowTestId && !getCellTestId) return\n root.querySelectorAll<HTMLElement>('.ag-center-cols-container .ag-row[row-id]').forEach((row) => {\n const item = itemsById.get(row.getAttribute('row-id') ?? '')\n if (item === undefined) return\n if (getRowTestId) row.setAttribute('data-testid', getRowTestId(item))\n if (getCellTestId) {\n row.querySelectorAll<HTMLElement>('.ag-cell[col-id]').forEach((cell) => {\n cell.setAttribute('data-testid', getCellTestId(cell.getAttribute('col-id') ?? '', item))\n })\n }\n })\n}\n\n/**\n * Keep the ids applied as AG Grid creates and recycles rows (it virtualises). Returns the\n * disconnect function.\n */\nexport function watchGridTestIds<T>(\n root: HTMLElement,\n getItemsById: () => Map<string, T>,\n options: GridTestIdOptions<T>\n): () => void {\n if (!options.getRowTestId && !options.getCellTestId) return () => {}\n const run = () => applyGridTestIds(root, getItemsById(), options)\n run()\n if (typeof MutationObserver === 'undefined') return () => {}\n const observer = new MutationObserver(run)\n observer.observe(root, { childList: true, subtree: true })\n return () => observer.disconnect()\n}\n","/**\n * GridView — a flexible AG Grid presentational core.\n *\n * Pure and app-agnostic: it owns no global state and pulls in no store. Column\n * state persistence (order / width / visibility / sort / filter) is exposed as a\n * controlled/uncontrolled prop pair — `gridState` (initial state, read once at\n * mount) and `onGridStateChange` (called whenever AG Grid's state changes). An\n * app wires those to wherever it keeps the state (Zustand, localStorage, a URL,\n * a server) via a thin adapter; the core stays decoupled.\n *\n * Themed here (colours/fonts/borders via the host CSS variables, so it inherits the host's\n * light/dark theme). The structural helper classes (cell-numeric, multiline clamp, scrollbars,\n * row kebabs) live in `@arbidocs/blocks/grid.css`, which the consuming app imports globally.\n */\n\nimport React, { useRef, useCallback, useMemo, useEffect } from 'react'\nimport { AgGridReact } from 'ag-grid-react'\nimport {\n ColDef,\n GridOptions,\n GridApi,\n IRowNode,\n GridState,\n themeQuartz,\n CellValueChangedEvent,\n GridReadyEvent,\n RowClickedEvent,\n} from 'ag-grid-community'\nimport { AllCommunityModule } from 'ag-grid-community'\nimport { BREAKPOINT_QUERIES, useMediaQuery } from '../lib/use-media-query'\nimport { watchGridTestIds } from './grid-test-ids'\n\n// Create the custom ARBI theme using themeQuartz\n// Colours reference the host CSS variables (hsl(var(--token))), so dark mode follows the app.\n// This enables dark mode support and consistent theming\nconst cssVar = (name: string, alpha?: number): string =>\n alpha === undefined ? `hsl(var(--${name}))` : `hsl(var(--${name}) / ${alpha})`\n\nconst arbiTheme = themeQuartz.withParams({\n // Variant B palette: white canvas, quiet header, muted hover nudge, accent-tint selection.\n // Every colour is a host CSS variable, so light/dark follow the app with no .dark overrides.\n backgroundColor: cssVar('background'),\n foregroundColor: cssVar('foreground'),\n borderColor: cssVar('border'),\n headerBackgroundColor: cssVar('background'),\n headerTextColor: cssVar('muted-foreground'),\n oddRowBackgroundColor: cssVar('background'),\n rowHoverColor: cssVar('muted', 0.6),\n // Checkbox-selected rows: a light accent tint. A row opened elsewhere (e.g. the viewer) may take\n // the full accent, so the two states stay distinguishable.\n selectedRowBackgroundColor: cssVar('accent', 0.6),\n rangeSelectionBackgroundColor: cssVar('accent'),\n accentColor: cssVar('primary'),\n inputFocusBorder: { color: cssVar('primary') },\n headerColumnBorder: false,\n // A faint short tick marks every column edge (so resizing is discoverable without a full\n // divider line); it strengthens while the header is hovered (see grid.css).\n headerColumnResizeHandleColor: cssVar('border'),\n headerColumnResizeHandleHeight: '40%',\n headerColumnResizeHandleWidth: 1,\n\n // Font settings — inherit the host app's font. A googleFont here never\n // loaded under the apps' CSP, so every grid silently fell back to the\n // browser's default SERIF and read as unstyled.\n fontFamily: 'inherit',\n fontSize: 14,\n headerFontSize: 12.5,\n headerFontWeight: 500,\n\n // Sizing\n headerHeight: 44,\n rowHeight: 40,\n cellHorizontalPadding: 16,\n\n // Borders - structural settings only.\n // Row border is a real hairline in the theme border colour (not hardcoded\n // white, which was invisible on the light-mode background and wrong in dark\n // mode) so adjacent rows are clearly separated — important now that rows can\n // be tall and multi-line (e.g. the Abstract column).\n rowBorder: { style: 'solid', width: 1, color: 'hsl(var(--border))' },\n columnBorder: false, // Row hairlines only\n wrapperBorder: false,\n\n // No rounded corners for clean look (except checkboxes)\n borderRadius: 0,\n wrapperBorderRadius: 0,\n checkboxBorderRadius: 2, // Keep checkboxes square\n})\n\n// Selection configuration\nexport interface GridViewSelection<T> {\n mode: 'single' | 'multiple'\n selected: T[]\n onSelectionChange: (items: T[]) => void\n /**\n * Keep the grid's ticked rows equal to `selected` after mount (default: `selected` only seeds the\n * grid). For a host that changes the selection itself, e.g. ticking a parent ticks its sub-tasks.\n */\n controlled?: boolean\n}\n\n// Empty state configuration\nexport interface GridViewEmptyState {\n icon?: React.ReactNode\n title?: string\n message?: string\n action?: React.ReactNode\n}\n\n// Generic props to make this grid reusable with different data types\nexport interface GridViewProps<T> {\n // Core data\n items: T[]\n // Column configuration\n columnDefs: ColDef<T>[]\n // Row identity function\n getItemId: (item: T) => string\n // Selection handling\n selection?: GridViewSelection<T>\n // Empty state\n emptyState?: GridViewEmptyState\n // Loading state\n isLoading?: boolean\n loadingMessage?: string\n // Grid options\n gridOptions?: Partial<GridOptions<T>>\n // Grid initialization\n onGridReady?: (params: { api: GridApi<T> }) => void\n // Cell value changes\n onCellValueChanged?: (event: CellValueChangedEvent<T>) => void\n // Row click handler\n onRowClick?: (item: T) => void\n // State persistence.\n // The core is decoupled from any store: when `persistState` is on it seeds\n // AG Grid from `gridState` (read once at mount) and reports every subsequent\n // state change through `onGridStateChange`. An app-adapter wires these to its\n // own store. `gridId` is retained as an opaque identity hint for adapters\n // (the core itself does not read it).\n persistState?: boolean\n gridId?: string\n // Persisted column/sort/filter state to restore at mount (controlled input).\n gridState?: GridState\n // Called whenever AG Grid's state changes so an adapter can persist it.\n onGridStateChange?: (state: GridState) => void\n // Initial visible columns (applied when no saved state exists)\n initialVisibleColumns?: string[]\n // Basic styling\n className?: string\n height?: string | number\n // Per-instance row height. Applied via the theme (not just gridOptions) so the\n // theme's calculated line-height tracks it and cell content stays vertically\n // centered. Fixed height — keeps row virtualization on the fast path.\n rowHeight?: number\n testId?: string\n // Pinned rows\n pinnedBottomRowData?: T[]\n pinnedTopRowData?: T[]\n // Pagination (disabled by default)\n pagination?: boolean\n paginationPageSizeSelector?: number[]\n // Test-id hooks: the grid owns its row/cell DOM, so ids are stamped onto it after render.\n // `getRowTestId` names a row; `getCellTestId` a cell (by colId). Without them AG Grid's own\n // `row-id` / `col-id` attributes are still there to select by.\n getRowTestId?: (item: T) => string\n getCellTestId?: (colId: string, item: T) => string\n // Force empty-state UI even when items.length > 0.\n // Used when rows are present but all hidden by an external filter.\n showEmpty?: boolean\n}\n\n/** Minimum row height on coarse pointers: 44px touch target + the 1px row border + breathing room. */\nconst TOUCH_ROW_HEIGHT = 52\n\nexport function GridView<T>({\n items,\n columnDefs,\n getItemId,\n selection,\n emptyState,\n isLoading = false,\n loadingMessage = 'Loading...',\n gridOptions,\n onGridReady,\n onCellValueChanged,\n onRowClick,\n persistState = false,\n gridState,\n onGridStateChange,\n initialVisibleColumns,\n className = 'w-full',\n height = 500,\n rowHeight: rowHeightProp,\n testId = 'grid-view',\n pinnedBottomRowData,\n pinnedTopRowData,\n pagination = false,\n paginationPageSizeSelector,\n getRowTestId,\n getCellTestId,\n showEmpty,\n}: GridViewProps<T>) {\n // Reference to the grid API\n const gridApiRef = useRef<GridApi<T> | null>(null)\n\n // On touch screens rows grow to a 44px-hit-area-friendly height: AG Grid clips cell content\n // (pills, filename buttons, avatar chips) to the row, so a taller hit area needs a taller row.\n const isCoarsePointer = useMediaQuery(BREAKPOINT_QUERIES.coarsePointer)\n const rowHeight = isCoarsePointer\n ? Math.max(rowHeightProp ?? gridOptions?.rowHeight ?? 40, TOUCH_ROW_HEIGHT)\n : rowHeightProp\n\n // Initial row height, captured once so it can live in the (stable) default\n // grid options. rowHeight is NOT passed as a reactive prop — that would make\n // the AgGridReact wrapper re-process grid options on every change and snap\n // manually-resized columns back to their colDef widths. Subsequent changes are\n // applied imperatively (see effect below).\n const initialRowHeightRef = useRef(rowHeight)\n\n // Persisted state to seed the grid with — captured once at mount so a reactive\n // `gridState` prop (e.g. an adapter re-reading its store each render) can never\n // re-initialise the grid mid-session. Mirrors AG Grid's own initialState,\n // which is read once.\n const initialGridStateRef = useRef(gridState)\n\n // Get initial state for the grid (read once at mount)\n const initialState = useMemo(() => {\n if (!persistState) return undefined\n return initialGridStateRef.current\n }, [persistState])\n\n // Save grid state via the adapter using modern AG Grid state API\n const saveGridState = useCallback(() => {\n if (!persistState || !onGridStateChange || !gridApiRef.current) return\n\n // Use AG Grid's comprehensive state API to capture complete state\n // This includes: filters, sort, column order, column visibility, column widths, etc.\n const state = gridApiRef.current.getState()\n\n onGridStateChange(state)\n }, [persistState, onGridStateChange])\n\n // Ensure selection column is visible after grid initialization\n const ensureSelectionColumnVisible = useCallback(() => {\n if (!gridApiRef.current || !selection?.mode) return\n\n // IMPORTANT: Force selection column to be visible after state restoration\n // This ensures even old saved states don't hide the selection column\n // Also handles case where selection column is completely missing from state\n const currentState = gridApiRef.current.getColumnState()\n const selectionColumn = currentState.find((col) => col.colId === 'ag-Grid-SelectionColumn')\n const selectionColumnIndex = currentState.findIndex(\n (col) => col.colId === 'ag-Grid-SelectionColumn'\n )\n\n // Fix if column is hidden OR missing entirely OR not in first position\n if (!selectionColumn || selectionColumn.hide || selectionColumnIndex !== 0) {\n // Use setColumnsVisible for more reliable visibility control\n gridApiRef.current.setColumnsVisible(['ag-Grid-SelectionColumn'], true)\n\n // Also apply state to ensure proper width\n gridApiRef.current.applyColumnState({\n state: [\n {\n colId: 'ag-Grid-SelectionColumn',\n hide: false,\n width: selectionColumn?.width || 48,\n pinned: null, // Ensure not pinned in wrong position\n },\n ],\n defaultState: { hide: undefined },\n applyOrder: false,\n })\n\n // Move selection column to first position if it's not there\n if (selectionColumnIndex !== 0) {\n gridApiRef.current.moveColumns(['ag-Grid-SelectionColumn'], 0)\n }\n }\n }, [selection?.mode])\n\n // Stamp host test ids onto AG Grid's rows and cells (it virtualises, so keep watching).\n const containerRef = useRef<HTMLDivElement>(null)\n const itemsRef = useRef(items)\n itemsRef.current = items\n const getItemIdRef = useRef(getItemId)\n getItemIdRef.current = getItemId\n const hasTestIdHooks = Boolean(getRowTestId || getCellTestId)\n useEffect(() => {\n const root = containerRef.current\n if (!root || !hasTestIdHooks) return\n return watchGridTestIds(\n root,\n () => new Map(itemsRef.current.map((item) => [getItemIdRef.current(item), item])),\n { getRowTestId, getCellTestId }\n )\n }, [hasTestIdHooks, getRowTestId, getCellTestId, isLoading])\n\n // Handle row ID\n const getRowId = useCallback(\n (params: { data: T }) => {\n return getItemId(params.data)\n },\n [getItemId]\n )\n\n // Refs for selection — avoids handleGridReady/handleSelectionChanged recreating\n // when selection object changes (which happens on every selectionConfig recompute)\n const selectionRef = useRef(selection)\n selectionRef.current = selection\n\n const onSelectionChangeRef = useRef(selection?.onSelectionChange)\n onSelectionChangeRef.current = selection?.onSelectionChange\n\n const syncingSelectionRef = useRef(false)\n\n const handleSelectionChanged = useCallback(() => {\n if (syncingSelectionRef.current) return\n if (!onSelectionChangeRef.current || !gridApiRef.current) return\n\n const selectedNodes = gridApiRef.current.getSelectedNodes()\n const selectedData = selectedNodes\n .map((node) => node.data)\n .filter((item): item is T => item !== undefined)\n\n onSelectionChangeRef.current(selectedData)\n }, [])\n\n // Handle row clicks\n // A controlled selection: tick and untick rows so the grid shows exactly `selection.selected`.\n const controlledSelected = selection?.controlled ? selection.selected : undefined\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !controlledSelected) return\n const wanted = new Set(controlledSelected.map(getItemId))\n const tick: IRowNode<T>[] = []\n const untick: IRowNode<T>[] = []\n api.forEachNode((node) => {\n if (!node.data) return\n const want = wanted.has(getItemId(node.data))\n if (want && !node.isSelected()) tick.push(node)\n else if (!want && node.isSelected()) untick.push(node)\n })\n syncingSelectionRef.current = true\n try {\n if (tick.length) api.setNodesSelected({ nodes: tick, newValue: true, source: 'api' })\n if (untick.length) api.setNodesSelected({ nodes: untick, newValue: false, source: 'api' })\n } finally {\n syncingSelectionRef.current = false\n }\n }, [controlledSelected, getItemId])\n\n const handleRowClicked = useCallback(\n (event: RowClickedEvent<T>) => {\n if (!onRowClick || !event.data) return\n // Don't fire when the click originated from an interactive element inside the cell\n // (e.g. action buttons). AG Grid fires rowClicked regardless of DOM stopPropagation.\n const target = event.event?.target as HTMLElement | null\n if (target?.closest('button, input, a, select, textarea, [role=\"button\"]')) return\n onRowClick(event.data)\n },\n [onRowClick]\n )\n\n // The visibility the user actually intends, per colId. AG Grid re-processes the\n // column definitions on some React re-renders even when the `columnDefs`\n // reference is unchanged, and that reset restores each colDef's `hide` — so a\n // column the user turned on (e.g. via a fields menu) silently disappears the\n // next time the host re-renders (opening an editor, selecting a row, …). We\n // remember the intended visibility and restore it whenever such a reset fires.\n // A Map (not a Set of hidden ids) so a genuinely NEW column from a real\n // columnDefs change — one we've never seen — is left at its colDef default\n // rather than force-shown.\n const desiredHiddenRef = useRef<Map<string, boolean> | null>(null)\n\n const snapshotDesiredHidden = useCallback(() => {\n const api = gridApiRef.current\n if (!api) return\n desiredHiddenRef.current = new Map(api.getColumnState().map((c) => [c.colId, !!c.hide]))\n }, [])\n\n // Handle grid ready\n const handleGridReady = useCallback(\n (event: GridReadyEvent<T>) => {\n gridApiRef.current = event.api\n\n // Apply initial visible columns when no saved state exists\n // This prevents showing all columns by default for new users\n if (!initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const stateMap = new Map(currentState.map((col) => [col.colId, col]))\n const visibleSet = new Set(initialVisibleColumns)\n\n // Build ordered state: selection column first (always visible), then visible columns, then hidden\n const selectionCol = stateMap.get('ag-Grid-SelectionColumn')\n const orderedState = [\n // Selection column first - ALWAYS visible, create if not in state\n selectionCol\n ? { ...selectionCol, hide: false }\n : { colId: 'ag-Grid-SelectionColumn', hide: false, width: 48 },\n // Visible columns in specified order\n ...initialVisibleColumns\n .filter((colId) => colId !== 'ag-Grid-SelectionColumn') // Don't duplicate selection column\n .map((colId) => {\n const col = stateMap.get(colId)\n return col ? { ...col, hide: false } : undefined\n }),\n // Hidden columns (everything else)\n ...currentState\n .filter((col) => col.colId !== 'ag-Grid-SelectionColumn' && !visibleSet.has(col.colId))\n .map((col) => ({ ...col, hide: true })),\n ].filter((col): col is NonNullable<typeof col> => col !== undefined)\n\n event.api.applyColumnState({ state: orderedState, applyOrder: true })\n }\n\n // When restoring persisted state, detect columns from columnDefs that\n // aren't in the saved state (e.g. newly added columns) and append them.\n // AG Grid's maintainColumnOrder adds them but may place them inconsistently;\n // this ensures they appear as hidden at the end so the navigator picks them up.\n if (initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const savedColIds = new Set(\n initialState.columnOrder?.orderedColIds ?? currentState.map((c) => c.colId)\n )\n const newCols = currentState.filter(\n (col) => !savedColIds.has(col.colId) && col.colId !== 'ag-Grid-SelectionColumn'\n )\n if (newCols.length > 0) {\n // Make new columns visible if they're in the default visible set\n const defaultVisible = new Set(initialVisibleColumns)\n event.api.applyColumnState({\n state: newCols.map((col) => ({\n ...col,\n hide: !defaultVisible.has(col.colId),\n })),\n })\n }\n }\n\n // Ensure selection column is visible (in case saved state hides it)\n ensureSelectionColumnVisible()\n\n // Seed the intended column visibility from the state AG Grid settled on\n // (colDefs + restored persisted state) so a later colDef-driven reset can\n // be undone rather than silently hiding a user-shown column.\n snapshotDesiredHidden()\n\n // Call the provided onGridReady callback\n if (onGridReady) {\n onGridReady({ api: event.api })\n }\n\n // Restore selection state if needed (read from ref to keep callback stable)\n const sel = selectionRef.current\n if (sel && sel.selected.length > 0) {\n const selectedIds = new Set(sel.selected.map(getItemId))\n event.api.forEachNode((node) => {\n if (node.data && selectedIds.has(getItemId(node.data))) {\n node.setSelected(true)\n }\n })\n }\n },\n [\n onGridReady,\n getItemId,\n ensureSelectionColumnVisible,\n snapshotDesiredHidden,\n initialState,\n initialVisibleColumns,\n ]\n )\n\n // Undo AG Grid's colDef-driven visibility reset; record genuine user changes.\n const handleColumnVisible = useCallback(\n (event: { source?: string }) => {\n const api = gridApiRef.current\n if (!api) return\n // A columnDefs re-apply reports `gridOptionsChanged`; a real toggle reports\n // an interaction source (api, toolPanelUi, columnMenu, …).\n if (event.source === 'gridOptionsChanged') {\n const desired = desiredHiddenRef.current\n if (!desired) return\n // Only correct columns we've seen before (in the snapshot); a brand-new\n // column keeps its colDef default.\n const fixes = api\n .getColumnState()\n .filter(\n (c) =>\n c.colId !== 'ag-Grid-SelectionColumn' &&\n desired.has(c.colId) &&\n desired.get(c.colId) !== !!c.hide\n )\n .map((c) => ({ colId: c.colId, hide: desired.get(c.colId) }))\n if (fixes.length) api.applyColumnState({ state: fixes })\n } else {\n // Genuine change — this is now the intended visibility.\n snapshotDesiredHidden()\n }\n },\n [snapshotDesiredHidden]\n )\n\n // Handle first data rendered - no auto-sizing, let flex columns handle it\n const handleFirstDataRendered = useCallback(() => {\n // Columns with flex will auto-fill, columns with width stay fixed\n // Also ensure selection column is visible as a backup (handles timing issues with initialState)\n ensureSelectionColumnVisible()\n // Seed the intended visibility from the state AG Grid settled on (colDefs +\n // any restored persisted state), so later resets can be undone.\n snapshotDesiredHidden()\n }, [ensureSelectionColumnVisible, snapshotDesiredHidden])\n\n // Track when AG Grid processes row updates\n const handleModelUpdated = useCallback(() => {\n // AG Grid handles model updates internally\n }, [])\n\n // Track row data changes for AG Grid updates\n const prevItemsRef = useRef<T[]>([])\n useEffect(() => {\n prevItemsRef.current = items\n }, [items])\n\n // Handle state updates - save state when it changes (modern AG Grid approach)\n const handleStateUpdated = useCallback(() => {\n saveGridState()\n }, [saveGridState])\n\n // Removed problematic useEffect that caused unnecessary re-renders\n // AG Grid handles selection internally, only sync on initial load\n\n // Default grid options with minimal settings - memoized to prevent re-renders\n const defaultOptions: GridOptions<T> = useMemo(() => {\n return {\n // Initial row height (stable — captured once). Live changes go through the\n // imperative effect, not this option, to avoid column-state churn.\n rowHeight: initialRowHeightRef.current,\n suppressMenuHide: true, // Prevent hiding columns since we don't have enterprise sidebar\n maintainColumnOrder: true, // Preserve column order when columns are added/removed\n\n // Row virtualization: Render rows as needed for performance\n // rowBuffer renders extra rows above/below viewport for smoother scrolling\n rowBuffer: 10, // Render 10 extra rows above/below viewport for smooth scrolling\n suppressColumnVirtualisation: false, // Keep column virtualization enabled\n suppressRowVirtualisation: false, // ENABLE row virtualization - only render visible rows\n animateRows: false, // Disable row animations\n suppressColumnMoveAnimation: true, // Disable column move/resize animations\n\n // Efficient updates with React Query cache\n // getRowId enables change detection - grid only re-renders changed rows\n // Works perfectly with React Query's cache updates\n getRowId: getRowId,\n\n rowSelection: selection?.mode\n ? {\n mode: selection.mode === 'single' ? 'singleRow' : 'multiRow',\n selectAll: 'filtered', // Header checkbox selects all filtered rows (across all pages)\n // In multi-row mode, only checkboxes should toggle selection (clicking row body would replace selection)\n enableClickSelection: selection.mode === 'single',\n checkboxes: true,\n headerCheckbox: selection.mode === 'multiple',\n }\n : undefined,\n selectionColumnDef: selection?.mode\n ? {\n sortable: selection.mode === 'multiple',\n width: 48,\n lockVisible: true, // Cannot be hidden\n suppressMovable: true, // Cannot be moved\n }\n : undefined,\n // Use normal layout for better performance - autoHeight causes forced reflows\n domLayout: 'normal',\n // Stop editing when clicking outside the cell/grid\n stopEditingWhenCellsLoseFocus: true,\n // Additional performance optimizations\n suppressCellFocus: true, // Don't focus cells on click (faster)\n suppressRowHoverHighlight: true, // Disable hover highlight - reduces DOM manipulation during scroll\n suppressScrollOnNewData: true, // Don't scroll when data updates\n suppressAggFuncInHeader: true, // Don't show aggregation functions (faster)\n // Tooltip UX: the AG Grid default show-delay is 2 s which hurts\n // discoverability for cells where tooltips carry the \"reveal full\n // content\" affordance for non-editable users. 300 ms is snappy\n // without being accidental. tooltipInteraction lets users hover\n // onto the tooltip itself (e.g. to select / copy long text).\n // These are AG Grid's native tooltip controls — no React / Radix\n // provider involved, zero per-row cost; tooltip DOM is created on\n // demand when hover-delay elapses and destroyed on mouseout.\n tooltipShowDelay: 300,\n tooltipHideDelay: 4000,\n tooltipInteraction: true,\n // Pagination (disabled by default)\n pagination,\n paginationPageSizeSelector,\n defaultColDef: {\n sortable: true,\n resizable: true,\n unSortIcon: false, // Sort glyph only on the sorted column (every header carrying one was noise)\n sortingOrder: ['asc', 'desc', null], // 3-way sorting: asc → desc → unsorted (AG Grid default)\n wrapText: false, // Disable text wrapping for cleaner display\n autoHeight: false, // Use fixed row height from theme\n wrapHeaderText: false, // Disable header text wrapping for cleaner look\n autoHeaderHeight: false, // Fixed header height\n filterParams: {\n maxNumConditions: 1,\n buttons: ['reset'],\n },\n },\n }\n }, [selection?.mode, getRowId, pagination, paginationPageSizeSelector])\n\n // Combine default options with passed options - memoized to prevent re-renders\n const combinedOptions = useMemo(\n () => ({ ...defaultOptions, ...gridOptions }),\n [defaultOptions, gridOptions]\n )\n\n // Apply fixed height for better performance — autoHeight causes forced\n // reflows by measuring all rows, avoid it.\n //\n // Also derive the geometry the wrapping multiline columns (.cell-multiline —\n // Abstract, Author, custom text fields) need so their overflow clip lands on\n // a WHOLE-line boundary (never mid-line, which reads as a half-line\n // \"bleeding\" into the neighbouring row). All computed once here per\n // row-height change and handed to CSS as variables — zero per-row cost on the\n // million-row grid:\n // --multiline-line-clamp : whole number of lines that fit — drives the CSS\n // line-clamp that hides overflow lines entirely.\n // --multiline-pad-y : vertical cell padding, shrunk on very short rows so\n // at least one whole line always fits.\n // --multiline-max-h : cap of exactly N whole lines + TOP padding + borders.\n // Deliberately excludes the bottom padding: AG Grid\n // forces cell height, so overflow clips at the\n // padding-box edge and any bottom padding becomes a\n // window onto the next (clamped-away) line. Ending the\n // box right at line N's bottom puts the clip on the\n // line boundary; the row supplies the visual gap below.\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = { height }\n if (rowHeight) {\n const LINE_PX = 14 * 1.35 // grid font-size × multiline line-height (18.9px)\n const BORDER = 2 // multiline cell top + bottom border (1px each, border-box)\n const PREFERRED_PAD = 16 // preferred total vertical padding (8px top + 8px bottom)\n // Don't let padding eat the room a single line needs on short rows.\n const padTotal = Math.max(0, Math.min(PREFERRED_PAD, rowHeight - BORDER - LINE_PX))\n const lines = Math.max(1, Math.floor((rowHeight - BORDER - padTotal) / LINE_PX))\n const vars = style as Record<string, string | number>\n vars['--multiline-line-clamp'] = `${lines}`\n vars['--multiline-pad-y'] = `${padTotal / 2}px`\n vars['--multiline-max-h'] = `${lines * LINE_PX + padTotal / 2 + BORDER}px`\n }\n return style\n }, [height, rowHeight])\n\n // Apply rowHeight changes imperatively via the grid option (not the theme —\n // recreating the theme would re-initialise the grid). This only re-lays-out\n // rows; columns, row virtualization, and the transaction bus are untouched.\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !rowHeight) return\n api.setGridOption('rowHeight', rowHeight)\n api.resetRowHeights()\n }, [rowHeight])\n\n // Add professional shadow for 3D effect\n // Add overflow-visible only for autoHeight layout\n const containerClassName = useMemo(() => {\n const baseClass = className || ''\n const shadowClass = 'shadow-sm' // Tailwind shadow for professional look\n // Height-adjustable grids vertically center cell content (CSS) so a\n // one-line cell or a lone pill sits in the middle of the row, and multi-line\n // text (e.g. Abstract) is balanced top-to-bottom — flagged here, applied in\n // grid.css.\n const alignClass = rowHeight ? 'ag-cells-centered' : ''\n return [baseClass, shadowClass, alignClass].filter(Boolean).join(' ')\n }, [className, rowHeight])\n\n // Show loading state — grey skeleton rows so the page transition feels instant\n if (isLoading) {\n const skeletonRowCount = 12\n return (\n <div\n data-testid={`${testId}-loading`}\n className={containerClassName}\n style={containerStyle}\n aria-busy=\"true\"\n aria-label={loadingMessage}\n >\n {/* Header skeleton */}\n <div className=\"flex h-11 items-center gap-4 border-b border-border/40 px-4\">\n <div className=\"h-3 w-6 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-24 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-20 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-28 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-16 rounded bg-muted animate-pulse ml-auto\" />\n </div>\n {/* Row skeletons */}\n {Array.from({ length: skeletonRowCount }).map((_, rowIdx) => (\n <div key={rowIdx} className=\"flex h-10 items-center gap-4 border-b border-border/20 px-4\">\n <div className=\"h-4 w-4 rounded-sm bg-muted/70 animate-pulse\" />\n <div\n className=\"h-3 rounded bg-muted/70 animate-pulse\"\n style={{ width: `${20 + ((rowIdx * 17) % 40)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${8 + ((rowIdx * 11) % 12)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${6 + ((rowIdx * 7) % 10)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/50 animate-pulse ml-auto\"\n style={{ width: `${5 + ((rowIdx * 5) % 8)}%` }}\n />\n </div>\n ))}\n </div>\n )\n }\n\n // Show empty state\n // showEmpty lets callers force this UI (e.g. when an external filter hid\n // every row but the underlying items array is non-empty).\n if ((showEmpty ?? items.length === 0) && emptyState) {\n return (\n <div\n data-testid={`${testId}-empty`}\n // Capped by its container (a landscape phone is shorter than 24rem) and scrollable, with the\n // content centred by auto margins so a tall one still starts at the top.\n className=\"flex h-96 max-h-full flex-col items-center overflow-y-auto p-6 text-center\"\n >\n <div className=\"my-auto flex flex-col items-center\">\n {emptyState.icon && (\n <div className=\"text-muted-foreground/60 mb-4\">{emptyState.icon}</div>\n )}\n {emptyState.title && <h3 className=\"text-xl font-medium mb-2\">{emptyState.title}</h3>}\n {emptyState.message && (\n <p className=\"text-muted-foreground mb-6 max-w-md\">{emptyState.message}</p>\n )}\n {emptyState.action}\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={containerClassName}\n style={containerStyle}\n data-testid={testId}\n >\n <AgGridReact\n theme={arbiTheme}\n modules={[AllCommunityModule]}\n columnDefs={columnDefs}\n rowData={items}\n pinnedBottomRowData={pinnedBottomRowData}\n pinnedTopRowData={pinnedTopRowData}\n getRowId={getRowId}\n initialState={initialState}\n onGridReady={handleGridReady}\n onFirstDataRendered={handleFirstDataRendered}\n onModelUpdated={handleModelUpdated}\n onSelectionChanged={handleSelectionChanged}\n onCellValueChanged={onCellValueChanged}\n onRowClicked={handleRowClicked}\n onStateUpdated={handleStateUpdated}\n onColumnVisible={handleColumnVisible}\n {...combinedOptions}\n />\n </div>\n )\n}\n","import { useLayoutEffect, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { BookOpen, X } from 'lucide-react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { observeResize } from '../lib/observe-resize'\n\nexport interface SelectionBarActionItem {\n id: string\n icon: LucideIcon\n label: string\n onClick: () => void\n disabled?: boolean\n variant?: 'default' | 'outline' | 'destructive' | 'ghost' | 'secondary'\n /** Tooltip text; falls back to `label`. */\n tooltip?: string\n testId?: string\n className?: string\n}\n\n/** Container width below which the bar is \"narrow\" (phones): only the essentials stay inline. */\nconst NARROW_BELOW_PX = 480\n\n/** Every fixed string of the selection bar. Pass a partial `labels` to translate or reword. */\nexport interface SelectionBarLabels {\n selected: string\n clearSelection: string\n review: string\n selectionActions: string\n}\n\nexport const DEFAULT_SELECTION_BAR_LABELS: SelectionBarLabels = {\n selected: 'selected',\n clearSelection: 'Clear selection',\n review: 'Review',\n selectionActions: 'Selection actions',\n}\n\nexport interface SelectionBarTestIds {\n toolbar: string\n count: string\n clear: string\n review: string\n}\n\nexport interface SelectionBarProps {\n /** Number of selected rows. The bar renders only while this is > 0 (or `status` is set). */\n count: number\n onClear: () => void\n /** Primary-in-bar \"Review\" shortcut (tonal, not the view's filled primary). */\n onReview?: () => void\n /** Actions as data. Rendered icon-only automatically when the bar is narrow. */\n actions?: SelectionBarActionItem[]\n /**\n * Free-form actions; a function receives `isCompact` (icon-only) and `isNarrow` (a phone-width\n * container: fold secondary actions into an overflow menu). Rendered after `actions`.\n */\n children?: ReactNode | ((isCompact: boolean, isNarrow: boolean) => ReactNode)\n /** Always-legible content before the actions (e.g. a running budget); never dimmed. */\n status?: ReactNode\n /** Singular noun shown after the count; wins over `labels.selected`. */\n selectedLabel?: string\n labels?: Partial<SelectionBarLabels>\n /** Overrides for the control test ids (defaults keep the current ids). */\n testIds?: Partial<SelectionBarTestIds>\n className?: string\n}\n\n/**\n * SelectionBar: the floating bar that appears while rows are selected.\n *\n * Stays on ONE row: when the actions overflow it flips to compact mode (icon-only actions and a\n * count-only badge) instead of wrapping. Sticky zero-height anchor, so showing/hiding it never\n * reflows the content beneath. Every control is always visible (nothing hover-only) and 44px on\n * coarse pointers.\n */\nexport function SelectionBar(props: SelectionBarProps) {\n if (props.count === 0 && !props.status) return null\n return <SelectionBarInner {...props} />\n}\n\nfunction SelectionBarInner({\n count,\n onClear,\n onReview,\n actions,\n children,\n status,\n selectedLabel,\n labels,\n testIds,\n className,\n}: SelectionBarProps) {\n const l = { ...DEFAULT_SELECTION_BAR_LABELS, ...labels }\n const hasSelection = count > 0\n const rootRef = useRef<HTMLDivElement>(null)\n const actionsRef = useRef<HTMLDivElement>(null)\n const [isCompact, setIsCompact] = useState(false)\n const [isNarrow, setIsNarrow] = useState(false)\n // Root width at which the labelled actions last overflowed. Compared against the (stable) root\n // width, never the actions' own width, which changes when we collapse labels and would oscillate.\n const overflowRootWidthRef = useRef(Number.POSITIVE_INFINITY)\n\n const measureRef = useRef<() => void>(() => {})\n measureRef.current = () => {\n const root = rootRef.current\n const el = actionsRef.current\n if (!root || !el) return\n // The bar is content-sized, so judge narrowness by the space it is given (its anchor).\n const available = root.parentElement?.clientWidth ?? 0\n setIsNarrow(available > 0 && available < NARROW_BELOW_PX)\n if (!isCompact) {\n if (el.scrollWidth > el.clientWidth + 1) {\n overflowRootWidthRef.current = root.clientWidth\n setIsCompact(true)\n }\n } else if (root.clientWidth > overflowRootWidthRef.current + 64) {\n setIsCompact(false)\n }\n }\n\n useLayoutEffect(() => {\n measureRef.current()\n const root = rootRef.current\n if (!root) return\n return observeResize(root, () => measureRef.current())\n }, [])\n // The bar is capped by its anchor, so its own size does not change when the actions overflow, and\n // the actions' text widens once the web font loads. Re-measure after every render and whenever\n // an action changes size. The measurement only sets state on a change, so this cannot loop.\n useLayoutEffect(() => {\n measureRef.current()\n const inner = actionsRef.current\n if (!inner || typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(() => measureRef.current())\n inner.querySelectorAll('button').forEach((button) => observer.observe(button))\n return () => observer.disconnect()\n })\n useLayoutEffect(() => {\n let isCancelled = false\n void document.fonts?.ready.then(() => {\n if (!isCancelled) measureRef.current()\n })\n return () => {\n isCancelled = true\n }\n }, [])\n\n return (\n <div\n data-slot=\"selection-bar\"\n className={cn('pointer-events-none sticky bottom-0 z-30 h-0', className)}\n >\n <div className=\"absolute inset-x-0 bottom-4 flex justify-center px-3\">\n <div\n ref={rootRef}\n role=\"toolbar\"\n aria-label={l.selectionActions}\n data-testid={testIdOr(testIds?.toolbar, { testId: 'bulk-actions-toolbar' })}\n data-narrow={isNarrow || undefined}\n className=\"pointer-events-auto flex min-h-12 max-w-full items-center rounded-lg border border-border bg-popover px-2 py-1.5 shadow-xl\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-2 px-1\">\n <div\n data-testid={testIdOr(testIds?.count, { testId: 'bulk-selected-count' })}\n aria-live=\"polite\"\n className={cn(\n 'flex shrink-0 items-center rounded-full bg-accent text-sm font-semibold tabular-nums text-accent-foreground',\n isCompact ? 'gap-1 px-2.5 py-1' : 'gap-2 px-3 py-1'\n )}\n >\n <span>\n {count}\n {!isCompact && ` ${selectedLabel ?? l.selected}`}\n </span>\n {hasSelection && (\n <button\n type=\"button\"\n onClick={onClear}\n aria-label={l.clearSelection}\n data-testid={testIdOr(testIds?.clear, { testId: 'bulk-clear-selection-button' })}\n className=\"rounded-full p-0.5 transition-colors hover:bg-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:p-[15px]\"\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n\n {onReview && (\n <button\n type=\"button\"\n onClick={onReview}\n aria-label={isNarrow ? l.review : undefined}\n data-testid={testIdOr(testIds?.review, { testId: 'bulk-review-button' })}\n className=\"flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-accent px-2.5 text-sm font-medium text-accent-foreground transition-colors hover:bg-accent/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11\"\n >\n <BookOpen className=\"size-3.5\" />\n {!isNarrow && l.review}\n </button>\n )}\n\n <div className=\"h-6 w-px shrink-0 bg-border\" />\n\n <div\n ref={actionsRef}\n className=\"flex min-w-0 flex-1 items-center gap-2 overflow-x-auto overscroll-x-contain [scrollbar-width:none]\"\n >\n {status && <div className=\"flex shrink-0 items-center gap-2\">{status}</div>}\n <div\n className={cn(\n 'flex min-w-0 items-center gap-2',\n !hasSelection && 'pointer-events-none opacity-40'\n )}\n >\n {actions?.map((a) => (\n <SelectionBarAction key={a.id} {...a} isCompact={isCompact} />\n ))}\n {typeof children === 'function' ? children(isCompact, isNarrow) : children}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport interface SelectionBarActionProps extends Omit<SelectionBarActionItem, 'id'> {\n /** Icon-only (the bar passes this when narrow). */\n isCompact?: boolean\n}\n\n/** One action button in the bar: icon + label, icon-only when compact, always with a tooltip. */\nexport function SelectionBarAction({\n icon: Icon,\n label,\n onClick,\n disabled = false,\n variant = 'ghost',\n tooltip,\n testId,\n className,\n isCompact = false,\n}: SelectionBarActionProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={variant}\n size=\"sm\"\n onClick={onClick}\n disabled={disabled}\n aria-label={isCompact ? label : undefined}\n data-testid={testId}\n className={cn(\n 'h-8 shrink-0 gap-1.5 whitespace-nowrap px-2 disabled:opacity-50 pointer-coarse:h-11',\n className\n )}\n >\n <Icon className=\"size-4\" />\n {!isCompact && <span className=\"text-sm\">{label}</span>}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltip ?? label}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n"]}
|