Skip to content

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

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions