clearai-dsh 0.1.2 → 0.1.4
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/CHANGELOG.md +68 -0
- package/README.md +28 -24
- package/README.zh-CN.md +28 -24
- package/bin/clearai.mjs +128 -12
- package/lib/client.js +95 -95
- package/lib/fold.js +151 -66
- package/lib/host.js +20 -18
- package/package.json +9 -3
- package/presets/clearai/agent.cordis.yml +107 -36
- package/presets/clearai/plugins/brain.js +2 -2
- package/presets/clearai/plugins/clearai-kernel.js +552 -284
- package/presets/clearai/plugins/commands.js +199 -0
- package/presets/clearai/plugins/ontology.js +3 -3
- package/presets/clearai/plugins/prompts.js +51 -25
package/lib/host.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* 为什么状态机必须在这一层:预设会被**重建**(组合文件的 mtime 一变,名册就重新挂载),
|
|
11
11
|
* 而进程级的东西(投影注册、服务名)只能注册一次。把状态放在预设里,等于让一个会被重建的
|
|
12
|
-
* 东西持有进程级资源——第二次挂载必然撞名(
|
|
12
|
+
* 东西持有进程级资源——第二次挂载必然撞名(失效模式:webserver 报 duplicate exact route)。
|
|
13
13
|
*
|
|
14
14
|
* 面板也不再需要 HTTP 路由:投影单元的 `wire` 把视图推给浏览器,客户端用
|
|
15
15
|
* `useProjection('clearai')` 读——免轮询、自带变更通知。
|
|
@@ -44,7 +44,7 @@ const stateSchema = z.looseObject({
|
|
|
44
44
|
skillUsage: z.record(z.string(), z.unknown()),
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
-
/** 浏览器读到的那个视图(
|
|
47
|
+
/** 浏览器读到的那个视图(面板契约——客户端与宿主半各自消费它的同一批字段)。 */
|
|
48
48
|
const viewSchema = z.looseObject({
|
|
49
49
|
ok: z.boolean(),
|
|
50
50
|
mounted: z.boolean(),
|
|
@@ -112,24 +112,24 @@ export function apply(ctx) {
|
|
|
112
112
|
* ① **动词白名单**:adopt_branch / abandon_fork / promote_skill,
|
|
113
113
|
* 表外一律拒(与贡献表同一套「表外的名字不许出现」)——**取值**也在这一层校验
|
|
114
114
|
* (技能名合原生语法),宁可 400,也不静默半生效;
|
|
115
|
-
* `set_autonomy`
|
|
115
|
+
* `set_autonomy` 已摘掉:「在场与否」是运行时状态,不该是面板上的一个开关 ✗;
|
|
116
116
|
* ② **agent 不可达**:这些动词**没有工具 schema**——模型的工具面里不存在它们。
|
|
117
117
|
* 模型能做的只是读到「人做了什么」这条事实(它进的是会话日志,不是内核状态);
|
|
118
118
|
* ③ **留下署名**:动作变成一条 `source.kind === 'user'` 的消息,折进投影时写
|
|
119
119
|
* `by:'user'`——「谁在什么时候裁了哪条世界线、扶正了哪个技能、把档切成了什么」都在日志里。
|
|
120
120
|
*
|
|
121
|
-
*
|
|
121
|
+
* 两个动词已砍掉(奥卡姆:它们是重复,不是能力):
|
|
122
122
|
* · `confirm_plan` —— 原生 `dsh-plan-mode` 就是「用户复核的出口」;而授权本来就「交付即落账」;
|
|
123
123
|
* · `invoke_skill` —— 原生 `/` 技能触发器做同一件事(还带候选菜单),我们那条只是在旁边
|
|
124
124
|
* 又写了一遍同一个手势。
|
|
125
125
|
*
|
|
126
126
|
* 为什么走 HTTP 路由而不是 `harness.handle`:那是 cordis **动态插件**的座位,静态客户端包
|
|
127
|
-
* 没有它(
|
|
127
|
+
* 没有它(`host.call` 只在动态运行时的包里存在)。宿主平面的路由是这条
|
|
128
128
|
* 通道在静态包里的对应物,与 ClearAI 面板自己的写接口(FastAPI 路由)同一个层级。
|
|
129
129
|
*/
|
|
130
130
|
/**
|
|
131
|
-
* 面板用的三条 HTTP 面**必须挂 `connection` 的 exact fetch route 表**,不能只挂 `webServer
|
|
132
|
-
*
|
|
131
|
+
* 面板用的三条 HTTP 面**必须挂 `connection` 的 exact fetch route 表**,不能只挂 `webServer`——
|
|
132
|
+
* 挂错层,浏览器里一按就是 404。
|
|
133
133
|
*
|
|
134
134
|
* 浏览器那侧的 `/api/*` 先落到 connection 的共享 channel:它先查 exact fetch route 表;
|
|
135
135
|
* 查不到就把路径当成 RPC 端点(`/api/<ns>.<method>`)去问 interceptor;再查不到,
|
|
@@ -167,7 +167,7 @@ export function apply(ctx) {
|
|
|
167
167
|
/**
|
|
168
168
|
* 盘上**实际**的输出成果:`products/` 底下真有、但**任何计划都还没声明**的那些文件。
|
|
169
169
|
*
|
|
170
|
-
*
|
|
170
|
+
* 为什么要它:在一个已经有产物的老项目里开新会话,「产物」栏只有
|
|
171
171
|
* 「阶段 0 · 交付 0/0」—— 因为这一栏原来只认投影里的**声明**。可人此刻问的是「我拿到了什么」,
|
|
172
172
|
* 盘上那份 46 KB 的 HTML 明明就在。声明与实际是两件事,这一栏本来就该两边都看得见。
|
|
173
173
|
*
|
|
@@ -242,7 +242,7 @@ export function apply(ctx) {
|
|
|
242
242
|
}
|
|
243
243
|
|
|
244
244
|
/**
|
|
245
|
-
* 把一道开着的人门**建成一张原生提问卡**(
|
|
245
|
+
* 把一道开着的人门**建成一张原生提问卡**(混合路径:内容走原生,裁决回我们的账本)。
|
|
246
246
|
*
|
|
247
247
|
* 问题与选项都从**投影**现算(此刻真实的分叉与技能),不在前端拼——前端只发一个手势。
|
|
248
248
|
* 认不出来(那道门已经不在了)就返回 `null`:如实拒掉,不摆一张过期的卡。
|
|
@@ -354,7 +354,7 @@ export function apply(ctx) {
|
|
|
354
354
|
}
|
|
355
355
|
const action = request === null || typeof request !== 'object' ? '' : String(request.action ?? '')
|
|
356
356
|
/**
|
|
357
|
-
* `ask`
|
|
357
|
+
* `ask` 是**界面手势**,不是事实动词:它把某道等人的人门摆到**原生提问卡**上,
|
|
358
358
|
* 再由人在卡里选——选出来的答案仍走下面那条老路(人门消息 → 内核落事实)。
|
|
359
359
|
* 所以白名单分两层:能**写事实**的只有 `HUMAN_GATE_ACTIONS`;能**发起提问**的另有一个。
|
|
360
360
|
*/
|
|
@@ -386,7 +386,7 @@ export function apply(ctx) {
|
|
|
386
386
|
return reply(400, { ok: false, error: 'bad_skill_name' })
|
|
387
387
|
}
|
|
388
388
|
/**
|
|
389
|
-
* ──
|
|
389
|
+
* ── 混合路径:点我们那条 → 用**原生提问卡**问 ──────────────────────
|
|
390
390
|
*
|
|
391
391
|
* 为什么值这一条:我们自己的人门行(fork 裁决 / 采纳技能)现在只能在右栏面板里点按钮,
|
|
392
392
|
* 而「人正在看对话」的时候,卡就在他眼前、还把输入框挡住——那是原生最擅长的形态。
|
|
@@ -428,7 +428,7 @@ export function apply(ctx) {
|
|
|
428
428
|
action === 'promote_skill'
|
|
429
429
|
? '候选状态正由内核改写(`status: active`),下一个回合它就在你的技能目录里'
|
|
430
430
|
/* 说准(rather than 说满):这句话写下的那一刻只到 inbox、还没进投影,
|
|
431
|
-
|
|
431
|
+
所以不能断言「已经在投影里生效」——失效模式是模型看到它与卡片矛盾,停下来问人。 */
|
|
432
432
|
: '跑 ConvergeFork 落实它——合并与清理是内核的活'
|
|
433
433
|
try {
|
|
434
434
|
appendHumanGate(agent, { detail, human, followUp })
|
|
@@ -445,7 +445,7 @@ export function apply(ctx) {
|
|
|
445
445
|
* 声明(步骤 artifacts)、盘上在不在、多大、谁验的。**声明 vs 实际**是这个产品的核心对照。
|
|
446
446
|
* `GET /api/clearai/brain?sessionId=` 工作区现状:技能目录(内核还没落事实时面板的兜底)。
|
|
447
447
|
*
|
|
448
|
-
*
|
|
448
|
+
* **没有「读文件正文」那条了**:预览交给 DSH 原生的文档预览
|
|
449
449
|
* (`dsh-client-ui-sidebar-documentpreview` 的 6 个实现 + 它自己的分页读盘),
|
|
450
450
|
* 我们只按原生地址把文件递过去。少一条读面 = 少一处要维护的路径守卫,
|
|
451
451
|
* 而且原生那边本来就有 markdown / 图片 / pdf / html 的渲染。
|
|
@@ -484,7 +484,7 @@ export function apply(ctx) {
|
|
|
484
484
|
}
|
|
485
485
|
const isFile = info !== null && info.isFile()
|
|
486
486
|
/**
|
|
487
|
-
* `exists: false` 有两种成因,**面板必须分开说**(
|
|
487
|
+
* `exists: false` 有两种成因,**面板必须分开说**(混着写会误导下一步动作):
|
|
488
488
|
* 模型把 `lab/`(一个目录)声明成物证时,准入按「空目录」拒了它;
|
|
489
489
|
* 而面板原来一律写「缺 · 盘上没有这个文件」——它明明在,只是不是文件。
|
|
490
490
|
* 事实有两种,界面就别用一句话盖住。
|
|
@@ -514,7 +514,7 @@ export function apply(ctx) {
|
|
|
514
514
|
/**
|
|
515
515
|
* `GET /api/clearai/brain?sessionId=` —— 工作区**现状**的实时技能目录。
|
|
516
516
|
*
|
|
517
|
-
*
|
|
517
|
+
* 为什么需要它:面板的数据来自会话日志的投影,而内核只在
|
|
518
518
|
* `agent/pre-step` 里落事实;于是**新建的会话在第一轮对话之前**,「技能 · 记忆」页签是空的
|
|
519
519
|
* (提示还让人「先在 clear/skills/ 里放一个技能」——可那里明明躺着 18 个模板技能)。
|
|
520
520
|
*
|
|
@@ -575,9 +575,11 @@ export function apply(ctx) {
|
|
|
575
575
|
/**
|
|
576
576
|
* 运行态卡:注给模型的**事实**。
|
|
577
577
|
*
|
|
578
|
-
* `overrides.autonomy
|
|
579
|
-
*
|
|
580
|
-
*
|
|
578
|
+
* `overrides.autonomy`:面板上曾可以切档,而那一拍投影里还是旧档
|
|
579
|
+
* (消息先入 inbox、后落日志,而 pre-step 跑在它落账之前)。切档入口已经摘除,
|
|
580
|
+
* 但**这条覆盖通道保留**:一是旧会话日志里仍有那种记录,二是它保证了"卡片说的就是
|
|
581
|
+
* 这一回合真正要跑的机制"这条不变量——两句话互相矛盾比一句话过期更糟
|
|
582
|
+
* (旧投影与新消息同框时,模型会被矛盾卡住——所以宁缺毋假)。
|
|
581
583
|
*/
|
|
582
584
|
renderCard: (sessionId, overrides = {}) => {
|
|
583
585
|
const state = stateOf(sessionId)
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clearai-dsh",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "ClearAI: The Epistemic Loop, native to DSH.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/Clearailhc/clearai-dsh.git"
|
|
11
|
+
},
|
|
8
12
|
"main": "./lib/host.js",
|
|
9
13
|
"exports": {
|
|
10
14
|
".": "./lib/host.js",
|
|
@@ -13,7 +17,7 @@
|
|
|
13
17
|
"./package.json": "./package.json"
|
|
14
18
|
},
|
|
15
19
|
"bin": {
|
|
16
|
-
"clearai-dsh": "
|
|
20
|
+
"clearai-dsh": "bin/clearai.mjs"
|
|
17
21
|
},
|
|
18
22
|
"files": [
|
|
19
23
|
"lib",
|
|
@@ -60,6 +64,8 @@
|
|
|
60
64
|
"verify:deploy": "node tools/verify-deploy.mjs",
|
|
61
65
|
"verify:install": "node tools/verify-clean-install.mjs",
|
|
62
66
|
"pack": "node tools/build-package.mjs && npm pack ./dist/clearai-dsh",
|
|
63
|
-
"release": "node tools/build-package.mjs && node tools/verify-package.mjs && node tools/verify-clean-install.mjs && npm pack ./dist/clearai-dsh --pack-destination dist"
|
|
67
|
+
"release": "node tools/build-package.mjs && node tools/verify-package.mjs && node tools/verify-clean-install.mjs && npm pack ./dist/clearai-dsh --pack-destination dist",
|
|
68
|
+
"e2e": "node tools/e2e-run.mjs",
|
|
69
|
+
"e2e:long": "node tools/e2e-parallel.mjs"
|
|
64
70
|
}
|
|
65
71
|
}
|
|
@@ -111,11 +111,11 @@
|
|
|
111
111
|
|
|
112
112
|
# ── 认识论内核(本预设的灵魂) ───────────────────────────────────────────────
|
|
113
113
|
|
|
114
|
-
#
|
|
115
|
-
#
|
|
116
|
-
#
|
|
114
|
+
# 22 件意图工具(目标 2 + 计划 8 + 世界线 6 + 侦察 2 + 外脑 2 + 账本 2,见 `MECHANISM_TOOLS`)
|
|
115
|
+
# + 一个 guard + 每回合派生的运行态卡 + 只增不删的台账 + 面板数据路由。
|
|
116
|
+
# 逐条对照 docs/loop-philosophy.md 的五条哲学,见 ./plugins/clearai-kernel.js 的文件头。
|
|
117
117
|
#
|
|
118
|
-
#
|
|
118
|
+
# 外脑:**读侧全走宿主原生**——`./plugins/brain.js` 只把工作区投影成技能条目
|
|
119
119
|
# (`clear/skills/**` → 目录条目;`clear/memory/**` → 一个**虚拟条目** `project-memory`,
|
|
120
120
|
# 正文现算所以没有「索引过期」),目录注入与按需加载由宿主的 `tool-skill` 承担(digest 变了才注入)。
|
|
121
121
|
# 自建的只有写侧两件:`SaveSkill`(默认候选态)与 `WriteMemory`(字段校验 + 标题去重)。
|
|
@@ -124,21 +124,21 @@
|
|
|
124
124
|
# 对读数排序,采纳最优的,落选的全部保留。算不出来就停下问人,绝不退化成随便挑一条。
|
|
125
125
|
# git 世界线已落地(A+B 两档):用户仓库可用就地开分支 + worktree,不可用退到旁路账本仓库。
|
|
126
126
|
#
|
|
127
|
-
#
|
|
127
|
+
# 装配是**清单驱动**的:工具面、提示词段、机制开关全部查表,代码里不出现模式名。
|
|
128
128
|
#
|
|
129
|
-
#
|
|
130
|
-
#
|
|
131
|
-
#
|
|
132
|
-
#
|
|
129
|
+
# 续跑:需要继续时,内核在宿主 `goals` 服务上布防一枚**续跑令牌**——计划收尾而目标未达成时,
|
|
130
|
+
# 由宿主的回合驱动自己开下一轮。**要不要继续由门状态决定**(未授权 / 等裁决 / 有人在等 → 停),
|
|
131
|
+
# 与运行档无关。宿主目标只当**驱动器**,内核从不读它做判断(事实仍然只从投影里算出来);
|
|
132
|
+
# 达成→收回,触礁/放弃→置阻塞,重启后自动补防。
|
|
133
|
+
# 配置项就是机制的旋钮:
|
|
133
134
|
- id: clearai-kernel
|
|
134
135
|
name: ./plugins/clearai-kernel.js
|
|
135
136
|
config:
|
|
136
137
|
# 连拦阈值:同一件事连续冲闸这么多次没过,计划置 blocked、停下等人。
|
|
137
|
-
#
|
|
138
|
-
# 「人就在旁边,早点回来问」。2026-09-11 起它**不再随当档变**(它是质量闸,不是预算)。
|
|
138
|
+
# 默认 3;这里写 2 是产品立场「人就在旁边,早点回来问」。它是**质量闸,不随运行档变**。
|
|
139
139
|
#
|
|
140
|
-
# 注意:同一个键在这个 config 里只能出现一次——YAML 的重复键会让 yaml
|
|
141
|
-
#
|
|
140
|
+
# 注意:同一个键在这个 config 里只能出现一次——YAML 的重复键会让 yaml 包直接抛错,
|
|
141
|
+
# 而 DSH 的加载器是**静默取值**的,所以重复键会以"另一个值生效"的形式骗过所有人。
|
|
142
142
|
blockedThreshold: 2
|
|
143
143
|
# brief 质量门:低于此长度只警告不阻断(brief.py)
|
|
144
144
|
minBriefChars: 280
|
|
@@ -147,7 +147,9 @@
|
|
|
147
147
|
# L4 只认外部来源:做的人自己写过的路径不算观测
|
|
148
148
|
l4RejectSelfWritten: true
|
|
149
149
|
# 「≥2 条假设」在 ClearAI 只是文案;这里默认不强制,要开就把值改成 2
|
|
150
|
-
|
|
150
|
+
# 假设数量下限:首次立目标至少登记 2 条候选假设(0 条一样拦)。候选对比是检验的前提——
|
|
151
|
+
# 只有一个猜想时,「验证」容易退化成找证据支持自己。修订目标不受此限。
|
|
152
|
+
minHypotheses: 2
|
|
151
153
|
# deny_rules 十条里可移植的九条(路径越狱那条不搬:宿主沙箱已经拥有它,ClearAI 自己也说「不重复」)
|
|
152
154
|
bashDenyRules: true
|
|
153
155
|
# 独立评估者:spawn = fresh context(fork 会继承历史,做的人与判的人就分不开了)
|
|
@@ -163,31 +165,33 @@
|
|
|
163
165
|
- read_image
|
|
164
166
|
# 每回合派生的运行态卡(只在状态变化时注入:前缀稳定是硬约束)
|
|
165
167
|
runtimeCard: true
|
|
166
|
-
# 运行档:人在场 /
|
|
167
|
-
#
|
|
168
|
-
# · 立约是否即授权(无人值守档:选择它本身就是授权);
|
|
169
|
-
# · 续跑策略(目标边界处:人在场停下等人 / 无人值守自己开下一轮);
|
|
170
|
-
# · 续跑轮数上限(人在场:6 / 无人值守:512,见下面 maxAutoTurns)。
|
|
168
|
+
# 运行档:人在场 / 无人值守。**它只决定一件事**:澄清协议装哪一段
|
|
169
|
+
# (槽位 clarification 收敛;两套措辞互斥,永不同时在场)。
|
|
171
170
|
#
|
|
172
|
-
#
|
|
173
|
-
# (
|
|
174
|
-
#
|
|
171
|
+
# 它**不决定**下面这些——写清楚是因为这四处曾经被误认为跟着档走:
|
|
172
|
+
# · 计划授权 —— 计划**永远**要人在原生审阅卡上批准(CreatePlan 里没有自动确认分支,
|
|
173
|
+
# confirmed_by 只有 'user' 与 'progress');
|
|
174
|
+
# · 续跑策略 —— 要不要继续由 turnDemand 从**门状态**算出来(未授权/裁决在飞/门开着 → hold);
|
|
175
|
+
# · 续跑轮数 —— 只有一个默认值 128,不按档取;
|
|
176
|
+
# · 面板开关 —— 人门动词 set_autonomy 已摘除,当前没有切换入口。
|
|
177
|
+
#
|
|
178
|
+
# 所以这里写的是**部署初值**,不是"人此刻在不在场"的表示。
|
|
179
|
+
# 真正表达"要不要人"的是**门**:计划待确认 / 等裁决 / 有人在等。
|
|
175
180
|
autonomy: attended
|
|
176
|
-
#
|
|
177
|
-
#
|
|
178
|
-
#
|
|
179
|
-
# 单元测试量的是「不写配置」的自由形态(512 拿得到),而真跑走的是这一份被写死的配置,
|
|
180
|
-
# 两者差了整整一个数量级,直到真跑读数摊出来才看见(§17.6)。
|
|
181
|
+
# 续跑轮数上限。**刻意不写**:不写就回落到 DEFAULT_MAX_AUTO_TURNS(128),在布防点现算。
|
|
182
|
+
# 显式写一个数就两档都用它。这个键存在的意义是**保险丝**:够长到能跑完一件真活,
|
|
183
|
+
# 又短到不会无声烧掉一整夜。
|
|
181
184
|
# 执行者是**原生**:数字传到宿主目标的 maxGoalRounds,到限由 `dsh-goal-round-driver`
|
|
182
185
|
# 自己 block(code='round-limit')——上限真的是机制在执行,不是一句嘱咐。
|
|
183
|
-
#
|
|
184
|
-
# 本来就是原生 `dsh-token-meter` + `dsh-compaction-basic` 的活,那两个数字从未执行过。
|
|
186
|
+
# 上下文预算不在这里:那是原生 `dsh-token-meter` + `dsh-compaction-basic` 的活。
|
|
185
187
|
# 贡献表(ClearAI `composition.py` 的装配语义):装配根遍历清单,清单里出现表外的名字
|
|
186
188
|
# 当场抛错——未知机制 / 未知工具 / 未知段 / 已关机制却仍列着它的工具,四种错法都在装配期炸,
|
|
187
189
|
# 而不是静默少装一件工具、等某一轮才发现。
|
|
188
190
|
#
|
|
189
|
-
# 这里只写**机制开关**;tools / sections 缺省 = 目录全量(
|
|
190
|
-
#
|
|
191
|
+
# 这里只写**机制开关**;tools / sections 缺省 = 目录全量(22 件意图工具、23 段提示词定义、
|
|
192
|
+
# 同一时刻 22 段在场——澄清协议那一段由 autonomy 在两套措辞里收敛)。
|
|
193
|
+
# 这些数字不靠人眼维持:`node tools/verify-truth-table.mjs` 会拿代码算出来的数核对它们。
|
|
194
|
+
# 要裁剪就把 tools 或 sections 显式写出来:
|
|
191
195
|
# tools: [SetGoal, CreatePlan, AdvancePlan, ...] # 名字必须都在工具目录里
|
|
192
196
|
# sections: [clearai/foundation, clearai/loop-contract, clarification, ...]
|
|
193
197
|
# `clarification` 是槽位名;直接写两套措辞里的哪一个会被拒绝(同时在场不可表示)。
|
|
@@ -200,6 +204,69 @@
|
|
|
200
204
|
brain: true
|
|
201
205
|
ledger: true
|
|
202
206
|
|
|
207
|
+
# ── 人侧命令(/ 菜单) ────────────────────────────────────────────────────────
|
|
208
|
+
|
|
209
|
+
# 五个命令都是**人侧界面**:四个只读状态窗(goal/plan/evidence/worldline,从账本现算,
|
|
210
|
+
# 一个字都不落账) + 一个呈审捷径(plan-review,把「重新呈审」steer 给模型,
|
|
211
|
+
# 授权记号仍走 RequestPlanReview 工具落账——命令处理器没有变更通道,这是权威边界)。
|
|
212
|
+
- id: clearai-commands
|
|
213
|
+
name: ./plugins/commands.js
|
|
214
|
+
|
|
215
|
+
# ── 工作方式(非权威能力,交还原生) ──────────────────────────────────────────
|
|
216
|
+
|
|
217
|
+
# todo / 子代理 / workflow / ralph 是**工作方式**,不是认识论:它们一件 clearai 变更都
|
|
218
|
+
# 产不出来(权威边界测试钉死:变更字面量只在内核、入口被标记把守)。模型干活不设限,
|
|
219
|
+
# 但结论要进权威账本,只能由主线自己过观测准入与唯一完成动词。
|
|
220
|
+
- id: tool-todo
|
|
221
|
+
name: '@deepseek-ai/dsh-tool-todo'
|
|
222
|
+
config:
|
|
223
|
+
allowParallelInProgress: true
|
|
224
|
+
|
|
225
|
+
# `subagents` 注册表与 spawn/fork 后端在宿主平面;`workflows` 是谁都不在外面读的服务,
|
|
226
|
+
# 所以到达它的行共享这一个 entry-local realm(与 standard 预设同形)。
|
|
227
|
+
- id: delegation
|
|
228
|
+
name: cordis:group
|
|
229
|
+
group: true
|
|
230
|
+
isolate:
|
|
231
|
+
workflowEngine: true
|
|
232
|
+
config:
|
|
233
|
+
- id: tool-subagent-control
|
|
234
|
+
name: '@deepseek-ai/dsh-tool-subagent-control'
|
|
235
|
+
|
|
236
|
+
- id: tool-subagent-list-agents
|
|
237
|
+
name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
|
|
238
|
+
|
|
239
|
+
# 执行者自选模型:重活可以换模型跑(modelSelectionSettings 出面板设置)。
|
|
240
|
+
- id: tool-subagent
|
|
241
|
+
name: '@deepseek-ai/dsh-tool-subagent'
|
|
242
|
+
config:
|
|
243
|
+
provider: spawn
|
|
244
|
+
toolName: subagent
|
|
245
|
+
modelSelectionSettings: true
|
|
246
|
+
backgroundMode: continuable
|
|
247
|
+
|
|
248
|
+
# fork 不开模型选择:provider/model 与父保持一致,继承的历史才能继续吃 KV Cache。
|
|
249
|
+
- id: tool-subagent-fork
|
|
250
|
+
name: '@deepseek-ai/dsh-tool-subagent'
|
|
251
|
+
config:
|
|
252
|
+
provider: fork
|
|
253
|
+
toolName: subagent_fork
|
|
254
|
+
backgroundMode: continuable
|
|
255
|
+
|
|
256
|
+
- id: workflow-worker-thread
|
|
257
|
+
name: '@deepseek-ai/dsh-workflow-worker-thread'
|
|
258
|
+
config:
|
|
259
|
+
provider: spawn
|
|
260
|
+
|
|
261
|
+
- id: tool-workflow
|
|
262
|
+
name: '@deepseek-ai/dsh-tool-workflow'
|
|
263
|
+
|
|
264
|
+
- id: tool-ralph
|
|
265
|
+
name: '@deepseek-ai/dsh-tool-ralph'
|
|
266
|
+
config:
|
|
267
|
+
subagentProvider: spawn
|
|
268
|
+
maxRounds: 64
|
|
269
|
+
|
|
203
270
|
# ── 其余模型面 ──────────────────────────────────────────────────────────────
|
|
204
271
|
|
|
205
272
|
- id: tool-ask-user
|
|
@@ -217,10 +284,14 @@
|
|
|
217
284
|
|
|
218
285
|
# ── 刻意不挂的行(是决策,不是遗漏) ─────────────────────────────────────────
|
|
219
286
|
#
|
|
220
|
-
# · `tool-
|
|
221
|
-
#
|
|
222
|
-
#
|
|
223
|
-
# · `tool-subagent` / `tool-workflow` / `tool-ralph`:ClearAI 的子角色由 Harness 按触发派生
|
|
224
|
-
# (Scout/Evaluator),评估者的派遣已经在内核里;自由委派会重新引入「自己派一个来判自己」。
|
|
287
|
+
# · `tool-goal` / `command-goal`:DSH 的 goals 服务已经被内核用作**续跑驱动器**
|
|
288
|
+
# (布防/收兵都走它);再挂上模型面的 goal 工具,模型就能自己声明目标状态——
|
|
289
|
+
# 那是第二本账。ClearAI 的目标账只有一本,由内核持有,面板显示的就是它。
|
|
225
290
|
# · `plan-mode`:那是 DSH 的计划模式,与本内核的 CreatePlan/AdvancePlan 是两套计划纪律。
|
|
226
291
|
# 同时挂上就是第二本账。要它就得先决定哪一本是唯一账本。
|
|
292
|
+
#
|
|
293
|
+
# 曾经不挂、现在**挂回来了**的(阶段 5,权威边界由 test/authority-boundary.test.mjs 钉死):
|
|
294
|
+
# · `tool-todo` / `tool-subagent` / `tool-workflow` / `tool-ralph`:这些是**工作方式**,
|
|
295
|
+
# 产不出一条 clearai 变更。「不挂」当年防的是「自己派一个来判自己」——评估者的派遣
|
|
296
|
+
# 在内核里(auditProvider),与模型面的 subagent 是两层;后者派出去的只是干活的,
|
|
297
|
+
# 它的结论要进账本,只能回到主线过观测准入。
|
|
@@ -254,8 +254,8 @@ export function brainFingerprint(cwd) {
|
|
|
254
254
|
*
|
|
255
255
|
* `invalidate`(`registerProvider` 给的 `control.invalidate`)在**指纹真的变了**时被调用:
|
|
256
256
|
* 宿主那边另有一层按「cwd + 作用域 + revision」做键的目录缓存,不 bump revision 的话,
|
|
257
|
-
*
|
|
258
|
-
*
|
|
257
|
+
* 我们这边明明多了一条技能、它那边还会把旧表端出来——失效模式是第一回合的空目录被
|
|
258
|
+
* 缓存住,模型之后一直看不到 `clear/skills`。
|
|
259
259
|
* 原生 filesystem provider 靠 watcher 做这件事,我们没有 watcher,就靠指纹。
|
|
260
260
|
*/
|
|
261
261
|
export function createBrainProvider(options = {}) {
|