better-dsh 0.2.3 → 0.2.4-b

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 (406) hide show
  1. package/cordis.patch.yml +47 -16
  2. package/docs/10_plans/2026-09-23-remote-execution-framework.md +236 -0
  3. package/docs/10_plans/2026-09-23-remote-framework-impl.md +2083 -0
  4. package/docs/50_test-reports/2026-09-06-write/345/267/245/345/205/267sandbox/345/215/207/347/272/247/351/200/217/344/274/240bug/345/244/215/345/217/221/345/217/212/346/214/202/350/265/267-/344/272/213/344/273/266/346/212/245/345/221/212.md +176 -0
  5. package/docs/50_test-reports/2026-09-08-hashline-edit-E_RANGE_UNVERIFIED/350/267/250/350/275/256/344/274/232/350/257/235/351/224/256/345/244/261/346/225/210-/350/257/212/346/226/255/346/212/245/345/221/212.md +226 -0
  6. package/docs/50_test-reports/2026-09-11-control-prompt-into-eval-description/345/256/236/346/265/213/346/212/245/345/221/212.md +222 -0
  7. package/docs/50_test-reports/2026-09-12-fs-scheme-resolution-/345/256/236/346/265/213/346/212/245/345/221/212.md +81 -0
  8. package/docs/50_test-reports/2026-09-12-url-schemes-grammar-matrix/344/270/216catalog-centralize-/345/256/236/346/265/213/346/212/245/345/221/212.md +234 -0
  9. package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-design/351/252/214/350/257/201/346/212/245/345/221/212.md +160 -0
  10. package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-/345/256/236/346/265/213/345/211/247/346/234/254.md +44 -0
  11. package/docs/50_test-reports/2026-09-12-url-schemes-recallable-context-/345/256/236/346/265/213/346/212/245/345/221/212.md +89 -0
  12. package/docs/50_test-reports/2026-09-12-url-schemes-/345/205/255scheme/345/206/222/347/203/237/344/270/216/350/276/271/347/225/214/345/256/236/346/265/213/346/212/245/345/221/212.md +198 -0
  13. package/docs/50_test-reports/2026-09-13-hashline-off/344/270/213scheme/345/217/257/350/276/276/346/200/247/345/267/245/345/205/267/351/235/242/344/270/215/345/257/271/347/247/260-/345/256/236/346/265/213/346/212/245/345/221/212.md +246 -0
  14. package/docs/50_test-reports/2026-09-13-preact-ui-shell/345/256/236/346/265/213/346/212/245/345/221/212.md +50 -0
  15. package/docs/50_test-reports/2026-09-14-4999-skill/346/270/205/345/215/225/344/270/216lsp-gate/345/256/236/346/265/213/346/212/245/345/221/212.md +63 -0
  16. package/docs/50_test-reports/2026-09-17-plugins/351/241/265/345/205/255/347/273/204/344/273/266/346/213/206/345/210/206/345/256/236/346/265/213/346/212/245/345/221/212.md +76 -0
  17. 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
  18. 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
  19. package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-local-test-report.md +44 -0
  20. package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md +110 -0
  21. package/docs/50_test-reports/upstream-dsh-0.1.5-rc.2-local-test-report.md +79 -0
  22. package/docs/50_test-reports/v0.2.3b-hashline-content-locator/345/256/236/346/265/213/346/212/245/345/221/212.md +73 -0
  23. package/docs/50_test-reports/v0.2.3c-mobile-wave/345/256/236/346/265/213/346/212/245/345/221/212.md +47 -0
  24. package/docs/50_test-reports/v0.2.4-ios-focus-zoom-suppression/345/256/236/346/265/213/346/212/245/345/221/212.md +158 -0
  25. package/docs/specs/agent/spec.md +54 -0
  26. package/docs/specs/ast/spec.md +34 -0
  27. package/docs/specs/compaction-recall/spec.md +46 -0
  28. package/docs/specs/ctx/spec.md +107 -0
  29. package/docs/specs/dsh/spec.md +47 -0
  30. package/docs/specs/dvc/spec.md +87 -0
  31. package/docs/specs/escalation-guidance/spec.md +44 -0
  32. package/docs/specs/fs-scheme-resolution/spec.md +37 -0
  33. package/docs/specs/hash-edit/spec.md +41 -0
  34. package/docs/specs/http-read/spec.md +73 -0
  35. package/docs/specs/kernel-provisioning/spec.md +53 -0
  36. package/docs/specs/lsp/spec.md +121 -0
  37. package/docs/specs/mobile-layout/spec.md +108 -0
  38. package/docs/specs/model-failover/spec.md +20 -0
  39. package/docs/specs/plugins-page-components/spec.md +79 -0
  40. package/docs/specs/preact-ui-shell/spec.md +22 -0
  41. package/docs/specs/repl-dispatch-resilience/spec.md +21 -0
  42. package/docs/specs/skill/spec.md +58 -0
  43. package/docs/specs/tool-surface/spec.md +222 -0
  44. package/docs/specs/url-schema/spec.md +148 -0
  45. package/docs/specs/web-trust-fence/spec.md +43 -0
  46. package/docs/upstream-dsh-0.1.5-rc.2-report.md +156 -0
  47. package/dsh-docs/AGENTS.md +75 -0
  48. package/dsh-docs/agent-lifecycle.md +84 -0
  49. package/dsh-docs/agent-lifecycle.zh.md +86 -0
  50. package/dsh-docs/api-gateway.md +164 -0
  51. package/dsh-docs/api-gateway.zh.md +164 -0
  52. package/dsh-docs/architecture.md +150 -0
  53. package/dsh-docs/architecture.zh.md +154 -0
  54. package/dsh-docs/capability-seams.md +543 -0
  55. package/dsh-docs/capability-seams.zh.md +545 -0
  56. package/dsh-docs/config-catalog.md +3473 -0
  57. package/dsh-docs/config-catalog.zh.md +3474 -0
  58. package/dsh-docs/cookbook/adding-a-package.md +117 -0
  59. package/dsh-docs/cookbook/adding-a-package.zh.md +119 -0
  60. package/dsh-docs/cookbook/adding-a-remote-api.md +197 -0
  61. package/dsh-docs/cookbook/adding-a-remote-api.zh.md +197 -0
  62. package/dsh-docs/cookbook/adding-a-session-format-version.md +109 -0
  63. package/dsh-docs/cookbook/adding-a-session-format-version.zh.md +109 -0
  64. package/dsh-docs/cookbook/adding-a-settings-card.md +102 -0
  65. package/dsh-docs/cookbook/adding-a-settings-card.zh.md +102 -0
  66. package/dsh-docs/cookbook/adding-a-tool.md +101 -0
  67. package/dsh-docs/cookbook/adding-a-tool.zh.md +103 -0
  68. package/dsh-docs/cookbook/adding-a-vendored-package.md +59 -0
  69. package/dsh-docs/cookbook/adding-a-vendored-package.zh.md +59 -0
  70. package/dsh-docs/cookbook/adding-an-llm-adapter.md +43 -0
  71. package/dsh-docs/cookbook/adding-an-llm-adapter.zh.md +43 -0
  72. package/dsh-docs/cookbook/extension-cookbook.md +132 -0
  73. package/dsh-docs/cookbook/extension-cookbook.zh.md +136 -0
  74. package/dsh-docs/cookbook/maintaining-dsh-code-review.md +64 -0
  75. package/dsh-docs/cookbook/maintaining-dsh-code-review.zh.md +64 -0
  76. package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
  77. package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
  78. package/dsh-docs/cordis-api/context.md +364 -0
  79. package/dsh-docs/cordis-api/context.zh.md +366 -0
  80. package/dsh-docs/cordis-api/events.md +207 -0
  81. package/dsh-docs/cordis-api/events.zh.md +209 -0
  82. package/dsh-docs/cordis-api/fiber.md +375 -0
  83. package/dsh-docs/cordis-api/fiber.zh.md +377 -0
  84. package/dsh-docs/cordis-api/inherited.md +39 -0
  85. package/dsh-docs/cordis-api/registry.md +152 -0
  86. package/dsh-docs/cordis-api/registry.zh.md +154 -0
  87. package/dsh-docs/cordis-api/service.md +102 -0
  88. package/dsh-docs/cordis-api/service.zh.md +104 -0
  89. package/dsh-docs/cordis-primer.md +45 -0
  90. package/dsh-docs/cordis-primer.zh.md +51 -0
  91. package/dsh-docs/cordis-tutorial/01-first-plugin.md +95 -0
  92. package/dsh-docs/cordis-tutorial/01-first-plugin.zh.md +95 -0
  93. package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  94. package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +98 -0
  95. package/dsh-docs/cordis-tutorial/03-services.md +98 -0
  96. package/dsh-docs/cordis-tutorial/03-services.zh.md +98 -0
  97. package/dsh-docs/cordis-tutorial/04-events.md +144 -0
  98. package/dsh-docs/cordis-tutorial/04-events.zh.md +144 -0
  99. package/dsh-docs/cordis-tutorial/05-config.md +84 -0
  100. package/dsh-docs/cordis-tutorial/05-config.zh.md +84 -0
  101. package/dsh-docs/cordis-tutorial/06-composition-and-hmr.md +113 -0
  102. package/dsh-docs/cordis-tutorial/06-composition-and-hmr.zh.md +113 -0
  103. package/dsh-docs/cordis-tutorial/07-into-the-harness.md +108 -0
  104. package/dsh-docs/cordis-tutorial/07-into-the-harness.zh.md +108 -0
  105. package/dsh-docs/cordis-tutorial/index.md +60 -0
  106. package/dsh-docs/cordis-tutorial/index.zh.md +62 -0
  107. package/dsh-docs/deepseek-llm-api-wire-extensions.md +163 -0
  108. package/dsh-docs/deepseek-llm-api-wire-extensions.zh.md +163 -0
  109. package/dsh-docs/defensive-patterns.md +33 -0
  110. package/dsh-docs/defensive-patterns.zh.md +35 -0
  111. package/dsh-docs/development.md +167 -0
  112. package/dsh-docs/development.zh.md +173 -0
  113. package/dsh-docs/event-producer-consumer.md +86 -0
  114. package/dsh-docs/event-producer-consumer.zh.md +88 -0
  115. package/dsh-docs/glossary.md +45 -0
  116. package/dsh-docs/glossary.zh.md +45 -0
  117. package/dsh-docs/graph-atlas.md +22 -0
  118. package/dsh-docs/graph-atlas.zh.md +24 -0
  119. package/dsh-docs/i18n/README.md +60 -0
  120. package/dsh-docs/i18n/README.zh.md +62 -0
  121. package/dsh-docs/i18n/style-samples.md +87 -0
  122. package/dsh-docs/i18n/terminology.md +214 -0
  123. package/dsh-docs/i18n/translation-prompt.md +263 -0
  124. package/dsh-docs/i18n/translation-rules.md +69 -0
  125. package/dsh-docs/i18n/translation-rules.zh.md +69 -0
  126. package/dsh-docs/module-graph.md +1411 -0
  127. package/dsh-docs/module-graph.zh.md +1413 -0
  128. package/dsh-docs/persistence-catalog.md +1075 -0
  129. package/dsh-docs/persistence-catalog.zh.md +1077 -0
  130. package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.md +113 -0
  131. package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
  132. package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
  133. package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
  134. package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
  135. package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
  136. package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
  137. package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
  138. package/dsh-docs/postmortem/README.md +18 -0
  139. package/dsh-docs/postmortem/README.zh.md +18 -0
  140. package/dsh-docs/rescope.md +53 -0
  141. package/dsh-docs/rescope.zh.md +53 -0
  142. package/dsh-docs/session-format-status.md +47 -0
  143. package/dsh-docs/session-format-status.zh.md +47 -0
  144. package/dsh-docs/subsystems/README.md +61 -0
  145. package/dsh-docs/subsystems/README.zh.md +61 -0
  146. package/dsh-docs/subsystems/agent-team.md +207 -0
  147. package/dsh-docs/subsystems/agent-team.zh.md +207 -0
  148. package/dsh-docs/subsystems/approval.md +170 -0
  149. package/dsh-docs/subsystems/approval.zh.md +170 -0
  150. package/dsh-docs/subsystems/attachment.md +351 -0
  151. package/dsh-docs/subsystems/attachment.zh.md +351 -0
  152. package/dsh-docs/subsystems/client-modules.md +168 -0
  153. package/dsh-docs/subsystems/client-modules.zh.md +168 -0
  154. package/dsh-docs/subsystems/client-resources.md +91 -0
  155. package/dsh-docs/subsystems/client-resources.zh.md +91 -0
  156. package/dsh-docs/subsystems/code-runtime.md +195 -0
  157. package/dsh-docs/subsystems/code-runtime.zh.md +195 -0
  158. package/dsh-docs/subsystems/commands.md +219 -0
  159. package/dsh-docs/subsystems/commands.zh.md +219 -0
  160. package/dsh-docs/subsystems/compaction.md +238 -0
  161. package/dsh-docs/subsystems/compaction.zh.md +238 -0
  162. package/dsh-docs/subsystems/conversation.md +258 -0
  163. package/dsh-docs/subsystems/conversation.zh.md +258 -0
  164. package/dsh-docs/subsystems/core.md +1209 -0
  165. package/dsh-docs/subsystems/core.zh.md +1219 -0
  166. package/dsh-docs/subsystems/credentials.md +329 -0
  167. package/dsh-docs/subsystems/credentials.zh.md +329 -0
  168. package/dsh-docs/subsystems/extensions.md +382 -0
  169. package/dsh-docs/subsystems/extensions.zh.md +382 -0
  170. package/dsh-docs/subsystems/feedback.md +266 -0
  171. package/dsh-docs/subsystems/feedback.zh.md +266 -0
  172. package/dsh-docs/subsystems/filesystem.md +505 -0
  173. package/dsh-docs/subsystems/filesystem.zh.md +505 -0
  174. package/dsh-docs/subsystems/goal.md +277 -0
  175. package/dsh-docs/subsystems/goal.zh.md +277 -0
  176. package/dsh-docs/subsystems/invariants.md +88 -0
  177. package/dsh-docs/subsystems/invariants.zh.md +88 -0
  178. package/dsh-docs/subsystems/jobs.md +290 -0
  179. package/dsh-docs/subsystems/jobs.zh.md +290 -0
  180. package/dsh-docs/subsystems/llm-streaming.md +1080 -0
  181. package/dsh-docs/subsystems/llm-streaming.zh.md +1086 -0
  182. package/dsh-docs/subsystems/lsp.md +202 -0
  183. package/dsh-docs/subsystems/lsp.zh.md +202 -0
  184. package/dsh-docs/subsystems/permission-presets.md +131 -0
  185. package/dsh-docs/subsystems/permission-presets.zh.md +131 -0
  186. package/dsh-docs/subsystems/persistence.md +395 -0
  187. package/dsh-docs/subsystems/persistence.zh.md +395 -0
  188. package/dsh-docs/subsystems/plan.md +87 -0
  189. package/dsh-docs/subsystems/plan.zh.md +87 -0
  190. package/dsh-docs/subsystems/sandbox.md +220 -0
  191. package/dsh-docs/subsystems/sandbox.zh.md +220 -0
  192. package/dsh-docs/subsystems/schedule.md +192 -0
  193. package/dsh-docs/subsystems/schedule.zh.md +192 -0
  194. package/dsh-docs/subsystems/scope.md +59 -0
  195. package/dsh-docs/subsystems/scope.zh.md +59 -0
  196. package/dsh-docs/subsystems/session-projection.md +354 -0
  197. package/dsh-docs/subsystems/session-projection.zh.md +354 -0
  198. package/dsh-docs/subsystems/session-query.md +509 -0
  199. package/dsh-docs/subsystems/session-query.zh.md +509 -0
  200. package/dsh-docs/subsystems/session-reference.md +219 -0
  201. package/dsh-docs/subsystems/session-reference.zh.md +219 -0
  202. package/dsh-docs/subsystems/session-telemetry.md +194 -0
  203. package/dsh-docs/subsystems/session-telemetry.zh.md +194 -0
  204. package/dsh-docs/subsystems/session-title.md +204 -0
  205. package/dsh-docs/subsystems/session-title.zh.md +204 -0
  206. package/dsh-docs/subsystems/session.md +1155 -0
  207. package/dsh-docs/subsystems/session.zh.md +1159 -0
  208. package/dsh-docs/subsystems/settings.md +405 -0
  209. package/dsh-docs/subsystems/settings.zh.md +405 -0
  210. package/dsh-docs/subsystems/shell.md +303 -0
  211. package/dsh-docs/subsystems/shell.zh.md +303 -0
  212. package/dsh-docs/subsystems/sidebar-right.md +148 -0
  213. package/dsh-docs/subsystems/sidebar-right.zh.md +148 -0
  214. package/dsh-docs/subsystems/skills.md +354 -0
  215. package/dsh-docs/subsystems/skills.zh.md +354 -0
  216. package/dsh-docs/subsystems/slots.md +175 -0
  217. package/dsh-docs/subsystems/slots.zh.md +175 -0
  218. package/dsh-docs/subsystems/spill.md +117 -0
  219. package/dsh-docs/subsystems/spill.zh.md +117 -0
  220. package/dsh-docs/subsystems/storage.md +260 -0
  221. package/dsh-docs/subsystems/storage.zh.md +260 -0
  222. package/dsh-docs/subsystems/subagent.md +766 -0
  223. package/dsh-docs/subsystems/subagent.zh.md +770 -0
  224. package/dsh-docs/subsystems/subprocess.md +324 -0
  225. package/dsh-docs/subsystems/subprocess.zh.md +324 -0
  226. package/dsh-docs/subsystems/system-prompt.md +220 -0
  227. package/dsh-docs/subsystems/system-prompt.zh.md +220 -0
  228. package/dsh-docs/subsystems/terminal.md +184 -0
  229. package/dsh-docs/subsystems/terminal.zh.md +184 -0
  230. package/dsh-docs/subsystems/todo.md +32 -0
  231. package/dsh-docs/subsystems/todo.zh.md +32 -0
  232. package/dsh-docs/subsystems/token-meter.md +105 -0
  233. package/dsh-docs/subsystems/token-meter.zh.md +105 -0
  234. package/dsh-docs/subsystems/tools.md +720 -0
  235. package/dsh-docs/subsystems/tools.zh.md +720 -0
  236. package/dsh-docs/subsystems/typert.md +343 -0
  237. package/dsh-docs/subsystems/typert.zh.md +343 -0
  238. package/dsh-docs/subsystems/user-questions.md +178 -0
  239. package/dsh-docs/subsystems/user-questions.zh.md +178 -0
  240. package/dsh-docs/subsystems/web-client.md +95 -0
  241. package/dsh-docs/subsystems/web-client.zh.md +95 -0
  242. package/dsh-docs/subsystems/web-server.md +154 -0
  243. package/dsh-docs/subsystems/web-server.zh.md +154 -0
  244. package/dsh-docs/subsystems/web.md +206 -0
  245. package/dsh-docs/subsystems/web.zh.md +206 -0
  246. package/dsh-docs/subsystems/webhook.md +70 -0
  247. package/dsh-docs/subsystems/webhook.zh.md +70 -0
  248. package/dsh-docs/subsystems/workflow.md +278 -0
  249. package/dsh-docs/subsystems/workflow.zh.md +278 -0
  250. package/dsh-docs/subsystems/workspace.md +321 -0
  251. package/dsh-docs/subsystems/workspace.zh.md +321 -0
  252. package/dsh-docs/testing.md +54 -0
  253. package/dsh-docs/testing.zh.md +54 -0
  254. package/dsh-docs/tool-catalog.md +2225 -0
  255. package/dsh-docs/tool-catalog.zh.md +2233 -0
  256. package/dsh-docs/tool-execution-pipeline.md +62 -0
  257. package/dsh-docs/tool-execution-pipeline.zh.md +64 -0
  258. package/dsh-docs/user/develop/basic/config.md +106 -0
  259. package/dsh-docs/user/develop/basic/config.zh.md +106 -0
  260. package/dsh-docs/user/develop/basic/index.md +144 -0
  261. package/dsh-docs/user/develop/basic/index.zh.md +144 -0
  262. package/dsh-docs/user/develop/basic/publish.md +183 -0
  263. package/dsh-docs/user/develop/basic/publish.zh.md +183 -0
  264. package/dsh-docs/user/develop/basic/tool.md +52 -0
  265. package/dsh-docs/user/develop/basic/tool.zh.md +52 -0
  266. package/dsh-docs/user/develop/framework/events.md +143 -0
  267. package/dsh-docs/user/develop/framework/events.zh.md +143 -0
  268. package/dsh-docs/user/develop/framework/index.md +137 -0
  269. package/dsh-docs/user/develop/framework/index.zh.md +137 -0
  270. package/dsh-docs/user/develop/framework/service.md +148 -0
  271. package/dsh-docs/user/develop/framework/service.zh.md +150 -0
  272. package/dsh-docs/user/develop/practice/dynamic-cordis.md +15 -0
  273. package/dsh-docs/user/develop/practice/dynamic-cordis.zh.md +15 -0
  274. package/dsh-docs/user/develop/practice/index.md +155 -0
  275. package/dsh-docs/user/develop/practice/index.zh.md +155 -0
  276. package/dsh-docs/user/develop/practice/llm-adapter.md +189 -0
  277. package/dsh-docs/user/develop/practice/llm-adapter.zh.md +189 -0
  278. package/dsh-docs/user/guide/github-review.md +102 -0
  279. package/dsh-docs/user/guide/github-review.zh.md +102 -0
  280. package/dsh-docs/user/guide/index.md +30 -0
  281. package/dsh-docs/user/guide/index.zh.md +30 -0
  282. package/dsh-docs/user/guide/mcp-memory.md +101 -0
  283. package/dsh-docs/user/guide/mcp-memory.zh.md +101 -0
  284. package/dsh-docs/user/guide/network-proxy.md +85 -0
  285. package/dsh-docs/user/guide/network-proxy.zh.md +85 -0
  286. package/dsh-docs/user/guide/providers.md +190 -0
  287. package/dsh-docs/user/guide/providers.zh.md +190 -0
  288. package/dsh-docs/user/guide/python-sdk.md +150 -0
  289. package/dsh-docs/user/guide/python-sdk.zh.md +150 -0
  290. package/dsh-docs/user/guide/schedule.md +21 -0
  291. package/dsh-docs/user/guide/schedule.zh.md +21 -0
  292. package/dsh-docs/user/index.md +11 -0
  293. package/dsh-docs/user/index.zh.md +11 -0
  294. package/dsh-docs/web-styling.md +29 -0
  295. package/dsh-docs/web-styling.zh.md +29 -0
  296. package/eval-description.md +33 -0
  297. package/lib/client/index.js +328 -89
  298. package/lib/compaction/index.d.ts +47 -0
  299. package/lib/compaction/index.js +159 -0
  300. package/lib/failover/index.d.ts +35 -0
  301. package/lib/failover/index.js +141 -0
  302. package/lib/fs-aware/sandbox-plugin.d.ts +71 -0
  303. package/lib/fs-aware/sandbox-plugin.js +249 -0
  304. package/lib/index.d.ts +10 -41
  305. package/lib/index.js +226 -8173
  306. package/lib/lsp-server-registry-946ysdqg.js +972 -0
  307. package/lib/lsp-server-registry-XU6aHSqZ.js +3 -0
  308. package/lib/mobile/plugin.d.ts +29 -0
  309. package/lib/mobile/plugin.js +54 -0
  310. package/lib/native-capture-x_Hos2e8.js +68 -0
  311. package/lib/py-sdk-Chvy92MB.js +178 -0
  312. package/lib/py-sdk.d.ts +19 -2
  313. package/lib/py-sdk.js +2 -2
  314. package/lib/remote/plugin.d.ts +24 -0
  315. package/lib/remote/plugin.js +1095 -0
  316. package/lib/url-schemes/index.d.ts +88 -0
  317. package/lib/url-schemes/index.js +7200 -0
  318. package/lib/web-trust-BO66y72w.js +361 -0
  319. package/lib/web-trust-CgpBoFv3.d.ts +106 -0
  320. package/lib/web-trust.d.ts +2 -0
  321. package/lib/web-trust.js +3 -0
  322. package/lib/wrap-Dr8XtIak.js +747 -0
  323. package/package.json +87 -56
  324. package/url-schemes-instruction.md +22 -0
  325. package/control-prompt.md +0 -37
  326. package/docs/50_test-reports/v0.1.8d_artifacts/README.md +0 -138
  327. package/docs/50_test-reports/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
  328. package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
  329. package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
  330. package/docs/50_test-reports/v0.1.8d_artifacts/functions.json +0 -592
  331. package/docs/50_test-reports/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
  332. package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
  333. package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
  334. package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
  335. package/docs/50_test-reports/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
  336. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
  337. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
  338. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
  339. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
  340. package/docs/50_test-reports/v0.2.0b_artifacts/hashline-probe.md +0 -5
  341. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
  342. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
  343. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
  344. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
  345. package/docs/60_exploration-and-research/cordis-research.md +0 -350
  346. package/docs/60_exploration-and-research/dsh-web-profile-package-map.md +0 -186
  347. package/docs/60_exploration-and-research/dsh-web-ui-slot-system-research.md +0 -310
  348. package/docs/60_exploration-and-research/dsh-webui-strip-boundary-research.md +0 -300
  349. package/docs/60_exploration-and-research/ios-chat-app-bridge-research.md +0 -324
  350. package/docs/60_exploration-and-research/web-frontend-composability-research.md +0 -191
  351. package/docs/REPL-/345/267/245/345/205/267/350/260/203/347/224/250-/346/210/252/346/226/255/350/257/212/346/226/255.md +0 -110
  352. package/docs/adr/0001-bridge-tool-layer-not-service-layer.md +0 -14
  353. package/docs/adr/0002-masking-is-presentation-only.md +0 -15
  354. package/docs/plans/A2A-messaging-channel-test-archive.md +0 -256
  355. package/docs/plans/code-mode-vs-rlm-ipython-comparison.md +0 -137
  356. package/docs/plans/dashr-blueprint-review.md +0 -201
  357. package/docs/plans/dashr-blueprint.md +0 -561
  358. package/docs/plans/dashr-compaction-window-and-archive.md +0 -307
  359. package/docs/plans/dashr-profile-layer-feasibility.md +0 -367
  360. package/docs/plans/dashr-sandbox-escalation-semantics-gap.md +0 -171
  361. package/docs/plans/dashr-security-sandbox-analysis.md +0 -187
  362. package/docs/plans/dashr-surface-invariant-and-omp-imports.md +0 -97
  363. package/docs/plans/ipython-kernel-interactive-interface-test-report.md +0 -152
  364. package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft.md +0 -146
  365. package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v3.md +0 -50
  366. package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v4.md +0 -79
  367. package/docs/plans/kernel-refactoring/Dash-vs-PrimeAgent-systemprompt-toolcatalog-comparison.md +0 -138
  368. package/docs/plans/kernel-refactoring/RLM-system-prompt-injection-gap-report.md +0 -161
  369. package/docs/plans/kernel-refactoring/V0.1.5-development-plan.md +0 -109
  370. package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_dsh.md +0 -50
  371. package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_prime.md +0 -113
  372. package/docs/plans/recallable-compaction.md +0 -147
  373. package/docs/plans/spike-tag-repro.mjs +0 -102
  374. package/docs/plans/upstream-analysis.md +0 -128
  375. package/docs/v0.1.8-improved-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -142
  376. package/docs/v0.1.8-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -193
  377. package/docs/v0.1.8b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -96
  378. package/docs/v0.1.8c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -127
  379. package/docs/v0.1.8d-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -150
  380. package/docs/v0.1.8d_artifacts/README.md +0 -138
  381. package/docs/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
  382. package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
  383. package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
  384. package/docs/v0.1.8d_artifacts/functions.json +0 -592
  385. package/docs/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
  386. package/docs/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
  387. package/docs/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
  388. package/docs/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
  389. package/docs/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
  390. package/docs/v0.1.8e-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -224
  391. package/docs/v0.1.9a-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -168
  392. package/docs/v0.2.0b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -123
  393. package/docs/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
  394. package/docs/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
  395. package/docs/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
  396. package/docs/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
  397. package/docs/v0.2.0b_artifacts/hashline-probe.md +0 -5
  398. package/docs/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
  399. package/docs/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
  400. package/docs/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
  401. package/docs/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
  402. package/docs/v0.2.1-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -110
  403. package/docs/v0.2.1b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -86
  404. package/docs/v0.2.1c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -66
  405. package/lib/py-sdk-BCaOGYz7.d.ts +0 -125
  406. package/lib/py-sdk-CbgYiX8O.js +0 -691
@@ -1,307 +0,0 @@
1
- # DASHR Future Feature: 真滑动窗口 + 压缩损失补偿(强制归档 + 摘要尾部标记)
2
-
3
- > 状态:设计备忘(**未实现**)· 2026-08-17 · 用户方向
4
- > 归属:`dashr/dev/`(gitignored 本地 scratch,不进公开仓库)
5
- > 关联分析:`agent-harness/21_CLI-Agent/04_prime-agent/04_prime-agent-paradigm-discussion.md` §4/§8/§9(2026-08-17 源码级核对版)
6
-
7
- ## 0. 背景与问题定位
8
-
9
- **Prime Agent 机制考证结论(DASHR 的参照系)**:
10
-
11
- - 触发公式:`contextTokens > window − reserveTokens(16384)`;**`window` 就是模型目录里的 `contextWindow`**(deepseek-v4-pro = 1e6 → 触发点 ≈ 98.36 万),不是框架自己设定的独立门槛。
12
- - 可配置项全集只有 `enabled / reserveTokens / keepRecentTokens / agentCallable`——**不存在独立的 recency 变量**。
13
- - 压缩 ≠ 销毁:session JSONL 全量留盘,损失发生在热上下文;但摘要链式累积、预算 ≈ 13K tokens,语义/细节损失不可逆。
14
- - kernel 变量需要模型**显式写入**,存在远见盲区("你不可能知道你不知道的东西")。
15
-
16
- **DASHR 现状映射**(`dashr/src/compaction-surface.ts`):
17
-
18
- - `compactIfNeeded(agent, trigger: 'pressure' | 'context-overflow')`——自动压缩入口,阈值由宿主引擎(dsh-compaction-basic)决定;低于阈值是 `null` no-op。
19
- - `compactNow(agent, ...)`——显式 `/compact` 入口(busy-gated)。
20
- - `ctx.tokenMeter.measure(session)` → `totalTokens`——压力可测,阈值不可配。
21
- - DASHR 侧引擎(design A):`BasicCompactionEngine`(compactModel = 压缩大模型)。
22
-
23
- **由此引出两个待开发点**:
24
-
25
- - **P1**:没有独立滑动窗口 → 压缩只在大模型上限附近触发,运营者无法控制 recency 质量("被模型上限倒逼的窗口",不是设计的窗口)。
26
- - **P2**:压缩语义损失不可逆——例如某轮 agent response 10KB 被摘要成 2KB,摘要质量与关键字保留不可控;而 kernel 常驻变量需要模型在损失发生**之前**自觉写入,该自觉不可靠。
27
-
28
- **用户裁定(上限声明)**:信息损失不可逆,最多只能做到——压缩时**强制归档原文到 kernel 变量** + 摘要尾部**打标记**;让后续大模型在看到摘要时自行判断"有没有必要调用这个原始上下文"。此为本 feature 的目标,不承诺更多。
29
-
30
- ## 0.5 开发前重点调研:Comparison Basis(引擎机制已核实 2026-08-17)
31
-
32
- > 用户指定:开发本 feature 前必须先调研的部分。以下为 dsh-compaction-basic 源码级核实结果,剩余未决项见 §3。
33
-
34
- **被动压缩的触发机制("每轮都会检查"确认)**:`BasicCompactionEngine._registerAutomaticCompaction()` 注册 `ctx.on("agent/pre-step", ...)` —— **每个 agent step 之前**调用 `compactIfNeeded(agent, "pressure")`。溢出路径:`agent/request-error`(CONTEXT_WINDOW_EXCEEDED)→ `compactIfNeeded(agent, "context-overflow")`。
35
-
36
- **现状阈值(关键事实)**:
37
- - 阈值 = `thresholdTokens = floor(modelContextWindow × thresholdRatio)`,默认 `thresholdRatio = 0.8`(per-model 可覆盖,见 `modelPolicies`)。**没有绝对 token 阈值配置键**——阈值永远是"模型窗口 × 比例"。
38
- - 保留 = `retainTokens`(绝对键**已存在**)否则 `floor(window × retainRatio)`,默认 `retainRatio = 0.16`(1M 模型 = 160K!)。
39
- - 触发检查是单次比较:`measurement.totalTokens < spec.thresholdTokens → return null`(no-op)。
40
- - 校验已内建:`retainTokens >= thresholdTokens` 直接抛 `TargetPressureConfigError`(retention 必须 < threshold)。
41
- - 摘要预算 `maxTokens` 默认 8192。
42
-
43
- **token 计量口径**:`ctx.tokenMeter.measure(session).totalTokens` = 最近一次耐用请求 envelope 定价(含 system prompt/tools/messages,即"everything")+ surface 节点折叠。**surface 节点 = 对话消息**(system prompt 是请求时组装、不在 surface 上 → 永不进压缩区间 ✓);**首条 user 消息是 surface 节点,可被压缩**(与"User Prompt 一定保留"的假设不符——其内容只靠摘要质量保全;这正是 Feature 2 归档 user_requests 的理由)。
44
-
45
- **集成面结论(两条路径共用)**:
46
- - 引擎是 `BasicCompactionEngine extends CompactionEngine`;官方注释:`compactIfNeeded` **动态分发,子类 override 会被事件时刻尊重**;`summarize()` 是唯一声明子类化钩子。
47
- - `selectCompactableRange`(从尾部回攒 retainTokens + tool-pairing 边界保护)是模块私有函数——子类自行触发低于阈值压缩时需复刻(约 20-30 行,可用 session.surface + tokenMeter 复现)。
48
- - Feature 2 的摘要后编辑口:`compactSurfaceRegion` 产 `compaction/start → compaction/summary → compaction/end` 事件;摘要落盘前是否可插(wrapper/事件改写)尚未验证——**待调研项**。
49
- - 标准 preset 的 compaction realm:`compaction-basic`(无配置=全默认 auto:true)+ `command-compact` + `tool-result-pruner`(thresholdChars 8192/4096/1024),isolate: {compaction, toolResultPruner}。
50
-
51
- **实现路径:用户裁定 2026-08-17 = 方案 B(子类化)**。否决 A(fork 维护代价);C(上游 PR)留作长期收尾。
52
-
53
- 方案 B 的官方依据(上游注释原文):`compactIfNeeded` 动态分发,"subclass overrides are honored at event time"。关键利好:配对守卫 `toolPairingBalancedBefore` 是 `@deepseek-ai/dsh-compaction` 的**公开导出**(dsh-rlm-mode 已有该 peer),无需复刻——真正要写的只有选区间循环(约 15 行)+ `compactIfNeeded` override(约 20 行)+ 配置剥离。子类路径所需的上游私有函数(`resolveTargetPolicy` / `selectCompactableRange` / `routedTarget`)全部绕开:recency 是**绝对值**,不需要模型窗口/策略解析;保留尾用全局 `retainTokens` 绝对值。
54
-
55
- **干预/还手语义(用户 Q1/Q2,2026-08-17 源码级裁定)**:
56
-
57
- - **未触发分支 = 纯介入比较 + 完全还手**:`override compactIfNeeded` 里先比较 `totalTokens < recencyWindowTokens`,未触发则 `return super.compactIfNeeded(agent, trigger, signal)`——原生逻辑原封不动接管(其 0.8×window 阈值检查、prune、选区间、摘要、事件落盘全部原生)。这正是"只负责介入比较、比较 pass 之后直接还给它"。
58
- - **触发分支无法还手给原生 pressure 路径**:原生内部有硬阈值检查(`measurement < spec.thresholdTokens → return null`),recency 低于原生阈值时还手 = no-op。唯一强制入口是 `trigger='context-overflow'`,但其语义是 `retainTokens=0` 的最大化压缩(只留最后一个节点),破坏 50K 保留语义,不可用。
59
- - **触发分支的最小干预**:我们只做选区间(15 行,替代原生模块私有的 `selectCompactableRange`),产出 `{start, end}` seq 后交给**原生公开方法 `this.compactRegion(start, end, agent, signal)`**。下游全原生:`validateSurfaceRegion`(区间存在性 + 配对复查)→ 并发锁(assertCompactionInactive,compaction/start 即持久锁)→ 摘要(compactModel)→ surface 区间替换为 summary 节点 → compaction/end。原生没有 keepRecent 概念——它只认区间;我们把 retainTokens 翻译成区间,等价于只替换了原生 selector 这一个函数。
60
-
61
- **单位换算说明**:1 token ≈ 4 英文字符(≈4 bytes);中文 ≈ 1-1.5 字符/token(≈3-5 bytes)。即 1 token ≈ 1.5-4 bytes(用户估算的 1.x-2 是下界)。500K **tokens** ≈ 1-2MB 混合文本。**结论:配置保持 tokens 单位**(与 retainTokens/thresholdRatio/meter 全链路一致),不做 byte→token 内置换算——换算随语言漂移,且 meter 本身是估算(chars/4 级精度),换算会制造虚假精度。默认值 500K tokens 即可(用户:先跑机制,exact 取值交给实际用户)。
62
-
63
- ## 1. Feature 1: 真正的滑动窗口设置变量
64
-
65
- ### 1.1 设计(2026-08-17 用户方向 + 源码核实)
66
-
67
- - **命名**:配置键 `recencyWindowTokens`(tokens),用户侧显示名 **Context Recency Window(CTX Recency Window)**。缺省/未设 = 现状行为(引擎阈值 = 0.8 × 模型窗口),默认关闭、行为逐字节一致。
68
- - **触发机制**:不区分 post/pre-execution——直接在被动压缩的**既有检查点**(`agent/pre-step` → `compactIfNeeded('pressure')`)上把单次比较改为**双阈值 OR**:
69
- `触发 ⇔ totalTokens > recencyWindowTokens(阈值一) OR totalTokens > thresholdRatio × modelContextWindow(阈值二,现状不变)`
70
- 数学上等价于 `totalTokens > min(阈值一, 阈值二)`,**无需比较两个窗口谁大谁小**:模型窗口小(250K)→ 阈值二先触发;模型窗口大(1M)→ 阈值一先触发。与用户例子完全一致。
71
- - **不设硬约束**:无"recency < modelWindow − reserve"的启动校验。recency > 模型窗口时由阈值二兜底,天然安全。唯一依赖的是引擎已有守卫:`selectCompactableRange` 在 `keepFromIdx === 0` 时返回 null(无可压缩区间 → no-op,不崩溃)。
72
- - **reserve 说明**:dsh 没有 reserveTokens 概念——0.8 比例即内建余量。阈值一的比较值建议直接取 `recencyWindowTokens`(余量由运营者定值时的保守程度承担),不做 `−16384`。
73
- - **两个变量并存(用户裁定,合并方案已否决)**:
74
- - (a) `recencyWindowTokens`:全局可配置的**触发**阈值(上限);
75
- - (b) `retainTokens`:无论压缩来自 pressure/overflow/manual,每次执行后保留的**就近上下文目标值**(下限)。
76
- 合并则退化:阈值 500K、触发于 480K、压缩后仍保留 480K = 无压缩。且上游校验已强制 `retainTokens < thresholdTokens`,两变量不变量已机器化。
77
- - **retainTokens 调大**:20K(Prime Agent 默认;dsh 实际默认是 0.16×窗口)→ **50K 绝对 tokens**。dsh 的 `retainTokens` 绝对键已存在——**纯 preset 配置,零代码**。
78
- - **口径澄清**:触发计量(totalTokens)含 system prompt/tools/消息 = everything;保留目标(retainTokens)只走 surface 消息节点——system prompt 组装于请求时、不在 surface 上,天然不计入保留;首条 user 消息在 surface 上、超尾会被压缩(由 Feature 2 归档兜底)。
79
- - **压缩后体积估算**:1M 模型、retainTokens=50K → 压缩后 = 摘要(≤8192)+ 50K 尾 + system prompt ≈ 60-90K,与用户估算一致;挂在 250K 旧模型上仍只占 ~三分之一窗口。
80
- - **配置通道("全局"如何落地)**:DASHR 插件配置 schema(`z.intersect`)新增 `recencyWindowTokens`(可选);apply() 里当该键存在时,把 design A 挂载的引擎从 `BasicCompactionEngine(auto:false)` 换成 `RecencyAwareCompactionEngine(auto:true, retainTokens 透传)`;preset 行 config 直接写 `recencyWindowTokens: 500000` + `retainTokens: 50000`。全局 = per-composition(preset 级),用户可改。
81
- - **recency 路径激活条件**:`recencyWindowTokens` 与绝对 `retainTokens` **必须同时配置**(recency 选择算法需要具体保留尾预算;只给 ratio 时委托上游路径)。构造时校验 `retainTokens < recencyWindowTokens`(镜像上游 `retainTokens < thresholdTokens` 的不变量,机器化)。
82
- - **双引擎并存语义**:标准 preset 的 compaction-basic(auto:true, 0.8×window)与 DASHR 的 recency 引擎(auto:true, 500K)各自监听 agent/pre-step,顺序执行。第一个压缩动作落地后 measurement 降到双阈值之下 → 第二个引擎 no-op。min() 语义由两个引擎的 no-op 守卫自然涌现,无需改标准行。
83
- - **未决**:recency 低于 system prompt 体积时的退化为每 step no-op 检查(可接受,或加软警告)。
84
-
85
- ### 1.15 命名与配置通道裁定(2026-08-17)
86
-
87
- - **配置键 = `recencyWindowTokens`**(候选 `ctxRecencyWindow` 否决)。三条理由:
88
- 1. DASHR 既有键的单位后缀是房规:时间 `*Ms`(runTimeoutMs…)、体积 `*Bytes`(maxOutputBytes、snapshotSizeCapBytes)——带单位后缀是既定风格;
89
- 2. 与上游引擎同级键 `retainTokens`/`maxTokens` 同族,且与 `retainTokens` 成对(触发阈值 / 保留尾),一眼可读关系;
90
- 3. `ctxRecencyWindow` 的 `ctx` 前缀在 cordis 代码库里读作 Context 成员(`ctx.*` 遍地),歧义大,且不含单位(K tokens/K bytes 之惑永久保留)。
91
- **用户可见显示名**仍为 "Context Recency Window / CTX Recency Window"——显示名与配置键分离,机器名带单位、人读名不带。
92
- - **值格式**:整数 tokens(如 500000),与 `retainTokens` 一致(zod `z.number().step(1).min(1)`);不接受 "500K" 字符串(YAML 无此字面量、上游 schema 是数字)。K 换算只写进 preset 注释。
93
- - **加载通道 = 插件配置(preset 行 config),不是 env、不是宿主 settings.json**:
94
- 1. preset 行 config 是 DASHR 现有调优键(compactModel/harnessDir/refineModel)的唯一家园,`recencyWindowTokens` + `retainTokens` 直接进 dashr-kernel 行的 `config:` 块,随 preset 分发(install.sh 无需再 sed——500K/50K 是通用默认,非机器特定);
95
- 2. **否决 env var**:项目已裁定"运行时无 env 变量"(kernel python 是 baked 值,env 只留 `?? 'python3'` 兜底);调优旋钮走 env 会打破"preset 是单一事实源";
96
- 3. **否决宿主 settings.json**:settings.json 属 host-plane(provider/凭证/端口),compaction 策略是 composition 所属(compaction realm 在 preset 内,标准 preset 拥有 compaction-basic 行);放 settings.json 还会强制所有 preset 同一值,与"per-composition 全局"语义不符(用户"全局"= 该 composition 内跨模型一个旋钮,非 host 全局)。
97
- 4. 附带收益:插件 zod schema 声明后,dsh web 的 plugin settings UI(dsh-client-ui-settings-plugins)可直接渲染表单字段。
98
-
99
- ### 1.2 验证点
100
-
101
- - 1M 模型 + recency 500K:~500K 触发(阈值一);250K 模型 + recency 500K:~200K(0.8×250K)触发(阈值二)——两种顺序各测一次。
102
- - 不配 recencyWindowTokens 时行为与现状一致(默认关闭,对照实验)。
103
- - retainTokens=50K:压缩后表面 = 摘要 + ~50K 尾;`retainTokens < min(recency, 0.8×window)` 校验生效。
104
- - overflow 路径不受影响(`context-overflow` 绕过正常阈值与保留策略,仍为硬兜底)。
105
-
106
- ## 2. Feature 2: 压缩损失补偿(强制归档 + 摘要尾部标记)
107
-
108
- ### 2.1 拦截点(两条触发路径共用)
109
-
110
- 在"摘要执行之前"统一插入归档步骤:**取到将被摘要(shadow)的原始消息区间 → 分类 → 序列化 → 写 kernel**。归档完成后才交给引擎做摘要。归档失败时降级为现状行为(照常压缩、仅无标记),**不阻塞压缩**。
111
-
112
- ### 2.2 分类(纯机械,不是语义分类)
113
-
114
- | bucket | 来源 | 说明 |
115
- |---|---|---|
116
- | `user_requests` | user 消息 | 用户的指令原文 |
117
- | `assistant_responses` | assistant 消息 | 正文 verbatim;thinking 块剥除(见开放问题) |
118
- | `tool_results` | toolResult 消息 | 含 cell stdout |
119
- | `file_ops` | 机械提取 | read/modified 列表(引擎已有该追踪) |
120
-
121
- **"分类"是机械强制,不是语义判断**:每条消息按角色恰好落一个桶,无模型参与——语义分类是摘要模型的工作,归档层不做。这是"强制"二字的含义:不依赖模型意愿,不依赖判断质量。
122
-
123
- ### 2.3 写入形态
124
-
125
- - **单一稳定变量名 `dashr_compaction_archive`**(dict,key = compactionId/时间戳),标记里只引用一个名字,模型认知成本最低:
126
-
127
- ```python
128
- dashr_compaction_archive["<compactionId>"] = {
129
- "meta": {"at": ..., "reason": "pressure|context-overflow|manual", "seqs": [...], "tokens": N},
130
- "user_requests": [{"seq":..., "ts":..., "text":...}, ...],
131
- "assistant_responses": [{"seq":..., "ts":..., "text":...}, ...],
132
- "tool_results": [{"seq":..., "ts":..., "tool":..., "text":...}, ...],
133
- "file_ops": [{"seq":..., "op":..., "path":...}, ...],
134
- }
135
- ```
136
-
137
- - 写入通道:沿用 bootstrap 模式(`bootstrap.ts` / `python.ts` 的 `_dashr_*` helper),注入 `_dashr_archive_compaction(payload_json)`;TS 侧把归档区间序列化为 JSON,经 `IPythonCodeRuntime` 的 executeCell 执行赋值。JSON 序列化——安全、可被模型用 `print`/`json` 回看。
138
- - 持久性:kernel dill 快照已覆盖重启恢复;可选按会话目录落一份 JSON 镜像(防 kernel 死亡)。
139
- - 成本:只占 kernel 内存;**不查询就不进上下文**,上下文成本 = 0。
140
-
141
- ### 2.4 摘要尾部标记
142
-
143
- 摘要产出后,机械追加固定格式标记块(不依赖摘要模型自觉):
144
-
145
- ```
146
- [compaction archive]
147
- 本轮压缩的原始上下文已完整写入 kernel 变量 dashr_compaction_archive["<compactionId>"]:
148
- assistant_responses ×N / tool_results ×N / user_requests ×N / file_ops ×N
149
- 需要原文细节时用 run_cell 读取,例如:
150
- print(dashr_compaction_archive["<compactionId>"]["assistant_responses"][0])
151
- ```
152
-
153
- - **目的**(用户原话精神):让后续模型在看到摘要时,能**判断"我有没有必要去调用这个原始上下文"**。标记提供的是**可判断性**,不是自动恢复——是否回看仍是模型的决策。
154
- - **集成风险(已解决 2026-08-20)**:原担心「需要引擎摘要产出的后编辑口」——已实证:落盘前无插入口(surface 深冻结 append-only),但落盘后**单节点 `replace`(start===end===摘要节点 seq)**可等效改写摘要文本(这正是上游 compaction 改历史同一机制);且被 shadow 原文在 append-only log 中事后完整可读,归档无需在压缩前捕获。细节与代码骨架见 `dev/recallable-compaction.md` §1/§3。备选方案(紧随 summary 追加独立消息)亦天然可行,但不再需要。
155
-
156
- ### 2.5 不解决什么(诚实边界——用户已裁定为上限)
157
-
158
- 1. **损失不可逆**:归档不防止损失,只让原文**可恢复**。
159
- 2. **摘要质量不可控**:10KB → 2KB 摘要的质量、关键字保留率,无人可控。
160
- 3. **检索缺口依旧**:模型仍需决定去查。标记只把"想不起来查"降级为"知道能查",把"永久失忆"降级为"可恢复但需要主动想起"。
161
- 4. 归档**永不自动**进上下文;标记成本 = 每次压缩约 1 行文本。
162
-
163
- ## 3. 开放问题(实现前定)
164
-
165
- 1. **实现路径 A/B/C**(fork / 子类化 / 上游 PR)——§0.5,Feature 1 开工前必须先定。
166
- 2. **阈值一的比较值**:直接 `totalTokens > recencyWindowTokens`(推荐)还是 `> recencyWindowTokens − 16384`(仿 PA reserve)。
167
- 3. **Feature 2 摘要后编辑口**:~~待验证~~ → **已解决(2026-08-20)**:`compactSurfaceRegion` 的 summary 事件无落盘前插入口,但落盘后单节点 replace 等效改写;原文可事后从 append-only log 读取(`session.events[shadowedSeqs]`)。结论与推荐实现见 `dev/recallable-compaction.md`。
168
- 4. **归档增长上限**:跨多次压缩无限增长 → 策略候选:保留最近 N 档 / 总字节上限 / 提供手动清理 binding。
169
- 5. **thinking 块**:`assistant_responses` 剥不剥 thinking?(剥 = 省空间但丢推理过程;留 = 原文完整但翻倍体积)
170
- 6. **标记格式与 token 预算**:标记块精确措辞、是否进摘要 token 预算。
171
- 7. **与 V2 post-execute 内容替换(pruner)的交互**:归档在替换前还是后取数。
172
- 8. **compactionId 稳定性**:标记引用的 key 在 kernel 重启/会话恢复后是否仍可解析。
173
- 9. **recency 低于 system prompt 体积**:每 step 触发 no-op 检查(守卫已存在);是否加软警告。
174
-
175
- ## 4. 验证计划(实现时执行)
176
-
177
- - **单元**:分类逻辑(每条消息恰落一桶)、标记格式、compactWindow 触发算式、越界校验。
178
- - **e2e**:灌满上下文 → 触发压缩(两条路径各测一次)→ 断言:
179
- 1. kernel 里存在 `dashr_compaction_archive["<id>"]` 且含被压缩区间原文;
180
- 2. 摘要尾部含标记块;
181
- 3. prompt 模型"回看变量并复述原文某细节"成功(证明可调用性)。
182
- - **回归**:未配 compactWindow / 未配归档时,行为与现状一致(默认全关)。
183
- - 测试只增不减(现有 140/140 不动)。
184
-
185
- ## 5. 参考
186
-
187
- - `agent-harness/21_CLI-Agent/04_prime-agent/04_prime-agent-paradigm-discussion.md` §4/§8/§9(滑动窗口=模型上限投影的源码证据、压缩语义损失讨论)
188
- - `dashr/src/compaction-surface.ts`(compactIfNeeded / compactNow / tokenMeter 面)
189
- - `dashr/src/runtime.ts`(IPythonCodeRuntime / executeCell)、`bootstrap.ts` + `python.ts`(`_dashr_*` 注入模式)
190
-
191
- ## 附录 A. 方案 B 代码骨架(2026-08-17 草案,未实现)
192
-
193
- ```ts
194
- // dashr/src/compaction/recency-engine.ts(草案)
195
- import { BasicCompactionEngine } from '@deepseek-ai/dsh-compaction-basic'
196
- import { toolPairingBalancedBefore } from '@deepseek-ai/dsh-compaction'
197
- import type { Service } from 'cordis'
198
-
199
- export class RecencyAwareCompactionEngine extends BasicCompactionEngine {
200
- private readonly recencyWindowTokens: number | null
201
-
202
- constructor(ctx: Context, config: Record<string, unknown> = {}) {
203
- // 上游 resolveConfig → validateKeys 会拒绝未知键,recency 键必须在这里剥离
204
- const { recencyWindowTokens, ...upstreamConfig } = config
205
- super(ctx, upstreamConfig) // auto:true 时上游构造器注册 pre-step 监听
206
- this.recencyWindowTokens = recencyWindowTokens ?? null
207
- if (recencyWindowTokens != null) {
208
- if (this.config.retainTokens === undefined) {
209
- throw new Error('RecencyAwareCompactionEngine: recencyWindowTokens requires absolute retainTokens')
210
- }
211
- if (this.config.retainTokens >= recencyWindowTokens) {
212
- throw new Error(`RecencyAwareCompactionEngine: retainTokens (${this.config.retainTokens}) must be less than recencyWindowTokens (${recencyWindowTokens})`)
213
- }
214
- }
215
- }
216
-
217
- override async compactIfNeeded(agent, trigger, signal) {
218
- // 非 pressure(overflow 兜底)或未配置 recency / 无绝对保留 → 完全委托上游
219
- if (trigger !== 'pressure' || this.recencyWindowTokens === null || this.config.retainTokens === undefined) {
220
- return super.compactIfNeeded(agent, trigger, signal)
221
- }
222
- // ── recency 路径:镜像上游 pressure 流程,阈值换成绝对值 ──
223
- const meter = this.ctx.tokenMeter
224
- let measurement = meter.measure(agent.session)
225
- if (measurement.totalTokens < this.recencyWindowTokens) {
226
- // 未到 recency 阈值:交给上游 0.8×window 阈值(阈值二的 OR 语义)
227
- return super.compactIfNeeded(agent, trigger, signal)
228
- }
229
- const prune = this.ctx.get('toolResultPruner')
230
- if (prune !== undefined) {
231
- prune.pruneSession(agent.session)
232
- measurement = meter.measure(agent.session) // prune 可能已压回阈值下
233
- }
234
- if (measurement.totalTokens < this.recencyWindowTokens) return null
235
- const range = selectRecencyRange(agent.session, measurement, this.config.retainTokens)
236
- if (range === null) return null // 无可压缩区间(全在保留尾内)
237
- return this.compactRegion(range.start, range.end, agent, signal)
238
- // 注:compactRegion 是上游公开方法,内部会再次校验配对边界与并发守卫
239
- }
240
- }
241
-
242
- /**
243
- * 复刻上游 selectCompactableRange(模块私有)的选区间逻辑。
244
- * 唯一依赖的"守卫"是 @deepseek-ai/dsh-compaction 的公开导出。
245
- */
246
- function selectRecencyRange(session, measurement, retainTokens) {
247
- const nodes = measurement.nodes // [{seq, tokens}] 模型可见顺序
248
- const surfaceSeqs = session.surface.nodes // [seq...] 当前表面
249
- if (nodes.length === 0) return null
250
- if (nodes.length !== surfaceSeqs.length ||
251
- nodes.some((node, i) => node.seq !== surfaceSeqs[i])) {
252
- throw new Error('compaction: token-meter surface does not match the current session surface')
253
- }
254
- // 1) 从尾部往回攒够 retainTokens → 保留尾起点 keepFrom
255
- let accumulated = 0
256
- let keepFrom = nodes.length
257
- for (let i = nodes.length - 1; i >= 0; i--) {
258
- accumulated += nodes[i].tokens
259
- keepFrom = i
260
- if (accumulated >= retainTokens) break
261
- }
262
- if (keepFrom === 0) return null // 整个 surface 都在保留尾内 → 无区间
263
- // 2) 边界下移直到不切开 tool-call/result 配对
264
- while (keepFrom > 0 && !toolPairingBalancedBefore(session, surfaceSeqs[keepFrom])) {
265
- keepFrom--
266
- }
267
- if (keepFrom === 0) return null
268
- // 3) 压缩区间 = [surface 头, keepFrom−1]
269
- return { start: surfaceSeqs[0], end: surfaceSeqs[keepFrom - 1] }
270
- }
271
- ```
272
-
273
- **挂载**(apply() 内,design A 处替换):`recencyWindowTokens` 存在时构造 `RecencyAwareCompactionEngine(ctx, { ...引擎配置, recencyWindowTokens, auto: true })`,否则维持现状 `BasicCompactionEngine(auto:false)`。动态 import 保持不变(optional peer 不加载路径不变)。
274
-
275
- **spike 清单(2026-08-17 live 全部通过,webtest profile + rlm-mode-live preset,recency=2000/retain=500 测试值)**:
276
- 1. ✅ 隔离 realm 收到根 `agent/pre-step`——压缩真实触发(cordis 机制:子上下文经原型链共享 `_hooks` 注册表;`next` 链只在 `waterfall` 派发时存在,emit/parallel 无 next);
277
- 2. ✅ 双引擎并存:recency 引擎先触发、标准引擎 no-op,无冲突无错误;
278
- 3. ✅ `toolResultPruner` 向外解析正常;
279
- 4. ✅ live 会话产出合法 `compaction/start → compaction/summary → compaction/end` 事件链(10 个事件、3 轮压缩,shadowedSeqs 正确),摘要 checkpoint 进入 surface,**kernel 状态跨压缩存活(压缩前 `x = 42`,压缩后 cell 读出 42)**。
280
-
281
- **live spike 的操作教训(重要)**:
282
- - **profile 选择**:`DSH_PROFILE` 环境变量无效;自定义 profile 用 `dsh --profile <name> --port <port>`(root 命令形式)。`dsh web` 子命令不接受 --profile("boot the web profile" 硬编码 web)。教训:3082 曾静默运行在 web profile(旧 0.1.0 包)上,全部"矛盾现象"源于此——诊断前先验证进程 maps/lsof 确认实际加载的包路径。
283
- - **本地重装同一版本号不生效**:pnpm 对同路径同版本的 `file:` 依赖按 lock 缓存,不重新安装。本地迭代必须**递增版本号**(0.1.1-recv.N 系列),或删除 profile 的 pnpm-lock 条目。
284
- - **测试 profile 需要 `@deepseek-ai/dsh-web-app` bundle**:`dsh plugin --profile X add` 新建的 profile 只有 dsh-base,不绑 web 端口;手动把 `@deepseek-ai/dsh-web-app` 加进 profile package.json 的 `dsh.profile.bundles`(bundle 从宿主 node_modules 解析,无需 pnpm 安装)。
285
-
286
- ## 附录 B. dsh 压缩摘要结构调研(2026-08-17,用户 Q3)
287
-
288
- **结论:dsh 的摘要不是 free text,是固定 8 段的结构化 checkpoint**(`dsh-compaction-basic` 的 `COMPACTION_INSTRUCTION`)。
289
-
290
- 落盘形态:`<compacted-summary>` … `</compacted-summary>` 标签包裹 + 固定 preamble("This is an automatically generated checkpoint condensing an earlier span…Treat the captured context as established background and build on it without restating it…"),替换节点以 user message 形态回到 surface。
291
-
292
- 固定结构(顺序不可变、每段必出、空段写 "(none)"):
293
-
294
- 1. **Primary Request and Intent** — 用户原始与演进目标;措辞关键处要求 verbatim 引用
295
- 2. **Key Technical Concepts** — 技术/框架/模式/约定
296
- 3. **Files and Code** — 精确路径 + 为何重要 + 关键改动/片段
297
- 4. **Errors and Fixes** — 错误及解法 + 相关用户反馈
298
- 5. **Pending Jobs** — 已明确请求但未完成的工作
299
- 6. **Current Work** — 检查点时刻的进行中状态
300
- 7. **Next Step** — 单一的下一个动作(或 "(none)")
301
- 8. **Critical Context** — 决策及理由、约束、用户偏好、开放问题、续作所需数据
302
-
303
- 规则要点:terse bullets(非散文段落);精确保留路径/命令/错误串/标识符/函数签名/语法片段;忠实捕获用户反馈与修正;不提摘要行为本身;已有前 checkpoint 时不逐字复制——保留仍真的事实、丢弃过时的、在新结构下合并。
304
-
305
- **与 Prime Agent 对照**:PA 结构 = Goal / Constraints & Preferences / Progress(Done/In Progress/Blocked) / Key Decisions / Next Steps / Critical Context / read-files / modified-files。两者同为结构化 8 段、同一精神(目标/进度/下一步/关键上下文 + 负载段 verbatim);dsh 有 Errors and Fixes + Current Work(PA 用 Progress),PA 有 read/modified 文件台账(dsh 融进 Files and Code)。执行差异:dsh 的摘要指令作为**最终 user message 追加在重放的对话之后**、复用会话自己的 system prompt——是为了命中 provider KV cache(前缀不变);PA 用独立摘要 prompt + aux model。预算差异:dsh `maxTokens` 默认 8192 vs PA ≈13K。
306
-
307
- **对 Feature 2 的含义(记录备查)**:摘要节点是一个带标签的 user message——归档标记的追加点 = 该节点内容尾部(`</compacted-summary>` 之后或节点内追加),比"改写引擎"更简单;待实现时验证事件后编辑口即可。