feat(client): workflow-graph Tasks page with teams board and jobs drawer

The Subagent page becomes the Tasks page per the approved Variant-D design:

- tasks-model.ts feeds BOTH modes from one pre-order node list: graph
  canvas (TasksGraph: layered nodes over bezier edges, drag-pan,
  wheel-zoom-to-cursor, phase frames, bottom-right control cluster) and
  the classic tree (TasksTree: keyboard navigable) — the view toggle and
  fold toggle stay reachable in both modes.
- Workflow runs (workflows.list) hang under their origin agent; member
  agents re-parent under the run node, missing ones synthesize from run
  data; completed leaf agents fold into per-parent aggregate nodes
  (click or cluster toggle to expand/re-collapse).
- Agent Teams (experimental): roster enriches nodes; a header chip opens
  the shared task board popover with basic CAS operations (complete /
  reopen / delete / reassign / create / edit); no experimental layer →
  the whole block hides (structural degradation).
- Background jobs move into a bottom drawer that auto-collapses at 8+
  agents (manual toggle wins); job output opens as an anchored popover
  (event replay, never the model's cursor); two-click kill preserved.
- Live activity lines render as glyph + tool + args (tool-icons map onto
  host primitive icons).
- Node click jumps to the transcript; ⓘ opens the detail popover;
  popovers follow the selection-popup dismissal contract (Escape /
  outside click / anchor off-screen via IntersectionObserver).
- tasksViewMode pref (graph default) with a select row in settings;
  58 new copy keys across zh/en/ja + 18 third-language dictionaries;
  dead CSS from the old tree/dock pruned.
- Tests: 6 new page-interaction specs (auto-collapse, both-mode toggle,
  jump, fold, popover); jobs-view suite re-pointed at the popover;
  prefs/builtins/smoke lock tests updated for the new pref.
This commit is contained in:
Menghuan1918
2026-09-27 22:18:14 +08:00
parent fdc4520080
commit 6448d8bad9
38 changed files with 4190 additions and 1387 deletions
+19 -1
View File
@@ -137,12 +137,30 @@ export function builtinTabs(): readonly TabDescriptor[] {
key: 'autoOpenJobs',
title: () => t('settingsJobsTitle'),
desc: () => t('settingsJobsDesc'),
}, {
key: 'tasksViewMode',
type: 'select',
title: () => t('settingsViewModeTitle'),
desc: () => t('settingsViewModeDesc'),
options: [
{
value: 'graph',
title: () => t('settingsViewModeGraph'),
desc: () => t('settingsViewModeGraphDesc'),
},
{
value: 'tree',
title: () => t('settingsViewModeTree'),
desc: () => t('settingsViewModeTreeDesc'),
},
],
}],
},
component: ({ ctx, scope, visible, onSubagentJump }) => (
component: ({ ctx, store, scope, visible, onSubagentJump }) => (
<SubagentView
sessionId={scope.sessionId}
ctx={ctx}
store={store}
active={visible}
onOpenChild={(address) => { onSubagentJump?.(address.childSessionId) }}
/>