@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 +42 -8
- package/client.js +102 -31
- package/dist-host/kernel.js +12 -11
- package/dist-host/plugins/superagent-router.js +1 -1
- package/dist-host/plugins/superagent-worker.js +1 -1
- package/dist-host/superagent/router.js +1 -1
- package/docs/ARCHITECTURE.md +11 -11
- package/docs/CHANGELOG.md +22 -0
- package/docs/RELEASE-v3.2.10.md +32 -0
- package/docs/RELEASE-v3.2.8.md +27 -0
- package/docs/RELEASE-v3.2.9.md +29 -0
- package/docs/ROADMAP.md +3 -3
- package/docs/SECURITY.md +9 -9
- package/docs/SUPERAGENT.md +5 -5
- package/docs/WORKER-AGENT-LOOP.md +1 -1
- package/package.json +15 -3
- package/src/kernel.ts +12 -11
- package/src/plugins/superagent-router.ts +1 -1
- package/src/plugins/superagent-worker.ts +1 -1
- package/src/superagent/router.ts +1 -1
package/README.md
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
# dsh-Master(房主)
|
|
2
2
|
|
|
3
3
|
> 与瓮城 **dsh-Fang** 并行的主 Agent 插件。
|
|
4
|
-
> 当前版本:`3.2.
|
|
4
|
+
> 当前版本:`3.2.10`(角色矩阵放宽线;tag / GitHub Release / NPM public)。
|
|
5
5
|
> 仓库:https://github.com/TwinsEarth/dsh-Master
|
|
6
6
|
|
|
7
|
+
[](https://github.com/TwinsEarth/dsh-Master/actions/workflows/ci.yml)
|
|
8
|
+
[](https://www.npmjs.com/package/@twinsearth/dsh-master)
|
|
9
|
+
[](https://github.com/TwinsEarth/dsh-Master/blob/main/LICENSE)
|
|
10
|
+
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
11
|
+
[](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
|
|
28
|
-
| SuperAgent Worker | `master-superagent-worker` | **fork
|
|
29
|
-
| Worker Agent Loop | `master-superagent-loop` | **fork
|
|
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`
|
|
90
|
-
-
|
|
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: {
|
|
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
|
-
|
|
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(
|
|
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('
|
|
221
|
-
h('div', { style: S.
|
|
222
|
-
|
|
223
|
-
h('
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
h(
|
|
236
|
-
h(
|
|
237
|
-
|
|
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
|
-
/**
|
|
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
|
|
245
|
-
return h('
|
|
246
|
-
|
|
247
|
-
open ?
|
|
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
|
},
|
package/dist-host/kernel.js
CHANGED
|
@@ -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.
|
|
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
|
-
* 角色矩阵(
|
|
37
|
-
* * Router
|
|
38
|
-
* * Worker
|
|
39
|
-
*
|
|
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: '
|
|
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: '
|
|
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
|
|
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
|
|
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
|
|
7
|
+
* Router 在 essence/mother 常驻,**不执行代码改动**:所有执行体通过 dispatching
|
|
8
8
|
* 适配器交给瓮城 fangForker.spawn(分身),本模块不做文件/进程操作。
|
|
9
9
|
* 纯核心逻辑(评估/建票)在 trust.mjs;本模块只做编排、去重、持久化与审计。
|
|
10
10
|
*/
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# dsh-Master 架构(3.2.
|
|
1
|
+
# dsh-Master 架构(3.2.10)
|
|
2
2
|
|
|
3
|
-
> 当前实现基线为 3.2.
|
|
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
|
|
55
|
-
- 母体(mother
|
|
56
|
-
- 3.2.
|
|
57
|
-
|
|
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
|
|
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.
|
|
4
|
-
> 本文保留版本演进记录;当前基线为 `3.2.
|
|
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.
|
|
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.
|
|
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
|
|
63
|
-
| SuperAgent Worker | **fork
|
|
64
|
-
| 成本优化 | **fork only** | `cost-optimizer.
|
|
65
|
-
| 双主管 | **mother / essence** | `dual-manager.
|
|
66
|
-
|
|
67
|
-
- 母体(mother
|
|
68
|
-
- Router
|
|
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. 外部输入不可信
|
package/docs/SUPERAGENT.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# SuperAgent(v3.2.
|
|
1
|
+
# SuperAgent(v3.2.10)
|
|
2
2
|
|
|
3
3
|
> 把“用户从多窗口注意力调度中解放出来”的架构跃迁:**Router(常驻控制面)** 与
|
|
4
4
|
> **Worker(隔离执行体)** 分离,Ticket/Mandate 约束授权,渐进式信任控制自动接单。
|
|
5
|
-
> 3.2.
|
|
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 |
|
|
31
|
-
| Worker | 分身(隔离 VM
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
* 角色矩阵(
|
|
45
|
-
* * Router
|
|
46
|
-
* * Worker
|
|
47
|
-
*
|
|
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: '
|
|
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: '
|
|
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
|
|
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
|
|
82
|
+
description: restored.ok ? 'SuperAgent Worker 已恢复工单(fork/essence)' : 'SuperAgent Worker 待工单(fork/essence)',
|
|
83
83
|
})
|
|
84
84
|
return service
|
|
85
85
|
}
|
package/src/superagent/router.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* SuperAgent Router(v3.2.1):事件 → 评估 → Ticket/Mandate → 派发 Worker。
|
|
7
7
|
*
|
|
8
|
-
* Router
|
|
8
|
+
* Router 在 essence/mother 常驻,**不执行代码改动**:所有执行体通过 dispatching
|
|
9
9
|
* 适配器交给瓮城 fangForker.spawn(分身),本模块不做文件/进程操作。
|
|
10
10
|
* 纯核心逻辑(评估/建票)在 trust.mjs;本模块只做编排、去重、持久化与审计。
|
|
11
11
|
*/
|