Skip to content

v0.18.13

Choose a tag to compare

@github-actions github-actions released this 25 Aug 23:51
· 2486 commits to main since this release

Agent Workflow v0.18.13

本版本交付四条线:数字员工的可理解性(RFC-318 把研发链路重做成九个原子业务节点、RFC-323 把 Adapter 从「分类共享工具」搬到「按员工绑定的泳道卡」);身份与凭据(RFC-320 用户档案成为 Git 提交身份的唯一来源、RFC-321 平台发布按归属用户选择个人/公共代码平台 token 并把受管 SSH remote 解析为 HTTP(S));授权与外部接口(RFC-324 资源授权分档为只读 / 可编辑、RFC-326 评审门补齐 MCP/API 完整面、RFC-327 记忆按 scope 与标签检索);稳定性与工程质量(RFC-322 修掉生产上「每隔一段时间全站冻结约 30 秒」、RFC-325 全平台下拉框默认带搜索、RFC-319 用户面 e2e 覆盖加固)。

本版本含 3 个数据库迁移与多处 wire 破坏性变更(任务创建不再接收 gitUserName / gitUserEmail;ACL 与任务成员端点的 userIds 改为带档位的 grants / members),升级前请务必备份数据库并阅读文末「升级说明」。

主要更新

数字员工:原子研发节点与按员工绑定的 Adapter(RFC-318 / RFC-323)

  • 九个原子业务节点(development@9 类型包,@1..@8 保持不可变):准备外部材料 / 编写实现方案 / 实现变更 / 处理检视意见 / 采集流水线状态 / 分类流水线失败 / 修复流水线失败 / 解决合并冲突 / 编写审批草稿。内部 work item 拓扑不变,development@9 把现有九个业务位置绑定到九个 v2 contract。原则只有三条——一个节点只做一个业务动作;tool 只收自己会消费的业务字段、只返回自己负责的业务结果;平台身份、调度、Context、workspace 量测与外部发布状态继续由平台机制负责。使用者看节点卡片即可回答「这个节点做什么 / 本次要输入什么 / 完成后留下什么 / 哪些才需要配置」,不必理解平台 envelope。
  • Adapter 按员工绑定:connectionRef 不再挂在分类工具注册上——此前同一个工具一旦绑定 Jenkins,员工 A 与员工 B 想用不同系统就只能复制两份工具注册。现在 Adapter 卡固定显示在声明 slot 的泳道首位,岗位模板给默认值、具体员工可覆盖;创建 / 编辑 / 发布 / 归档 / ACL 全部在就地弹窗完成,员工发布时冻结 exact revision + content digest + 来源,运行时不自动追最新。
  • 流水线采集改由平台 Adapter 执行:collect-pipeline 的企业事实取得不再允许自定义工具直接持有连接 / 凭据;Adapter 声明了 secret key 而 daemon 缺值时,由「可能运行后自行失败」改为 spawn 前 fail closed 并给出 typed remediation。
  • 旧界面退役:/code/executors 与 /code/config/adapters[/<id>](含原始 JSON 编辑器)删除,旧 URL 重定向;历史 Adapter 资源、API、表与 exact revision 一律不删,在途 Case 已冻结的 revision 语义不变。

用户档案驱动的 Git 提交身份(RFC-320)

  • 用户档案是 Git 提交身份的唯一来源,任务行是启动时的不可变快照:user.name = users.display_name、user.email = users.email,任务创建时冻结进 tasks.git_user_name / git_user_email,执行期注入 GIT_AUTHOR_* / GIT_COMMITTER_*。任务向导不再逐任务填写身份。
  • OIDC Provider 配置界面并列提供「用户名字段」(usernameClaim) 与「邮箱字段」(emailClaim),都可填自定义 userinfo claim;配置后即为严格合同——缺失 / 非法直接拒绝本次登录,不静默回退标准 email。每次登录刷新身份快照,并按三方快照语义同步档案(唯一例外:账号邮箱为空时下次拿到合法邮箱立即补齐)。
  • 新任务必须有完整显示名与邮箱,邮箱为空即拒绝创建,不退回后台统一身份。

用户级代码平台推送凭据与 SSH→HTTP(S) 传输解析(RFC-321)

  • 平台拥有的每一次 Git 发布,都按该工作的归属用户选择「个人代码平台 token → 平台公共 token」,把受管 SSH remote 解析成无凭据的 HTTP(S) endpoint 后,以一次性、目标绑定的 credential lease 完成整笔发布。账号页新增「代码提交与推送」页签自助录入个人 token。
  • 失败一律 fail loud:个人 token 失效不会无提示切换为公共身份;私有化部署 SSH/Web 地址不对称而 API 或管理员 mapping 缺失时不猜地址、直接拒绝;受管凭据存在时不再回退 URL 内嵌 token 或 SSH key。
  • 父仓 / 子模块改为逐 remote 选择凭据,父仓 token 不再隐式覆盖子模块。agent / runtime 自己执行的 git push 继续拿不到平台 token。

