agentworkshop 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README-zh.md CHANGED
@@ -1,424 +1,431 @@
1
- <div align="center">
2
-
3
- <img src="docs/readme-assets/hero.png" alt="AgentWorkShop — 让 Agent 运行产线" width="100%" />
4
-
5
- # AgentWorkShop
6
-
7
- **AI Agent 团队与产线在此交汇。**
8
-
9
- [![Nuxt 4](https://img.shields.io/badge/Nuxt-4-00DC82?logo=nuxt&logoColor=white)](https://nuxt.com)
10
- [![Vue 3.5](https://img.shields.io/badge/Vue-3.5-42B883?logo=vuedotjs&logoColor=white)](https://vuejs.org)
11
- [![TypeScript 5.7](https://img.shields.io/badge/TypeScript-5.7-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org)
12
- [![Node ≥ 23.4](https://img.shields.io/badge/Node.js-%E2%89%A5%2023.4-3C873A?logo=nodedotjs&logoColor=white)](https://nodejs.org)
13
- [![SQLite node:sqlite](https://img.shields.io/badge/SQLite-node:sqlite-003B57?logo=sqlite&logoColor=white)](https://nodejs.org/api/sqlite.html)
14
-
15
- **[English →](./README.md)**
16
-
17
- *一个配置驱动的平台:**AI Agent 团队**与**工业数字孪生**共享同一运行时——Agent 查询真实遥测、经人工审批的写控回路下发监督设定值,每个事件实时推送到 3D 孪生。*
18
-
19
- </div>
20
-
21
- > [!IMPORTANT]
22
- > **定位声明:监督层。** AgentWorkShop 是面向产线管理、数字孪生、数采与 Agent 编排的**监督层**(SCADA 同位)平台,运行在**秒级软实时**档位。它**不是**硬实时控制器:任何时序关键回路(**< 10 ms**、联锁、安全、伺服)**必须在 PLC 内实现**;本平台下发的值均为建议性设定值,产线侧逻辑可否决。
23
-
24
- ---
25
-
26
- ## 这是什么?
27
-
28
- AgentWorkShop 起家于**多智能体软件工作坊**——Channel 内的编码 Agent 团队,配备 lead 调度器、7 状态任务机、持久记忆,以及四个互操作入口(WebSocket / MCP / A2A / REST)。
29
-
30
- 随后它长出了**工业半边**:完整的数采与写控栈(Modbus TCP / OPC UA)、带配方与批次运行的产线、3D 数字孪生小镇——以及让它独一无二的桥:**Agent 可以被授权绑定真实工业节点**,带着物理语义查询实时遥测,经由「联锁 → 人工审批 → 回读校验」管线驱动写操作。
31
-
32
- 最终效果:提交一个目标,比如「分析熔体温度趋势并优化设定值」——Agent 团队读取真实传感器历史、计算统计量、提议新设定值、在 HITL 面板等您批准、写入 PLC、校验回读、带着数值汇报。**端到端,自动化 E2E 已验证。**
33
-
34
- <div align="center">
35
- <img src="docs/readme-assets/town-demo.gif" alt="3D 数字孪生 — 实时产线" width="86%" />
36
- <br><sub><b>实时 3D 孪生。</b>产线设备、设备健康、数采通道与趋势分析——全部由实时遥测驱动。</sub>
37
- </div>
38
-
39
- ---
40
-
41
- ## 特性总览
42
-
43
- | 能力 | 为何重要 |
44
- |---|---|
45
- | **Agent 团队 × 工业作用域** | 把 Agent 绑定到数采/数控节点。Agent 看到的是语义卡(物理含义、单位、安全量程、配方窗口)——而不是裸寄存器。 |
46
- | **人工审批的写控** | 数控下发经过「**安全量程 ∩ 活动配方窗口**」联锁 → 可选 **HITL 审批** PLC 写入 **回读校验** 写历史记账。 |
47
- | **真实现场总线** | Modbus TCP(连接级操作队列);OPC UA(会话池)。每个节点带线性标定钩子(PLC 工程量)。 |
48
- | **产线运营** | 产线 产品 配方 批次。配方窗口门控采集并联锁写入;每条样本打标 `product/recipe/run`,实现产品级数据隔离。 |
49
- | **Lead 编排** | 每个 Channel 一名 lead:分解目标、派发空闲 worker、失败重派、判定目标满足度。LLM 决策 + 确定性规则引擎兜底——系统永不停滞。 |
50
- | **三种执行模式** | `goal`(满意度判定)· `loop`(定间隔重放)· `pipeline`(顺序阶段)。7 状态任务机带进度、产物与完整历史。 |
51
- | **四个入口** | 一个 manager 坐在每扇门后:**WS**(AEP v1 事件流,seq 续传)、**MCP**(进程内工具)、**A2A**(JSON-RPC 2.0 + AgentCard)、**REST**。 |
52
- | **持久记忆** | 私有 + Channel 共享双域;FTS5 CJK 切分,可选向量混合检索,token 预算注入。 |
53
- | **Harness 无关** | 一个 `AgentInterface`:`mock`(进程内)、`omp`(真实 Agent 子进程经 RPC)、`claude`(SDK 适配器)。平台永远不知道跑的是哪个。 |
54
- | **3D 数字孪生** | Three.js 小镇:放置产线设备与 Channel 领地,实时查看设备健康、告警与数值——由同一事件总线驱动。 |
55
-
56
- ---
57
-
58
- ## 界面一览
59
-
60
- <div align="center">
61
-
62
- | Agent 工作台 | 产线运营 |
63
- |:---:|:---:|
64
- | ![Agent 工作台](docs/readme-assets/workshop.png) | ![产线运营](docs/readme-assets/dcw.png) |
65
-
66
- | 数采中心 | 数字孪生小镇 |
67
- |:---:|:---:|
68
- | ![数采中心](docs/readme-assets/daq.png) | ![数字孪生小镇](docs/readme-assets/town.png) |
69
-
70
- </div>
71
-
72
- ---
73
-
74
- ## 设计架构
75
-
76
- ```mermaid
77
- flowchart TB
78
- subgraph FE["前端 — Nuxt 4 / Vue 3"]
79
- UI["工作台 UI · 3D 孪生 · 大屏"]
80
- WS["AEP 客户端 seq 续传"]
81
- end
82
- subgraph SRV["服务端 — Nitro / h3"]
83
- REST["REST /api/workshop/**"]
84
- HUB["WS Hub — AEP v1"]
85
- A2A["A2A JSON-RPC"]
86
- MCP["MCP Server"]
87
- subgraph RT["运行时"]
88
- MGR["AgentChannelManager"]
89
- SCH["SchedulerLoop — lead 监督"]
90
- TE["TaskEngine7 态状态机"]
91
- AR["AgentRuntime × N"]
92
- MEM["AgentMemory FTS5 + 向量"]
93
- BUS["ChannelBusper-channel seq + 环形缓冲"]
94
- end
95
- subgraph IND["工业"]
96
- DAQ["数采网关 — 逐节点边缘运行时"]
97
- DCW["数控网关写控"]
98
- BR["队列inproc / MQTT"]
99
- TSDB["时序库SQLite / Timescale"]
100
- end
101
- subgraph HB["Harness 适配器"]
102
- MOCK["mock"]
103
- OMP["omp — 真实子进程"]
104
- CLD["claudeSDK"]
105
- end
106
- DB[("SQLite — channels · agents · tasks
107
- messages · memories (FTS5) · events")]
108
- end
109
- UI <--> WS
110
- WS --> BUS
111
- REST & A2A & MCP --> MGR
112
- MGR --> SCH & TE & AR
113
- AR --> MEM
114
- AR --> MOCK & OMP & CLD
115
- MGR & TE & MEM & BUS --> DB
116
- DAQ <--> BR --> TSDB
117
- DCW --> BR
118
- DAQ & DCW --> BUS
119
- ```
120
-
121
- **Agent × 机器之桥**(值得读源码的部分):
122
-
123
- ```
124
- agent ──绑定──▶ 节点 (daq: auto / dcw: manual)
125
- │ │
126
- my_industrial_nodes ◀── 语义卡:物理含义 · 单位 · 安全量程 · 配方窗口
127
- daq_query ◀── 时序库历史,统计 + 物理语义
128
- dcw_control ──▶ 联锁(安全量程 配方窗口)
129
- ──▶ HITL 审批(manual 模式,180s 超时)
130
- │ ──▶ PLC 写入 回读校验 → ACK + 写历史
131
- ◀── Agent 可引用数值的结果文本
132
- ```
133
-
134
- ---
135
-
136
- ## 快速开始
137
-
138
- ### 前置条件
139
-
140
- ```bash
141
- node -v # ≥ 23.4.0(需要内置 node:sqlite)
142
- ```
143
-
144
- > `omp` harness(真实作业推荐)需要在 PATH 中安装 `omp` CLI。`mock` harness 开箱即用,适合演示与 CI。可选数采基础设施(MQTT broker + TimescaleDB)在 Docker 可达时自动拉起(`docker compose up -d`)。
145
-
146
- ### 方式 A —— 从 npm 安装(推荐)
147
-
148
- ```bash
149
- npm install -g agentworkshop # → `aw` / `agentworkshop` 进入 PATH
150
- aw start # 首次运行构建一次(约 2-3 分钟)→ http://localhost:3001
151
- ```
152
-
153
- 至此即可——无需检出代码、无需构建工具。首次启动时一切初始化进配置根 **`~/.AgentWorkShop`**:默认 `config.yml`、自动生成含随机会话密钥的 `.env`、`runtime-settings.json`、docker-compose 种子与空的 `data/` 目录。全部运行数据(SQLite、JSON 仓库、备份、日志)也都落在配置根——配置与数据跟着安装走,与当前工作目录无关。
154
-
155
- 不想安装、只想跑一次?
156
-
157
- ```bash
158
- npx agentworkshop start # 拉取即运行,全局零残留
159
- ```
160
-
161
- ### 方式 B —— 源码运行
162
-
163
- ```bash
164
- git clone https://github.com/kingdol666/AgentWorkShop.git && cd AgentWorkShop
165
- pnpm install
166
- pnpm dev # → http://localhost:3000(端口取自 config.yml)
167
- ```
168
-
169
- 源码生产部署:
170
-
171
- ```bash
172
- pnpm build # nuxt build → .output/
173
- pnpm start # 端口取自 config.ymlserver.prod.port
174
- ```
175
-
176
- > 在源码检出内,配置根是项目里的 **`.AgentWorkShop/`** 文件夹(运行时覆盖、数据、项目级指令),而 `config.yml` / `.env` 留在检出根,作为版本化的工厂默认值。
177
-
178
- ### 版本更新
179
-
180
- ```bash
181
- aw update # 检查 + 就地更新全局安装
182
- aw update --check # 只报告,不安装
183
- npm install -g agentworkshop@latest # 手动等效
184
- ```
185
-
186
- 版本遵循 semver。每次 `aw start` 会校验配置根,并在新版变更目录结构时就地迁移——**升级永不丢数据**。
187
-
188
- ### 第一次「Agent × 产线」会话(约 2 分钟)
189
-
190
- 1. **登录** —— 侧边栏注册(或 `POST /api/users/register`)。
191
- 2. **搭产线** —— 「产线运营」→ 建产线,加数采节点(如 `daq-temp-tc`)与数控节点(如 `dcw-temp-sp`),建产品 + 配方,点**开跑**。实时值开始流动。
192
- 3. **建团队** —— 「Agent 工作台」→ lead + workers,**deploy** 部署进 Channel。
193
- 4. **绑定节点** —— 打开 Agent 详情面板 绑定数采节点(*auto*)与数控节点(*manual* = 需您的批准)。
194
- 5. **提交目标** —— 「分析最近 5 分钟熔体温度;若与 182℃ 偏差超过 1℃,修正设定值(等我的批准)。」
195
- 6. **审批** —— Agent 读取真实历史、计算均值、发起写请求 HITL 面板批准 → 看设定值变化,goal 收口并给出数值报告。
196
-
197
- ---
198
-
199
- ## 配置与 CLI —— 真正的配置驱动
200
-
201
- 一个运行时,一个事实来源。**`config.yml`** 声明默认值;配置根内的 **`runtime-settings.json`** 承载运行时覆盖;环境变量与 CLI 参数在最上层。每个可编辑键在 `shared/config/schema.json` 中声明一次(类型、范围、枚举、实时/重启生效),**前端设置页与 CLI 消费同一份描述符**。
202
-
203
- ```
204
- config.yml(默认值) < .AgentWorkShop/runtime-settings.json(运行时) < 环境变量 / CLI 参数
205
- ```
206
-
207
- 配置根:全局安装(`npm i -g`)时为 **`~/.AgentWorkShop`**——无论在哪个目录运行 `aw`;源码检出时为项目内的 **`<repo>/.AgentWorkShop`**(`config.yml` / `.env` 留在检出根,作为版本化的工厂默认值)。`AW_HOME` 可重定向;`AW_MODE=home` 强制全局形态。
208
-
209
- ### 设置持久化与热重载
210
-
211
- - **系统设置 → 运行配置**标签页按描述符渲染每个可编辑键——改服务端口、主题、API 超时、语言或高危复核闸门,点保存即可。
212
- - `live` 键立即生效(主题、标题、超时、审批闸门……),经服务端事件流推送,**无需刷新、无需重启**。
213
- - `restart` 键(端口、主机)落盘持久化,在下一次以对应模式启动时生效(`aw dev` / `aw start`)。
214
- - 所有写入方共用一条通道:**设置页、CLI、服务端文件监听**最终都收敛到同一个设置文件——任何一端改,处处生效。
215
-
216
- ### `aw` CLI
217
-
218
- | 指令 | 作用 |
219
- |---|---|
220
- | `aw start · aw dev · aw build` | 生产服务 / 开发服务器 / 构建——端口取自有效配置;首次 `start` 自动构建一次 |
221
- | `aw config list · get · set · unset · reset` | 读写运行时设置(schema 校验 + 原子写盘) |
222
- | `aw home` | 查看/初始化配置根 `.AgentWorkShop` |
223
- | `aw init <dir>` | 脚手架一个可运行的新项目(含完整配置系统与 CLI) |
224
- | `aw register <路径\|URL\|npm:包名>` | 注册一条新指令——项目级或 `--global` 用户级 |
225
- | `aw update` | 对比 npm 远程最新版本,有新版就就地更新全局安装 |
226
- | `aw doctor` | 环境 + 项目健康检查(node、配置、端口、密钥) |
227
- | `aw status` | 运行态总览:模式、配置来源、运行中服务、指令表 |
228
-
229
- 全局参数:`--help/-h` · `--version/-v` · `--json`(机器可读) · `--root <dir>` · `--debug`。
230
-
231
- ### 指令注册
232
-
233
- 指令就是导出 `{ meta, run }` 的普通模块。把它放进扫描目录,下次调用即生效——无需任何登记清单,约定优于配置:
234
-
235
- | 作用域(同名高者优先) | 目录 |
236
- |---|---|
237
- | 项目级 | `<检出>/.AgentWorkShop/commands/` |
238
- | 用户级 | `~/.AgentWorkShop/commands/` |
239
- | 内建 | 随 CLI 发布(`cli/commands/`) |
240
-
241
- `aw register <file|url|npm:pkg>` 把指令复制进对应作用域(`--global` 进用户级);`aw help` 列出全部已注册指令。
242
-
243
- ```js
244
- // ~/.AgentWorkShop/commands/hello.mjs
245
- export const meta = { name: 'hello', group: '自定义', summary: '问好', usage: 'aw hello [--name <n>]' }
246
- export async function run(argv, ctx) {
247
- console.log(`你好 ${argv.flags.name ?? 'AW'} —— 模式: ${ctx.mode}`)
248
- }
249
- ```
250
-
251
- ---
252
-
253
- ## 工业栈详解
254
-
255
- ### 数据采集(DAQ)
256
-
257
- - **逐节点边缘运行时**:独立采样节拍、下发节拍、节点级在飞互斥——一个慢驱动绝不拖累邻居。
258
- - **管线**:驱动 → 队列(进程内 / MQTT,断连离线缓冲)→ 消费泵乱序防御 → 三路分发:WS 实时直推(节拍门控)、TSDB 批量落库、设备孪生回写。
259
- - **鲁棒性**:TSDB in-flight + 有界重试,缓冲背压带丢弃计数,真实丢失指标随 `daq.controller` 帧暴露。
260
- - **报警**:配方级监控窗口,**2% 滞回 + 3 拍去抖**;alarm/offline 切换即时生效(安全优先)。
261
-
262
- ### 写控制(DCW)
263
-
264
- - 工程量写入:`linear` 标定(scale/offset)PLC↔物理,**回读校验**(死区容差),ACK 状态 + 写历史。
265
- - **联锁**:产线运行时,活动配方的参数窗口对该节点**替代**全局安全量程。
266
- - **HITL**:`manual` 绑定挂起写入等用户批准(同 Agent+节点去重;批准时二次校验——权限在您点击批准那一刻重查)。
267
-
268
- ### 配方与批次
269
-
270
- `产线 → 产品 → 配方 → 批次`。开跑逐节点应用配方参数(每次写都校验),逐线门控采集,每条样本打标 `line/product/recipe/run`——产品级数据隔离 + 五维查询(产线 × 产品 × 配方 × 时间 × 节点)。
271
-
272
- ---
273
-
274
- ## 使用说明
275
-
276
- ### 认证
277
-
278
- 邮箱 + 密码登录签发 **bearer token**(每用户多 token,可单独吊销)。
279
-
280
- ```bash
281
- # 注册
282
- curl -X POST http://localhost:3000/api/users/register \
283
- -H 'content-type: application/json' \
284
- -d '{"email":"you@example.com","password":"secret","name":"you"}'
285
-
286
- # 所有 workshop 调用
287
- curl http://localhost:3000/api/workshop/channels \
288
- -H 'authorization: Bearer <token>'
289
- ```
290
-
291
- ### 执行模式
292
-
293
- 在任务描述中使用模式前缀(或在 composer UI 中选择):
294
-
295
- | 模式 | 语义 | 配置 |
296
- |---|---|---|
297
- | `goal` | lead 分解 → worker 交付 → **lead 判定满意度**;不满足继续补发;满足收口父任务。 | `goalCriteria` |
298
- | `loop` | 固定间隔循环重放同一任务。 | `intervalMs`(默认 60000)、`maxIterations`(默认 ∞) |
299
- | `pipeline` | 有序阶段;阶段 N+1 消费阶段 N 产出。 | `stages: [{name, description, assigneeId?}]` |
300
-
301
- ### 四个入口
302
-
303
- | 入口 | 端点 | 面向 |
304
- |---|---|---|
305
- | **WS** | `/api/workshop/ws?channelId=…` | 仪表盘 / UI——AEP v1 信封,per-channel 单调 `seq`,5000 事件环形缓冲,`lastSeq` 续传,快照兜底。 |
306
- | **MCP** | 进程内服务,约 20 个工具 | Agent(omp host tools)——管理面 + 作业面工具,Channel 作用域。 |
307
- | **A2A** | `POST /api/workshop/a2a/:agentId/rpc` | 外部 Agent——JSON-RPC 2.0,`AgentCard` `/card`,`tasks/sendSubscribe` SSE。 |
308
- | **REST** | `/api/workshop/**` | / 脚本——完整管理面。 |
309
-
310
- ### 任务状态机
311
-
312
- ```
313
- SUBMITTED ─▶ ASSIGNED ─▶ WORKING ─▶ WAITING ─▶ COMPLETED
314
- │ │ │ │
315
- └────────────┴───────────┴──▶ CANCELED / FAILED ─▶(重试 ≤ 3 或取消)
316
- ```
317
-
318
- ---
319
-
320
- ## 端到端验证
321
-
322
- 仓库自带 live E2E,对运行中的服务端跑通全链路——以下数值来自真实一次运行:
323
-
324
- | 检查项 | 结果 |
325
- |---|---|
326
- | 产线开跑 → 配方下发设定值(180℃) | ✅ |
327
- | 联锁:写 170(<176)与 200(>188)→ **400 拒绝** | ✅ |
328
- | 团队部署 goal 派发(lead omp worker) | ✅ t + 3s |
329
- | Worker 读真实历史:**均值 168.05℃,96 采样点,min/max/latest** | ✅ |
330
- | HITL 审批 设定值 **180 → 182℃** 写入且回读 | ✅ |
331
- | goal 收口,结构化总结 | ✅ |
332
- | 批次打标:样本携带 product/recipe/run | ✅ |
333
-
334
- 复现:`node scripts/_dbg-full-feature-e2e.mjs`(对运行中的服务端)。
335
-
336
- ---
337
-
338
- ## 项目结构
339
-
340
- ```
341
- AgentWorkShop/
342
- ├── bin/ · cli/ # aw CLI——指令注册表 · 内置指令 · 配置引擎接线
343
- ├── app/ # Nuxt 4 前端(srcDir)
344
- ├── pages/ # / · /workshop · /town · /daq · /dcw · /monitor · /users · /tokens
345
- │ ├── components/workshop/ # 时间线 · 泳道 · 任务板 · 记忆面板 · 3D 小镇
346
- └── stores/composables/ # Pinia + AEP 客户端
347
- ├── server/
348
- ├── api/ # REST + WS + A2A + MCP 路由
349
- │ ├── services/workshop/
350
- ├── runtime/ # manager · scheduler-loop · task-engine · memory · mailbox
351
- │ │ ├── agents/ # AgentInterface: mock · omp · claude(+ 工业工具)
352
- │ │ ├── daq/ dcw/ # 边缘运行时 · 驱动 · 队列 · 存储
353
- │ │ └── db/ # node:sqlite 仓储层
354
- ├── mcp/ # MCP 服务(工具)
355
- └── plugins/ # 运行时装配(单例)
356
- ├── shared/
357
- │ └── config/ # schema.json(设置描述符)+ 引擎(合并/校验/持久化)+ 模式/路径解析器
358
- ├── config.yml # 单一事实来源(工厂默认值)
359
- ├── .AgentWorkShop/ # 配置根 —— prompts(版本化)+ 运行时覆盖 · 数据 · 日志 · 指令(git 忽略)
360
- ├── data/ # 旧版位置(自动迁移进配置根)
361
- └── scripts/ # 启动器 · home 引导 · E2E · 验证套件
362
- ```
363
-
364
- ## 技术栈
365
-
366
- | 层 | 技术 |
367
- |---|---|
368
- | 框架 | [Nuxt 4](https://nuxt.com) + Nitro(WebSocket) |
369
- | UI | Vue 3.5 · Pinia · Ant Design Vue · UnoCSS · Three.js · ECharts |
370
- | 语言 | TypeScript 5.7 全栈;`shared/` 前后端共用 |
371
- | CLI | Node ESM CLI,可插拔指令注册表(`bin/aw.mjs`) |
372
- | 持久化 | `node:sqlite`(零原生依赖)+ FTS5 + 可选 `sqlite-vec`;时序用 TimescaleDB |
373
- | 校验 | `zod` —— 每个消息边界 |
374
- | 互操作 | `@modelcontextprotocol/sdk` · A2A(JSON-RPC 2.0)· AEP v1(自研 WS 协议) |
375
- | 现场总线 | `modbus-serial` · `node-opcua` · `mqtt` |
376
-
377
- ## 开发指南
378
-
379
- ```bash
380
- pnpm dev # 开发服务(端口取自有效配置)
381
- pnpm aw … # 仓库内也能用 CLI:pnpm aw config list
382
- pnpm build && pnpm start
383
- pnpm typecheck
384
- pnpm lint
385
- node scripts/_dbg-full-feature-e2e.mjs # 全功能 live E2E(需服务端运行中)
386
- ```
387
-
388
- ## 路线图
389
-
390
- | 能力 | 状态 |
391
- |---|---|
392
- | Channel 运行时、lead 编排、7 态任务引擎 | 已交付 |
393
- | 四入口:WS(AEP v1)· MCP · A2A · REST | 已交付 |
394
- | 持久记忆(FTS5 + 可选向量混合) | 已交付 |
395
- | 工业栈:数采 · 数控写控 · 产线/配方/批次 | 已交付 |
396
- | Agent 节点绑定 + HITL 审批 + 联锁 | 已交付 |
397
- | 3D 数字孪生小镇 · 产线运营 UI · 大屏 | 已交付 |
398
- | 全功能 live E2E(Agent 读写真实产线,23 项检查) | 已交付 |
399
- | 运行时配置系统:设置持久化 · 热重载 · 设置页 UI | 已交付 |
400
- | `aw` CLI:config · run · init · register · doctor | 已交付 |
401
- | Claude Agent SDK 适配器——与 `mock`/`omp` 完全对齐 | 进行中 |
402
- | 生产硬化:TLS、MQTT 鉴权、OPC UA 签名+加密缺省、结构化审计日志 | 规划中 |
403
- | 边缘部署形态:独立 edge-agent + 中心 broker | 规划中 |
404
- | 报警外送(邮件/webhook)+ 确认工作流 | 规划中 |
405
- | CI 流水线(typecheck + lint + e2e) | 规划中 |
406
- | License 文件 | 待定 |
407
-
408
- ## 许可证
409
-
410
- AgentWorkShop 是独立项目,**不是 Anthropic 或任何 LLM 厂商的官方产品**。它通过公开接口与 Agent harness(如 `omp`)集成。
411
-
412
- **许可证待定**——将在 `v1.0` 发布前补齐。
413
-
414
- <div align="center">
415
-
416
- <a href="https://star-history.com/#kingdol666/AgentWorkShop&Date">
417
- <picture>
418
- <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kingdol666/AgentWorkShop&type=Date&theme=dark" />
419
- <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kingdol666/AgentWorkShop&type=Date" />
420
- <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kingdol666/AgentWorkShop&type=Date" width="80%" />
421
- </picture>
422
- </a>
423
-
424
- </div>
1
+ <div align="center">
2
+
3
+ <img src="docs/readme-assets/hero.png" alt="AgentWorkShop — 让 Agent 运行产线" width="100%" />
4
+
5
+ # AgentWorkShop
6
+
7
+ **AI Agent 团队与产线在此交汇。**
8
+
9
+ [![Nuxt 4](https://img.shields.io/badge/Nuxt-4-00DC82?logo=nuxt&logoColor=white)](https://nuxt.com)
10
+ [![Vue 3.5](https://img.shields.io/badge/Vue-3.5-42B883?logo=vuedotjs&logoColor=white)](https://vuejs.org)
11
+ [![TypeScript 5.7](https://img.shields.io/badge/TypeScript-5.7-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org)
12
+ [![Node ≥ 23.4](https://img.shields.io/badge/Node.js-%E2%89%A5%2023.4-3C873A?logo=nodedotjs&logoColor=white)](https://nodejs.org)
13
+ [![SQLite node:sqlite](https://img.shields.io/badge/SQLite-node:sqlite-003B57?logo=sqlite&logoColor=white)](https://nodejs.org/api/sqlite.html)
14
+ [![License: PolyForm Noncommercial](https://img.shields.io/badge/License-PolyForm_NC_1.0-8A2BE2?logo=openaccess&logoColor=white)](./LICENSE)
15
+
16
+ **[English →](./README.md)** · **[在线文档 →](https://kingdol666.github.io/AgentWorkShop/)**
17
+
18
+ *一个配置驱动的平台:**AI Agent 团队**与**工业数字孪生**共享同一运行时——Agent 查询真实遥测、经人工审批的写控回路下发监督设定值,每个事件实时推送到 3D 孪生。*
19
+
20
+ </div>
21
+
22
+ > [!IMPORTANT]
23
+ > **定位声明:监督层。** AgentWorkShop 是面向产线管理、数字孪生、数采与 Agent 编排的**监督层**(SCADA 同位)平台,运行在**秒级软实时**档位。它**不是**硬实时控制器:任何时序关键回路(**< 10 ms**、联锁、安全、伺服)**必须在 PLC 内实现**;本平台下发的值均为建议性设定值,产线侧逻辑可否决。
24
+
25
+ ---
26
+
27
+ ## 这是什么?
28
+
29
+ AgentWorkShop 起家于**多智能体软件工作坊**——Channel 内的编码 Agent 团队,配备 lead 调度器、7 状态任务机、持久记忆,以及四个互操作入口(WebSocket / MCP / A2A / REST)。
30
+
31
+ 随后它长出了**工业半边**:完整的数采与写控栈(Modbus TCP / OPC UA)、带配方与批次运行的产线、3D 数字孪生小镇——以及让它独一无二的桥:**Agent 可以被授权绑定真实工业节点**,带着物理语义查询实时遥测,经由「联锁 → 人工审批 → 回读校验」管线驱动写操作。
32
+
33
+ 最终效果:提交一个目标,比如「分析熔体温度趋势并优化设定值」——Agent 团队读取真实传感器历史、计算统计量、提议新设定值、在 HITL 面板等您批准、写入 PLC、校验回读、带着数值汇报。**端到端,自动化 E2E 已验证。**
34
+
35
+ <div align="center">
36
+ <img src="docs/readme-assets/town-demo.gif" alt="3D 数字孪生 — 实时产线" width="86%" />
37
+ <br><sub><b>实时 3D 孪生。</b>产线设备、设备健康、数采通道与趋势分析——全部由实时遥测驱动。</sub>
38
+ </div>
39
+
40
+ ---
41
+
42
+ ## 特性总览
43
+
44
+ | 能力 | 为何重要 |
45
+ |---|---|
46
+ | **Agent 团队 × 工业作用域** | Agent 绑定到数采/数控节点。Agent 看到的是语义卡(物理含义、单位、安全量程、配方窗口)——而不是裸寄存器。 |
47
+ | **人工审批的写控** | 数控下发经过「**安全量程 活动配方窗口**」联锁 → 可选 **HITL 审批** → PLC 写入 **回读校验** → 写历史记账。 |
48
+ | **真实现场总线** | Modbus TCP(连接级操作队列);OPC UA(会话池)。每个节点带线性标定钩子(PLC 工程量)。 |
49
+ | **产线运营** | 产线 产品 配方 批次。配方窗口门控采集并联锁写入;每条样本打标 `product/recipe/run`,实现产品级数据隔离。 |
50
+ | **Lead 编排** | 每个 Channel 一名 lead:分解目标、派发空闲 worker、失败重派、判定目标满足度。LLM 决策 + 确定性规则引擎兜底——系统永不停滞。 |
51
+ | **三种执行模式** | `goal`(满意度判定)· `loop`(定间隔重放)· `pipeline`(顺序阶段)。7 状态任务机带进度、产物与完整历史。 |
52
+ | **四个入口** | 一个 manager 坐在每扇门后:**WS**(AEP v1 事件流,seq 续传)、**MCP**(进程内工具)、**A2A**(JSON-RPC 2.0 + AgentCard)、**REST**。 |
53
+ | **持久记忆** | 私有 + Channel 共享双域;FTS5 CJK 切分,可选向量混合检索,token 预算注入。 |
54
+ | **Harness 无关** | 一个 `AgentInterface`:`mock`(进程内)、`omp`(真实 Agent 子进程经 RPC)、`claude`(SDK 适配器)。平台永远不知道跑的是哪个。 |
55
+ | **3D 数字孪生** | Three.js 小镇:放置产线设备与 Channel 领地,实时查看设备健康、告警与数值——由同一事件总线驱动。 |
56
+
57
+ ---
58
+
59
+ ## 界面一览
60
+
61
+ <div align="center">
62
+
63
+ | Agent 工作台 | 产线运营 |
64
+ |:---:|:---:|
65
+ | ![Agent 工作台](docs/readme-assets/workshop.png) | ![产线运营](docs/readme-assets/dcw.png) |
66
+
67
+ | 数采中心 | 数字孪生小镇 |
68
+ |:---:|:---:|
69
+ | ![数采中心](docs/readme-assets/daq.png) | ![数字孪生小镇](docs/readme-assets/town.png) |
70
+
71
+ </div>
72
+
73
+ ---
74
+
75
+ ## 设计架构
76
+
77
+ ```mermaid
78
+ flowchart TB
79
+ subgraph FE["前端 Nuxt 4 / Vue 3"]
80
+ UI["工作台 UI · 3D 孪生 · 大屏"]
81
+ WS["AEP 客户端 — seq 续传"]
82
+ end
83
+ subgraph SRV["服务端 — Nitro / h3"]
84
+ REST["REST /api/workshop/**"]
85
+ HUB["WS Hub — AEP v1"]
86
+ A2A["A2A JSON-RPC"]
87
+ MCP["MCP Server"]
88
+ subgraph RT["运行时"]
89
+ MGR["AgentChannelManager"]
90
+ SCH["SchedulerLooplead 监督"]
91
+ TE["TaskEngine 7 态状态机"]
92
+ AR["AgentRuntime × N"]
93
+ MEM["AgentMemoryFTS5 + 向量"]
94
+ BUS["ChannelBus — per-channel seq + 环形缓冲"]
95
+ end
96
+ subgraph IND["工业"]
97
+ DAQ["数采网关逐节点边缘运行时"]
98
+ DCW["数控网关写控"]
99
+ BR["队列inproc / MQTT"]
100
+ TSDB["时序库 — SQLite / Timescale"]
101
+ end
102
+ subgraph HB["Harness 适配器"]
103
+ MOCK["mock"]
104
+ OMP["omp真实子进程"]
105
+ CLD["claude — SDK"]
106
+ end
107
+ DB[("SQLite — channels · agents · tasks
108
+ messages · memories (FTS5) · events")]
109
+ end
110
+ UI <--> WS
111
+ WS --> BUS
112
+ REST & A2A & MCP --> MGR
113
+ MGR --> SCH & TE & AR
114
+ AR --> MEM
115
+ AR --> MOCK & OMP & CLD
116
+ MGR & TE & MEM & BUS --> DB
117
+ DAQ <--> BR --> TSDB
118
+ DCW --> BR
119
+ DAQ & DCW --> BUS
120
+ ```
121
+
122
+ **Agent × 机器之桥**(值得读源码的部分):
123
+
124
+ ```
125
+ agent ──绑定──▶ 节点 (daq: auto / dcw: manual)
126
+
127
+ my_industrial_nodes ◀── 语义卡:物理含义 · 单位 · 安全量程 · 配方窗口
128
+ daq_query ◀── 时序库历史,统计 + 物理语义
129
+ dcw_control ──▶ 联锁(安全量程 配方窗口)
130
+ │ ──▶ HITL 审批(manual 模式,180s 超时)
131
+ │ ──▶ PLC 写入 → 回读校验 → ACK + 写历史
132
+ ◀── Agent 可引用数值的结果文本
133
+ ```
134
+
135
+ ---
136
+
137
+ ## 快速开始
138
+
139
+ ### 前置条件
140
+
141
+ ```bash
142
+ node -v # ≥ 23.4.0(需要内置 node:sqlite)
143
+ ```
144
+
145
+ > `omp` harness(真实作业推荐)需要在 PATH 中安装 `omp` CLI。`mock` harness 开箱即用,适合演示与 CI。可选数采基础设施(MQTT broker + TimescaleDB)在 Docker 可达时自动拉起(`docker compose up -d`)。
146
+
147
+ ### 方式 A —— 从 npm 安装(推荐)
148
+
149
+ ```bash
150
+ npm install -g agentworkshop # `aw` / `agentworkshop` 进入 PATH
151
+ aw start # 首次运行构建一次(约 2-3 分钟)→ http://localhost:3001
152
+ ```
153
+
154
+ 至此即可——无需检出代码、无需构建工具。首次启动时一切初始化进配置根 **`~/.AgentWorkShop`**:默认 `config.yml`、自动生成含随机会话密钥的 `.env`、`runtime-settings.json`、docker-compose 种子与空的 `data/` 目录。全部运行数据(SQLite、JSON 仓库、备份、日志)也都落在配置根——配置与数据跟着安装走,与当前工作目录无关。
155
+
156
+ 不想安装、只想跑一次?
157
+
158
+ ```bash
159
+ npx agentworkshop start # 拉取即运行,全局零残留
160
+ ```
161
+
162
+ ### 方式 B —— 源码运行
163
+
164
+ ```bash
165
+ git clone https://github.com/kingdol666/AgentWorkShop.git && cd AgentWorkShop
166
+ pnpm install
167
+ pnpm dev # → http://localhost:3000(端口取自 config.yml)
168
+ ```
169
+
170
+ 源码生产部署:
171
+
172
+ ```bash
173
+ pnpm build # nuxt build → .output/
174
+ pnpm start # 端口取自 config.yml → server.prod.port
175
+ ```
176
+
177
+ > 在源码检出内,配置根是项目里的 **`.AgentWorkShop/`** 文件夹(运行时覆盖、数据、项目级指令),而 `config.yml` / `.env` 留在检出根,作为版本化的工厂默认值。
178
+
179
+ ### 版本更新
180
+
181
+ ```bash
182
+ aw update # 检查 + 就地更新全局安装
183
+ aw update --check # 只报告,不安装
184
+ npm install -g agentworkshop@latest # 手动等效
185
+ ```
186
+
187
+ 版本遵循 semver。每次 `aw start` 会校验配置根,并在新版变更目录结构时就地迁移——**升级永不丢数据**。
188
+
189
+ ### 第一次「Agent × 产线」会话(约 2 分钟)
190
+
191
+ 1. **登录** —— 侧边栏注册(或 `POST /api/users/register`)。
192
+ 2. **搭产线** —— 「产线运营」→ 建产线,加数采节点(如 `daq-temp-tc`)与数控节点(如 `dcw-temp-sp`),建产品 + 配方,点**开跑**。实时值开始流动。
193
+ 3. **建团队** —— Agent 工作台」→ lead + workers,**deploy** 部署进 Channel。
194
+ 4. **绑定节点** —— 打开 Agent 详情面板 绑定数采节点(*auto*)与数控节点(*manual* = 需您的批准)。
195
+ 5. **提交目标** —— 「分析最近 5 分钟熔体温度;若与 182℃ 偏差超过 1℃,修正设定值(等我的批准)。」
196
+ 6. **审批** —— Agent 读取真实历史、计算均值、发起写请求 → 在 HITL 面板批准 → 看设定值变化,goal 收口并给出数值报告。
197
+
198
+ ---
199
+
200
+ ## 配置与 CLI —— 真正的配置驱动
201
+
202
+ 一个运行时,一个事实来源。**`config.yml`** 声明默认值;配置根内的 **`runtime-settings.json`** 承载运行时覆盖;环境变量与 CLI 参数在最上层。每个可编辑键在 `shared/config/schema.json` 中声明一次(类型、范围、枚举、实时/重启生效),**前端设置页与 CLI 消费同一份描述符**。
203
+
204
+ ```
205
+ config.yml(默认值) < .AgentWorkShop/runtime-settings.json(运行时) < 环境变量 / CLI 参数
206
+ ```
207
+
208
+ 配置根:全局安装(`npm i -g`)时为 **`~/.AgentWorkShop`**——无论在哪个目录运行 `aw`;源码检出时为项目内的 **`<repo>/.AgentWorkShop`**(`config.yml` / `.env` 留在检出根,作为版本化的工厂默认值)。`AW_HOME` 可重定向;`AW_MODE=home` 强制全局形态。
209
+
210
+ ### 设置持久化与热重载
211
+
212
+ - **系统设置 → 运行配置**标签页按描述符渲染每个可编辑键——改服务端口、主题、API 超时、语言或高危复核闸门,点保存即可。
213
+ - `live` 键立即生效(主题、标题、超时、审批闸门……),经服务端事件流推送,**无需刷新、无需重启**。
214
+ - `restart` 键(端口、主机)落盘持久化,在下一次以对应模式启动时生效(`aw dev` / `aw start`)。
215
+ - 所有写入方共用一条通道:**设置页、CLI、服务端文件监听**最终都收敛到同一个设置文件——任何一端改,处处生效。
216
+
217
+ ### `aw` CLI
218
+
219
+ | 指令 | 作用 |
220
+ |---|---|
221
+ | `aw start · aw dev · aw build` | 生产服务 / 开发服务器 / 构建——端口取自有效配置;首次 `start` 自动构建一次 |
222
+ | `aw config list · get · set · unset · reset` | 读写运行时设置(schema 校验 + 原子写盘) |
223
+ | `aw home` | 查看/初始化配置根 `.AgentWorkShop` |
224
+ | `aw init <dir>` | 脚手架一个可运行的新项目(含完整配置系统与 CLI) |
225
+ | `aw register <路径\|URL\|npm:包名>` | 注册一条新指令——项目级或 `--global` 用户级 |
226
+ | `aw update` | 对比 npm 远程最新版本,有新版就就地更新全局安装 |
227
+ | `aw doctor` | 环境 + 项目健康检查(node、配置、端口、密钥) |
228
+ | `aw status` | 运行态总览:模式、配置来源、运行中服务、指令表 |
229
+
230
+ 全局参数:`--help/-h` · `--version/-v` · `--json`(机器可读) · `--root <dir>` · `--debug`。
231
+
232
+ ### 指令注册
233
+
234
+ 指令就是导出 `{ meta, run }` 的普通模块。把它放进扫描目录,下次调用即生效——无需任何登记清单,约定优于配置:
235
+
236
+ | 作用域(同名高者优先) | 目录 |
237
+ |---|---|
238
+ | 项目级 | `<检出>/.AgentWorkShop/commands/` |
239
+ | 用户级 | `~/.AgentWorkShop/commands/` |
240
+ | 内建 | 随 CLI 发布(`cli/commands/`) |
241
+
242
+ `aw register <file|url|npm:pkg>` 把指令复制进对应作用域(`--global` 进用户级);`aw help` 列出全部已注册指令。
243
+
244
+ ```js
245
+ // ~/.AgentWorkShop/commands/hello.mjs
246
+ export const meta = { name: 'hello', group: '自定义', summary: '问好', usage: 'aw hello [--name <n>]' }
247
+ export async function run(argv, ctx) {
248
+ console.log(`你好 ${argv.flags.name ?? 'AW'} —— 模式: ${ctx.mode}`)
249
+ }
250
+ ```
251
+
252
+ ---
253
+
254
+ ## 工业栈详解
255
+
256
+ ### 数据采集(DAQ)
257
+
258
+ - **逐节点边缘运行时**:独立采样节拍、下发节拍、节点级在飞互斥——一个慢驱动绝不拖累邻居。
259
+ - **管线**:驱动 队列(进程内 / MQTT,断连离线缓冲)→ 消费泵乱序防御 三路分发:WS 实时直推(节拍门控)、TSDB 批量落库、设备孪生回写。
260
+ - **鲁棒性**:TSDB in-flight 写 + 有界重试,缓冲背压带丢弃计数,真实丢失指标随 `daq.controller` 帧暴露。
261
+ - **报警**:配方级监控窗口,**2% 滞回 + 3 拍去抖**;alarm/offline 切换即时生效(安全优先)。
262
+
263
+ ### 写控制(DCW)
264
+
265
+ - 工程量写入:`linear` 标定(scale/offset)PLC↔物理,**回读校验**(死区容差),ACK 状态 + 写历史。
266
+ - **联锁**:产线运行时,活动配方的参数窗口对该节点**替代**全局安全量程。
267
+ - **HITL**:`manual` 绑定挂起写入等用户批准(同 Agent+节点去重;批准时二次校验——权限在您点击批准那一刻重查)。
268
+
269
+ ### 配方与批次
270
+
271
+ `产线 → 产品 → 配方 → 批次`。开跑逐节点应用配方参数(每次写都校验),逐线门控采集,每条样本打标 `line/product/recipe/run`——产品级数据隔离 + 五维查询(产线 × 产品 × 配方 × 时间 × 节点)。
272
+
273
+ ---
274
+
275
+ ## 使用说明
276
+
277
+ ### 认证
278
+
279
+ 邮箱 + 密码登录签发 **bearer token**(每用户多 token,可单独吊销)。
280
+
281
+ ```bash
282
+ # 注册
283
+ curl -X POST http://localhost:3000/api/users/register \
284
+ -H 'content-type: application/json' \
285
+ -d '{"email":"you@example.com","password":"secret","name":"you"}'
286
+
287
+ # 所有 workshop 调用
288
+ curl http://localhost:3000/api/workshop/channels \
289
+ -H 'authorization: Bearer <token>'
290
+ ```
291
+
292
+ ### 执行模式
293
+
294
+ 在任务描述中使用模式前缀(或在 composer UI 中选择):
295
+
296
+ | 模式 | 语义 | 配置 |
297
+ |---|---|---|
298
+ | `goal` | lead 分解 worker 交付 → **lead 判定满意度**;不满足继续补发;满足收口父任务。 | `goalCriteria` |
299
+ | `loop` | 固定间隔循环重放同一任务。 | `intervalMs`(默认 60000)、`maxIterations`(默认 ∞) |
300
+ | `pipeline` | 有序阶段;阶段 N+1 消费阶段 N 产出。 | `stages: [{name, description, assigneeId?}]` |
301
+
302
+ ### 四个入口
303
+
304
+ | 入口 | 端点 | 面向 |
305
+ |---|---|---|
306
+ | **WS** | `/api/workshop/ws?channelId=…` | 仪表盘 / UI——AEP v1 信封,per-channel 单调 `seq`,5000 事件环形缓冲,`lastSeq` 续传,快照兜底。 |
307
+ | **MCP** | 进程内服务,约 20 个工具 | Agent(omp host tools)——管理面 + 作业面工具,Channel 作用域。 |
308
+ | **A2A** | `POST /api/workshop/a2a/:agentId/rpc` | 外部 Agent——JSON-RPC 2.0,`AgentCard` 在 `/card`,`tasks/sendSubscribe` SSE。 |
309
+ | **REST** | `/api/workshop/**` | 人 / 脚本——完整管理面。 |
310
+
311
+ ### 任务状态机
312
+
313
+ ```
314
+ SUBMITTED ─▶ ASSIGNED ─▶ WORKING ─▶ WAITING ─▶ COMPLETED
315
+ │ │ │ │
316
+ └────────────┴───────────┴──▶ CANCELED / FAILED ─▶(重试 ≤ 3 或取消)
317
+ ```
318
+
319
+ ---
320
+
321
+ ## 端到端验证
322
+
323
+ 仓库自带 live E2E,对运行中的服务端跑通全链路——以下数值来自真实一次运行:
324
+
325
+ | 检查项 | 结果 |
326
+ |---|---|
327
+ | 产线开跑 配方下发设定值(180℃) | ✅ |
328
+ | 联锁:写 170(<176)与 200(>188)→ **400 拒绝** | ✅ |
329
+ | 团队部署 goal 派发(lead → omp worker) | ✅ t + 3s |
330
+ | Worker 读真实历史:**均值 168.05℃,96 采样点,min/max/latest** | ✅ |
331
+ | HITL 审批 → 设定值 **180 → 182℃** 写入且回读 | ✅ |
332
+ | goal 收口,结构化总结 | ✅ |
333
+ | 批次打标:样本携带 product/recipe/run | ✅ |
334
+
335
+ 复现:`node scripts/_dbg-full-feature-e2e.mjs`(对运行中的服务端)。
336
+
337
+ ---
338
+
339
+ ## 项目结构
340
+
341
+ ```
342
+ AgentWorkShop/
343
+ ├── bin/ · cli/ # aw CLI——指令注册表 · 内置指令 · 配置引擎接线
344
+ ├── app/ # Nuxt 4 前端(srcDir)
345
+ │ ├── pages/ # / · /workshop · /town · /daq · /dcw · /monitor · /users · /tokens
346
+ ├── components/workshop/ # 时间线 · 泳道 · 任务板 · 记忆面板 · 3D 小镇
347
+ │ └── stores/composables/ # Pinia + AEP 客户端
348
+ ├── server/
349
+ │ ├── api/ # REST + WS + A2A + MCP 路由
350
+ │ ├── services/workshop/
351
+ │ │ ├── runtime/ # manager · scheduler-loop · task-engine · memory · mailbox
352
+ │ │ ├── agents/ # AgentInterface: mock · omp · claude(+ 工业工具)
353
+ │ │ ├── daq/ dcw/ # 边缘运行时 · 驱动 · 队列 · 存储
354
+ │ └── db/ # node:sqlite 仓储层
355
+ ├── mcp/ # MCP 服务(工具)
356
+ │ └── plugins/ # 运行时装配(单例)
357
+ ├── shared/
358
+ │ └── config/ # schema.json(设置描述符)+ 引擎(合并/校验/持久化)+ 模式/路径解析器
359
+ ├── config.yml # 单一事实来源(工厂默认值)
360
+ ├── .AgentWorkShop/ # 配置根 —— prompts(版本化)+ 运行时覆盖 · 数据 · 日志 · 指令(git 忽略)
361
+ ├── data/ # 旧版位置(自动迁移进配置根)
362
+ └── scripts/ # 启动器 · home 引导 · E2E · 验证套件
363
+ ```
364
+
365
+ ## 技术栈
366
+
367
+ | 层 | 技术 |
368
+ |---|---|
369
+ | 框架 | [Nuxt 4](https://nuxt.com) + Nitro(WebSocket) |
370
+ | UI | Vue 3.5 · Pinia · Ant Design Vue · UnoCSS · Three.js · ECharts |
371
+ | 语言 | TypeScript 5.7 全栈;`shared/` 前后端共用 |
372
+ | CLI | Node ESM CLI,可插拔指令注册表(`bin/aw.mjs`) |
373
+ | 持久化 | `node:sqlite`(零原生依赖)+ FTS5 + 可选 `sqlite-vec`;时序用 TimescaleDB |
374
+ | 校验 | `zod` —— 每个消息边界 |
375
+ | 互操作 | `@modelcontextprotocol/sdk` · A2A(JSON-RPC 2.0)· AEP v1(自研 WS 协议) |
376
+ | 现场总线 | `modbus-serial` · `node-opcua` · `mqtt` |
377
+
378
+ ## 开发指南
379
+
380
+ ```bash
381
+ pnpm dev # 开发服务(端口取自有效配置)
382
+ pnpm aw … # 仓库内也能用 CLI:pnpm aw config list
383
+ pnpm build && pnpm start
384
+ pnpm typecheck
385
+ pnpm lint
386
+ node scripts/_dbg-full-feature-e2e.mjs # 全功能 live E2E(需服务端运行中)
387
+ ```
388
+
389
+ ## 路线图
390
+
391
+ | 能力 | 状态 |
392
+ |---|---|
393
+ | Channel 运行时、lead 编排、7 态任务引擎 | 已交付 |
394
+ | 四入口:WS(AEP v1)· MCP · A2A · REST | 已交付 |
395
+ | 持久记忆(FTS5 + 可选向量混合) | 已交付 |
396
+ | 工业栈:数采 · 数控写控 · 产线/配方/批次 | 已交付 |
397
+ | Agent 节点绑定 + HITL 审批 + 联锁 | 已交付 |
398
+ | 3D 数字孪生小镇 · 产线运营 UI · 大屏 | 已交付 |
399
+ | 全功能 live E2E(Agent 读写真实产线,23 项检查) | 已交付 |
400
+ | 运行时配置系统:设置持久化 · 热重载 · 设置页 UI | 已交付 |
401
+ | `aw` CLI:config · run · init · register · doctor | 已交付 |
402
+ | Claude Agent SDK 适配器——与 `mock`/`omp` 完全对齐 | 进行中 |
403
+ | 生产硬化:TLS、MQTT 鉴权、OPC UA 签名+加密缺省、结构化审计日志 | 规划中 |
404
+ | 边缘部署形态:独立 edge-agent + 中心 broker | 规划中 |
405
+ | 报警外送(邮件/webhook)+ 确认工作流 | 规划中 |
406
+ | CI 流水线(typecheck + lint + e2e) | 规划中 |
407
+ | License:PolyForm Noncommercial 1.0.0(源码可得 · 禁止商用) | 已交付 |
408
+
409
+ ## 许可证
410
+
411
+ AgentWorkShop 是独立项目,**不是 Anthropic 或任何 LLM 厂商的官方产品**。它通过公开接口与 Agent harness(如 `omp`)集成。
412
+
413
+ **AgentWorkShop 为源码可得(source-available)软件,依据 [PolyForm Noncommercial 1.0.0](./LICENSE) 发布。**
414
+
415
+ - ✅ **允许** —— 个人学习、科研、兴趣项目、教学,以及非商业组织(公益、教育、公共研究、政府机构)的使用。
416
+ - ❌ **未经版权人事先书面许可不得商用** —— 任何**商业用途**:销售、付费服务、集成进商业产品、服务于经营活动的生产使用均未获授权。商用授权请另行洽谈。
417
+ - 📌 再分发时必须随附本协议条款与 `Required Notice` 版权声明行。
418
+
419
+ 商用授权联系:[GitHub @kingdol666](https://github.com/kingdol666) · kingdol6080@gmail.com
420
+
421
+ <div align="center">
422
+
423
+ <a href="https://star-history.com/#kingdol666/AgentWorkShop&Date">
424
+ <picture>
425
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kingdol666/AgentWorkShop&type=Date&theme=dark" />
426
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kingdol666/AgentWorkShop&type=Date" />
427
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kingdol666/AgentWorkShop&type=Date" width="80%" />
428
+ </picture>
429
+ </a>
430
+
431
+ </div>