Skip to content

【实现】 Agent Loop 重构 Phase 1:Workflow 领域模型与持久化 #723

@wynxing

Description

@wynxing

关联 RFC / 架构

目标问题

Session 当前只能恢复线性消息、Plan、Todo 和 checkpoint,无法持久化 Workflow DAG、节点状态、Artifact、节点 transcript 和单调事件序列。没有独立领域模型,后续 Scheduler、节点恢复和 v5 协议会继续把状态堆入 runtime.Run 或 Session JSON 字段。

实现设计(How)

  • 在 Session 持久化边界中新增 WorkflowRun、WorkflowNode、WorkflowArtifact、NodeMessage、ToolReceipt 和 WorkflowEvent 模型。
  • 新增独立 SQLite 表,不把完整 DAG 塞进 sessions 单列。
  • 使用 revision compare-and-swap 保证状态迁移唯一;Artifact 采用不可变插入模型。
  • 状态迁移与事件 sequence 在同一事务提交,禁止事件先于状态或成功节点缺少 Artifact。
  • 提供 Store 接口:CreateWorkflow、LoadWorkflowSnapshot、TransitionNode、AppendNodeMessages、CommitNodeSuccess、AppendToolReceipt、ListEventsAfter、FinalizeWorkflow。
  • 旧 Session 没有 Workflow 数据时不伪造历史;下一次用户输入创建新 Workflow。
  • 迁移期间允许现有 Run 被包装为单 Execute 节点,但不得双写两套 Workflow 真源。

影响模块:internal/session、SQLite migration、Runtime 装配接口和持久化文档。

边界与非目标:本阶段不实现 Router、Planner、Scheduler 或新 UI;不改变 Provider/Tool 协议;不删除旧 Run。

任务拆解

  • 定义 Workflow、Node、Artifact、Receipt、Event 类型与状态常量。
  • 实现 DAG 基础校验和状态迁移校验。
  • 扩展 SQLite schema version,创建六类工作流表和必要索引。
  • 实现事务型 WorkflowStore 及 revision 冲突错误。
  • 实现 Workflow snapshot 深拷贝、事件增量读取和 Artifact digest 校验。
  • 为旧数据库执行向前迁移,并验证失败事务回滚。
  • 增加当前 Run 的单节点包装适配器,保持现有入口可运行。
  • 更新 Session 持久化与数据库设计文档。

测试与验证(Done)

  • 正常路径:创建 Workflow、提交节点成功、Artifact 和事件后可完整重载。
  • 边界条件:空 DAG、重复 Node ID、未知依赖、环、终态重复迁移被拒绝。
  • 异常分支:revision 冲突、事务中断、无效 JSON、digest 不一致和数据库取消返回稳定错误且不产生半提交。
  • 迁移路径:支持仓库现有 schema 版本升级;未知高版本继续 fail-fast。
  • 并发路径:两个 worker 竞争同一 revision 时只有一个提交成功。
  • 兼容路径:无 Workflow 的旧 Session 可正常加载并在新输入时创建 Workflow。
  • go test ./... 通过,新增修改逻辑达到 100% 覆盖目标。

风险与回滚

  • 风险:新增事务与现有 Session 更新发生锁竞争。通过短事务、索引和明确锁顺序控制。
  • 风险:迁移失败破坏本地会话库。所有 DDL/DML 在迁移事务内执行并保留备份建议。
  • 回滚:在正式写入 Workflow 数据前可回退二进制;新表不影响旧表读取。产生活动 Workflow 后只允许向前修复,不让旧二进制接管活动状态。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions