dsh-plugin-prompt-tool 0.4.2 → 0.6.0

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.
Files changed (191) hide show
  1. package/README.md +131 -222
  2. package/engine/anchor-match.mjs +117 -0
  3. package/engine/compaction-epoch.mjs +139 -0
  4. package/engine/compositions/library/bootstrap-filesystem.yml +19 -0
  5. package/engine/compositions/library/compaction.yml +52 -0
  6. package/engine/compositions/library/context-gate.yml +40 -0
  7. package/engine/compositions/library/custom-bash.yml +14 -0
  8. package/engine/compositions/library/delegation.yml +85 -0
  9. package/engine/compositions/library/official-agent-instructions.yml +17 -0
  10. package/engine/compositions/library/official-persistent-shell.yml +56 -0
  11. package/engine/compositions/library/official-skill-filesystem-cordis.yml +10 -0
  12. package/engine/compositions/library/official-tool-bash.yml +6 -0
  13. package/engine/compositions/library/official-tool-cordis.yml +13 -0
  14. package/engine/compositions/library/official-tool-presentation.yml +7 -0
  15. package/engine/compositions/library/official-tool-skill.yml +14 -0
  16. package/engine/compositions/library/persistent-shell.yml +36 -0
  17. package/engine/compositions/library/persona.yml +9 -0
  18. package/engine/compositions/library/planning.yml +41 -0
  19. package/engine/compositions/library/prompt-config-engine.yml +16 -0
  20. package/engine/compositions/library/run-code-env.yml +15 -0
  21. package/engine/compositions/library/skill-filesystem.yml +13 -0
  22. package/engine/compositions/library/skill-search.yml +14 -0
  23. package/engine/compositions/library/str-replace-editor.yml +10 -0
  24. package/engine/compositions/library/tool-ask-user.yml +8 -0
  25. package/engine/compositions/library/tool-bash.yml +16 -0
  26. package/engine/compositions/library/tool-bootstrap.yml +16 -0
  27. package/engine/compositions/library/tool-filter.yml +12 -0
  28. package/engine/compositions/library/tool-fs-search.yml +18 -0
  29. package/engine/compositions/library/tool-fs.yml +10 -0
  30. package/engine/compositions/library/tool-goal.yml +19 -0
  31. package/engine/compositions/library/tool-jobs.yml +23 -0
  32. package/engine/compositions/library/tool-pwsh.yml +12 -0
  33. package/engine/compositions/library/tool-todo.yml +11 -0
  34. package/engine/compositions/library/tool-web.yml +9 -0
  35. package/engine/compositions/source/local/context-gate.yml +37 -0
  36. package/engine/compositions/source/local/custom-bash.yml +11 -0
  37. package/engine/compositions/source/local/prompt-config-engine.yml +13 -0
  38. package/engine/compositions/source/local/run-code-env.yml +12 -0
  39. package/engine/compositions/source/local/skill-search.yml +11 -0
  40. package/engine/compositions/source/local/tool-bootstrap.yml +13 -0
  41. package/engine/context-gate.mjs +305 -0
  42. package/{preset → engine}/custom-bash.mjs +243 -243
  43. package/engine/executor.mjs +278 -0
  44. package/engine/fillers.mjs +273 -0
  45. package/engine/interpolate.mjs +66 -0
  46. package/engine/layers.mjs +224 -0
  47. package/engine/prompt-config-engine.mjs +49 -0
  48. package/engine/run-code-env.mjs +208 -0
  49. package/engine/schema.mjs +312 -0
  50. package/engine/session-vars.mjs +52 -0
  51. package/{preset → engine}/shared.mjs +35 -0
  52. package/engine/strategies.mjs +213 -0
  53. package/{preset → engine}/tool-bootstrap.mjs +350 -282
  54. package/engine/tool-filter.mjs +80 -0
  55. package/engine/vendor/yaml/LICENSE +13 -0
  56. package/engine/vendor/yaml/dist/compose/compose-collection.js +88 -0
  57. package/engine/vendor/yaml/dist/compose/compose-doc.js +43 -0
  58. package/engine/vendor/yaml/dist/compose/compose-node.js +109 -0
  59. package/engine/vendor/yaml/dist/compose/compose-scalar.js +86 -0
  60. package/engine/vendor/yaml/dist/compose/composer.js +219 -0
  61. package/engine/vendor/yaml/dist/compose/resolve-block-map.js +115 -0
  62. package/engine/vendor/yaml/dist/compose/resolve-block-scalar.js +198 -0
  63. package/engine/vendor/yaml/dist/compose/resolve-block-seq.js +49 -0
  64. package/engine/vendor/yaml/dist/compose/resolve-end.js +37 -0
  65. package/engine/vendor/yaml/dist/compose/resolve-flow-collection.js +207 -0
  66. package/engine/vendor/yaml/dist/compose/resolve-flow-scalar.js +225 -0
  67. package/engine/vendor/yaml/dist/compose/resolve-props.js +146 -0
  68. package/engine/vendor/yaml/dist/compose/util-contains-newline.js +34 -0
  69. package/engine/vendor/yaml/dist/compose/util-empty-scalar-position.js +26 -0
  70. package/engine/vendor/yaml/dist/compose/util-flow-indent-check.js +15 -0
  71. package/engine/vendor/yaml/dist/compose/util-map-includes.js +13 -0
  72. package/engine/vendor/yaml/dist/doc/Document.js +335 -0
  73. package/engine/vendor/yaml/dist/doc/anchors.js +71 -0
  74. package/engine/vendor/yaml/dist/doc/applyReviver.js +55 -0
  75. package/engine/vendor/yaml/dist/doc/createNode.js +88 -0
  76. package/engine/vendor/yaml/dist/doc/directives.js +176 -0
  77. package/engine/vendor/yaml/dist/errors.js +57 -0
  78. package/engine/vendor/yaml/dist/index.js +17 -0
  79. package/engine/vendor/yaml/dist/log.js +11 -0
  80. package/engine/vendor/yaml/dist/nodes/Alias.js +116 -0
  81. package/engine/vendor/yaml/dist/nodes/Collection.js +147 -0
  82. package/engine/vendor/yaml/dist/nodes/Node.js +38 -0
  83. package/engine/vendor/yaml/dist/nodes/Pair.js +36 -0
  84. package/engine/vendor/yaml/dist/nodes/Scalar.js +24 -0
  85. package/engine/vendor/yaml/dist/nodes/YAMLMap.js +144 -0
  86. package/engine/vendor/yaml/dist/nodes/YAMLSeq.js +113 -0
  87. package/engine/vendor/yaml/dist/nodes/addPairToJSMap.js +63 -0
  88. package/engine/vendor/yaml/dist/nodes/identity.js +36 -0
  89. package/engine/vendor/yaml/dist/nodes/toJS.js +37 -0
  90. package/engine/vendor/yaml/dist/parse/cst-scalar.js +214 -0
  91. package/engine/vendor/yaml/dist/parse/cst-stringify.js +61 -0
  92. package/engine/vendor/yaml/dist/parse/cst-visit.js +97 -0
  93. package/engine/vendor/yaml/dist/parse/cst.js +98 -0
  94. package/engine/vendor/yaml/dist/parse/lexer.js +721 -0
  95. package/engine/vendor/yaml/dist/parse/line-counter.js +39 -0
  96. package/engine/vendor/yaml/dist/parse/parser.js +975 -0
  97. package/engine/vendor/yaml/dist/public-api.js +102 -0
  98. package/engine/vendor/yaml/dist/schema/Schema.js +37 -0
  99. package/engine/vendor/yaml/dist/schema/common/map.js +17 -0
  100. package/engine/vendor/yaml/dist/schema/common/null.js +15 -0
  101. package/engine/vendor/yaml/dist/schema/common/seq.js +17 -0
  102. package/engine/vendor/yaml/dist/schema/common/string.js +14 -0
  103. package/engine/vendor/yaml/dist/schema/core/bool.js +19 -0
  104. package/engine/vendor/yaml/dist/schema/core/float.js +43 -0
  105. package/engine/vendor/yaml/dist/schema/core/int.js +38 -0
  106. package/engine/vendor/yaml/dist/schema/core/schema.js +23 -0
  107. package/engine/vendor/yaml/dist/schema/json/schema.js +62 -0
  108. package/engine/vendor/yaml/dist/schema/tags.js +96 -0
  109. package/engine/vendor/yaml/dist/schema/yaml-1.1/binary.js +58 -0
  110. package/engine/vendor/yaml/dist/schema/yaml-1.1/bool.js +26 -0
  111. package/engine/vendor/yaml/dist/schema/yaml-1.1/float.js +46 -0
  112. package/engine/vendor/yaml/dist/schema/yaml-1.1/int.js +71 -0
  113. package/engine/vendor/yaml/dist/schema/yaml-1.1/merge.js +67 -0
  114. package/engine/vendor/yaml/dist/schema/yaml-1.1/omap.js +74 -0
  115. package/engine/vendor/yaml/dist/schema/yaml-1.1/pairs.js +78 -0
  116. package/engine/vendor/yaml/dist/schema/yaml-1.1/schema.js +39 -0
  117. package/engine/vendor/yaml/dist/schema/yaml-1.1/set.js +93 -0
  118. package/engine/vendor/yaml/dist/schema/yaml-1.1/timestamp.js +101 -0
  119. package/engine/vendor/yaml/dist/stringify/foldFlowLines.js +146 -0
  120. package/engine/vendor/yaml/dist/stringify/stringify.js +129 -0
  121. package/engine/vendor/yaml/dist/stringify/stringifyCollection.js +153 -0
  122. package/engine/vendor/yaml/dist/stringify/stringifyComment.js +20 -0
  123. package/engine/vendor/yaml/dist/stringify/stringifyDocument.js +85 -0
  124. package/engine/vendor/yaml/dist/stringify/stringifyNumber.js +25 -0
  125. package/engine/vendor/yaml/dist/stringify/stringifyPair.js +150 -0
  126. package/engine/vendor/yaml/dist/stringify/stringifyString.js +336 -0
  127. package/engine/vendor/yaml/dist/util.js +11 -0
  128. package/engine/vendor/yaml/dist/visit.js +233 -0
  129. package/engine/vendor/yaml/index.js +5 -0
  130. package/engine/vendor/yaml/package.json +11 -0
  131. package/lib/client.js +4724 -775
  132. package/lib/client.js.map +1 -1
  133. package/lib/index.d.mts +530 -51
  134. package/lib/index.mjs +4164 -740
  135. package/lib/preset-core.d.mts +7 -37
  136. package/lib/preset-core.mjs +43 -285
  137. package/lib/prompt-configs-B4vH09wx.d.mts +100 -0
  138. package/lib/prompt-configs-ThS4iXPg.mjs +771 -0
  139. package/package.json +36 -29
  140. package/preset/anchored/preset.yml +342 -0
  141. package/preset/creative/preset.yml +65 -0
  142. package/preset/creative/skills/cordis-plugin-development/SKILL.md +420 -0
  143. package/preset/creative/skills/editing-cordis-compositions/SKILL.md +165 -0
  144. package/preset/custom/preset.yml +13 -0
  145. package/preset/liangshen/preset.yml +72 -0
  146. package/preset/minimal/preset.yml +44 -0
  147. package/preset/ptc/preset.yml +56 -0
  148. package/preset/standard/preset.yml +55 -0
  149. package/skills/manifest.json +7 -0
  150. package/skills/sandboxmod/SKILL.md +49 -49
  151. package/skills/web ui/SKILL.md +42 -0
  152. package/templates/10-pre-step.yml +28 -0
  153. package/templates/11-merged-a.yml +11 -0
  154. package/templates/13-anchor.yml +19 -0
  155. package/templates/14-first-turn-anchor.yml +27 -0
  156. package/templates/15-guide-auto.yml +25 -0
  157. package/templates/16-custom-fallback.yml +21 -0
  158. package/templates/17-instruction-hint.yml +23 -0
  159. package/templates/18-placeholder-env-facts.yml +11 -0
  160. package/templates/19-placeholder-skill-catalog.yml +19 -0
  161. package/templates/20-system-section.yml +19 -0
  162. package/templates/30-runtime-context.yml +10 -0
  163. package/templates/31-runtime-context-placeholder.yml +18 -0
  164. package/templates/40-agent-request.yml +11 -0
  165. package/templates/50-llm-stream.yml +9 -0
  166. package/templates/60-tool-pipeline.yml +12 -0
  167. package/AGENTS.md +0 -4
  168. package/plan.md +0 -312
  169. package/preset/agent.cordis.yml +0 -443
  170. package/preset/compaction-epoch.mjs +0 -81
  171. package/preset/context-gate.mjs +0 -165
  172. package/preset/instruction-hint.mjs +0 -217
  173. package/preset/near-anchor.mjs +0 -101
  174. package/preset/preset.yml +0 -3
  175. package/preset/prompt-injector.mjs +0 -112
  176. package/preset/router-first-turn.mjs +0 -73
  177. package/preset/router-guide.mjs +0 -79
  178. package/preset.md +0 -115
  179. package/upstream/dsh-anchored-standard/LICENSE +0 -22
  180. package/upstream/dsh-anchored-standard/NOTICE +0 -19
  181. package/upstream/dsh-anchored-standard/REVISION +0 -1
  182. package/upstream/dsh-anchored-standard/preset/agent.cordis.yml +0 -440
  183. package/upstream/dsh-anchored-standard/preset/compaction-epoch.mjs +0 -81
  184. package/upstream/dsh-anchored-standard/preset/context-gate.mjs +0 -202
  185. package/upstream/dsh-anchored-standard/preset/custom-bash.mjs +0 -219
  186. package/upstream/dsh-anchored-standard/preset/dev-tool-search.mjs +0 -131
  187. package/upstream/dsh-anchored-standard/preset/instruction-hint.mjs +0 -231
  188. package/upstream/dsh-anchored-standard/preset/preset.yml +0 -3
  189. package/upstream/dsh-anchored-standard/preset/skill-search.mjs +0 -142
  190. package/upstream/dsh-anchored-standard/preset/tool-bootstrap.mjs +0 -301
  191. /package/{preset → engine}/skill-search.mjs +0 -0
