{"version":"1.12.0","entries":[{"version":"1.12.0","date":"2026-10-19","items":["/api/overview 与 /api/public/overview 新增 approvalSlaBreached（待审批超阈值数）与 oldestWaitingMs（最久等待毫秒）——桌面轮询差分通知与角标数据源","GET /api/costs/reconcile?days=7（admin）：成本对账助手——按日台账汇总（任务数/成本分）+ 当前配置单价（in/out 分每 M tokens、缓存折扣）+ 智谱控制台人工比对四步说明（智谱账单 API 无公开端点，逐日猜测路径均 404，已实测确认）","桌面客户端 2.6.0：审批 SLA 超时差分系统通知（点击打开治理台）+ 任务行待审批等待时长角标（超 2h 琥珀色高亮）"]},{"version":"1.11.0","date":"2026-10-19","items":["待审批超时升级提醒：超过 AGW_APPROVAL_SLA_HOURS（默认 2 小时）推 approval_sla warning 告警，超过 3 倍阈值（默认 6 小时）再推 critical 升级；每 run 每级别只告警一次，决策后停止；审计留痕 approval.sla.remind / approval.sla.escalate","RunRecord 新增 approvalRequestedAt（进入待审批的时刻，SLA 起点 + 时间线可扩展）","告警类型新增 approval_sla"]},{"version":"1.10.0","date":"2026-10-19","items":["run 状态实时打到来源 issue 标签：治理-待审批 / 治理-执行中 / 治理-已交付 / 治理-失败（新模块 plane-labels.ts，挂 run-waiting-approval / run-started / run-finished 三事件）","标签自动创建（项目内首次遇到时按需建，进程内缓存）；同步前读 issue 现状做差量（只动治理-* 标签，其余原样保留）；同一 issue 串行化防 started/finished 交错；fire-and-forget 失败静默","PlaneClient 新增 listProjectLabels / createLabel","桌面客户端 2.5.0：任务页新增「周报复盘」卡片（管理员，预览/下载）；托盘菜单新增「本周周报」直达"]},{"version":"1.9.0","date":"2026-10-19","items":["周报定时推送：配置 AGW_REPORT_PUSH_DAY（0=周日…6=周六）+ AGW_REPORT_PUSH_HOUR（默认 9）即启用，每周固定时刻把周报 Markdown 推到告警 webhook 通道（需已配 AGW_ALERT_WEBHOOK_URLS）；当日去重，推送留痕审计（report.weekly.push）","待审批 issue 评论：run 进入 waiting_approval 时自动在来源 Plane issue 评论「⏳ 等待管理员审批…@提交人」，提交人即时可见；fire-and-forget 不阻塞审批链路（新模块 approval-comment.ts，未对接 Plane 时自动跳过）"]},{"version":"1.8.0","date":"2026-10-19","items":["GET /api/report/weekly?weeksAgo=N（admin）：Markdown 周报（总览/成功率/成本日均/通道分布/耗时 P50·P95/用户排行/审批与安全观测），数据源 = 台账（跨重启）+ 审计 + 内存运行记录","POST /api/report/weekly/push（admin）：周报 Markdown 复用告警 webhook 通道推送（飞书 text 格式兼容；需先配 AGW_ALERT_WEBHOOK_URLS）","Plane 成员映射自动指派：桌面建 issue 认领归属后，webhook 建 run 时按提交人邮箱匹配工作区成员（大小写不敏感，成员列表 10 分钟缓存），自动把 issue 指派给提交人——提交人在 Plane 上一眼看到自己的任务；指派失败静默不影响主链路","告警类型新增 weekly_report（severity: info，飞书图标 📊）","治理台新增「周报复盘」卡片（admin）：预览 / 下载 .md / 一键推送"]},{"version":"1.7.0","date":"2026-10-19","items":["GET /api/audit/export（admin）：审计日志 CSV 导出（UTF-8 BOM，Excel 直开中文不乱码；引号/逗号按 RFC 4180 转义）","登录连击告警：同 IP 5 分钟内失败 ≥10 次（AGW_BRUTE_FORCE_THRESHOLD 可调）推送 auth_brute_force 告警（复用 AGW_ALERT_WEBHOOK_URLS 通道，飞书格式兼容）；与登录限流器双保险——第 11 次起直接 429 截断洪水","运行记录时间线字段：approvalAt（审批决策时刻）与 mergedAt（合并上线时刻）落 record，连同已有 createdAt/startedAt/finishedAt 供前端渲染「创建→审批→执行→完成→合并」全程时间线","任务行点击展开进度时间线：五环节时间点 + 各环节耗时 + 全程总时长 + 失败原因内联展示"]},{"version":"1.6.0","date":"2026-10-19","items":["视图隔离：member/viewer 的运行与待审批列表只显示自己提交的任务（admin 看全部，可 ?userId= 过滤指定人）","审批决策收归 admin 专属（member 不能审批自己的任务，职责分离）","审计日志 audit.jsonl：登录成功/失败、任务创建、审批通过/拒绝、合并上线、预算策略增删、通道复位、事故处理、改密、用户管理、反馈回复全量留痕（含操作者与 IP）；GET /api/audit（admin 专属）；重启从磁盘恢复","POST /api/issue-ownership：桌面建 issue 后认领归属，webhook 自动建 run 时挂到提交人名下（否则 member 视图看不到自己建的任务）","潜伏 BUG：isAdmin 在鉴权闸门兜底赋值之前计算，openMode（无 Token 无用户）下落成 undefined——此前只影响几个 403 路由未暴露，视图过滤上线后导致匿名模式全部数据不可见；已把闸门前移（返工测试红→绿）","建任务后自动认领 issue 归属：webhook 建 run 挂到提交人名下，member 在任务页能看到自己的任务进度","待审批卡按角色收敛：member 显示「等待管理员审批」，不渲染通过/拒绝按钮（与服务端 403 一致）","治理台同步：审计日志卡片（admin，30s 自动刷新）+ 审批按钮角色隐藏"]},{"version":"1.5.0","date":"2026-10-19","items":["POST /api/auth/password：改密（校验旧密码；成功后吊销全部旧会话并返回新会话令牌，当前设备换票不掉线）","GET /api/users（admin）：用户列表（不含密码哈希）","PATCH /api/users/:id（admin）：改角色（admin/member/viewer）/ 禁用启用；降权与禁用即时吊销目标全部会话；防自锁（不能对自己降权/禁用）","禁用账号：拒绝登录 + 现有会话立即失效","设置页新增修改密码（新令牌在主进程换发，渲染层不接触明文）","管理员用户管理面板：改角色 / 禁用启用，自己一行锁定不可操作","任务页按角色收敛：非管理员不再显示「合并」按钮（与服务端权限一致）","治理台同步新增「用户管理」卡片（admin 专属）与顶栏身份徽章"]},{"version":"1.4.2","date":"2026-10-19","items":["AGW_ADMIN_EMAILS 环境变量：配置后，首个注册账号（自动获得 admin）必须命中白名单邮箱，防止公网陌生人抢注管理员；管理员就位后其他人正常注册为 member"]},{"version":"1.4.1","date":"2026-10-19","items":["严重：/api/auth/register 与 /api/auth/login 位于鉴权闸门之后，未登录请求一律 401，注册登录完全不可用；移入公开区（me/logout 仍在鉴权后）","新增回归测试 test/auth.test.ts（4 例）：无 Token 注册/登录可达、角色权限、限流、会话持久化与过期清理","登录/注册防暴力破解：每 IP 每分钟 10 次（X-Real-IP 分桶，429）","新增登录/注册浮层：注册即自动登录，未登录不装载任何数据；管理员 AGW_TOKEN 本机自动放行","会话令牌仅存主进程，渲染层不接触明文；请求优先用登录身份（运行记录挂到人）","顶栏用户身份徽章（昵称 + 角色）+ 设置页退出登录","修复 v2.0.0 设置面板样式整体丢失导致 ⚙ 打不开的回归"]},{"version":"1.4.0","date":"2026-10-19","items":["用户注册/登录/登出/当前用户","角色权限：admin / member / viewer","密码 scrypt 哈希、会话令牌 30 天、最多 100 用户","运行记录挂创建者 userId","AGW_TOKEN 保留为 admin 后门","webhook 路由鉴权中间件绕过","PlaneClient 全请求 15s 超时"]},{"version":"1.3.4","date":"2026-10-19","items":["公开总览新增 lastRun/lastMerge 摘要（桌面轮询差分推送「任务完成/失败/已合并上线」）","治理台审批项锚点：`#approval=<id>` hash 定位 + 高亮（桌面通知点击直达具体审批项）","合并上线记录 lastMerge 供活动流"]},{"version":"1.3.3","date":"2026-10-19","items":["治理台：Token 注入成功后自动从地址栏抹掉 query（防残留浏览器历史/截屏）","README 环境变量表补齐 LLM 折算单价与 SUCCESS_STATE 等缺失行（文档时效）","前端 JS 专项扫描：esc 转义覆盖完整，无新缺陷"]},{"version":"1.3.2","date":"2026-10-19","items":["预算策略数字未消毒：NaN 金额让预算判定永久失效、负数上限永久拦截 → safeNumber 消毒并夹界","运行 timeoutSec 为 NaN 会让 setTimeout 立即触发（任务秒杀）→ 消毒夹界 [5, 86400]","台账入账 NaN 会永久毒化求和（该范围预算闸门全废）→ 入账兜底为 0（最后防线）","防御纵深：server/runner/ledger 三层各自消毒 + 回归测试"]},{"version":"1.3.1","date":"2026-10-19","items":["自动建 run 的去重占位改为同步抢占（此前在 2.5s 补拉窗口内，并发的第二个","回归测试：空正文不占位可重触发 / 双事件不重复"]},{"version":"1.3.0","date":"2026-10-19","items":["反馈限流在反代后误伤：按 socket IP 计数，nginx 后全站共享 127.0.0.1 一个桶；","孤儿 worktree 清理误删未合并交付：改为 7 天保护期，路径 realpath 归一化防归属失败","测试 50/50（+2：限流分桶、清理安全策略）"]},{"version":"1.2.1","date":"2026-10-19","items":["PlaneClient 全部请求增加 15 秒超时（此前 Plane 不可达会永久阻塞回写/补拉链路）","非法 JSON 请求体统一返回 400（此前处理函数内抛错变成 500）","治理台 Token 注入改为常量时间比较（哈希后 timingSafeEqual）"]},{"version":"1.2.0","date":"2026-10-19","items":["新建 Plane 项目「运维工具箱」（OPS）→ 映射 /www/apps/plane-aio 部署配置仓库","生产实测：OPS 下发运维手册任务 → 多仓库路由正确 → GLM-4.6 生成 MAINTENANCE.md →"]},{"version":"1.1.0","date":"2026-10-19","items":["🔴 **今日/近 7 天消费恒为 ¥0**：按 workspace 范围求和，而任务默认 project 范围——","终态 run 记录内存无上限：加 FIFO 上限（默认 500，在途记录不淘汰）","孤儿 worktree 开机清理：崩溃/重启遗留目录超 24h 自动 remove+prune","公开总览扩展累计指标（totalRuns/successRate/totalCostCents），治理台 KPI 同步展示"]},{"version":"1.0.0","date":"2026-10-19","items":["**复盘统计接口** `GET /api/stats`：总/成功/完成运行数、成功率、总成本、均成本、","**质量门拦截回写 issue**：质量门未通过阻止上线时，自动把失败日志尾部写成"]},{"version":"0.9.0","date":"2026-10-19","items":["**真实成本入账**：claude_code 默认改用 `--output-format json`，runner 从结果事件解析","**质量门流水线**：testCommand 支持命令数组（如 [\"npm ci\",\"npm test\"]），顺序执行、","合并成功后向来源 Plane issue 追加「已合并上线」评论（含上线 commit 与质量门状态）"]},{"version":"0.8.0","date":"2026-10-19","items":["**合并前质量门**：repos.json 仓库条目新增 `testCommand`（在 worktree 内 shell 执行，","**待审批主动告警**：run 停在审批门即推送 approval_pending（配合飞书机器人实现主动找人）","质量门超时可用请求体 testTimeoutSec 覆盖（默认 600s）"]},{"version":"0.7.0","date":"2026-10-19","items":["**仓库注册表**（`data/repos.json`，改完即生效）：Plane 项目 id/slug → {repoPath,","**返工流程**（`AGW_REWORK_LABEL`，默认 rework）：打返工标签的 issue 可再次自动执行，","反馈限流表防无界增长（>400 条时清理过期 IP）"]},{"version":"0.6.0","date":"2026-10-19","items":["**合并上线**：`POST /api/runs/:id/merge-worktree`（治理台按钮「合并上线」）——","claude_code 成本入账：`AGW_CLAUDE_COST_CENTS`（默认 20 分/次估算，待账单校准）","worktree slug 清洗优化：纯中文标题回退 \"run\"，混合标题保留 ASCII 段","自动建 run 去重集合加 FIFO 上限（1000）防无界增长"]},{"version":"0.5.0","date":"2026-10-19","items":["claude_code/codex 适配器命令可经 `AGW_CLAUDE_COMMAND`/`AGW_CODEX_COMMAND` 覆盖","自动建 run 支持 `AGW_AUTO_RUN_REPO_PATH` + `AGW_AUTO_RUN_USE_WORKTREE=true`：","claude_code 画像支持 `max_turns`（`AGW_CLAUDE_MAX_TURNS`，默认 50）：","**webhook 正文补拉**：Plane webhook payload 不含 description 内容且 create 信号时","自动派发 prompt 追加命令式执行约束（实测非 Claude 系模型会反问澄清而不动手）","compose 启动自装 git/bash（worktree 与 Claude Code Bash 工具依赖）；透传 SHELL=/bin/bash","生产通道：**Claude Code CLI（容器内卷安装）+ 智谱 GLM-4.6 Anthropic 兼容端点**","真实编码 E2E 最终打通：Plane issue（agent 标签 + description_html 任务正文）→"]},{"version":"0.4.0","date":"2026-10-19","items":["**告警通知**（AGW_ALERT_WEBHOOK_URLS 逗号分隔多目标 / AGW_ALERT_FORMAT=raw|feishu）：","通道探活结果随 /api/adapters 暴露；generic 适配器支持 AGW_GENERIC_ARGS_TEMPLATE 参数模板","**Plane webhook 动词不匹配**：新版 Plane 发 created/updated/deleted，网关只认 create/update，","**自动建 run 去重依赖 Plane 客户端配置**：未配置时 run.plane 为空导致同一 issue 重复建 run；","反馈提交限流移到校验前（防绕过），CORS OPTIONS 预检补全","Plane 本体（AIO stable + Postgres/Redis/RabbitMQ/SeaweedFS）已部署 plane.tongqiansuanzhi.cn，"]},{"version":"0.3.0","date":"2026-10-19","items":["**run→Plane 回写闭环**：自动建 run 记录来源 issue；运行结束自动在 issue 追加结果评论","**通道健康探针**：`AGW_PROBE_INTERVAL_SEC>0` 开启，定时 `--version` 探活各适配器 CLI，","**熔断自动降级**：主通道熔断时自动切到适配器声明的 `fallbackTo` 备选","适配器接口暴露 fallbackTo 与探活结果（/api/adapters）","治理台 Token 注入：`/dashboard/?token=<AGW_TOKEN>` 校验通过后注入页面，管理面板可用；","**预算硬停二次检查失效**：原实现依赖「新事故」的存在，事故去重后第二次 check 会放行；","**在途上限语义失效**：原「单批任务数」按创建时间窗口统计永远≈1，上限形同虚设；","**batch 窗口消费统计**起点改为本范围最早在途 run 的创建时间","**官网反馈表单崩溃**：`form.name` 命中 HTMLFormElement 内置属性导致 submit 抛 TypeError；","反馈接口新增每 IP 每分钟 5 条限流（429）","CORS Vary 头在非白名单来源也携带，防中间缓存串源；补 OPTIONS 预检"]},{"version":"0.2.0","date":"2026-10-19","items":["版本接口 `GET /api/version` 与更新日志接口 `GET /api/changelog`（免鉴权，","公开总览 `GET /api/public/overview`（安全字段白名单：今日消费/在跑/熔断数/事故数）","问题反馈：`POST /api/feedback` 公开提交（蜜罐反机器人、内容校验、上限 200 条","反馈存储为 JSONL 事件日志（同 id 后写覆盖），重启状态不丢","治理台仪表盘新增反馈管理面板（查看/回复/版本展示）","停止运行后终态误标为 failed 的问题（现保留 stopped）"]},{"version":"0.1.0","date":"2026-10-18","items":["适配器注册表：claude_code / codex / gemini / generic（ZCode 等自定义 CLI 经","治理三闸门：熔断（连续失败/失败率自动停，人工复位）→ 预算（日/批窗口，","运行生命周期：queued → waiting_approval → running → succeeded/failed/timeout/","git worktree 隔离执行（可选），用后可清理","消费台账：只追加 JSONL，可审计；预算判定全部由台账窗口求和得出","Plane 对接：REST（X-Api-Key）客户端 + webhook 接收器（X-Plane-Signature","治理台仪表盘（零依赖单文件，深色设计系统）：总览 KPI、运行记录、审批、","测试 19 例（node:test 零依赖），tsc --noEmit 通过"]}]}