@arbidocs/blocks 0.5.118 → 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.
Files changed (145) hide show
  1. package/dist/{ConnectedCallDock-E7RMQMMT.cjs → ConnectedCallDock-WER7R222.cjs} +12 -12
  2. package/dist/{ConnectedCallDock-E7RMQMMT.cjs.map → ConnectedCallDock-WER7R222.cjs.map} +1 -1
  3. package/dist/{ConnectedCallRoom-FF7X6LQ2.cjs → ConnectedCallRoom-T7OBQTYP.cjs} +12 -12
  4. package/dist/{ConnectedCallRoom-FF7X6LQ2.cjs.map → ConnectedCallRoom-T7OBQTYP.cjs.map} +1 -1
  5. package/dist/{ConnectedNativeDocxComparison-PB2LXT5U.cjs → ConnectedNativeDocxComparison-SGE4R3M4.cjs} +11 -11
  6. package/dist/{ConnectedNativeDocxComparison-PB2LXT5U.cjs.map → ConnectedNativeDocxComparison-SGE4R3M4.cjs.map} +1 -1
  7. package/dist/{ConnectedStreamedWordArtifact-S7ICDK5T.cjs → ConnectedStreamedWordArtifact-6MCLJRIT.cjs} +11 -11
  8. package/dist/{ConnectedStreamedWordArtifact-S7ICDK5T.cjs.map → ConnectedStreamedWordArtifact-6MCLJRIT.cjs.map} +1 -1
  9. package/dist/{DocumentReviewCard-L472OMQS.cjs → DocumentReviewCard-BPIAJJED.cjs} +17 -17
  10. package/dist/{DocumentReviewCard-L472OMQS.cjs.map → DocumentReviewCard-BPIAJJED.cjs.map} +1 -1
  11. package/dist/{FilesViewerDialog-JK25HKKF.cjs → FilesViewerDialog-67WK3TZC.cjs} +26 -26
  12. package/dist/{FilesViewerDialog-JK25HKKF.cjs.map → FilesViewerDialog-67WK3TZC.cjs.map} +1 -1
  13. package/dist/{WorkspaceTableView-JCTDEMIL.cjs → WorkspaceTableView-J3C6VH4T.cjs} +8 -8
  14. package/dist/{WorkspaceTableView-JCTDEMIL.cjs.map → WorkspaceTableView-J3C6VH4T.cjs.map} +1 -1
  15. package/dist/agents/index.cjs +187 -187
  16. package/dist/agents/tasks/ConversationListView.js +10 -2
  17. package/dist/agents/tasks/ConversationListView.js.map +2 -2
  18. package/dist/agents/tasks/TaskTable.js +5 -4
  19. package/dist/agents/tasks/TaskTable.js.map +2 -2
  20. package/dist/agents/tasks/WorkflowsTable.js +4 -5
  21. package/dist/agents/tasks/WorkflowsTable.js.map +2 -2
  22. package/dist/agents/tasks/taskColumns.js +1 -1
  23. package/dist/agents/tasks/taskColumns.js.map +1 -1
  24. package/dist/agents/tasks/taskTableLabels.js +1 -1
  25. package/dist/agents/tasks/taskTableLabels.js.map +1 -1
  26. package/dist/agents/tasks/workflowTableLabels.js +1 -1
  27. package/dist/agents/tasks/workflowTableLabels.js.map +1 -1
  28. package/dist/{ai-OBS67QV4.cjs → ai-IM4A23YT.cjs} +16 -16
  29. package/dist/ai-IM4A23YT.cjs.map +1 -0
  30. package/dist/calls/index.cjs +2 -2
  31. package/dist/{chunk-P77YTTJ3.cjs → chunk-3GWWOYGS.cjs} +4 -4
  32. package/dist/{chunk-P77YTTJ3.cjs.map → chunk-3GWWOYGS.cjs.map} +1 -1
  33. package/dist/{chunk-QOXK5O6M.cjs → chunk-557MJ4IH.cjs} +12 -12
  34. package/dist/{chunk-QOXK5O6M.cjs.map → chunk-557MJ4IH.cjs.map} +1 -1
  35. package/dist/{chunk-YDPLSXHB.cjs → chunk-5IZFSAEZ.cjs} +4 -4
  36. package/dist/{chunk-YDPLSXHB.cjs.map → chunk-5IZFSAEZ.cjs.map} +1 -1
  37. package/dist/{chunk-JSQQV23D.cjs → chunk-6UTKM5AB.cjs} +3 -3
  38. package/dist/{chunk-JSQQV23D.cjs.map → chunk-6UTKM5AB.cjs.map} +1 -1
  39. package/dist/{chunk-PVPRVI54.cjs → chunk-775S43W7.cjs} +21 -12
  40. package/dist/chunk-775S43W7.cjs.map +1 -0
  41. package/dist/{chunk-3LNUQYAF.cjs → chunk-B3LZITVF.cjs} +3 -3
  42. package/dist/{chunk-3LNUQYAF.cjs.map → chunk-B3LZITVF.cjs.map} +1 -1
  43. package/dist/{chunk-SUYPXUE6.cjs → chunk-BP3IJ34D.cjs} +6 -6
  44. package/dist/{chunk-SUYPXUE6.cjs.map → chunk-BP3IJ34D.cjs.map} +1 -1
  45. package/dist/{chunk-TT4IF52H.cjs → chunk-BUVIBHFU.cjs} +37 -38
  46. package/dist/chunk-BUVIBHFU.cjs.map +1 -0
  47. package/dist/{chunk-OPH4UZQN.cjs → chunk-CKCG4NDB.cjs} +33 -33
  48. package/dist/{chunk-OPH4UZQN.cjs.map → chunk-CKCG4NDB.cjs.map} +1 -1
  49. package/dist/{chunk-7IPIKMCY.cjs → chunk-CPR6EHG7.cjs} +3 -3
  50. package/dist/{chunk-7IPIKMCY.cjs.map → chunk-CPR6EHG7.cjs.map} +1 -1
  51. package/dist/{chunk-YGXOKB5Z.cjs → chunk-DFBDQKGE.cjs} +4 -4
  52. package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-DFBDQKGE.cjs.map} +1 -1
  53. package/dist/{chunk-K6AUKKUN.cjs → chunk-ECLUFKYR.cjs} +6 -6
  54. package/dist/{chunk-K6AUKKUN.cjs.map → chunk-ECLUFKYR.cjs.map} +1 -1
  55. package/dist/{chunk-CPG7II4E.cjs → chunk-HA66DHW6.cjs} +28 -28
  56. package/dist/{chunk-CPG7II4E.cjs.map → chunk-HA66DHW6.cjs.map} +1 -1
  57. package/dist/{chunk-P2MOLUFO.cjs → chunk-KTQOGT2L.cjs} +6 -6
  58. package/dist/{chunk-P2MOLUFO.cjs.map → chunk-KTQOGT2L.cjs.map} +1 -1
  59. package/dist/{chunk-57NHXEU2.cjs → chunk-MXBXZXXQ.cjs} +5 -5
  60. package/dist/{chunk-57NHXEU2.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
  61. package/dist/{chunk-L6APDO3Y.cjs → chunk-NJCK6V6U.cjs} +3 -3
  62. package/dist/{chunk-L6APDO3Y.cjs.map → chunk-NJCK6V6U.cjs.map} +1 -1
  63. package/dist/{chunk-NNUK5ZM7.cjs → chunk-NLSWDP42.cjs} +9 -17
  64. package/dist/chunk-NLSWDP42.cjs.map +1 -0
  65. package/dist/{chunk-ZCIQBHH5.cjs → chunk-Q6CLWOP2.cjs} +36 -36
  66. package/dist/{chunk-ZCIQBHH5.cjs.map → chunk-Q6CLWOP2.cjs.map} +1 -1
  67. package/dist/{chunk-XZYIS2JZ.cjs → chunk-QQWHG3KF.cjs} +6 -7
  68. package/dist/chunk-QQWHG3KF.cjs.map +1 -0
  69. package/dist/{chunk-KHAO7ZTO.cjs → chunk-T23UTIRI.cjs} +5 -5
  70. package/dist/{chunk-KHAO7ZTO.cjs.map → chunk-T23UTIRI.cjs.map} +1 -1
  71. package/dist/{chunk-O4F77VSO.cjs → chunk-TDO5UWXF.cjs} +5 -5
  72. package/dist/{chunk-O4F77VSO.cjs.map → chunk-TDO5UWXF.cjs.map} +1 -1
  73. package/dist/{chunk-VLCY46K6.cjs → chunk-TG2GM7WJ.cjs} +4 -3
  74. package/dist/chunk-TG2GM7WJ.cjs.map +1 -0
  75. package/dist/{chunk-5XAJ4N2S.cjs → chunk-VZCPMXWC.cjs} +4 -4
  76. package/dist/{chunk-5XAJ4N2S.cjs.map → chunk-VZCPMXWC.cjs.map} +1 -1
  77. package/dist/{chunk-MMVDVHKE.cjs → chunk-W6INT5GS.cjs} +5 -5
  78. package/dist/{chunk-MMVDVHKE.cjs.map → chunk-W6INT5GS.cjs.map} +1 -1
  79. package/dist/{chunk-ZPPMAL5P.cjs → chunk-WQMR3O2D.cjs} +6 -10
  80. package/dist/chunk-WQMR3O2D.cjs.map +1 -0
  81. package/dist/{chunk-CB3YYZAU.cjs → chunk-X36UR4A7.cjs} +175 -58
  82. package/dist/chunk-X36UR4A7.cjs.map +1 -0
  83. package/dist/{chunk-6ULADDBW.cjs → chunk-YYSBWMDJ.cjs} +4 -4
  84. package/dist/{chunk-6ULADDBW.cjs.map → chunk-YYSBWMDJ.cjs.map} +1 -1
  85. package/dist/collaboration/index.cjs +3 -3
  86. package/dist/collaboration/sharing/ShareControl.js +10 -2
  87. package/dist/collaboration/sharing/ShareControl.js.map +2 -2
  88. package/dist/components/SharedCell.d.ts +2 -4
  89. package/dist/components/SharedCell.js +4 -8
  90. package/dist/components/SharedCell.js.map +2 -2
  91. package/dist/connect/docx.cjs +14 -14
  92. package/dist/connect/index.cjs +965 -937
  93. package/dist/connect/index.cjs.map +1 -1
  94. package/dist/connect/viewer.cjs +16 -16
  95. package/dist/connection/facts/factPageColumns.js +3 -9
  96. package/dist/connection/facts/factPageColumns.js.map +2 -2
  97. package/dist/connection/files/grid/cells.js +1 -3
  98. package/dist/connection/files/grid/cells.js.map +2 -2
  99. package/dist/connection/files/grid/documentColumns.js +3 -2
  100. package/dist/connection/files/grid/documentColumns.js.map +2 -2
  101. package/dist/connection/sharing/WorkspaceMembersList.d.ts +4 -0
  102. package/dist/connection/sharing/WorkspaceMembersList.js +34 -0
  103. package/dist/connection/sharing/WorkspaceMembersList.js.map +7 -0
  104. package/dist/connection/shell/ConnectedAppShell.js +4 -0
  105. package/dist/connection/shell/ConnectedAppShell.js.map +2 -2
  106. package/dist/connection/viewer/ConnectedDocumentViewer.js +3 -2
  107. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  108. package/dist/connection/viewer/ViewerPdfPane.js +20 -2
  109. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  110. package/dist/connection/viewer/pdf/PdfPassageHighlights.d.ts +12 -0
  111. package/dist/connection/viewer/pdf/PdfPassageHighlights.js +36 -0
  112. package/dist/connection/viewer/pdf/PdfPassageHighlights.js.map +7 -0
  113. package/dist/connection/viewer/pdf/passageHighlights.d.ts +26 -0
  114. package/dist/connection/viewer/pdf/passageHighlights.js +40 -0
  115. package/dist/connection/viewer/pdf/passageHighlights.js.map +7 -0
  116. package/dist/connection/viewer/pdf/usePdfPassageHighlights.d.ts +9 -0
  117. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +47 -0
  118. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +7 -0
  119. package/dist/connection/workflows/workflowsPageLabels.js +1 -1
  120. package/dist/connection/workflows/workflowsPageLabels.js.map +1 -1
  121. package/dist/dashboards/index.cjs +1 -1
  122. package/dist/embed/index.cjs +26 -26
  123. package/dist/facts/factColumns.js +3 -3
  124. package/dist/facts/factColumns.js.map +1 -1
  125. package/dist/facts/index.cjs +42 -42
  126. package/dist/files/HtmlViewerParts.js +7 -15
  127. package/dist/files/HtmlViewerParts.js.map +2 -2
  128. package/dist/files/index.cjs +223 -223
  129. package/dist/index.cjs +321 -321
  130. package/dist/settings/index.cjs +147 -147
  131. package/dist/shell/index.cjs +35 -35
  132. package/dist/studio/index.cjs +8 -8
  133. package/dist/styles.css +1 -1
  134. package/dist/workflow-canvas/index.cjs +36 -36
  135. package/dist/workflow-canvas/index.cjs.map +1 -1
  136. package/node_modules/@arbidocs/coedit/package.json +1 -1
  137. package/package.json +5 -5
  138. package/dist/ai-OBS67QV4.cjs.map +0 -1
  139. package/dist/chunk-CB3YYZAU.cjs.map +0 -1
  140. package/dist/chunk-NNUK5ZM7.cjs.map +0 -1
  141. package/dist/chunk-PVPRVI54.cjs.map +0 -1
  142. package/dist/chunk-TT4IF52H.cjs.map +0 -1
  143. package/dist/chunk-VLCY46K6.cjs.map +0 -1
  144. package/dist/chunk-XZYIS2JZ.cjs.map +0 -1
  145. 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: 90,
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: 90,\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"],
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: "Shared",
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: 'Shared',\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"],
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
  }
