数据模型/编辑器:链条加 stages 分层(前后端 + alembic 20260607_03);BusinessChainEditorPage 竖列 Stage 编辑 + 底部只读流程图预览;lib/dag-types + chain-stages 纯逻辑(含单测)。 调度(runDagOrchestration,方案 A 总控驱动):每个 stage 由总控经 agent_orchestration 派活给计划钉死的席位,批内 Promise.all 并行、批间 barrier 串行;末尾交回 runOrchestration 收口。抑制 leader 预广播 + 干净席位任务,根治『席位模仿派活』。 执行子模式:快速(双列·产物走正文·禁写文件 seat_parallel)/ 沙箱(单列·写 .md·沙箱跟随预览 seat);统一禁 bash(防 .py 脚本),提示词禁 .py。 显示:头像条 + 两列/单列 + ref 全量累积 + 节流 flush(仅选中渲染);DAG 流程图弹窗(按 stage 分列,节点随执行点亮,只到共识);沙箱跟随当前席位(防错位 + 修第一个席位自动开沙箱)。 按需取全文:新增 harness 只读工具 read_peer_delivery(从 run context 取网关注入的前序席位完整交付),席位默认看摘要、需要时取全文。 修:宽表溢出、并行自动下滑、data-lov-id Fragment 警告等。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
95 lines
4.2 KiB
TypeScript
95 lines
4.2 KiB
TypeScript
/**
|
||
* 业务链条(Business Chain)共享类型。
|
||
*
|
||
* 业务链条 = 一组**有序**的智能体编排模板,可命名、可复用、持久化在后端 MySQL
|
||
* (`/api/roundtable-chains`,按登录用户隔离)。在 Step 2 圆桌研讨里,总控会**按
|
||
* 链条顺序逐个派活**(见 `docs/multi-agent-business-chain-dev.md` §6)。
|
||
*
|
||
* 这里只放纯类型 / 常量,不含 React 状态或请求逻辑(CRUD 在 `api/chains.ts`)。
|
||
*/
|
||
|
||
/** 链条里的一个有序席位。`seats[0]` 是第一个发言者。 */
|
||
export interface ChainSeat {
|
||
agent_id: string;
|
||
/**
|
||
* 落库时的名称快照。展示时优先用实时 agent 数据(`listAgents()`),agent 被删
|
||
* 或改名时回退到此快照,避免链条卡片显示错乱。
|
||
*/
|
||
name: string;
|
||
/** 描述快照,同样作为实时数据的回退。 */
|
||
description?: string;
|
||
}
|
||
|
||
/** 一条可复用的业务链条(与后端 `/api/roundtable-chains` 记录对应)。 */
|
||
export interface BusinessChain {
|
||
id: string;
|
||
title: string;
|
||
description?: string;
|
||
/** 有序席位列表。 */
|
||
seats: ChainSeat[];
|
||
/**
|
||
* 可选「分层编排」:把 `seats` 分成若干阶段(stage),每个阶段内的 agent_id
|
||
* 并行、阶段之间串行。如 `[["a","b"],["c"]]` = (a‖b) → c。缺省 / null = 线性链
|
||
* (每席位独立一层)。有分层时,选入 Step 2 走 `dag` 编排(见 `lib/dag-types.ts`)。
|
||
*/
|
||
stages?: string[][] | null;
|
||
createdAt?: string;
|
||
updatedAt?: string;
|
||
}
|
||
|
||
/**
|
||
* 推荐弹窗(席位来源选择器)确认后回传给主页面的统一结果。
|
||
* 三种模式(智能推荐 / 业务链条线性 / 业务链条分层 DAG)最终都产出**有序**的
|
||
* `agents` + 一个 `mode`。
|
||
*/
|
||
export interface SeatSelectionResult {
|
||
/** 有序席位 —— 与现有 `handleConfirmAgents` 入参兼容。dag 模式下按 stage 展平排序。 */
|
||
agents: Array<{ agent_id: string; name: string }>;
|
||
/**
|
||
* 决定 Step 2 走哪种编排:
|
||
* - `recommend` 总控自由派活;
|
||
* - `chain` 按链条顺序逐位派活;
|
||
* - `dag` 分层并行(来源链条带 `stages` 时)。
|
||
*/
|
||
mode: "recommend" | "chain" | "dag";
|
||
/** chain / dag 模式带上来源链条(用于草稿快照 / Step 2 展示链名)。 */
|
||
chain?: Pick<BusinessChain, "id" | "title">;
|
||
/** dag 模式带上由链条 `stages` 构造的执行计划(见 `lib/dag-types.ts`)。 */
|
||
plan?: import("./dag-types").OrchestrationPlan;
|
||
/**
|
||
* dag 模式的执行子模式(仅 `mode === "dag"` 有意义):
|
||
* - `fast`(快速):同 stage 席位**并行**、主区**双列**显示、**禁写文件**(seat_parallel);
|
||
* - `sandbox`(沙箱):同 stage 席位仍**并行**,但主区**单列**显示、**允许写文件**(seat),
|
||
* 沙箱跟随当前显示的席位(点头像切换,沙箱内容随之切换/关闭)。
|
||
* 缺省 `fast`。
|
||
*/
|
||
dagExecMode?: "fast" | "sandbox";
|
||
}
|
||
|
||
/** 链条席位数硬约束,与圆桌推荐弹窗的 `MIN_SELECTED`/`MAX_SELECTED` 对齐。 */
|
||
export const CHAIN_MIN_SEATS = 2;
|
||
export const CHAIN_MAX_SEATS = 8;
|
||
|
||
/**
|
||
* 把 `getAvatarTypeFor()` 产出的头像配色(blue/purple/emerald/amber/pink/human)
|
||
* 映射成 tag chip 的 tailwind 类(背景 + 文字 + 边框,含深色变体)。
|
||
* 配置页的智能体 tag 与链条选择卡片的席位 tag 复用同一套色,视觉统一。
|
||
*/
|
||
export function chainTagClasses(avatarType: string): string {
|
||
switch (avatarType) {
|
||
case "purple":
|
||
return "bg-purple-500/10 text-purple-700 border-purple-300 dark:text-purple-300 dark:border-purple-700/60";
|
||
case "emerald":
|
||
return "bg-emerald-500/10 text-emerald-700 border-emerald-300 dark:text-emerald-300 dark:border-emerald-700/60";
|
||
case "amber":
|
||
return "bg-amber-500/10 text-amber-700 border-amber-300 dark:text-amber-300 dark:border-amber-700/60";
|
||
case "pink":
|
||
return "bg-pink-500/10 text-pink-700 border-pink-300 dark:text-pink-300 dark:border-pink-700/60";
|
||
case "human":
|
||
return "bg-slate-500/10 text-slate-700 border-slate-300 dark:text-slate-300 dark:border-slate-600/60";
|
||
case "blue":
|
||
default:
|
||
return "bg-blue-500/10 text-blue-700 border-blue-300 dark:text-blue-300 dark:border-blue-700/60";
|
||
}
|
||
}
|