@twinsearth/dsh-master 3.2.9 → 3.2.10

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.md CHANGED
@@ -1,9 +1,12 @@
1
1
  # dsh-Master(房主)
2
2
 
3
3
  > 与瓮城 **dsh-Fang** 并行的主 Agent 插件。
4
- > 当前版本:`3.2.9`(面板交互修复线;tag / GitHub Release / NPM public)。
4
+ > 当前版本:`3.2.10`(角色矩阵放宽线;tag / GitHub Release / NPM public)。
5
5
  > 仓库:https://github.com/TwinsEarth/dsh-Master
6
6
 
7
+ [![CI](https://github.com/TwinsEarth/dsh-Master/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/TwinsEarth/dsh-Master/actions/workflows/ci.yml)
8
+ [![npm](https://img.shields.io/npm/v/@twinsearth/dsh-master?style=flat&label=npm&color=4D6BFE)](https://www.npmjs.com/package/@twinsearth/dsh-master)
9
+ [![license](https://img.shields.io/badge/license-AGPL--3.0--or--later-4D6BFE?style=flat)](https://github.com/TwinsEarth/dsh-Master/blob/main/LICENSE)
7
10
  [![DSH 0.2.2-rc.1](https://img.shields.io/badge/DSH-0.2.2--rc.1-4D6BFE?style=flat)](https://github.com/deepseek-ai/deepseek-harness)
8
11
  [![](https://img.shields.io/badge/powered_by-dsh-4D6BFE?style=flat-square&logo=deepseek&logoColor=white)](https://github.com/deepseek-ai/deepseek-harness)
9
12
 
@@ -16,8 +19,8 @@ dsh-Master 不接管瓮城的「母体 / 原身 / 分身」生命周期;它是
16
19
  DSH Host
17
20
  ├── 瓮城 bundle (dsh-Fang) 房主 bundle (dsh-Master)
18
21
  │ mirror / essence / derived core(主 Agent 控制面)
19
- │ fangForker / fangDecisionCenter ◄────── ├── superagent-router (essence)
20
- │ fangSessionCatalog ├── superagent-worker (fork)
22
+ │ fangForker / fangDecisionCenter ◄────── ├── superagent-router (essence/mother)
23
+ │ fangSessionCatalog ├── superagent-worker (fork/essence)
21
24
  │ ├── cost-optimizer (fork)
22
25
  │ └── dual-manager (mother/essence)
23
26
  └── 协作只走服务键;任一方向失败一律 fail-closed,不本地降级执行
@@ -27,9 +30,9 @@ DSH Host
27
30
 
28
31
  | 子插件 | 行 id | 允许角色 | 路线图 | 已交付 |
29
32
  |---|---|---|---|---|
30
- | SuperAgent Router | `master-superagent-router` | **essence only** | 3.2.1/3.2.3 | Webhook/Ticket/Mandate、渐进信任、本地或母体桥派发、Worker 实时事件、回写 |
31
- | SuperAgent Worker | `master-superagent-worker` | **fork only** | 3.2.1 | Ticket 上下文、Mandate 守卫 |
32
- | Worker Agent Loop | `master-superagent-loop` | **fork only** | 3.2.3 | tsc 编译 preset;有 Ticket 自动跑多轮工具循环并流式回传 |
33
+ | SuperAgent Router | `master-superagent-router` | **essence / mother** | 3.2.1/3.2.3 | Webhook/Ticket/Mandate、渐进信任、本地或母体桥派发、Worker 实时事件、回写 |
34
+ | SuperAgent Worker | `master-superagent-worker` | **fork / essence** | 3.2.1 | Ticket 上下文、Mandate 守卫 |
35
+ | Worker Agent Loop | `master-superagent-loop` | **fork / essence** | 3.2.3 | tsc 编译 preset;有 Ticket 自动跑多轮工具循环并流式回传 |
33
36
  | 成本优化 HarnessMM | `master-cost-optimizer` | **fork only** | 3.3.0 | observe 层:token 估算、实测记录 |
34
37
  | 双主管 PM + PJM | `master-dual-manager` | **mother / essence** | 3.4.0 | PRD/计划/调度/决策中心澄清 |
35
38
 
@@ -87,8 +90,35 @@ dsh plugin add <package> # 加载 dist-host/dist-worker
87
90
 
88
91
  ## 状态
89
92
 
93
+ - 3.2.10 发布线:角色矩阵放宽——Router 进入母体(essence/mother),Worker 与 Worker Agent Loop 进入原身(fork/essence);母体仍不接纳执行体,fork 仍不注册 Router。
90
94
  - 3.2.9 发布线:房主面板改注册到 `shell.overlay` 常驻浮层——点击面板之外不收起、侧栏「房主」按钮二次点击收起、正文独立滚动;新增无浏览器 hook 运行时行为测试(开关、无 outside-click 监听、滚动容器、SSE 失败不卸载面板)。
91
95
  - 3.2.8 发布线:与瓮城通过 fang-master contract 1.0 互联(local/http/file/legacy 四级保底);GitHub Release + NPM public。
92
96
  - 当前工作树完成新一轮审计修复:工具名/死循环阈值、Router 鉴权与生命周期、真实路由分流、契约幂等与超时、PR 护栏与交付、飞书加密、长 Shell 后台作业、成本实测接线、PJM 派生契约。
93
97
  - 验收:`npm run check` / `npm run build` / `npm test` 全绿(188/188);真实双 Host/fork 落库、工具写读、SSE、回写、配额与桥清理断言通过。详见复盘文档。
94
98
  - 发布不等于安装:本流程不修改任何用户 profile(当前 desktop profile 仍为 3.2.8,升级需另行授权)。
99
+
100
+ ## 依赖、权限与兼容
101
+
102
+ - **外部依赖**:与瓮城 **dsh-Fang ≥ 3.1.14** 同宿主协作,通过 `fangForker` / `fangDecisionCenter` / `fangSessionCatalog` / `fangSessionBridge` 服务键派发与回收;瓮城不在线时子插件 **fail-closed**,不在本地降级执行。
103
+ - **安装产物**:npm 运行时依赖为空;无 `preinstall` / `install` / `postinstall` / `prepare` 生命周期脚本;安装只写目标 profile 的 bundle 层。
104
+ - **权限与边界**:Host 侧只注册受控 HTTP 路由(status / stream-token / worker-events / stream / session / webhook),worker-events POST 需要 ticket 匹配的 worker token;Worker 工具受 Mandate 作用域、Shell 白名单与工作区 jail 约束;Web Client 只读(面板不写宿主状态)。
105
+ - **默认状态**:SuperAgent 默认 **observe**,不会自动接单;Router 仅 essence、Worker/成本仅 fork、双主管仅 mother/essence,角色不匹配时该行明确报 `role-not-allowed`。
106
+ - **兼容**:`engines.dsh: >=0.2.2-rc.1 <0.3.0-0`(实测基线 DSH 0.2.2-rc.1、Node.js 26)。
107
+
108
+ ## CI
109
+
110
+ `.github/workflows/ci.yml` 在 `push main`、Pull Request 与手动触发时运行:
111
+
112
+ ```text
113
+ npm ci
114
+ npm run check # client.js 语法 + host/worker 类型检查
115
+ npm run build # dist-host + dist-worker
116
+ npm test # 全量测试
117
+ ```
118
+
119
+ 矩阵:Node 24 / 26(ubuntu),另加 Node 26(windows,覆盖平台相关用例)。
120
+
121
+ ## 许可证
122
+
123
+ 本项目以 [GNU Affero General Public License v3.0 or later](LICENSE) 发布。
124
+ `LICENSE-CORE` 是同一许可文本的副本,随核心源码一起分发。
package/client.js CHANGED
@@ -285,7 +285,7 @@ window.__ModuleLoader__.load({
285
285
  ...items.map((item) => h(SubpluginCard, { key: item.id, item })),
286
286
  h(FangCard, { cooperation: status && status.cooperation }),
287
287
  h(LiveFeed),
288
- h('div', { style: S.desc }, '3.2.9:面板常驻(点面板外不收起、按钮二次点击收起、长内容可滚动);实时流(SSE)+ token 轮换/审计 + Worker 并发配额。'),
288
+ h('div', { style: S.desc }, '3.2.10:角色矩阵放宽(Router→essence/mother,Worker/Loop→fork/essence);面板常驻、按钮二次点击收起、正文可滚动;实时流(SSE)+ token 轮换/审计。'),
289
289
  ))
290
290
  }
291
291
 
@@ -7,7 +7,7 @@
7
7
  * 与瓮城 dsh-Fang 的协作只走 DSH 服务键,不 import fang 代码。
8
8
  */
9
9
  import crypto from 'node:crypto';
10
- export const MASTER_VERSION = '3.2.9';
10
+ export const MASTER_VERSION = '3.2.10';
11
11
  export const FANG_CONTRACT_MIN = '3.1.14';
12
12
  export const SERVICE = Object.freeze({
13
13
  master: 'dshMaster',
@@ -33,16 +33,17 @@ export const ROW = Object.freeze({
33
33
  });
34
34
  export const ROLE = Object.freeze({ mother: 'mother', essence: 'essence', fork: 'fork' });
35
35
  /**
36
- * 角色矩阵(v3.2.3):
37
- * * Router 常驻原身(essence):只评估/建票/派发,不执行代码;母体不接纳。
38
- * * Worker 是研究原型,只在 fork:编译后的 Worker preset 行 master-superagent-loop 也只 fork。
39
- * * 成本优化 fork;双主管 mother/essence。
36
+ * 角色矩阵(3.2.10):
37
+ * * Router 在 essence 与 mother 激活:只评估/建票/派发,不执行代码;fork 不注册。
38
+ * * Worker / Worker Agent Loop 在 fork 与 essence 激活:原身可直接执行工单,
39
+ * 分身仍是默认执行体;mother 不执行。
40
+ * * 成本优化仍只 fork;双主管 mother/essence。
40
41
  */
41
42
  export const ROLE_MATRIX = Object.freeze({
42
43
  'master-core': Object.freeze(Object.values(ROLE)),
43
- 'master-superagent-router': Object.freeze([ROLE.essence]),
44
- 'master-superagent-worker': Object.freeze([ROLE.fork]),
45
- 'master-superagent-loop': Object.freeze([ROLE.fork]),
44
+ 'master-superagent-router': Object.freeze([ROLE.essence, ROLE.mother]),
45
+ 'master-superagent-worker': Object.freeze([ROLE.fork, ROLE.essence]),
46
+ 'master-superagent-loop': Object.freeze([ROLE.fork, ROLE.essence]),
46
47
  'master-cost-optimizer': Object.freeze([ROLE.fork]),
47
48
  'master-dual-manager': Object.freeze([ROLE.mother, ROLE.essence]),
48
49
  });
@@ -50,17 +51,17 @@ export const SUBPLUGIN_CATALOG = Object.freeze([
50
51
  Object.freeze({
51
52
  id: 'superagent-router', row: ROW.superagentRouter, name: '超级智能体 Router', nameEn: 'SuperAgent Router',
52
53
  roles: ROLE_MATRIX[ROW.superagentRouter], roadmap: '3.2.1',
53
- description: '常驻原身:Webhook → 评估 → Ticket/Mandate → 派发;不执行代码改动。',
54
+ description: '常驻原身/母体:Webhook → 评估 → Ticket/Mandate → 派发;不执行代码改动。',
54
55
  }),
55
56
  Object.freeze({
56
57
  id: 'superagent-worker', row: ROW.superagentWorker, name: '超级智能体 Worker', nameEn: 'SuperAgent Worker',
57
58
  roles: ROLE_MATRIX[ROW.superagentWorker], roadmap: '3.2.1',
58
- description: '每个工单一个隔离分身:在 Mandate 作用域内执行;研究原型,仅 fork。',
59
+ description: '每个工单一个隔离执行体:在 Mandate 作用域内执行;fork 与 essence 可用。',
59
60
  }),
60
61
  Object.freeze({
61
62
  id: 'superagent-loop', row: ROW.superagentLoop, name: 'Worker Agent Loop', nameEn: 'SuperAgent Worker Loop',
62
63
  roles: ROLE_MATRIX[ROW.superagentLoop], roadmap: '3.2.3',
63
- description: '编译后的 Worker preset:有 Ticket 的 fork 自动跑多轮工具循环并流式回传。',
64
+ description: '编译后的 Worker preset:有 Ticket 的在 fork/essence 自动跑多轮工具循环并流式回传。',
64
65
  }),
65
66
  Object.freeze({
66
67
  id: 'cost-optimizer', row: ROW.cost, name: '成本优化', nameEn: 'HarnessMM',
@@ -328,7 +328,7 @@ export function apply(ctx, config = {}) {
328
328
  id: 'superagent-router',
329
329
  name: 'dsh-master-superagent-router',
330
330
  capabilities: ['webhook-ingest', 'trust-eval', 'ticket-mandate', 'worker-dispatch', 'worker-stream', 'writeback'],
331
- description: 'SuperAgent Router(仅原身;只派发不执行)',
331
+ description: 'SuperAgent Router(原身/母体;只派发不执行)',
332
332
  });
333
333
  // HTTP:Webhook 入口 + Worker 实时事件 + 只读状态。
334
334
  try {
@@ -67,7 +67,7 @@ export function apply(ctx, config = {}) {
67
67
  id: 'superagent-worker',
68
68
  name: 'dsh-master-superagent-worker',
69
69
  capabilities: ['ticket-context', 'mandate-scope-guard', 'worker-prompt', 'long-task-plan'],
70
- description: restored.ok ? 'SuperAgent Worker 已恢复工单(仅 fork)' : 'SuperAgent Worker 待工单(仅 fork)',
70
+ description: restored.ok ? 'SuperAgent Worker 已恢复工单(fork/essence)' : 'SuperAgent Worker 待工单(fork/essence)',
71
71
  });
72
72
  return service;
73
73
  }
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * SuperAgent Router(v3.2.1):事件 → 评估 → Ticket/Mandate → 派发 Worker。
6
6
  *
7
- * Router 常驻原身(essence),**不执行代码改动**:所有执行体通过 dispatching
7
+ * Router 在 essence/mother 常驻,**不执行代码改动**:所有执行体通过 dispatching
8
8
  * 适配器交给瓮城 fangForker.spawn(分身),本模块不做文件/进程操作。
9
9
  * 纯核心逻辑(评估/建票)在 trust.mjs;本模块只做编排、去重、持久化与审计。
10
10
  */
@@ -1,6 +1,6 @@
1
- # dsh-Master 架构(3.2.9)
1
+ # dsh-Master 架构(3.2.10)
2
2
 
3
- > 当前实现基线为 3.2.9;本文保留设计演进记录。最新实机证据与剩余限制见 `REVIEW-v3.2.7.md`。
3
+ > 当前实现基线为 3.2.10;本文保留设计演进记录。最新实机证据与剩余限制见 `REVIEW-v3.2.7.md`。
4
4
 
5
5
  ## 1. 为什么是“并行主插件”
6
6
 
@@ -44,17 +44,17 @@
44
44
  | 行 | mother | essence(原身/元宝运行态) | fork(分身) |
45
45
  |---|---|---|---|
46
46
  | `master-core` | ✅ | ✅ | ✅ |
47
- | `master-superagent-router` | ❌ | ✅ | ❌ |
48
- | `master-superagent-worker` | ❌ | ❌ | ✅ |
49
- | `master-superagent-loop` | ❌ | ❌ | ✅ |
47
+ | `master-superagent-router` | ✅ | ✅ | ❌ |
48
+ | `master-superagent-worker` | ❌ | ✅ | ✅ |
49
+ | `master-superagent-loop` | ❌ | ✅ | ✅ |
50
50
  | `master-cost-optimizer` | ❌ | ❌ | ✅ |
51
51
  | `master-dual-manager` | ✅ | ✅ | ❌ |
52
52
 
53
- - Router 是纯控制面(评估/建票/派发),不执行任何代码改动,因此可以常驻原身;
54
- - Worker 是研究原型,**只在 fork**,用物理隔离兜底其不稳定性;
55
- - 母体(mother)不接纳任何 SuperAgent 行;
56
- - 3.2.0 的“SuperAgent 整体仅 fork”在 3.2.1 被 Router/Worker 拆分取代,底线是
57
- “原型 Worker 绝不进入母体/元主”(见 `docs/SECURITY.md`)。
53
+ - Router 是纯控制面(评估/建票/派发),不执行任何代码改动,因此可在原身与母体常驻;
54
+ - Worker / Worker Agent Loop 在 fork 与 essence 激活:分身仍是默认执行体,原身可直接执行工单;
55
+ - 母体(mother)不接纳 Worker/Loop 执行体(只有 Router 与双主管);
56
+ - 3.2.10 起按用户要求放宽:Router 进入母体、Worker/Loop 进入原身;底线仍是
57
+ “执行体绝不进入母体”,fork 依旧不注册 Router(见 `docs/SECURITY.md`)。
58
58
 
59
59
  ## 3. 与瓮城的服务契约
60
60
 
@@ -104,7 +104,7 @@
104
104
 
105
105
  ## 6. 3.2.3-dev 的边界
106
106
 
107
- - Worker preset 已 tsc 构建到 `dist-worker/` 并接入 bundle 行(fork only,有 Ticket 自动跑);
107
+ - Worker preset 已 tsc 构建到 `dist-worker/` 并接入 bundle 行(fork/essence,有 Ticket 自动跑);
108
108
  - Router 两种派发:本地 `fangForker.spawn`(母体/测试)或 HTTP 母体桥
109
109
  `POST /dsh-master/api/bridge/spawn`(Bearer bridgeToken,仅透传 DSH_MASTER_* env);
110
110
  - Worker→Router 实时事件:per-ticket token POST `/dsh-master/api/superagent/worker-events`,
package/docs/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 3.2.10(2026-11-12,tag / GitHub Release / NPM public)
2
+
3
+ **主题:按实测反馈放宽角色矩阵(Router 进入母体、Worker / Worker Agent Loop 进入原身)。**
4
+
5
+ - 角色矩阵:`master-superagent-router` 由 essence-only 改为 **essence / mother**;`master-superagent-worker` 与 `master-superagent-loop` 由 fork-only 改为 **fork / essence**;`master-cost-optimizer` 仍 fork-only,`master-dual-manager` 仍 mother / essence。
6
+ - 子插件描述与面板文案同步:Router「原身/母体」、Worker「fork/essence」、Loop「fork/essence 有票自动循环」。
7
+ - 文档回归:`ARCHITECTURE.md` 角色矩阵与安全说明、`SECURITY.md` 强制表、`SUPERAGENT.md` 分层表与防线表、`WORKER-AGENT-LOOP.md`、README 子插件表/状态段。
8
+ - 测试跟进:kernel 矩阵与 `roleAllowed`、core 逐角色 status、package-contract 结构断言、client 面板 stub 版本。
9
+ - 未覆盖部分(如实记录):瓮城分身 profile 里并未安装本 bundle(forker 的 `forkSeed` 不含 `@twinsearth/dsh-master`),因此“分身 web 自动激活”还需要把包加进 `forkSeed`(activate)或装进分身 profile —— 属瓮城配置,需另行授权。
10
+
1
11
  ## 3.2.9(2026-11-12,tag / GitHub Release / NPM public)
2
12
 
3
13
  **主题:房主面板交互修复(常驻 / 可收起 / 可滚动)+ 客户端行为测试。**
@@ -0,0 +1,32 @@
1
+ # dsh-Master v3.2.10 发布门禁
2
+
3
+ 日期:2026-11-12。
4
+
5
+ ## 内容
6
+
7
+ 本版按实机反馈放宽角色矩阵:`master-superagent-router` 由 essence-only 改为 **essence / mother**;`master-superagent-worker` 与 `master-superagent-loop` 由 fork-only 改为 **fork / essence**;`master-cost-optimizer` 仍 fork-only,`master-dual-manager` 仍 mother / essence。
8
+
9
+ 母体仍不接纳 Worker/Loop 执行体,fork 仍不注册 Router;面板、子插件描述与角色文档同步。测试按新矩阵逐角色断言。
10
+
11
+ ## 发布前实测
12
+
13
+ ```text
14
+ npm run check 0 error
15
+ npm run build 0 error(dist-host + dist-worker)
16
+ npm test 188 / 188 pass / 0 fail
17
+ npm run test:clean 188 / 188 pass / 0 fail(不使用 --test-force-exit)
18
+ ```
19
+
20
+ ## 三方发布目标
21
+
22
+ - `main`:发布提交;
23
+ - `v3.2.10`:annotated tag;
24
+ - GitHub Release:tarball + sha256 + manifest;
25
+ - NPM:`@twinsearth/dsh-master@3.2.10`,`access=public`。
26
+
27
+ 发布不等同于安装:本流程不修改任何用户 profile(desktop / 瓮城运行态仍停在旧版,升级需另行授权)。
28
+
29
+ ## 已知限制
30
+
31
+ - 瓮城分身的 profile 未安装本 bundle(forker 的 `forkSeed` 不含 `@twinsearth/dsh-master`),因此“分身 web 里 Worker/Loop 自动激活”仍需把包加进 `forkSeed`(activate)或装进分身 profile——属瓮城配置。
32
+ - 矩阵放宽只改变激活范围,不改变各自的安全边界:Router 仍只派发不执行,执行体仍在 Mandate 作用域内运行。
package/docs/ROADMAP.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # 路线图:3.2.0 → 3.4.0
2
2
 
3
- > 版本线:`3.2.0 – 3.2.9`(1 个大版本 + 9 个小版本),随后 3.3.0、3.4.0。
4
- > 本文保留版本演进记录;当前基线为 `3.2.9`。
3
+ > 版本线:`3.2.0 – 3.2.10`(1 个大版本 + 10 个小版本),随后 3.3.0、3.4.0。
4
+ > 本文保留版本演进记录;当前基线为 `3.2.10`。
5
5
  > 最新测试/实机状态与尚未完成的范围见 `REVIEW-v3.2.7.md`,下列旧版本待办不得再理解为当前状态。
6
6
 
7
7
  ## 三条主线
8
8
 
9
9
  | 版本 | 主题 | 核心组件 | 定位 |
10
10
  |---|---|---|---|
11
- | **3.2.0–3.2.9** | 主动性:从被动响应到主动巡航 | SuperAgent(Router/Worker) | 原身控制面 + 分身执行体的双层结构 |
11
+ | **3.2.0–3.2.10** | 主动性:从被动响应到主动巡航 | SuperAgent(Router/Worker) | 原身控制面 + 分身执行体的双层结构 |
12
12
  | **3.3.0** | 经济性:车间成本控制器 | HarnessMM | 分身的 Token 效率优化器;EGD/GDR/CCS |
13
13
  | **3.4.0** | 组织性:人机协同制度化 | PM + PJM | 母体/元主内的元 Agent,调度分身集群 |
14
14
 
package/docs/SECURITY.md CHANGED
@@ -1,4 +1,4 @@
1
- # 安全边界(3.2.9)
1
+ # 安全边界(3.2.10)
2
2
 
3
3
  > 最新变化:worker-events 读取需 UI/匹配 worker token;旧 token 轮换 fail-closed;契约与 PR 网络调用全部有超时;DSH 同路径路由合并分流;飞书加密事件支持 AES-256-CBC。实机证据见 `REVIEW-v3.2.7.md`。
4
4
 
@@ -59,14 +59,14 @@
59
59
 
60
60
  | 子插件 | 允许角色 | 强制位置 |
61
61
  |---|---|---|
62
- | SuperAgent Router | **essence only** | `superagent-router.mjs` apply 开头 `roleAllowed(ROW_ID, role)`;母体/fork 不注册服务 |
63
- | SuperAgent Worker | **fork only** | `superagent-worker.mjs` 同上;母体/元主不注册 |
64
- | 成本优化 | **fork only** | `cost-optimizer.mjs` 同上 |
65
- | 双主管 | **mother / essence** | `dual-manager.mjs` 同上 |
66
-
67
- - 母体(mother)不接纳任何 SuperAgent 行;
68
- - Router 是控制面:不读文件、不跑命令、不改代码;所有执行体必须在 fork Worker 中;
69
- - Worker 是官方研究原型:物理隔离是底线,**绝不**在母体/元主启用;
62
+ | SuperAgent Router | **essence / mother** | `superagent-router.ts` apply 开头 `roleAllowed(ROW_ID, role)`;fork 不注册服务 |
63
+ | SuperAgent Worker | **fork / essence** | `superagent-worker.ts` 同上;母体不注册 |
64
+ | 成本优化 | **fork only** | `cost-optimizer.ts` 同上 |
65
+ | 双主管 | **mother / essence** | `dual-manager.ts` 同上 |
66
+
67
+ - 母体(mother)只接纳 Router 与双主管,不接纳 Worker/Loop 执行体;
68
+ - Router 是控制面:不读文件、不跑命令、不改代码;执行体在 fork Worker 或原身(3.2.10 起)中运行;
69
+ - Worker 的物理隔离仍是默认执行路径,**绝不**在母体启用;
70
70
  - 测试逐角色断言(mother/essence/fork)服务是否存在。
71
71
 
72
72
  ## 2. 外部输入不可信
@@ -1,8 +1,8 @@
1
- # SuperAgent(v3.2.9)
1
+ # SuperAgent(v3.2.10)
2
2
 
3
3
  > 把“用户从多窗口注意力调度中解放出来”的架构跃迁:**Router(常驻控制面)** 与
4
4
  > **Worker(隔离执行体)** 分离,Ticket/Mandate 约束授权,渐进式信任控制自动接单。
5
- > 3.2.9 为面板交互修复发布线。历史限制与实机证据见 `REVIEW-v3.2.7.md`。
5
+ > 3.2.10 为角色矩阵放宽线(Router 进入母体、Worker/Loop 进入原身)。历史限制与实机证据见 `REVIEW-v3.2.7.md`。
6
6
 
7
7
  ## 1. 双层结构
8
8
 
@@ -27,8 +27,8 @@
27
27
  | 层 | 瓮城物理层 | 本仓库实现 | 角色 |
28
28
  |---|---|---|---|
29
29
  | 事件源 | 外部环境 | `src/superagent/github.mjs`、`feishu.mjs` | 被动入口 |
30
- | Router | 原身(安全盘) | `src/plugins/superagent-router.mjs` + `src/superagent/router.mjs` | **essence only** |
31
- | Worker | 分身(隔离 VM) | `src/plugins/superagent-worker.mjs` + `worker.mjs` | **fork only** |
30
+ | Router | 原身(安全盘)/ 母体 | `src/plugins/superagent-router.ts` + `src/superagent/router.ts` | **essence / mother** |
31
+ | Worker | 分身(隔离 VM)/ 原身 | `src/plugins/superagent-worker.ts` + `worker/` | **fork / essence** |
32
32
  | 持久化 | 会话仓 | `ticket-store.mjs`(`<dataDir>/superagent-tickets.json`) | Router 侧 |
33
33
  | 派发 | DerivedManager | `dispatch.mjs` → `fangForker.spawn({env})` | Router 侧 |
34
34
 
@@ -117,7 +117,7 @@ fangForker.spawn({
117
117
  |---|---|
118
118
  | 外部输入不可信 | 验签/Token → 归一化 → Gate;payload 永远当不可信文本 |
119
119
  | Mandate 防越权 | 不可变 Ticket;Worker 精确 scope 校验,越权退回 Router |
120
- | 物理隔离 | Worker 只在 fork;Router essence-only;母体不接纳任何 SuperAgent 行 |
120
+ | 物理隔离 | Worker 默认在 fork;3.2.10 起也可在 essence;Router 在 essence/mother;母体不接纳执行体 |
121
121
  | 长任务不阻塞 | `exec_shell_in_vm` 超过 5s 返回后台 job id,`vm_job_result` 查询真实终态与输出 |
122
122
  | 失败不假装成功 | dispatch 失败 → Ticket= failed、decision=unavailable,错误码原样返回 |
123
123
  | 去重 | 事件 id 最近 500 条 FIFO(重复事件不刷新顺序);契约幂等键随 envelope 传递 |
@@ -131,7 +131,7 @@ apply(ctx) // 监听 superagent:worker:start;也可直接 runWorker(ticket, de
131
131
  - **PR**:`create_pr` 工具可接真实 GitHub 客户端(`DSH_MASTER_GITHUB_TOKEN/REPO`),需要先把分支 push 到远端;
132
132
  - 回写默认关闭,失败只告警,不改变 Ticket 终态;token 不入日志/状态。
133
133
 
134
- - Worker preset 已用 tsc 构建到 `dist-worker/` 并接入 bundle 行 `master-superagent-loop`(fork only);
134
+ - Worker preset 已用 tsc 构建到 `dist-worker/` 并接入 bundle 行 `master-superagent-loop`(fork/essence);
135
135
  - Router 生成的 per-ticket token 通过 HTTP POST 把事件实时回传 Router;前端 SSE/WS 转发待 3.2.4;
136
136
  - 回写(webhook / GitHub Issue 评论)默认关闭,按宿主配置启用;失败只告警;
137
137
  - 跨进程派发桥需要宿主配置 `bridgeToken`(母体)与 `motherUrl/motherToken`(原身),默认关闭;
package/package.json CHANGED
@@ -1,11 +1,23 @@
1
1
  {
2
2
  "name": "@twinsearth/dsh-master",
3
- "version": "3.2.9",
3
+ "version": "3.2.10",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
8
8
  "type": "module",
9
+ "license": "AGPL-3.0-or-later",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/TwinsEarth/dsh-Master.git"
13
+ },
14
+ "homepage": "https://github.com/TwinsEarth/dsh-Master#readme",
15
+ "bugs": {
16
+ "url": "https://github.com/TwinsEarth/dsh-Master/issues"
17
+ },
18
+ "engines": {
19
+ "dsh": ">=0.2.2-rc.1 <0.3.0-0"
20
+ },
9
21
  "description": "Dsh-Master(房主):与瓮城 dsh-Fang 并行的主 Agent 插件,托管 SuperAgent Router/Worker、HarnessMM、PM+PJM。",
10
22
  "keywords": [
11
23
  "dsh",
@@ -51,8 +63,8 @@
51
63
  "README.md"
52
64
  ],
53
65
  "scripts": {
54
- "test": "node --test --test-force-exit test/",
55
- "test:clean": "node --test --test-concurrency=1 test/",
66
+ "test": "node --test --test-force-exit \"test/**/*.test.mjs\" \"test/**/*.test.ts\"",
67
+ "test:clean": "node --test --test-concurrency=1 \"test/**/*.test.mjs\" \"test/**/*.test.ts\"",
56
68
  "test:worker": "node --test --test-force-exit test/worker-agent-loop.test.ts test/worker-tools.test.ts test/worker-llm-http.test.ts test/worker-sink-http.test.ts",
57
69
  "typecheck:worker": "tsc -p tsconfig.worker.json",
58
70
  "build:worker": "tsc -p tsconfig.worker.build.json",
package/src/kernel.ts CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  import crypto from 'node:crypto'
12
12
 
13
- export const MASTER_VERSION = '3.2.9'
13
+ export const MASTER_VERSION = '3.2.10'
14
14
  export const FANG_CONTRACT_MIN = '3.1.14'
15
15
 
16
16
  export const SERVICE = Object.freeze({
@@ -41,16 +41,17 @@ export const ROW = Object.freeze({
41
41
  export const ROLE = Object.freeze({ mother: 'mother', essence: 'essence', fork: 'fork' })
42
42
 
43
43
  /**
44
- * 角色矩阵(v3.2.3):
45
- * * Router 常驻原身(essence):只评估/建票/派发,不执行代码;母体不接纳。
46
- * * Worker 是研究原型,只在 fork:编译后的 Worker preset 行 master-superagent-loop 也只 fork。
47
- * * 成本优化 fork;双主管 mother/essence。
44
+ * 角色矩阵(3.2.10):
45
+ * * Router 在 essence 与 mother 激活:只评估/建票/派发,不执行代码;fork 不注册。
46
+ * * Worker / Worker Agent Loop 在 fork 与 essence 激活:原身可直接执行工单,
47
+ * 分身仍是默认执行体;mother 不执行。
48
+ * * 成本优化仍只 fork;双主管 mother/essence。
48
49
  */
49
50
  export const ROLE_MATRIX = Object.freeze({
50
51
  'master-core': Object.freeze(Object.values(ROLE)),
51
- 'master-superagent-router': Object.freeze([ROLE.essence]),
52
- 'master-superagent-worker': Object.freeze([ROLE.fork]),
53
- 'master-superagent-loop': Object.freeze([ROLE.fork]),
52
+ 'master-superagent-router': Object.freeze([ROLE.essence, ROLE.mother]),
53
+ 'master-superagent-worker': Object.freeze([ROLE.fork, ROLE.essence]),
54
+ 'master-superagent-loop': Object.freeze([ROLE.fork, ROLE.essence]),
54
55
  'master-cost-optimizer': Object.freeze([ROLE.fork]),
55
56
  'master-dual-manager': Object.freeze([ROLE.mother, ROLE.essence]),
56
57
  })
@@ -59,17 +60,17 @@ export const SUBPLUGIN_CATALOG = Object.freeze([
59
60
  Object.freeze({
60
61
  id: 'superagent-router', row: ROW.superagentRouter, name: '超级智能体 Router', nameEn: 'SuperAgent Router',
61
62
  roles: ROLE_MATRIX[ROW.superagentRouter], roadmap: '3.2.1',
62
- description: '常驻原身:Webhook → 评估 → Ticket/Mandate → 派发;不执行代码改动。',
63
+ description: '常驻原身/母体:Webhook → 评估 → Ticket/Mandate → 派发;不执行代码改动。',
63
64
  }),
64
65
  Object.freeze({
65
66
  id: 'superagent-worker', row: ROW.superagentWorker, name: '超级智能体 Worker', nameEn: 'SuperAgent Worker',
66
67
  roles: ROLE_MATRIX[ROW.superagentWorker], roadmap: '3.2.1',
67
- description: '每个工单一个隔离分身:在 Mandate 作用域内执行;研究原型,仅 fork。',
68
+ description: '每个工单一个隔离执行体:在 Mandate 作用域内执行;fork 与 essence 可用。',
68
69
  }),
69
70
  Object.freeze({
70
71
  id: 'superagent-loop', row: ROW.superagentLoop, name: 'Worker Agent Loop', nameEn: 'SuperAgent Worker Loop',
71
72
  roles: ROLE_MATRIX[ROW.superagentLoop], roadmap: '3.2.3',
72
- description: '编译后的 Worker preset:有 Ticket 的 fork 自动跑多轮工具循环并流式回传。',
73
+ description: '编译后的 Worker preset:有 Ticket 的在 fork/essence 自动跑多轮工具循环并流式回传。',
73
74
  }),
74
75
  Object.freeze({
75
76
  id: 'cost-optimizer', row: ROW.cost, name: '成本优化', nameEn: 'HarnessMM',
@@ -323,7 +323,7 @@ export function apply(ctx, config = {}) {
323
323
  id: 'superagent-router',
324
324
  name: 'dsh-master-superagent-router',
325
325
  capabilities: ['webhook-ingest', 'trust-eval', 'ticket-mandate', 'worker-dispatch', 'worker-stream', 'writeback'],
326
- description: 'SuperAgent Router(仅原身;只派发不执行)',
326
+ description: 'SuperAgent Router(原身/母体;只派发不执行)',
327
327
  })
328
328
 
329
329
  // HTTP:Webhook 入口 + Worker 实时事件 + 只读状态。
@@ -79,7 +79,7 @@ export function apply(ctx, config = {}) {
79
79
  id: 'superagent-worker',
80
80
  name: 'dsh-master-superagent-worker',
81
81
  capabilities: ['ticket-context', 'mandate-scope-guard', 'worker-prompt', 'long-task-plan'],
82
- description: restored.ok ? 'SuperAgent Worker 已恢复工单(仅 fork)' : 'SuperAgent Worker 待工单(仅 fork)',
82
+ description: restored.ok ? 'SuperAgent Worker 已恢复工单(fork/essence)' : 'SuperAgent Worker 待工单(fork/essence)',
83
83
  })
84
84
  return service
85
85
  }
@@ -5,7 +5,7 @@
5
5
  /**
6
6
  * SuperAgent Router(v3.2.1):事件 → 评估 → Ticket/Mandate → 派发 Worker。
7
7
  *
8
- * Router 常驻原身(essence),**不执行代码改动**:所有执行体通过 dispatching
8
+ * Router 在 essence/mother 常驻,**不执行代码改动**:所有执行体通过 dispatching
9
9
  * 适配器交给瓮城 fangForker.spawn(分身),本模块不做文件/进程操作。
10
10
  * 纯核心逻辑(评估/建票)在 trust.mjs;本模块只做编排、去重、持久化与审计。
11
11
  */