From 5ab3d7f2540c0c73f548f4dde68f2480b228bbf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=87=AF?= Date: Wed, 9 Sep 2026 22:29:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/AgentFlow.tsx | 33 +++++++++++++++++++ .../multi-agent-tasks.css | 5 +++ .../src/pages/official-task-analysis/store.ts | 16 +++++---- .../official-task-analysis/task-analysis.css | 22 ++----------- ...ant_wiki_and_report_collaboration_heads.py | 21 ++++++++++++ 5 files changed, 72 insertions(+), 25 deletions(-) create mode 100644 offline-backend-20260512/backend/packages/harness/deerflow/persistence/migrations/versions/20260909_01_merge_assistant_wiki_and_report_collaboration_heads.py diff --git a/frontend-web/src/pages/official-multi-agent-tasks/components/AgentFlow.tsx b/frontend-web/src/pages/official-multi-agent-tasks/components/AgentFlow.tsx index 6b4af95d..9a927c49 100644 --- a/frontend-web/src/pages/official-multi-agent-tasks/components/AgentFlow.tsx +++ b/frontend-web/src/pages/official-multi-agent-tasks/components/AgentFlow.tsx @@ -34,6 +34,39 @@ export default function AgentFlow({ }: AgentFlowProps) { const seatById = new Map(seats.map((seat) => [seat.agent_id, seat])); + // 只有一个阶段时不画阶段框:席位直接横向排列。 + if (stages.length === 1) { + return ( +
+ {stages[0]!.map((agentId) => { + const seat = seatById.get(agentId); + const state = seatStates?.[agentId] ?? null; + return ( +
+ + + + {seat?.name ?? agentId} + {state && ( + + )} +
+ ); + })} +
+ ); + } + return (
{stages.map((stage, stageIndex) => { diff --git a/frontend-web/src/pages/official-multi-agent-tasks/multi-agent-tasks.css b/frontend-web/src/pages/official-multi-agent-tasks/multi-agent-tasks.css index 9263b730..69f67d80 100644 --- a/frontend-web/src/pages/official-multi-agent-tasks/multi-agent-tasks.css +++ b/frontend-web/src/pages/official-multi-agent-tasks/multi-agent-tasks.css @@ -549,6 +549,11 @@ .mat-flow--sm .mat-flow-stage { padding: 6px; } .mat-flow--sm .mat-flow-stage-head { margin-bottom: 6px; } +/* 单阶段:无阶段框,席位横向并排 */ +.mat-flow--single { + gap: 6px; +} + /* 席位胶囊:浅底(-03 系)+ 深字(-10 系)+ 实填头像(-09),色序=§1.1.10 */ .mat-seat { align-items: center; diff --git a/frontend-web/src/pages/official-task-analysis/store.ts b/frontend-web/src/pages/official-task-analysis/store.ts index b48b35e0..39c24fa7 100644 --- a/frontend-web/src/pages/official-task-analysis/store.ts +++ b/frontend-web/src/pages/official-task-analysis/store.ts @@ -26,7 +26,7 @@ import type { TaTask, } from "./types"; -const STORAGE_KEY = "deerflow.official.task-analysis.v1"; +const STORAGE_KEY = "deerflow.official.task-analysis.v2"; interface TaStore { tasks: TaTask[]; @@ -126,8 +126,8 @@ function seedStore(): TaStore { name: "竞品新品发布追踪", description: "追踪 5 家核心竞品的新品发布与市场反应,按块更新详情内容。", binding: { - chainId: "seed-chain-std", - chainTitle: "标准舆情分析链", + chainId: "seed-chain-single", + chainTitle: "单阶段并行分析链", cron: "30 8 * * 1", cronText: "每周一 08:30", enabled: false, @@ -156,6 +156,7 @@ function seedStore(): TaStore { ["analyst"], ["writer"], ]; + const singleStages = [["collector", "verifier", "analyst"]]; const stdNames = seats; const runs: TaRunRecord[] = [ @@ -202,9 +203,9 @@ function seedStore(): TaStore { trigger: "schedule", scheduledFor: hoursAgo(24 * 3), startedAt: hoursAgo(24 * 3), - durationMs: PENDING_MS + stdStages.length * STAGE_MS, - stages: stdStages, - stageGoals: ["并行完成全网采集与数据核查", "研判风险与行动方向", "汇总各块结论"], + durationMs: PENDING_MS + singleStages.length * STAGE_MS, + stages: singleStages, + stageGoals: ["三席并行:采集 / 核查 / 研判同时产出"], seatNames: stdNames, failStage: null, }, @@ -507,6 +508,9 @@ export function chainStagesOf( ["writer"], ]; } + if (binding.chainId === "seed-chain-single") { + return [["collector", "verifier", "analyst"]]; + } // 真实业务链的编排由页面侧传入的 chain 数据展开;存储层兜底为单席位串行。 const seats = seedSeatsOf(store); return seats.map((agentId) => [agentId]); diff --git a/frontend-web/src/pages/official-task-analysis/task-analysis.css b/frontend-web/src/pages/official-task-analysis/task-analysis.css index 3d499f08..b6bd9276 100644 --- a/frontend-web/src/pages/official-task-analysis/task-analysis.css +++ b/frontend-web/src/pages/official-task-analysis/task-analysis.css @@ -939,15 +939,14 @@ } .ta-chain-card { - align-items: center; background: var(--mat-panel); border: 1px solid var(--mat-line); border-radius: 4px; cursor: pointer; - display: grid; + display: flex; font: inherit; - gap: 4px 16px; - grid-template-columns: minmax(220px, 320px) minmax(0, 1fr); + flex-direction: column; + gap: 8px; padding: 12px 16px; text-align: left; transition: border-color 120ms ease, box-shadow 120ms ease; @@ -968,8 +967,6 @@ color: var(--mat-primary); display: flex; gap: 6px; - grid-column: 1; - width: 100%; } .ta-chain-card.is-active header svg { @@ -999,18 +996,14 @@ -webkit-box-orient: vertical; -webkit-line-clamp: 2; font-size: 12px; - grid-column: 1; line-height: 1.5; margin: 0; overflow: hidden; } .ta-chain-card-flow { - align-self: center; background: var(--fs-004-02); border-radius: 2px; - grid-column: 2; - grid-row: 1 / span 2; overflow-x: auto; padding: 8px; width: 100%; @@ -1341,13 +1334,4 @@ .ta-chain-grid { grid-template-columns: 1fr; } - - .ta-chain-card { - grid-template-columns: 1fr; - } - - .ta-chain-card-flow { - grid-column: 1; - grid-row: auto; - } } diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/persistence/migrations/versions/20260909_01_merge_assistant_wiki_and_report_collaboration_heads.py b/offline-backend-20260512/backend/packages/harness/deerflow/persistence/migrations/versions/20260909_01_merge_assistant_wiki_and_report_collaboration_heads.py new file mode 100644 index 00000000..4a3707a4 --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/persistence/migrations/versions/20260909_01_merge_assistant_wiki_and_report_collaboration_heads.py @@ -0,0 +1,21 @@ +"""Merge assistant-wiki metadata and report-collaboration heads. + +Revision ID: 20260909_01 +Revises: 20260903_01, 20260907_01 +Create Date: 2026-09-09 +""" + +from __future__ import annotations + +revision = "20260909_01" +down_revision = ("20260903_01", "20260907_01") +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass