Releases: kingdol666/AgentWorkShop
Release list
v0.7.45 — 定时任务调度 + DCW 写入保持窗 + 真实场景合并验收全绿
v0.7.45
Highlights
- feat(workshop) 定时任务调度:scheduled_tasks / scheduled_task_runs 双表 + ScheduleRuntime(10s tick)/ manager / repo 三层;interval(≥60s)与 daily(HH:MM)双模式;到点经 manager.submitChannelTask 向绑定 Channel 下发任务;忙等守卫(Channel 有未收口任务 → run-now 409 CHANNEL_BUSY,计划置 waiting,收口后到期补触发);对账收口(任务终态 → run COMPLETED/FAILED 留痕 + 连续失败熔断);scheduledCount 标志贯通前端(Channel 行「定时 n」标签 + /workshop/schedules 管理页:新建/启停/立即运行/运行历史)。(91fd319)
- feat(dcw) 写入保持窗(防参数震荡):DCW 节点新增 writeLockSeconds(默认 30s,创建/编辑可设,0 = 不锁,限界 0–3600);写成功即锁窗,窗内 agent/manual 新写一律 429 WRITE_FREQUENT「当前写入频繁」快速拒绝——不排队(排队写会在窗满后立刻落库,等同为持续篡改保留通道);rollback(安全回退)/ recipe(批量下发)豁免,AW_BENCH_MODE=1 基准旁路;前端建节点字段 + 列表展示 + 中英 i18n。(9d02513)
- feat(diag-bridge) v2.1.0:异步任务 API + kb_agent 协调(随 v0.7.44 版本号入档)。(1cc98fd)
验收全绿(本版实际验证,五个隔离实例 + 全新配置根)
- 新增真实场景合并 E2E
scripts/_dbg-real-scenario-e2e.mjs29/29:三节点并行首写 / 锁窗内并发 4 发全 429 / 异节点同时写互不牵连(锁按节点隔离)/ 并发突发恰 1 成功(在飞互斥 409 + 保持窗 429 双闸门)且节点终值 = 胜出写值 / 锁关闭(writeLockSeconds=0)顺序连发放行 / channel 忙等(409 CHANNEL_BUSY + waiting 不计次)/ 收口后 run-now 放行 / timer 到点自动补触发(trigger_kind=timer)+ Channel 收到定时下发任务 - 写保持窗 E2E 13/13 · 定时任务 E2E 31/31(双模式参数校验 / 忙等 / 对账收口 / 状态机 / timer)/ api-live 60/60(实例同开 AW_BENCH_MODE=1,基准旁路一并验证)· 产线权限 21/21 · 前端视觉验收 5/5(schedules 管理页表格 + workspace Channel「定时」标签,截图入档
scripts/_audit/schedules-ui/) - 定时器真实触发实测:60s 间隔计划在 ~75s 内被运行时自动触发并留痕
其他
- chore(bench): 清理过期基准档,冻结 20260920 stable-final 证据(b231f4e)
- chore(paper): TII 投稿目录整合(249cc17、61a2711)
打包
npm pack产物 agentworkshop-0.7.45.tgz(内含 .output 生产构建;安装后aw start即起生产服务)- 打包产物已做隔离配置根启动冒烟(setup 门 + 首注册 admin 正常)
Full Changelog: v0.7.43...v0.7.45
v0.7.43 — 代码体检全绿 + 停止按钮渲染修复 + 仓库清理
v0.7.43
Highlights
- fix(ui): 产线详情页「停止数采」按钮红底红字致标签不可见 —— 移除页面级配色重定义,回归全局 pill-btn.stop 令牌(浅色 #a83f34/深色 #ff8080,双主题已验证);新增
scripts/_sweep-button-contrast.mjs双主题×全路由 WCAG 对比度+空按钮扫描(当前 0 可疑点)。 - fix(types): 修复插件管理页
PLUGIN_DESC_KEYS索引类型错误(全应用nuxt typecheck唯一 TS 错误,现 0 错)。
体检全绿(本版实际验证)
eslint .0 problems /nuxt typecheck0 errors /aw build✓- api-live 60/60 · 产线权限 21/21 · UI 功能点击级 e2e 50 项 · 按钮对比度扫描 0 可疑(双主题×16 路由)
仓库清理
- 移除 17 个过期/一次性调试脚本(已退役门禁的现行替代:
bench/pipeline.mjs --profile integrated、_dbg-perms-e2e等常驻门禁全部保留)、i18n 一次性 codemod 残留、孤立 Rust 试验文件。 - 移除 29 份陈旧文档(历史审计报告 19 份、8 月旧设计计划 5 份、过期论文规划 3 份等);README 引用的验收报告
docs/audit/e2e-2026-09-07.md与设计宪法direction-approved.md保留。 - eslint 忽略
paper/**(论文资产树不入应用 lint);scripts/.npmignore防 hook 状态渗入 npm 包。 - 净删 14,827 行;
-225MB可再生截图产物(.e2e-shots/)与 195MB 陈旧数据备份在本地清除。
数据重置
- 本地发布流程已将运行数据根全量重置:首启进入 setup 模式,首个注册用户即 admin。
Full Changelog: v0.7.42...v0.7.43
v0.7.42 — 全站 i18n 补全与端到端验收
Highlights(用户可见变更)
Bug Fixes
- 模板挂载后频道列表不刷新:从 Channel 模板一步挂载成功后,新频道不再「消失」——现在立即出现在列表并自动选中(此前需手动刷新页面)
- 英文模式登录页输入框残留中文占位符:locale cookie 参与 SSR 首帧(与主题 cookie 同范式),SSR 与客户端渲染一致,水合竞态消除
- en 语言包残留 35 处中文回退值:logs 页整页文案(标题/筛选/表头/空态/人工录入)等全部补齐英文
- 挂载模板渠道后 setup 期常量词条竞态:BUCKETS/stateLabel/methodOptions 改为 computed,语言切换完整生效
i18n 全站补全
- 全库扫描清除 200 行 / 38 个组件 的硬编码中文,新增 201+89 条双语词条(中英各 2290 键完全对齐)
- 内置种子数据(模板/编组/频道模板)、协议模板目录、town 模型库、插件描述按稳定 ID 展示层映射翻译;用户自建/改名数据保持原文
- 英文模式 18 条路由截图验收:17 页零中文(唯一例外为 Windows 操作系统串口硬件描述,不属于 UI 文案)
Testing / 工程资产
- 新增 UI 功能端到端
scripts/_e2e-ui-functional.mjs:50 项点击级断言(工作区/频道/任务闭环/Token 生命周期/用户角色/插件热切换/语言往返/建线等)全部通过 - perms e2e 夹具自包含化(空实例可直接跑):21/21 通过
- 新增 i18n 验证管线脚本(硬编码扫描/locale 对齐/en 残留扫描/EN 全路由截图)
_dbg-live-line-e2e.mjs标注过时(端口与现行模拟器预设脱节),五协议闭环以 bench 管线 + e2e-plc-plugin-closedloop 为准
验收门禁(本版本全部通过)
- eslint 全仓 0 错误 · 插件生命周期 22/22 · SDK 出口面校验通过
- api-live e2e 60/60 · perms e2e 21/21 · bench 集成管线 PASS(73 过/2 警告/0 失败) · bench 静态层全维度 100
v0.7.38 — 稳定性护栏新增 upstream 分级:设备不可达不再带走整个平台
v0.7.38 — 稳定性护栏新增 upstream 分级:设备不可达不再带走整个平台
事故链
长跑实测发现:全局 aw start 的 0.7.37 实例在跑了约 52 分钟后静默消失 ——
端口释放、日志里却有正常的 API 流量与插件热重载记录。
追下去是稳定性护栏(server/plugins/dev-stability-guard.ts)的问题。它只把三类异常判为
"记录但不退进程":socket 断连、SQLite 瞬态忙、Agent 引擎边界错误。
其余一律 fatal → process.exit(1)。
而 connect ECONNREFUSED 127.0.0.1:1502(Modbus TCP 设备未启动)会以
unhandledRejection 形式到达护栏 → 落进 fatal 分支 → 整个生产实例退出。历史日志可直接看到:
[stability-guard] fatal unhandledRejection, exiting:
connect ECONNREFUSED 127.0.0.1:1502
一台设备没开,带走了数采 / 数控 / 数字孪生全平台。 现场实例里此刻就有 14 个节点指向那个
没启动的 1502,按 500ms 周期持续触发 —— 属可用性事故,不是调试噪声。
修法
新增第 4 级 upstream(外部设备/上游不可达):
| 级别 | 判定 | 处置 |
|---|---|---|
socket |
ECONNRESET / EPIPE / ECONNABORTED / ETIMEDOUT / 流提前关闭 | warn + 计数,继续 |
db-busy |
SQLITE_BUSY / SQLITE_LOCKED / database is locked | warn + 计数,继续 |
upstream |
ECONNREFUSED / ENOTFOUND / EHOSTUNREACH / ENETUNREACH / 连接超时 | error + 计数,继续 |
engine |
opencode·omp·codex·dsh API 边界错误 | error + 计数,继续 |
fatal |
其余一切(含安全插件 fail-fast) | 记日志 + exit 1 |
判定逻辑抽到 server/utils/stability-severity.ts,理由是它必须能被纯 node 断言:
"哪类异常该退进程"恰恰是最不该靠起真实服务观察来确认的一类逻辑。
护栏本体现在只负责订阅与分级输出。
fail-fast 语义完好:密钥校验失败之类未分类异常仍是 fatal,测试里逐条钉住。
验证
scripts/test-plugin-hardening.mjs新增第 3 节 16 条纯 node 断言(共 29 条):
5 种不可达 errno + 无 code 但 message 带 ECONNREFUSED、既有三级不回退、
4 条 fail-fast 必须仍为 fatal(含"引擎名只出现在 stack 里不得降级")。- 新增
scripts/_audit/guard-upstream-liveness.mjs端到端:建一条指向必然拒绝连接端口的
数采节点 → 开采集 → 断言服务仍健康。实测 5 PASS / 0 FAIL(实例稳定存活,日志无 fatal)。
证据等级如实说明:我没能从日志复原 13:04 那次退出的确切异常
(stdout 缓冲区未落盘),因此"本次静默消失 = ECONNREFUSED"是推断;
但"ECONNREFUSED 会走 fatal 退进程"有历史日志直接佐证,且该 errno 属运维常态这一点
与事故成因无关 —— 修复本身成立。
同时包含 0.7.37 的全部内容
- 发布包瘦身:文件数 2814 → 2493,38.6 → 35.6 MB,解包 121.2 → 107.6 MB
(清理 361 个零引用测试脚本与 260 MB 走查截图) - 版本声明守卫从 4 条扩到 6 条(当场命中并修好 SDK 站点孪生分叉)
aw-start-smoke三处假绿修复(dcw_control 报错被判 PASS、审计断言恒 FAIL、PV 桶数偶发不足)
校验
check-docs-sync 79/0 · test-plugin-hardening 29 · test-cli-exit 66/66 ·
test-data-root 52 · test-log-flooding 31 · test-plugin-lifecycle 22 · test-lru 20 ·
test-rollback-index 20 · test-memory-month-query 16 · test-events-index 8 ·
test-sdk-surface · 发布包验收 18/0 · eslint 0 error · tsc --noEmit 0
安装
npm i -g agentworkshop@latest --no-proxy
aw doctor && aw start0.7.35 / 0.7.36 从未发布到 npm,请勿在
npx agentworkshop@…中锁定这两个号。
v0.7.37 — 发布包瘦身(2814→2493 文件) + 版本声明守卫补全 + aw-start-smoke 两处假绿修复
v0.7.37 — 发布包瘦身 + 版本声明守卫补全 + aw-start-smoke 两处假绿修复
为什么有这个版本
npm 上的 latest 一直是 0.7.34,而仓库已经跑到 0.7.36 之后三个提交,文档却写着
「当前版本 v0.7.36」—— npm i -g agentworkshop 拿到的是两版之前的产物。
本版把仓库里的最新修复真正发到 npm。
没有沿用 0.7.36 的号:v0.7.36 tag 与 GitHub Release 已存在并指向 4d0b68a,
而 npm 上从未发过 0.7.36;若沿用,tag 所指提交与 npm 内容会永久对不上。
发布包瘦身
仓库里累积了 500+ 个一次性调试脚本,其中 361 个在源码/配置/文档里零引用。
先建引用索引取证(遍历每个脚本做 basename + 相对路径双向匹配),再按证据清理,
并内置安全闸:docs/full-test-plan.md 里出现的脚本一律不允许删除。
| 0.7.34(线上前一版) | 0.7.37 | |
|---|---|---|
| 包内文件数 | 2814 | 2493 |
| 包体积 | 38.6 MB | 35.6 MB |
| 解包体积 | 121.2 MB | 107.6 MB |
另外把 docs/full-test-plan.md 加进 files:它是常备测试手册,包内的
scripts/aw-start-smoke.mjs 注释直接引用它,不发就等于发了一份断链的说明书。
文档
- 版本声明同步到 0.7.37:README×2、CLI 手册×2、SDK 指南×2、插件指南×2,
并逐字节同步站点孪生(docs/site/**)。 check-docs-sync.mjs的版本声明断言从 4 条扩到 6 条(补上两个插件指南)。
这条守卫当场命中了它自己:扩完立刻报出docs/site/sdk/guide.md与
docs/site/en/sdk/guide.md与源文件分叉 —— 上一轮改docs/sdk.md时漏同步站点副本。
现 79 通过 / 0 失败。
测试脚本的两处假绿
全局 aw start 冒烟实测暴露了 scripts/aw-start-smoke.mjs 自身的断言缺陷:
- 「Agent dcw_control 下发 178」把报错判成 PASS —— 原判据是"文本长度 > 20 且不含「无权」",
而实际返回「工具桥不支持该协作工具: dcw_control」同样满足。改为同时看result.isError。
修完该断言如实变红,暴露出真问题:成员用无自有工具面的 harness(mock 等)时,
REST 直调的回退链够不到工业工具族(缺host-tool-bridge那一跳)。
真实引擎成员自带工具面,不受影响;属未修事项,已写进手册 §8 排障表(含定位与所需工作)。 - 「Agent 下发入审计」永远 FAIL —— 原判据取"全体最近一条 dcw.write",而同一脚本上一段
刚做过 REST 手动写(actorKind=user),必然命中它。改为先按来源过滤再断言 agent 有写入。 - 「PV 数采持续流入」在慢机上偶发失败 —— 采样节拍默认 5s,而判据前只
sleep(4000),
常常只攒到 1 个桶(同环境复跑实测 1 ↔ 26 桶)。改为轮询等待最多 30s。
校验
check-docs-sync79/0 ·test-cli-exit66/66 ·test-data-root52 ·test-log-flooding31test-plugin-lifecycle22 ·test-lru20 ·test-rollback-index20 ·
test-memory-month-query16 ·test-plugin-hardening13 ·test-events-index8 ·
test-sdk-surface- 发布包验收
_audit/verify-release-pack.mjs:18 通过 / 0 失败 - eslint 0 error ·
tsc --noEmit0 · 生产构建无file:///_entry.js占位符
安装
npm i -g agentworkshop@latest --no-proxy
aw doctor && aw start0.7.35 / 0.7.36 从未发布到 npm,请勿在
npx agentworkshop@…中锁定这两个号。
v0.7.36 — 文档对齐真实实现 + 8 个真实缺陷修复
v0.7.36 — 文档对齐真实实现,并修掉对齐过程中暴露的 7 个真实缺陷
这一版的主线是把 README / VitePress 双语文档全部对齐到代码事实。三个并行只读审计逐行
对照源码,独立对抗式复核又按机械规则随机抽样 41 条断言复验 —— 命中的假声明全部修掉,
而更要紧的是:对齐过程中暴露了 8 个真实代码缺陷,它们此前一直与文档承诺相矛盾。
修复的真实缺陷
| # | 缺陷 | 影响 |
|---|---|---|
| 1 | createPluginContext 漏接宿主的 onDispose 注入口 |
ctx.onDispose / ctx.timer.* / ctx.subscriptions.add 登记的清理永不执行:热重载后旧定时器继续跑,退出前 200ms 的 kv 写入丢失 |
| 2 | 客户端插件卸载挂在 visibilitychange→hidden 且 dispose() 一次性 |
用户切一次标签页,全部插件面板与订阅就永久失效直到刷新。改为 pagehide |
| 3 | ctx.route() 返回 undefined,类型声明却是 boolean |
宿主 registerRoute 少了 return;已补齐并只在成功时记账 |
| 4 | sdk/index.d.mts 与运行时两头不符 |
少了 4 个函数的声明 + 多个资源的 update/remove + permissions + ctx.config.define* + 宿主注入面;同时声明了一个运行时不存在的具名导出 el |
| 5 | 配置分组字段名:类型写 groups,宿主读 configGroups |
照类型写插件会得到一个被静默忽略的键 |
| 6 | -g / -f / -y 短选项被静默丢弃(无命令声明 meta.short) |
aw register x.mjs -g 不报错地注册到项目级而非用户级 |
| 7 | 设了 AW_HOME 时,全局注册的指令永远扫描不到 |
写侧用 awHome(env)、读侧用 homedir(),两边统一 |
| 8 | 对外示例本身是坏的 | 三个 sdk/examples/*/client.mjs 订阅的是服务端钩子名,浏览器里全是静默空订阅;Array.isArray(await api.lines.list()) 恒为 false(该接口返回 { lines, states }) |
另修:LIFECYCLE_EVENTS/CLIENT_EVENTS 两份"单一事实源"清单各缺一项;
config.yml 的 app.version 长期停在 0.7.9 而 /api/health 直接回显它(现以 package.json 为准,
实测已报 0.7.36);若干注释级事实源错误。
文档
- 新增英文事实源
docs/{cli,plugins,sdk}.en.md,部署工作流改为中英成对同步。
此前只有中文单页指南由 CI 覆盖,英文页长期手工维护,最大缺口达 87%
(英文 CLI 手册 29 行 vs 中文 227 行)。 - README / README-zh:补上一直缺失的 AML 模块、插件与 SDK 文档索引、完整路由清单、
退出码与--json契约;修正 73→98 设置项、6→14 执行引擎(并按接入形态分三类)、
"npm 安装首次要构建 2-3 分钟"(tarball 本就含.output)、"npx 零残留"、
不存在的版本迁移承诺、pnpm aw等。两份 README 经机械校验逐项 1:1
(40 标题 / 146 表格行 / 32 围栏 / 15 图 / 6 徽章)。 - 文档站新增
/guide/aml;补齐配置根解析规则与环境别名表、14 行引擎表、
英文许可证页(此前漏掉全部义务条款)、权限与数控读写页的英文程序化访问章节。 - 端到端验证段落改为可追溯(套件 → 最新结果 → 复跑命令),并区分当前 head 与历史基线。
视觉
文档站新增材质/动效/可读性层,并经一次敌意评审 + 15 条实测复验(15/15):
- 修掉一个真·阻断缺陷:
appearance:false却不声明 markdown 主题 → VitePress 注入了
浅色 Shiki 调色板,代码块里出现 1.49:1 的字符串色,正文级不可读。改用github-dark-default。 - 显式声明 CJK 字体族(VitePress 的 zh 默认栈里没有任何中文字体)。
- 导航玻璃、顶缘镜面、分层投影、弹簧缓动、阅读进度条(scroll-driven,零 JS)、分节入场、
焦点环修正、390px 布局修补。 - 评审提出的 5 个阻断项全部修复并复验:入场动画选择器此前匹配 0 个元素;
reduce-motion 总闸把每个侧栏条目都点亮成"当前页";:focus-visible{border-radius:0}
把 CTA 压成方角;390px 下控制台标题被挤成省略号;正文链接下划线规则漏排.hw-btn。
新增守卫
scripts/check-docs-sync.mjs(58 断言):CI 复制对逐字节同源、中英页对标题层级序列与
代码块数同构、文档里硬编码的版本号与 npx 锁定示例必须等于package.json、
13 类已知错误断言不得回归、VitePress 模板安全(正文裸尖括号会让构建直接失败)、
表格内联代码里未转义的竖线。scripts/test-plugin-lifecycle.mjs(22 断言)覆盖上面第 1、3 项。test-cli-exit.mjs增加 14 条断言:每个内建指令都必须能真正 import ——
registry 会把 import 失败吞进failures,指令静默消失而静态检查看不出来
(本次真实踩坑:模板字符串里漏转义一个反引号)。
验证
| 项目 | 结果 |
|---|---|
e2e-full-closedloop.mjs(0.7.36 生产构建,隔离环境) |
124 PASS / 0 FAIL |
e2e-aml.ts --real |
0 失败 |
check-docs-sync |
58 / 0 |
docs-v3-verify(视觉逐条实测) |
15 / 0 |
| 文档站构建 + 11 路由截图 | 全绿,0 前端/请求错误 |
| 离线套件 | cli-exit 66/66 · data-root 52 · log-flooding 31 · plugin-lifecycle 22 · lru 20 · rollback-index 20 · memory-month-query 16 · plugin-hardening 13 · events-index 8 · sdk-surface 全过 |
| 发布包验收 | 18 / 0 |
| eslint / tsc | 0 error / 0 |
安装
npm install -g agentworkshop
aw start本版 tarball 已随附(
agentworkshop-0.7.36.tgz),含预构建.output,npm 安装后直接启动、无需构建。