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:
@@ -402,6 +402,64 @@ export const zh = {
|
||||
jobKill: '终止',
|
||||
jobKillConfirm: '再次点击确认终止',
|
||||
jobKillError: '终止失败',
|
||||
tasksViewGraph: '工作流图',
|
||||
tasksViewTree: '树状图',
|
||||
tasksViewSwitchToGraph: '切换为工作流图',
|
||||
tasksViewSwitchToTree: '切换为树状图',
|
||||
settingsViewModeTitle: '任务管理默认视图',
|
||||
settingsViewModeDesc: '任务管理页打开时的默认展示方式(页内仍可临时切换)',
|
||||
settingsViewModeGraph: '工作流图',
|
||||
settingsViewModeGraphDesc: '分层节点图,可缩放平移',
|
||||
settingsViewModeTree: '树状图',
|
||||
settingsViewModeTreeDesc: '经典缩进树,键盘可导航',
|
||||
tasksWorkflowMember: '工作流成员',
|
||||
tasksFoldCompleted: '✓ {count} 已完成',
|
||||
tasksFoldExpand: '展开已完成的节点',
|
||||
tasksFoldCollapse: '折叠已完成的节点',
|
||||
tasksZoomIn: '放大',
|
||||
tasksZoomOut: '缩小',
|
||||
tasksZoomFit: '适应画布',
|
||||
tasksNodeJump: '查看转录',
|
||||
tasksNodeState: '状态',
|
||||
tasksNodeMode: '模式',
|
||||
tasksNodeModel: '模型',
|
||||
tasksNodeTeamRole: '团队角色',
|
||||
tasksNodeActivity: '最近活动',
|
||||
tasksStateRunning: '运行中',
|
||||
tasksStateIdle: '待命',
|
||||
tasksStateDone: '已完成',
|
||||
tasksStateError: '出错',
|
||||
teamBoard: '团队任务板',
|
||||
teamChip: '团队 {members} 成员 · {tasks} 任务',
|
||||
teamMembers: '成员',
|
||||
teamTasksEmpty: '暂无共享任务',
|
||||
teamTaskCreate: '新建任务',
|
||||
teamTaskSubject: '标题',
|
||||
teamTaskDescription: '描述',
|
||||
teamTaskOwner: '负责人',
|
||||
teamTaskUnowned: '未认领',
|
||||
teamTaskPending: '待办',
|
||||
teamTaskInProgress: '进行中',
|
||||
teamTaskCompleted: '已完成',
|
||||
teamTaskBlocked: '阻塞',
|
||||
teamTaskComplete: '完成',
|
||||
teamTaskReopen: '重开',
|
||||
teamTaskDelete: '删除',
|
||||
teamTaskDeleteConfirm: '确认删除',
|
||||
teamTaskEdit: '编辑',
|
||||
teamTaskSave: '保存',
|
||||
teamTaskCancel: '取消',
|
||||
teamTaskConflict: '任务已被他人修改,已刷新',
|
||||
teamTaskError: '操作失败:{message}',
|
||||
teamTaskDeleted: '已删除',
|
||||
workflowRunning: '进行中',
|
||||
workflowCompleted: '已完成',
|
||||
workflowCancelled: '已取消',
|
||||
workflowFailed: '失败',
|
||||
workflowPhaseUnnamed: '未命名阶段',
|
||||
workflowMembers: '{done}/{total} 成员',
|
||||
jobsAutoCollapsed: '代理较多,已自动折叠',
|
||||
catalogLoadFailed: '{count} 个分支加载失败',
|
||||
addPluginsTabCard: '添加 Tab 插件',
|
||||
addPluginsTabCardDesc: '注册新的侧边栏页面',
|
||||
addPluginsViewerCard: '添加预览插件',
|
||||
@@ -837,6 +895,64 @@ export const en: Record<keyof typeof zh, string> = {
|
||||
jobKill: 'Kill',
|
||||
jobKillConfirm: 'Click again to confirm kill',
|
||||
jobKillError: 'Kill failed',
|
||||
tasksViewGraph: 'Workflow graph',
|
||||
tasksViewTree: 'Tree',
|
||||
tasksViewSwitchToGraph: 'Switch to the workflow graph',
|
||||
tasksViewSwitchToTree: 'Switch to the tree',
|
||||
settingsViewModeTitle: 'Tasks page default view',
|
||||
settingsViewModeDesc: 'How the Tasks page renders on open (the in-page toggle still flips it ad hoc)',
|
||||
settingsViewModeGraph: 'Workflow graph',
|
||||
settingsViewModeGraphDesc: 'Layered node graph with zoom and pan',
|
||||
settingsViewModeTree: 'Tree',
|
||||
settingsViewModeTreeDesc: 'Classic indentation tree, keyboard navigable',
|
||||
tasksWorkflowMember: 'Workflow member',
|
||||
tasksFoldCompleted: '✓ {count} completed',
|
||||
tasksFoldExpand: 'Expand the completed nodes',
|
||||
tasksFoldCollapse: 'Collapse the completed nodes',
|
||||
tasksZoomIn: 'Zoom in',
|
||||
tasksZoomOut: 'Zoom out',
|
||||
tasksZoomFit: 'Fit to canvas',
|
||||
tasksNodeJump: 'Open transcript',
|
||||
tasksNodeState: 'State',
|
||||
tasksNodeMode: 'Mode',
|
||||
tasksNodeModel: 'Model',
|
||||
tasksNodeTeamRole: 'Team role',
|
||||
tasksNodeActivity: 'Latest activity',
|
||||
tasksStateRunning: 'Running',
|
||||
tasksStateIdle: 'Idle',
|
||||
tasksStateDone: 'Done',
|
||||
tasksStateError: 'Error',
|
||||
teamBoard: 'Team task board',
|
||||
teamChip: 'Team {members} members · {tasks} tasks',
|
||||
teamMembers: 'Members',
|
||||
teamTasksEmpty: 'No shared tasks yet',
|
||||
teamTaskCreate: 'New task',
|
||||
teamTaskSubject: 'Subject',
|
||||
teamTaskDescription: 'Description',
|
||||
teamTaskOwner: 'Owner',
|
||||
teamTaskUnowned: 'Unclaimed',
|
||||
teamTaskPending: 'Pending',
|
||||
teamTaskInProgress: 'In progress',
|
||||
teamTaskCompleted: 'Completed',
|
||||
teamTaskBlocked: 'Blocked',
|
||||
teamTaskComplete: 'Complete',
|
||||
teamTaskReopen: 'Reopen',
|
||||
teamTaskDelete: 'Delete',
|
||||
teamTaskDeleteConfirm: 'Confirm delete',
|
||||
teamTaskEdit: 'Edit',
|
||||
teamTaskSave: 'Save',
|
||||
teamTaskCancel: 'Cancel',
|
||||
teamTaskConflict: 'The task changed elsewhere; refreshed',
|
||||
teamTaskError: 'Operation failed: {message}',
|
||||
teamTaskDeleted: 'Deleted',
|
||||
workflowRunning: 'Running',
|
||||
workflowCompleted: 'Completed',
|
||||
workflowCancelled: 'Cancelled',
|
||||
workflowFailed: 'Failed',
|
||||
workflowPhaseUnnamed: 'Unnamed phase',
|
||||
workflowMembers: '{done}/{total} members',
|
||||
jobsAutoCollapsed: 'Auto-collapsed (many agents)',
|
||||
catalogLoadFailed: '{count} branches failed to load',
|
||||
addPluginsTabCard: 'Add tab plugins',
|
||||
addPluginsTabCardDesc: 'Register a new sidebar page',
|
||||
addPluginsViewerCard: 'Add preview plugins',
|
||||
|
||||
Reference in New Issue
Block a user