@twinsearth/dsh-master 3.2.8 → 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,15 @@
1
1
  # dsh-Master(房主)
2
2
 
3
3
  > 与瓮城 **dsh-Fang** 并行的主 Agent 插件。
4
- > 当前版本:`3.2.8`(审计修复发布线;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)
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)
11
+ [![](https://img.shields.io/badge/powered_by-dsh-4D6BFE?style=flat-square&logo=deepseek&logoColor=white)](https://github.com/deepseek-ai/deepseek-harness)
12
+
7
13
  ## 这是什么
8
14
 
9
15
  dsh-Master 不接管瓮城的「母体 / 原身 / 分身」生命周期;它是一块**并列的主插件**,
@@ -13,8 +19,8 @@ dsh-Master 不接管瓮城的「母体 / 原身 / 分身」生命周期;它是
13
19
  DSH Host
14
20
  ├── 瓮城 bundle (dsh-Fang) 房主 bundle (dsh-Master)
15
21
  │ mirror / essence / derived core(主 Agent 控制面)
16
- │ fangForker / fangDecisionCenter ◄────── ├── superagent-router (essence)
17
- │ fangSessionCatalog ├── superagent-worker (fork)
22
+ │ fangForker / fangDecisionCenter ◄────── ├── superagent-router (essence/mother)
23
+ │ fangSessionCatalog ├── superagent-worker (fork/essence)
18
24
  │ ├── cost-optimizer (fork)
19
25
  │ └── dual-manager (mother/essence)
20
26
  └── 协作只走服务键;任一方向失败一律 fail-closed,不本地降级执行
@@ -24,9 +30,9 @@ DSH Host
24
30
 
25
31
  | 子插件 | 行 id | 允许角色 | 路线图 | 已交付 |
26
32
  |---|---|---|---|---|
27
- | SuperAgent Router | `master-superagent-router` | **essence only** | 3.2.1/3.2.3 | Webhook/Ticket/Mandate、渐进信任、本地或母体桥派发、Worker 实时事件、回写 |
28
- | SuperAgent Worker | `master-superagent-worker` | **fork only** | 3.2.1 | Ticket 上下文、Mandate 守卫 |
29
- | 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 自动跑多轮工具循环并流式回传 |
30
36
  | 成本优化 HarnessMM | `master-cost-optimizer` | **fork only** | 3.3.0 | observe 层:token 估算、实测记录 |
31
37
  | 双主管 PM + PJM | `master-dual-manager` | **mother / essence** | 3.4.0 | PRD/计划/调度/决策中心澄清 |
32
38
 
@@ -84,7 +90,35 @@ dsh plugin add <package> # 加载 dist-host/dist-worker
84
90
 
85
91
  ## 状态
86
92
 
93
+ - 3.2.10 发布线:角色矩阵放宽——Router 进入母体(essence/mother),Worker 与 Worker Agent Loop 进入原身(fork/essence);母体仍不接纳执行体,fork 仍不注册 Router。
94
+ - 3.2.9 发布线:房主面板改注册到 `shell.overlay` 常驻浮层——点击面板之外不收起、侧栏「房主」按钮二次点击收起、正文独立滚动;新增无浏览器 hook 运行时行为测试(开关、无 outside-click 监听、滚动容器、SSE 失败不卸载面板)。
87
95
  - 3.2.8 发布线:与瓮城通过 fang-master contract 1.0 互联(local/http/file/legacy 四级保底);GitHub Release + NPM public。
88
96
  - 当前工作树完成新一轮审计修复:工具名/死循环阈值、Router 鉴权与生命周期、真实路由分流、契约幂等与超时、PR 护栏与交付、飞书加密、长 Shell 后台作业、成本实测接线、PJM 派生契约。
89
- - 验收:`npm run check` / `npm run build` / `npm test` 全绿;真实双 Host/fork 落库、工具写读、SSE、回写、配额与桥清理断言通过。详见复盘文档。
90
- - 后续修复尚未发布,也未安装到用户主 profile;发布仍需明确指令。
97
+ - 验收:`npm run check` / `npm run build` / `npm test` 全绿(188/188);真实双 Host/fork 落库、工具写读、SSE、回写、配额与桥清理断言通过。详见复盘文档。
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
@@ -2,11 +2,18 @@
2
2
  // Copyright (c) 2026 dsh-Master contributors — see LICENSE-CORE.
3
3
 
4
4
  /**
5
- * Dsh-Master(房主)Web Client:侧栏「房主」入口 + 只读状态抽屉。
5
+ * Dsh-Master(房主)Web Client:侧栏「房主」入口 + 只读状态面板。
6
6
  *
7
7
  * 只做观察面板(3.2.0 架构骨架):展示角色、三个子插件的激活状态、与瓮城的
8
8
  * 服务协作状态。数据来自 core 的只读路由 `/dsh-master/api/status`。
9
9
  * 不写任何业务状态,不接管宿主根节点。
10
+ *
11
+ * 面板与按钮分离(3.2.9):按钮注册在 `sidebar.footer.action`,面板注册在
12
+ * `shell.overlay`(DSH 的整框浮层,位于所有列与滚动容器之外,且本身
13
+ * click-through)。两者通过模块级 store 共享「是否展开」:
14
+ * - 点击页面其他位置不会关闭面板(浮层没有 outside-click 收回逻辑);
15
+ * - 再次点击「房主」按钮由 `togglePanel()` 收起;
16
+ * - 面板固定 viewport 高度,正文 `overflow-y: auto`,长内容可滚动查看。
10
17
  */
11
18
  window.__ModuleLoader__.load({
12
19
  id: '@twinsearth/dsh-master',
@@ -21,12 +28,22 @@ window.__ModuleLoader__.load({
21
28
  boxShadow: '-16px 0 40px rgba(16,17,20,.16)', display: 'flex', flexDirection: 'column',
22
29
  fontFamily: '-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif',
23
30
  fontSize: 13, color: '#1D1D1F',
31
+ // shell.overlay 整层是 click-through:面板自己opt-in接收指针事件,
32
+ // 面板之外的点击穿透到下面的应用,不会触发任何收回。
33
+ pointerEvents: 'auto',
34
+ },
35
+ head: {
36
+ flex: '0 0 auto', display: 'flex', alignItems: 'center', gap: 8, padding: '14px 16px',
37
+ borderBottom: '1px solid rgba(16,17,20,.08)',
24
38
  },
25
- head: { display: 'flex', alignItems: 'center', gap: 8, padding: '14px 16px', borderBottom: '1px solid rgba(16,17,20,.08)' },
26
39
  title: { fontSize: 14, fontWeight: 700 },
27
40
  sub: { fontSize: 11.5, color: '#86868B' },
28
41
  close: { marginLeft: 'auto', width: 28, height: 28, borderRadius: 8, border: '1px solid rgba(16,17,20,.12)', background: '#fff', color: '#5F6368', cursor: 'pointer' },
29
- body: { flex: 1, overflowY: 'auto', padding: '12px 14px 18px', display: 'flex', flexDirection: 'column', gap: 10 },
42
+ body: {
43
+ flex: '1 1 auto', minHeight: 0, overflowY: 'auto', overscrollBehavior: 'contain',
44
+ scrollbarGutter: 'stable', scrollbarWidth: 'thin',
45
+ padding: '12px 14px 18px', display: 'flex', flexDirection: 'column', gap: 10,
46
+ },
30
47
  card: { border: '1px solid rgba(16,17,20,.1)', borderRadius: 12, padding: '10px 11px', background: '#FAFAFC', display: 'flex', flexDirection: 'column', gap: 4 },
31
48
  row: { display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' },
32
49
  name: { fontSize: 13, fontWeight: 600 },
@@ -40,7 +57,37 @@ window.__ModuleLoader__.load({
40
57
  borderRadius: 8, border: '1px solid rgba(16,17,20,.12)', background: '#fff', color: '#1D1D1F',
41
58
  cursor: 'pointer', fontSize: 12.5, fontWeight: 600, fontFamily: 'inherit',
42
59
  },
43
- banner: { position: 'fixed', top: 0, right: 0, bottom: 0, left: 0, zIndex: 2147482799, background: 'rgba(18,19,22,.18)' },
60
+ fabOpen: {
61
+ display: 'inline-flex', alignItems: 'center', gap: 6, height: 28, padding: '0 9px',
62
+ borderRadius: 8, border: '1px solid rgba(16,17,20,.24)', background: '#F2F2F5', color: '#1D1D1F',
63
+ cursor: 'pointer', fontSize: 12.5, fontWeight: 600, fontFamily: 'inherit',
64
+ },
65
+ }
66
+
67
+ /**
68
+ * 面板展开状态:按钮(sidebar.footer.action)与面板(shell.overlay)是两个
69
+ * 独立注册的组件,状态必须放在模块级 store 里,不能放在任一组件内部。
70
+ */
71
+ const panelState = { open: false }
72
+ const panelListeners = new Set()
73
+ const getPanelOpen = () => panelState.open
74
+ const setPanelOpen = (next) => {
75
+ const value = Boolean(next)
76
+ if (panelState.open === value) return
77
+ panelState.open = value
78
+ for (const listener of panelListeners) {
79
+ try { listener() } catch { /* 订阅者异常不影响其他订阅者 */ }
80
+ }
81
+ }
82
+ const togglePanel = () => setPanelOpen(!panelState.open)
83
+ const subscribePanel = (listener) => {
84
+ panelListeners.add(listener)
85
+ return () => { panelListeners.delete(listener) }
86
+ }
87
+ function usePanelOpen() {
88
+ const [open, setOpen] = React.useState(getPanelOpen)
89
+ React.useEffect(() => subscribePanel(() => setOpen(getPanelOpen())), [])
90
+ return open
44
91
  }
45
92
 
46
93
  const tag = (text, color) => h('span', { style: { ...S.tag, ...(color ? { color, background: 'rgba(16,17,20,.05)' } : {}) } }, text)
@@ -194,7 +241,7 @@ window.__ModuleLoader__.load({
194
241
  )
195
242
  }
196
243
 
197
- function MasterPanel({ onClose }) {
244
+ function MasterPanel() {
198
245
  const [status, setStatus] = React.useState(null)
199
246
  const [error, setError] = React.useState('')
200
247
 
@@ -217,35 +264,51 @@ window.__ModuleLoader__.load({
217
264
  }, [])
218
265
 
219
266
  const items = status && Array.isArray(status.subplugins) ? status.subplugins : []
220
- return h('div', null,
221
- h('div', { style: S.fab, role: 'presentation' }),
222
- h('aside', { style: S.panel, 'aria-label': '房主状态' },
223
- h('div', { style: S.head },
224
- h('span', { style: S.title }, '房主 · dsh-Master'),
225
- h('span', { style: S.sub }, status ? `${status.version} · ${status.role}` : '读取中'),
226
- h('button', { type: 'button', style: S.close, title: '关闭', onClick: onClose }, '×')),
227
- h('div', { style: S.body },
228
- error ? h('div', { style: S.error }, error) : null,
229
- status ? h('div', { style: S.card },
230
- h('div', { style: S.row }, h('span', { style: S.name }, '主 Agent 控制面'), tag('与瓮城并行')),
231
- h('div', { style: S.desc }, '角色:' + status.role + ' · 版本:' + status.version),
232
- h('div', { style: S.desc }, '运行:' + Math.max(1, Math.round((status.uptimeMs || 0) / 60000)) + ' 分钟'),
233
- ) : null,
234
- ...items.map((item) => h(SubpluginCard, { key: item.id, item })),
235
- h(FangCard, { cooperation: status && status.cooperation }),
236
- h(LiveFeed),
237
- h('div', { style: S.desc }, '3.2.7:真实流式(SSE)+ token 轮换/审计 + Worker 并发配额 + 宿主 adapter;未发布。'),
238
- )),
239
- )
267
+ return h('aside', { style: S.panel, id: 'dsh-master-panel', 'aria-label': '房主状态' },
268
+ h('div', { style: S.head },
269
+ h('span', { style: S.title }, '房主 · dsh-Master'),
270
+ h('span', { style: S.sub }, status ? `${status.version} · ${status.role}` : '读取中'),
271
+ h('button', {
272
+ type: 'button',
273
+ style: S.close,
274
+ title: '收起面板',
275
+ 'aria-label': '收起房主面板',
276
+ onClick: () => setPanelOpen(false),
277
+ }, '×')),
278
+ h('div', { style: S.body },
279
+ error ? h('div', { style: S.error }, error) : null,
280
+ status ? h('div', { style: S.card },
281
+ h('div', { style: S.row }, h('span', { style: S.name }, '主 Agent 控制面'), tag('与瓮城并行')),
282
+ h('div', { style: S.desc }, '角色:' + status.role + ' · 版本:' + status.version),
283
+ h('div', { style: S.desc }, '运行:' + Math.max(1, Math.round((status.uptimeMs || 0) / 60000)) + ' 分钟'),
284
+ ) : null,
285
+ ...items.map((item) => h(SubpluginCard, { key: item.id, item })),
286
+ h(FangCard, { cooperation: status && status.cooperation }),
287
+ h(LiveFeed),
288
+ h('div', { style: S.desc }, '3.2.10:角色矩阵放宽(Router→essence/mother,Worker/Loop→fork/essence);面板常驻、按钮二次点击收起、正文可滚动;实时流(SSE)+ token 轮换/审计。'),
289
+ ))
240
290
  }
241
291
 
242
- /** sidebar.footer.action 槽:一个「房主」按钮,点击打开状态抽屉。 */
292
+ /** shell.overlay:整框浮层里的面板本体;关闭时不渲染任何节点。 */
293
+ function MasterOverlay() {
294
+ const open = usePanelOpen()
295
+ return open ? h(MasterPanel) : null
296
+ }
297
+
298
+ /**
299
+ * sidebar.footer.action 槽:一个「房主」按钮。
300
+ * 再点一次收起面板(之前只 setOpen(true),面板打开后按钮无法关闭)。
301
+ */
243
302
  function MasterSeat() {
244
- const [open, setOpen] = React.useState(false)
245
- return h('div', null,
246
- h('button', { type: 'button', style: S.fab, title: '房主 · 主 Agent 控制面', onClick: () => setOpen(true) }, '◈ 房主'),
247
- open ? h(MasterPanel, { onClose: () => setOpen(false) }) : null,
248
- )
303
+ const open = usePanelOpen()
304
+ return h('button', {
305
+ type: 'button',
306
+ style: open ? S.fabOpen : S.fab,
307
+ title: open ? '房主 · 点击收起控制面' : '房主 · 主 Agent 控制面',
308
+ 'aria-expanded': open ? 'true' : 'false',
309
+ 'aria-controls': 'dsh-master-panel',
310
+ onClick: () => togglePanel(),
311
+ }, '◈ 房主')
249
312
  }
250
313
 
251
314
  return {
@@ -257,6 +320,14 @@ window.__ModuleLoader__.load({
257
320
  order: 79,
258
321
  label: '房主',
259
322
  }, MasterSeat))
323
+ // 面板放在 shell.overlay:位于所有列与滚动容器之外,且整层 click-through,
324
+ // 因此不会随侧栏(或宿主弹层)卸载,点击面板外也不会收回。
325
+ ctx.slots.inject('shell.overlay', () => ctx.slots.register({
326
+ name: 'shell.overlay',
327
+ id: 'dsh-master-panel',
328
+ order: 78,
329
+ label: '房主面板',
330
+ }, MasterOverlay))
260
331
  },
261
332
  }
262
333
  },
@@ -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.8';
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.8)
1
+ # dsh-Master 架构(3.2.10)
2
2
 
3
- > 当前实现基线为 3.2.8;本文保留设计演进记录。最新实机证据与剩余限制见 `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,25 @@
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
+
11
+ ## 3.2.9(2026-11-12,tag / GitHub Release / NPM public)
12
+
13
+ **主题:房主面板交互修复(常驻 / 可收起 / 可滚动)+ 客户端行为测试。**
14
+
15
+ - 面板常驻:面板从 `sidebar.footer.action` 单元格移到 `shell.overlay` 整框浮层(位于所有列与宿主滚动容器之外,整层 click-through,面板自行 opt-in 指针事件),不再随侧栏或宿主弹层卸载;插件不注册任何 window/document 监听,因此点击面板之外不会收起。
16
+ - 按钮收起:侧栏「房主」按钮由 `setOpen(true)` 改为 `togglePanel()`,二次点击收起;按钮补 `aria-expanded` / `aria-controls` 与展开态样式。
17
+ - 面板滚动:`aside` 固定 viewport 高度,正文成为独立滚动容器(`flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable`),长内容不再被裁切。
18
+ - 状态共享:按钮与面板是两个独立注册的组件,展开态放在模块级 store(订阅 + `useState` 同步),不依赖任一组件生命周期。
19
+ - 测试:新增 `test/client-panel.test.mjs`,用最小 hook 运行时(`node:vm` + 假 React/槽位)真实渲染组件,断言开关、无 outside-click 监听、滚动容器样式,以及 SSE token 405 时面板不卸载;全量 188/188 通过。
20
+ - 顺带把面板底部过期的版本说明从 3.2.7 更新到 3.2.9。
21
+ - 已知限制(非本版范围):mother 角色下 Router 子插件按角色门禁禁用,`/superagent/stream-token` 路由不存在,DSH 未匹配路由对 POST 回 405,面板因此显示「实时流 token 获取失败(HTTP 405)」;这是角色门禁的预期表现,本版未改文案。
22
+
1
23
  ## 3.2.8(2026-11-12,tag / GitHub Release / NPM public)
2
24
 
3
25
  **主题:真实双 Host/fork 验收驱动的安全、生命周期、契约与 UI 收口。**
@@ -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 作用域内运行。
@@ -0,0 +1,27 @@
1
+ # dsh-Master v3.2.8 发布门禁
2
+
3
+ 日期:2026-11-12。
4
+
5
+ ## 内容
6
+
7
+ 本版将 v3.2.7 后的全面审计修复正式发布:Worker/工具、Router 生命周期与鉴权、契约幂等与文件桥清理、PR 交付护栏与接线、飞书加密、长 Shell 后台作业、HarnessMM 实测接线、PJM 派生契约、UI token 轮换与测试基础设施。
8
+
9
+ 完整证据见 `REVIEW-v3.2.7.md` 与 `SMOKE-3.2.7.md`。
10
+
11
+ ## 发布前实测
12
+
13
+ ```text
14
+ npm run check 0 error
15
+ npm run build 0 error(dist-host + dist-worker)
16
+ npm test 185 / 185 pass / 0 fail
17
+ npm run test:clean 185 / 185 pass / 0 fail(不使用 --test-force-exit)
18
+ ```
19
+
20
+ ## 三方发布目标
21
+
22
+ - `main`:发布提交;
23
+ - `v3.2.8`:annotated tag;
24
+ - GitHub Release:tarball + sha256 + manifest;
25
+ - NPM:`@twinsearth/dsh-master@3.2.8`,`access=public`。
26
+
27
+ 发布不等同于安装:本流程不修改任何用户 profile。
@@ -0,0 +1,29 @@
1
+ # dsh-Master v3.2.9 发布门禁
2
+
3
+ 日期:2026-11-12。
4
+
5
+ ## 内容
6
+
7
+ 本版只修房主面板的三项交互:面板常驻(点击面板之外不收起)、侧栏「房主」按钮二次点击收起、面板正文可滚动。面板从侧栏单元格改注册到 `shell.overlay` 整框浮层,展开态由模块级 store 共享,按钮与面板互不依赖对方生命周期。新增无浏览器行为测试 `test/client-panel.test.mjs`(最小 hook 运行时真实渲染注册组件)。
8
+
9
+ ## 发布前实测
10
+
11
+ ```text
12
+ npm run check 0 error
13
+ npm run build 0 error(dist-host + dist-worker)
14
+ npm test 188 / 188 pass / 0 fail
15
+ npm run test:clean 188 / 188 pass / 0 fail(不使用 --test-force-exit)
16
+ ```
17
+
18
+ ## 三方发布目标
19
+
20
+ - `main`:发布提交;
21
+ - `v3.2.9`:annotated tag;
22
+ - GitHub Release:tarball + sha256 + manifest;
23
+ - NPM:`@twinsearth/dsh-master@3.2.9`,`access=public`。
24
+
25
+ 发布不等同于安装:本流程不修改任何用户 profile(desktop profile 仍停在 3.2.8,升级需另行授权)。
26
+
27
+ ## 已知限制
28
+
29
+ mother 角色下 Router 子插件按角色门禁禁用,`/superagent/stream-token` 不存在,DSH 未匹配路由对 POST 返回 405,面板显示「实时流 token 获取失败(HTTP 405)」。这是角色门禁的预期表现,本版未改文案。
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.8`。
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.8)
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.8)
1
+ # SuperAgent(v3.2.10)
2
2
 
3
3
  > 把“用户从多窗口注意力调度中解放出来”的架构跃迁:**Router(常驻控制面)** 与
4
4
  > **Worker(隔离执行体)** 分离,Ticket/Mandate 约束授权,渐进式信任控制自动接单。
5
- > 3.2.8 为审计修复发布线。历史限制与实机证据见 `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.8",
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.8'
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
  */