@arbidocs/blocks 0.5.32 → 0.5.34
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 -0
- package/dist/{ConnectedNativeDocxComparison-X6NTNHHM.cjs → ConnectedNativeDocxComparison-4R5WW7IU.cjs} +9 -9
- package/dist/{ConnectedNativeDocxComparison-X6NTNHHM.cjs.map → ConnectedNativeDocxComparison-4R5WW7IU.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-4RHC6KCE.js → ConnectedNativeDocxComparison-AH6KR4CZ.js} +8 -8
- package/dist/{ConnectedNativeDocxComparison-4RHC6KCE.js.map → ConnectedNativeDocxComparison-AH6KR4CZ.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-S5AT2UAH.js → ConnectedNativeDocxEditor-ETEJM7GN.js} +7 -7
- package/dist/{ConnectedNativeDocxEditor-S5AT2UAH.js.map → ConnectedNativeDocxEditor-ETEJM7GN.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-U75VOJBC.cjs → ConnectedNativeDocxEditor-MJVE2I33.cjs} +9 -9
- package/dist/{ConnectedNativeDocxEditor-U75VOJBC.cjs.map → ConnectedNativeDocxEditor-MJVE2I33.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-7XU5RSX2.js → ConnectedStreamedWordArtifact-JJI3HR7U.js} +8 -8
- package/dist/{ConnectedStreamedWordArtifact-7XU5RSX2.js.map → ConnectedStreamedWordArtifact-JJI3HR7U.js.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-QAZ5VQZS.cjs → ConnectedStreamedWordArtifact-S7EQ4FM2.cjs} +9 -9
- package/dist/ConnectedStreamedWordArtifact-S7EQ4FM2.cjs.map +1 -0
- package/dist/agents/index.cjs +326 -326
- package/dist/agents/index.js +4 -4
- package/dist/calls/index.cjs +33 -33
- package/dist/calls/index.js +5 -5
- package/dist/{chunk-2MCHQGVY.js → chunk-24H5WTGM.js} +4 -4
- package/dist/{chunk-2MCHQGVY.js.map → chunk-24H5WTGM.js.map} +1 -1
- package/dist/{chunk-D57MPMTZ.js → chunk-2YCCCXYV.js} +12 -3
- package/dist/chunk-2YCCCXYV.js.map +1 -0
- package/dist/{chunk-BNOP4REH.js → chunk-5JEM3BWT.js} +3 -3
- package/dist/{chunk-BNOP4REH.js.map → chunk-5JEM3BWT.js.map} +1 -1
- package/dist/{chunk-XBY36SIJ.js → chunk-AL4GAWD3.js} +3 -3
- package/dist/{chunk-XBY36SIJ.js.map → chunk-AL4GAWD3.js.map} +1 -1
- package/dist/{chunk-PUX4M22Q.cjs → chunk-B426HYRI.cjs} +49 -49
- package/dist/{chunk-PUX4M22Q.cjs.map → chunk-B426HYRI.cjs.map} +1 -1
- package/dist/{chunk-ZIURNTTS.cjs → chunk-BIWPXSGS.cjs} +7 -7
- package/dist/{chunk-ZIURNTTS.cjs.map → chunk-BIWPXSGS.cjs.map} +1 -1
- package/dist/{chunk-EPQ3364Q.cjs → chunk-C3YIVBTU.cjs} +6 -6
- package/dist/{chunk-EPQ3364Q.cjs.map → chunk-C3YIVBTU.cjs.map} +1 -1
- package/dist/{chunk-JBR3QNHC.cjs → chunk-EFSL4O3B.cjs} +4 -4
- package/dist/{chunk-JBR3QNHC.cjs.map → chunk-EFSL4O3B.cjs.map} +1 -1
- package/dist/{chunk-FHB4G77H.js → chunk-G5ISXB5I.js} +3 -3
- package/dist/{chunk-FHB4G77H.js.map → chunk-G5ISXB5I.js.map} +1 -1
- package/dist/{chunk-6EQSP77K.cjs → chunk-J6U6DIZK.cjs} +5 -5
- package/dist/{chunk-6EQSP77K.cjs.map → chunk-J6U6DIZK.cjs.map} +1 -1
- package/dist/{chunk-SBTRXXJF.cjs → chunk-JVXHVFUA.cjs} +11 -2
- package/dist/chunk-JVXHVFUA.cjs.map +1 -0
- package/dist/{chunk-2RFXSBPD.cjs → chunk-KBISVJPU.cjs} +4 -4
- package/dist/{chunk-2RFXSBPD.cjs.map → chunk-KBISVJPU.cjs.map} +1 -1
- package/dist/{chunk-B5G3AZ3O.js → chunk-N3HVTMQK.js} +3 -3
- package/dist/{chunk-B5G3AZ3O.js.map → chunk-N3HVTMQK.js.map} +1 -1
- package/dist/{chunk-3ES6VWRB.cjs → chunk-NOKTUWTN.cjs} +7 -7
- package/dist/{chunk-3ES6VWRB.cjs.map → chunk-NOKTUWTN.cjs.map} +1 -1
- package/dist/{chunk-EZSYYENN.js → chunk-O76V2TUY.js} +5 -5
- package/dist/{chunk-EZSYYENN.js.map → chunk-O76V2TUY.js.map} +1 -1
- package/dist/{chunk-7CHI36EP.js → chunk-OPK6GYYR.js} +3 -3
- package/dist/{chunk-7CHI36EP.js.map → chunk-OPK6GYYR.js.map} +1 -1
- package/dist/{chunk-FY4C7HU5.cjs → chunk-POU4O4D7.cjs} +9 -9
- package/dist/{chunk-FY4C7HU5.cjs.map → chunk-POU4O4D7.cjs.map} +1 -1
- package/dist/{chunk-ULA6YWWD.cjs → chunk-QU77RRZP.cjs} +21 -21
- package/dist/{chunk-ULA6YWWD.cjs.map → chunk-QU77RRZP.cjs.map} +1 -1
- package/dist/{chunk-L22MGRKB.cjs → chunk-R3QNE46Z.cjs} +4 -4
- package/dist/{chunk-L22MGRKB.cjs.map → chunk-R3QNE46Z.cjs.map} +1 -1
- package/dist/{chunk-EOLQ5YBP.js → chunk-RFQ2FGL4.js} +3 -3
- package/dist/{chunk-EOLQ5YBP.js.map → chunk-RFQ2FGL4.js.map} +1 -1
- package/dist/{chunk-2QDNQM63.cjs → chunk-SSYRPBL5.cjs} +3 -3
- package/dist/{chunk-2QDNQM63.cjs.map → chunk-SSYRPBL5.cjs.map} +1 -1
- package/dist/{chunk-NQWP5PWA.js → chunk-SXYXFCHN.js} +5 -5
- package/dist/{chunk-NQWP5PWA.js.map → chunk-SXYXFCHN.js.map} +1 -1
- package/dist/{chunk-4DKI37QQ.js → chunk-UWXCT3ON.js} +3 -3
- package/dist/{chunk-4DKI37QQ.js.map → chunk-UWXCT3ON.js.map} +1 -1
- package/dist/{chunk-DY2Z3DP7.js → chunk-VPWCARVO.js} +3 -3
- package/dist/{chunk-DY2Z3DP7.js.map → chunk-VPWCARVO.js.map} +1 -1
- package/dist/connect/docx.cjs +11 -11
- package/dist/connect/docx.js +7 -7
- package/dist/connect/index.cjs +368 -353
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +31 -17
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +25 -25
- package/dist/connect/viewer.js +8 -8
- package/dist/connection/files/ConnectedGridView.d.ts +2 -0
- package/dist/connection/files/index.d.ts +1 -0
- package/dist/index.cjs +395 -395
- package/dist/index.js +6 -6
- package/dist/studio/index.cjs +4 -4
- package/dist/studio/index.js +2 -2
- package/dist/workflow-canvas/index.cjs +23 -23
- package/dist/workflow-canvas/index.js +6 -6
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedStreamedWordArtifact-QAZ5VQZS.cjs.map +0 -1
- package/dist/chunk-D57MPMTZ.js.map +0 -1
- package/dist/chunk-SBTRXXJF.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agents/workflows/SchemaForm.tsx","../src/agents/workflows/AgentSelect.tsx","../src/agents/workflows/WorkflowConfigDialog.tsx","../src/agents/workflows/WorkflowLauncher.tsx","../src/agents/workflows/workspaceScope.ts","../src/agents/workflows/WorkflowDocumentsField.tsx","../src/agents/tasks/PersonPill.tsx","../src/agents/tasks/TaskTriggerChip.tsx","../src/agents/tasks/workflowRows.ts","../src/agents/tasks/workflowColumns.tsx","../src/agents/tasks/workflowTableLabels.ts","../src/agents/tasks/WorkflowsTable.tsx"],"names":["jsxs","cn","jsx","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Fragment","useState","useMemo","useRef","useEffect","Button","Switch","Play"],"mappings":"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","file":"chunk-7CHI36EP.js","sourcesContent":["import { useState, type ReactNode } from 'react'\nimport { Check } from 'lucide-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 { TONE_BORDER, TONE_DOT, TONE_SOLID_BORDER, TONE_SURFACE } from '../../components/tones'\nimport { FoldSection } from '../../home/FoldSection'\nimport { isWorkflowScope } from './workflow'\nimport type {\n WorkflowErrors,\n WorkflowField,\n WorkflowFieldError,\n WorkflowFieldOption,\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 /** Who a `person` field offers (the workspace's members); without them it takes an id. */\n people?: ReadonlyArray<{ value: string; label: string }>\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 people?: SchemaFormProps['people']\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 people,\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 // Short choices (no icon or description) are buttons, not cards.\n const compact = options.every((o) => !o.icon && !o.description)\n return (\n <div\n role=\"radiogroup\"\n aria-label={field.label}\n // Each tile is as wide as its label and wraps onto a new line when the row is full\n // (a narrow side panel); one wider than the whole row wraps its own text instead.\n className=\"flex flex-wrap gap-2\"\n data-testid={testId}\n >\n {options.map((option) => (\n <ChoiceTile\n key={option.value}\n option={option}\n selected={value === option.value}\n compact={compact}\n renderIcon={renderIcon}\n testId={prefixedTestId(testId, option.value, {\n testId: `workflow-field-${field.name}-${option.value}`,\n })}\n onSelect={() => onChange(option.value)}\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 case 'person':\n return people?.length ? (\n <select\n id={id}\n data-testid={testId}\n value={String(value ?? '')}\n aria-required={field.required || undefined}\n aria-invalid={error ? true : undefined}\n onChange={(e) => onChange(e.target.value)}\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-2 text-sm shadow-sm\"\n >\n <option value=\"\">{field.placeholder ?? ''}</option>\n {people.map((p) => (\n <option key={p.value} value={p.value}>\n {p.label}\n </option>\n ))}\n </select>\n ) : (\n <Input\n id={id}\n data-testid={testId}\n value={String(value ?? '')}\n placeholder={field.placeholder ?? 'usr-…'}\n aria-required={field.required || undefined}\n aria-invalid={error ? true : undefined}\n onChange={(e) => onChange(e.target.value)}\n />\n )\n }\n}\n\n/**\n * One choice of a tiled select. A toned option shows its tone chosen or not: a dot and a tinted\n * border at rest, the tone's surface once chosen. The label and a check mark carry the state too,\n * so it never rests on colour alone.\n */\nfunction ChoiceTile({\n option,\n selected,\n compact,\n renderIcon,\n testId,\n onSelect,\n}: {\n option: WorkflowFieldOption\n selected: boolean\n compact: boolean\n renderIcon: SchemaFormProps['renderIcon']\n testId: string\n onSelect: () => void\n}) {\n const tone = option.tone\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n data-testid={testId}\n data-tone={tone}\n onClick={onSelect}\n className={cn(\n // Sized to its label (flex-basis auto), growing to share the row, never wider than it.\n 'flex max-w-full min-w-[min(4rem,100%)] flex-auto flex-col items-center justify-center gap-1.5 rounded-lg border text-center transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n compact\n ? 'min-h-9 px-3 py-1.5 pointer-coarse:min-h-11'\n : 'min-h-24 p-3 pointer-coarse:min-h-28',\n tone\n ? selected\n ? cn(TONE_SURFACE[tone], TONE_SOLID_BORDER[tone])\n : cn(TONE_BORDER[tone], 'bg-card [&:hover]:bg-muted')\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\n className={cn(\n 'flex max-w-full items-center gap-1.5 text-sm font-medium',\n tone && selected ? undefined : 'text-foreground'\n )}\n >\n {selected ? (\n <Check className=\"size-3.5 shrink-0\" aria-hidden />\n ) : (\n tone && (\n <span aria-hidden className={cn('size-2 shrink-0 rounded-full', TONE_DOT[tone])} />\n )\n )}\n <span className=\"min-w-0 break-words\">{option.label}</span>\n </span>\n {option.description && (\n <span className=\"max-w-full text-xs break-words text-muted-foreground\">\n {option.description}\n </span>\n )}\n </button>\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 people,\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 people={people}\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","import { useId, type ReactNode } from 'react'\nimport {\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr, prefixedTestId } from '../../chat/test-id'\nimport { useControllableState } from '../../lib/useControllableState'\n\nexport interface AgentOption {\n id: string\n label: string\n /** Small line under the label in the list (e.g. what the agent is for). */\n description?: string\n /** Avatar or mark shown before the name. */\n avatar?: ReactNode\n}\n\nexport interface AgentSelectLabels {\n /** The field label. */\n label: string\n /** The entry that means \"no specific agent\": the user's own assistant. */\n myAssistant: string\n}\n\nexport const DEFAULT_AGENT_SELECT_LABELS: AgentSelectLabels = {\n label: 'Run as',\n myAssistant: 'My assistant',\n}\n\nexport interface AgentSelectProps {\n agents: AgentOption[]\n /** Controlled agent id; `''` = my assistant. Omit to let the select hold its own state. */\n value?: string\n defaultValue?: string\n onValueChange?: (agentId: string) => void\n /** Hide the visible label (still the accessible name). */\n hideLabel?: boolean\n disabled?: boolean\n className?: string\n labels?: Partial<AgentSelectLabels>\n testId?: string\n /** Prefix of option ids (`<prefix>-<agent id>`); default `agent-select-option`. */\n optionTestId?: string\n}\n\nconst ME = '__me__'\n\n/** Pick which agent runs something: the user's own assistant (default) or one of their agents. */\nexport function AgentSelect({\n agents,\n value,\n defaultValue = '',\n onValueChange,\n hideLabel,\n disabled,\n className,\n labels,\n testId,\n optionTestId,\n}: AgentSelectProps) {\n const l = { ...DEFAULT_AGENT_SELECT_LABELS, ...labels }\n const triggerId = useId()\n const [current, setCurrent] = useControllableState(value, defaultValue, onValueChange)\n return (\n <div className={cn('flex flex-col gap-1.5', className)} data-slot=\"agent-select\">\n <Label htmlFor={triggerId} className={hideLabel ? 'sr-only' : undefined}>\n {l.label}\n </Label>\n <Select\n value={current === '' ? ME : current}\n onValueChange={(v) => setCurrent(v === ME ? '' : v)}\n disabled={disabled}\n >\n <SelectTrigger\n id={triggerId}\n data-testid={testIdOr(testId, { testId: 'agent-select' })}\n className=\"pointer-coarse:min-h-11\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem\n value={ME}\n data-testid={prefixedTestId(optionTestId, 'me', {\n testId: 'agent-select-option-me',\n })}\n >\n {l.myAssistant}\n </SelectItem>\n {agents.map((agent) => (\n <SelectItem\n key={agent.id}\n value={agent.id}\n data-testid={prefixedTestId(optionTestId, agent.id, {\n testId: `agent-select-option-${agent.id}`,\n })}\n >\n <span className=\"flex items-center gap-2\">\n {agent.avatar}\n <span>{agent.label}</span>\n {agent.description && (\n <span className=\"text-xs text-muted-foreground\">{agent.description}</span>\n )}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n}\n","import { useEffect, useMemo, useRef, useState, type FormEvent, type ReactNode } from 'react'\nimport { Loader2, Play } from 'lucide-react'\nimport { Button, Dialog, DialogContent } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\nimport { AddFilesFirst } from '../../home/AddFilesFirst'\nimport { QuickActionDialogHeader } from '../../home/QuickActionDialogHeader'\nimport { ScopePicker, type ScopeFolder, type ScopeLabel } from '../../home/ScopePicker'\nimport { useControllableState } from '../../lib/useControllableState'\nimport { AgentSelect, type AgentOption, type AgentSelectLabels } from './AgentSelect'\nimport { SchemaForm, type SchemaFormLabels } from './SchemaForm'\nimport type {\n OnWorkflowLaunch,\n WorkflowDefinition,\n WorkflowField,\n WorkflowInputs,\n WorkflowInputValue,\n WorkflowScope,\n} from './types'\nimport { buildLaunch, defaultInputs, validateInputs } from './workflow'\n\n/** The workspace's files, as the scope picker needs them. Matching stays with the host. */\nexport interface WorkflowScopeSource {\n folders: ScopeFolder[]\n unfiledCount: number\n labels: ScopeLabel[]\n totalCount: number\n /** How many files a scope selects. */\n countMatching: (scope: WorkflowScope) => number\n /**\n * The ids of the files a scope selects. A run is bound to explicit file ids, so a folder/label pick is\n * resolved here, on the client, before anything is sent.\n */\n resolveDocuments?: (scope: WorkflowScope) => string[]\n}\n\nexport interface WorkflowConfigDialogLabels {\n /** Primary button when the workflow gives no label of its own. */\n start: string\n starting: string\n /** Shown instead of the form when `requiresFiles` and the workspace has none. */\n addFilesReason: string\n agentLabel: string\n}\n\nexport const DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS: WorkflowConfigDialogLabels = {\n start: 'Start',\n starting: 'Starting…',\n addFilesReason: 'This reads your files, and there is nothing to read yet.',\n agentLabel: 'Run as',\n}\n\nexport interface WorkflowConfigDialogProps {\n workflow: WorkflowDefinition\n open: boolean\n onOpenChange: (open: boolean) => void\n onLaunch: OnWorkflowLaunch\n /** Values the form opens with, over each field's default (e.g. text typed after a slash). */\n initialInputs?: Partial<WorkflowInputs>\n /** Controlled inputs; omit to let the dialog hold them. */\n inputs?: WorkflowInputs\n onInputsChange?: (inputs: WorkflowInputs) => void\n /** Files behind `scope` fields. Without it a scope field renders through `renderScope` or not at all. */\n scopeSource?: WorkflowScopeSource\n renderScope?: (\n field: WorkflowField,\n value: WorkflowScope,\n onChange: (s: WorkflowScope) => void\n ) => ReactNode\n /** Renders a `documents` field: the host owns the file list behind the pick. */\n renderDocuments?: (\n field: WorkflowField,\n value: WorkflowScope,\n onChange: (s: WorkflowScope) => void\n ) => ReactNode\n renderIcon?: (key: string) => ReactNode\n /** The host's own \"Add\" control, shown when the workflow needs files and there are none. */\n addFilesAction?: ReactNode\n /** Agents the user can hand the work to. Empty/omitted hides the \"Run as\" row. */\n agents?: AgentOption[]\n agentId?: string\n onAgentChange?: (agentId: string) => void\n isLaunching?: boolean\n /** Primary button text from the current inputs and matched file count. */\n submitLabel?: (ctx: {\n workflow: WorkflowDefinition\n inputs: WorkflowInputs\n matchedCount: number | null\n }) => string | undefined\n /** Per-field placeholder derived from the inputs (e.g. a name taken from a description). */\n fieldPlaceholder?: (\n field: WorkflowField,\n inputs: WorkflowInputs,\n workflow: WorkflowDefinition\n ) => string | undefined\n /** Anything the host wants to say about the current inputs, above the footer. */\n renderNotice?: (ctx: { workflow: WorkflowDefinition; inputs: WorkflowInputs }) => ReactNode\n labels?: Partial<WorkflowConfigDialogLabels>\n formLabels?: Partial<SchemaFormLabels>\n agentLabels?: Partial<AgentSelectLabels>\n /** Dialog id; fields use `<testId>-field-<name>`. Default `workflow-dialog`. */\n testId?: string\n startTestId?: string\n className?: string\n}\n\n/**\n * One dialog for every workflow: the form comes from the workflow's declared inputs, scope fields\n * use the shared folder/label picker, and the footer says who runs it. Launching hands\n * `{workflow, inputs, scope, agentId}` to `onLaunch`; the host does the rest.\n */\nexport function WorkflowConfigDialog({\n workflow,\n open,\n onOpenChange,\n onLaunch,\n initialInputs,\n inputs: inputsProp,\n onInputsChange,\n scopeSource,\n renderScope,\n renderDocuments,\n renderIcon,\n addFilesAction,\n agents,\n agentId: agentIdProp,\n onAgentChange,\n isLaunching,\n submitLabel,\n fieldPlaceholder,\n renderNotice,\n labels,\n formLabels,\n agentLabels,\n testId,\n startTestId,\n className,\n}: WorkflowConfigDialogProps) {\n const l = { ...DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS, ...labels }\n // Keyed by content: a host passing a fresh `initialInputs` object each render must not reset the form.\n const initialKey = JSON.stringify(initialInputs ?? {})\n const seedKey = JSON.stringify({ ...defaultInputs(workflow), ...JSON.parse(initialKey) })\n const seed = useMemo(() => JSON.parse(seedKey) as WorkflowInputs, [seedKey])\n const [inputs, setInputs] = useControllableState<WorkflowInputs>(inputsProp, seed, onInputsChange)\n const [agentId, setAgentId] = useControllableState<string>(\n agentIdProp,\n workflow.defaultAgentId ?? '',\n onAgentChange\n )\n\n // A fresh open starts from the seed again (uncontrolled only).\n useEffect(() => {\n if (open && inputsProp === undefined) setInputs(seed)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, seed])\n\n const setField = (name: string, value: WorkflowInputValue) =>\n setInputs({ ...inputs, [name]: value })\n\n const errors = validateInputs(workflow, inputs)\n const valid = Object.keys(errors).length === 0\n // Required-ness is conveyed by the disabled button; range problems are shown as they happen.\n const visibleErrors = Object.fromEntries(\n Object.entries(errors).filter(([, e]) => e !== 'required')\n )\n\n const scopeField = workflow.inputs.find((f) => f.type === 'scope')\n const rawScope = scopeField ? inputs[scopeField.name] : undefined\n const scopeValue: WorkflowScope =\n rawScope && typeof rawScope === 'object' ? rawScope : { folders: [], labels: [] }\n const matchedCount = scopeSource && scopeField ? scopeSource.countMatching(scopeValue) : null\n const noFiles = Boolean(workflow.requiresFiles && scopeSource && scopeSource.totalCount === 0)\n const blockedByScope =\n matchedCount !== null && matchedCount === 0 && Boolean(workflow.requiresFiles)\n\n const showAgent =\n workflow.run.kind === 'prompt' &&\n workflow.options?.agent !== false &&\n agents !== undefined &&\n agents.length > 0\n\n const launch = (values: WorkflowInputs) => {\n // A failed launch leaves the dialog open so nothing typed is lost; the host reports why.\n Promise.resolve(onLaunch(buildLaunch(workflow, values, agentId))).catch(() => {})\n }\n\n const submit = () => {\n if (!valid || noFiles || blockedByScope || isLaunching) return\n launch(inputs)\n }\n\n const fields = useMemo(\n () =>\n workflow.inputs.map((f) => {\n const placeholder = fieldPlaceholder?.(f, inputs, workflow)\n return placeholder === undefined ? f : { ...f, placeholder }\n }),\n [workflow, fieldPlaceholder, inputs]\n )\n\n const id = testIdOr(testId, { testId: 'workflow-dialog' })\n const formRef = useRef<HTMLFormElement>(null)\n // A form that opens on a text field (the prompt) puts the cursor there, so typing starts at\n // once; a form that opens on a file pick keeps the dialog's own first focus.\n const firstField = workflow.inputs.find((f) => !f.advanced)\n const focusPromptFirst = firstField?.type === 'text' || firstField?.type === 'longtext'\n const defaultScopeRender = scopeSource\n ? (_field: WorkflowField, value: WorkflowScope, onChange: (s: WorkflowScope) => void) => (\n <ScopePicker\n folders={scopeSource.folders}\n unfiledCount={scopeSource.unfiledCount}\n labels={scopeSource.labels}\n totalCount={scopeSource.totalCount}\n matchedCount={scopeSource.countMatching(value)}\n scope={value}\n onScopeChange={onChange}\n />\n )\n : undefined\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className={`max-h-[calc(100dvh-2rem)] overflow-y-auto sm:max-w-xl ${className ?? ''}`}\n data-testid={id}\n data-workflow={workflow.id}\n onOpenAutoFocus={(event) => {\n if (!focusPromptFirst || !firstField) return\n const control = formRef.current?.querySelector<HTMLElement>(\n `[data-testid=\"${id}-field-${firstField.name}\"]`\n )\n if (!control) return\n event.preventDefault()\n control.focus()\n if (control instanceof HTMLInputElement || control instanceof HTMLTextAreaElement) {\n const end = control.value.length\n control.setSelectionRange(end, end)\n }\n }}\n >\n <QuickActionDialogHeader\n icon={workflow.icon && renderIcon ? renderIcon(workflow.icon) : null}\n title={workflow.title}\n description={workflow.details ?? workflow.description}\n descriptionTestId={`${id}-description`}\n />\n <form\n ref={formRef}\n className=\"mt-2 flex flex-col gap-4\"\n onSubmit={(event: FormEvent) => {\n event.preventDefault()\n submit()\n }}\n >\n {noFiles ? (\n <AddFilesFirst\n reason={l.addFilesReason}\n action={addFilesAction}\n testId={`${id}-empty-state`}\n />\n ) : (\n <>\n <SchemaForm\n fields={fields}\n values={inputs}\n onChange={setField}\n errors={visibleErrors}\n renderScope={renderScope ?? defaultScopeRender}\n renderDocuments={renderDocuments}\n renderIcon={renderIcon}\n labels={formLabels}\n onEnterSubmit={submit}\n testIdPrefix={`${id}-field`}\n />\n {renderNotice?.({ workflow, inputs })}\n <div\n className=\"flex flex-col gap-3 border-t border-border pt-3 sm:flex-row sm:items-end sm:justify-between\"\n data-slot=\"workflow-footer\"\n >\n {showAgent ? (\n <AgentSelect\n agents={agents ?? []}\n value={agentId}\n onValueChange={setAgentId}\n labels={{ label: l.agentLabel, ...agentLabels }}\n testId={`${id}-agent`}\n className=\"sm:w-56\"\n />\n ) : (\n <span />\n )}\n <Button\n type=\"submit\"\n className=\"gap-1.5 px-5 pointer-coarse:min-h-11\"\n disabled={!valid || blockedByScope || isLaunching}\n data-testid={testIdOr(startTestId, { testId: 'workflow-start-button' })}\n >\n {isLaunching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Play className=\"size-4\" />\n )}\n {isLaunching\n ? l.starting\n : (submitLabel?.({ workflow, inputs, matchedCount }) ??\n workflow.startLabel ??\n l.start)}\n </Button>\n </div>\n </>\n )}\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { StartTiles, type StartTile } from '../../home/StartTiles'\nimport { useControllableState } from '../../lib/useControllableState'\nimport { WorkflowConfigDialog, type WorkflowConfigDialogProps } from './WorkflowConfigDialog'\nimport type { OnWorkflowLaunch, WorkflowDefinition, WorkflowInputs } from './types'\nimport { buildLaunch, defaultInputs, validateInputs } from './workflow'\n\nexport interface WorkflowLauncherProps extends Omit<\n WorkflowConfigDialogProps,\n 'workflow' | 'open' | 'onOpenChange' | 'onLaunch' | 'isLaunching' | 'initialInputs'\n> {\n workflows: WorkflowDefinition[]\n /** Which of `workflows` get a tile (a filtered or capped view); default all. */\n tileWorkflows?: WorkflowDefinition[]\n /** The host performs the launch (open a chat, scope files, send, land). */\n onLaunch: OnWorkflowLaunch\n /** Render the tile band. Off when something else (the slash menu) opens the dialog. */\n showTiles?: boolean\n caption?: string\n captionTestId?: string\n /** Tile ids: `<prefix>-<workflow id>` unless `tileTestId` returns one. */\n tileTestId?: (workflow: WorkflowDefinition) => string | undefined\n /** A reason the workflow cannot run now (greys its tile out). */\n disabledReason?: (workflow: WorkflowDefinition) => string | undefined\n /** Controlled open workflow (by id); `null` = none. Omit for uncontrolled. */\n activeId?: string | null\n onActiveIdChange?: (id: string | null) => void\n /** Inputs to seed the dialog with when `activeId` opens (slash-typed text etc.). */\n initialInputsFor?: (workflow: WorkflowDefinition) => Partial<WorkflowInputs> | undefined\n /** Extra content inside the tile band's section, after the tiles. */\n /** Plain tiles appended to the band (tier A actions that are not workflows). */\n extraTiles?: StartTile[]\n /** Test id of the tile band. */\n testId?: string\n className?: string\n children?: ReactNode\n}\n\n/**\n * The one place a workflow is launched from: a band of tiles plus the config dialog. Choosing a\n * workflow opens the dialog, which asks what it declares; only an operation with no inputs\n * launches on the click.\n * Also usable headless (`showTiles={false}`) when another surface picks the workflow.\n */\nexport function WorkflowLauncher({\n workflows,\n tileWorkflows,\n onLaunch,\n showTiles = true,\n caption,\n captionTestId,\n tileTestId,\n disabledReason,\n activeId: activeIdProp,\n onActiveIdChange,\n initialInputsFor,\n testId,\n extraTiles = [],\n className,\n children,\n renderIcon,\n ...dialog\n}: WorkflowLauncherProps) {\n const [activeId, setActiveId] = useControllableState<string | null>(\n activeIdProp,\n null,\n onActiveIdChange\n )\n const [isLaunching, setIsLaunching] = useState(false)\n const active = workflows.find((w) => w.id === activeId) ?? null\n\n const run: OnWorkflowLaunch = async (launch) => {\n setIsLaunching(true)\n try {\n await onLaunch(launch)\n setActiveId(null)\n } finally {\n setIsLaunching(false)\n }\n }\n\n const select = (workflow: WorkflowDefinition) => {\n // Only an operation with nothing to ask (tier B) starts on the click. A prompt workflow or a\n // skill is run WITH a prompt, so it always opens the form, however few inputs it declares.\n if (workflow.run.kind === 'operation' && workflow.inputs.length === 0) {\n const inputs = defaultInputs(workflow)\n if (Object.keys(validateInputs(workflow, inputs)).length === 0) {\n Promise.resolve(onLaunch(buildLaunch(workflow, inputs, undefined))).catch(() => {})\n return\n }\n }\n setActiveId(workflow.id)\n }\n\n const tiles: StartTile[] = (tileWorkflows ?? workflows).map((workflow) => {\n const reason = disabledReason?.(workflow)\n return {\n id: workflow.id,\n iconNode: workflow.icon && renderIcon ? renderIcon(workflow.icon) : undefined,\n title: workflow.title,\n description: workflow.description,\n onSelect: () => select(workflow),\n disabled: reason !== undefined,\n disabledReason: reason,\n testId: tileTestId?.(workflow) ?? `workflow-tile-${workflow.id}`,\n }\n })\n\n return (\n <div className={className} data-slot=\"workflow-launcher\">\n {showTiles && (\n <StartTiles\n items={[...tiles, ...extraTiles]}\n caption={caption}\n captionTestId={captionTestId}\n testId={testId}\n />\n )}\n {children}\n {active && (\n <WorkflowConfigDialog\n {...dialog}\n renderIcon={renderIcon}\n workflow={active}\n open\n onOpenChange={(open) => !open && setActiveId(null)}\n onLaunch={run}\n isLaunching={isLaunching}\n initialInputs={initialInputsFor?.(active)}\n />\n )}\n </div>\n )\n}\n","import { getEntityColor } from '@arbidocs/react/ui'\nimport type { WorkflowScope } from './types'\nimport type { WorkflowScopeSource } from './WorkflowConfigDialog'\n\nexport interface WorkflowScopeDocument {\n external_id: string\n folder?: string | null\n doctags?: Array<{ tag_ext_id: string }>\n}\nexport interface WorkflowScopeLabel {\n external_id: string\n name: string\n color?: string\n}\n/** A workspace tag, as far as the scope picker reads it. */\nexport interface WorkflowScopeTag extends WorkflowScopeLabel {\n kind?: string | null\n doctag_count?: number | null\n facttag_count?: number | null\n}\n\n/**\n * The labels a scope picker offers: the workspace's document vocabulary, as the Files page's quick\n * filter has it. Saved searches are not labels; a tag used only on facts is not a file label; one\n * used nowhere yet is offered.\n */\nexport function documentScopeLabels<T extends WorkflowScopeTag>(tags: T[]): T[] {\n return tags.filter((tag) => {\n if (tag.kind === 'search') return false\n const onDocs = (tag.doctag_count ?? 0) > 0\n const onFacts = (tag.facttag_count ?? 0) > 0\n return onDocs || !onFacts\n })\n}\n\nconst canonical = (path?: string | null) =>\n (path ?? '')\n .split('/')\n .map((part) => part.trim())\n .filter(Boolean)\n .join('/')\n\n/** Match the same folder/label OR semantics as the document library; explicit file picks win. */\nexport function matchWorkflowScope<T extends WorkflowScopeDocument>(\n docs: T[],\n scope: WorkflowScope\n): T[] {\n if (scope.documents?.length) {\n const ids = new Set(scope.documents)\n return docs.filter((doc) => ids.has(doc.external_id))\n }\n if (!scope.folders.length && !scope.labels.length) return docs\n const folders = scope.folders.map(canonical)\n const labels = new Set(scope.labels)\n return docs.filter((doc) => {\n const folder = canonical(doc.folder)\n return (\n folders.some((path) =>\n path === '' ? folder === '' : folder === path || folder.startsWith(`${path}/`)\n ) || doc.doctags?.some((tag) => labels.has(tag.tag_ext_id))\n )\n })\n}\n\n/** Turn real workspace documents and labels into the shared workflow scope picker model. */\nexport function buildWorkflowScopeSource(\n docs: WorkflowScopeDocument[],\n labels: WorkflowScopeLabel[] = []\n): WorkflowScopeSource {\n const counts = new Map<string, number>()\n for (const doc of docs) {\n const parts = canonical(doc.folder).split('/').filter(Boolean)\n for (let i = 1; i <= parts.length; i++) {\n const path = parts.slice(0, i).join('/')\n counts.set(path, (counts.get(path) ?? 0) + 1)\n }\n }\n return {\n folders: [...counts]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([path, count]) => ({\n path,\n count,\n label: path.split('/').at(-1)!,\n depth: path.split('/').length - 1,\n })),\n unfiledCount: docs.filter((doc) => !canonical(doc.folder)).length,\n labels: labels.map((label) => ({\n id: label.external_id,\n name: label.name,\n color: label.color ?? getEntityColor(label.external_id, 'medium'),\n count: docs.filter((doc) => doc.doctags?.some((tag) => tag.tag_ext_id === label.external_id))\n .length,\n })),\n totalCount: docs.length,\n countMatching: (scope) => matchWorkflowScope(docs, scope).length,\n resolveDocuments: (scope) => matchWorkflowScope(docs, scope).map((doc) => doc.external_id),\n }\n}\n","import { useEffect, useMemo, useRef, useState, type DragEvent } from 'react'\nimport { FolderPlus, ImageIcon, X } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { DocumentPicker, type PickerDocument } from '../../settings/DocumentPicker'\nimport type { WorkflowField, WorkflowScope } from './types'\n\n/** A workspace file a `documents` field can pick. */\nexport interface WorkflowFieldDocument extends PickerDocument {\n /** Its processing status (`completed`, `processing`…); absent = ready. */\n status?: string | null\n /** An image (for an image-only field, and its thumbnail). */\n isImage?: boolean\n}\n\nexport interface WorkflowDocumentsFieldLabels {\n pickOne: string\n pickMany: string\n /** The heading of the one list of files (a run has no conversation). */\n allDocuments: string\n addFiles: string\n adding: string\n empty: string\n remove: (name: string) => string\n /** A chosen file that is not ready yet: where it is, and that it can still be picked. */\n pending: (name: string, status: string) => string\n status: Record<string, string>\n}\n\nexport const DEFAULT_WORKFLOW_DOCUMENTS_FIELD_LABELS: WorkflowDocumentsFieldLabels = {\n pickOne: 'Pick a file',\n pickMany: 'Pick files',\n allDocuments: 'All documents',\n addFiles: 'Add files',\n adding: 'Adding…',\n empty: 'No files in this workspace yet. Drop one here, or add it.',\n remove: (name) => `Remove ${name}`,\n pending: (name, status) => `${name}: ${status}. You can still pick it.`,\n status: {\n queued: 'Queued',\n uploading: 'Uploading',\n encrypting: 'Encrypting',\n processing: 'Processing',\n parsing: 'Processing',\n indexing: 'Indexing',\n analysing: 'Analysing',\n },\n}\n\nexport interface WorkflowDocumentsFieldProps {\n field: WorkflowField\n value: WorkflowScope\n onChange: (value: WorkflowScope) => void\n /** The workspace's files. */\n documents: WorkflowFieldDocument[]\n /** The list has arrived (until then an empty list is not \"no files yet\"). Default true. */\n loaded?: boolean\n /** A chosen image's thumbnail (`data:` or URL), for the gallery of a several-files field. */\n thumbnailOf?: (id: string) => string | null | undefined\n /**\n * Add files (dropped ones, or none: the host asks). Absent: no Add files and no drop. A file\n * that appears in `documents` after this is chosen at once, even while it processes.\n */\n onAddFiles?: (files?: File[]) => void\n /** Files are being added (the button waits). */\n adding?: boolean\n labels?: Partial<WorkflowDocumentsFieldLabels>\n}\n\nconst isReady = (status?: string | null) =>\n !status || ['completed', 'done', 'ready', 'success'].includes(status.toLowerCase())\n\nconst byTitle = (a: PickerDocument, b: PickerDocument) =>\n a.title.toLowerCase().localeCompare(b.title.toLowerCase())\n\n/**\n * A workflow `documents` field: an explicit pick of workspace files. One file is a combobox;\n * several (`max` > 1) show the chosen ones as removable tiles, with a thumbnail for images, so you\n * SEE what you are steering a run with. With `onAddFiles`, files can be added (or dropped) right\n * here, and an empty workspace says so instead of offering an empty list.\n */\nexport function WorkflowDocumentsField({\n field,\n value,\n onChange,\n documents,\n loaded = true,\n thumbnailOf,\n onAddFiles,\n adding,\n labels,\n}: WorkflowDocumentsFieldProps) {\n const l = { ...DEFAULT_WORKFLOW_DOCUMENTS_FIELD_LABELS, ...labels }\n const ids = value.documents ?? []\n const max = field.max ?? 1\n const multiple = max > 1\n const [isOver, setIsOver] = useState(false)\n const docOf = (id: string) => documents.find((d) => d.id === id)\n const nameOf = (id: string) => docOf(id)?.title || id\n const set = (next: string[]) => onChange({ ...value, documents: next })\n const toggle = (id: string) =>\n set(ids.includes(id) ? ids.filter((d) => d !== id) : [...ids, id].slice(-max))\n const offered = useMemo(\n () => (field.accept === 'image' ? documents.filter((d) => d.isImage) : documents),\n [documents, field.accept]\n )\n\n // A file added from here is chosen as soon as the workspace lists it, even while it processes.\n const awaitingAdd = useRef(false)\n const known = useRef<Set<string> | null>(null)\n const latest = useRef({ ids, set })\n latest.current = { ids, set }\n useEffect(() => {\n if (!loaded) return\n const current = new Set(documents.map((d) => d.id))\n const before = known.current\n known.current = current\n if (!before || !awaitingAdd.current) return\n const fresh = [...current].filter((id) => !before.has(id))\n if (fresh.length === 0) return\n awaitingAdd.current = false\n latest.current.set([...latest.current.ids, ...fresh].slice(-max))\n }, [documents, loaded, max])\n\n const addFiles = (files?: File[]) => {\n if (!onAddFiles) return\n awaitingAdd.current = true\n onAddFiles(files?.length ? files : undefined)\n }\n const dropProps = onAddFiles\n ? {\n onDragOver: (e: DragEvent) => {\n e.preventDefault()\n setIsOver(true)\n },\n onDragLeave: () => setIsOver(false),\n onDrop: (e: DragEvent) => {\n e.preventDefault()\n setIsOver(false)\n const files = Array.from(e.dataTransfer?.files ?? [])\n if (files.length) addFiles(files)\n },\n }\n : {}\n const dropClass = isOver ? 'ring-2 ring-primary' : ''\n const addButton = (className?: string, variant: 'outline' | 'default' = 'outline') =>\n onAddFiles && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={variant}\n className={className}\n disabled={adding}\n onClick={() => addFiles()}\n data-testid=\"workflow-add-files\"\n >\n {adding ? l.adding : l.addFiles}\n </Button>\n )\n\n // Nothing in the workspace yet: say so, and offer the upload (or a drop) right here.\n if (loaded && documents.length === 0) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center gap-2 rounded-lg border border-dashed border-border bg-muted/40 px-4 py-6 text-center',\n dropClass\n )}\n data-testid=\"workflow-documents-empty\"\n {...dropProps}\n >\n <FolderPlus className=\"size-5 text-muted-foreground\" aria-hidden />\n <p className=\"text-sm text-muted-foreground\">{l.empty}</p>\n {addButton(undefined, 'default')}\n </div>\n )\n }\n\n const pending = ids.flatMap((id) => {\n const status = docOf(id)?.status\n return isReady(status)\n ? []\n : [{ id, label: l.status[String(status).toLowerCase()] ?? String(status) }]\n })\n const selected = multiple ? undefined : docOf(ids[0] ?? '')\n\n return (\n <div\n className={cn('flex flex-col gap-3 rounded-lg', dropClass)}\n data-testid={`workflow-documents-${field.name}`}\n {...dropProps}\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0 flex-1\">\n <DocumentPicker\n // A run has no conversation: one list of every file.\n groups={[{ id: 'all', heading: l.allDocuments, docs: [...offered].sort(byTitle) }]}\n value={multiple ? '' : (ids[0] ?? '')}\n onValueChange={(id) => (multiple ? toggle(id) : set([id]))}\n selected={selected}\n selectedIds={multiple ? ids : undefined}\n labels={{ placeholder: field.placeholder ?? (multiple ? l.pickMany : l.pickOne) }}\n />\n </div>\n {addButton('shrink-0 pointer-coarse:h-11')}\n </div>\n {pending.map((p) => (\n <p\n key={p.id}\n className=\"text-xs text-muted-foreground\"\n data-testid={`workflow-document-status-${p.id}`}\n >\n {l.pending(nameOf(p.id), p.label)}\n </p>\n ))}\n {multiple && ids.length > 0 && (\n <div\n className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\"\n data-testid=\"workflow-documents-gallery\"\n >\n {ids.map((id) => {\n const thumbnail = thumbnailOf?.(id)\n return (\n <figure\n key={id}\n className=\"relative overflow-hidden rounded-lg border border-border bg-muted/40\"\n data-testid={`workflow-document-${id}`}\n >\n {thumbnail ? (\n <img\n src={thumbnail}\n alt={nameOf(id)}\n className=\"aspect-square w-full object-cover\"\n />\n ) : (\n <div className=\"flex aspect-square w-full items-center justify-center text-muted-foreground/50\">\n <ImageIcon className=\"size-8\" />\n </div>\n )}\n <figcaption className=\"truncate bg-background/90 px-2 py-1 text-xs text-muted-foreground\">\n {nameOf(id)}\n </figcaption>\n <button\n type=\"button\"\n onClick={() => toggle(id)}\n aria-label={l.remove(nameOf(id))}\n className=\"absolute right-1 top-1 flex size-6 items-center justify-center rounded-full bg-background/80 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n data-testid={`workflow-document-remove-${id}`}\n >\n <X className=\"size-3.5\" />\n </button>\n </figure>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import { UserEntity, getEntityColorStyles } from '@arbidocs/react/ui'\nimport { initials } from '../../lib/format'\n\n/** A person (or agent) as the table shows them. */\nexport interface TaskPerson {\n /** The user's external id; absent when the person is not known (the pill then reads as their label). */\n id?: string | null\n label: string\n /** The viewer: shown as \"You\" by the host's pill, and as the label here. */\n isMe?: boolean\n isAgent?: boolean\n}\n\nexport interface PersonPillProps {\n person: TaskPerson\n size?: 'xs' | 'sm' | 'md' | 'lg'\n testId?: string\n}\n\n/**\n * A person as the app's own user pill: the same avatar, initials and tint as everywhere else. This is\n * the default; a host that knows more (presence, a direct-message click, the rich tooltip) hands the\n * table its own `renderPerson` instead.\n */\nexport function PersonPill({ person, size = 'sm', testId }: PersonPillProps) {\n return (\n <span data-testid={testId} className=\"inline-flex min-w-0\">\n <UserEntity\n variant=\"pill\"\n size={size}\n interactive={false}\n showTooltip={false}\n initials={initials(person.label)}\n displayName={person.label}\n avatarStyle={person.id ? getEntityColorStyles(person.id) : undefined}\n isAgent={person.isAgent}\n isMe={person.isMe}\n />\n </span>\n )\n}\n","import { Bell, Clock, Link2, MousePointerClick } from 'lucide-react'\nimport { testIdOr } from '../../chat/test-id'\nimport type { WorkflowTriggerType } from './taskLabels'\n\nexport interface TaskTriggerChipLabels {\n /** \"After “X” is done\" — the workflow waits on a task. */\n after: (taskName: string) => string\n /** The workflow waits on a task that is not visible to the viewer. */\n afterUnknown: string\n /** No trigger: it runs when someone presses Run. */\n onDemand: string\n}\n\nexport const DEFAULT_TASK_TRIGGER_CHIP_LABELS: TaskTriggerChipLabels = {\n after: (name) => `After “${name}” is done`,\n afterUnknown: 'After another task is done',\n onDemand: 'Manual',\n}\n\nexport interface TaskTriggerChipProps {\n /** Workflow id: keys the test id (`task-trigger-{id}`). */\n id: string\n triggerType: WorkflowTriggerType\n /** Host-formatted summary for time and event triggers (\"Every weekday at 9:00\", \"On document uploaded\"). */\n summary: string\n /** Set when this workflow waits on a task; the name it shows (or undefined if not visible). */\n afterTaskId?: string | null\n afterTaskName?: string\n testId?: string\n labels?: Partial<TaskTriggerChipLabels>\n}\n\nfunction TriggerIcon({ type, chained }: { type: WorkflowTriggerType; chained: boolean }) {\n const cls = 'size-3.5 shrink-0 text-muted-foreground'\n if (chained) return <Link2 className={cls} aria-hidden />\n switch (type) {\n case 'on_demand':\n return <MousePointerClick className={cls} aria-hidden />\n case 'recurring':\n return <Clock className={cls} aria-hidden />\n case 'event':\n return <Bell className={cls} aria-hidden />\n default:\n return <Clock className={cls} aria-hidden />\n }\n}\n\n/** What starts a workflow, in one line: a time, a repeat, an event, or a task finishing. */\nexport function TaskTriggerChip({\n id,\n triggerType,\n summary,\n afterTaskId,\n afterTaskName,\n testId,\n labels,\n}: TaskTriggerChipProps) {\n const l = { ...DEFAULT_TASK_TRIGGER_CHIP_LABELS, ...labels }\n const chained = Boolean(afterTaskId)\n const text = chained\n ? afterTaskName\n ? l.after(afterTaskName)\n : l.afterUnknown\n : triggerType === 'on_demand'\n ? l.onDemand\n : summary\n return (\n <span\n className=\"inline-flex min-w-0 max-w-full items-center gap-1.5 text-sm font-normal text-foreground\"\n data-testid={testIdOr(testId, { testId: `task-trigger-${id}` })}\n data-trigger={chained ? 'task' : triggerType}\n >\n <TriggerIcon type={triggerType} chained={chained} />\n <span className=\"truncate\">{text}</span>\n </span>\n )\n}\n","import type { WorkflowTriggerType } from './taskLabels'\n\n/**\n * A row of the Workflows table: a saved workflow, or a skill (a virtual row: skills are global, not in\n * the workflows table, and run on demand). Callers' richer types (`WorkflowResponse`) are accepted as-is.\n */\nexport interface WorkflowListRow {\n external_id: string\n name: string\n /** `skill` for a skill row; anything else is a saved workflow. */\n kind?: 'workflow' | 'skill' | null\n description?: string | null\n /** Active: the trigger can start it. A spent one-shot pauses itself. Skills ignore it. */\n active: boolean\n /** Shared with the workspace's members (false = private to its owner). */\n shared?: boolean | null\n rrule?: string | null\n run_at?: string | null\n event_kind?: string | null\n after_conversation_ext_id?: string | null\n /** No trigger of its own: it only runs when someone presses Run. */\n on_demand?: boolean | null\n action?: { type: string } | null\n prompt?: string | null\n skill_ref?: string | null\n /** A stepped workflow's plan: its named steps (agent, person, action, …). */\n plan?: { goal?: string | null; steps?: readonly unknown[] | null } | null\n agent_ext_id?: string | null\n last_fired_at?: string | null\n next_fire_at?: string | null\n last_run_status?: string | null\n last_error?: string | null\n /** False for a teammate's shared workflow: they can see it, but not change who sees it or delete it. */\n is_owner?: boolean | null\n owner_ext_id?: string | null\n /** The user who created it (for the creator-or-workspace-owner rule). */\n created_by_ext_id?: string | null\n}\n\nexport type WorkflowStatusKey = 'active' | 'paused' | 'on_demand'\n\nexport const isSkillRow = (row: WorkflowListRow): boolean => row.kind === 'skill'\n\n/** How many named steps a stepped workflow has (0: a single prompt, skill or reminder). */\nexport const workflowStepCount = (row: WorkflowListRow): number => row.plan?.steps?.length ?? 0\n\n/** Does it start by itself (a time, a repeat, an event, or another task finishing)? */\nexport const hasTrigger = (row: WorkflowListRow): boolean =>\n !row.on_demand &&\n Boolean(row.rrule || row.run_at || row.event_kind || row.after_conversation_ext_id)\n\n/**\n * What a row is doing: a skill, or a workflow with no trigger of its own, only runs when someone presses\n * Run (`on_demand`, no on/off switch); one with a trigger is `active` or `paused`.\n */\nexport function workflowStatus(row: WorkflowListRow): WorkflowStatusKey {\n if (isSkillRow(row) || !hasTrigger(row)) return 'on_demand'\n return row.active ? 'active' : 'paused'\n}\n\n/** What starts a workflow: another task being done, an event, a repeat, a single moment, or nothing. */\nexport function workflowTriggerType(workflow: WorkflowListRow): WorkflowTriggerType {\n if (workflow.on_demand) return 'on_demand'\n if (workflow.after_conversation_ext_id) return 'after'\n if (workflow.event_kind) return 'event'\n if (workflow.rrule) return 'recurring'\n if (workflow.run_at) return 'one_time'\n return 'on_demand'\n}\n\n/** Execution results are independent of an automation's Active/Paused state. */\nexport function workflowRunStatusLabel(status?: string | null): string {\n if (!status) return 'None'\n const labels: Record<string, string> = {\n completed: 'Success',\n success: 'Success',\n failed: 'Failed',\n running: 'In progress',\n awaiting_authorization: 'Awaiting access',\n }\n return labels[status] ?? status.replaceAll('_', ' ')\n}\n\n/**\n * The result to list for an automation: its stored run status corrected by the state of the thread\n * its last run produced. The stored status lags the thread: it can still say \"running\" once the\n * thread is done.\n */\nexport function listedRunStatus(\n status?: string | null,\n threadStatus?: string | null\n): string | null | undefined {\n if (threadStatus === 'done' && status === 'running') return 'completed'\n return status\n}\n","/**\n * Column definitions for the Workflows grid. Every column has an explicit `colId` (AG Grid persists\n * column state by id: see CLAUDE.md). The table supplies the cells that need behaviour through slots,\n * which must be stable functions so the definitions are built once.\n */\nimport type { ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { workflowStatus, type WorkflowListRow } from './workflowRows'\nimport type { WorkflowListLabels } from './workflowTableLabels'\n\nexport const WORKFLOW_COLUMN_ORDER = [\n 'name',\n 'trigger',\n 'last_run',\n 'result',\n 'status',\n 'shared',\n 'actions',\n] as const\n\nexport interface CreateWorkflowColumnsOptions<T extends WorkflowListRow> {\n labels: WorkflowListLabels\n renderName: (workflow: T) => ReactNode\n renderTrigger: (workflow: T) => ReactNode\n renderStatus: (workflow: T) => ReactNode\n renderShared: (workflow: T) => ReactNode\n renderLastRun: (workflow: T) => ReactNode\n renderResult: (workflow: T) => ReactNode\n renderActions: (workflow: T) => ReactNode\n /** Plain text of the trigger cell, for sorting and the clipboard. */\n getTriggerText: (workflow: T) => string\n}\n\nfunction cell<T extends WorkflowListRow>(render: (workflow: T) => ReactNode) {\n return (params: ICellRendererParams<T>): ReactNode => (params.data ? render(params.data) : null)\n}\n\nconst time = (iso?: string | null): number => (iso ? Date.parse(iso) : Number.POSITIVE_INFINITY)\n\nexport function createWorkflowColumns<T extends WorkflowListRow>(\n o: CreateWorkflowColumnsOptions<T>\n): ColDef<T>[] {\n const l = o.labels\n const base: Partial<ColDef<T>> = {\n sortable: false,\n cellStyle: { display: 'flex', alignItems: 'center' },\n }\n return [\n {\n ...base,\n colId: 'name',\n sortable: true,\n headerName: l.colName,\n flex: 3,\n minWidth: 210,\n valueGetter: (p) => p.data?.name.toLowerCase() ?? '',\n cellRenderer: cell(o.renderName),\n },\n {\n ...base,\n colId: 'trigger',\n headerName: l.colTrigger,\n flex: 2.4,\n minWidth: 185,\n valueGetter: (p) => (p.data ? o.getTriggerText(p.data) : ''),\n cellRenderer: cell(o.renderTrigger),\n },\n {\n ...base,\n colId: 'last_run',\n sortable: true,\n headerName: l.colLastRun,\n flex: 1.4,\n minWidth: 140,\n cellStyle: { display: 'flex', alignItems: 'center', padding: 0 },\n valueGetter: (p) => time(p.data?.last_fired_at),\n cellRenderer: cell(o.renderLastRun),\n },\n {\n ...base,\n colId: 'result',\n headerName: 'Result',\n width: 130,\n valueGetter: (p) => p.data?.last_run_status ?? '',\n cellStyle: { display: 'flex', alignItems: 'center', padding: 0 },\n cellRenderer: cell(o.renderResult),\n },\n {\n ...base,\n colId: 'status',\n sortable: true,\n headerName: l.colStatus,\n width: 120,\n valueGetter: (p) => (p.data ? workflowStatus(p.data) : ''),\n cellRenderer: cell(o.renderStatus),\n },\n {\n ...base,\n colId: 'shared',\n headerName: l.colShared,\n headerTooltip: l.shared,\n width: 96,\n cellStyle: { display: 'flex', alignItems: 'center', justifyContent: 'center' },\n valueGetter: (p) => p.data?.shared ?? false,\n cellRenderer: cell(o.renderShared),\n },\n {\n ...base,\n colId: 'actions',\n headerName: '',\n width: 180,\n minWidth: 180,\n cellStyle: { display: 'flex', alignItems: 'center', justifyContent: 'flex-end' },\n cellRenderer: cell(o.renderActions),\n },\n ]\n}\n","export interface WorkflowListLabels {\n colName: string\n colType: string\n colTrigger: string\n colAction: string\n colAgent: string\n colStatus: string\n colShared: string\n colLastRun: string\n colNextRun: string\n shared: string\n sharedOwnerOnly: string\n deleteOwnerOnly: string\n typeSkill: string\n typeWorkflow: string\n statusActive: string\n statusPaused: string\n statusOnDemand: string\n activeSwitch: (name: string) => string\n agent: string\n myAssistant: string\n me: string\n someone: string\n never: string\n none: string\n reminder: string\n /** What a stepped workflow does: its number of steps. */\n steps: (count: number) => string\n failed: string\n lastRunFailed: string\n openLastRun: string\n editWorkflow: string\n run: string\n runLater: string\n runNow: string\n runs: string\n delete: string\n moreActions: string\n searchLabel: string\n searchPlaceholder: string\n emptyTitle: string\n emptyMessage: string\n firstRun: string\n noMatches: string\n filterAll: string\n filterSkills: string\n filterWorkflows: string\n filterActive: string\n filterPaused: string\n makeActive: string\n makePaused: string\n selectAll: string\n selectWorkflow: (name: string) => string\n}\n\nexport const DEFAULT_WORKFLOW_LIST_LABELS: WorkflowListLabels = {\n colName: 'Name',\n colType: 'Type',\n colTrigger: 'When',\n colAction: 'What it does',\n colAgent: 'Agent',\n colStatus: 'Active',\n colShared: 'Shared',\n colLastRun: 'Last run',\n colNextRun: 'Next run',\n shared: 'Shared with the workspace',\n sharedOwnerOnly: 'Only the creator can change who can see this',\n deleteOwnerOnly: 'Only the creator or workspace owner can delete this',\n typeSkill: 'Skill',\n typeWorkflow: 'Workflow',\n statusActive: 'Active',\n statusPaused: 'Inactive',\n statusOnDemand: 'On demand',\n activeSwitch: (name) => `Active: “${name}”`,\n agent: 'Agent',\n myAssistant: 'My assistant',\n me: 'Me',\n someone: 'Someone',\n never: 'Never',\n none: '—',\n reminder: 'Reminder',\n steps: (count) => `Workflow · ${count} ${count === 1 ? 'step' : 'steps'}`,\n failed: 'Failed',\n lastRunFailed: 'Last run failed',\n openLastRun: 'Open the task this run created',\n editWorkflow: 'Edit',\n run: 'Run',\n runLater: 'Run later',\n runNow: 'Run now',\n runs: 'Runs',\n delete: 'Delete',\n moreActions: 'More actions',\n searchLabel: 'Search workflows',\n searchPlaceholder: 'Search workflows and skills…',\n emptyTitle: 'Nothing to run yet',\n emptyMessage: 'Skills and workflows you can run will appear here.',\n firstRun: 'Run a skill now, or choose Run later to save it as a workflow that runs on its own.',\n noMatches: 'Nothing in this view.',\n filterAll: 'All',\n filterSkills: 'Skills',\n filterWorkflows: 'Workflows',\n filterActive: 'Active',\n filterPaused: 'Inactive',\n makeActive: 'Make active',\n makePaused: 'Deactivate',\n selectAll: 'Select all',\n selectWorkflow: (name) => `Select ${name}`,\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { GridApi } from 'ag-grid-community'\nimport { History, MoreHorizontal, Pencil, Play, Trash2, Workflow } from 'lucide-react'\nimport {\n Button,\n badgeVariants,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Switch,\n VisibilityToggle,\n cn,\n} from '@arbidocs/react/ui'\nimport { TabHeader, type Tab } from '../../shell/TabHeader'\nimport { FilterInput } from '../../shell/FilterInput'\nimport { TriStateFilterMenu, type TriState } from '../../settings/TriStateFilterMenu'\nimport { EmptyState } from '../../components/EmptyState'\nimport { GridView } from '../../files/GridView'\nimport { SelectionBar, SelectionBarAction } from '../../files/SelectionBar'\nimport { testIdOr } from '../../chat/test-id'\nimport { PersonPill, type TaskPerson } from './PersonPill'\nimport { TaskTriggerChip, type TaskTriggerChipLabels } from './TaskTriggerChip'\nimport { createWorkflowColumns } from './workflowColumns'\nimport {\n hasTrigger,\n isSkillRow,\n workflowStatus,\n listedRunStatus,\n workflowRunStatusLabel,\n workflowStepCount,\n workflowTriggerType,\n type WorkflowListRow,\n} from './workflowRows'\nimport { DEFAULT_WORKFLOW_LIST_LABELS, type WorkflowListLabels } from './workflowTableLabels'\n\nexport interface WorkflowsTableProps<T extends WorkflowListRow> {\n /** Everything the viewer can run: saved workflows, and skills as virtual rows (`kind: 'skill'`). */\n workflows: T[]\n isLoading?: boolean\n /** This page contains saved automations only; skills stay in their own library. */\n automationsOnly?: boolean\n /** Human summary of when a workflow starts (\"Every weekday at 9:00\", \"On document uploaded\"). */\n describeTrigger: (workflow: T) => string\n /** Friendly display of an ISO timestamp. */\n formatDate: (iso: string) => string\n /** Pause or resume a workflow that starts by itself (an on-demand one has no switch). */\n onToggleActive: (workflow: T, active: boolean) => void\n /** Share a workflow with the workspace or make it private (the toggle appears with it). */\n onToggleShared?: (workflow: T, shouldShare: boolean) => void\n /** Open the workflow in the composer (workflow-edit mode). */\n onEdit: (workflow: T) => void\n /**\n * Run it. A saved workflow just runs (its inputs are stored); a skill needs its inputs, so the host\n * opens the run dialog with that skill selected.\n */\n onRun: (row: T) => void\n /** Run a skill later: the run dialog, on its schedule view. Offered on skill rows. */\n onRunLater?: (skill: T) => void\n onDelete: (workflow: T) => void\n /** Show the tasks this workflow created. */\n onViewRuns?: (workflow: T) => void\n /** Click on a row (not on one of its controls): a skill's detail, a workflow's editor. */\n onOpenRow?: (row: T) => void\n /** Open the task a workflow's last run created. */\n onOpenThread?: (conversationId: string) => void\n /** Each workflow's latest run: the newest task it created, by workflow id. */\n /** Each automation's latest run thread, with that thread's status (it corrects a lagging result). */\n lastRuns?: Record<string, { conversationId: string; at: string; threadStatus?: string | null }>\n /** Bulk actions on the selected workflows (skills are skipped). */\n onDeleteMany?: (workflows: T[]) => void\n onToggleActiveMany?: (workflows: T[], active: boolean) => void\n /** Agent names by id, for the Agent column (falls back to \"Agent\"). */\n agentNames?: Record<string, string>\n /** Skill names by `skill_ref`, for the action cell (falls back to the reference). */\n skillNames?: Record<string, string>\n /** Task names by id, for an \"after <task>\" trigger. */\n taskNames?: Record<string, string>\n /** How an agent appears in the Agent column; defaults to the app's user pill. */\n renderPerson?: (person: TaskPerson) => ReactNode\n /**\n * The viewer edits the workspace (owner or collaborator): they may then edit, pause, resume and run a\n * workflow shared with it. A guest leaves this off.\n */\n canEditShared?: boolean\n /** The viewer owns the workspace: with the creator, the only one who deletes a workflow. Who can see it stays the creator's alone. */\n isWorkspaceOwner?: boolean\n /** Workflow id with a request in flight: its row disables its controls. */\n busyId?: string | null\n tabs?: Tab[]\n activeTabId?: string\n onTabChange?: (id: string) => void\n content?: ReactNode\n header?: ReactNode\n gridId?: string\n labels?: Partial<WorkflowListLabels>\n triggerChipLabels?: Partial<TaskTriggerChipLabels>\n testId?: string\n}\n\ntype Filter = 'all' | 'skills' | 'workflows' | 'active' | 'paused'\nconst ROW_HEIGHT = 40\n\n/**\n * Everything the viewer can run, in one list: skills (they run on demand) and saved workflows (they start\n * on a date, a repeat, an event or after a task, or on demand). Each row has its type, when it starts, what\n * it does, who runs it, its status (Active or Paused with a switch; On demand has none), when it last ran\n * (linking to the task that run created) and runs next, and a visible Run. The same grid as every other\n * list in the app.\n */\nexport function WorkflowsTable<T extends WorkflowListRow>(props: WorkflowsTableProps<T>) {\n const { workflows, isLoading, busyId, header, testId } = props\n const l: WorkflowListLabels = { ...DEFAULT_WORKFLOW_LIST_LABELS, ...props.labels }\n const [filterStates, setFilterStates] = useState<Map<Filter, TriState>>(new Map())\n const [filterOpen, setFilterOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [selected, setSelected] = useState<T[]>([])\n const apiRef = useRef<GridApi<T> | null>(null)\n\n const q = query.trim().toLowerCase()\n const matches = (w: T) =>\n !q ||\n `${w.name} ${w.description ?? ''} ${w.prompt ?? ''} ${w.skill_ref ?? ''}`\n .toLowerCase()\n .includes(q)\n const inFilter = (w: T, f: Filter) =>\n f === 'all' ||\n (f === 'skills' && isSkillRow(w)) ||\n (f === 'workflows' && !isSkillRow(w)) ||\n (f === 'active' && workflowStatus(w) === 'active') ||\n (f === 'paused' && workflowStatus(w) === 'paused')\n const counts = useMemo(() => {\n const out = { all: 0, skills: 0, workflows: 0, active: 0, paused: 0 }\n for (const w of workflows) {\n if (!matches(w)) continue\n for (const f of Object.keys(out) as Filter[]) if (inFilter(w, f)) out[f] += 1\n }\n return out\n // matches/inFilter read only `q` and the row.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [workflows, q])\n const shown = useMemo(\n () =>\n workflows.filter((w) => {\n if (!matches(w)) return false\n for (const group of [\n ['skills', 'workflows'],\n ['active', 'paused'],\n ] as Filter[][]) {\n const included = group.filter((f) => filterStates.get(f) === 'include')\n if (included.length && !included.some((f) => inFilter(w, f))) return false\n if (group.some((f) => filterStates.get(f) === 'exclude' && inFilter(w, f))) return false\n }\n return true\n }),\n [workflows, filterStates, q]\n )\n\n const renderPerson = props.renderPerson ?? ((p: TaskPerson) => <PersonPill person={p} />)\n const actionText = (w: T): string => {\n if (w.action)\n return w.action.type === 'email_documents' ? 'Email latest documents' : 'AI Review'\n if (isSkillRow(w))\n return w.description || (w.skill_ref && props.skillNames?.[w.skill_ref]) || w.name\n if (w.skill_ref) return props.skillNames?.[w.skill_ref] ?? w.skill_ref\n // A stepped workflow runs its plan: it is no reminder, even with no prompt of its own.\n const steps = workflowStepCount(w)\n if (steps > 0) return w.prompt?.trim() || l.steps(steps)\n return w.prompt?.trim() || w.plan?.goal?.trim() || l.reminder\n }\n\n // The cells read the latest handlers and lookups through this ref, so the column definitions are\n // built once and an interaction never makes the grid rebuild them.\n const latest = useRef({ props, l, renderPerson, actionText })\n latest.current = { props, l, renderPerson, actionText }\n\n const columnDefs = useMemo(\n () =>\n createWorkflowColumns<T>({\n labels: l,\n getTriggerText: (w) =>\n isSkillRow(w) ? l.statusOnDemand : latest.current.props.describeTrigger(w),\n renderName: (w) => {\n const { l: lb } = latest.current\n const skill = isSkillRow(w)\n const text = skill\n ? latest.current.actionText(w)\n : w.description || latest.current.actionText(w)\n // A name made from the instruction is not said again under itself.\n const stem = w.name.replace(/…$/, '').trim()\n const about = text && text.trim() !== w.name.trim() && text.trim() !== stem ? text : ''\n return (\n <div className=\"min-w-0 leading-tight\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span\n className={cn(\n 'truncate text-sm font-normal',\n workflowStatus(w) === 'paused' && 'text-muted-foreground'\n )}\n data-testid={`workflow-name-${w.external_id}`}\n >\n {w.name}\n </span>\n {skill && (\n <span\n className=\"shrink-0 rounded-full border border-border px-1.5 text-[11px] text-muted-foreground\"\n data-testid={`workflow-type-${w.external_id}`}\n >\n {lb.typeSkill}\n </span>\n )}\n </span>\n {about && !latest.current.props.automationsOnly && (\n <p\n className=\"truncate text-xs text-muted-foreground\"\n data-testid={`workflow-action-${w.external_id}`}\n >\n {about}\n </p>\n )}\n </div>\n )\n },\n renderTrigger: (w) => {\n const { props: p } = latest.current\n const after = w.after_conversation_ext_id\n const skill = isSkillRow(w)\n return (\n <div className=\"min-w-0 leading-tight\">\n <TaskTriggerChip\n id={w.external_id}\n testId={`workflow-trigger-${w.external_id}`}\n triggerType={workflowTriggerType(w)}\n summary={skill ? '' : p.describeTrigger(w)}\n afterTaskId={after}\n afterTaskName={after ? p.taskNames?.[after] : undefined}\n labels={p.triggerChipLabels}\n />\n </div>\n )\n },\n renderStatus: (w) => {\n const { props: p, l: lb } = latest.current\n const canEdit = w.is_owner !== false || Boolean(p.canEditShared)\n return (\n <Switch\n checked={hasTrigger(w) && !isSkillRow(w) && Boolean(w.active)}\n disabled={!hasTrigger(w) || isSkillRow(w) || !canEdit || p.busyId === w.external_id}\n onCheckedChange={(next) => p.onToggleActive(w, next)}\n className=\"disabled:data-[state=unchecked]:bg-muted dark:disabled:data-[state=unchecked]:bg-muted\"\n aria-label={lb.activeSwitch(w.name)}\n data-testid={`workflow-active-${w.external_id}`}\n />\n )\n },\n renderShared: (w) => {\n const { props: p, l: lb } = latest.current\n if (!p.onToggleShared || isSkillRow(w)) return null\n // Who can see it is the creator's alone: unsharing hides it from everyone else.\n const isCreator = w.is_owner !== false\n return (\n <VisibilityToggle\n items={{ shared: w.shared ?? false }}\n onToggle={(share) => latest.current.props.onToggleShared?.(w, share)}\n disabled={!isCreator || p.busyId === w.external_id}\n disabledTooltip={lb.sharedOwnerOnly}\n showLabel={false}\n data-testid={`workflow-shared-${w.external_id}`}\n />\n )\n },\n renderLastRun: (w) => {\n const { props: p, l: lb } = latest.current\n const at = w.last_fired_at ?? p.lastRuns?.[w.external_id]?.at\n return (\n <button\n type=\"button\"\n className=\"h-full w-full truncate px-4 text-left text-sm hover:text-primary\"\n onClick={() => p.onViewRuns?.(w)}\n title=\"View run history\"\n data-testid={`workflow-last-run-${w.external_id}`}\n >\n {at ? p.formatDate(at) : lb.never}\n </button>\n )\n },\n renderResult: (w) => {\n const status = listedRunStatus(\n w.last_run_status,\n latest.current.props.lastRuns?.[w.external_id]?.threadStatus\n )\n const label = workflowRunStatusLabel(status)\n return (\n <button\n type=\"button\"\n onClick={() => latest.current.props.onViewRuns?.(w)}\n title=\"View run history\"\n className={cn(\n badgeVariants({ variant: 'outline' }),\n 'mx-4 cursor-pointer text-xs font-medium',\n status === 'failed'\n ? 'border-red-border bg-red-bg text-red-text hover:bg-red-bg/80'\n : status === 'completed' || status === 'success'\n ? 'border-green-border bg-green-bg text-green-text hover:bg-green-bg/80'\n : status\n ? 'border-primary/20 bg-primary/10 text-primary hover:bg-primary/15'\n : 'border-border bg-muted text-muted-foreground hover:bg-muted/80'\n )}\n data-testid={`workflow-result-${w.external_id}`}\n >\n {label}\n </button>\n )\n },\n renderActions: (w) => {\n const { props: p, l: lb } = latest.current\n const id = w.external_id\n const skill = isSkillRow(w)\n const busy = p.busyId === id\n const isOwner = w.is_owner !== false\n const canEdit = isOwner || Boolean(p.canEditShared)\n const canAdmin = isOwner || Boolean(p.isWorkspaceOwner)\n return (\n <div className=\"flex items-center justify-end gap-1\">\n {(skill || canEdit) && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-8 gap-1.5 pointer-coarse:h-11\"\n disabled={busy}\n onClick={() => p.onRun(w)}\n data-testid={`workflow-run-btn-${id}`}\n >\n <Play className=\"size-3.5\" aria-hidden />\n {lb.run}\n </Button>\n )}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 pointer-coarse:size-11\"\n aria-label={lb.moreActions}\n data-testid={`workflow-menu-${id}`}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {skill && p.onRunLater && (\n <DropdownMenuItem\n onSelect={() => p.onRunLater?.(w)}\n data-testid={`workflow-run-later-${id}`}\n >\n <History className=\"mr-2 size-4\" aria-hidden />\n {lb.runLater}\n </DropdownMenuItem>\n )}\n {!skill && canEdit && (\n <DropdownMenuItem\n onSelect={() => p.onEdit(w)}\n data-testid={`workflow-edit-${id}`}\n >\n <Pencil className=\"mr-2 size-4\" aria-hidden />\n {lb.editWorkflow}\n </DropdownMenuItem>\n )}\n {!skill && p.onViewRuns && (\n <DropdownMenuItem\n onSelect={() => p.onViewRuns?.(w)}\n data-testid={`workflow-runs-${id}`}\n >\n <History className=\"mr-2 size-4\" aria-hidden />\n {lb.runs}\n </DropdownMenuItem>\n )}\n {!skill && canEdit && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n disabled={busy || !canAdmin}\n onSelect={() => p.onDelete(w)}\n title={canAdmin ? undefined : lb.deleteOwnerOnly}\n className=\"text-destructive focus:text-destructive\"\n data-testid={`workflow-delete-${id}`}\n >\n <Trash2 className=\"mr-2 size-4\" aria-hidden />\n {lb.delete}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n },\n }),\n // Stable on purpose: only the header texts rebuild the columns (see `latest`).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n l.colName,\n l.colType,\n l.colTrigger,\n l.colAction,\n l.colAgent,\n l.colStatus,\n l.colShared,\n l.shared,\n l.colLastRun,\n l.colNextRun,\n ]\n )\n\n // A change in the lookups the cells draw from redraws them once.\n useEffect(() => {\n apiRef.current?.refreshCells({ force: true })\n }, [\n busyId,\n props.agentNames,\n props.skillNames,\n props.taskNames,\n props.lastRuns,\n props.renderPerson,\n props.labels,\n props.canEditShared,\n props.isWorkspaceOwner,\n ])\n\n const mine = selected.filter((w) => !isSkillRow(w))\n const adminSelected = mine.filter((w) => w.is_owner !== false || props.isWorkspaceOwner)\n const editableSelected = mine.filter(\n (w) => hasTrigger(w) && (w.is_owner !== false || props.canEditShared)\n )\n const clearSelection = () => setSelected([])\n\n return (\n <div\n className=\"flex min-h-0 flex-1 flex-col\"\n data-testid={testIdOr(testId, { testId: 'workflow-list' })}\n >\n <TabHeader\n testId=\"automations-tab-header\"\n tabs={[\n {\n id: 'automations',\n label: '',\n count: shown.length,\n countIcon: <Workflow className=\"size-3.5\" />,\n countPlacement: 'leading',\n presentation: 'count',\n hasActiveFilters: !!q || [...filterStates.values()].some(Boolean),\n },\n ...(props.tabs ?? []),\n ]}\n activeTabId={props.activeTabId ?? 'automations'}\n onTabChange={props.onTabChange ?? (() => {})}\n firstTabContent={\n <FilterInput\n value={query}\n onChange={setQuery}\n fields={['text']}\n onFieldsChange={() => {}}\n hideFieldPicker\n ariaLabel={l.searchLabel}\n testIds={{ input: 'workflow-search' }}\n filter={\n <TriStateFilterMenu\n testId=\"automations-filter-button\"\n open={filterOpen}\n onOpenChange={setFilterOpen}\n filterStates={filterStates}\n onFiltersChange={setFilterStates}\n triggerClassName=\"flex h-5 items-center gap-0.5 rounded px-1 text-muted-foreground hover:text-foreground pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center\"\n renderChevron\n disableHoverOpen\n options={[\n ...(!props.automationsOnly\n ? [\n { id: 'skills' as const, label: l.filterSkills, count: counts.skills },\n {\n id: 'workflows' as const,\n label: l.filterWorkflows,\n count: counts.workflows,\n },\n ]\n : []),\n { id: 'active', label: l.filterActive, count: counts.active },\n { id: 'paused', label: l.filterPaused, count: counts.paused },\n ]}\n />\n }\n />\n }\n rightContent={header}\n />\n {props.content ? (\n props.content\n ) : workflows.length === 0 && !isLoading ? (\n <EmptyState\n icon={Workflow}\n title={l.emptyTitle}\n description={l.emptyMessage}\n testId=\"workflow-list-empty\"\n />\n ) : (\n <div className=\"min-h-0 flex-1\">\n <GridView<T>\n testId=\"workflow-grid\"\n gridId={props.gridId ?? 'workflows-grid-v2'}\n items={shown}\n columnDefs={columnDefs}\n getItemId={(w) => w.external_id}\n getRowTestId={(w) => `workflow-row-${w.external_id}`}\n isLoading={isLoading}\n showEmpty={shown.length === 0}\n emptyState={{ title: l.noMatches }}\n rowHeight={ROW_HEIGHT}\n height=\"100%\"\n onGridReady={({ api }) => {\n apiRef.current = api\n }}\n onRowClick={(row) => props.onOpenRow?.(row)}\n selection={{ mode: 'multiple', selected, onSelectionChange: setSelected }}\n gridOptions={GRID_OPTIONS as never}\n />\n </div>\n )}\n {!props.content && (\n <SelectionBar count={selected.length} onClear={clearSelection}>\n {(isCompact) => (\n <>\n {props.onToggleActiveMany && (\n <>\n <SelectionBarAction\n icon={Play}\n label={l.makeActive}\n onClick={() => {\n props.onToggleActiveMany?.(editableSelected, true)\n clearSelection()\n }}\n disabled={editableSelected.length === 0}\n isCompact={isCompact}\n testId=\"workflow-bulk-activate\"\n />\n <SelectionBarAction\n icon={Workflow}\n label={l.makePaused}\n onClick={() => {\n props.onToggleActiveMany?.(editableSelected, false)\n clearSelection()\n }}\n disabled={editableSelected.length === 0}\n isCompact={isCompact}\n testId=\"workflow-bulk-pause\"\n />\n </>\n )}\n {props.onDeleteMany && (\n <SelectionBarAction\n icon={Trash2}\n label={l.delete}\n onClick={() => {\n props.onDeleteMany?.(adminSelected)\n clearSelection()\n }}\n disabled={adminSelected.length === 0}\n isCompact={isCompact}\n className=\"border-red-border text-red-text hover:bg-red-bg hover:text-red-text\"\n testId=\"workflow-bulk-delete\"\n />\n )}\n </>\n )}\n </SelectionBar>\n )}\n </div>\n )\n}\n\nconst GRID_OPTIONS = { suppressClickEdit: true }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/agents/workflows/SchemaForm.tsx","../src/agents/workflows/AgentSelect.tsx","../src/agents/workflows/WorkflowConfigDialog.tsx","../src/agents/workflows/WorkflowLauncher.tsx","../src/agents/workflows/workspaceScope.ts","../src/agents/workflows/WorkflowDocumentsField.tsx","../src/agents/tasks/PersonPill.tsx","../src/agents/tasks/TaskTriggerChip.tsx","../src/agents/tasks/workflowRows.ts","../src/agents/tasks/workflowColumns.tsx","../src/agents/tasks/workflowTableLabels.ts","../src/agents/tasks/WorkflowsTable.tsx"],"names":["jsxs","cn","jsx","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Fragment","useState","useMemo","useRef","useEffect","Button","Switch","Play"],"mappings":"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","file":"chunk-OPK6GYYR.js","sourcesContent":["import { useState, type ReactNode } from 'react'\nimport { Check } from 'lucide-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 { TONE_BORDER, TONE_DOT, TONE_SOLID_BORDER, TONE_SURFACE } from '../../components/tones'\nimport { FoldSection } from '../../home/FoldSection'\nimport { isWorkflowScope } from './workflow'\nimport type {\n WorkflowErrors,\n WorkflowField,\n WorkflowFieldError,\n WorkflowFieldOption,\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 /** Who a `person` field offers (the workspace's members); without them it takes an id. */\n people?: ReadonlyArray<{ value: string; label: string }>\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 people?: SchemaFormProps['people']\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 people,\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 // Short choices (no icon or description) are buttons, not cards.\n const compact = options.every((o) => !o.icon && !o.description)\n return (\n <div\n role=\"radiogroup\"\n aria-label={field.label}\n // Each tile is as wide as its label and wraps onto a new line when the row is full\n // (a narrow side panel); one wider than the whole row wraps its own text instead.\n className=\"flex flex-wrap gap-2\"\n data-testid={testId}\n >\n {options.map((option) => (\n <ChoiceTile\n key={option.value}\n option={option}\n selected={value === option.value}\n compact={compact}\n renderIcon={renderIcon}\n testId={prefixedTestId(testId, option.value, {\n testId: `workflow-field-${field.name}-${option.value}`,\n })}\n onSelect={() => onChange(option.value)}\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 case 'person':\n return people?.length ? (\n <select\n id={id}\n data-testid={testId}\n value={String(value ?? '')}\n aria-required={field.required || undefined}\n aria-invalid={error ? true : undefined}\n onChange={(e) => onChange(e.target.value)}\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-2 text-sm shadow-sm\"\n >\n <option value=\"\">{field.placeholder ?? ''}</option>\n {people.map((p) => (\n <option key={p.value} value={p.value}>\n {p.label}\n </option>\n ))}\n </select>\n ) : (\n <Input\n id={id}\n data-testid={testId}\n value={String(value ?? '')}\n placeholder={field.placeholder ?? 'usr-…'}\n aria-required={field.required || undefined}\n aria-invalid={error ? true : undefined}\n onChange={(e) => onChange(e.target.value)}\n />\n )\n }\n}\n\n/**\n * One choice of a tiled select. A toned option shows its tone chosen or not: a dot and a tinted\n * border at rest, the tone's surface once chosen. The label and a check mark carry the state too,\n * so it never rests on colour alone.\n */\nfunction ChoiceTile({\n option,\n selected,\n compact,\n renderIcon,\n testId,\n onSelect,\n}: {\n option: WorkflowFieldOption\n selected: boolean\n compact: boolean\n renderIcon: SchemaFormProps['renderIcon']\n testId: string\n onSelect: () => void\n}) {\n const tone = option.tone\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n data-testid={testId}\n data-tone={tone}\n onClick={onSelect}\n className={cn(\n // Sized to its label (flex-basis auto), growing to share the row, never wider than it.\n 'flex max-w-full min-w-[min(4rem,100%)] flex-auto flex-col items-center justify-center gap-1.5 rounded-lg border text-center transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n compact\n ? 'min-h-9 px-3 py-1.5 pointer-coarse:min-h-11'\n : 'min-h-24 p-3 pointer-coarse:min-h-28',\n tone\n ? selected\n ? cn(TONE_SURFACE[tone], TONE_SOLID_BORDER[tone])\n : cn(TONE_BORDER[tone], 'bg-card [&:hover]:bg-muted')\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\n className={cn(\n 'flex max-w-full items-center gap-1.5 text-sm font-medium',\n tone && selected ? undefined : 'text-foreground'\n )}\n >\n {selected ? (\n <Check className=\"size-3.5 shrink-0\" aria-hidden />\n ) : (\n tone && (\n <span aria-hidden className={cn('size-2 shrink-0 rounded-full', TONE_DOT[tone])} />\n )\n )}\n <span className=\"min-w-0 break-words\">{option.label}</span>\n </span>\n {option.description && (\n <span className=\"max-w-full text-xs break-words text-muted-foreground\">\n {option.description}\n </span>\n )}\n </button>\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 people,\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 people={people}\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","import { useId, type ReactNode } from 'react'\nimport {\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr, prefixedTestId } from '../../chat/test-id'\nimport { useControllableState } from '../../lib/useControllableState'\n\nexport interface AgentOption {\n id: string\n label: string\n /** Small line under the label in the list (e.g. what the agent is for). */\n description?: string\n /** Avatar or mark shown before the name. */\n avatar?: ReactNode\n}\n\nexport interface AgentSelectLabels {\n /** The field label. */\n label: string\n /** The entry that means \"no specific agent\": the user's own assistant. */\n myAssistant: string\n}\n\nexport const DEFAULT_AGENT_SELECT_LABELS: AgentSelectLabels = {\n label: 'Run as',\n myAssistant: 'My assistant',\n}\n\nexport interface AgentSelectProps {\n agents: AgentOption[]\n /** Controlled agent id; `''` = my assistant. Omit to let the select hold its own state. */\n value?: string\n defaultValue?: string\n onValueChange?: (agentId: string) => void\n /** Hide the visible label (still the accessible name). */\n hideLabel?: boolean\n disabled?: boolean\n className?: string\n labels?: Partial<AgentSelectLabels>\n testId?: string\n /** Prefix of option ids (`<prefix>-<agent id>`); default `agent-select-option`. */\n optionTestId?: string\n}\n\nconst ME = '__me__'\n\n/** Pick which agent runs something: the user's own assistant (default) or one of their agents. */\nexport function AgentSelect({\n agents,\n value,\n defaultValue = '',\n onValueChange,\n hideLabel,\n disabled,\n className,\n labels,\n testId,\n optionTestId,\n}: AgentSelectProps) {\n const l = { ...DEFAULT_AGENT_SELECT_LABELS, ...labels }\n const triggerId = useId()\n const [current, setCurrent] = useControllableState(value, defaultValue, onValueChange)\n return (\n <div className={cn('flex flex-col gap-1.5', className)} data-slot=\"agent-select\">\n <Label htmlFor={triggerId} className={hideLabel ? 'sr-only' : undefined}>\n {l.label}\n </Label>\n <Select\n value={current === '' ? ME : current}\n onValueChange={(v) => setCurrent(v === ME ? '' : v)}\n disabled={disabled}\n >\n <SelectTrigger\n id={triggerId}\n data-testid={testIdOr(testId, { testId: 'agent-select' })}\n className=\"pointer-coarse:min-h-11\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem\n value={ME}\n data-testid={prefixedTestId(optionTestId, 'me', {\n testId: 'agent-select-option-me',\n })}\n >\n {l.myAssistant}\n </SelectItem>\n {agents.map((agent) => (\n <SelectItem\n key={agent.id}\n value={agent.id}\n data-testid={prefixedTestId(optionTestId, agent.id, {\n testId: `agent-select-option-${agent.id}`,\n })}\n >\n <span className=\"flex items-center gap-2\">\n {agent.avatar}\n <span>{agent.label}</span>\n {agent.description && (\n <span className=\"text-xs text-muted-foreground\">{agent.description}</span>\n )}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n}\n","import { useEffect, useMemo, useRef, useState, type FormEvent, type ReactNode } from 'react'\nimport { Loader2, Play } from 'lucide-react'\nimport { Button, Dialog, DialogContent } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\nimport { AddFilesFirst } from '../../home/AddFilesFirst'\nimport { QuickActionDialogHeader } from '../../home/QuickActionDialogHeader'\nimport { ScopePicker, type ScopeFolder, type ScopeLabel } from '../../home/ScopePicker'\nimport { useControllableState } from '../../lib/useControllableState'\nimport { AgentSelect, type AgentOption, type AgentSelectLabels } from './AgentSelect'\nimport { SchemaForm, type SchemaFormLabels } from './SchemaForm'\nimport type {\n OnWorkflowLaunch,\n WorkflowDefinition,\n WorkflowField,\n WorkflowInputs,\n WorkflowInputValue,\n WorkflowScope,\n} from './types'\nimport { buildLaunch, defaultInputs, validateInputs } from './workflow'\n\n/** The workspace's files, as the scope picker needs them. Matching stays with the host. */\nexport interface WorkflowScopeSource {\n folders: ScopeFolder[]\n unfiledCount: number\n labels: ScopeLabel[]\n totalCount: number\n /** How many files a scope selects. */\n countMatching: (scope: WorkflowScope) => number\n /**\n * The ids of the files a scope selects. A run is bound to explicit file ids, so a folder/label pick is\n * resolved here, on the client, before anything is sent.\n */\n resolveDocuments?: (scope: WorkflowScope) => string[]\n}\n\nexport interface WorkflowConfigDialogLabels {\n /** Primary button when the workflow gives no label of its own. */\n start: string\n starting: string\n /** Shown instead of the form when `requiresFiles` and the workspace has none. */\n addFilesReason: string\n agentLabel: string\n}\n\nexport const DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS: WorkflowConfigDialogLabels = {\n start: 'Start',\n starting: 'Starting…',\n addFilesReason: 'This reads your files, and there is nothing to read yet.',\n agentLabel: 'Run as',\n}\n\nexport interface WorkflowConfigDialogProps {\n workflow: WorkflowDefinition\n open: boolean\n onOpenChange: (open: boolean) => void\n onLaunch: OnWorkflowLaunch\n /** Values the form opens with, over each field's default (e.g. text typed after a slash). */\n initialInputs?: Partial<WorkflowInputs>\n /** Controlled inputs; omit to let the dialog hold them. */\n inputs?: WorkflowInputs\n onInputsChange?: (inputs: WorkflowInputs) => void\n /** Files behind `scope` fields. Without it a scope field renders through `renderScope` or not at all. */\n scopeSource?: WorkflowScopeSource\n renderScope?: (\n field: WorkflowField,\n value: WorkflowScope,\n onChange: (s: WorkflowScope) => void\n ) => ReactNode\n /** Renders a `documents` field: the host owns the file list behind the pick. */\n renderDocuments?: (\n field: WorkflowField,\n value: WorkflowScope,\n onChange: (s: WorkflowScope) => void\n ) => ReactNode\n renderIcon?: (key: string) => ReactNode\n /** The host's own \"Add\" control, shown when the workflow needs files and there are none. */\n addFilesAction?: ReactNode\n /** Agents the user can hand the work to. Empty/omitted hides the \"Run as\" row. */\n agents?: AgentOption[]\n agentId?: string\n onAgentChange?: (agentId: string) => void\n isLaunching?: boolean\n /** Primary button text from the current inputs and matched file count. */\n submitLabel?: (ctx: {\n workflow: WorkflowDefinition\n inputs: WorkflowInputs\n matchedCount: number | null\n }) => string | undefined\n /** Per-field placeholder derived from the inputs (e.g. a name taken from a description). */\n fieldPlaceholder?: (\n field: WorkflowField,\n inputs: WorkflowInputs,\n workflow: WorkflowDefinition\n ) => string | undefined\n /** Anything the host wants to say about the current inputs, above the footer. */\n renderNotice?: (ctx: { workflow: WorkflowDefinition; inputs: WorkflowInputs }) => ReactNode\n labels?: Partial<WorkflowConfigDialogLabels>\n formLabels?: Partial<SchemaFormLabels>\n agentLabels?: Partial<AgentSelectLabels>\n /** Dialog id; fields use `<testId>-field-<name>`. Default `workflow-dialog`. */\n testId?: string\n startTestId?: string\n className?: string\n}\n\n/**\n * One dialog for every workflow: the form comes from the workflow's declared inputs, scope fields\n * use the shared folder/label picker, and the footer says who runs it. Launching hands\n * `{workflow, inputs, scope, agentId}` to `onLaunch`; the host does the rest.\n */\nexport function WorkflowConfigDialog({\n workflow,\n open,\n onOpenChange,\n onLaunch,\n initialInputs,\n inputs: inputsProp,\n onInputsChange,\n scopeSource,\n renderScope,\n renderDocuments,\n renderIcon,\n addFilesAction,\n agents,\n agentId: agentIdProp,\n onAgentChange,\n isLaunching,\n submitLabel,\n fieldPlaceholder,\n renderNotice,\n labels,\n formLabels,\n agentLabels,\n testId,\n startTestId,\n className,\n}: WorkflowConfigDialogProps) {\n const l = { ...DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS, ...labels }\n // Keyed by content: a host passing a fresh `initialInputs` object each render must not reset the form.\n const initialKey = JSON.stringify(initialInputs ?? {})\n const seedKey = JSON.stringify({ ...defaultInputs(workflow), ...JSON.parse(initialKey) })\n const seed = useMemo(() => JSON.parse(seedKey) as WorkflowInputs, [seedKey])\n const [inputs, setInputs] = useControllableState<WorkflowInputs>(inputsProp, seed, onInputsChange)\n const [agentId, setAgentId] = useControllableState<string>(\n agentIdProp,\n workflow.defaultAgentId ?? '',\n onAgentChange\n )\n\n // A fresh open starts from the seed again (uncontrolled only).\n useEffect(() => {\n if (open && inputsProp === undefined) setInputs(seed)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, seed])\n\n const setField = (name: string, value: WorkflowInputValue) =>\n setInputs({ ...inputs, [name]: value })\n\n const errors = validateInputs(workflow, inputs)\n const valid = Object.keys(errors).length === 0\n // Required-ness is conveyed by the disabled button; range problems are shown as they happen.\n const visibleErrors = Object.fromEntries(\n Object.entries(errors).filter(([, e]) => e !== 'required')\n )\n\n const scopeField = workflow.inputs.find((f) => f.type === 'scope')\n const rawScope = scopeField ? inputs[scopeField.name] : undefined\n const scopeValue: WorkflowScope =\n rawScope && typeof rawScope === 'object' ? rawScope : { folders: [], labels: [] }\n const matchedCount = scopeSource && scopeField ? scopeSource.countMatching(scopeValue) : null\n const noFiles = Boolean(workflow.requiresFiles && scopeSource && scopeSource.totalCount === 0)\n const blockedByScope =\n matchedCount !== null && matchedCount === 0 && Boolean(workflow.requiresFiles)\n\n const showAgent =\n workflow.run.kind === 'prompt' &&\n workflow.options?.agent !== false &&\n agents !== undefined &&\n agents.length > 0\n\n const launch = (values: WorkflowInputs) => {\n // A failed launch leaves the dialog open so nothing typed is lost; the host reports why.\n Promise.resolve(onLaunch(buildLaunch(workflow, values, agentId))).catch(() => {})\n }\n\n const submit = () => {\n if (!valid || noFiles || blockedByScope || isLaunching) return\n launch(inputs)\n }\n\n const fields = useMemo(\n () =>\n workflow.inputs.map((f) => {\n const placeholder = fieldPlaceholder?.(f, inputs, workflow)\n return placeholder === undefined ? f : { ...f, placeholder }\n }),\n [workflow, fieldPlaceholder, inputs]\n )\n\n const id = testIdOr(testId, { testId: 'workflow-dialog' })\n const formRef = useRef<HTMLFormElement>(null)\n // A form that opens on a text field (the prompt) puts the cursor there, so typing starts at\n // once; a form that opens on a file pick keeps the dialog's own first focus.\n const firstField = workflow.inputs.find((f) => !f.advanced)\n const focusPromptFirst = firstField?.type === 'text' || firstField?.type === 'longtext'\n const defaultScopeRender = scopeSource\n ? (_field: WorkflowField, value: WorkflowScope, onChange: (s: WorkflowScope) => void) => (\n <ScopePicker\n folders={scopeSource.folders}\n unfiledCount={scopeSource.unfiledCount}\n labels={scopeSource.labels}\n totalCount={scopeSource.totalCount}\n matchedCount={scopeSource.countMatching(value)}\n scope={value}\n onScopeChange={onChange}\n />\n )\n : undefined\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className={`max-h-[calc(100dvh-2rem)] overflow-y-auto sm:max-w-xl ${className ?? ''}`}\n data-testid={id}\n data-workflow={workflow.id}\n onOpenAutoFocus={(event) => {\n if (!focusPromptFirst || !firstField) return\n const control = formRef.current?.querySelector<HTMLElement>(\n `[data-testid=\"${id}-field-${firstField.name}\"]`\n )\n if (!control) return\n event.preventDefault()\n control.focus()\n if (control instanceof HTMLInputElement || control instanceof HTMLTextAreaElement) {\n const end = control.value.length\n control.setSelectionRange(end, end)\n }\n }}\n >\n <QuickActionDialogHeader\n icon={workflow.icon && renderIcon ? renderIcon(workflow.icon) : null}\n title={workflow.title}\n description={workflow.details ?? workflow.description}\n descriptionTestId={`${id}-description`}\n />\n <form\n ref={formRef}\n className=\"mt-2 flex flex-col gap-4\"\n onSubmit={(event: FormEvent) => {\n event.preventDefault()\n submit()\n }}\n >\n {noFiles ? (\n <AddFilesFirst\n reason={l.addFilesReason}\n action={addFilesAction}\n testId={`${id}-empty-state`}\n />\n ) : (\n <>\n <SchemaForm\n fields={fields}\n values={inputs}\n onChange={setField}\n errors={visibleErrors}\n renderScope={renderScope ?? defaultScopeRender}\n renderDocuments={renderDocuments}\n renderIcon={renderIcon}\n labels={formLabels}\n onEnterSubmit={submit}\n testIdPrefix={`${id}-field`}\n />\n {renderNotice?.({ workflow, inputs })}\n <div\n className=\"flex flex-col gap-3 border-t border-border pt-3 sm:flex-row sm:items-end sm:justify-between\"\n data-slot=\"workflow-footer\"\n >\n {showAgent ? (\n <AgentSelect\n agents={agents ?? []}\n value={agentId}\n onValueChange={setAgentId}\n labels={{ label: l.agentLabel, ...agentLabels }}\n testId={`${id}-agent`}\n className=\"sm:w-56\"\n />\n ) : (\n <span />\n )}\n <Button\n type=\"submit\"\n className=\"gap-1.5 px-5 pointer-coarse:min-h-11\"\n disabled={!valid || blockedByScope || isLaunching}\n data-testid={testIdOr(startTestId, { testId: 'workflow-start-button' })}\n >\n {isLaunching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Play className=\"size-4\" />\n )}\n {isLaunching\n ? l.starting\n : (submitLabel?.({ workflow, inputs, matchedCount }) ??\n workflow.startLabel ??\n l.start)}\n </Button>\n </div>\n </>\n )}\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { StartTiles, type StartTile } from '../../home/StartTiles'\nimport { useControllableState } from '../../lib/useControllableState'\nimport { WorkflowConfigDialog, type WorkflowConfigDialogProps } from './WorkflowConfigDialog'\nimport type { OnWorkflowLaunch, WorkflowDefinition, WorkflowInputs } from './types'\nimport { buildLaunch, defaultInputs, validateInputs } from './workflow'\n\nexport interface WorkflowLauncherProps extends Omit<\n WorkflowConfigDialogProps,\n 'workflow' | 'open' | 'onOpenChange' | 'onLaunch' | 'isLaunching' | 'initialInputs'\n> {\n workflows: WorkflowDefinition[]\n /** Which of `workflows` get a tile (a filtered or capped view); default all. */\n tileWorkflows?: WorkflowDefinition[]\n /** The host performs the launch (open a chat, scope files, send, land). */\n onLaunch: OnWorkflowLaunch\n /** Render the tile band. Off when something else (the slash menu) opens the dialog. */\n showTiles?: boolean\n caption?: string\n captionTestId?: string\n /** Tile ids: `<prefix>-<workflow id>` unless `tileTestId` returns one. */\n tileTestId?: (workflow: WorkflowDefinition) => string | undefined\n /** A reason the workflow cannot run now (greys its tile out). */\n disabledReason?: (workflow: WorkflowDefinition) => string | undefined\n /** Controlled open workflow (by id); `null` = none. Omit for uncontrolled. */\n activeId?: string | null\n onActiveIdChange?: (id: string | null) => void\n /** Inputs to seed the dialog with when `activeId` opens (slash-typed text etc.). */\n initialInputsFor?: (workflow: WorkflowDefinition) => Partial<WorkflowInputs> | undefined\n /** Extra content inside the tile band's section, after the tiles. */\n /** Plain tiles appended to the band (tier A actions that are not workflows). */\n extraTiles?: StartTile[]\n /** Test id of the tile band. */\n testId?: string\n className?: string\n children?: ReactNode\n}\n\n/**\n * The one place a workflow is launched from: a band of tiles plus the config dialog. Choosing a\n * workflow opens the dialog, which asks what it declares; only an operation with no inputs\n * launches on the click.\n * Also usable headless (`showTiles={false}`) when another surface picks the workflow.\n */\nexport function WorkflowLauncher({\n workflows,\n tileWorkflows,\n onLaunch,\n showTiles = true,\n caption,\n captionTestId,\n tileTestId,\n disabledReason,\n activeId: activeIdProp,\n onActiveIdChange,\n initialInputsFor,\n testId,\n extraTiles = [],\n className,\n children,\n renderIcon,\n ...dialog\n}: WorkflowLauncherProps) {\n const [activeId, setActiveId] = useControllableState<string | null>(\n activeIdProp,\n null,\n onActiveIdChange\n )\n const [isLaunching, setIsLaunching] = useState(false)\n const active = workflows.find((w) => w.id === activeId) ?? null\n\n const run: OnWorkflowLaunch = async (launch) => {\n setIsLaunching(true)\n try {\n await onLaunch(launch)\n setActiveId(null)\n } finally {\n setIsLaunching(false)\n }\n }\n\n const select = (workflow: WorkflowDefinition) => {\n // Only an operation with nothing to ask (tier B) starts on the click. A prompt workflow or a\n // skill is run WITH a prompt, so it always opens the form, however few inputs it declares.\n if (workflow.run.kind === 'operation' && workflow.inputs.length === 0) {\n const inputs = defaultInputs(workflow)\n if (Object.keys(validateInputs(workflow, inputs)).length === 0) {\n Promise.resolve(onLaunch(buildLaunch(workflow, inputs, undefined))).catch(() => {})\n return\n }\n }\n setActiveId(workflow.id)\n }\n\n const tiles: StartTile[] = (tileWorkflows ?? workflows).map((workflow) => {\n const reason = disabledReason?.(workflow)\n return {\n id: workflow.id,\n iconNode: workflow.icon && renderIcon ? renderIcon(workflow.icon) : undefined,\n title: workflow.title,\n description: workflow.description,\n onSelect: () => select(workflow),\n disabled: reason !== undefined,\n disabledReason: reason,\n testId: tileTestId?.(workflow) ?? `workflow-tile-${workflow.id}`,\n }\n })\n\n return (\n <div className={className} data-slot=\"workflow-launcher\">\n {showTiles && (\n <StartTiles\n items={[...tiles, ...extraTiles]}\n caption={caption}\n captionTestId={captionTestId}\n testId={testId}\n />\n )}\n {children}\n {active && (\n <WorkflowConfigDialog\n {...dialog}\n renderIcon={renderIcon}\n workflow={active}\n open\n onOpenChange={(open) => !open && setActiveId(null)}\n onLaunch={run}\n isLaunching={isLaunching}\n initialInputs={initialInputsFor?.(active)}\n />\n )}\n </div>\n )\n}\n","import { getEntityColor } from '@arbidocs/react/ui'\nimport type { WorkflowScope } from './types'\nimport type { WorkflowScopeSource } from './WorkflowConfigDialog'\n\nexport interface WorkflowScopeDocument {\n external_id: string\n folder?: string | null\n doctags?: Array<{ tag_ext_id: string }>\n}\nexport interface WorkflowScopeLabel {\n external_id: string\n name: string\n color?: string\n}\n/** A workspace tag, as far as the scope picker reads it. */\nexport interface WorkflowScopeTag extends WorkflowScopeLabel {\n kind?: string | null\n doctag_count?: number | null\n facttag_count?: number | null\n}\n\n/**\n * The labels a scope picker offers: the workspace's document vocabulary, as the Files page's quick\n * filter has it. Saved searches are not labels; a tag used only on facts is not a file label; one\n * used nowhere yet is offered.\n */\nexport function documentScopeLabels<T extends WorkflowScopeTag>(tags: T[]): T[] {\n return tags.filter((tag) => {\n if (tag.kind === 'search') return false\n const onDocs = (tag.doctag_count ?? 0) > 0\n const onFacts = (tag.facttag_count ?? 0) > 0\n return onDocs || !onFacts\n })\n}\n\nconst canonical = (path?: string | null) =>\n (path ?? '')\n .split('/')\n .map((part) => part.trim())\n .filter(Boolean)\n .join('/')\n\n/** Match the same folder/label OR semantics as the document library; explicit file picks win. */\nexport function matchWorkflowScope<T extends WorkflowScopeDocument>(\n docs: T[],\n scope: WorkflowScope\n): T[] {\n if (scope.documents?.length) {\n const ids = new Set(scope.documents)\n return docs.filter((doc) => ids.has(doc.external_id))\n }\n if (!scope.folders.length && !scope.labels.length) return docs\n const folders = scope.folders.map(canonical)\n const labels = new Set(scope.labels)\n return docs.filter((doc) => {\n const folder = canonical(doc.folder)\n return (\n folders.some((path) =>\n path === '' ? folder === '' : folder === path || folder.startsWith(`${path}/`)\n ) || doc.doctags?.some((tag) => labels.has(tag.tag_ext_id))\n )\n })\n}\n\n/** Turn real workspace documents and labels into the shared workflow scope picker model. */\nexport function buildWorkflowScopeSource(\n docs: WorkflowScopeDocument[],\n labels: WorkflowScopeLabel[] = []\n): WorkflowScopeSource {\n const counts = new Map<string, number>()\n for (const doc of docs) {\n const parts = canonical(doc.folder).split('/').filter(Boolean)\n for (let i = 1; i <= parts.length; i++) {\n const path = parts.slice(0, i).join('/')\n counts.set(path, (counts.get(path) ?? 0) + 1)\n }\n }\n return {\n folders: [...counts]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([path, count]) => ({\n path,\n count,\n label: path.split('/').at(-1)!,\n depth: path.split('/').length - 1,\n })),\n unfiledCount: docs.filter((doc) => !canonical(doc.folder)).length,\n labels: labels.map((label) => ({\n id: label.external_id,\n name: label.name,\n color: label.color ?? getEntityColor(label.external_id, 'medium'),\n count: docs.filter((doc) => doc.doctags?.some((tag) => tag.tag_ext_id === label.external_id))\n .length,\n })),\n totalCount: docs.length,\n countMatching: (scope) => matchWorkflowScope(docs, scope).length,\n resolveDocuments: (scope) => matchWorkflowScope(docs, scope).map((doc) => doc.external_id),\n }\n}\n","import { useEffect, useMemo, useRef, useState, type DragEvent } from 'react'\nimport { FolderPlus, ImageIcon, X } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { DocumentPicker, type PickerDocument } from '../../settings/DocumentPicker'\nimport type { WorkflowField, WorkflowScope } from './types'\n\n/** A workspace file a `documents` field can pick. */\nexport interface WorkflowFieldDocument extends PickerDocument {\n /** Its processing status (`completed`, `processing`…); absent = ready. */\n status?: string | null\n /** An image (for an image-only field, and its thumbnail). */\n isImage?: boolean\n}\n\nexport interface WorkflowDocumentsFieldLabels {\n pickOne: string\n pickMany: string\n /** The heading of the one list of files (a run has no conversation). */\n allDocuments: string\n addFiles: string\n adding: string\n empty: string\n remove: (name: string) => string\n /** A chosen file that is not ready yet: where it is, and that it can still be picked. */\n pending: (name: string, status: string) => string\n status: Record<string, string>\n}\n\nexport const DEFAULT_WORKFLOW_DOCUMENTS_FIELD_LABELS: WorkflowDocumentsFieldLabels = {\n pickOne: 'Pick a file',\n pickMany: 'Pick files',\n allDocuments: 'All documents',\n addFiles: 'Add files',\n adding: 'Adding…',\n empty: 'No files in this workspace yet. Drop one here, or add it.',\n remove: (name) => `Remove ${name}`,\n pending: (name, status) => `${name}: ${status}. You can still pick it.`,\n status: {\n queued: 'Queued',\n uploading: 'Uploading',\n encrypting: 'Encrypting',\n processing: 'Processing',\n parsing: 'Processing',\n indexing: 'Indexing',\n analysing: 'Analysing',\n },\n}\n\nexport interface WorkflowDocumentsFieldProps {\n field: WorkflowField\n value: WorkflowScope\n onChange: (value: WorkflowScope) => void\n /** The workspace's files. */\n documents: WorkflowFieldDocument[]\n /** The list has arrived (until then an empty list is not \"no files yet\"). Default true. */\n loaded?: boolean\n /** A chosen image's thumbnail (`data:` or URL), for the gallery of a several-files field. */\n thumbnailOf?: (id: string) => string | null | undefined\n /**\n * Add files (dropped ones, or none: the host asks). Absent: no Add files and no drop. A file\n * that appears in `documents` after this is chosen at once, even while it processes.\n */\n onAddFiles?: (files?: File[]) => void\n /** Files are being added (the button waits). */\n adding?: boolean\n labels?: Partial<WorkflowDocumentsFieldLabels>\n}\n\nconst isReady = (status?: string | null) =>\n !status || ['completed', 'done', 'ready', 'success'].includes(status.toLowerCase())\n\nconst byTitle = (a: PickerDocument, b: PickerDocument) =>\n a.title.toLowerCase().localeCompare(b.title.toLowerCase())\n\n/**\n * A workflow `documents` field: an explicit pick of workspace files. One file is a combobox;\n * several (`max` > 1) show the chosen ones as removable tiles, with a thumbnail for images, so you\n * SEE what you are steering a run with. With `onAddFiles`, files can be added (or dropped) right\n * here, and an empty workspace says so instead of offering an empty list.\n */\nexport function WorkflowDocumentsField({\n field,\n value,\n onChange,\n documents,\n loaded = true,\n thumbnailOf,\n onAddFiles,\n adding,\n labels,\n}: WorkflowDocumentsFieldProps) {\n const l = { ...DEFAULT_WORKFLOW_DOCUMENTS_FIELD_LABELS, ...labels }\n const ids = value.documents ?? []\n const max = field.max ?? 1\n const multiple = max > 1\n const [isOver, setIsOver] = useState(false)\n const docOf = (id: string) => documents.find((d) => d.id === id)\n const nameOf = (id: string) => docOf(id)?.title || id\n const set = (next: string[]) => onChange({ ...value, documents: next })\n const toggle = (id: string) =>\n set(ids.includes(id) ? ids.filter((d) => d !== id) : [...ids, id].slice(-max))\n const offered = useMemo(\n () => (field.accept === 'image' ? documents.filter((d) => d.isImage) : documents),\n [documents, field.accept]\n )\n\n // A file added from here is chosen as soon as the workspace lists it, even while it processes.\n const awaitingAdd = useRef(false)\n const known = useRef<Set<string> | null>(null)\n const latest = useRef({ ids, set })\n latest.current = { ids, set }\n useEffect(() => {\n if (!loaded) return\n const current = new Set(documents.map((d) => d.id))\n const before = known.current\n known.current = current\n if (!before || !awaitingAdd.current) return\n const fresh = [...current].filter((id) => !before.has(id))\n if (fresh.length === 0) return\n awaitingAdd.current = false\n latest.current.set([...latest.current.ids, ...fresh].slice(-max))\n }, [documents, loaded, max])\n\n const addFiles = (files?: File[]) => {\n if (!onAddFiles) return\n awaitingAdd.current = true\n onAddFiles(files?.length ? files : undefined)\n }\n const dropProps = onAddFiles\n ? {\n onDragOver: (e: DragEvent) => {\n e.preventDefault()\n setIsOver(true)\n },\n onDragLeave: () => setIsOver(false),\n onDrop: (e: DragEvent) => {\n e.preventDefault()\n setIsOver(false)\n const files = Array.from(e.dataTransfer?.files ?? [])\n if (files.length) addFiles(files)\n },\n }\n : {}\n const dropClass = isOver ? 'ring-2 ring-primary' : ''\n const addButton = (className?: string, variant: 'outline' | 'default' = 'outline') =>\n onAddFiles && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={variant}\n className={className}\n disabled={adding}\n onClick={() => addFiles()}\n data-testid=\"workflow-add-files\"\n >\n {adding ? l.adding : l.addFiles}\n </Button>\n )\n\n // Nothing in the workspace yet: say so, and offer the upload (or a drop) right here.\n if (loaded && documents.length === 0) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center gap-2 rounded-lg border border-dashed border-border bg-muted/40 px-4 py-6 text-center',\n dropClass\n )}\n data-testid=\"workflow-documents-empty\"\n {...dropProps}\n >\n <FolderPlus className=\"size-5 text-muted-foreground\" aria-hidden />\n <p className=\"text-sm text-muted-foreground\">{l.empty}</p>\n {addButton(undefined, 'default')}\n </div>\n )\n }\n\n const pending = ids.flatMap((id) => {\n const status = docOf(id)?.status\n return isReady(status)\n ? []\n : [{ id, label: l.status[String(status).toLowerCase()] ?? String(status) }]\n })\n const selected = multiple ? undefined : docOf(ids[0] ?? '')\n\n return (\n <div\n className={cn('flex flex-col gap-3 rounded-lg', dropClass)}\n data-testid={`workflow-documents-${field.name}`}\n {...dropProps}\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0 flex-1\">\n <DocumentPicker\n // A run has no conversation: one list of every file.\n groups={[{ id: 'all', heading: l.allDocuments, docs: [...offered].sort(byTitle) }]}\n value={multiple ? '' : (ids[0] ?? '')}\n onValueChange={(id) => (multiple ? toggle(id) : set([id]))}\n selected={selected}\n selectedIds={multiple ? ids : undefined}\n labels={{ placeholder: field.placeholder ?? (multiple ? l.pickMany : l.pickOne) }}\n />\n </div>\n {addButton('shrink-0 pointer-coarse:h-11')}\n </div>\n {pending.map((p) => (\n <p\n key={p.id}\n className=\"text-xs text-muted-foreground\"\n data-testid={`workflow-document-status-${p.id}`}\n >\n {l.pending(nameOf(p.id), p.label)}\n </p>\n ))}\n {multiple && ids.length > 0 && (\n <div\n className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\"\n data-testid=\"workflow-documents-gallery\"\n >\n {ids.map((id) => {\n const thumbnail = thumbnailOf?.(id)\n return (\n <figure\n key={id}\n className=\"relative overflow-hidden rounded-lg border border-border bg-muted/40\"\n data-testid={`workflow-document-${id}`}\n >\n {thumbnail ? (\n <img\n src={thumbnail}\n alt={nameOf(id)}\n className=\"aspect-square w-full object-cover\"\n />\n ) : (\n <div className=\"flex aspect-square w-full items-center justify-center text-muted-foreground/50\">\n <ImageIcon className=\"size-8\" />\n </div>\n )}\n <figcaption className=\"truncate bg-background/90 px-2 py-1 text-xs text-muted-foreground\">\n {nameOf(id)}\n </figcaption>\n <button\n type=\"button\"\n onClick={() => toggle(id)}\n aria-label={l.remove(nameOf(id))}\n className=\"absolute right-1 top-1 flex size-6 items-center justify-center rounded-full bg-background/80 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n data-testid={`workflow-document-remove-${id}`}\n >\n <X className=\"size-3.5\" />\n </button>\n </figure>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import { UserEntity, getEntityColorStyles } from '@arbidocs/react/ui'\nimport { initials } from '../../lib/format'\n\n/** A person (or agent) as the table shows them. */\nexport interface TaskPerson {\n /** The user's external id; absent when the person is not known (the pill then reads as their label). */\n id?: string | null\n label: string\n /** The viewer: shown as \"You\" by the host's pill, and as the label here. */\n isMe?: boolean\n isAgent?: boolean\n}\n\nexport interface PersonPillProps {\n person: TaskPerson\n size?: 'xs' | 'sm' | 'md' | 'lg'\n testId?: string\n}\n\n/**\n * A person as the app's own user pill: the same avatar, initials and tint as everywhere else. This is\n * the default; a host that knows more (presence, a direct-message click, the rich tooltip) hands the\n * table its own `renderPerson` instead.\n */\nexport function PersonPill({ person, size = 'sm', testId }: PersonPillProps) {\n return (\n <span data-testid={testId} className=\"inline-flex min-w-0\">\n <UserEntity\n variant=\"pill\"\n size={size}\n interactive={false}\n showTooltip={false}\n initials={initials(person.label)}\n displayName={person.label}\n avatarStyle={person.id ? getEntityColorStyles(person.id) : undefined}\n isAgent={person.isAgent}\n isMe={person.isMe}\n />\n </span>\n )\n}\n","import { Bell, Clock, Link2, MousePointerClick } from 'lucide-react'\nimport { testIdOr } from '../../chat/test-id'\nimport type { WorkflowTriggerType } from './taskLabels'\n\nexport interface TaskTriggerChipLabels {\n /** \"After “X” is done\" — the workflow waits on a task. */\n after: (taskName: string) => string\n /** The workflow waits on a task that is not visible to the viewer. */\n afterUnknown: string\n /** No trigger: it runs when someone presses Run. */\n onDemand: string\n}\n\nexport const DEFAULT_TASK_TRIGGER_CHIP_LABELS: TaskTriggerChipLabels = {\n after: (name) => `After “${name}” is done`,\n afterUnknown: 'After another task is done',\n onDemand: 'Manual',\n}\n\nexport interface TaskTriggerChipProps {\n /** Workflow id: keys the test id (`task-trigger-{id}`). */\n id: string\n triggerType: WorkflowTriggerType\n /** Host-formatted summary for time and event triggers (\"Every weekday at 9:00\", \"On document uploaded\"). */\n summary: string\n /** Set when this workflow waits on a task; the name it shows (or undefined if not visible). */\n afterTaskId?: string | null\n afterTaskName?: string\n testId?: string\n labels?: Partial<TaskTriggerChipLabels>\n}\n\nfunction TriggerIcon({ type, chained }: { type: WorkflowTriggerType; chained: boolean }) {\n const cls = 'size-3.5 shrink-0 text-muted-foreground'\n if (chained) return <Link2 className={cls} aria-hidden />\n switch (type) {\n case 'on_demand':\n return <MousePointerClick className={cls} aria-hidden />\n case 'recurring':\n return <Clock className={cls} aria-hidden />\n case 'event':\n return <Bell className={cls} aria-hidden />\n default:\n return <Clock className={cls} aria-hidden />\n }\n}\n\n/** What starts a workflow, in one line: a time, a repeat, an event, or a task finishing. */\nexport function TaskTriggerChip({\n id,\n triggerType,\n summary,\n afterTaskId,\n afterTaskName,\n testId,\n labels,\n}: TaskTriggerChipProps) {\n const l = { ...DEFAULT_TASK_TRIGGER_CHIP_LABELS, ...labels }\n const chained = Boolean(afterTaskId)\n const text = chained\n ? afterTaskName\n ? l.after(afterTaskName)\n : l.afterUnknown\n : triggerType === 'on_demand'\n ? l.onDemand\n : summary\n return (\n <span\n className=\"inline-flex min-w-0 max-w-full items-center gap-1.5 text-sm font-normal text-foreground\"\n data-testid={testIdOr(testId, { testId: `task-trigger-${id}` })}\n data-trigger={chained ? 'task' : triggerType}\n >\n <TriggerIcon type={triggerType} chained={chained} />\n <span className=\"truncate\">{text}</span>\n </span>\n )\n}\n","import type { WorkflowTriggerType } from './taskLabels'\n\n/**\n * A row of the Workflows table: a saved workflow, or a skill (a virtual row: skills are global, not in\n * the workflows table, and run on demand). Callers' richer types (`WorkflowResponse`) are accepted as-is.\n */\nexport interface WorkflowListRow {\n external_id: string\n name: string\n /** `skill` for a skill row; anything else is a saved workflow. */\n kind?: 'workflow' | 'skill' | null\n description?: string | null\n /** Active: the trigger can start it. A spent one-shot pauses itself. Skills ignore it. */\n active: boolean\n /** Shared with the workspace's members (false = private to its owner). */\n shared?: boolean | null\n rrule?: string | null\n run_at?: string | null\n event_kind?: string | null\n after_conversation_ext_id?: string | null\n /** No trigger of its own: it only runs when someone presses Run. */\n on_demand?: boolean | null\n action?: { type: string } | null\n prompt?: string | null\n skill_ref?: string | null\n /** A stepped workflow's plan: its named steps (agent, person, action, …). */\n plan?: { goal?: string | null; steps?: readonly unknown[] | null } | null\n agent_ext_id?: string | null\n last_fired_at?: string | null\n next_fire_at?: string | null\n last_run_status?: string | null\n last_error?: string | null\n /** False for a teammate's shared workflow: they can see it, but not change who sees it or delete it. */\n is_owner?: boolean | null\n owner_ext_id?: string | null\n /** The user who created it (for the creator-or-workspace-owner rule). */\n created_by_ext_id?: string | null\n}\n\nexport type WorkflowStatusKey = 'active' | 'paused' | 'on_demand'\n\nexport const isSkillRow = (row: WorkflowListRow): boolean => row.kind === 'skill'\n\n/** How many named steps a stepped workflow has (0: a single prompt, skill or reminder). */\nexport const workflowStepCount = (row: WorkflowListRow): number => row.plan?.steps?.length ?? 0\n\n/** Does it start by itself (a time, a repeat, an event, or another task finishing)? */\nexport const hasTrigger = (row: WorkflowListRow): boolean =>\n !row.on_demand &&\n Boolean(row.rrule || row.run_at || row.event_kind || row.after_conversation_ext_id)\n\n/**\n * What a row is doing: a skill, or a workflow with no trigger of its own, only runs when someone presses\n * Run (`on_demand`, no on/off switch); one with a trigger is `active` or `paused`.\n */\nexport function workflowStatus(row: WorkflowListRow): WorkflowStatusKey {\n if (isSkillRow(row) || !hasTrigger(row)) return 'on_demand'\n return row.active ? 'active' : 'paused'\n}\n\n/** What starts a workflow: another task being done, an event, a repeat, a single moment, or nothing. */\nexport function workflowTriggerType(workflow: WorkflowListRow): WorkflowTriggerType {\n if (workflow.on_demand) return 'on_demand'\n if (workflow.after_conversation_ext_id) return 'after'\n if (workflow.event_kind) return 'event'\n if (workflow.rrule) return 'recurring'\n if (workflow.run_at) return 'one_time'\n return 'on_demand'\n}\n\n/** Execution results are independent of an automation's Active/Paused state. */\nexport function workflowRunStatusLabel(status?: string | null): string {\n if (!status) return 'None'\n const labels: Record<string, string> = {\n completed: 'Success',\n success: 'Success',\n failed: 'Failed',\n running: 'In progress',\n awaiting_authorization: 'Awaiting access',\n }\n return labels[status] ?? status.replaceAll('_', ' ')\n}\n\n/**\n * The result to list for an automation: its stored run status corrected by the state of the thread\n * its last run produced. The stored status lags the thread: it can still say \"running\" once the\n * thread is done.\n */\nexport function listedRunStatus(\n status?: string | null,\n threadStatus?: string | null\n): string | null | undefined {\n if (threadStatus === 'done' && status === 'running') return 'completed'\n return status\n}\n","/**\n * Column definitions for the Workflows grid. Every column has an explicit `colId` (AG Grid persists\n * column state by id: see CLAUDE.md). The table supplies the cells that need behaviour through slots,\n * which must be stable functions so the definitions are built once.\n */\nimport type { ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { workflowStatus, type WorkflowListRow } from './workflowRows'\nimport type { WorkflowListLabels } from './workflowTableLabels'\n\nexport const WORKFLOW_COLUMN_ORDER = [\n 'name',\n 'trigger',\n 'last_run',\n 'result',\n 'status',\n 'shared',\n 'actions',\n] as const\n\nexport interface CreateWorkflowColumnsOptions<T extends WorkflowListRow> {\n labels: WorkflowListLabels\n renderName: (workflow: T) => ReactNode\n renderTrigger: (workflow: T) => ReactNode\n renderStatus: (workflow: T) => ReactNode\n renderShared: (workflow: T) => ReactNode\n renderLastRun: (workflow: T) => ReactNode\n renderResult: (workflow: T) => ReactNode\n renderActions: (workflow: T) => ReactNode\n /** Plain text of the trigger cell, for sorting and the clipboard. */\n getTriggerText: (workflow: T) => string\n}\n\nfunction cell<T extends WorkflowListRow>(render: (workflow: T) => ReactNode) {\n return (params: ICellRendererParams<T>): ReactNode => (params.data ? render(params.data) : null)\n}\n\nconst time = (iso?: string | null): number => (iso ? Date.parse(iso) : Number.POSITIVE_INFINITY)\n\nexport function createWorkflowColumns<T extends WorkflowListRow>(\n o: CreateWorkflowColumnsOptions<T>\n): ColDef<T>[] {\n const l = o.labels\n const base: Partial<ColDef<T>> = {\n sortable: false,\n cellStyle: { display: 'flex', alignItems: 'center' },\n }\n return [\n {\n ...base,\n colId: 'name',\n sortable: true,\n headerName: l.colName,\n flex: 3,\n minWidth: 210,\n valueGetter: (p) => p.data?.name.toLowerCase() ?? '',\n cellRenderer: cell(o.renderName),\n },\n {\n ...base,\n colId: 'trigger',\n headerName: l.colTrigger,\n flex: 2.4,\n minWidth: 185,\n valueGetter: (p) => (p.data ? o.getTriggerText(p.data) : ''),\n cellRenderer: cell(o.renderTrigger),\n },\n {\n ...base,\n colId: 'last_run',\n sortable: true,\n headerName: l.colLastRun,\n flex: 1.4,\n minWidth: 140,\n cellStyle: { display: 'flex', alignItems: 'center', padding: 0 },\n valueGetter: (p) => time(p.data?.last_fired_at),\n cellRenderer: cell(o.renderLastRun),\n },\n {\n ...base,\n colId: 'result',\n headerName: 'Result',\n width: 130,\n valueGetter: (p) => p.data?.last_run_status ?? '',\n cellStyle: { display: 'flex', alignItems: 'center', padding: 0 },\n cellRenderer: cell(o.renderResult),\n },\n {\n ...base,\n colId: 'status',\n sortable: true,\n headerName: l.colStatus,\n width: 120,\n valueGetter: (p) => (p.data ? workflowStatus(p.data) : ''),\n cellRenderer: cell(o.renderStatus),\n },\n {\n ...base,\n colId: 'shared',\n headerName: l.colShared,\n headerTooltip: l.shared,\n width: 96,\n cellStyle: { display: 'flex', alignItems: 'center', justifyContent: 'center' },\n valueGetter: (p) => p.data?.shared ?? false,\n cellRenderer: cell(o.renderShared),\n },\n {\n ...base,\n colId: 'actions',\n headerName: '',\n width: 180,\n minWidth: 180,\n cellStyle: { display: 'flex', alignItems: 'center', justifyContent: 'flex-end' },\n cellRenderer: cell(o.renderActions),\n },\n ]\n}\n","export interface WorkflowListLabels {\n colName: string\n colType: string\n colTrigger: string\n colAction: string\n colAgent: string\n colStatus: string\n colShared: string\n colLastRun: string\n colNextRun: string\n shared: string\n sharedOwnerOnly: string\n deleteOwnerOnly: string\n typeSkill: string\n typeWorkflow: string\n statusActive: string\n statusPaused: string\n statusOnDemand: string\n activeSwitch: (name: string) => string\n agent: string\n myAssistant: string\n me: string\n someone: string\n never: string\n none: string\n reminder: string\n /** What a stepped workflow does: its number of steps. */\n steps: (count: number) => string\n failed: string\n lastRunFailed: string\n openLastRun: string\n editWorkflow: string\n run: string\n runLater: string\n runNow: string\n runs: string\n delete: string\n moreActions: string\n searchLabel: string\n searchPlaceholder: string\n emptyTitle: string\n emptyMessage: string\n firstRun: string\n noMatches: string\n filterAll: string\n filterSkills: string\n filterWorkflows: string\n filterActive: string\n filterPaused: string\n makeActive: string\n makePaused: string\n selectAll: string\n selectWorkflow: (name: string) => string\n}\n\nexport const DEFAULT_WORKFLOW_LIST_LABELS: WorkflowListLabels = {\n colName: 'Name',\n colType: 'Type',\n colTrigger: 'When',\n colAction: 'What it does',\n colAgent: 'Agent',\n colStatus: 'Active',\n colShared: 'Shared',\n colLastRun: 'Last run',\n colNextRun: 'Next run',\n shared: 'Shared with the workspace',\n sharedOwnerOnly: 'Only the creator can change who can see this',\n deleteOwnerOnly: 'Only the creator or workspace owner can delete this',\n typeSkill: 'Skill',\n typeWorkflow: 'Workflow',\n statusActive: 'Active',\n statusPaused: 'Inactive',\n statusOnDemand: 'On demand',\n activeSwitch: (name) => `Active: “${name}”`,\n agent: 'Agent',\n myAssistant: 'My assistant',\n me: 'Me',\n someone: 'Someone',\n never: 'Never',\n none: '—',\n reminder: 'Reminder',\n steps: (count) => `Workflow · ${count} ${count === 1 ? 'step' : 'steps'}`,\n failed: 'Failed',\n lastRunFailed: 'Last run failed',\n openLastRun: 'Open the task this run created',\n editWorkflow: 'Edit',\n run: 'Run',\n runLater: 'Run later',\n runNow: 'Run now',\n runs: 'Runs',\n delete: 'Delete',\n moreActions: 'More actions',\n searchLabel: 'Search workflows',\n searchPlaceholder: 'Search workflows and skills…',\n emptyTitle: 'Nothing to run yet',\n emptyMessage: 'Skills and workflows you can run will appear here.',\n firstRun: 'Run a skill now, or choose Run later to save it as a workflow that runs on its own.',\n noMatches: 'Nothing in this view.',\n filterAll: 'All',\n filterSkills: 'Skills',\n filterWorkflows: 'Workflows',\n filterActive: 'Active',\n filterPaused: 'Inactive',\n makeActive: 'Make active',\n makePaused: 'Deactivate',\n selectAll: 'Select all',\n selectWorkflow: (name) => `Select ${name}`,\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { GridApi } from 'ag-grid-community'\nimport { History, MoreHorizontal, Pencil, Play, Trash2, Workflow } from 'lucide-react'\nimport {\n Button,\n badgeVariants,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Switch,\n VisibilityToggle,\n cn,\n} from '@arbidocs/react/ui'\nimport { TabHeader, type Tab } from '../../shell/TabHeader'\nimport { FilterInput } from '../../shell/FilterInput'\nimport { TriStateFilterMenu, type TriState } from '../../settings/TriStateFilterMenu'\nimport { EmptyState } from '../../components/EmptyState'\nimport { GridView } from '../../files/GridView'\nimport { SelectionBar, SelectionBarAction } from '../../files/SelectionBar'\nimport { testIdOr } from '../../chat/test-id'\nimport { PersonPill, type TaskPerson } from './PersonPill'\nimport { TaskTriggerChip, type TaskTriggerChipLabels } from './TaskTriggerChip'\nimport { createWorkflowColumns } from './workflowColumns'\nimport {\n hasTrigger,\n isSkillRow,\n workflowStatus,\n listedRunStatus,\n workflowRunStatusLabel,\n workflowStepCount,\n workflowTriggerType,\n type WorkflowListRow,\n} from './workflowRows'\nimport { DEFAULT_WORKFLOW_LIST_LABELS, type WorkflowListLabels } from './workflowTableLabels'\n\nexport interface WorkflowsTableProps<T extends WorkflowListRow> {\n /** Everything the viewer can run: saved workflows, and skills as virtual rows (`kind: 'skill'`). */\n workflows: T[]\n isLoading?: boolean\n /** This page contains saved automations only; skills stay in their own library. */\n automationsOnly?: boolean\n /** Human summary of when a workflow starts (\"Every weekday at 9:00\", \"On document uploaded\"). */\n describeTrigger: (workflow: T) => string\n /** Friendly display of an ISO timestamp. */\n formatDate: (iso: string) => string\n /** Pause or resume a workflow that starts by itself (an on-demand one has no switch). */\n onToggleActive: (workflow: T, active: boolean) => void\n /** Share a workflow with the workspace or make it private (the toggle appears with it). */\n onToggleShared?: (workflow: T, shouldShare: boolean) => void\n /** Open the workflow in the composer (workflow-edit mode). */\n onEdit: (workflow: T) => void\n /**\n * Run it. A saved workflow just runs (its inputs are stored); a skill needs its inputs, so the host\n * opens the run dialog with that skill selected.\n */\n onRun: (row: T) => void\n /** Run a skill later: the run dialog, on its schedule view. Offered on skill rows. */\n onRunLater?: (skill: T) => void\n onDelete: (workflow: T) => void\n /** Show the tasks this workflow created. */\n onViewRuns?: (workflow: T) => void\n /** Click on a row (not on one of its controls): a skill's detail, a workflow's editor. */\n onOpenRow?: (row: T) => void\n /** Open the task a workflow's last run created. */\n onOpenThread?: (conversationId: string) => void\n /** Each workflow's latest run: the newest task it created, by workflow id. */\n /** Each automation's latest run thread, with that thread's status (it corrects a lagging result). */\n lastRuns?: Record<string, { conversationId: string; at: string; threadStatus?: string | null }>\n /** Bulk actions on the selected workflows (skills are skipped). */\n onDeleteMany?: (workflows: T[]) => void\n onToggleActiveMany?: (workflows: T[], active: boolean) => void\n /** Agent names by id, for the Agent column (falls back to \"Agent\"). */\n agentNames?: Record<string, string>\n /** Skill names by `skill_ref`, for the action cell (falls back to the reference). */\n skillNames?: Record<string, string>\n /** Task names by id, for an \"after <task>\" trigger. */\n taskNames?: Record<string, string>\n /** How an agent appears in the Agent column; defaults to the app's user pill. */\n renderPerson?: (person: TaskPerson) => ReactNode\n /**\n * The viewer edits the workspace (owner or collaborator): they may then edit, pause, resume and run a\n * workflow shared with it. A guest leaves this off.\n */\n canEditShared?: boolean\n /** The viewer owns the workspace: with the creator, the only one who deletes a workflow. Who can see it stays the creator's alone. */\n isWorkspaceOwner?: boolean\n /** Workflow id with a request in flight: its row disables its controls. */\n busyId?: string | null\n tabs?: Tab[]\n activeTabId?: string\n onTabChange?: (id: string) => void\n content?: ReactNode\n header?: ReactNode\n gridId?: string\n labels?: Partial<WorkflowListLabels>\n triggerChipLabels?: Partial<TaskTriggerChipLabels>\n testId?: string\n}\n\ntype Filter = 'all' | 'skills' | 'workflows' | 'active' | 'paused'\nconst ROW_HEIGHT = 40\n\n/**\n * Everything the viewer can run, in one list: skills (they run on demand) and saved workflows (they start\n * on a date, a repeat, an event or after a task, or on demand). Each row has its type, when it starts, what\n * it does, who runs it, its status (Active or Paused with a switch; On demand has none), when it last ran\n * (linking to the task that run created) and runs next, and a visible Run. The same grid as every other\n * list in the app.\n */\nexport function WorkflowsTable<T extends WorkflowListRow>(props: WorkflowsTableProps<T>) {\n const { workflows, isLoading, busyId, header, testId } = props\n const l: WorkflowListLabels = { ...DEFAULT_WORKFLOW_LIST_LABELS, ...props.labels }\n const [filterStates, setFilterStates] = useState<Map<Filter, TriState>>(new Map())\n const [filterOpen, setFilterOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [selected, setSelected] = useState<T[]>([])\n const apiRef = useRef<GridApi<T> | null>(null)\n\n const q = query.trim().toLowerCase()\n const matches = (w: T) =>\n !q ||\n `${w.name} ${w.description ?? ''} ${w.prompt ?? ''} ${w.skill_ref ?? ''}`\n .toLowerCase()\n .includes(q)\n const inFilter = (w: T, f: Filter) =>\n f === 'all' ||\n (f === 'skills' && isSkillRow(w)) ||\n (f === 'workflows' && !isSkillRow(w)) ||\n (f === 'active' && workflowStatus(w) === 'active') ||\n (f === 'paused' && workflowStatus(w) === 'paused')\n const counts = useMemo(() => {\n const out = { all: 0, skills: 0, workflows: 0, active: 0, paused: 0 }\n for (const w of workflows) {\n if (!matches(w)) continue\n for (const f of Object.keys(out) as Filter[]) if (inFilter(w, f)) out[f] += 1\n }\n return out\n // matches/inFilter read only `q` and the row.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [workflows, q])\n const shown = useMemo(\n () =>\n workflows.filter((w) => {\n if (!matches(w)) return false\n for (const group of [\n ['skills', 'workflows'],\n ['active', 'paused'],\n ] as Filter[][]) {\n const included = group.filter((f) => filterStates.get(f) === 'include')\n if (included.length && !included.some((f) => inFilter(w, f))) return false\n if (group.some((f) => filterStates.get(f) === 'exclude' && inFilter(w, f))) return false\n }\n return true\n }),\n [workflows, filterStates, q]\n )\n\n const renderPerson = props.renderPerson ?? ((p: TaskPerson) => <PersonPill person={p} />)\n const actionText = (w: T): string => {\n if (w.action)\n return w.action.type === 'email_documents' ? 'Email latest documents' : 'AI Review'\n if (isSkillRow(w))\n return w.description || (w.skill_ref && props.skillNames?.[w.skill_ref]) || w.name\n if (w.skill_ref) return props.skillNames?.[w.skill_ref] ?? w.skill_ref\n // A stepped workflow runs its plan: it is no reminder, even with no prompt of its own.\n const steps = workflowStepCount(w)\n if (steps > 0) return w.prompt?.trim() || l.steps(steps)\n return w.prompt?.trim() || w.plan?.goal?.trim() || l.reminder\n }\n\n // The cells read the latest handlers and lookups through this ref, so the column definitions are\n // built once and an interaction never makes the grid rebuild them.\n const latest = useRef({ props, l, renderPerson, actionText })\n latest.current = { props, l, renderPerson, actionText }\n\n const columnDefs = useMemo(\n () =>\n createWorkflowColumns<T>({\n labels: l,\n getTriggerText: (w) =>\n isSkillRow(w) ? l.statusOnDemand : latest.current.props.describeTrigger(w),\n renderName: (w) => {\n const { l: lb } = latest.current\n const skill = isSkillRow(w)\n const text = skill\n ? latest.current.actionText(w)\n : w.description || latest.current.actionText(w)\n // A name made from the instruction is not said again under itself.\n const stem = w.name.replace(/…$/, '').trim()\n const about = text && text.trim() !== w.name.trim() && text.trim() !== stem ? text : ''\n return (\n <div className=\"min-w-0 leading-tight\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span\n className={cn(\n 'truncate text-sm font-normal',\n workflowStatus(w) === 'paused' && 'text-muted-foreground'\n )}\n data-testid={`workflow-name-${w.external_id}`}\n >\n {w.name}\n </span>\n {skill && (\n <span\n className=\"shrink-0 rounded-full border border-border px-1.5 text-[11px] text-muted-foreground\"\n data-testid={`workflow-type-${w.external_id}`}\n >\n {lb.typeSkill}\n </span>\n )}\n </span>\n {about && !latest.current.props.automationsOnly && (\n <p\n className=\"truncate text-xs text-muted-foreground\"\n data-testid={`workflow-action-${w.external_id}`}\n >\n {about}\n </p>\n )}\n </div>\n )\n },\n renderTrigger: (w) => {\n const { props: p } = latest.current\n const after = w.after_conversation_ext_id\n const skill = isSkillRow(w)\n return (\n <div className=\"min-w-0 leading-tight\">\n <TaskTriggerChip\n id={w.external_id}\n testId={`workflow-trigger-${w.external_id}`}\n triggerType={workflowTriggerType(w)}\n summary={skill ? '' : p.describeTrigger(w)}\n afterTaskId={after}\n afterTaskName={after ? p.taskNames?.[after] : undefined}\n labels={p.triggerChipLabels}\n />\n </div>\n )\n },\n renderStatus: (w) => {\n const { props: p, l: lb } = latest.current\n const canEdit = w.is_owner !== false || Boolean(p.canEditShared)\n return (\n <Switch\n checked={hasTrigger(w) && !isSkillRow(w) && Boolean(w.active)}\n disabled={!hasTrigger(w) || isSkillRow(w) || !canEdit || p.busyId === w.external_id}\n onCheckedChange={(next) => p.onToggleActive(w, next)}\n className=\"disabled:data-[state=unchecked]:bg-muted dark:disabled:data-[state=unchecked]:bg-muted\"\n aria-label={lb.activeSwitch(w.name)}\n data-testid={`workflow-active-${w.external_id}`}\n />\n )\n },\n renderShared: (w) => {\n const { props: p, l: lb } = latest.current\n if (!p.onToggleShared || isSkillRow(w)) return null\n // Who can see it is the creator's alone: unsharing hides it from everyone else.\n const isCreator = w.is_owner !== false\n return (\n <VisibilityToggle\n items={{ shared: w.shared ?? false }}\n onToggle={(share) => latest.current.props.onToggleShared?.(w, share)}\n disabled={!isCreator || p.busyId === w.external_id}\n disabledTooltip={lb.sharedOwnerOnly}\n showLabel={false}\n data-testid={`workflow-shared-${w.external_id}`}\n />\n )\n },\n renderLastRun: (w) => {\n const { props: p, l: lb } = latest.current\n const at = w.last_fired_at ?? p.lastRuns?.[w.external_id]?.at\n return (\n <button\n type=\"button\"\n className=\"h-full w-full truncate px-4 text-left text-sm hover:text-primary\"\n onClick={() => p.onViewRuns?.(w)}\n title=\"View run history\"\n data-testid={`workflow-last-run-${w.external_id}`}\n >\n {at ? p.formatDate(at) : lb.never}\n </button>\n )\n },\n renderResult: (w) => {\n const status = listedRunStatus(\n w.last_run_status,\n latest.current.props.lastRuns?.[w.external_id]?.threadStatus\n )\n const label = workflowRunStatusLabel(status)\n return (\n <button\n type=\"button\"\n onClick={() => latest.current.props.onViewRuns?.(w)}\n title=\"View run history\"\n className={cn(\n badgeVariants({ variant: 'outline' }),\n 'mx-4 cursor-pointer text-xs font-medium',\n status === 'failed'\n ? 'border-red-border bg-red-bg text-red-text hover:bg-red-bg/80'\n : status === 'completed' || status === 'success'\n ? 'border-green-border bg-green-bg text-green-text hover:bg-green-bg/80'\n : status\n ? 'border-primary/20 bg-primary/10 text-primary hover:bg-primary/15'\n : 'border-border bg-muted text-muted-foreground hover:bg-muted/80'\n )}\n data-testid={`workflow-result-${w.external_id}`}\n >\n {label}\n </button>\n )\n },\n renderActions: (w) => {\n const { props: p, l: lb } = latest.current\n const id = w.external_id\n const skill = isSkillRow(w)\n const busy = p.busyId === id\n const isOwner = w.is_owner !== false\n const canEdit = isOwner || Boolean(p.canEditShared)\n const canAdmin = isOwner || Boolean(p.isWorkspaceOwner)\n return (\n <div className=\"flex items-center justify-end gap-1\">\n {(skill || canEdit) && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-8 gap-1.5 pointer-coarse:h-11\"\n disabled={busy}\n onClick={() => p.onRun(w)}\n data-testid={`workflow-run-btn-${id}`}\n >\n <Play className=\"size-3.5\" aria-hidden />\n {lb.run}\n </Button>\n )}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 pointer-coarse:size-11\"\n aria-label={lb.moreActions}\n data-testid={`workflow-menu-${id}`}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {skill && p.onRunLater && (\n <DropdownMenuItem\n onSelect={() => p.onRunLater?.(w)}\n data-testid={`workflow-run-later-${id}`}\n >\n <History className=\"mr-2 size-4\" aria-hidden />\n {lb.runLater}\n </DropdownMenuItem>\n )}\n {!skill && canEdit && (\n <DropdownMenuItem\n onSelect={() => p.onEdit(w)}\n data-testid={`workflow-edit-${id}`}\n >\n <Pencil className=\"mr-2 size-4\" aria-hidden />\n {lb.editWorkflow}\n </DropdownMenuItem>\n )}\n {!skill && p.onViewRuns && (\n <DropdownMenuItem\n onSelect={() => p.onViewRuns?.(w)}\n data-testid={`workflow-runs-${id}`}\n >\n <History className=\"mr-2 size-4\" aria-hidden />\n {lb.runs}\n </DropdownMenuItem>\n )}\n {!skill && canEdit && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n disabled={busy || !canAdmin}\n onSelect={() => p.onDelete(w)}\n title={canAdmin ? undefined : lb.deleteOwnerOnly}\n className=\"text-destructive focus:text-destructive\"\n data-testid={`workflow-delete-${id}`}\n >\n <Trash2 className=\"mr-2 size-4\" aria-hidden />\n {lb.delete}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n },\n }),\n // Stable on purpose: only the header texts rebuild the columns (see `latest`).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n l.colName,\n l.colType,\n l.colTrigger,\n l.colAction,\n l.colAgent,\n l.colStatus,\n l.colShared,\n l.shared,\n l.colLastRun,\n l.colNextRun,\n ]\n )\n\n // A change in the lookups the cells draw from redraws them once.\n useEffect(() => {\n apiRef.current?.refreshCells({ force: true })\n }, [\n busyId,\n props.agentNames,\n props.skillNames,\n props.taskNames,\n props.lastRuns,\n props.renderPerson,\n props.labels,\n props.canEditShared,\n props.isWorkspaceOwner,\n ])\n\n const mine = selected.filter((w) => !isSkillRow(w))\n const adminSelected = mine.filter((w) => w.is_owner !== false || props.isWorkspaceOwner)\n const editableSelected = mine.filter(\n (w) => hasTrigger(w) && (w.is_owner !== false || props.canEditShared)\n )\n const clearSelection = () => setSelected([])\n\n return (\n <div\n className=\"flex min-h-0 flex-1 flex-col\"\n data-testid={testIdOr(testId, { testId: 'workflow-list' })}\n >\n <TabHeader\n testId=\"automations-tab-header\"\n tabs={[\n {\n id: 'automations',\n label: '',\n count: shown.length,\n countIcon: <Workflow className=\"size-3.5\" />,\n countPlacement: 'leading',\n presentation: 'count',\n hasActiveFilters: !!q || [...filterStates.values()].some(Boolean),\n },\n ...(props.tabs ?? []),\n ]}\n activeTabId={props.activeTabId ?? 'automations'}\n onTabChange={props.onTabChange ?? (() => {})}\n firstTabContent={\n <FilterInput\n value={query}\n onChange={setQuery}\n fields={['text']}\n onFieldsChange={() => {}}\n hideFieldPicker\n ariaLabel={l.searchLabel}\n testIds={{ input: 'workflow-search' }}\n filter={\n <TriStateFilterMenu\n testId=\"automations-filter-button\"\n open={filterOpen}\n onOpenChange={setFilterOpen}\n filterStates={filterStates}\n onFiltersChange={setFilterStates}\n triggerClassName=\"flex h-5 items-center gap-0.5 rounded px-1 text-muted-foreground hover:text-foreground pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center\"\n renderChevron\n disableHoverOpen\n options={[\n ...(!props.automationsOnly\n ? [\n { id: 'skills' as const, label: l.filterSkills, count: counts.skills },\n {\n id: 'workflows' as const,\n label: l.filterWorkflows,\n count: counts.workflows,\n },\n ]\n : []),\n { id: 'active', label: l.filterActive, count: counts.active },\n { id: 'paused', label: l.filterPaused, count: counts.paused },\n ]}\n />\n }\n />\n }\n rightContent={header}\n />\n {props.content ? (\n props.content\n ) : workflows.length === 0 && !isLoading ? (\n <EmptyState\n icon={Workflow}\n title={l.emptyTitle}\n description={l.emptyMessage}\n testId=\"workflow-list-empty\"\n />\n ) : (\n <div className=\"min-h-0 flex-1\">\n <GridView<T>\n testId=\"workflow-grid\"\n gridId={props.gridId ?? 'workflows-grid-v2'}\n items={shown}\n columnDefs={columnDefs}\n getItemId={(w) => w.external_id}\n getRowTestId={(w) => `workflow-row-${w.external_id}`}\n isLoading={isLoading}\n showEmpty={shown.length === 0}\n emptyState={{ title: l.noMatches }}\n rowHeight={ROW_HEIGHT}\n height=\"100%\"\n onGridReady={({ api }) => {\n apiRef.current = api\n }}\n onRowClick={(row) => props.onOpenRow?.(row)}\n selection={{ mode: 'multiple', selected, onSelectionChange: setSelected }}\n gridOptions={GRID_OPTIONS as never}\n />\n </div>\n )}\n {!props.content && (\n <SelectionBar count={selected.length} onClear={clearSelection}>\n {(isCompact) => (\n <>\n {props.onToggleActiveMany && (\n <>\n <SelectionBarAction\n icon={Play}\n label={l.makeActive}\n onClick={() => {\n props.onToggleActiveMany?.(editableSelected, true)\n clearSelection()\n }}\n disabled={editableSelected.length === 0}\n isCompact={isCompact}\n testId=\"workflow-bulk-activate\"\n />\n <SelectionBarAction\n icon={Workflow}\n label={l.makePaused}\n onClick={() => {\n props.onToggleActiveMany?.(editableSelected, false)\n clearSelection()\n }}\n disabled={editableSelected.length === 0}\n isCompact={isCompact}\n testId=\"workflow-bulk-pause\"\n />\n </>\n )}\n {props.onDeleteMany && (\n <SelectionBarAction\n icon={Trash2}\n label={l.delete}\n onClick={() => {\n props.onDeleteMany?.(adminSelected)\n clearSelection()\n }}\n disabled={adminSelected.length === 0}\n isCompact={isCompact}\n className=\"border-red-border text-red-text hover:bg-red-bg hover:text-red-text\"\n testId=\"workflow-bulk-delete\"\n />\n )}\n </>\n )}\n </SelectionBar>\n )}\n </div>\n )\n}\n\nconst GRID_OPTIONS = { suppressClickEdit: true }\n"]}
|