资源授权分档:只读 / 可编辑(RFC-324)

  • resource_grants 新增 level('read'|'write'),存量行全部回填 read——迁移前后对同一账户的可见性 / 可写性判定逐位不变(872 条断言的穷举等价性测试锁死)。判据内核抽成零依赖的 resourceAccessPolicy.ts。
  • 13 类资源的写门分档:只读被授权人对任一写路由得到 403 resource-read-only(不是 404、不是裸 forbidden),前端进入真只读态(画布拖不动、表单禁用、保存不可用),403 文案从「可能已删除」分流为「你对此资源只有只读授权」。
  • 任务成员出现「观察者 / 协作者」两档,新加成员默认协作者(与今天同权);定时任务新增两档 + ACL 端点,其可编辑档不含改绑启动目标与改名(定时任务到点以 owner 身份发起,改绑等于借 owner 身份跑任意东西)。
  • 降档实时生效:新增 resource-acl.changed 控制帧——此前 RFC-212 的连接重扫对降档(仍然看得见)什么都不做,页面不刷新就切不到只读。

评审门的 MCP / API 完整面(RFC-326)

  • 本地 AI 客户端通过 MCP 就能走完一整轮评审:找到待审 → 读正文(单 / 多文档、当前 / 历史)→ 逐条提意见 → 逐篇采纳 → 做决策,能力面与网页一致。此前 MCP 只有三个门工具且 submit_review 只送决策,iterate 因枚举不一致(iterate vs iterated)根本打不通。
  • 提意见只需要正文里逐字出现的一段引文(quote)+ 可选出现序号 / 章节,完整锚点由服务端按 markdown 源文解析;找不到或歧义时明确报错并列出候选,简化锚点绝不猜。REST 同步接受简化锚点,MCP 仍经 Dispatcher 走 /api/reviews/*,不出现第二个更弱的授权面。
  • 意见与决策可逐条提交也可一次打包(comments[] / selections[]),全部评审持久状态在一个数据库事务里落地——任一校验失败零写入,不再有半决策态。
  • 网页评审页对任何自洽锚点按源文偏移精确高亮:引文含行内标记、跨段落、锚在含标记的标题上、落在围栏代码块里都在正确位置出现 <mark>,不再有「按序号猜」的全局回退。
  • 顺带还掉 RFC-247 门工具零测试的债,并加一条「路由 ⟷ 工具双向完整」的棘轮。

记忆按 scope 与标签检索(RFC-327)

  • REST 记忆列表支持多标签过滤,语义可选 any(缺省)/ all,保留既有单值 tag。
  • 新增 GET /api/memories/facets:在调用者可见的记忆上聚合标签与计数,可按 scope 收窄——「有哪些标签可选」此前全仓无处可问,代理写记忆只能凭空造词。
  • MCP resource_read 支持 query 透传与 method:'facets',describe_resource 报出这套查询契约(模型不用猜参数名再读 422)。本地代理不必再「全量拉回来自己筛」,正是产品立项要避免的上下文膨胀。

全平台下拉框搜索(RFC-325)

  • 「要不要搜索」由调用点的自觉改为共享原语的默认行为:153 个 Select 调用点里此前有 128 处没有搜索,最痛的是 provider 分组的 ModelSelect(opencode models 一次可返回上百条,只能滚动找)。现在条目数够多的下拉打开即可打字,新写一个 <Select> 自动获得搜索;是/否、升序/降序这类小枚举保持现状,不多顶一个搜索框、不丢首字母跳转与空格选中。
  • 匹配面统一:主标题、值、描述、分组名都能搜到,中英文 / 全角半角 / 大小写差异不影响命中;键盘全程连贯(打开即打字,↑↓/Home/End/Enter 可用,Esc 一次清词、再一次关闭)。
  • 收口时由 WebKit 腿咬出一对相反的 picker 契约,终态是显式 openOnMount:权限面板的加人搜索框不许因拿到焦点而展开(否则盖住弹窗自己的按钮),转让弹窗的 picker 必须一打开就展开(两段式 Escape 依赖它)。

维护节奏错峰与停顿归因(RFC-322)

  • 起于生产实况:发布包部署反复出现「每隔一段时间全站冻结约 30 秒、随后自行恢复」,[db-slow] 打出 30 秒级语句;但同库实测该 SQL 走索引 10ms、外部进程 1Hz 连打 14 分钟零次超过 300ms。报出来的 32 秒不是查询代价,是 daemon 线程被占住 32 秒,慢查询日志把整段停顿栽赃给了当时正在执行的那条语句。
  • 根因是两个结构性事实叠加:daemon 只有一条 bun:sqlite 同步连接(每条 SQL 同步独占事件循环),而约 12 个 hourly 维护定时器在 boot 的同一秒内装配且零抖动。现在同周期维护任务在周期内均匀铺开,稳态下任一时刻至多一个重维护任务在跑;每个维护任务每拍的实际耗时可观测、超阈值带任务名告警;[db-slow] 能区分「这条 SQL 真的在干活」与「进程被冻住了」。

用户面 e2e 覆盖加固与架构治理(RFC-319 / RFC-294)

  • RFC-319 是本版提交量最大的一块(140 笔 test 提交):e2e/ 的 spec 文件 62 → 189,能力账本 840 条、剩余 gap 39 条,covered-unverified(审计判定有防护但证据仍是散文)清零——账本的三种状态只减不增,covered 的证据必须是 {file, test} 且守卫每次验证 test 标题逐字存在。
  • 写 e2e 的过程本身咬出多个真缺陷并当场修掉,例如:融合节点的结果清单穿不过隔离边界,融合从来就没真正跑通过;人机交互门在「同一节点上还有别人在等」时看不见;一份文档都没有时评审门把人困在门口;首页「等你处理」错了不报错、只让人以为今天没事。
  • RFC-294 侧落地 N1 canonical governance(架构账本 provenance 钉死、opaque-type 账本归一、CI 缺口关闭),继续 RFC-317 建立的「只降不升」机器棘轮。

其他修复

  • 发行二进制上 backup / migrate / migration-report / package 四条命令此前全是死的——一跑就挂,报的还是一句毫不相关的 Can't find meta/_journal.json file,backup 还会在全新 home 里留下空的 db.sqlite+-wal+-shm。根因是这四处直接把源码树路径交给 openDb,而单二进制里迁移是嵌进可执行文件的;同一段「先解包到 ~/.agent-workflow/runtime/migrations」的前置在仓内被抄了五遍、这四处漏抄。现收敛为唯一入口 resolveMigrationsFolder(),九个调用点全部改走它。
  • 配了 secret.key 的部署里,重试仓库准备与 boot 恢复漏传 secretBox——该出口 100% 不可用。
  • 内置模板 seeding 改为 create-or-converge,改模板文案不再拖垮 daemon 启动。
  • /me 后台续期不再挂起页面与摘除弹窗;数字员工的内部执行不再刷屏公开任务流;画布校验摘要让开工具条横带(修 Linux 上主操作点不到);转让弹窗 / 权限面板的 picker 展开契约成对锁死。
  • system-mock 的 SSE 分支 close 自我重入(一条走 SSE 的 e2e 刷 152 条栈溢出)已修。

升级说明

  • 数据库迁移:新增 3 个(0207_rfc320_oidc_email_claim.sql、0208_rfc321_repository_transport_credentials.sql、0209_rfc324_grant_levels.sql),迁移端点由 0206 前进到 0209。升级前务必备份数据库。
    • 0207 从持久化的定时任务 / 事件规则 launch payload 中移除 gitUserName / gitUserEmail(存量任务行保留其冻结的身份对)。
    • 0208 重建 code_host_connections(新增连接代次与 typed transport 映射),token 密文逐字节复制、迁移过程从不解封。
    • 0209 给 resource_grants 加 level 列并回填 read,行为等价。
  • 权限目录不变(仍 113 点),本版没有权限点增删或改名。
  • wire 破坏性变更(均为 tokenAccess: 'never' 的端点,PAT 本就调不到,影响面是自建脚本与会话 Cookie 调用方):
    • 任务创建不再接收 gitUserName / gitUserEmail,旧客户端继续发送会明确得到 task-git-identity-client-owned,不静默忽略。
    • PUT /api/{res}/:id/acl 的 userIds 删除,改为 grants: [{userId, level}];PUT /api/tasks/:id/members 的 userIds 改为带档位的 members;GET /acl 响应的 users: UserPublic[] 改为 grants: [{user, level}] 并新增 canEdit(canManage 语义不变)。按「删除优于 deprecate」直接切换,不留兼容字段。
  • 发布 transport 变化(RFC-321):若工作命中个人或公共受管 token,平台发布改走 HTTP(S)、不再使用 daemon SSH key / deploy key;要继续用 SSH,就不要为该 provider 启用受管 push credential。全局代码平台 token 新增 Git push 用途,必须具备 repository write 权限,权限不足 fail loud 不回退。管理员删除 / 改址代码平台连接会清除该连接下的个人 token 且不可恢复(UI 会显示影响数量并二次确认)。
  • 路由退役:/code/executors、/code/config/adapters[/<id>] 删除并重定向;四组执行器清单继续在数字员工分类工具箱、员工页与公开 API 中管理,Adapter 全生命周期移入泳道卡片的次级 Dialog。
  • 非 owner 的只读体感变化:打开别人的资源详情页 / 工作流编辑器时界面进入只读态。这不是能力收缩——后端一直拒绝这些写入,此前只是前台在骗人。需要对方能改时,在权限面板显式授「可编辑」档。
  • RFC-319 状态如实说明:RFC-319 仍为 In Progress——四层棘轮与账本机制已入网、逐批 spec 持续落主干,剩余 39 条 gap 仍在推进中。
  • 可直接替换对应平台二进制。

发布信息

  • 源码提交:b8c24a5c9557810c3b3d790fb8a6cad798b3b94d