@@ -6,7 +6,7 @@ const DEFAULT_WORKFLOW_LIST_LABELS = {
6
6
  colAction: "What it does",
7
7
  colAgent: "Agent",
8
8
  colStatus: "Active",
9
- colShared: "Shared",
9
+ colShared: "Sharing",
10
10
  colLastRun: "Last run",
11
11
  colNextRun: "Next run",
12
12
  shared: "Shared with the workspace",
@@ -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: '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: \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"],
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,9 +1,9 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkP2MOLUFO_cjs = require('./chunk-P2MOLUFO.cjs');
5
- require('./chunk-QOXK5O6M.cjs');
6
- require('./chunk-JSQQV23D.cjs');
4
+ var chunkKTQOGT2L_cjs = require('./chunk-KTQOGT2L.cjs');
5
+ require('./chunk-557MJ4IH.cjs');
6
+ require('./chunk-6UTKM5AB.cjs');
7
7
  require('./chunk-WAV762GP.cjs');
8
8
  require('./chunk-7JLJH5CW.cjs');
9
9
  require('./chunk-EVZH6Z5O.cjs');
@@ -12,6 +12,9 @@ require('./chunk-AHDJXIUB.cjs');
12
12
  require('./chunk-YVCOQHCE.cjs');
13
13
  require('./chunk-JV5TVUOU.cjs');
14
14
  require('./chunk-VZOOGA47.cjs');
15
+ require('./chunk-HQDR43JC.cjs');
16
+ require('./chunk-JR2YSBD5.cjs');
17
+ require('./chunk-3YZKDCWY.cjs');
15
18
  require('./chunk-PGJYD67F.cjs');
16
19
  require('./chunk-IDCD5TEZ.cjs');
17
20
  require('./chunk-M2FOXGJU.cjs');
@@ -27,9 +30,6 @@ require('./chunk-QGVOT7E4.cjs');
27
30
  require('./chunk-QRAQZTJE.cjs');
28
31
  require('./chunk-UDSHVNU3.cjs');
29
32
  require('./chunk-IPSHAMO2.cjs');
30
- require('./chunk-HQDR43JC.cjs');
31
- require('./chunk-JR2YSBD5.cjs');
32
- require('./chunk-3YZKDCWY.cjs');
33
33
  require('./chunk-PPCATBOY.cjs');
34
34
  require('./chunk-TKHCIHE2.cjs');
35
35
  require('./chunk-JDFBEGQO.cjs');
@@ -40,35 +40,35 @@ require('./chunk-PLIF5CUV.cjs');
40
40
 
41
41
  Object.defineProperty(exports, "ConnectedAssistantDock", {
42
42
  enumerable: true,
43
- get: function () { return chunkP2MOLUFO_cjs.ConnectedAssistantDock; }
43
+ get: function () { return chunkKTQOGT2L_cjs.ConnectedAssistantDock; }
44
44
  });
45
45
  Object.defineProperty(exports, "redlineStats", {
46
46
  enumerable: true,
47
- get: function () { return chunkP2MOLUFO_cjs.redlineStats; }
47
+ get: function () { return chunkKTQOGT2L_cjs.redlineStats; }
48
48
  });
49
49
  Object.defineProperty(exports, "textToArtifact", {
50
50
  enumerable: true,
51
- get: function () { return chunkP2MOLUFO_cjs.textToArtifact; }
51
+ get: function () { return chunkKTQOGT2L_cjs.textToArtifact; }
52
52
  });
53
53
  Object.defineProperty(exports, "toRedlineMarkdown", {
54
54
  enumerable: true,
55
- get: function () { return chunkP2MOLUFO_cjs.toRedlineMarkdown; }
55
+ get: function () { return chunkKTQOGT2L_cjs.toRedlineMarkdown; }
56
56
  });
57
57
  Object.defineProperty(exports, "useConnectedAiTask", {
58
58
  enumerable: true,
59
- get: function () { return chunkP2MOLUFO_cjs.useConnectedAiTask; }
59
+ get: function () { return chunkKTQOGT2L_cjs.useConnectedAiTask; }
60
60
  });
61
61
  Object.defineProperty(exports, "useConnectedChat", {
62
62
  enumerable: true,
63
- get: function () { return chunkP2MOLUFO_cjs.useConnectedChat; }
63
+ get: function () { return chunkKTQOGT2L_cjs.useConnectedChat; }
64
64
  });
65
65
  Object.defineProperty(exports, "useSemanticSearch", {
66
66
  enumerable: true,
67
- get: function () { return chunkP2MOLUFO_cjs.useSemanticSearch; }
67
+ get: function () { return chunkKTQOGT2L_cjs.useSemanticSearch; }
68
68
  });
69
69
  Object.defineProperty(exports, "useWorkspaceDocs", {
70
70
  enumerable: true,
71
- get: function () { return chunkP2MOLUFO_cjs.useWorkspaceDocs; }
71
+ get: function () { return chunkKTQOGT2L_cjs.useWorkspaceDocs; }
72
72
  });
73
- //# sourceMappingURL=ai-OBS67QV4.cjs.map
74
- //# sourceMappingURL=ai-OBS67QV4.cjs.map
73
+ //# sourceMappingURL=ai-IM4A23YT.cjs.map
74
+ //# sourceMappingURL=ai-IM4A23YT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ai-IM4A23YT.cjs"}
@@ -68,10 +68,10 @@ function ConnectedIncomingCall() {
68
68
  );
69
69
  }
