better-dsh 0.2.4-a → 0.2.4-c
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/cordis.patch.yml +7 -0
- package/docs/10_plans/2026-09-23-remote-execution-framework.md +236 -0
- package/docs/10_plans/2026-09-23-remote-framework-impl.md +2083 -0
- package/docs/10_plans/2026-09-26-lsp-ast-reminder.md +64 -0
- package/docs/20_specs/agent/spec.md +54 -0
- package/docs/20_specs/ast/spec.md +34 -0
- package/docs/20_specs/compaction-recall/spec.md +46 -0
- package/docs/20_specs/ctx/spec.md +107 -0
- package/docs/20_specs/dsh/spec.md +47 -0
- package/docs/20_specs/dvc/spec.md +87 -0
- package/docs/20_specs/escalation-guidance/spec.md +44 -0
- package/docs/20_specs/fs-scheme-resolution/spec.md +37 -0
- package/docs/20_specs/hash-edit/spec.md +41 -0
- package/docs/20_specs/http-read/spec.md +73 -0
- package/docs/20_specs/kernel-provisioning/spec.md +53 -0
- package/docs/20_specs/lsp/spec.md +121 -0
- package/docs/20_specs/mobile-layout/spec.md +108 -0
- package/docs/20_specs/model-failover/spec.md +20 -0
- package/docs/20_specs/plugins-page-components/spec.md +79 -0
- package/docs/20_specs/preact-ui-shell/spec.md +22 -0
- package/docs/20_specs/repl-dispatch-resilience/spec.md +21 -0
- package/docs/20_specs/skill/spec.md +58 -0
- package/docs/20_specs/tool-surface/spec.md +222 -0
- package/docs/20_specs/url-schema/spec.md +148 -0
- package/docs/20_specs/web-trust-fence/spec.md +43 -0
- package/docs/50_test-reports/2026-09-22-better-dsh/347/273/204/344/273/266/347/203/255/346/217/222/346/213/224/344/270/216/344/276/235/350/265/226/347/272/247/350/201/224/345/256/236/346/265/213/346/212/245/345/221/212.md +18 -1
- package/docs/50_test-reports/2026-09-23-remote-framework/345/256/236/346/265/213/346/212/245/345/221/212.md +92 -0
- package/docs/50_test-reports/2026-09-23-remote-framework/347/254/254/344/270/200/344/272/272/347/247/260/345/244/215/346/265/213/346/212/245/345/221/212.md +125 -0
- package/docs/50_test-reports/2026-09-23-ssh/345/267/245/345/205/267assisted-pty/344/274/232/350/257/235framing/345/256/236/346/265/213/346/212/245/345/221/212.md +207 -0
- package/docs/50_test-reports/2026-09-24-v0.1.7-rc.1/345/257/271/351/275/220/350/275/256-compaction/344/270/216failover/350/256/276/347/275/256/351/235/242/344/277/256/345/244/215/345/256/236/346/265/213/346/212/245/345/221/212.md +65 -0
- package/docs/50_test-reports/2026-09-27-lsp-ast-reminder-4999/345/256/236/346/265/213/346/212/245/345/221/212.md +53 -0
- package/lib/client/index.js +18 -18
- package/lib/compaction/index.d.ts +20 -10
- package/lib/compaction/index.js +42 -56
- package/lib/failover/index.d.ts +30 -6
- package/lib/failover/index.js +32 -26
- package/lib/fs-aware/sandbox-plugin.js +1 -1
- package/lib/index.js +4 -7
- package/lib/mobile/plugin.d.ts +1 -1
- package/lib/remote/plugin.d.ts +24 -0
- package/lib/remote/plugin.js +1095 -0
- package/lib/url-schemes/index.d.ts +14 -14
- package/lib/url-schemes/index.js +119 -15
- package/lib/{web-trust-CgpBoFv3.d.ts → web-trust-BihHCelF.d.ts} +10 -10
- package/lib/web-trust.d.ts +1 -1
- package/package.json +12 -4
- package/docs/10_plans/dashr-remote-tool-design.md +0 -337
- package/docs/10_plans/self-exo-cot-draft.md +0 -322
- package/docs/10_plans/self-scheme-and-monolog-draft.md +0 -357
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
# `self://` scheme + `monolog()` tool — 设计草案
|
|
2
|
-
|
|
3
|
-
> 日期(UTC):2026-09-15 · 状态:**DRAFT / 未裁决**(无实现、无 spec 落盘)
|
|
4
|
-
> 定位:把 RLM(Recursive Language Model)范式里**尚未落地**的那条腿,接到 dashr 已有的
|
|
5
|
-
> URL schemes + `llm_completion` + 持久 kernel 上。
|
|
6
|
-
> 研究依据:arXiv:2512.24601《Recursive Language Models》(Zhang / Kraska / Khattab, Open MIND, 2025-12-31)
|
|
7
|
-
> 全文缓存 `~/.hermes/cache/web/arxiv.org-f7ccb39fbc.md`(455 行);本仓调研
|
|
8
|
-
> `/home/u1/workspaces/agent-harness/21_CLI-Agent/04_prime-agent/03_prime-agent-rlm-analysis.md`。
|
|
9
|
-
> 全部结论均有文件/行号/引文支撑;无支撑的判断一律标 `[推测]`。
|
|
10
|
-
> ⚠️ **排序已被 `self-exo-cot-draft.md`(v2)修订**:v2 依据 GPT-6 Astra 双 harness 数据
|
|
11
|
-
> (62.7% → 99.9% 的自变量是 harness 侧推理保留),主张**先做 `self()` 工具**,
|
|
12
|
-
> `self://` 降级为其产物的读地址。v1 的缺口分析与 `monolog()` 仍然有效。
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## 0. 结论速览(TL;DR)
|
|
17
|
-
|
|
18
|
-
| # | 问题 | 结论 |
|
|
19
|
-
|---|---|---|
|
|
20
|
-
| ① | RLM 论文在哪 | **Energy-Intel 里没有**(全仓 grep `RLM`/`recursive language model`/`2512.24601` 零命中)。真正的引用在姊妹仓 **`agent-harness`**(Energy-Intel `index.md` 已 ⇄ 交叉链接该仓)。见 §1.1 证据表 |
|
|
21
|
-
| ② | dashr 还有 RLM 缺口吗 | **有,但只剩一条腿**。`eval`(持久 IPython) = REPL 腿 ✅;`ctx://` = 「上下文即环境」的**读**腿 ✅;`llm_completion` = 自调用原语 ✅——**但它只吃 `prompt`,无法对「不在上下文里的资源」发起子调用** ❌。这正是 RLM 论文的核心动作(prompt 放环境里,不放进神经网络) |
|
|
22
|
-
| ③ | 该做成什么 | **`self://`(只读 scheme,自指状态面)+ `monolog()`(工具,对可寻址源做递归自发调用)**。二者一个是**地址**、一个是**动作**,合起来闭合 RLM 回路 |
|
|
23
|
-
| ④ | 为什么不叫 `monolog://` | 把「读一个资源」和「跑一次计算」混进同一个 scheme 命名空间;`dvc://` 的「读=roster,写=执行」已经证明这条边界在 dashr 里是**刻意维护**的(catalog.ts 明写只有 `dvc://` 可写) |
|
|
24
|
-
| ⑤ | 为什么不叫 `self()` | dashr 的主交互面是 **Python cell**(`eval` / 持久 kernel)。`self` 是 Python 实例方法的约定名,把 `self` 注册成 kernel 命名空间里的可调用对象是**主动制造混淆**(本仓 v0.1.5 以前 flat-global 绑定的历史包袱,见 §3.2)。`tool.monolog(...)` 无此问题 |
|
|
25
|
-
| ⑥ | 最小可行切片 | **Phase 0 = 给 `llm_completion` 加一个 `source` 参数**(URL/path → 走既有 `UrlResolver` 解引用 → 用解引用文本当 payload)。改动面最小、无新 scheme、无新工具名,先拿到「越窗读+处理」能力,再决定要不要长成 `monolog()` |
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## 1. 研究依据
|
|
30
|
-
|
|
31
|
-
### 1.1 任务 1 的检索结论:RLM 引用**不在** Energy-Intel
|
|
32
|
-
|
|
33
|
-
对 `/home/u1/workspaces/Energy-Intel`(331 个 `.md` + 若干 csv/json/pdf)做了穷尽检索:
|
|
34
|
-
|
|
35
|
-
| 检索式 | 命中 |
|
|
36
|
-
|---|---|
|
|
37
|
-
| `RLM`(全文件类型,含二进制裸串) | 仅 `30_AI/09_llm-evaluation-and-benchmarking/collected/01_reasoning-and-knowledge/simple_qa_test_set.csv` 的偶然子串;PDF `strings` 命中的 `:rlmKqB` 是 zlib 流噪声 |
|
|
38
|
-
| `recursive language model` / `递归语言模型` | 0 |
|
|
39
|
-
| `2512.24601` | 0 |
|
|
40
|
-
| `Khattab` / `Kraska` | 0 |
|
|
41
|
-
| 文件名 `*rlm*` / `*recursi*` | 仅 `10_Mathematics-&-Physics/06_recusive-quine/`(λ 不动点,与 RLM 无关)与 `50_Synthesis-&-Toward-AGI/02_agi-pathways/recursive-self-improvement*.md`(RSI,另一条线) |
|
|
42
|
-
|
|
43
|
-
Energy-Intel 是**理论 vault**(FEP / 计算不可约 / 记忆 / AGI 路径),不是 agent 运行时工程仓;RLM 属于后者。
|
|
44
|
-
|
|
45
|
-
**RLM 引用的真实落点**(均在 `/home/u1/workspaces/` 下):
|
|
46
|
-
|
|
47
|
-
| 位置 | 内容 |
|
|
48
|
-
|---|---|
|
|
49
|
-
| `agent-harness/21_CLI-Agent/04_prime-agent/03_prime-agent-rlm-analysis.md:136` | **作者归属裁决**:`arXiv:2512.24601` 作者 = Alex Zhang / Tim Kraska / Omar Khattab(Open MIND,2025-12-31 发布;Khattab = DSPy 作者);并纠正了「论文出 Prime Intellect」的误记——prime-agent 是该论文的**工程化实现者**(论文引用其 release),非出品方 |
|
|
50
|
-
| 同上 `:84` | 论文原句落地:*"long prompts should not be fed into the neural network directly, treated as part of the environment"* |
|
|
51
|
-
| `agent-harness/21_CLI-Agent/04_prime-agent/01_prime-agent-research.md:8,43` | RLM 定义 + 论文链接(`arxiv.org/abs/2512.24601`);同页另一条线 Continual Harness(arXiv:2605.09998) |
|
|
52
|
-
| `agent-harness/21_CLI-Agent/01_hermes/rlm-plugin-research.md:25,89` | **RLM 开源生态 6 个独立实现**(openrlm / pyrlm-runtime / jsueling-rlm / exrlm / recursive-llm(TS) / Jbollenbacher-RLM)的横向对照;共性 = 「REPL/kernel + 大上下文存变量 + LLM 写代码 inspect + 递归 subcall」 |
|
|
53
|
-
| `agent-harness/15_Memory/07_context-as-variables/context-as-variables-research.md:50,136` | 「context is a variable」谱系(CoALA → RLM),把它接到 Dash 的 iPython 统一界面维度 |
|
|
54
|
-
| `base/40_Services/11_prime-agent-webui/packages/coding-agent/docs/rlm.md` | prime-agent 官方 RLM 文档(工程实现侧) |
|
|
55
|
-
|
|
56
|
-
> Energy-Intel 侧唯一可用的桥:其 `index.md` 的「跨空间链接」把 `../agent-harness/` 标为「皮层(应用层)」——**RLM 引用就在那一层**。
|
|
57
|
-
|
|
58
|
-
### 1.2 dashr 的 RLM 血统与今天的现状
|
|
59
|
-
|
|
60
|
-
dashr **本来就是** RLM 插件,只是改了名、拆了骨架:
|
|
61
|
-
|
|
62
|
-
| 时期 | 形态 | 证据 |
|
|
63
|
-
|---|---|---|
|
|
64
|
-
| v0.1.x | npm `dsh-rlm-mode`,定位「RLM Plugin for `dsh`」,产品名就叫 RLM | `docs/50_test-reports/v0.1.8-实测报告.md:38`;`docs/00_adr/0001-bridge-tool-layer-not-service-layer.md:3` |
|
|
65
|
-
| v0.1.8 | `rlm` / `agent_list` / `rlm_workflow` / `rlm_ralph` 桥接族**整体删除**,递归改走 `tool.subagent` / `tool.subagent_fork` 直连 | `docs/50_test-reports/v0.1.8-improved-实测报告.md:29,85` |
|
|
66
|
-
| 今天 | `CONTEXT.md` 把 **RLM 明确列为 retired product name**("Delegation … _Avoid_: RLM (Recursive Language Model) — the retired v0.1.x product name"),保留的是 `eval` + `tool.subagent` + 后来的 `ctx://` | `CONTEXT.md`(root,DASHR 语言表) |
|
|
67
|
-
|
|
68
|
-
也就是说:**RLM 这个「产品名」被退役了,但 RLM 那套「上下文即环境 + 递归自调用」的机制诉求一件都没消失**,只是散成了三条独立的腿。本草案的工作就是把这三条腿重新点清楚,补齐缺的那条。
|
|
69
|
-
|
|
70
|
-
### 1.3 RLM 论文的可执行结论(→ 设计约束)
|
|
71
|
-
|
|
72
|
-
论文 §RESULTS / §LIMITATIONS / Appendix A「negative results」里能直接翻成工程约束的条目:
|
|
73
|
-
|
|
74
|
-
| 论文结论 | 对本设计的约束 |
|
|
75
|
-
|---|---|
|
|
76
|
-
| **Obs.1** 10M+ token 规模可用;相对 base LM 最高 2× 提升,成本同量级或更低 | 目标不是「更好的长上下文」,是「**越窗**处理」。dsh 侧 = 资源在 URL 里,不在 prompt 里 |
|
|
77
|
-
| **Obs.2** REPL 是长输入的**必要**条件;**递归 sub-call 在信息密集任务上额外 +10%–59%** | 两条腿都要有:`eval`(已有)+ 递归子调用(**本草案**)。ablation 说明:只有 REPL 无 sub-call 也能越窗,但信息密集任务退化成关键词启发式 |
|
|
78
|
-
| **Obs.3** 小输入区间 base LM 反而更好(存在**交叉点**) | 工具描述必须写明「短上下文别用」——否则是纯增本。dsh 的 wire description 是单源(`eval-description.md` 先例),可以承载这条纪律 |
|
|
79
|
-
| **Obs.4** 成本方差大、长尾尖(中位数比 base 便宜,离群值显著更贵) | **硬上限**必须是参数:`maxChunks` / `maxSubcalls` / 输出 token 上限。不能靠 prompt 里写「别调太多」 |
|
|
80
|
-
| **Obs.5** 模型无关,但不同模型的上下文管理策略差异巨大 | 默认参数要保守;行为差异写进测试而非 prompt |
|
|
81
|
-
| **Limitation** 同步 sub-call 慢;最大递归深度取 **1** | 并发化 map 扇出;默认 `depth = 1`(sub-call 是 LM,不是 RLM) |
|
|
82
|
-
| **Limitation** 未训练模型是低效的上下文决策者 | 把「分块/扇出/归约」这套低效决策**从模型手里拿走**,封进工具实现 |
|
|
83
|
-
| **Neg.** `FINAL()` / `FINAL VAR()` 标签区分「思考」vs「终答」很脆(模型会把计划当答案交出去) | **dsh 的结构化工具返回天然解决这条**——`ToolDefinition.output.schema` 是类型化的,不需要字符串哨兵。这是 dsh 相对论文原型的真实优势,值得在草案里明确 |
|
|
84
|
-
| **Neg.** 同一 system prompt 跨模型会致灾;Qwen3-Coder 对基础任务发**上千次** sub-call | 印证 Obs.4:硬上限是刚需,不是优化 |
|
|
85
|
-
| **Neg.** 无充分编码能力的模型做不好 RLM;thinking 模型会耗尽输出 token | `monolog()` 把循环收进实现 → **降低能力门槛**(模型不再需要自己写对循环),这是相对论文原型的正向差异 |
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## 2. 缺口分析:RLM 原语 → dashr 现状
|
|
90
|
-
|
|
91
|
-
论文的 RLM 原语 vs 本仓今天的可用面:
|
|
92
|
-
|
|
93
|
-
| RLM 原语 | dashr 今天 | 缺口 |
|
|
94
|
-
|---|---|---|
|
|
95
|
-
| `P` 放进环境,不放进神经网络 | `ctx://session/...`(含被 compaction shadow 的原文)+ 持久 kernel 变量 | ✅ 读腿齐备 |
|
|
96
|
-
| 写代码 peek / decompose / inspect | `eval`(持久 IPython,`tool.*` 桥接) | ✅ |
|
|
97
|
-
| 观察执行副作用(stdout 回流) | kernel 的 stdout 投影 | ✅ |
|
|
98
|
-
| **`llm_query()`:对环境中一个片段调自己** | `llm_completion({prompt})`(`src/llm-completion.ts:62`) | ❌ **只吃 `prompt` 字面量**——调用者必须**先**把内容搬进自己的上下文,正好抵消越窗收益。走 `subagent` 则是**重**方案:新 session、进 roster、带 tools/memory、生命周期可见 |
|
|
99
|
-
| map 扇出 + reduce 归约 | 模型手写 Python 循环(`eval` 里 `asyncio.gather`) | ⚠️ 可行但**每次都要写对**,且无成本/并发护栏 |
|
|
100
|
-
| 根 LM / 子 LM 分层路由 | `llm_completion` 固定路由到**调用者自己的** provider/model | ⚠️ 无便宜子档(本仓是刻意为之:judge call 只在同级才有意义) |
|
|
101
|
-
| 深递归 | `subagent` 有 `maxDepth`(native 默认 3) | ⚠️ 但那是**新 agent**,不是 self-call |
|
|
102
|
-
| **自指:我现在还剩多少上下文 / 我实际有哪些工具** | **无地址**。`ctx://` 是**历史日志**,`dsh://config` 是**全局 resolved config**,`agent://` 是**roster / 别的 agent** | ❌ 见 §2.1 |
|
|
103
|
-
|
|
104
|
-
### 2.1 `self://` 缺口的具体证据
|
|
105
|
-
|
|
106
|
-
`self://surface`(本 agent **实际生效**的工具面)不是锦上添花,它对应一个**已实测发生的漂移事故**:
|
|
107
|
-
|
|
108
|
-
> 持久会话热升级插件后,本会话 system prompt 的 Tool Catalog **仍在声明 `rlm` / `agent_list` / `rlm_workflow` / `rlm_ralph` 可用**,而实测运行时已经 `unknown binding`。
|
|
109
|
-
> —— `docs/50_test-reports/v0.1.8-improved-实测报告.md:134`
|
|
110
|
-
|
|
111
|
-
即:**agent 对自己工具面的信念可以显著偏离运行时真相**,而当时没有任何 SSoT 地址可查。`self://surface` 读 `agent.ctx.tools.schemas(agent)` 的**可见投影**(这正是 wire mask 之后、catalog 渲染所读的同一份真值,见 `src/index.ts` 的 wireMask 段),就能给出 ground truth。
|
|
112
|
-
|
|
113
|
-
同理,`self://budget`(是否逼近 compaction 压力)是 §1.3 Obs.3「何时该递归、何时别用」的**决策输入**——没有它,`monolog()` 的纪律只能靠模型自觉。
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## 3. 命名裁决
|
|
118
|
-
|
|
119
|
-
候选与评估:
|
|
120
|
-
|
|
121
|
-
| 候选 | 形态 | 语义契合 | 命名冲突 | 裁决 |
|
|
122
|
-
|---|---|---|---|---|
|
|
123
|
-
| `self://` | scheme(只读) | ✅ 自指状态面,与 `agent://`/`ctx://`/`dsh://`/`dvc://` 同属短名词寄存器 | 与 `ctx://` 易混(见下) | **✅ 采用**(明确划界:`ctx://` = 记录,`self://` = 运行时) |
|
|
124
|
-
| `monolog://` | scheme | ❌ 「自言自语」是**动作**不是**资源**;做成 scheme 会诱导出 `monolog://...` 这种既非纯读也非 dvc 写执行的第四种形态 | — | ❌ 否决 |
|
|
125
|
-
| `self` (tool) | 工具 | ⚠️ | 🔴 **Python kernel 命名空间冲突**:dashr 主交互面是 Python cell,`self` 是实例方法约定名 | ❌ 否决 |
|
|
126
|
-
| `monolog` (tool) | 工具 | ✅ 恰好命名「对自己说话」这一次**计算** | 全仓 grep 零命中(唯二命中是 `upstream/oh-my-pi` 测试里的 "internal monologue" 注释) | **✅ 采用** |
|
|
127
|
-
| 沿用 `llm_completion` 扩展 | 工具加参 | ✅ 改动最小 | — | **✅ Phase 0 采用**(见 §4.0) |
|
|
128
|
-
|
|
129
|
-
### 3.1 为什么 `self://` 与 `ctx://` 不重复
|
|
130
|
-
|
|
131
|
-
| | `ctx://` | `self://` |
|
|
132
|
-
|---|---|---|
|
|
133
|
-
| 读的是什么 | 已经**落盘**的 session 事件日志(历史) | **活**运行时状态(当下) |
|
|
134
|
-
| 数据来源 | `sessionPersistence.open(id,'read')` | `exec.agent` 的内存态 + `agent.ctx.tools.schemas(agent)` + gates/policy |
|
|
135
|
-
| 时间箭头 | 过去 | 现在 |
|
|
136
|
-
| 典型问句 | 「三小时前被压缩掉的那段原文是什么?」 | 「我现在实际有哪些工具?我离 compaction 还有多远?我是谁派来的?」 |
|
|
137
|
-
| 可写性 | 只读 | 只读(**必须**;写入通道继续只留给 `dvc://`) |
|
|
138
|
-
|
|
139
|
-
### 3.2 为什么 `self()` 是硬伤而不是洁癖
|
|
140
|
-
|
|
141
|
-
dashr 的 kernel 绑定历史就是教训:v0.1.5 以前工具是 **flat globals**,v0.1.8 才收敛到统一 `tool.*` 命名空间(`docs/50_test-reports/v0.1.8-实测报告.md:174`:`rlm(...)` 裸调用 → `NameError`,因为已不是裸全局)。`self` 作为裸标识符在 Python cell 里的语义负荷比 `rlm` 重得多——`self` 是**每个方法体的第一个参数**。任何「把 `self` 变成可调用对象」的设计,都会让读 cell 的人和写 cell 的模型同时误判作用域。`tool.monolog(...)` / `monolog(...)` 无此问题。
|
|
142
|
-
|
|
143
|
-
> 若将来要做裸全局绑定,注册名只能是 `monolog`,**不能**是 `self`。
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
## 4. 设计提案
|
|
148
|
-
|
|
149
|
-
### 4.0 Phase 0(最小切片):`llm_completion` 增 `source`
|
|
150
|
-
|
|
151
|
-
**动机**:先验证「越窗读 + 处理」这条链本身,不引入新概念。
|
|
152
|
-
|
|
153
|
-
```
|
|
154
|
-
llm_completion({
|
|
155
|
-
prompt?: string, // 既有:字面量 prompt
|
|
156
|
-
source?: string, // 新增:scheme:// URL 或普通路径
|
|
157
|
-
system?: string,
|
|
158
|
-
maxTokens?: number,
|
|
159
|
-
})
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
语义:
|
|
163
|
-
- 二者**恰有其一**(都缺 → 结构化 error;都给 → 结构化 error,不做隐式拼接)。
|
|
164
|
-
- `source` 走既有的 `UrlResolver`(`src/url-schemes/resolver.ts`),与 `read` tool 的 scheme branch **同一条解析路径**——六个 scheme 全部可用,零新解析器。
|
|
165
|
-
- `source` 解引用的文本作为 payload;`prompt` 若同时作为**指令**则被禁止(避免「指令/数据」边界含糊)。
|
|
166
|
-
- 默认 `maxSourceChars` 硬上限(建议 256 KiB,超出结构化报错并提示用 `:N-M` 分页)——**防止一次调用把巨型资源拉爆上下文**(Obs.4 长尾)。
|
|
167
|
-
|
|
168
|
-
价值:`llm_completion({ source: 'ctx://session/compactions[221217]:raw', prompt: '提取时间线' })` —— 一行拿到「被压缩掉的原文」的摘要,**原文一秒都没进调用方上下文**。这就是论文的核心动作,且不新增任何 scheme/工具名。
|
|
169
|
-
|
|
170
|
-
### 4.1 `self://` — 只读自指状态面(scheme)
|
|
171
|
-
|
|
172
|
-
**唯一形态**:`self://<face>[:selector]`,只读;注册点与 `ctx://` 并列(`src/url-schemes/index.ts:287` 一带,`resolver.register('self', createSelfHandler({...}))`);`selectorAware: true` 走 `ctx://` 同一套 canonical/prepared + `:raw`/`:N-M` 契约。
|
|
173
|
-
|
|
174
|
-
**faces(建议集)**:
|
|
175
|
-
|
|
176
|
-
| URL | prepared 面(bare) | canonical 面(`:raw`) |
|
|
177
|
-
|---|---|---|
|
|
178
|
-
| `self://` | roster(一行一个 face + 用途) | 同左 |
|
|
179
|
-
| `self://identity` | 信息卡:agent id、status、origin、delegationDepth、agentPreset、cwd、provider/model/maxTokens | 同左(JSON) |
|
|
180
|
-
| `self://surface` | **生效工具面**:name + 一行 description,来自 `agent.ctx.tools.schemas(agent)`(wire mask 后的可见投影) | 完整 schema JSON |
|
|
181
|
-
| `self://lineage` | 委派链:自己 → 父 → 祖,每级 id/status/preset | 同左(JSON) |
|
|
182
|
-
| `self://policy` | 生效策略:sandbox mode、approval policy、url-schemes/hashline gates | 同左(JSON) |
|
|
183
|
-
| `self://budget` | 上下文压力:已用 token / 距 compaction 阈值 / 本 turn-step 计数 | 同左(JSON) |
|
|
184
|
-
|
|
185
|
-
**硬约束**:
|
|
186
|
-
- **只读**:任何 write → 结构化 `URL_READ_ONLY`(与 `ctx://` 同款契约,`docs/specs/ctx/spec.md` 已有先例)。
|
|
187
|
-
- **不泄密**:`self://policy` 必须复用 `dsh://config` 的脱敏管线(`docs/specs/dsh/spec.md` 的 secret 剥离要求),schema `role('secret')` + 键名 denylist 递归施加。
|
|
188
|
-
- **不做新真值源**:所有 face 必须从**既有**服务读,不得另建缓存/影子状态,否则又造一个会漂移的副本(正是 §2.1 事故的成因)。
|
|
189
|
-
- **`self://budget` 可行性待勘**:host 的公开 `Agent` 类型极薄(`upstream/deepseek-harness/packages/core/agent/src/types.ts:13` 只有 `{id}`);turn/step 边界可用 `TurnBoundaryProjection`,但**token 用量是否已持久化成事件未证实**。→ 标为**开放问题**(§8 Q3),实现前必须先勘。若不可得,`self://budget` 退化为「turn/step + 事件计数」的粗略代理,并如实标注。
|
|
190
|
-
|
|
191
|
-
### 4.2 `monolog()` — 对可寻址源做递归自发调用(tool)
|
|
192
|
-
|
|
193
|
-
**一句话**:把 RLM 论文的 `llm_query()` 循环封成一个类型化工具调用,输入是**地址**不是文本。
|
|
194
|
-
|
|
195
|
-
```
|
|
196
|
-
monolog({
|
|
197
|
-
source: string, // scheme:// URL 或路径(复用 UrlResolver)
|
|
198
|
-
question: string, // 对这段内容要问什么
|
|
199
|
-
chunk?: { by: 'lines'|'bytes'|'regex', size: number, pattern?: string },
|
|
200
|
-
fanout?: { concurrency: number },// 默认 4;Obs."同步 sub-call 慢" 的直接对策
|
|
201
|
-
reduce?: 'concat' | 'synthesize',
|
|
202
|
-
maxChunks?: number, // 默认 16;Obs.4 硬上限
|
|
203
|
-
maxDepth?: number, // 默认 1(论文 setting)
|
|
204
|
-
maxTokens?: number, // 单次子调用输出上限,默认 1024
|
|
205
|
-
})
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
执行语义(map-reduce):
|
|
209
|
-
|
|
210
|
-
```
|
|
211
|
-
source ──UrlResolver──▶ 全文(不进调用方上下文)
|
|
212
|
-
│
|
|
213
|
-
├─ 无 chunk:单次 sub-call(question, text) ─────────────▶ 结果文本
|
|
214
|
-
│
|
|
215
|
-
└─ 有 chunk:切片 → bounded-concurrency map:
|
|
216
|
-
sub-call(question, slice_i) → partial_i
|
|
217
|
-
→ reduce: 'concat' = 逐段拼接(保序,带 provenance)
|
|
218
|
-
'synthesize'= 再一次 sub-call 归约(消耗 1 次预算)
|
|
219
|
-
▲
|
|
220
|
-
子调用 = 与调用者同 provider/model 的一次 bare LLM call(复用 llm-completion 的
|
|
221
|
-
`ctx.llm.stream` 路径与 finish-reason 处理)
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
与 RLM 论文的逐条对应:
|
|
225
|
-
|
|
226
|
-
| 论文设定 | 本设计的落地 |
|
|
227
|
-
|---|---|
|
|
228
|
-
| prompt 在环境里 | `source` 通过 URL 解引用,**从不进调用方上下文**(只回最终 digest) |
|
|
229
|
-
| 递归 sub-call | `ctx.llm.stream` 的 bare call,`maxDepth` 默认 1 |
|
|
230
|
-
| 同步慢 | `fanout.concurrency` 并发扇出 |
|
|
231
|
-
| 上千次 sub-call 失控 | `maxChunks` / `maxSubcalls`(=maxChunks + reduce) 硬上限,**不是 prompt 劝告** |
|
|
232
|
-
| `FINAL()` / `FINAL VAR()` 脆 | 不存在:返回是 `ToolDefinition.output.schema`,类型化 `{ digest, chunks, subcalls, costHint }` 或 `{ error }` |
|
|
233
|
-
| 无编码能力的模型做不了 | 模型不再需要写循环 |
|
|
234
|
-
| 小输入反而更差 | wire description 明写「短上下文请直接用 `read`/`llm_completion`」 |
|
|
235
|
-
|
|
236
|
-
**返回信封(建议)**:不只回文本,回**带 provenance 的结构**——
|
|
237
|
-
`{ digest, source, chunks: n, subcalls: n, truncated: bool, partials?: [{range, text}] }`。
|
|
238
|
-
理由:论文的失败轨迹里反复出现「模型建好了答案却把中间结果丢了 / 反复重做」(Appendix B 的 Qwen3-Coder 例)。provenance 让后续步骤可以**引用**而非**重算**。
|
|
239
|
-
|
|
240
|
-
**失败模式**(全部结构化,不抛异常——沿用 `llm_completion` 的契约):
|
|
241
|
-
`no-route`(调用者无 provider/model)、`source-unresolvable`、`source-too-large`、`chunk-plan-empty`、`budget-exceeded`、`subcall-failed`。
|
|
242
|
-
|
|
243
|
-
### 4.3 两者的耦合 = RLM 回路闭合
|
|
244
|
-
|
|
245
|
-
```
|
|
246
|
-
┌────────────────────────────────────────────────────────────┐
|
|
247
|
-
│ root LM(调用方,上下文有限) │
|
|
248
|
-
└───────┬─────────────────────────────────▲──────────────────┘
|
|
249
|
-
│ ①读 self://budget / self://surface│ ⑤只拿到 digest
|
|
250
|
-
│ (我该不该递归?我有什么工具?) │ (原文 never enters)
|
|
251
|
-
▼ │
|
|
252
|
-
┌───────────────────┐ ②source(URL) ┌───┴──────────────┐
|
|
253
|
-
│ monolog() 工具 │ ───────────────▶│ UrlResolver │
|
|
254
|
-
│ map/reduce/上限 │ │ (ctx:// agent:// │
|
|
255
|
-
└─────────┬─────────┘ │ skill:// dsh:// │
|
|
256
|
-
│ ③bare sub-call │ dvc:// http://) │
|
|
257
|
-
▼ └──────────────────┘
|
|
258
|
-
ctx.llm.stream(同 provider/model,depth 1)
|
|
259
|
-
│ ④partials
|
|
260
|
-
└──────────▶ reduce ──▶ digest
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
`self://` 提供**决策输入**(该不该递归、还能容多少),`monolog()` 执行**递归动作**。缺 `self://`,纪律只能靠模型自觉;缺 `monolog()`,`self://` 只是一堆好看的只读 JSON。
|
|
264
|
-
|
|
265
|
-
### 4.4 与既表面的边界(正交性)
|
|
266
|
-
|
|
267
|
-
| 面 | 成本 | 生命周期 | 上下文代价 | 何时用 |
|
|
268
|
-
|---|---|---|---|---|
|
|
269
|
-
| `read <scheme>://` | 极低 | — | **全额进上下文** | 要看内容 |
|
|
270
|
-
| `llm_completion({prompt})` | 低 | 无 | prompt 字面量进上下文 | 手头文本的 judge/extract |
|
|
271
|
-
| **`llm_completion({source})`**(Phase 0) | 低 | 无 | **只进结果** | 单次越窗提取 |
|
|
272
|
-
| **`monolog()`**(Phase 1) | 中(成本方差大) | 无 session、不进 roster | 只进 digest | 信息密集的越窗 map-reduce |
|
|
273
|
-
| `subagent` / `subagent_fork` | 高 | **新 session + roster + 生命周期** | 独立上下文 | 需要独立能力集/长任务的委派 |
|
|
274
|
-
| `workflow` / `ralph` | 最高 | 多 agent | — | 多 agent 编排 |
|
|
275
|
-
| `eval` | 低 | 持久 kernel | 代码+stdout | 符号化操作(可组合上面任意一个) |
|
|
276
|
-
|
|
277
|
-
**关键区分**:`monolog()` 是「**自己**在自己进程内、不留痕地问自己一遍」;`subagent` 是「**开一个新 agent**」。前者不进 roster、不产生会话事件(除一条 `tool/call`+`tool/result`),后者全部相反。dashr 今天**只有重的那一档**。
|
|
278
|
-
|
|
279
|
-
---
|
|
280
|
-
|
|
281
|
-
## 5. 备选方案评估(为什么不直接把 `llm_completion` 长成全部)
|
|
282
|
-
|
|
283
|
-
| 方案 | 改动面 | 优点 | 缺点 | 裁决 |
|
|
284
|
-
|---|---|---|---|---|
|
|
285
|
-
| **A. 只扩展 `llm_completion({source})`** | 最小(1 文件 + 参数) | 无新名、无新 scheme;立刻拿到越窗单次调用 | 无 map/reduce,信息密集任务要模型自己写循环 → 回到 Obs.4 的风险 | **Phase 0 采纳** |
|
|
286
|
-
| **B. 独立 `monolog()` 工具** | 中(新工具 + 复用 resolver/llm) | 语义聚焦;上限/并发/深度都是一等参数;wire description 可独立写纪律 | 与 `llm_completion` 语义有重叠 → 需在 description 里划清(§4.4 表) | **Phase 1 采纳** |
|
|
287
|
-
| **C. 只做 `self://`,递归仍走 eval 手写** | 小 | 不碰 LLM 调用面 | 纪律与护栏全靠模型自觉;Qwen3-Coder 式失控无解 | ❌ 否决为终态,可作并行 Phase 2 |
|
|
288
|
-
| **D. 复活 v0.1.8 删掉的 `rlm()` 桥** | 大 | 历史资产 | 与「RT 退役决定」正面冲突、与 `subagent` 语义打架;且当年是**委派**语义,不是 self-call | ❌ 否决 |
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
## 6. 风险与红线
|
|
293
|
-
|
|
294
|
-
| 风险 | 说明 | 对策 |
|
|
295
|
-
|---|---|---|
|
|
296
|
-
| **成本失控** | Obs.4:中位数便宜但长尾尖;Obs.5 + Neg.:某些模型对基础任务发上千次 sub-call | `maxChunks` / `maxSubcalls` / `maxTokens` / `maxSourceChars` 全部**硬上限**,默认保守;错误里回显用量 |
|
|
297
|
-
| **上下文遮蔽** | 「没进上下文」是优点也是缺点:模型无法目视验证 digest 的ground truth | 返回带 `partials[].range` provenance;`:N-M` 可复核(`ctx://` 的 `:raw:N-M ≡ :N-M` 契约先例) |
|
|
298
|
-
| **`self://` 泄密** | 策略/配置面可能含凭据 | 复用 `dsh://config` 的脱敏管线(`docs/specs/dsh/spec.md`) |
|
|
299
|
-
| **`self://` 造第二真值源** | 任何缓存/镜像都会重演 §2.1 漂移事故 | 强制「直读既有服务,零缓存」 |
|
|
300
|
-
| **只读被绕过** | 新 scheme 是写攻击面 | 沿用 catalog 的不变式:**只有 `dvc://` 可写**;`self://` write → `URL_READ_ONLY` |
|
|
301
|
-
| **命名混淆** | `self://` vs `ctx://`;`monolog` vs `monologue` | catalog 的 `purpose` 一句话必须写死边界(「record」vs「runtime」) |
|
|
302
|
-
| **`self://budget` 数据不可得** | 公开 `Agent` 类型只暴露 `{id}` | 先勘(§8 Q3);不可得就降级并如实标注,不伪造精度 |
|
|
303
|
-
|
|
304
|
-
**流程红线**(AGENTS §〇,逐条适用):本改动触及「运行时工具面」,验收必须是 **4999 第一人称实测**(真实会话里跑通 `self://surface` + `monolog` 越窗 map-reduce),落 `docs/50_test-reports/`,**user 明确确认后**才 `npm publish`。单测绿 / tsc 0 / boot graph 在位**不是**验收。
|
|
305
|
-
|
|
306
|
-
---
|
|
307
|
-
|
|
308
|
-
## 7. 分期与验收
|
|
309
|
-
|
|
310
|
-
| Phase | 内容 | 验收证据(须可复现) |
|
|
311
|
-
|---|---|---|
|
|
312
|
-
| **0** | `llm_completion` 增 `source`(+ `maxSourceChars`);六个 scheme 全部可当 source | 单测:scheme 解引用复用、互斥校验、超限结构化错误;4999 实测:`source: 'ctx://session/compactions[<label>]:raw'` 拿到摘要且**原文未进上下文**(以 transcript 事件长度佐证) |
|
|
313
|
-
| **1** | `monolog()`:chunk 规划 + 并发 map + reduce + 硬上限 + provenance 信封 | 单测:chunk 三种 by、并发上限、`maxChunks`/`maxSubcalls` 触发、depth=1、部分失败降级;4999 实测:一个 > 上下文窗的资源(如 `dsh://docs` 全量或长 `ctx://` 原文)map-reduce 出 digest |
|
|
314
|
-
| **2** | `self://`(identity / surface / lineage / policy;budget 视勘误) | 单测:roster、face 结构、只读拒绝、脱敏;4999 实测:§2.1 漂移场景下 `self://surface` 报出**运行时真值**而非 catalog 文本 |
|
|
315
|
-
| **横切** | catalog + `url-schemes-instruction.md` + wire description 单源更新(`SCHEME_CATALOGUE` 是唯一真值源,`src/url-schemes/catalog.ts:56`) | 单源渲染测试:新增 scheme 自动出现在 system prompt 表 + error message 列表 |
|
|
316
|
-
|
|
317
|
-
> 顺序建议:**0 → 2 → 1**。`self://` 比 `monolog()` 便宜且立刻能验证 §2.1 那个已发生的 bug;`monolog()` 是重头戏,放在有了决策输入之后更稳。
|
|
318
|
-
|
|
319
|
-
---
|
|
320
|
-
|
|
321
|
-
## 8. 开放问题(需 user 裁决)
|
|
322
|
-
|
|
323
|
-
| # | 问题 | 选项 |
|
|
324
|
-
|---|---|---|
|
|
325
|
-
| **Q1** | 命名终局 | (a) `self://` + `monolog()`【本草案推荐】 (b) `self://` + `self_call()` (c) 只 `llm_completion` 扩展到底,不做新工具 |
|
|
326
|
-
| **Q2** | `monolog()` 是否独立成工具,还是 `llm_completion` 的一个 `mode` | 独立(语义清晰、description 可写纪律) vs 合并(无重叠名、工具表更短) |
|
|
327
|
-
| **Q3** | `self://budget` 的 token 用量从哪来 | (a) session log 里已有 usage 事件(**待勘**) (b) 需要 host 新服务 (c) 降级为 turn/step + 事件计数代理 |
|
|
328
|
-
| **Q4** | `self://` 是否应该包含**可写**的 agent 自有 scratchpad(跨 compaction 备忘) | 本草案**否**(写入通道只留 `dvc://`,且 Corti memory 已覆盖持久记忆);若 user 要,需单独立项 |
|
|
329
|
-
| **Q5** | `fanout.concurrency` 默认值 4 是否合适 | 取决于上游 LLM adapter 的限流;需实测 |
|
|
330
|
-
| **Q6** | `monolog()` 的子调用是否需要独立 model 档(便宜模型做 map) | 本仓 `llm_completion` 刻意锁同级(`src/llm-completion.ts` 注释:judge call 只在同级才有意义)。放开会破坏该决策,需 user 明确 |
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
|
-
## 附录 A:证据锚点
|
|
335
|
-
|
|
336
|
-
| 事实 | 锚点 |
|
|
337
|
-
|---|---|
|
|
338
|
-
| RLM 论文全文(含 authors / abstract / results / negative results) | `~/.hermes/cache/web/arxiv.org-f7ccb39fbc.md`(455 行,2026-08-15 直读缓存) |
|
|
339
|
-
| RLM 作者归属裁决 | `agent-harness/21_CLI-Agent/04_prime-agent/03_prime-agent-rlm-analysis.md:136` |
|
|
340
|
-
| 论文核心断言的落地解读 | 同上 `:84` |
|
|
341
|
-
| RLM 开源实现横向对照(6 个) | `agent-harness/21_CLI-Agent/01_hermes/rlm-plugin-research.md:25,89` |
|
|
342
|
-
| 「context as variable」谱系 | `agent-harness/15_Memory/07_context-as-variables/context-as-variables-research.md:28,50,136` |
|
|
343
|
-
| Energy-Intel 与 agent-harness 的交叉链接 | `Energy-Intel/index.md`(「跨空间链接」段) |
|
|
344
|
-
| RLM 产品名退役 | `dashr/CONTEXT.md`(DASHR 语言表 Delegation 条) |
|
|
345
|
-
| `rlm` 桥接族删除 | `docs/50_test-reports/v0.1.8-improved-实测报告.md:29,85` |
|
|
346
|
-
| flat-global → `tool.*` 迁移 | `docs/50_test-reports/v0.1.8-实测报告.md:174` |
|
|
347
|
-
| **Tool Catalog 漂移事故** | `docs/50_test-reports/v0.1.8-improved-实测报告.md:134` |
|
|
348
|
-
| `llm_completion` 工具定义 | `dashr/src/llm-completion.ts:62`(注册于 `dashr/src/index.ts:1144`) |
|
|
349
|
-
| `llm_completion` 输出上限 | `dashr/src/llm-completion.ts:41`(`MAX_COMPLETION_TOKENS = 4096`) |
|
|
350
|
-
| scheme 单源目录 | `dashr/src/url-schemes/catalog.ts:56`(`SCHEME_CATALOGUE`) |
|
|
351
|
-
| `ctx://` 注册点 | `dashr/src/url-schemes/index.ts:287` |
|
|
352
|
-
| `dvc://` 注册点 / 唯一可写 | `dashr/src/url-schemes/index.ts:284`;`catalog.ts` 的 `write: 'json-args'` |
|
|
353
|
-
| resolver 契约(含 `selectorAware`) | `dashr/src/url-schemes/resolver.ts` |
|
|
354
|
-
| `ctx://` 只读 + canonical/prepared 契约 | `docs/specs/ctx/spec.md` |
|
|
355
|
-
| `dsh://config` 脱敏契约 | `docs/specs/dsh/spec.md`(「Config never leaks secrets」) |
|
|
356
|
-
| 上游 `Agent` 公开类型极薄 | `upstream/deepseek-harness/packages/core/agent/src/types.ts:13`(`interface Agent { readonly id: SessionId }`) |
|
|
357
|
-
| scheme 系统提示段单源加载 | `dashr/src/url-schemes/general-section.ts` + `dashr/url-schemes-instruction.md` |
|