package/AGENTS.md DELETED
@@ -1,4 +0,0 @@
1
- # 语言行为规范(简体中文)——最高优先级
2
-
3
- 1. 你的思考过程(思维链 / thinking)必须全部使用简体中文。
4
- 2. 你的回答内容必须使用简体中文。
package/plan.md DELETED
@@ -1,312 +0,0 @@
1
- # dsh-plugin-prompt-tool 重新设计计划(v2)
2
- > **v2.19 preset 脚本审查清理(当前实现)**:抽取 `shared.mjs` 公共工具;
3
- > router-first-turn 不再重复清 contexts(交给 context-gate);router-first-turn /
4
- > router-guide / prompt-injector 统一使用 epoch-aware 晋升状态;修正 stale 注释与未用变量。
5
-
6
- > **v2.18 全部预设脚本自有化**:`preset/` 新增 shared / context-gate /
7
- > compaction-epoch / custom-bash / instruction-hint / skill-search / tool-bootstrap 最终快照;
8
- > 公共配置校验、晋升解析、消息工具合并进 `shared.mjs`;运行时不再直读 `upstream/` 任何文件,
9
- > `upstream/` 仅作溯源与 sync 对照。
10
-
11
- > **v2.17 agent.cordis.yml 脱离上游**:新增自有模板 `preset/agent.cordis.yml`;
12
- > 运行时不再直读 `upstream/.../agent.cordis.yml`,动态项仅由 `buildCordis` 注入。
13
-
14
- > **v2.16 使用 PTC 模式开关**:新增 `usePtcMode`(默认开启)。
15
- > 开启=晋升后把 wire 切换为 Code Mode(PTC,单一 run_code),完整插件工具经生成 SDK 调用;
16
- > 关闭=晋升后恢复原生完整工具目录;两种模式都不再依赖 `dev_tool_search`,生成 preset 时直接移除该行且不复制 `dev-tool-search.mjs`。
17
-
18
- > **v2.15 上游同步**:同步上游到 `25f21ae`;移除
19
- > `customBashPath` 生成时改写,直接沿用上游 custom-bash 运行时探测。
20
- > 新增 `bootstrapMaxTokens` 开关(0=关闭;正整数写入上游 tool-bootstrap)。
21
-
22
- > **v2.14 上游同步与路径校对(当前实现)**:已从上游 main 同步到
23
- > `ba7a27c`;新增 context-gate.mjs;custom-bash 的固定路径在生成时归一化为
24
- > `customBashPath`(默认 bash.exe,PATH 查找)。
25
-
26
- > **v2.14 剥离上游子模块(历史)**:上游改为内联快照 `upstream/dsh-anchored-standard/`
27
- > (preset + LICENSE + NOTICE + REVISION),删除 `vendor/` 子模块与 `.gitmodules`;
28
- > `pnpm sync:anchored [ref]` 从上游拉取刷新。
29
-
30
- > **v2.11 自定义锚点开关(历史)**:新增 `anchorCustom`——开启时固定
31
- > 使用自定义 anchorText,关闭时忽略 anchorText 并使用任务自适应自动文本。
32
-
33
- > **v2.10 Flash 子代理 + 模型检测(历史)**:在 v2.9 基础上,宿主经
34
- > `llm.listProviders()` 检测 DeepSeek 模型路由;未检测到时 `subagentFlash`
35
- > 在 Web/TUI 禁用并强制降级为 false。
36
-
37
- > **v2.9 Flash 子代理(历史)**:在 v2.8 最优组合之上,子代理目录改为直接
38
- > 全量放行(`assembled.tools` 本身已是调用方白名单过滤后的动态白名单);新增
39
- > `subagentFlash` 开关——开=给子代理固定 Flash 模型路由(参考 dsh-router-standard
40
- > 的 Flash 方案),关=继承主会话模型且目录全量放行。
41
-
42
- > **v2.8 最优组合(历史)**:在保留本插件全部独有功能(skills 注册、settings
43
- > bridge、UI、AGENTS 受管块、prompt-injector)的前提下,首轮结构改为最优组合——
44
- > `router-first-turn`(persona 替换为训练原句,保留计划段;首轮隐藏 mnemon 记忆段、清 contexts,晋升恢复)、上游 `tool-bootstrap`
45
- > (Minimal 真实工具对 + 子代理放行补丁)、`near-anchor`(近距离首句自锚定,按任务
46
- > 自动选择 we/let)。旧独立锚定轮 `turn-anchor` 已移除,旧默认“每块强制 we”会在
47
- > 运行时归一化为空。以下正文为 v2 历史设计记录,其中 turn-anchor 段落按上为准。
48
-
49
-
50
- > 目标:完整实现 dsh-anchored-standard 功能(原版机制),在首轮 "we" 锚定确认后注入
51
- > prompt-tool 提示词。设计依据 = 三个项目的源码/README + 已完成的实测数据。
52
-
53
- > 参考项目:
54
- > - [dsh-anchored-standard](https://github.com/xiaobright/dsh-anchored-standard)(集成上游,preset 原版复制)
55
- > - [dsh-router-standard](https://github.com/yjh051108/dsh-router-standard)(复杂度启发式 / 近距离注入)
56
- > - [dsh-super-injector](https://github.com/yjh051108/dsh-super-injector)(缓存铁律 / 开发工具链)
57
- > - 姊妹项目 [dsh 破限者](https://github.com/1449690477/dsh)(unrestricted-executor 技能包)
58
- > - 本插件 GitHub 仓库:https://github.com/Czerror/dsh-plugin-prompt-tool
59
-
60
- ## 〇、发布规划(哪些内容进远程仓库)
61
-
62
- **发布**:package.json、README.md、AGENTS.md、preset.md、plan.md、cordis.patch.yml、
63
- tsdown.config.ts、.gitignore、pnpm-lock.yaml(复现构建)、preset/(2 文件)、
64
- skills/(sandboxmod/SKILL.md)、src/(host + client)。上游同步已由子模块直引取代,
65
- 不再发布同步脚本。
66
-
67
- **不发布**:node_modules/、lib/(构建产物,clone 后 `pnpm install && pnpm build` 生成)、
68
- artifacts/(本地调试残留)。
69
-
70
- ## 〇、上游更新对照(anchored-standard PR #14,2026-08-15)
71
-
72
- 拉取覆盖后上游的关键变化(`a1e1c1d` / merge `95b98af`):
73
-
74
- | 项 | 旧版(本计划初稿) | 新版(当前上游) | 对 prompt-tool 的影响 |
75
- |---|---|---|---|
76
- | 首轮工具 schema | 平台 shell + `read` | **官方 Minimal 真实工具对**:持久 `bash` + `str_replace_editor` | 完全复制即可;Windows 下 `bash` 为 PTY 持久 shell,`pwsh` 晋升后仍可用 |
77
- | 首轮输出预算 | `bootstrapMaxTokens: 1024` 固定 | **opt-in,默认无 cap**(adapter 默认 256000 流过) | 实测(issue #11):Minimal schema 在 256000 下锚定 5/5(`We need` 首行、`we` 1.4、`let me` 0.0),而 pwsh/read 等标准家族 schema 在 256000 下 11/11 全失败——**工具 schema 是决定性变量,不是 cap** |
78
- | agent.cordis.yml 结构 | 无 Minimal 组 | 新增 `persistent-shell` 组(dsh-terminal + dsh-terminal-bash + dsh-tool-bash-persistent)与 `bootstrap-filesystem` 组(dsh-fs-local + dsh-tool-str-replace-editor),与官方 minimal 字节一致;`tool-bash` 行全平台禁用(避免 `bash` 名重复注册) | 完全复制;prompt-injector 仍插在 tool-bootstrap 行后 |
79
- | tool-bootstrap 参数 | `shellTools`+`commonTools` | `bootstrapTools: [bash, str_replace_editor]`;cap 监听器仅在显式设置 cap 时注册 | prompt-injector 逻辑不变(we 检测 + promoted 检测与参数无关) |
80
- | 验证工具 | 无 | `verify/run-verify.mjs` + `verify-runner.mjs`:preset-roster compose + CLI driver,`--stop-after-first-assistant` 只测首请求(秒级) | 本地 harness 源码未构建(`apps/cli/lib/bin.js` 不存在),暂继续用 prebuilt rc.7 的 dsh web HTTP API;将来构建 harness 后可切换 |
81
- | cap 行为差异 | — | rc.5 源码 checkout 上 cap 能到达首请求;rc.6 prebuilt 包会覆盖为 adapterDefaults;rc.7 修复 max-tokens 截断后的 replay 续跑 | 默认不设 cap;开启 bootstrapMaxTokens 时 rc.7 更稳 |
82
-
83
- 结论:**设计骨架不变**(完全复制原版 + prompt-injector 附加件),只是复制源更新为
84
- 新版文件,测试断言从 `pwsh/read + 1024` 改为 `bash/str_replace_editor + 无 cap`。
85
-
86
- ## 一、三个项目分析结论
87
-
88
- ### 1. dsh-anchored-standard(原版,2026-08-15 最新)
89
-
90
- 机制(`preset/tool-bootstrap.mjs` + `agent.cordis.yml`):
91
-
92
- - 首轮请求近似 Minimal:工具面收窄为 1 个平台 shell + `read`;`bootstrapMaxTokens: 1024`;
93
- 剥离 `skill-catalog` / `agent-instructions` 两类自动注入(`suppressedContextSources`)。
94
- - `promoteOn: either`:首个 `tool/call` **或** `assistant/message` 落库即晋升,
95
- request #2 起完整目录 + 正常预算 + 恢复注入。**不会卡死**。
96
- - 关键实现细节:
97
- - `tool-bootstrap` 行必须排第一 + 插件 `inject: []` + 监听器 `prepend: true`
98
- → 剥离是 waterfall 的最后一个 transform,能真正删掉后面监听器注入的消息。
99
- - 首轮 maxTokens 用 `agent/request` 监听(`prepend: true`)设置,晋升后显式移除
100
- (header 的 maxTokens 会被下一请求种子继承,不显式移除会粘整个会话)。
101
- - 降级安全:缺 bootstrap 工具 → 全目录 + 一次性告警;过滤器异常 → 保留全部。
102
-
103
- ### 2. dsh-router-standard(v0.1.0)
104
-
105
- 机制(`router-core.mjs` + `router-bootstrap.mjs`):
106
-
107
- - 首条用户消息分类 → spec(读优先)/ react(写优先)/ weak(模型自路由)。
108
- 实测行为带:spec [0,0.15]、transition [0.2,0.45](陷阱)、react [0.5,1.0]。
109
- - 复杂度启发式 `isComplexTask`:文本 >120 字符或含重构/设计/架构等词 → 复杂任务。
110
- - **近距离信号原则**(实测 P14/P16/P20):行为引导必须放用户消息之后(inbox.append /
111
- pre-step),放 system(远距离)会衰减甚至反向;固定文本保持缓存命中 92-94%。
112
- - `applyPersona` 只换 persona section,保留 plan-mode section(避免 plan 失忆)。
113
- - 模型不能自路由(P3/P5/P8),必须外部路由。
114
-
115
- 可复用点:`isComplexTask` 正则、近距离注入模式、会话事件推导状态(resume 安全)。
116
-
117
- ### 3. dsh-super-injector(v0.3.x)
118
-
119
- 机制:运行时插件注入生产线(`dev_inject_plugin` / `dev_reload_package` / `dev_stage_*` /
120
- `dev_install_package`),junction 链接 + `ctx.loader.create` + `ctx.effect` 资源清理 +
121
- registry 持久化恢复。
122
-
123
- 对 prompt-tool 的约束(铁律 4/6/8):
124
-
125
- - 缓存原则:静态文本放 system 头部,动态内容走消息尾;**严禁动态拼接进 system**
126
- (system 前缀任何变化 = 全会话缓存全灭)。
127
- - 首轮锚定:工具面大时首轮只露核心 1-2 个工具,首个 tool/call 后恢复(就是 anchored 机制)。
128
- - 资源注册挂 `ctx.effect`,peerDeps 用范围声明。
129
-
130
- prompt-tool 是 preset 形态插件,不依赖 injector 运行时注入;injector 仅作为
131
- 后续开发/热重载工具链使用。
132
-
133
- ## 二、实测结论(决定设计的硬事实)
134
-
135
- | 实验 | 结果 |
136
- |---|---|
137
- | 原版 anchored(旧版 pwsh+read + maxTokens 1024)+ 复杂英文任务 | we 锚定 **5/5**(全部 "We need") |
138
- | 新版 anchored(Minimal 真实 schema:bash+str_replace_editor,**无 cap**,256000) | 锚定 **5/5**(issue #11 上游实测:`We need` 首行、`we` 1.4、`let me` 0.0;标准家族 schema 11/11 全失败) |
139
- | 原版 anchored + 简单任务 | we ≈ 0%(模型直接调工具干活,不产出 reasoning) |
140
- | zero 变体(0 工具首轮)+ 简单任务 + 固定锚定消息 | we 锚定 **5/5**,但多一次模型调用 |
141
- | zero 变体 + persona 句当锚定消息 | we 仅 60%(差) |
142
- | 决定锚定的因素 | **任务复杂度**(不是工具数量);maxTokens 1024 起决定性作用(官方端点实测 26/32 vs 0/5) |
143
- | 原版 2 工具 + 锚定消息("Tools are not open yet") | 不产生 we(模型回复 "The user says..." 叙述语气,本次实测) |
144
-
145
- 推论:
146
-
147
- 1. **回到原版**(2 工具 + 1024 + suppressedContextSources),放弃 zero 变体
148
- (多一次调用、无收益、且原版已原生支持上下文剥离)。
149
- 2. **放弃锚定消息**:原版 2 工具下锚定消息不产生 we(见上表末行);复杂任务
150
- 原版机制本身 5/5 "We need",简单任务模型直接调工具干活(轨迹正确,无需 we)。
151
- 3. 提示词注入走消息层(pre-step / inbox),不进 system(缓存铁律)。
152
-
153
- ## 三、新设计
154
-
155
- ### preset 文件布局(完全复制原版 + 一个附加件)
156
-
157
- ```
158
- preset/
159
- agent.cordis.yml ← 原样复制 anchored-standard(tool-bootstrap 行第一 +
160
- 25 工具标准目录),仅在 bootstrap 段后追加
161
- prompt-injector 一行(见下)
162
- tool-bootstrap.mjs ← 原样复制(字节一致,不做任何修改)
163
- preset.yml ← 复制,name/description 改为 prompt-tool
164
- prompt-injector.mjs ← 新增(唯一自研件),替换现有的
165
- zero-tool-bootstrap.mjs + anchor-turn.mjs
166
- ```
167
-
168
- `agent.cordis.yml` 的 bootstrap 段变为(其余全部原样):
169
-
170
- ```yaml
171
- - id: tool-bootstrap
172
- name: ./tool-bootstrap.mjs
173
- config:
174
- shellTools: [bash, pwsh]
175
- commonTools: [read]
176
- promoteOn: either
177
- bootstrapMaxTokens: 1024
178
- suppressedContextSources: [agent-instructions, skill-catalog]
179
-
180
- - id: prompt-injector
181
- name: ./prompt-injector.mjs
182
- config:
183
- promptText: |-
184
- __PROMPT_TOOL_TEXT__
185
- ```
186
-
187
- ### prompt-injector.mjs 职责
188
-
189
- 零依赖、`inject: []`、注册在 tool-bootstrap 之后(不抢剥离顺序)。
190
-
191
- **唯一监听器 — 锚定确认后注入(`agent/pre-step`):**
192
-
193
- - 每会话注入一次,状态机:
194
- - `promoted` = 会话已出现首个 `tool/call` 或 `assistant/message`
195
- (与 tool-bootstrap 的 promoteOn: either 同定义);
196
- - `weAnchored` = turn1 的 assistant/message 存在 reasoning block 且
197
- `/^we\b/i` 匹配(复用 zero 版已验证的检测逻辑);
198
- - 注入条件:`promoted && (weAnchored || 当前最大 turn > 锚定轮 turn)`:
199
- - we 确认 → 锚定轮结束后的下一轮注入(满足"确认锚定后再注入");
200
- - we 未确认 → 最多再等一轮,仍无 we 则强制注入(兜底,绝不卡死)。
201
- - 注入内容 = `promptText` 一条 user 消息(`source.kind: 'plugin'`),
202
- 放在 decision.messages 之前(近距离信号);
203
- - 注入后 `injectedPrompt` 记录,绝不重复注入。
204
- - 不触碰 tools 目录、maxTokens、上下文剥离——全部留给原版 tool-bootstrap。
205
-
206
- **已废弃的设计**(实测推翻):`agent/inbox/inserted` 监听 + `isComplexTask`
207
- 分流 + 简单任务锚定消息。实测证明 2 工具下锚定消息不产生 we,且 inbox
208
- 消息结构(扁平 UserMessage)导致提取错误需修正——直接删除整条路径,简单任务
209
- 走兜底注入(turn1 模型正常干活,turn2 注入提示词)。
210
-
211
- ### src/index.ts 改动
212
-
213
- - `writePreset()`:复制 anchored 原版 `agent.cordis.yml`(替换 `__PROMPT_TOOL_TEXT__`
214
- 占位符)+ 原版 `tool-bootstrap.mjs` + `preset.yml` + 新增 `prompt-injector.mjs`。
215
- - 删除对 `zero-tool-bootstrap.mjs` / `anchor-turn.mjs` 的复制逻辑。
216
- - 其余不动:skill 注册(prompt)、AGENTS.md 常驻层、settings Web UI。
217
-
218
- ### 不变项
219
-
220
- - `cordis.patch.yml`(插件自身装配)保持现状——anchored-standard 是 preset 形态,
221
- 仓库内无 patch 文件,无物可复制。
222
- - `~/.dsh/AGENTS.md` 只写 AGENTS 规则,preset.md 不进 AGENTS.md(防重复注入)。
223
- - 打包产物、peerDeps 范围声明不变。
224
-
225
- ## 四、实施步骤
226
-
227
- 1. 从 `E:\Documents\GitHub\dsh-anchored-standard\preset\` 复制
228
- `agent.cordis.yml`、`tool-bootstrap.mjs` 到 prompt-tool `preset/`;
229
- 2. 按上节修改 `agent.cordis.yml`(追加 prompt-injector 行,其余不动);
230
- 3. 写 `preset/prompt-injector.mjs`(一个 pre-step 监听器 + we 检测 + 兜底轮计数);
231
- 4. 改 `preset/preset.yml`(name: prompt-tool);
232
- 5. 删 `preset/zero-tool-bootstrap.mjs`、`preset/anchor-turn.mjs`;
233
- 6. 改 `src/index.ts` 的 `writePreset()`;
234
- 7. `pnpm build`;
235
- 8. 部署:运行插件装配 → 验证 `~/.dsh/.agent-presets/prompt-tool/` 文件
236
- 与 anchored-standard 原版 diff 仅剩 prompt-injector 行 + preset.yml 头部;
237
- 9. 按第五节用 dsh web 测试;
238
- 10. 同步 README(中英文)说明新机制。
239
-
240
- ## 五、测试计划与结果(dsh web)
241
-
242
- 工具链:启动 dsh web(`--port 0` 自动分配)→ HTTP API:
243
-
244
- > **测试工作目录约定(用户全局指令:任何项目的所有测试都必须在 `_temp`)**:所有测试会话的 `cwd` 一律使用临时目录
245
- > `D:\AI\CodexCLI\workspase\_temp`,禁止用任何源码仓库当 cwd
246
- > (模型会在任务中写入产物,污染仓库工作区)。
247
-
248
- ```
249
- session.create { agentPreset: prompt-tool }
250
- session.selectModel { deepseek-official / deepseek-v4-pro / reasoningEffort: max }
251
- session.prompt { text: 任务 }
252
- session.history → 轮询 turn/end(复杂任务 180s+ 超时)
253
- session.export → zip 内 session.jsonl 逐条断言
254
- ```
255
-
256
- 断言脚本(PowerShell,写入 `%TEMP%`)逐条检查:
257
-
258
- - request #1:`tools` 仅 `bash`+`str_replace_editor`(Minimal 真实 schema);
259
- `config.maxTokens` 无注入 cap(adapter 默认 256000 或 undefined);
260
- 无 `skill-catalog` / `agent-instructions` 消息;
261
- - request #2 起:完整工具目录(含 pwsh);
262
- - turn1 的 assistant/message reasoning 首词 `/^we\b/i`;
263
- - preset.md 文本恰好出现一次(turn2 或 turn3,绝不重复)。
264
-
265
- 测试矩阵:
266
-
267
- | 组 | 任务 | 次数 | 断言 |
268
- |---|---|---|---|
269
- | A 复杂英文 | "Design and implement ..."(>120 字符) | 5 | we 5/5;注入 5/5;request 结构如上 |
270
- | B 简单英文 | "List the files in the current directory" | 5 | turn1 正常干活;兜底注入 5/5;request 结构 |
271
- | C 中文 | 中文任务 | 1 | 注入后思维链/回答为简体中文 |
272
-
273
- **旧版实测结果(2026-08-15,历史存档,已被下方新版实测取代):**
274
-
275
- | 组 | 结果 |
276
- |---|---|
277
- | A ×5 | we **5/5**;H1=[pwsh,read] maxTokens=1024;H2=31 工具 maxTokens=256000;注入 5/5;首请求前消息纯净(仅 user) |
278
- | B ×5 | turn1 first="The" + tool/call×2(直接干活);注入 5/5;H1/H2 同上;注入后回复转简体中文 |
279
- | C ×1 | 同 B;turn2 中文回复 ✓ |
280
-
281
- 验收通过:A 组 we 锚定 5/5、注入 5/5、无重复注入、request #1 结构全部命中;
282
- B/C 组兜底注入 5/5 + 中文生效。测试耗时:并行约 2.5 分钟(串行约 35 分钟,
283
- 复杂任务 turn2 无需等结束——注入在 turn2 请求前已落库)。
284
-
285
- > 上表为旧版(pwsh/read + 1024 cap)的历史实测,仅存档参考。当前有效数据
286
- > 以紧跟其后的新版实测(bash/str_replace_editor + 无 cap)为准。
287
-
288
- **新版实测(2026-08-15,上游 PR #14 同步后重测,deepseek-v4-pro + max):**
289
-
290
- | 组 | 结果 |
291
- |---|---|
292
- | 复杂英文 ×5 | we **5/5**;H1=[bash,str_replace_editor] maxTokens=256000(无 cap);H2=33 工具;注入 5/5;首请求前消息纯净(仅 user) |
293
- | 时间线(run2 详查) | 首请求(bootstrap schema)→ "We" reasoning → tool/call → **we 确认后同 turn 下一步注入 preset.md** → 晋升后 agent-instructions/skill-catalog 恢复 → 模型继续干活 |
294
-
295
- > v2.2(2026-08-15)子模块已同步上游 main `ffb845c`(PR #20/#21/#23/#27/#29):
296
- > 晋升后目录由全量 33 工具改为 resident 集(bootstrap 对 + dev_tool_search /
297
- > skill_search / skill_load + 已解锁工具);AGENTS.md 由 dsh-agent-instructions 每轮
298
- > 注入改为 instruction-hint 一次性提示 + 模型自读;新增 compaction 回落与 Windows
299
- > custom-bash。上表 H2=33 工具与"agent-instructions 恢复"仅作为 v2.1 及之前版本
300
- > 的历史记录,当前断言以 resident 集为准。
301
-
302
- 新版相对旧版的改善:无输出 cap,模型 turn1 内即可正常干活(旧版 1024 cap 会截断
303
- 首轮 text/tool),注入发生在 turn1 内(旧版要等 turn2),全程不需要用户再发消息。
304
-
305
- ## 六、风险与兜底
306
-
307
- - we 未锚定:锚定消息失效 → 强制兜底注入(最多延迟一轮),不影响任务完成。
308
- - 原版上游再更新:`writePreset` 完整复制上游 `preset/*.mjs` 全集并注入
309
- prompt-injector 行(唯一本地差异,冲突面最小);同步命令
310
- `git submodule update --remote vendor/dsh-anchored-standard`。
311
- - 缓存:promptText 若频繁编辑会改变 pre-step 注入文本 → 仅影响注入轮之后的
312
- 前缀缓存;preset.md 编辑频率低,可接受(不违反 system 静态铁律)。