70
70
  var ConnectedCallDock = react.lazy(
71
- () => import('../ConnectedCallDock-E7RMQMMT.cjs').then((m) => ({ default: m.ConnectedCallDock }))
71
+ () => import('../ConnectedCallDock-WER7R222.cjs').then((m) => ({ default: m.ConnectedCallDock }))
72
72
  );
73
73
  var ConnectedCallRoom = react.lazy(
74
- () => import('../ConnectedCallRoom-FF7X6LQ2.cjs').then((m) => ({ default: m.ConnectedCallRoom }))
74
+ () => import('../ConnectedCallRoom-T7OBQTYP.cjs').then((m) => ({ default: m.ConnectedCallRoom }))
75
75
  );
76
76
  function ConnectedCallLayer() {
77
77
  const hasActiveCall = react$1.useCallSession((s) => s.active !== null);
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkTT4IF52H_cjs = require('./chunk-TT4IF52H.cjs');
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(chunkTT4IF52H_cjs.UserAvatar, { user, onOpen: openUser });
28
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkBUVIBHFU_cjs.UserAvatar, { user, onOpen: openUser });
29
29
  }
30
30
 
31
31
  exports.DocumentUser = DocumentUser;
32
- //# sourceMappingURL=chunk-P77YTTJ3.cjs.map
33
- //# sourceMappingURL=chunk-P77YTTJ3.cjs.map
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-P77YTTJ3.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"]}
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"]}
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkJSQQV23D_cjs = require('./chunk-JSQQV23D.cjs');
4
+ var chunk6UTKM5AB_cjs = require('./chunk-6UTKM5AB.cjs');
5
5
  var chunkWAV762GP_cjs = require('./chunk-WAV762GP.cjs');
