Repository navigation
Agent Workflow v0.18.18
·
1741 commits
to main
since this release
Agent Workflow v0.18.18
本版本主线是 PostgreSQL provider 与一键迁移、节点语义统一(包装器可任意深度嵌套)、技能来源追溯:平台新增第二种数据库 provider,管理员提供一个外部 PostgreSQL 后一次点击即可完成检测 / 备份 / 迁移 / 校验 / 切换,且可续跑(RFC-349);工作流的每一种节点收敛为「参数 / 返回值 / 闭包 / 帧」四个概念,loop in loop 等嵌套不再被拒绝(RFC-354);技能版本可追溯到它吃进了哪几条记忆(RFC-353)。同时新增任务不活跃超时收割(RFC-350),并完成 Memory / Knowledge Evolution 两个 bounded context 的合同归位(RFC-352 / RFC-353)。
本版本含 1 个 SQLite 数据库迁移(迁移端点 0222 → 0223),并新增独立的 PostgreSQL migration history;工作流定义 schema 从 v5 升到 v6。升级前请务必备份数据库并阅读文末「升级说明」。
主要更新
PostgreSQL provider 与一键迁移(RFC-349)
- 新增
database.provider:sqlite(缺省,零配置安装完全不变)与postgresql。PostgreSQL server 由管理员、Docker / 编排环境或云厂商在二进制之外提供;单二进制自带 client adapter、连接池、双 dialect migration 与迁移引擎,不内嵌、不安装、不启动数据库 server,也不依赖本机psql/pg_dump。 - 一键迁移:Settings 与 CLI 调同一个 durable operation,自动串起 preflight → 受控维护模式 → SQLite 安全备份 → 目标 schema 初始化 → 分批复制 → 逐表校验 → provider 切换 → 健康检查,全程可查阶段 / 进度 / 错误;中断后从 durable checkpoint 续跑,而不是清库重来。
- 迁移窗口内停止新业务 admission,drain / fence writer、后台 job、outbox 与 apply,并保留独立的迁移状态页与诊断。
- 失败在 cutover horizon 之内自动留在或退回 SQLite;一旦 PostgreSQL 已接收业务新写,旧 SQLite 不再是无损回滚点(须走反向迁移)。
- 新增 canonical schema contract:184 张表逐张归入
KEEP/ARCHIVE_THEN_OMIT/DEFER;首批 6 张已证明零生产消费者的 legacy 表归档为只读 artifact 后不进入 PostgreSQL,其余 legacy 历史表继续在线迁移。 - backup / restore / doctor / readiness 按 provider 各自实现等价能力:SQLite 保留 PRAGMA / WAL / VACUUM 文件备份,新增 provider 中立的版本化逻辑备份(同版 manifest + chunks,可在空 target 完整还原),PostgreSQL 侧另有定时逻辑备份。
- 迁移期间的响应性修复:安全备份的完整性校验挪出主线程(此前会把 daemon 冻住十几秒)、拷贝阶段不再把整张表攒在内存里、块写入路径去掉重复校验(单块写入降 77%)、事件循环停顿超阈值当场记 WARN。
- 双 provider 行为差异修复:PostgreSQL 上 identity 列写不进去、布尔列被赋整数导致定时任务停不掉、
count/sum以字符串返回而静默改写计数与配额、两个 provider 的NULL排序相反导致认领扫描饿死新条目、用户搜索静默少召回,以及常态下的三处 500 与割接窗口的 WS 升级裸奔。 - 取证:1320 万行迁移 errors 0、crash/resume 26/26、三平台单二进制全绿、event-loop 最大停顿 493.6ms / 498.1ms(门槛 500ms,全程未调整)。
节点语义统一:参数 / 返回值 / 闭包 + 帧(RFC-354)
- 每一种节点现在只有四个概念:参数(以它为 target 的边)、返回值(以它为 source 可用的端口)、闭包(体外直连体内的边,容器执行打开时按词法环境绑定)、帧(每次执行一行
node_runs,挂在所属容器执行之下)。 - 包装器嵌套开放到任意深度:
loop in loop、三层以上嵌套均可保存并启动,wrapper-loop-nested禁令退役。node_runs新增帧轴(container_run_id+scope_path),iteration收窄为帧内轮次,嵌套不再碰撞。 - 闭包读点改读容器打开时绑定的环境(沿帧链查找),此前「
iteration ≤当前轮取最高」的数值近似退役——两层 loop 之内的 agent 也能拿到同一份外部值。 - PortRef 字段全部退役、由边表达:
review.inputSource、output.ports[].bind、wrapper-loop.outputBindings/exitCondition.nodeId、wrapper-fanout.inputs[]从定义中删除;loop 的返回值改用wrapper-output边界边(与 fanout 同形),退出条件改为对 loop 自己的返回值端口的谓词。导出的 YAML 更短,手写时只写edges。 - 系统通道注册表折进端口表,clarify 家族改用自己的行表达生命周期:未触发的轮次铸
skipped行,触发的轮次显示问答。 - 任务详情按帧展示:面包屑(如「外 2 › 内 3」)、抽屉帧行、运行历史分帧;崩溃恢复与单节点重试都按帧定位与级联。
- 把 wrapper 拖进 fanout 现在在校验面板立刻报错,而不是启动后才抛
v1-unsupported-inner-kind。
技能来源追溯与 Knowledge Evolution 归位(RFC-353)
- 新增
GET /api/skills/:id/provenance;技能详情页的版本行可展开,直接看这一版融合吃进了哪几条记忆——此前只有一句 changelog。 - 融合(fusion)的编排、状态机、worktree seeding、恢复循环与技能版本回滚整体迁入新的
knowledge-evolutionbounded context;/api/fusions全部端点与skill-catalog.restore-skill-version.v1的路径、入参、响应、错误码与权限逐字不变。 - fusion 持久化不再是跨聚合 god repository;技能回滚的记忆退还(unfuse)改由成员关系协调完成。
任务不活跃超时收割(RFC-350)
- 新增
taskIdleTimeout { enabled, idleHours }:任务树在阈值内没有任何 agent 事件或人类推进动作(评审决策 / 反问答复 / 问题派发决策 / 手动 resume·retry),则先杀 runtime 子进程树、再判canceled,详情页与审计写明静默时长与进程终止结果(含kill-failed/window-expired)。 - 开关默认关闭;开启后出厂阈值 168 小时(7 天),可配 1–8760 小时。收割只负责判终态,出库仍由既有
taskArchive保留期完成,两道开关正交。 - 补齐
interrupted任务树的归档面:daemon 重启翻出来的interrupted此前永远不会被归档删除,现在随既有taskArchive开关一起出库。
结构归位与稳定性
- Memory bounded context 合同归位(RFC-352):注入 / 蒸馏 / 调度 / 源上下文渲染迁进
modules/memory,删掉 8 个兼容 facade;授权谓词从 SQLite adapter 提到 application 层;记忆列表新增可选分页(既有调用者零改动)。用户可见行为、权限档位零变化。 - SQLite 写事务一律预占 writer(RFC-351):37 处绕过
dbTxSync的裸db.transaction收敛到统一原语,修掉「先读后写」升级触发SQLITE_BUSY_SNAPSHOT、在 HTTP 边界被兜成 500internal-error的问题(工具发布接口的偶发 500 即属此类)。 - Resource Catalog 合同 cutover 收口(RFC-345),HTTP 守卫扫描面随路由迁位一并扩到模块 inbound。
- 前端:资源权限保存撞 409 后丢弃本地草稿并刷回服务端权威值,不再让界面停在过期状态。
- CI:
postgresql-evidence周跑从两小时压到半小时,回归 lane 不再串在长 job 之后。
升级说明
- 数据库迁移:新增 SQLite migration
0223(node_runs帧轴)。另新增独立的 PostgreSQL migration history(0000baseline),仅在切换到 PostgreSQL 时使用。升级前务必备份数据库。 - 工作流 schema v5 → v6(重要):已保存的工作流定义读出时透明升级,画布与运行行为一字不差;导入 v4 / v5 YAML 同样自动升级。但 v6 导出的 YAML 无法被升级前的 daemon 导入(向下不兼容)——跨版本共享 YAML 的团队需要同步升级 daemon。
- 默认值不变:不配置
database.provider继续使用 SQLite,零配置安装路径与升级前一致;taskIdleTimeout.enabled默认为false,不会有任务因不活跃被自动终结。 - 切到 PostgreSQL 之后:cutover 后一旦产生业务新写,旧 SQLite 不再是有效回滚点,回退必须走反向迁移;源库、备份与 manifest 在管理员显式 finalize 且保留期满足前不会被删除。V1 有明确维护窗口,不承诺零停机,也不因能连 PostgreSQL 就开放多 daemon 或水平扩容。
- 不要在升级后的数据库上直接回退旧二进制:需要降级时,请停机、换回旧 binary,并恢复升级前备份。
完整变更记录:v0.18.17...v0.18.18