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
+58
View File
@@ -373,6 +373,64 @@ export const pt: Record<string, string> = {
jobKill: 'Encerrar',
jobKillConfirm: 'Clique novamente para confirmar o encerramento',
jobKillError: 'Falha ao encerrar',
tasksViewGraph: 'Grafo do workflow',
tasksViewTree: 'Árvore',
tasksViewSwitchToGraph: 'Mudar para o grafo do workflow',
tasksViewSwitchToTree: 'Mudar para a árvore',
settingsViewModeTitle: 'Visualização padrão da página de tarefas',
settingsViewModeDesc: 'Como a página de tarefas é exibida ao abrir (o seletor na própria página ainda permite alternar pontualmente)',
settingsViewModeGraph: 'Grafo do workflow',
settingsViewModeGraphDesc: 'Grafo de nós em camadas, com zoom e deslocamento',
settingsViewModeTree: 'Árvore',
settingsViewModeTreeDesc: 'Árvore com indentação clássica, navegável pelo teclado',
tasksWorkflowMember: 'Membro do workflow',
tasksFoldCompleted: '✓ {count} concluídos',
tasksFoldExpand: 'Expandir os nós concluídos',
tasksFoldCollapse: 'Recolher os nós concluídos',
tasksZoomIn: 'Aproximar',
tasksZoomOut: 'Afastar',
tasksZoomFit: 'Ajustar à tela',
tasksNodeJump: 'Abrir transcrição',
tasksNodeState: 'Estado',
tasksNodeMode: 'Modo',
tasksNodeModel: 'Modelo',
tasksNodeTeamRole: 'Função na equipe',
tasksNodeActivity: 'Atividade recente',
tasksStateRunning: 'Em execução',
tasksStateIdle: 'Em espera',
tasksStateDone: 'Concluído',
tasksStateError: 'Erro',
teamBoard: 'Quadro de tarefas da equipe',
teamChip: 'Equipe {members} membros · {tasks} tarefas',
teamMembers: 'Membros',
teamTasksEmpty: 'Ainda não há tarefas compartilhadas',
teamTaskCreate: 'Nova tarefa',
teamTaskSubject: 'Assunto',
teamTaskDescription: 'Descrição',
teamTaskOwner: 'Responsável',
teamTaskUnowned: 'Não reivindicada',
teamTaskPending: 'Pendente',
teamTaskInProgress: 'Em andamento',
teamTaskCompleted: 'Concluída',
teamTaskBlocked: 'Bloqueada',
teamTaskComplete: 'Concluir',
teamTaskReopen: 'Reabrir',
teamTaskDelete: 'Excluir',
teamTaskDeleteConfirm: 'Confirmar exclusão',
teamTaskEdit: 'Editar',
teamTaskSave: 'Salvar',
teamTaskCancel: 'Cancelar',
teamTaskConflict: 'A tarefa foi alterada por outra pessoa; atualizada',
teamTaskError: 'Operação falhou: {message}',
teamTaskDeleted: 'Excluída',
workflowRunning: 'Em execução',
workflowCompleted: 'Concluído',
workflowCancelled: 'Cancelado',
workflowFailed: 'Falhou',
workflowPhaseUnnamed: 'Fase sem nome',
workflowMembers: '{done}/{total} membros',
jobsAutoCollapsed: 'Recolhido automaticamente (muitos agentes)',
catalogLoadFailed: 'Falha ao carregar {count} branches',
addPluginsTabCard: 'Adicionar plugins de aba',
addPluginsTabCardDesc: 'Registrar uma nova página da barra lateral',
addPluginsViewerCard: 'Adicionar plugins de pré-visualização',