6
6
  var chunk7JLJH5CW_cjs = require('./chunk-7JLJH5CW.cjs');
7
7
  var chunkWXUU3COI_cjs = require('./chunk-WXUU3COI.cjs');
8
+ var chunk3YZKDCWY_cjs = require('./chunk-3YZKDCWY.cjs');
8
9
  var chunk5F4DCIHS_cjs = require('./chunk-5F4DCIHS.cjs');
9
10
  var chunkQRAQZTJE_cjs = require('./chunk-QRAQZTJE.cjs');
10
- var chunk3YZKDCWY_cjs = require('./chunk-3YZKDCWY.cjs');
11
11
  var chunkTKHCIHE2_cjs = require('./chunk-TKHCIHE2.cjs');
12
12
  var browser = require('@arbidocs/sdk/browser');
13
13
  var react = require('@arbidocs/react');
@@ -54,7 +54,7 @@ function useLaunchWorkflow({
54
54
  const createTag = react.useCreateTag();
55
55
  const updateTag = react.useUpdateTag();
56
56
  const generate = react.useGenerateDocTags();
57
- const { create: createTask } = chunkJSQQV23D_cjs.useWorkflowTasks();
57
+ const { create: createTask } = chunk6UTKM5AB_cjs.useWorkflowTasks();
58
58
  const applyModel = react.useApplyChatModel();
59
59
  const session = react.useArbiSessionStore();
60
60
  const { notify, openFiles, openNewConversation } = chunkTKHCIHE2_cjs.useBlocksEnvironment();
@@ -268,7 +268,7 @@ function canOpenSkill(workflow, skillsEnabled) {
268
268
  return workflow.run.kind === "prompt" && (skillsEnabled || chunk7JLJH5CW_cjs.isSkillPackWorkflow(workflow));
269
269
  }
270
270
  function useSlashSkillWorkflows({ landing, send }) {
271
- const { skills, skillsEnabled } = chunkJSQQV23D_cjs.useWorkflowDefinitions();
271
+ const { skills, skillsEnabled } = chunk6UTKM5AB_cjs.useWorkflowDefinitions();
272
272
  const { commands } = react.useBuiltinCommands();
273
273
  const [active, setActive] = react$1.useState(null);
274
274
  const open = react$1.useCallback(
@@ -332,11 +332,11 @@ function useSlashSkillWorkflows({ landing, send }) {
332
332
  }
333
333
  var NO_SKILLS = [];
334
334
  function useSlashMenuItems(builtinSkills = NO_SKILLS) {
335
- const hostSkills = chunkJSQQV23D_cjs.useHostSkills();
336
- const listings = chunkJSQQV23D_cjs.useUsableSkillListings(hostSkills);
337
- const skillsEnabled = chunkJSQQV23D_cjs.useSkillsEnabled();
335
+ const hostSkills = chunk6UTKM5AB_cjs.useHostSkills();
336
+ const listings = chunk6UTKM5AB_cjs.useUsableSkillListings(hostSkills);
337
+ const skillsEnabled = chunk6UTKM5AB_cjs.useSkillsEnabled();
338
338
  const { commands } = react.useBuiltinCommands();
339
- const builtins = chunkJSQQV23D_cjs.useNamedWorkflows(builtinSkills);
339
+ const builtins = chunk6UTKM5AB_cjs.useNamedWorkflows(builtinSkills);
340
340
  const items = react$1.useMemo(() => {
341
341
  const packSlugs = new Set(hostSkills.map((w) => w.id));
342
342
  return chunk5F4DCIHS_cjs.buildSlashItems(
@@ -347,7 +347,7 @@ function useSlashMenuItems(builtinSkills = NO_SKILLS) {
347
347
  kind: "command"
348
348
  })),
349
349
  [
350
- ...hostSkills.map(chunkJSQQV23D_cjs.hostSkillItem),
350
+ ...hostSkills.map(chunk6UTKM5AB_cjs.hostSkillItem),
351
351
  ...skillsEnabled ? skillItems(
352
352
  builtins.filter((w) => !packSlugs.has(w.id)),
353
353
  listings
@@ -355,7 +355,7 @@ function useSlashMenuItems(builtinSkills = NO_SKILLS) {
355
355
  ]
356
356
  );
357
357
  }, [commands, hostSkills, listings, skillsEnabled, builtins]);
358
- return { items, canBrowseSkills: chunkJSQQV23D_cjs.useCanBrowseSkills() };
358
+ return { items, canBrowseSkills: chunk6UTKM5AB_cjs.useCanBrowseSkills() };
359
359
  }
360
360
  function useSlashItems(text2, builtinSkills = NO_SKILLS) {
361
361
  const { items, canBrowseSkills } = useSlashMenuItems(builtinSkills);
@@ -402,5 +402,5 @@ exports.useLaunchWorkflow = useLaunchWorkflow;
402
402
  exports.useSlashItems = useSlashItems;
403
403
  exports.useSlashMenuItems = useSlashMenuItems;
404
404
  exports.useSlashSkillWorkflows = useSlashSkillWorkflows;
405
- //# sourceMappingURL=chunk-QOXK5O6M.cjs.map
406
- //# sourceMappingURL=chunk-QOXK5O6M.cjs.map
405
+ //# sourceMappingURL=chunk-557MJ4IH.cjs.map
406
+ //# sourceMappingURL=chunk-557MJ4IH.cjs.map