@arbidocs/blocks 0.5.119 → 0.5.120
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/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs → ConnectedNativeDocxComparison-SGE4R3M4.cjs} +6 -6
- package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs.map → ConnectedNativeDocxComparison-SGE4R3M4.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs → ConnectedStreamedWordArtifact-6MCLJRIT.cjs} +6 -6
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs.map → ConnectedStreamedWordArtifact-6MCLJRIT.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-BPIAJJED.cjs} +14 -14
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs.map → DocumentReviewCard-BPIAJJED.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-6UKR5WEF.cjs → FilesViewerDialog-67WK3TZC.cjs} +11 -11
- package/dist/{FilesViewerDialog-6UKR5WEF.cjs.map → FilesViewerDialog-67WK3TZC.cjs.map} +1 -1
- package/dist/agents/index.cjs +185 -185
- package/dist/agents/tasks/ConversationListView.js +10 -2
- package/dist/agents/tasks/ConversationListView.js.map +2 -2
- package/dist/agents/tasks/TaskTable.js +5 -4
- package/dist/agents/tasks/TaskTable.js.map +2 -2
- package/dist/agents/tasks/WorkflowsTable.js +4 -5
- package/dist/agents/tasks/WorkflowsTable.js.map +2 -2
- package/dist/agents/tasks/taskColumns.js +1 -1
- package/dist/agents/tasks/taskColumns.js.map +1 -1
- package/dist/agents/tasks/taskTableLabels.js +1 -1
- package/dist/agents/tasks/taskTableLabels.js.map +1 -1
- package/dist/agents/tasks/workflowTableLabels.js +1 -1
- package/dist/agents/tasks/workflowTableLabels.js.map +1 -1
- package/dist/{chunk-P77YTTJ3.cjs → chunk-3GWWOYGS.cjs} +4 -4
- package/dist/{chunk-P77YTTJ3.cjs.map → chunk-3GWWOYGS.cjs.map} +1 -1
- package/dist/{chunk-HB2O4THB.cjs → chunk-5IZFSAEZ.cjs} +4 -4
- package/dist/{chunk-HB2O4THB.cjs.map → chunk-5IZFSAEZ.cjs.map} +1 -1
- package/dist/{chunk-DDIW4HLU.cjs → chunk-775S43W7.cjs} +19 -10
- package/dist/chunk-775S43W7.cjs.map +1 -0
- package/dist/{chunk-Y24V6HPR.cjs → chunk-BP3IJ34D.cjs} +4 -4
- package/dist/{chunk-Y24V6HPR.cjs.map → chunk-BP3IJ34D.cjs.map} +1 -1
- package/dist/{chunk-TT4IF52H.cjs → chunk-BUVIBHFU.cjs} +37 -38
- package/dist/chunk-BUVIBHFU.cjs.map +1 -0
- package/dist/{chunk-OEREKAAP.cjs → chunk-CKCG4NDB.cjs} +8 -8
- package/dist/{chunk-OEREKAAP.cjs.map → chunk-CKCG4NDB.cjs.map} +1 -1
- package/dist/{chunk-YGXOKB5Z.cjs → chunk-DFBDQKGE.cjs} +4 -4
- package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-DFBDQKGE.cjs.map} +1 -1
- package/dist/{chunk-VGCTYTEW.cjs → chunk-ECLUFKYR.cjs} +4 -4
- package/dist/{chunk-VGCTYTEW.cjs.map → chunk-ECLUFKYR.cjs.map} +1 -1
- package/dist/{chunk-CPG7II4E.cjs → chunk-HA66DHW6.cjs} +28 -28
- package/dist/{chunk-CPG7II4E.cjs.map → chunk-HA66DHW6.cjs.map} +1 -1
- package/dist/{chunk-57NHXEU2.cjs → chunk-MXBXZXXQ.cjs} +5 -5
- package/dist/{chunk-57NHXEU2.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
- package/dist/{chunk-NNUK5ZM7.cjs → chunk-NLSWDP42.cjs} +9 -17
- package/dist/chunk-NLSWDP42.cjs.map +1 -0
- package/dist/{chunk-B2HNNG25.cjs → chunk-Q6CLWOP2.cjs} +29 -29
- package/dist/{chunk-B2HNNG25.cjs.map → chunk-Q6CLWOP2.cjs.map} +1 -1
- package/dist/{chunk-R7CJEIA5.cjs → chunk-QQWHG3KF.cjs} +5 -6
- package/dist/chunk-QQWHG3KF.cjs.map +1 -0
- package/dist/{chunk-VLCY46K6.cjs → chunk-TG2GM7WJ.cjs} +4 -3
- package/dist/chunk-TG2GM7WJ.cjs.map +1 -0
- package/dist/{chunk-QHOHDNBU.cjs → chunk-VZCPMXWC.cjs} +4 -4
- package/dist/{chunk-QHOHDNBU.cjs.map → chunk-VZCPMXWC.cjs.map} +1 -1
- package/dist/{chunk-NIE3N6OM.cjs → chunk-W6INT5GS.cjs} +5 -5
- package/dist/{chunk-NIE3N6OM.cjs.map → chunk-W6INT5GS.cjs.map} +1 -1
- package/dist/{chunk-ZPPMAL5P.cjs → chunk-WQMR3O2D.cjs} +6 -10
- package/dist/chunk-WQMR3O2D.cjs.map +1 -0
- package/dist/{chunk-SB4M3ITT.cjs → chunk-X36UR4A7.cjs} +173 -56
- package/dist/chunk-X36UR4A7.cjs.map +1 -0
- package/dist/{chunk-XKVPSOKP.cjs → chunk-YYSBWMDJ.cjs} +4 -4
- package/dist/{chunk-XKVPSOKP.cjs.map → chunk-YYSBWMDJ.cjs.map} +1 -1
- package/dist/collaboration/index.cjs +3 -3
- package/dist/collaboration/sharing/ShareControl.js +10 -2
- package/dist/collaboration/sharing/ShareControl.js.map +2 -2
- package/dist/components/SharedCell.d.ts +2 -4
- package/dist/components/SharedCell.js +4 -8
- package/dist/components/SharedCell.js.map +2 -2
- package/dist/connect/docx.cjs +9 -9
- package/dist/connect/index.cjs +595 -567
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/viewer.cjs +9 -9
- package/dist/connection/facts/factPageColumns.js +3 -9
- package/dist/connection/facts/factPageColumns.js.map +2 -2
- package/dist/connection/files/grid/cells.js +1 -3
- package/dist/connection/files/grid/cells.js.map +2 -2
- package/dist/connection/files/grid/documentColumns.js +3 -2
- package/dist/connection/files/grid/documentColumns.js.map +2 -2
- package/dist/connection/sharing/WorkspaceMembersList.d.ts +4 -0
- package/dist/connection/sharing/WorkspaceMembersList.js +34 -0
- package/dist/connection/sharing/WorkspaceMembersList.js.map +7 -0
- package/dist/connection/shell/ConnectedAppShell.js +4 -0
- package/dist/connection/shell/ConnectedAppShell.js.map +2 -2
- package/dist/connection/viewer/ConnectedDocumentViewer.js +3 -2
- package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
- package/dist/connection/viewer/ViewerPdfPane.js +20 -2
- package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
- package/dist/connection/viewer/pdf/PdfPassageHighlights.d.ts +12 -0
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js +36 -0
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js.map +7 -0
- package/dist/connection/viewer/pdf/passageHighlights.d.ts +26 -0
- package/dist/connection/viewer/pdf/passageHighlights.js +40 -0
- package/dist/connection/viewer/pdf/passageHighlights.js.map +7 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.d.ts +9 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +47 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +7 -0
- package/dist/connection/workflows/workflowsPageLabels.js +1 -1
- package/dist/connection/workflows/workflowsPageLabels.js.map +1 -1
- package/dist/embed/index.cjs +13 -13
- package/dist/facts/factColumns.js +3 -3
- package/dist/facts/factColumns.js.map +1 -1
- package/dist/facts/index.cjs +42 -42
- package/dist/files/HtmlViewerParts.js +7 -15
- package/dist/files/HtmlViewerParts.js.map +2 -2
- package/dist/files/index.cjs +223 -223
- package/dist/index.cjs +238 -238
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +24 -24
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/chunk-DDIW4HLU.cjs.map +0 -1
- package/dist/chunk-NNUK5ZM7.cjs.map +0 -1
- package/dist/chunk-R7CJEIA5.cjs.map +0 -1
- package/dist/chunk-SB4M3ITT.cjs.map +0 -1
- package/dist/chunk-TT4IF52H.cjs.map +0 -1
- package/dist/chunk-VLCY46K6.cjs.map +0 -1
- package/dist/chunk-ZPPMAL5P.cjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/agents/tasks/WorkflowsTable.tsx"],
|
|
4
|
-
"sourcesContent": ["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 WorkflowCatalogueSections,\n type WorkflowCatalogueLabels,\n type WorkflowCatalogueRow,\n} from './WorkflowCatalogueSections'\nimport {\n hasTrigger,\n isScheduledWorkflow,\n isSkillRow,\n workflowStatus,\n listedRunStatus,\n workflowRunStatusLabel,\n workflowStepCount,\n workflowTriggerType,\n type WorkflowListRow,\n} from './workflowRows'\nimport {\n DEFAULT_WORKFLOW_CATALOGUE_LABELS,\n DEFAULT_WORKFLOW_LIST_LABELS,\n type WorkflowListLabels,\n} 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 /** Actions at the end of the tab row; a function is told when the row is narrow (a phone). */\n header?: ReactNode | ((isCompact: boolean) => ReactNode)\n gridId?: string\n labels?: Partial<WorkflowListLabels>\n triggerChipLabels?: Partial<TaskTriggerChipLabels>\n testId?: string\n /**\n * The host's catalogue: when it has entries, they are listed in sections by category (each\n * entry opens in the builder or runs), then the saved workflows. Absent or empty: the saved\n * workflows alone.\n */\n catalogue?: WorkflowCatalogueRow[]\n /** The order of the categories (and the ones shown). Absent: as the entries first name them. */\n categories?: string[]\n /** Open a catalogue entry in the builder, as a template. */\n onOpenTemplate?: (id: string) => void\n /** Run a catalogue entry. Absent: no Run on the entries. */\n onRunTemplate?: (id: string) => void\n /** Draws a catalogue entry's icon name. */\n renderIcon?: (icon: string) => ReactNode\n catalogueLabels?: Partial<WorkflowCatalogueLabels>\n}\n\ntype Filter = 'all' | 'skills' | 'workflows' | 'active' | 'paused' | 'scheduled'\n/** Each group narrows on its own: kinds, then states, then how it starts. */\nconst FILTER_GROUPS: Filter[][] = [['skills', 'workflows'], ['active', 'paused'], ['scheduled']]\nconst NO_CATALOGUE: WorkflowCatalogueRow[] = []\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 (f === 'scheduled' && !isSkillRow(w) && isScheduledWorkflow(w))\n const counts = useMemo(() => {\n const out = { all: 0, skills: 0, workflows: 0, active: 0, paused: 0, scheduled: 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 FILTER_GROUPS) {\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(/\u2026$/, '').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 // The category view: the catalogue (narrowed by the text filter; a state filter is about saved\n // workflows only, so it hides the catalogue), then the saved workflows.\n const byCategory = (props.catalogue?.length ?? 0) > 0\n const stateFiltered = [...filterStates.values()].some((state) => state === 'include')\n const catalogueLabels = { ...DEFAULT_WORKFLOW_CATALOGUE_LABELS, ...props.catalogueLabels }\n const catalogue = useMemo(\n () =>\n (props.catalogue ?? NO_CATALOGUE).filter(\n (row) => !q || `${row.title} ${row.description ?? ''}`.toLowerCase().includes(q)\n ),\n [props.catalogue, q]\n )\n const list =\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\n // The search box with its state filter: in the tab row, or (narrow) across a row of its own.\n const filterBox = (className?: string) => (\n <FilterInput\n className={className}\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 { id: 'scheduled', label: l.filterScheduled, count: counts.scheduled },\n ]}\n />\n }\n />\n )\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 // A narrow row (a phone) gives the filter a row of its own under the tabs, so the host's\n // tabs and the actions keep their room in the tab row.\n firstTabContent={(isCompact) => (isCompact ? null : filterBox())}\n belowContent={(isCompact) => (isCompact ? filterBox('w-full') : null)}\n rightContent={header}\n />\n {props.content ? (\n props.content\n ) : byCategory ? (\n <div\n className=\"min-h-0 flex-1 space-y-8 overflow-auto p-4\"\n data-testid=\"workflow-categories\"\n >\n {!stateFiltered && (\n <WorkflowCatalogueSections\n rows={catalogue}\n categories={props.categories}\n labels={catalogueLabels}\n renderIcon={props.renderIcon}\n onOpen={props.onOpenTemplate}\n onRun={props.onRunTemplate}\n />\n )}\n <section className=\"space-y-3\" data-testid=\"workflow-category-saved\">\n <h2 className=\"flex items-center gap-2 text-sm font-semibold text-foreground\">\n <Workflow className=\"size-4 text-primary\" aria-hidden /> {l.savedWorkflows}\n </h2>\n <div className=\"flex h-[min(32rem,70dvh)] min-h-64 flex-col\">{list}</div>\n </section>\n </div>\n ) : (\n list\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"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["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 cn,\n SharingEntity,\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 WorkflowCatalogueSections,\n type WorkflowCatalogueLabels,\n type WorkflowCatalogueRow,\n} from './WorkflowCatalogueSections'\nimport {\n hasTrigger,\n isScheduledWorkflow,\n isSkillRow,\n workflowStatus,\n listedRunStatus,\n workflowRunStatusLabel,\n workflowStepCount,\n workflowTriggerType,\n type WorkflowListRow,\n} from './workflowRows'\nimport {\n DEFAULT_WORKFLOW_CATALOGUE_LABELS,\n DEFAULT_WORKFLOW_LIST_LABELS,\n type WorkflowListLabels,\n} 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 /** Actions at the end of the tab row; a function is told when the row is narrow (a phone). */\n header?: ReactNode | ((isCompact: boolean) => ReactNode)\n gridId?: string\n labels?: Partial<WorkflowListLabels>\n triggerChipLabels?: Partial<TaskTriggerChipLabels>\n testId?: string\n /**\n * The host's catalogue: when it has entries, they are listed in sections by category (each\n * entry opens in the builder or runs), then the saved workflows. Absent or empty: the saved\n * workflows alone.\n */\n catalogue?: WorkflowCatalogueRow[]\n /** The order of the categories (and the ones shown). Absent: as the entries first name them. */\n categories?: string[]\n /** Open a catalogue entry in the builder, as a template. */\n onOpenTemplate?: (id: string) => void\n /** Run a catalogue entry. Absent: no Run on the entries. */\n onRunTemplate?: (id: string) => void\n /** Draws a catalogue entry's icon name. */\n renderIcon?: (icon: string) => ReactNode\n catalogueLabels?: Partial<WorkflowCatalogueLabels>\n}\n\ntype Filter = 'all' | 'skills' | 'workflows' | 'active' | 'paused' | 'scheduled'\n/** Each group narrows on its own: kinds, then states, then how it starts. */\nconst FILTER_GROUPS: Filter[][] = [['skills', 'workflows'], ['active', 'paused'], ['scheduled']]\nconst NO_CATALOGUE: WorkflowCatalogueRow[] = []\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 (f === 'scheduled' && !isSkillRow(w) && isScheduledWorkflow(w))\n const counts = useMemo(() => {\n const out = { all: 0, skills: 0, workflows: 0, active: 0, paused: 0, scheduled: 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 FILTER_GROUPS) {\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(/\u2026$/, '').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 <SharingEntity\n 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 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 // The category view: the catalogue (narrowed by the text filter; a state filter is about saved\n // workflows only, so it hides the catalogue), then the saved workflows.\n const byCategory = (props.catalogue?.length ?? 0) > 0\n const stateFiltered = [...filterStates.values()].some((state) => state === 'include')\n const catalogueLabels = { ...DEFAULT_WORKFLOW_CATALOGUE_LABELS, ...props.catalogueLabels }\n const catalogue = useMemo(\n () =>\n (props.catalogue ?? NO_CATALOGUE).filter(\n (row) => !q || `${row.title} ${row.description ?? ''}`.toLowerCase().includes(q)\n ),\n [props.catalogue, q]\n )\n const list =\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\n // The search box with its state filter: in the tab row, or (narrow) across a row of its own.\n const filterBox = (className?: string) => (\n <FilterInput\n className={className}\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 { id: 'scheduled', label: l.filterScheduled, count: counts.scheduled },\n ]}\n />\n }\n />\n )\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 // A narrow row (a phone) gives the filter a row of its own under the tabs, so the host's\n // tabs and the actions keep their room in the tab row.\n firstTabContent={(isCompact) => (isCompact ? null : filterBox())}\n belowContent={(isCompact) => (isCompact ? filterBox('w-full') : null)}\n rightContent={header}\n />\n {props.content ? (\n props.content\n ) : byCategory ? (\n <div\n className=\"min-h-0 flex-1 space-y-8 overflow-auto p-4\"\n data-testid=\"workflow-categories\"\n >\n {!stateFiltered && (\n <WorkflowCatalogueSections\n rows={catalogue}\n categories={props.categories}\n labels={catalogueLabels}\n renderIcon={props.renderIcon}\n onOpen={props.onOpenTemplate}\n onRun={props.onRunTemplate}\n />\n )}\n <section className=\"space-y-3\" data-testid=\"workflow-category-saved\">\n <h2 className=\"flex items-center gap-2 text-sm font-semibold text-foreground\">\n <Workflow className=\"size-4 text-primary\" aria-hidden /> {l.savedWorkflows}\n </h2>\n <div className=\"flex h-[min(32rem,70dvh)] min-h-64 flex-col\">{list}</div>\n </section>\n </div>\n ) : (\n list\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -43,7 +43,7 @@ function createTaskColumns(o) {
|
|
|
43
43
|
colId: "shared",
|
|
44
44
|
headerName: l.colShared,
|
|
45
45
|
headerTooltip: l.shared,
|
|
46
|
-
width:
|
|
46
|
+
width: 120,
|
|
47
47
|
cellStyle: { display: "flex", alignItems: "center", justifyContent: "center" },
|
|
48
48
|
valueGetter: (p) => p.data?.task.is_shared ?? false,
|
|
49
49
|
cellRenderer: cell(o.renderShared)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/agents/tasks/taskColumns.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Column definitions for the tasks grid. Every column has an\n * explicit `colId` (AG Grid persists column state by id: see CLAUDE.md). The table supplies behaviour and\n * the cells that need it through slots; the structure, widths and headers live here. The slots must be\n * stable functions (the table keeps the latest handlers behind them) so the definitions are built once\n * and the grid never refreshes its columns on a selection or expand.\n *\n * Every conversation is a task: Owner (who has the next step), due, shared, thread link,\n * status, outputs. Rows are `TaskGridRow`s: a task plus where it sits in the sub-task tree, so the\n * order is the tree's. A column's header still shows and reports the sort, but the grid's own sort is\n * a no-op (`keepOrder`): that would tear sub-tasks away from their parent, so the table sorts within\n * each level instead (see `buildTaskRows`).\n */\nimport type { ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport type { TaskGridRow, TaskListRow } from './taskRows'\nimport type { TaskListLabels } from './taskTableLabels'\n\n/** The actions column's width: Allow access and the menu (the widest row). */\nexport const ACTIONS_WIDTH = 160\nconst NARROW_ACTIONS_WIDTH = 56\n\nexport const TASK_COLUMN_ORDER = [\n 'name',\n 'owner',\n 'due',\n 'status',\n 'outputs',\n 'shared',\n 'actions',\n] as const\n\nexport interface CreateTaskColumnsOptions<T extends TaskListRow> {\n labels: TaskListLabels\n renderName: (row: TaskGridRow<T>) => ReactNode\n /** Who has the next step. */\n renderOwner: (row: TaskGridRow<T>) => ReactNode\n renderDue: (row: TaskGridRow<T>) => ReactNode\n renderShared: (row: TaskGridRow<T>) => ReactNode\n /** The documents the task generated. */\n renderOutputs: (row: TaskGridRow<T>) => ReactNode\n /** A phone-width grid: the actions column is just the menu. */\n narrow?: boolean\n /** Whether the Outputs column is shown: only worth the room once some task has outputs. */\n showOutputs?: boolean\n renderStatus: (row: TaskGridRow<T>) => ReactNode\n /** Who is in the thread (Threads view). */\n renderActions: (row: TaskGridRow<T>) => ReactNode\n /** Plain text of the owner cell, for sorting, filters and the clipboard. */\n getOwnerName: (row: TaskGridRow<T>) => string\n}\n\n/** Grid-side comparator that keeps the table's order: the table sorts each level itself. */\nconst keepOrder = () => 0\n\n/** Columns the user can sort by, per view. */\nexport type SortableTaskColumn = 'name' | 'owner' | 'due' | 'status' | 'updated' | 'messages'\n\n/** The cell renderer for a slot: a missing row (AG Grid's loading shell) renders nothing. */\nfunction cell<T extends TaskListRow>(render: (row: TaskGridRow<T>) => ReactNode) {\n return (params: ICellRendererParams<TaskGridRow<T>>): ReactNode =>\n params.data ? render(params.data) : null\n}\n\nexport function createTaskColumns<T extends TaskListRow>(\n o: CreateTaskColumnsOptions<T>\n): ColDef<TaskGridRow<T>>[] {\n const l = o.labels\n const sortable = {\n sortable: true,\n comparator: keepOrder,\n sortingOrder: ['asc' as const, 'desc' as const, null],\n }\n const base: Partial<ColDef<TaskGridRow<T>>> = {\n sortable: false,\n suppressMovable: true,\n // Keyboard focus lands on the name cell only (arrow keys expand and collapse sub-tasks there).\n suppressNavigable: true,\n cellStyle: { display: 'flex', alignItems: 'center' },\n }\n const name: ColDef<TaskGridRow<T>> = {\n ...base,\n colId: 'name',\n ...sortable,\n suppressNavigable: false,\n headerName: l.colTask,\n flex: 3,\n minWidth: 200,\n cellRenderer: cell(o.renderName),\n }\n const shared: ColDef<TaskGridRow<T>> = {\n ...base,\n colId: 'shared',\n headerName: l.colShared,\n headerTooltip: l.shared,\n width:
|
|
4
|
+
"sourcesContent": ["/**\n * Column definitions for the tasks grid. Every column has an\n * explicit `colId` (AG Grid persists column state by id: see CLAUDE.md). The table supplies behaviour and\n * the cells that need it through slots; the structure, widths and headers live here. The slots must be\n * stable functions (the table keeps the latest handlers behind them) so the definitions are built once\n * and the grid never refreshes its columns on a selection or expand.\n *\n * Every conversation is a task: Owner (who has the next step), due, shared, thread link,\n * status, outputs. Rows are `TaskGridRow`s: a task plus where it sits in the sub-task tree, so the\n * order is the tree's. A column's header still shows and reports the sort, but the grid's own sort is\n * a no-op (`keepOrder`): that would tear sub-tasks away from their parent, so the table sorts within\n * each level instead (see `buildTaskRows`).\n */\nimport type { ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport type { TaskGridRow, TaskListRow } from './taskRows'\nimport type { TaskListLabels } from './taskTableLabels'\n\n/** The actions column's width: Allow access and the menu (the widest row). */\nexport const ACTIONS_WIDTH = 160\nconst NARROW_ACTIONS_WIDTH = 56\n\nexport const TASK_COLUMN_ORDER = [\n 'name',\n 'owner',\n 'due',\n 'status',\n 'outputs',\n 'shared',\n 'actions',\n] as const\n\nexport interface CreateTaskColumnsOptions<T extends TaskListRow> {\n labels: TaskListLabels\n renderName: (row: TaskGridRow<T>) => ReactNode\n /** Who has the next step. */\n renderOwner: (row: TaskGridRow<T>) => ReactNode\n renderDue: (row: TaskGridRow<T>) => ReactNode\n renderShared: (row: TaskGridRow<T>) => ReactNode\n /** The documents the task generated. */\n renderOutputs: (row: TaskGridRow<T>) => ReactNode\n /** A phone-width grid: the actions column is just the menu. */\n narrow?: boolean\n /** Whether the Outputs column is shown: only worth the room once some task has outputs. */\n showOutputs?: boolean\n renderStatus: (row: TaskGridRow<T>) => ReactNode\n /** Who is in the thread (Threads view). */\n renderActions: (row: TaskGridRow<T>) => ReactNode\n /** Plain text of the owner cell, for sorting, filters and the clipboard. */\n getOwnerName: (row: TaskGridRow<T>) => string\n}\n\n/** Grid-side comparator that keeps the table's order: the table sorts each level itself. */\nconst keepOrder = () => 0\n\n/** Columns the user can sort by, per view. */\nexport type SortableTaskColumn = 'name' | 'owner' | 'due' | 'status' | 'updated' | 'messages'\n\n/** The cell renderer for a slot: a missing row (AG Grid's loading shell) renders nothing. */\nfunction cell<T extends TaskListRow>(render: (row: TaskGridRow<T>) => ReactNode) {\n return (params: ICellRendererParams<TaskGridRow<T>>): ReactNode =>\n params.data ? render(params.data) : null\n}\n\nexport function createTaskColumns<T extends TaskListRow>(\n o: CreateTaskColumnsOptions<T>\n): ColDef<TaskGridRow<T>>[] {\n const l = o.labels\n const sortable = {\n sortable: true,\n comparator: keepOrder,\n sortingOrder: ['asc' as const, 'desc' as const, null],\n }\n const base: Partial<ColDef<TaskGridRow<T>>> = {\n sortable: false,\n suppressMovable: true,\n // Keyboard focus lands on the name cell only (arrow keys expand and collapse sub-tasks there).\n suppressNavigable: true,\n cellStyle: { display: 'flex', alignItems: 'center' },\n }\n const name: ColDef<TaskGridRow<T>> = {\n ...base,\n colId: 'name',\n ...sortable,\n suppressNavigable: false,\n headerName: l.colTask,\n flex: 3,\n minWidth: 200,\n cellRenderer: cell(o.renderName),\n }\n const shared: ColDef<TaskGridRow<T>> = {\n ...base,\n colId: 'shared',\n headerName: l.colShared,\n headerTooltip: l.shared,\n width: 120,\n cellStyle: { display: 'flex', alignItems: 'center', justifyContent: 'center' },\n valueGetter: (p) => p.data?.task.is_shared ?? false,\n cellRenderer: cell(o.renderShared),\n }\n const actions = (): ColDef<TaskGridRow<T>> => ({\n ...base,\n colId: 'actions',\n headerName: '',\n // Always in view, even if the rest has to scroll.\n pinned: 'right',\n lockPinned: true,\n width: o.narrow ? NARROW_ACTIONS_WIDTH : ACTIONS_WIDTH,\n minWidth: NARROW_ACTIONS_WIDTH,\n cellStyle: { display: 'flex', alignItems: 'center', justifyContent: 'flex-end' },\n cellRenderer: cell(o.renderActions),\n })\n\n // Left to right: the title, who has the next step, when, how it stands, then who sees it and the\n // thread link, with the actions (Approve included) last, at the right edge.\n return [\n name,\n {\n ...base,\n colId: 'owner',\n ...sortable,\n headerName: l.colOwner,\n headerTooltip: l.ownerHint,\n flex: 1.4,\n minWidth: 150,\n valueGetter: (p) => (p.data ? o.getOwnerName(p.data) : ''),\n cellRenderer: cell(o.renderOwner),\n },\n {\n ...base,\n colId: 'due',\n ...sortable,\n headerName: l.colDue,\n flex: 1,\n minWidth: 140,\n valueGetter: (p) => p.data?.task.due_at ?? '',\n cellRenderer: cell(o.renderDue),\n },\n {\n ...base,\n colId: 'status',\n ...sortable,\n headerName: l.colStatus,\n // Wide enough for \"Generating\" and \"Waiting for access\" in full, with the elapsed time.\n flex: 1.3,\n minWidth: 170,\n valueGetter: (p) => p.data?.task.status ?? '',\n cellRenderer: cell(o.renderStatus),\n },\n ...(o.showOutputs\n ? [\n {\n ...base,\n colId: 'outputs',\n headerName: l.colOutputs,\n flex: 1.2,\n minWidth: 130,\n cellRenderer: cell(o.renderOutputs),\n } as ColDef<TaskGridRow<T>>,\n ]\n : []),\n shared,\n actions(),\n ]\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -17,7 +17,7 @@ const DEFAULT_TASK_LIST_LABELS = {
|
|
|
17
17
|
me: "Me",
|
|
18
18
|
someone: "Someone",
|
|
19
19
|
noDue: "\u2014",
|
|
20
|
-
colShared: "
|
|
20
|
+
colShared: "Sharing",
|
|
21
21
|
shared: "Shared with the workspace",
|
|
22
22
|
sharedOwnerOnly: "Only the creator can change who can see this",
|
|
23
23
|
deleteOwnerOnly: "Only the creator or workspace owner can delete this",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/agents/tasks/taskTableLabels.ts"],
|
|
4
|
-
"sourcesContent": ["import type { TaskStatusKey } from './taskLabels'\n\nexport interface TaskListLabels {\n agent: string\n filterAll: string\n emptyTitle: string\n emptyMessage: string\n noMatches: string\n due: (when: string) => string\n overdue: (when: string) => string\n colTask: string\n colOwner: string\n ownerHint: string\n colOutputs: string\n preparedBy: (agentName: string) => string\n colDue: string\n colStatus: string\n me: string\n someone: string\n noDue: string\n colShared: string\n shared: string\n sharedOwnerOnly: string\n deleteOwnerOnly: string\n goalMet: (met: number, total: number) => string\n subtasksDone: (done: number, total: number) => string\n expandSubtasks: string\n collapseSubtasks: string\n selectAll: string\n selectTask: (name: string) => string\n markDone: string\n reopen: string\n markDoneMany: string\n markDoneManyHint: string\n deleteMany: string\n moveTo: string\n untitled: string\n fromWorkflow: (workflowName: string) => string\n searchLabel: string\n searchPlaceholder: string\n expandAll: string\n collapseAll: string\n moveToTitle: (taskName: string) => string\n moveToNone: string\n moveToSearch: string\n moveToEmpty: string\n moveToCancel: string\n subtasksSelected: (count: number) => string\n addSubtask: string\n edit: string\n rename: string\n delete: string\n grantAccess: string\n allowAccess: string\n moreActions: string\n activity: string\n /** Status tooltip: the latest step and how long ago. */\n statusHint: (status: string, ago: string) => string\n status: Partial<Record<TaskStatusKey, string>>\n}\n\nexport const DEFAULT_TASK_LIST_LABELS: TaskListLabels = {\n filterAll: 'All',\n emptyTitle: 'No tasks yet',\n emptyMessage:\n 'Use New to add one: just type what you need, or add a due date. Automations that create tasks live on the Workflows page. You always decide when a task is done.',\n noMatches: 'No tasks match.',\n due: (when) => when,\n overdue: (when) => `${when} \u00B7 overdue`,\n agent: 'Agent',\n colTask: 'Task',\n colOwner: 'Owner',\n ownerHint: 'Who created the task. They are notified when its run finishes.',\n colOutputs: 'Outputs',\n preparedBy: (agent) => `Prepared by ${agent}`,\n colDue: 'Due',\n colStatus: 'Status',\n me: 'Me',\n someone: 'Someone',\n noDue: '\u2014',\n colShared: '
|
|
4
|
+
"sourcesContent": ["import type { TaskStatusKey } from './taskLabels'\n\nexport interface TaskListLabels {\n agent: string\n filterAll: string\n emptyTitle: string\n emptyMessage: string\n noMatches: string\n due: (when: string) => string\n overdue: (when: string) => string\n colTask: string\n colOwner: string\n ownerHint: string\n colOutputs: string\n preparedBy: (agentName: string) => string\n colDue: string\n colStatus: string\n me: string\n someone: string\n noDue: string\n colShared: string\n shared: string\n sharedOwnerOnly: string\n deleteOwnerOnly: string\n goalMet: (met: number, total: number) => string\n subtasksDone: (done: number, total: number) => string\n expandSubtasks: string\n collapseSubtasks: string\n selectAll: string\n selectTask: (name: string) => string\n markDone: string\n reopen: string\n markDoneMany: string\n markDoneManyHint: string\n deleteMany: string\n moveTo: string\n untitled: string\n fromWorkflow: (workflowName: string) => string\n searchLabel: string\n searchPlaceholder: string\n expandAll: string\n collapseAll: string\n moveToTitle: (taskName: string) => string\n moveToNone: string\n moveToSearch: string\n moveToEmpty: string\n moveToCancel: string\n subtasksSelected: (count: number) => string\n addSubtask: string\n edit: string\n rename: string\n delete: string\n grantAccess: string\n allowAccess: string\n moreActions: string\n activity: string\n /** Status tooltip: the latest step and how long ago. */\n statusHint: (status: string, ago: string) => string\n status: Partial<Record<TaskStatusKey, string>>\n}\n\nexport const DEFAULT_TASK_LIST_LABELS: TaskListLabels = {\n filterAll: 'All',\n emptyTitle: 'No tasks yet',\n emptyMessage:\n 'Use New to add one: just type what you need, or add a due date. Automations that create tasks live on the Workflows page. You always decide when a task is done.',\n noMatches: 'No tasks match.',\n due: (when) => when,\n overdue: (when) => `${when} \u00B7 overdue`,\n agent: 'Agent',\n colTask: 'Task',\n colOwner: 'Owner',\n ownerHint: 'Who created the task. They are notified when its run finishes.',\n colOutputs: 'Outputs',\n preparedBy: (agent) => `Prepared by ${agent}`,\n colDue: 'Due',\n colStatus: 'Status',\n me: 'Me',\n someone: 'Someone',\n noDue: '\u2014',\n colShared: 'Sharing',\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 goalMet: (met, total) => `${met}/${total} met`,\n subtasksDone: (done, total) => `${done}/${total} sub-tasks done`,\n expandSubtasks: 'Show sub-tasks',\n collapseSubtasks: 'Hide sub-tasks',\n selectAll: 'Select all tasks',\n selectTask: (name) => `Select ${name}`,\n markDone: 'Mark done',\n reopen: 'Reopen',\n markDoneMany: 'Mark done',\n markDoneManyHint: 'Marks the selected tasks done.',\n deleteMany: 'Delete',\n moveTo: 'Move to\u2026',\n untitled: 'Untitled task',\n fromWorkflow: (name) => `From \u201C${name}\u201D`,\n searchLabel: 'Search tasks',\n searchPlaceholder: 'Search tasks\u2026',\n expandAll: 'Expand all',\n collapseAll: 'Collapse all',\n moveToTitle: (name) => `Move \u201C${name}\u201D to\u2026`,\n moveToNone: 'No parent (top level)',\n moveToSearch: 'Search tasks\u2026',\n moveToEmpty: 'No task to move it under.',\n moveToCancel: 'Cancel',\n subtasksSelected: (count) => `${count} ${count === 1 ? 'sub-task' : 'sub-tasks'} included`,\n addSubtask: 'Add sub-task',\n edit: 'Edit',\n rename: 'Rename',\n delete: 'Delete',\n grantAccess: 'Allow access and continue',\n allowAccess: 'Allow access',\n moreActions: 'More actions',\n activity: 'Activity',\n statusHint: (status, ago) => `${status} \u00B7 ${ago}`,\n status: {},\n}\n"],
|
|
5
5
|
"mappings": ";AA6DO,MAAM,2BAA2C;AAAA,EACtD,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,cACE;AAAA,EACF,WAAW;AAAA,EACX,KAAK,CAAC,SAAS;AAAA,EACf,SAAS,CAAC,SAAS,GAAG,IAAI;AAAA,EAC1B,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY,CAAC,UAAU,eAAe,KAAK;AAAA,EAC3C,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,SAAS,CAAC,KAAK,UAAU,GAAG,GAAG,IAAI,KAAK;AAAA,EACxC,cAAc,CAAC,MAAM,UAAU,GAAG,IAAI,IAAI,KAAK;AAAA,EAC/C,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,YAAY,CAAC,SAAS,UAAU,IAAI;AAAA,EACpC,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,cAAc,CAAC,SAAS,cAAS,IAAI;AAAA,EACrC,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa,CAAC,SAAS,cAAS,IAAI;AAAA,EACpC,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,kBAAkB,CAAC,UAAU,GAAG,KAAK,IAAI,UAAU,IAAI,aAAa,WAAW;AAAA,EAC/E,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,YAAY,CAAC,QAAQ,QAAQ,GAAG,MAAM,SAAM,GAAG;AAAA,EAC/C,QAAQ,CAAC;AACX;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/agents/tasks/workflowTableLabels.ts"],
|
|
4
|
-
"sourcesContent": ["import type { WorkflowCatalogueLabels } from './WorkflowCatalogueSections'\n\nexport 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 /** Saved workflows that start on a date or a repeat. */\n filterScheduled: string\n /** The category view's heading over the saved workflows. */\n savedWorkflows: 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: '
|
|
4
|
+
"sourcesContent": ["import type { WorkflowCatalogueLabels } from './WorkflowCatalogueSections'\n\nexport 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 /** Saved workflows that start on a date or a repeat. */\n filterScheduled: string\n /** The category view's heading over the saved workflows. */\n savedWorkflows: 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: 'Sharing',\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: \u201C${name}\u201D`,\n agent: 'Agent',\n myAssistant: 'My assistant',\n me: 'Me',\n someone: 'Someone',\n never: 'Never',\n none: '\u2014',\n reminder: 'Reminder',\n steps: (count) => `Workflow \u00B7 ${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\u2026',\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 filterScheduled: 'Scheduled',\n savedWorkflows: 'Saved workflows',\n makeActive: 'Make active',\n makePaused: 'Deactivate',\n selectAll: 'Select all',\n selectWorkflow: (name) => `Select ${name}`,\n}\n\n/** The category view's catalogue cards. */\nexport const DEFAULT_WORKFLOW_CATALOGUE_LABELS: WorkflowCatalogueLabels = {\n openInBuilder: 'Builder',\n run: 'Run',\n stepCount: (count) => `${count} ${count === 1 ? 'step' : 'steps'}`,\n}\n"],
|
|
5
5
|
"mappings": ";AA6DO,MAAM,+BAAmD;AAAA,EAC9D,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,cAAc,CAAC,SAAS,iBAAY,IAAI;AAAA,EACxC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO,CAAC,UAAU,iBAAc,KAAK,IAAI,UAAU,IAAI,SAAS,OAAO;AAAA,EACvE,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAAA,EACd,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,gBAAgB,CAAC,SAAS,UAAU,IAAI;AAC1C;AAGO,MAAM,oCAA6D;AAAA,EACxE,eAAe;AAAA,EACf,KAAK;AAAA,EACL,WAAW,CAAC,UAAU,GAAG,KAAK,IAAI,UAAU,IAAI,SAAS,OAAO;AAClE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkBUVIBHFU_cjs = require('./chunk-BUVIBHFU.cjs');
|
|
5
5
|
var react = require('@arbidocs/react');
|
|
6
6
|
var ui = require('@arbidocs/react/ui');
|
|
7
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -25,9 +25,9 @@ function DocumentUser({
|
|
|
25
25
|
initials: `${user.given_name?.charAt(0) ?? ""}${user.family_name?.charAt(0) ?? ""}`
|
|
26
26
|
}
|
|
27
27
|
);
|
|
28
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
28
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkBUVIBHFU_cjs.UserAvatar, { user, onOpen: openUser });
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
exports.DocumentUser = DocumentUser;
|
|
32
|
-
//# sourceMappingURL=chunk-
|
|
33
|
-
//# sourceMappingURL=chunk-
|
|
32
|
+
//# sourceMappingURL=chunk-3GWWOYGS.cjs.map
|
|
33
|
+
//# sourceMappingURL=chunk-3GWWOYGS.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/files/fields/DocumentUser.tsx"],"names":["useDocumentsSupport","useDocumentHostActions","jsx","Fragment","UserEntity","getUserDisplayName","UserAvatar"],"mappings":";;;;;;;AAUO,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,OAAA,GAAU;AACZ,CAAA,EAMG;AACD,EAAA,MAAM,EAAE,UAAA,EAAW,GAAIA,yBAAA,EAAoB;AAC3C,EAAA,MAAM,EAAE,QAAA,EAAS,GAAIC,4BAAA,EAAuB;AAC5C,EAAA,IAAI,IAAA,IAAQ,UAAA,EAAY,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,UAAA,CAAW,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,CAAA,EAAE,CAAA;AACzE,EAAA,IAAI,QAAQ,OAAA,KAAY,MAAA;AACtB,IAAA,uBACED,cAAA;AAAA,MAACE,aAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAaC,sBAAmB,IAAI,CAAA;AAAA,QACpC,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAA,EAAU,CAAA,EAAG,IAAA,CAAK,UAAA,EAAY,OAAO,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,IAAA,CAAK,WAAA,EAAa,MAAA,CAAO,CAAC,KAAK,EAAE,CAAA;AAAA;AAAA,KACnF;AAEJ,EAAA,uBAAOH,cAAA,CAACI,4BAAA,EAAA,EAAW,IAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,CAAA;AACnD","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/connection/files/fields/DocumentUser.tsx"],"names":["useDocumentsSupport","useDocumentHostActions","jsx","Fragment","UserEntity","getUserDisplayName","UserAvatar"],"mappings":";;;;;;;AAUO,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,OAAA,GAAU;AACZ,CAAA,EAMG;AACD,EAAA,MAAM,EAAE,UAAA,EAAW,GAAIA,yBAAA,EAAoB;AAC3C,EAAA,MAAM,EAAE,QAAA,EAAS,GAAIC,4BAAA,EAAuB;AAC5C,EAAA,IAAI,IAAA,IAAQ,UAAA,EAAY,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,UAAA,CAAW,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,CAAA,EAAE,CAAA;AACzE,EAAA,IAAI,QAAQ,OAAA,KAAY,MAAA;AACtB,IAAA,uBACED,cAAA;AAAA,MAACE,aAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAaC,sBAAmB,IAAI,CAAA;AAAA,QACpC,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAA,EAAU,CAAA,EAAG,IAAA,CAAK,UAAA,EAAY,OAAO,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,IAAA,CAAK,WAAA,EAAa,MAAA,CAAO,CAAC,KAAK,EAAE,CAAA;AAAA;AAAA,KACnF;AAEJ,EAAA,uBAAOH,cAAA,CAACI,4BAAA,EAAA,EAAW,IAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,CAAA;AACnD","file":"chunk-3GWWOYGS.cjs","sourcesContent":["/**\n * A person by a document or a field (who made a document, a field, a value): the host's own\n * rendering when it has one (`DocumentsSupport.renderUser`: presence, their card), else the kit's\n * avatar, which opens them when the host can.\n */\n\nimport { useDocumentHostActions, useDocumentsSupport, type DocumentPerson } from '@arbidocs/react'\nimport { UserEntity, getUserDisplayName } from '@arbidocs/react/ui'\nimport { UserAvatar } from '../grid/cells'\n\nexport function DocumentUser({\n user,\n tooltip = true,\n variant = 'icon',\n}: {\n user: DocumentPerson | undefined\n /** Whether hovering shows their card (the host's rendering). */\n tooltip?: boolean\n /** Their face alone (`icon`) or their face and name (`pill`). */\n variant?: 'icon' | 'pill'\n}) {\n const { renderUser } = useDocumentsSupport()\n const { openUser } = useDocumentHostActions()\n if (user && renderUser) return <>{renderUser(user, { tooltip, variant })}</>\n if (user && variant === 'pill')\n return (\n <UserEntity\n size=\"sm\"\n variant=\"pill\"\n displayName={getUserDisplayName(user)}\n picture={user.picture}\n initials={`${user.given_name?.charAt(0) ?? ''}${user.family_name?.charAt(0) ?? ''}`}\n />\n )\n return <UserAvatar user={user} onOpen={openUser} />\n}\n"]}
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var chunkYGBHY67W_cjs = require('./chunk-YGBHY67W.cjs');
|
|
5
|
-
var
|
|
5
|
+
var chunkECLUFKYR_cjs = require('./chunk-ECLUFKYR.cjs');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
|
|
8
8
|
function ConnectedStreamedWordArtifact({
|
|
9
9
|
fontBaseUrl,
|
|
10
10
|
...props
|
|
11
11
|
}) {
|
|
12
|
-
const adapter =
|
|
12
|
+
const adapter = chunkECLUFKYR_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
|
|
13
13
|
return /* @__PURE__ */ jsxRuntime.jsx(chunkYGBHY67W_cjs.StreamedWordArtifact, { ...props, adapter });
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
exports.ConnectedStreamedWordArtifact = ConnectedStreamedWordArtifact;
|
|
17
|
-
//# sourceMappingURL=chunk-
|
|
18
|
-
//# sourceMappingURL=chunk-
|
|
17
|
+
//# sourceMappingURL=chunk-5IZFSAEZ.cjs.map
|
|
18
|
+
//# sourceMappingURL=chunk-5IZFSAEZ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":["useConnectedNativeDocxAdapter","jsx","StreamedWordArtifact"],"mappings":";;;;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,uBAAOC,cAAA,CAACC,sCAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":["useConnectedNativeDocxAdapter","jsx","StreamedWordArtifact"],"mappings":";;;;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,uBAAOC,cAAA,CAACC,sCAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-5IZFSAEZ.cjs","sourcesContent":["import { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\nimport {\n StreamedWordArtifact,\n type StreamedWordArtifactProps,\n} from '../../docx/StreamedWordArtifact'\n\nexport function ConnectedStreamedWordArtifact({\n fontBaseUrl,\n ...props\n}: Omit<StreamedWordArtifactProps, 'adapter'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <StreamedWordArtifact {...props} adapter={adapter} />\n}\n"]}
|
|
@@ -8,7 +8,7 @@ var chunk7JLJH5CW_cjs = require('./chunk-7JLJH5CW.cjs');
|
|
|
8
8
|
var chunkOYXWQTHF_cjs = require('./chunk-OYXWQTHF.cjs');
|
|
9
9
|
var chunkS237ORM3_cjs = require('./chunk-S237ORM3.cjs');
|
|
10
10
|
var chunkII2OEXHW_cjs = require('./chunk-II2OEXHW.cjs');
|
|
11
|
-
var
|
|
11
|
+
var chunkQQWHG3KF_cjs = require('./chunk-QQWHG3KF.cjs');
|
|
12
12
|
var chunk3YEXZX4H_cjs = require('./chunk-3YEXZX4H.cjs');
|
|
13
13
|
var chunkWXUU3COI_cjs = require('./chunk-WXUU3COI.cjs');
|
|
14
14
|
var chunkAHDJXIUB_cjs = require('./chunk-AHDJXIUB.cjs');
|
|
@@ -4860,7 +4860,7 @@ function createTaskColumns(o) {
|
|
|
4860
4860
|
colId: "shared",
|
|
4861
4861
|
headerName: l.colShared,
|
|
4862
4862
|
headerTooltip: l.shared,
|
|
4863
|
-
width:
|
|
4863
|
+
width: 120,
|
|
4864
4864
|
cellStyle: { display: "flex", alignItems: "center", justifyContent: "center" },
|
|
4865
4865
|
valueGetter: (p) => p.data?.task.is_shared ?? false,
|
|
4866
4866
|
cellRenderer: cell(o.renderShared)
|
|
@@ -5083,7 +5083,7 @@ var DEFAULT_TASK_LIST_LABELS = {
|
|
|
5083
5083
|
me: "Me",
|
|
5084
5084
|
someone: "Someone",
|
|
5085
5085
|
noDue: "\u2014",
|
|
5086
|
-
colShared: "
|
|
5086
|
+
colShared: "Sharing",
|
|
5087
5087
|
shared: "Shared with the workspace",
|
|
5088
5088
|
sharedOwnerOnly: "Only the creator can change who can see this",
|
|
5089
5089
|
deleteOwnerOnly: "Only the creator or workspace owner can delete this",
|
|
@@ -5302,7 +5302,7 @@ function TaskTable(props) {
|
|
|
5302
5302
|
isMe: mine
|
|
5303
5303
|
};
|
|
5304
5304
|
};
|
|
5305
|
-
const renderPerson = (person) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
5305
|
+
const renderPerson = (person) => /* @__PURE__ */ jsxRuntime.jsx(chunkQQWHG3KF_cjs.PersonPill, { person });
|
|
5306
5306
|
const q = (query.trim() || (props.filterText ?? "").trim()).toLowerCase();
|
|
5307
5307
|
const counts = react.useMemo(() => {
|
|
5308
5308
|
const map = new Map(STATUS_ORDER.map((s) => [s, 0]));
|
|
@@ -5551,13 +5551,14 @@ function TaskTable(props) {
|
|
|
5551
5551
|
const { task } = row;
|
|
5552
5552
|
if (!p.onToggleShared) return null;
|
|
5553
5553
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
5554
|
-
ui.
|
|
5554
|
+
ui.SharingEntity,
|
|
5555
5555
|
{
|
|
5556
|
-
|
|
5556
|
+
shared: task.is_shared ?? false,
|
|
5557
5557
|
onToggle: (shouldShare) => latest.current.props.onToggleShared?.(task, shouldShare),
|
|
5558
5558
|
disabled: task.is_owner === false,
|
|
5559
5559
|
disabledTooltip: lb.sharedOwnerOnly,
|
|
5560
|
-
|
|
5560
|
+
tooltipActive: "Shared with this workspace \u2014 click to make private",
|
|
5561
|
+
tooltipInactive: "Only you can see this \u2014 click to share with this workspace",
|
|
5561
5562
|
"data-testid": `task-shared-${task.external_id}`
|
|
5562
5563
|
}
|
|
5563
5564
|
);
|
|
@@ -5974,10 +5975,18 @@ function ConversationListView(p) {
|
|
|
5974
5975
|
minWidth: 200,
|
|
5975
5976
|
valueGetter: ({ data }) => data?.title?.trim() || "Untitled thread",
|
|
5976
5977
|
cellRenderer: ({ data }) => data && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group flex h-full min-w-0 items-center gap-2", children: [
|
|
5978
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5979
|
+
ui.SharingEntity,
|
|
5980
|
+
{
|
|
5981
|
+
shared: data.is_shared ?? false,
|
|
5982
|
+
variant: "icon",
|
|
5983
|
+
"data-testid": `thread-sharing-${data.external_id}`
|
|
5984
|
+
}
|
|
5985
|
+
),
|
|
5977
5986
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: liveProps.current.renderThread ? liveProps.current.renderThread(data) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
5978
5987
|
chunkTP5PGWIO_cjs.EntityChip,
|
|
5979
5988
|
{
|
|
5980
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5989
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquare, { className: "size-4", "aria-hidden": true }),
|
|
5981
5990
|
label: data.title?.trim() || "Untitled thread",
|
|
5982
5991
|
pillTooltip: "Open conversation",
|
|
5983
5992
|
labelMaxWidth: "max-w-full",
|
|
@@ -10009,5 +10018,5 @@ exports.useWorkflowView = useWorkflowView;
|
|
|
10009
10018
|
exports.withLabelIds = withLabelIds;
|
|
10010
10019
|
exports.workflowFromSkillMarkdown = workflowFromSkillMarkdown;
|
|
10011
10020
|
exports.workflowToSkillMarkdown = workflowToSkillMarkdown;
|
|
10012
|
-
//# sourceMappingURL=chunk-
|
|
10013
|
-
//# sourceMappingURL=chunk-
|
|
10021
|
+
//# sourceMappingURL=chunk-775S43W7.cjs.map
|
|
10022
|
+
//# sourceMappingURL=chunk-775S43W7.cjs.map
|