Skip to content

Releases: kingdol666/AgentWorkShop

v0.7.45 — 定时任务调度 + DCW 写入保持窗 + 真实场景合并验收全绿

Choose a tag to compare

@kingdol666 kingdol666 released this 21 Sep 03:06

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.mjs 29/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 — 代码体检全绿 + 停止按钮渲染修复 + 仓库清理

Choose a tag to compare

@kingdol666 kingdol666 released this 20 Sep 04:08

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 typecheck 0 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 补全与端到端验收

Choose a tag to compare

@kingdol666 kingdol666 released this 19 Sep 18:01

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 分级:设备不可达不再带走整个平台

Choose a tag to compare

@kingdol666 kingdol666 released this 12 Sep 05:19

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 start

0.7.35 / 0.7.36 从未发布到 npm,请勿在 npx agentworkshop@… 中锁定这两个号。

v0.7.37 — 发布包瘦身(2814→2493 文件) + 版本声明守卫补全 + aw-start-smoke 两处假绿修复

Choose a tag to compare

@kingdol666 kingdol666 released this 12 Sep 04:14

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 自身的断言缺陷:

  1. 「Agent dcw_control 下发 178」把报错判成 PASS —— 原判据是"文本长度 > 20 且不含「无权」",
    而实际返回「工具桥不支持该协作工具: dcw_control」同样满足。改为同时看 result.isError。
    修完该断言如实变红,暴露出真问题:成员用无自有工具面的 harness(mock 等)时,
    REST 直调的回退链够不到工业工具族(缺 host-tool-bridge 那一跳)。
    真实引擎成员自带工具面,不受影响;属未修事项,已写进手册 §8 排障表(含定位与所需工作)。
  2. 「Agent 下发入审计」永远 FAIL —— 原判据取"全体最近一条 dcw.write",而同一脚本上一段
    刚做过 REST 手动写(actorKind=user),必然命中它。改为先按来源过滤再断言 agent 有写入。
  3. 「PV 数采持续流入」在慢机上偶发失败 —— 采样节拍默认 5s,而判据前只 sleep(4000),
    常常只攒到 1 个桶(同环境复跑实测 1 ↔ 26 桶)。改为轮询等待最多 30s。

校验

  • check-docs-sync 79/0 · 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-plugin-hardening 13 · test-events-index 8 ·
    test-sdk-surface
  • 发布包验收 _audit/verify-release-pack.mjs:18 通过 / 0 失败
  • eslint 0 error · tsc --noEmit 0 · 生产构建无 file:///_entry.js 占位符

安装

npm i -g agentworkshop@latest --no-proxy
aw doctor && aw start

0.7.35 / 0.7.36 从未发布到 npm,请勿在 npx agentworkshop@… 中锁定这两个号。

v0.7.36 — 文档对齐真实实现 + 8 个真实缺陷修复

Choose a tag to compare

@kingdol666 kingdol666 released this 11 Sep 17:26

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 安装后直接启动、无需构建。

在线文档:https://kingdol666.github.io/AgentWorkShop/