better-dsh 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/cordis.patch.yml +1 -1
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-local-test-report.md +44 -0
  15. package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md +110 -0
  16. package/docs/50_test-reports/upstream-dsh-0.1.5-rc.2-local-test-report.md +79 -0
  17. 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
  18. 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
  19. 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
  20. package/docs/specs/agent/spec.md +54 -0
  21. package/docs/specs/ast/spec.md +34 -0
  22. package/docs/specs/compaction-recall/spec.md +46 -0
  23. package/docs/specs/ctx/spec.md +107 -0
  24. package/docs/specs/dsh/spec.md +47 -0
  25. package/docs/specs/dvc/spec.md +87 -0
  26. package/docs/specs/escalation-guidance/spec.md +44 -0
  27. package/docs/specs/fs-scheme-resolution/spec.md +37 -0
  28. package/docs/specs/hash-edit/spec.md +41 -0
  29. package/docs/specs/http-read/spec.md +73 -0
  30. package/docs/specs/kernel-provisioning/spec.md +53 -0
  31. package/docs/specs/lsp/spec.md +121 -0
  32. package/docs/specs/mobile-layout/spec.md +108 -0
  33. package/docs/specs/model-failover/spec.md +20 -0
  34. package/docs/specs/preact-ui-shell/spec.md +22 -0
  35. package/docs/specs/repl-dispatch-resilience/spec.md +21 -0
  36. package/docs/specs/skill/spec.md +58 -0
  37. package/docs/specs/tool-surface/spec.md +222 -0
  38. package/docs/specs/url-schema/spec.md +148 -0
  39. package/docs/specs/web-trust-fence/spec.md +43 -0
  40. package/docs/upstream-dsh-0.1.5-rc.2-report.md +156 -0
  41. package/dsh-docs/AGENTS.md +75 -0
  42. package/dsh-docs/agent-lifecycle.md +84 -0
  43. package/dsh-docs/agent-lifecycle.zh.md +86 -0
  44. package/dsh-docs/api-gateway.md +164 -0
  45. package/dsh-docs/api-gateway.zh.md +164 -0
  46. package/dsh-docs/architecture.md +150 -0
  47. package/dsh-docs/architecture.zh.md +154 -0
  48. package/dsh-docs/capability-seams.md +543 -0
  49. package/dsh-docs/capability-seams.zh.md +545 -0
  50. package/dsh-docs/config-catalog.md +3473 -0
  51. package/dsh-docs/config-catalog.zh.md +3474 -0
  52. package/dsh-docs/cookbook/adding-a-package.md +117 -0
  53. package/dsh-docs/cookbook/adding-a-package.zh.md +119 -0
  54. package/dsh-docs/cookbook/adding-a-remote-api.md +197 -0
  55. package/dsh-docs/cookbook/adding-a-remote-api.zh.md +197 -0
  56. package/dsh-docs/cookbook/adding-a-session-format-version.md +109 -0
  57. package/dsh-docs/cookbook/adding-a-session-format-version.zh.md +109 -0
  58. package/dsh-docs/cookbook/adding-a-settings-card.md +102 -0
  59. package/dsh-docs/cookbook/adding-a-settings-card.zh.md +102 -0
  60. package/dsh-docs/cookbook/adding-a-tool.md +101 -0
  61. package/dsh-docs/cookbook/adding-a-tool.zh.md +103 -0
  62. package/dsh-docs/cookbook/adding-a-vendored-package.md +59 -0
  63. package/dsh-docs/cookbook/adding-a-vendored-package.zh.md +59 -0
  64. package/dsh-docs/cookbook/adding-an-llm-adapter.md +43 -0
  65. package/dsh-docs/cookbook/adding-an-llm-adapter.zh.md +43 -0
  66. package/dsh-docs/cookbook/extension-cookbook.md +132 -0
  67. package/dsh-docs/cookbook/extension-cookbook.zh.md +136 -0
  68. package/dsh-docs/cookbook/maintaining-dsh-code-review.md +64 -0
  69. package/dsh-docs/cookbook/maintaining-dsh-code-review.zh.md +64 -0
  70. package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
  71. package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
  72. package/dsh-docs/cordis-api/context.md +364 -0
  73. package/dsh-docs/cordis-api/context.zh.md +366 -0
  74. package/dsh-docs/cordis-api/events.md +207 -0
  75. package/dsh-docs/cordis-api/events.zh.md +209 -0
  76. package/dsh-docs/cordis-api/fiber.md +375 -0
  77. package/dsh-docs/cordis-api/fiber.zh.md +377 -0
  78. package/dsh-docs/cordis-api/inherited.md +39 -0
  79. package/dsh-docs/cordis-api/registry.md +152 -0
  80. package/dsh-docs/cordis-api/registry.zh.md +154 -0
  81. package/dsh-docs/cordis-api/service.md +102 -0
  82. package/dsh-docs/cordis-api/service.zh.md +104 -0
  83. package/dsh-docs/cordis-primer.md +45 -0
  84. package/dsh-docs/cordis-primer.zh.md +51 -0
  85. package/dsh-docs/cordis-tutorial/01-first-plugin.md +95 -0
  86. package/dsh-docs/cordis-tutorial/01-first-plugin.zh.md +95 -0
  87. package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  88. package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +98 -0
  89. package/dsh-docs/cordis-tutorial/03-services.md +98 -0
  90. package/dsh-docs/cordis-tutorial/03-services.zh.md +98 -0
  91. package/dsh-docs/cordis-tutorial/04-events.md +144 -0
  92. package/dsh-docs/cordis-tutorial/04-events.zh.md +144 -0
  93. package/dsh-docs/cordis-tutorial/05-config.md +84 -0
  94. package/dsh-docs/cordis-tutorial/05-config.zh.md +84 -0
  95. package/dsh-docs/cordis-tutorial/06-composition-and-hmr.md +113 -0
  96. package/dsh-docs/cordis-tutorial/06-composition-and-hmr.zh.md +113 -0
  97. package/dsh-docs/cordis-tutorial/07-into-the-harness.md +108 -0
  98. package/dsh-docs/cordis-tutorial/07-into-the-harness.zh.md +108 -0
  99. package/dsh-docs/cordis-tutorial/index.md +60 -0
  100. package/dsh-docs/cordis-tutorial/index.zh.md +62 -0
  101. package/dsh-docs/deepseek-llm-api-wire-extensions.md +163 -0
  102. package/dsh-docs/deepseek-llm-api-wire-extensions.zh.md +163 -0
  103. package/dsh-docs/defensive-patterns.md +33 -0
  104. package/dsh-docs/defensive-patterns.zh.md +35 -0
  105. package/dsh-docs/development.md +167 -0
  106. package/dsh-docs/development.zh.md +173 -0
  107. package/dsh-docs/event-producer-consumer.md +86 -0
  108. package/dsh-docs/event-producer-consumer.zh.md +88 -0
  109. package/dsh-docs/glossary.md +45 -0
  110. package/dsh-docs/glossary.zh.md +45 -0
  111. package/dsh-docs/graph-atlas.md +22 -0
  112. package/dsh-docs/graph-atlas.zh.md +24 -0
  113. package/dsh-docs/i18n/README.md +60 -0
  114. package/dsh-docs/i18n/README.zh.md +62 -0
  115. package/dsh-docs/i18n/style-samples.md +87 -0
  116. package/dsh-docs/i18n/terminology.md +214 -0
  117. package/dsh-docs/i18n/translation-prompt.md +263 -0
  118. package/dsh-docs/i18n/translation-rules.md +69 -0
  119. package/dsh-docs/i18n/translation-rules.zh.md +69 -0
  120. package/dsh-docs/module-graph.md +1411 -0
  121. package/dsh-docs/module-graph.zh.md +1413 -0
  122. package/dsh-docs/persistence-catalog.md +1075 -0
  123. package/dsh-docs/persistence-catalog.zh.md +1077 -0
  124. package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.md +113 -0
  125. package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
  126. package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
  127. package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
  128. package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
  129. package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
  130. package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
  131. package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
  132. package/dsh-docs/postmortem/README.md +18 -0
  133. package/dsh-docs/postmortem/README.zh.md +18 -0
  134. package/dsh-docs/rescope.md +53 -0
  135. package/dsh-docs/rescope.zh.md +53 -0
  136. package/dsh-docs/session-format-status.md +47 -0
  137. package/dsh-docs/session-format-status.zh.md +47 -0
  138. package/dsh-docs/subsystems/README.md +61 -0
  139. package/dsh-docs/subsystems/README.zh.md +61 -0
  140. package/dsh-docs/subsystems/agent-team.md +207 -0
  141. package/dsh-docs/subsystems/agent-team.zh.md +207 -0
  142. package/dsh-docs/subsystems/approval.md +170 -0
  143. package/dsh-docs/subsystems/approval.zh.md +170 -0
  144. package/dsh-docs/subsystems/attachment.md +351 -0
  145. package/dsh-docs/subsystems/attachment.zh.md +351 -0
  146. package/dsh-docs/subsystems/client-modules.md +168 -0
  147. package/dsh-docs/subsystems/client-modules.zh.md +168 -0
  148. package/dsh-docs/subsystems/client-resources.md +91 -0
  149. package/dsh-docs/subsystems/client-resources.zh.md +91 -0
  150. package/dsh-docs/subsystems/code-runtime.md +195 -0
  151. package/dsh-docs/subsystems/code-runtime.zh.md +195 -0
  152. package/dsh-docs/subsystems/commands.md +219 -0
  153. package/dsh-docs/subsystems/commands.zh.md +219 -0
  154. package/dsh-docs/subsystems/compaction.md +238 -0
  155. package/dsh-docs/subsystems/compaction.zh.md +238 -0
  156. package/dsh-docs/subsystems/conversation.md +258 -0
  157. package/dsh-docs/subsystems/conversation.zh.md +258 -0
  158. package/dsh-docs/subsystems/core.md +1209 -0
  159. package/dsh-docs/subsystems/core.zh.md +1219 -0
  160. package/dsh-docs/subsystems/credentials.md +329 -0
  161. package/dsh-docs/subsystems/credentials.zh.md +329 -0
  162. package/dsh-docs/subsystems/extensions.md +382 -0
  163. package/dsh-docs/subsystems/extensions.zh.md +382 -0
  164. package/dsh-docs/subsystems/feedback.md +266 -0
  165. package/dsh-docs/subsystems/feedback.zh.md +266 -0
  166. package/dsh-docs/subsystems/filesystem.md +505 -0
  167. package/dsh-docs/subsystems/filesystem.zh.md +505 -0
  168. package/dsh-docs/subsystems/goal.md +277 -0
  169. package/dsh-docs/subsystems/goal.zh.md +277 -0
  170. package/dsh-docs/subsystems/invariants.md +88 -0
  171. package/dsh-docs/subsystems/invariants.zh.md +88 -0
  172. package/dsh-docs/subsystems/jobs.md +290 -0
  173. package/dsh-docs/subsystems/jobs.zh.md +290 -0
  174. package/dsh-docs/subsystems/llm-streaming.md +1080 -0
  175. package/dsh-docs/subsystems/llm-streaming.zh.md +1086 -0
  176. package/dsh-docs/subsystems/lsp.md +202 -0
  177. package/dsh-docs/subsystems/lsp.zh.md +202 -0
  178. package/dsh-docs/subsystems/permission-presets.md +131 -0
  179. package/dsh-docs/subsystems/permission-presets.zh.md +131 -0
  180. package/dsh-docs/subsystems/persistence.md +395 -0
  181. package/dsh-docs/subsystems/persistence.zh.md +395 -0
  182. package/dsh-docs/subsystems/plan.md +87 -0
  183. package/dsh-docs/subsystems/plan.zh.md +87 -0
  184. package/dsh-docs/subsystems/sandbox.md +220 -0
  185. package/dsh-docs/subsystems/sandbox.zh.md +220 -0
  186. package/dsh-docs/subsystems/schedule.md +192 -0
  187. package/dsh-docs/subsystems/schedule.zh.md +192 -0
  188. package/dsh-docs/subsystems/scope.md +59 -0
  189. package/dsh-docs/subsystems/scope.zh.md +59 -0
  190. package/dsh-docs/subsystems/session-projection.md +354 -0
  191. package/dsh-docs/subsystems/session-projection.zh.md +354 -0
  192. package/dsh-docs/subsystems/session-query.md +509 -0
  193. package/dsh-docs/subsystems/session-query.zh.md +509 -0
  194. package/dsh-docs/subsystems/session-reference.md +219 -0
  195. package/dsh-docs/subsystems/session-reference.zh.md +219 -0
  196. package/dsh-docs/subsystems/session-telemetry.md +194 -0
  197. package/dsh-docs/subsystems/session-telemetry.zh.md +194 -0
  198. package/dsh-docs/subsystems/session-title.md +204 -0
  199. package/dsh-docs/subsystems/session-title.zh.md +204 -0
  200. package/dsh-docs/subsystems/session.md +1155 -0
  201. package/dsh-docs/subsystems/session.zh.md +1159 -0
  202. package/dsh-docs/subsystems/settings.md +405 -0
  203. package/dsh-docs/subsystems/settings.zh.md +405 -0
  204. package/dsh-docs/subsystems/shell.md +303 -0
  205. package/dsh-docs/subsystems/shell.zh.md +303 -0
  206. package/dsh-docs/subsystems/sidebar-right.md +148 -0
  207. package/dsh-docs/subsystems/sidebar-right.zh.md +148 -0
  208. package/dsh-docs/subsystems/skills.md +354 -0
  209. package/dsh-docs/subsystems/skills.zh.md +354 -0
  210. package/dsh-docs/subsystems/slots.md +175 -0
  211. package/dsh-docs/subsystems/slots.zh.md +175 -0
  212. package/dsh-docs/subsystems/spill.md +117 -0
  213. package/dsh-docs/subsystems/spill.zh.md +117 -0
  214. package/dsh-docs/subsystems/storage.md +260 -0
  215. package/dsh-docs/subsystems/storage.zh.md +260 -0
  216. package/dsh-docs/subsystems/subagent.md +766 -0
  217. package/dsh-docs/subsystems/subagent.zh.md +770 -0
  218. package/dsh-docs/subsystems/subprocess.md +324 -0
  219. package/dsh-docs/subsystems/subprocess.zh.md +324 -0
  220. package/dsh-docs/subsystems/system-prompt.md +220 -0
  221. package/dsh-docs/subsystems/system-prompt.zh.md +220 -0
  222. package/dsh-docs/subsystems/terminal.md +184 -0
  223. package/dsh-docs/subsystems/terminal.zh.md +184 -0
  224. package/dsh-docs/subsystems/todo.md +32 -0
  225. package/dsh-docs/subsystems/todo.zh.md +32 -0
  226. package/dsh-docs/subsystems/token-meter.md +105 -0
  227. package/dsh-docs/subsystems/token-meter.zh.md +105 -0
  228. package/dsh-docs/subsystems/tools.md +720 -0
  229. package/dsh-docs/subsystems/tools.zh.md +720 -0
  230. package/dsh-docs/subsystems/typert.md +343 -0
  231. package/dsh-docs/subsystems/typert.zh.md +343 -0
  232. package/dsh-docs/subsystems/user-questions.md +178 -0
  233. package/dsh-docs/subsystems/user-questions.zh.md +178 -0
  234. package/dsh-docs/subsystems/web-client.md +95 -0
  235. package/dsh-docs/subsystems/web-client.zh.md +95 -0
  236. package/dsh-docs/subsystems/web-server.md +154 -0
  237. package/dsh-docs/subsystems/web-server.zh.md +154 -0
  238. package/dsh-docs/subsystems/web.md +206 -0
  239. package/dsh-docs/subsystems/web.zh.md +206 -0
  240. package/dsh-docs/subsystems/webhook.md +70 -0
  241. package/dsh-docs/subsystems/webhook.zh.md +70 -0
  242. package/dsh-docs/subsystems/workflow.md +278 -0
  243. package/dsh-docs/subsystems/workflow.zh.md +278 -0
  244. package/dsh-docs/subsystems/workspace.md +321 -0
  245. package/dsh-docs/subsystems/workspace.zh.md +321 -0
  246. package/dsh-docs/testing.md +54 -0
  247. package/dsh-docs/testing.zh.md +54 -0
  248. package/dsh-docs/tool-catalog.md +2225 -0
  249. package/dsh-docs/tool-catalog.zh.md +2233 -0
  250. package/dsh-docs/tool-execution-pipeline.md +62 -0
  251. package/dsh-docs/tool-execution-pipeline.zh.md +64 -0
  252. package/dsh-docs/user/develop/basic/config.md +106 -0
  253. package/dsh-docs/user/develop/basic/config.zh.md +106 -0
  254. package/dsh-docs/user/develop/basic/index.md +144 -0
  255. package/dsh-docs/user/develop/basic/index.zh.md +144 -0
  256. package/dsh-docs/user/develop/basic/publish.md +183 -0
  257. package/dsh-docs/user/develop/basic/publish.zh.md +183 -0
  258. package/dsh-docs/user/develop/basic/tool.md +52 -0
  259. package/dsh-docs/user/develop/basic/tool.zh.md +52 -0
  260. package/dsh-docs/user/develop/framework/events.md +143 -0
  261. package/dsh-docs/user/develop/framework/events.zh.md +143 -0
  262. package/dsh-docs/user/develop/framework/index.md +137 -0
  263. package/dsh-docs/user/develop/framework/index.zh.md +137 -0
  264. package/dsh-docs/user/develop/framework/service.md +148 -0
  265. package/dsh-docs/user/develop/framework/service.zh.md +150 -0
  266. package/dsh-docs/user/develop/practice/dynamic-cordis.md +15 -0
  267. package/dsh-docs/user/develop/practice/dynamic-cordis.zh.md +15 -0
  268. package/dsh-docs/user/develop/practice/index.md +155 -0
  269. package/dsh-docs/user/develop/practice/index.zh.md +155 -0
  270. package/dsh-docs/user/develop/practice/llm-adapter.md +189 -0
  271. package/dsh-docs/user/develop/practice/llm-adapter.zh.md +189 -0
  272. package/dsh-docs/user/guide/github-review.md +102 -0
  273. package/dsh-docs/user/guide/github-review.zh.md +102 -0
  274. package/dsh-docs/user/guide/index.md +30 -0
  275. package/dsh-docs/user/guide/index.zh.md +30 -0
  276. package/dsh-docs/user/guide/mcp-memory.md +101 -0
  277. package/dsh-docs/user/guide/mcp-memory.zh.md +101 -0
  278. package/dsh-docs/user/guide/network-proxy.md +85 -0
  279. package/dsh-docs/user/guide/network-proxy.zh.md +85 -0
  280. package/dsh-docs/user/guide/providers.md +190 -0
  281. package/dsh-docs/user/guide/providers.zh.md +190 -0
  282. package/dsh-docs/user/guide/python-sdk.md +150 -0
  283. package/dsh-docs/user/guide/python-sdk.zh.md +150 -0
  284. package/dsh-docs/user/guide/schedule.md +21 -0
  285. package/dsh-docs/user/guide/schedule.zh.md +21 -0
  286. package/dsh-docs/user/index.md +11 -0
  287. package/dsh-docs/user/index.zh.md +11 -0
  288. package/dsh-docs/web-styling.md +29 -0
  289. package/dsh-docs/web-styling.zh.md +29 -0
  290. package/eval-description.md +33 -0
  291. package/lib/client/index.js +327 -88
  292. package/lib/fs-aware/sandbox-plugin.d.ts +71 -0
  293. package/lib/fs-aware/sandbox-plugin.js +249 -0
  294. package/lib/index.d.ts +22 -22
  295. package/lib/index.js +3095 -3204
  296. package/lib/lsp-server-registry-DkaYmTwt.js +972 -0
  297. package/lib/lsp-server-registry-_hk-Wcia.js +3 -0
  298. package/lib/py-sdk-Chvy92MB.js +178 -0
  299. package/lib/py-sdk.d.ts +19 -2
  300. package/lib/py-sdk.js +2 -2
  301. package/lib/wrap-JFjcWwZf.js +747 -0
  302. package/package.json +9 -3
  303. package/url-schemes-instruction.md +22 -0
  304. package/control-prompt.md +0 -37
  305. package/docs/50_test-reports/v0.1.8d_artifacts/README.md +0 -138
  306. package/docs/50_test-reports/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
  307. package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
  308. package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
  309. package/docs/50_test-reports/v0.1.8d_artifacts/functions.json +0 -592
  310. package/docs/50_test-reports/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
  311. package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
  312. package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
  313. package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
  314. package/docs/50_test-reports/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
  315. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
  316. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
  317. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
  318. package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
  319. package/docs/50_test-reports/v0.2.0b_artifacts/hashline-probe.md +0 -5
  320. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
  321. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
  322. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
  323. package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
  324. package/docs/60_exploration-and-research/cordis-research.md +0 -350
  325. package/docs/60_exploration-and-research/dsh-web-profile-package-map.md +0 -186
  326. package/docs/60_exploration-and-research/dsh-web-ui-slot-system-research.md +0 -310
  327. package/docs/60_exploration-and-research/dsh-webui-strip-boundary-research.md +0 -300
  328. package/docs/60_exploration-and-research/ios-chat-app-bridge-research.md +0 -324
  329. package/docs/60_exploration-and-research/web-frontend-composability-research.md +0 -191
  330. 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
  331. package/docs/adr/0001-bridge-tool-layer-not-service-layer.md +0 -14
  332. package/docs/adr/0002-masking-is-presentation-only.md +0 -15
  333. package/docs/plans/A2A-messaging-channel-test-archive.md +0 -256
  334. package/docs/plans/code-mode-vs-rlm-ipython-comparison.md +0 -137
  335. package/docs/plans/dashr-blueprint-review.md +0 -201
  336. package/docs/plans/dashr-blueprint.md +0 -561
  337. package/docs/plans/dashr-compaction-window-and-archive.md +0 -307
  338. package/docs/plans/dashr-profile-layer-feasibility.md +0 -367
  339. package/docs/plans/dashr-sandbox-escalation-semantics-gap.md +0 -171
  340. package/docs/plans/dashr-security-sandbox-analysis.md +0 -187
  341. package/docs/plans/dashr-surface-invariant-and-omp-imports.md +0 -97
  342. package/docs/plans/ipython-kernel-interactive-interface-test-report.md +0 -152
  343. package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft.md +0 -146
  344. package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v3.md +0 -50
  345. package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v4.md +0 -79
  346. package/docs/plans/kernel-refactoring/Dash-vs-PrimeAgent-systemprompt-toolcatalog-comparison.md +0 -138
  347. package/docs/plans/kernel-refactoring/RLM-system-prompt-injection-gap-report.md +0 -161
  348. package/docs/plans/kernel-refactoring/V0.1.5-development-plan.md +0 -109
  349. package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_dsh.md +0 -50
  350. package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_prime.md +0 -113
  351. package/docs/plans/recallable-compaction.md +0 -147
  352. package/docs/plans/spike-tag-repro.mjs +0 -102
  353. package/docs/plans/upstream-analysis.md +0 -128
  354. package/docs/v0.1.8-improved-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -142
  355. package/docs/v0.1.8-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -193
  356. package/docs/v0.1.8b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -96
  357. package/docs/v0.1.8c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -127
  358. package/docs/v0.1.8d-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -150
  359. package/docs/v0.1.8d_artifacts/README.md +0 -138
  360. package/docs/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
  361. package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
  362. package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
  363. package/docs/v0.1.8d_artifacts/functions.json +0 -592
  364. package/docs/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
  365. package/docs/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
  366. package/docs/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
  367. package/docs/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
  368. package/docs/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
  369. package/docs/v0.1.8e-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -224
  370. package/docs/v0.1.9a-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -168
  371. package/docs/v0.2.0b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -123
  372. package/docs/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
  373. package/docs/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
  374. package/docs/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
  375. package/docs/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
  376. package/docs/v0.2.0b_artifacts/hashline-probe.md +0 -5
  377. package/docs/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
  378. package/docs/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
  379. package/docs/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
  380. package/docs/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
  381. package/docs/v0.2.1-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -110
  382. package/docs/v0.2.1b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -86
  383. package/docs/v0.2.1c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -66
  384. package/lib/py-sdk-BCaOGYz7.d.ts +0 -125
  385. package/lib/py-sdk-CbgYiX8O.js +0 -691
@@ -0,0 +1,246 @@
1
+ # hashline:false 配置下 URL scheme 可达性的**工具面不对称** — 实测报告
2
+
3
+ - 日期:2026-09-13
4
+ - 被测对象:`dashr/src/url-schemes/` 七类 URL scheme(`skill://`、`agent://`、`dsh://`、`ctx://`、`dvc://`、`http(s)://`)在**当前活体配置**下的 `read`/`grep`/`glob`/`write` 行为。
5
+ - 被测运行时:**本 agent 自己所在的活体实例** —— `dsh web` @ `http://127.0.0.1:4999`,`DSH_HOME=/home/u1/workspaces/dashr/.dsh-test`,`DSH_SESSION_ID=session-1ae1181e-abb7-4d59-939e-f5e0400a4258`,cwd `/home/u1/workspaces/dashr`。
6
+ - 方法:**第一人称实测**。全部调用由本 agent 在真实 runtime 中发出(`read`/`grep`/`glob`/`write` 工具),无静态推断。被观测返回值原文摘录于 §3。
7
+ - change:无(系统冒烟,非某 change 的验收)。
8
+ - 关联:`2026-09-12-fs-scheme-resolution-实测报告.md`、`2026-09-12-url-schemes-六scheme冒烟与边界实测报告.md`(差异见 §5)。
9
+
10
+ ---
11
+
12
+ ## 0. 结论速览
13
+
14
+ | 判定项 | 结果 |
15
+ |---|---|
16
+ | `dsh://` / `dvc://` / `http://` 在 `read` 上可达 | ✅ |
17
+ | `skill://` 在 `read` 上 | ✅ **已收口(2026-09-13 user 裁决后返工)**:不再查 registry——`isSessionLayerScheme` 在 `wrap.ts` 与 `sandbox-plugin.ts` 双处纳入 `skill://`,直接抛结构化 `CTX_SESSION_LAYER` 边界错误,文案可执行(指 `skill` 工具 / `grep`,`glob path=skill://…`);活的假 "unknown" 消失,`sessionCwd`/`scopedAwareSkills`/`URL_SKILL_NOT_INVOCABLE_SCOPE` 死代码在 src/副本/活体 bundle 全 0 命中(user 第二轮亲自复验) |
18
+ | `https://` 在 `read` 上可达 | ✅ 已修(`HTTP_SCHEMES` 循环登记)并两轮复验存活 |
19
+ | 同一批 scheme 在 `grep`/`glob` 上可达 | ✅ `ctx://`、`agent://`、`skill://`、`https://` 全部可达(§2、§3) |
20
+ | 根因 | **`hashline:false` 使 DASHR 的 `read` 包装不安装 → `read` 退化为平台原生工具 → 只剩 FS 层 resolver;`grep`/`glob`/`write` 包装仅由 `urlSchemes` 门控,仍在场 → 走工具层 resolver** |
21
+
22
+ **一句话**:不是 scheme 坏了,是**同一实例里 `read` 与 `grep`/`glob`/`write` 分属两套 resolver**。`hashline:false` 配置下,会话型(`ctx://`/`agent://`)只经 `grep`/`glob` 抵达,`read` 是死的;`https://` 更因 FS 层只登记了 `http` 而整条断掉。
23
+
24
+ > **2026-09-13 收口更新(user 第二轮复验确认)**:`https://` 已修(两轮活体存活);`skill://` 按业务逻辑归属裁决重分类为会话型边界(§4 P1-skill 处置块),行为收窄(全局技能亦不在 FS 层解析)但文案已指替代路径,`grep`/`glob` 回退复验通过。
25
+ ---
26
+
27
+ ## 1. 环境与配置锚定
28
+
29
+ ### 1.1 配置来源(profile 层唯一)
30
+
31
+ `.dsh-test/profiles/web/cordis.patch.yml`(0.1.5-rc.2 无 home patch 层,故 `.dsh-test/cordis.patch.yml` 空):
32
+
33
+ ```yaml
34
+ - id: dashr-repl
35
+ config:
36
+ python: !!js process.env.DASHR_KERNEL_PYTHON ?? 'python3'
37
+ snapshotDir: /home/u1/workspaces/dashr/.dsh-test/snapshots
38
+ hashline: false # ← 关键
39
+ urlSchemes: true
40
+
41
+ - id: fs-sandbox
42
+ name: './node_modules/better-dsh/lib/fs-aware/sandbox-plugin.js'
43
+ config:
44
+ urlSchemes: true
45
+ ```
46
+
47
+ ### 1.2 活体日志佐证
48
+
49
+ `.scratch/dsh-4999.log`(每个 session-start 一行):
50
+
51
+ ```
52
+ DEBUG-INSTALL gates: {"urlSchemes":true,"hashline":false}
53
+ ```
54
+
55
+ ### 1.3 工具面身份判定(决定性)
56
+
57
+ 当前 `read` 工具**不是** DASHR 的 URL-aware read:
58
+
59
+ | 证据 | 值 |
60
+ |---|---|
61
+ | 工具入参名 | `file_path`(DASHR 包装用 `path`,见 `url-schemes/tools/read.ts:92`) |
62
+ | 输出形态 | 行号前缀 `N: content`(DASHR 包装 scheme 分支返回原文、文件分支返回 `HASH│content`) |
63
+ | 包装注册门 | `url-schemes/index.ts:188` `if (gates.hashline) { …register(createReadTool…) }` → `hashline:false` 即不注册 |
64
+ | 注释自证 | `index.ts:158-159`:**"`hashline: false` → read wrapper 不安装(captured 原生 read 独立站立,scheme 解析由挂载的 FS 后端承担)"** |
65
+
66
+ `grep`/`glob`/`write` 的注册门是 `urlSchemes`(`index.ts:197`、`266-268`),故**仍在场**,走工具层 resolver。实测 `write dsh://config` 报的是 `url-schemes/tools/write.ts:130` 的文案、`write dvc://ast_grep` 成功派发,均可交叉印证工具层包装在场。
67
+
68
+ ### 1.4 两套 resolver 的登记差异(根因表)
69
+
70
+ | resolver | 构造点 | 登记 schemes | 环境字段 |
71
+ |---|---|---|---|
72
+ | **工具层**(read/grep/glob/write 包装消费) | `url-schemes/index.ts:283-328` | `skill`、`agent`、`dsh`、`dvc`、`ctx`、**`HTTP_SCHEMES = ['http','https']`** | `{ agent, cwd, rawUrl }`(`tools/read.ts:119-121`、`tools/grep.ts:69`) |
73
+ | **FS 层**(原生 read/grep/glob 经 `ctx.fs` 消费) | `fs-aware/wrap.ts:49-59` | `skill`、`dsh`、`dvc`、**仅字面 `http`** | 仅 `{ fs, rawUrl }`(`wrap.ts:81`,**无 agent/cwd**) |
74
+ | **FS 层会话型守卫** | `wrap.ts:37-46`、`99-115` | `ctx://`/`agent://` → 结构化 `CTX_SESSION_LAYER` | — |
75
+
76
+ 两处差异直接产生全部四个失败:`https` 未登记、`ctx`/`agent` 被守卫、`skill` 缺 `cwd`+`scope`。
77
+
78
+ ---
79
+
80
+ ## 2. scheme × 工具 可达性矩阵
81
+
82
+ (✅ 实测可达;❌ 实测失败;`—` 本轮未测)
83
+
84
+ | scheme | `read`(原生 / FS 层) | `grep`(工具层) | `glob`(工具层) | `write`(工具层) |
85
+ |---|---|---|---|---|
86
+ | `dsh://` | ✅ 列表/配置/选择器 | ✅(`path: dsh://docs` 命中 4 行) | ✅(`dsh://docs/subsystems` → 116 文件) | ❌ 只读(`tools/write.ts:130`) |
87
+ | `dvc://` | ✅ roster + 各设备文档 | — | — | ✅ 三设备真派发(`ast_grep`/`ast_edit`/`browser`) |
88
+ | `http://` | ✅(`example.com` 抓回) | — | — | ❌ 只读 |
89
+ | `https://` | ❌ **未登记** | ✅(`example.com` 命中) | — | — |
90
+ | `skill://` | ❌ **unknown** | ✅(`book-to-skill` 命中 560 行/约 130 文件) | ✅(全部文件路径列出) | ❌ 只读 |
91
+ | `ctx://` | ❌ **边界错误** | ✅(`user_prompts[0]` 命中本轮首条 prompt) | — | — |
92
+ | `agent://` | ❌ **边界错误** | — | ✅(物化到 `/dev/shm`) | — |
93
+
94
+ `dsh://` 选择器四形态在 `read` 上全通:`:N-M`、`:raw`(与 `:raw:N-M` 等价)、`:path/agent-loop`、`?q=`。
95
+
96
+ ---
97
+
98
+ ## 3. 原始观测(判定依据,原文摘录)
99
+
100
+ ### 3.1 `read` 侧四个失败
101
+
102
+ ```
103
+ read dsh://docs → ✅ 251 条文档索引
104
+ read dsh://config:path/agent-loop → ✅ {"maxParallelToolCalls":10}
105
+ read dsh://docs/tool-catalog.md?q=ui-deliverables → ✅ 过滤命中 1 行
106
+
107
+ read skill://book-to-skill → ❌ skill "book-to-skill" is unknown or no longer available
108
+ read skill://book-to-skill/SKILL.md → ❌ 同上(子路径无效,仍是 registry 查无此名)
109
+ read ctx://session/transcript:1-8 → ❌ CTX_SESSION_LAYER: session-layer scheme — read it through the read tool (…)
110
+ read ctx://session/compactions → ❌ 同上
111
+ read agent:// → ❌ 同上
112
+ read https://example.com → ❌ no handler registered for scheme "https" (registered: dsh, dvc, http, skill)
113
+ ```
114
+
115
+ 后者的 `registered: dsh, dvc, http, skill` 是 **FS 层 resolver 的登记表**,直接坐实 `read` 走的是 FS 层。
116
+
117
+ ### 3.2 `grep`/`glob` 侧全通(反证)
118
+
119
+ ```
120
+ grep path=skill://book-to-skill pattern=^# → ✅ 560 matches(真实落到 .agents/skills/book-to-skill/*)
121
+ glob path=skill://book-to-skill pattern=* → ✅ 约 130 条文件路径
122
+ grep path=ctx://session/user_prompts[0] pattern="test your tools"
123
+ → ✅ 1 match:/dev/shm/dashr-url-UTBpHR/content.txt:2
124
+ grep path=https://example.com pattern="Example Domain"
125
+ → ✅ 1 match:/dev/shm/dashr-url-NqMEfC/content.txt:3
126
+ glob path=agent:// pattern=* → ✅ /dev/shm/dashr-url-6h2V9Y/content.txt
127
+ ```
128
+
129
+ 并可见 `ctx://` 选择器语法细节:集合下标是 **0-based 方括号**,标签为事件 seq:
130
+
131
+ ```
132
+ grep path=ctx://session/user_prompts pattern=… → ❌ ctx://…[]: no such element
133
+ (collection "user_prompts" has 2 items, 0-based; labels are event seqs)
134
+ ```
135
+
136
+ ### 3.3 `write` 侧
137
+
138
+ ```
139
+ write dsh://config {…} → ❌ write to dsh:// is not supported (read-only scheme, or its write channel is not wired yet)
140
+ write dvc://ast_grep {patterns:[…] path:/abs} → ✅ 结构化 payload 完整渲染(含 matches/totalMatches/parseErrors)
141
+ write dvc://ast_edit {ops:[…] dryRun:true} → ✅ {"applied": false, …}(dryRun 生效,未落盘)
142
+ write dvc://browser {"action":"open"|"close"} → ✅ {"ok":true,"url":"about:blank"} / {"ok":true}
143
+ ```
144
+
145
+ **`dvc://` 设备 payload 已被完整渲染进工具结果**(见 §5 与旧报告的差异)。
146
+
147
+ ### 3.4 旁路发现
148
+
149
+ 1. **`dvc://` 设备相对路径以服务端 cwd 为根,不是会话 workspace。** `path:"."` 全量搜了 monorepo checkout(6950 文件,返回 `../../dashr/src/...`);`path:"dashr/src"` 直接 `Path not found`;绝对路径才命中(163 文件)。设备 cwd = `upstream/deepseek-harness`。
150
+ 2. **`ast_grep` 的 `export function $NAME` 形态静默 0 命中**,而 `function $NAME` 在同一路径命中 646。导出声明的 pattern 形态在本 vendored 实现下**不报错也不匹配**(部分语言另报 `Multiple AST nodes are detected`)。
151
+ 3. **发布面残留调试日志**:`url-schemes/index.ts:154` 与 `:337` 仍有 `console.log('DEBUG-INSTALL …')`,并已在 4999 日志里逐 session 打印。
152
+ 4. **会话指引与部署面不符**:本 session 收到的 URL scheme 指引把 `read` 描述为 `HASH│content` 锚点读;`hashline:false` 下实际是原生行号读。指引来源疑为 `renderGeneralSectionText()` / `generalSection()`(`index.ts:263`、`catalog.ts:135`),建议门控对齐。
153
+
154
+ ---
155
+
156
+ ## 4. 发现清单
157
+
158
+ ### P1 — `https://` 在 FS 层未登记(一行修复,✅ 2026-09-13 复验存活)
159
+
160
+ `fs-aware/wrap.ts:57` 写死 `resolver.register('http', createHttpHandler())`,而工具层正确循环 `HTTP_SCHEMES = ['http','https']`(`handlers/http.ts:45`)。`hashline:false` 时 FS 层是 `read` 的唯一路径 → `read https://…` 恒失败。修法:`buildFsLayerResolver` 同样 `for (const s of HTTP_SCHEMES) resolver.register(s, handler)`。skill:// 重分类重构后复验:`read https://example.com` 正常抓取(session 60418790)。遗留小项(与本次无关,记录在案):`read https://example.com:1-3` 这类**把行选择器写进 URL** 的形态会整串进 `new URL()` 报 invalid URL——http handler 不剥选择器后缀,dsh handler 剥(`dsh://docs:1-3` 正常);属探针写法与既有限制,非本次回归。
161
+
162
+ ### P1 — `skill://` 在 FS 层丢失 agent/cwd(workspace 技能全不可见)
163
+
164
+ `wrap.ts:81` 只给 `{ fs, rawUrl }`;`handlers/skill.ts:106-113` 的 `lookupOptions` 需要 `cwd` + `scope`,两者皆缺时 workspace 作用域技能层读作 absent → 全部 `unknown`。FS 层结构性拿不到 agent,所以要么把 skill 解析留在工具层、要么在 `hashline:false` 下补一条 scheme 呈现通道。
165
+
166
+ > **处置(2026-09-13 user 裁决后重定方向,推翻本报告早前的"补通道"方案)**:第一版补通道(sessionCwd 配置 + scopedAware list 启发式)经活体证伪——dump-config 实证 **dsh-web-app bundle patch 在宿主层 disable 了 `skill-filesystem`/`tool-skill`**,web profile 全局层没有任何 skill provider,list 与 get 同空,启发式从未命中(A/B 活体:user-global 的 `skill://markitdown` 与 project 的 `skill://book-to-skill` 双双 `unknown`,session 8b6dcf85)。根因不是"缺 cwd",而是**技能加载路径解析(CWD/user-global/app 运行时根、扫描深度)是宿主 `dsh-skill-filesystem` 的业务逻辑**,FS 层不得自写近似版。最终处置:`skill://` 重分类为会话层 scheme,FS 层一律答 `CTX_SESSION_LAYER` 边界错误(指名原生 `skill` 工具);`sessionCwd` 配置整体移除;工具层 handler lookup 收敛为 `dsh-tool-skill` 的精确镜像。详见 `2026-09-12-fs-scheme-resolution-实测报告.md` §4d 与 change design.md §D6。
167
+ >
168
+ > **活体复验(session 37899b26 / bfa99754 / f12a206e / 60418790 / 029aa5bb,2026-09-13)**:`read skill://book-to-skill` → 结构化边界错误(指名原生 skill 工具);`read skill://markitdown:1-5` → 同(与技能名无关);**原生 `skill` 工具加载 `book-to-skill` 成功**(完整 `<skill_content>` + resourceBase);`grep path=skill://book-to-skill pattern=^#` → 560 matches(工具层通道完好);`read https://example.com` → 正常抓取(P1-a 存活)。
169
+ >
170
+ > **user 第二轮复验(2026-09-13,第一人称)**:lib 02:32 重建 → 02:33 重启;规范源与副本三文件逐字节一致;`https://` / DEBUG-INSTALL / gate 注释 / `skill://` 收口四项全过;`sessionCwd`、`scopedAwareSkills`、`URL_SKILL_NOT_INVOCABLE_SCOPE` 在 src/副本/**活体 bundle** 三面 **0 命中**;`grep path=skill://` 回退复验通过。user 点评:**"以承认边界替代假装能查"是对的**——上轮 `list({cwd})` 无 scope 读不到 workspace 技能(宿主 `SkillViewOptions` 明写 "omitted reads the global layer alone")本是不可达探针;定性为会话型比修探针干净。行为收窄代价(全局技能亦不在 FS 层解析)已被可执行文案覆盖。user 唯一未亲自引爆文案指向的原生 `skill` 工具(agent probe session f12a206e 已验加载成功)。
171
+ >
172
+ > **user 复验带出两处小瑕疵,本轮已修**:① `sandbox-plugin.ts` 的 `buildResolver` 有**重复的 `register('dsh', …)` 块**(改 skill 块时拼接失误;`register` 是 `handlers.set`,覆盖不抛错,纯死代码)且 `'http'` 仍是字面量未跟 `HTTP_SCHEMES` 对齐(当前非最外层故潜伏,挂载顺序一翻 https 即静默回归)→ **删除私有登记面,`buildResolver` 改为复用 `wrap.ts` 的共享 `buildFsLayerResolver`**(登记单源,双消费方永不再漂移;其 `ctx`/`agent` handler 在本类不可达——前置守卫先拦);② `url-schemes/index.ts` 两个同名 `export interface Config`(sessionCwd 增删残留)→ 并回一个。单测断言同步:https 注册性检查改为网络无关(成功/取数失败皆证登记,唯 "no handler" 才是回归)。收口烟测(session 0335526e,重启后):`skill://` 边界 / `https://` 抓取 / `dsh://docs:1-3` 三连全过;回归 vitest 489/14 基线族、tsc 13、openspec valid。
173
+
174
+ ### P2 — `hashline:false` 下会话型 scheme 无 `read` 通道,且注释与事实不符
175
+
176
+ `index.ts:288-290` 声称 *"Session-layer schemes (ctx://, agent://) answer the structured boundary error here; **the read tool's scheme branch keeps serving them with the calling agent's context**"* —— 该 "read tool's scheme branch" 只在 `hashline:true` 时存在。`hashline:false` 下 `ctx://`/`agent://` 在 `read` 上无任何通道(`grep`/`glob` 可用,但那是另一个工具面的补偿,不等于 read 通道)。注释与 `index.ts:158-159` 的 gate 说明应统一。
177
+
178
+ ### P2 — 发布前清理 `DEBUG-INSTALL` 调试 `console.log`
179
+
180
+ `url-schemes/index.ts:154`、`:337`。
181
+
182
+ ### P3 — `ast_grep` 导出形态 pattern 静默漏报
183
+
184
+ 建议在设备文档或实现里显式声明支持的 pattern 形态(或对 0 命中且 pattern 含 `export ` 时给出提示)。
185
+
186
+ ### P3 — `dvc://` 设备根目录与会话 workspace 不一致
187
+
188
+ 易误伤脚本化调用(相对路径静默落到别的树)。建议设备文档写明"相对路径以服务端 cwd 为根",或与 `ctxFsIO` 的 workspace 对齐。
189
+
190
+ ### P3 — 会话指引把 `read` 描述为 `HASH│content` 锚点读,`hashline:false` 下实为行号读
191
+
192
+ `url-schemes-instruction.md`(owner 维护)对 read 输出的描述按 hashline 锚点语义书写;`hashline:false` 活体下 read 实际返回行号形式。建议按 gates 加一句条件说明(2026-09-13 复核:三项 P3 均无变化、未复测,挂账)。
193
+ ---
194
+
195
+ ## 5. 与既有报告的差异(待对齐)
196
+
197
+ | 项 | 既有报告 | 本轮观测 | 研判 |
198
+ |---|---|---|---|
199
+ | `read` 上六 scheme 全可达 | `2026-09-12-url-schemes-六scheme冒烟与边界实测报告.md` §0:**✅ 6/6** | `read` 上 `ctx`/`agent`/`skill`/`https` **全 ❌** | **两次实测的 `gates` 不同**:该报告应以 `hashline:true`(DASHR read 包装在场)跑出;本轮为 `hashline:false`。二者不矛盾,但结论必须带配置标签——"六 scheme 可达"仅在 `hashline:true` 成立 |
200
+ | `glob` 的 URL-in-`path` 分支在 `dsh://docs` 失效 | 同上 §0:⚠️ 失效 | ✅ 正常(`glob path=dsh://docs/subsystems` → 116 文件) | 疑似已修或与 `hashline` 门控相关,建议复测后销项 |
201
+ | `dvc://` 设备 payload 在渲染面丢失 | 同上 §0:❌ 缺口(只输出 `Executed dvc://<device>`) | ✅ payload 完整渲染(§3.3) | **该缺口在当前构建已不复现**,建议销项 |
202
+ | FS 层 = dsh/dvc/http(s),会话型(含 `skill://`)走边界错误 | `2026-09-12-fs-scheme-resolution-实测报告.md` §1/§2(D2) | 一致(skill 已并入会话型族) | ✅ 与本轮 §1.4 吻合;**2026-09-13 起 FS 层登记面 = dsh/dvc/http/https(`HTTP_SCHEMES` 共享 builder),`skill://` 归入会话型边界** |
203
+ | `skill://` 假 "unknown"(本报告 §1.4/探针清单) | —(本报告当时的活体事实) | **✅ 已消灭**:user 第二轮复验(2026-09-13)——规范源/副本/活体 bundle 三面逐字节核验,`sessionCwd`/`scopedAwareSkills`/`URL_SKILL_NOT_INVOCABLE_SCOPE` 全 0 命中;活体 `read skill://…` 恒答可执行边界文案 | **按业务逻辑归属裁决返工**(`4c21c94` + 本轮清理):技能路径解析/扫描深度属宿主 `skill-filesystem`,插件不再自写近似版;user 唯一未亲自引爆的是文案指向的原生 `skill` 工具本身(agent 前序 probe session f12a206e 已验:完整 `<skill_content>` 加载成功) |
204
+
205
+ **建议**:两份 09-12 报告在标题或结论处补注其 `gates.urlSchemes/hashline` 取值,否则后来者会据"6/6"误判 `read` 可用性。
206
+
207
+ ---
208
+
209
+ ## 6. 未覆盖面(诚实声明)
210
+
211
+ - `grep` 未测 `dvc://`、`agent://`、`http://`;`glob` 未测 `ctx://`、`http(s)://`、`dvc://`(矩阵中以 `—` 标注)。
212
+ - `write` 仅测 `dvc://`(三设备)与 `dsh://`(只读拦截);未测 `ctx://`/`agent://`/`skill://` 写拦截的具体错误分类器。
213
+ - 未测 `hashline:true` 组合作对照(本轮无该实例),故 §5 的"配置差异"为**推断**,需一次 `hashline:true` 复跑坐实。
214
+ - 未测 `skill://` 的**全局(非 workspace)技能**路径——它们可能不依赖 cwd,若存在则 FS 层 `skill://` 并非全灭。
215
+ - 未覆盖工具:`eval` 桥(`await tool.*` 内调用 scheme)、`present`、`subagent`、`workflow`、`agent_message`、`web_search`、`web_fetch`、`goal_*`、`todo_write`、`ask_user_question`。
216
+ - 未做 `tsc`/`vitest`——本轮是活体冒烟,非 change 验收。
217
+
218
+ ---
219
+
220
+ ## 附:探针清单(可复现)
221
+
222
+ ```
223
+ # read(原生 / FS 层)
224
+ read dsh://docs
225
+ read dsh://config:path/agent-loop
226
+ read dsh://docs/tool-catalog.md?q=ui-deliverables
227
+ read skill://book-to-skill # ❌ unknown
228
+ read ctx://session/transcript:1-8 # ❌ CTX_SESSION_LAYER
229
+ read agent:// # ❌ CTX_SESSION_LAYER
230
+ read https://example.com # ❌ unregistered
231
+ read http://example.com # ✅
232
+
233
+ # grep / glob(工具层)
234
+ grep path=dsh://docs pattern=trustedHosts
235
+ glob path=dsh://docs/subsystems pattern=*.md
236
+ grep path=skill://book-to-skill pattern='^#'
237
+ grep path=ctx://session/user_prompts[0] pattern='test your tools'
238
+ grep path=https://example.com pattern='Example Domain'
239
+ glob path=agent:// pattern='*'
240
+
241
+ # write(工具层)
242
+ write dvc://ast_grep {"patterns":["function $NAME"],"path":"/home/u1/workspaces/dashr/dashr/src","limit":3}
243
+ write dvc://ast_edit {"ops":[{"pat":"console.log($$$A)","out":"logger.info($$A)"}],"paths":[…],"dryRun":true}
244
+ write dvc://browser {"action":"open","url":"about:blank"} ; write dvc://browser {"action":"close"}
245
+ write dsh://config "nope" # ❌ read-only
246
+ ```
@@ -0,0 +1,50 @@
1
+ # 2026-09-13-preact-ui-shell 实测报告
2
+
3
+ - change: `2026-09-13-preact-ui-shell`(openspec valid)
4
+ - 依据: `~/workspaces/superd/apps/ui-preact` PoC(2026-09-09,0.1.3-alpha.2 + superd 伺服路径)
5
+ - gates: 测试线 4999,`urlSchemes:true + hashline:false + preact shell build`
6
+ - 结论先行: **shell 渲染引擎已换 Preact**(只 preact,无 @preact/signals——user 2026-09-13 裁决),全上游 UI 语料零改动获得 Preact 渲染;shell index chunk **555,959 → 434,173 B(−21.9%)**;浏览器级 A/B 实测挂载面与 stock 完全一致。
7
+
8
+ ## 1. 改动面(全部属 monorepo 本地 patch,不入 upstream git)
9
+
10
+ | # | 改动 | 说明 |
11
+ |---|---|---|
12
+ | 1 | `apps/web/vite.config.ts` `resolve.alias` +5 条 | react / react/jsx-runtime / react/jsx-dev-runtime / react-dom / react-dom/client → preact/compat 家族(regex 锚定,防 `react-dom` 先命中 `react`) |
13
+ | 2 | 同文件 `resolve.dedupe` + `'preact'` | dedupe 条目从本包 node_modules 解析——**缺它必挂**:seed importer 在 `packages/client/web/lib`,node 向上走看不到 `apps/web/node_modules/preact`(报 `Could not load preact/compat`) |
14
+ | 3 | `apps/web/package.json` devDeps + `preact@10.29.8` | 精确 pin 对齐 PoC;仅 devDep,发布面无它 |
15
+ | 4 | `vendor/{AGENTS,CLAUDE,README}.md` → `vendor/docs/` | **根除 `vendor/CLAUDE.md` ENOTDIR/exit 236 老坑**(见 §4) |
16
+
17
+ AGENTS.md §二 harness 本地 patch 已记档(换 tag 需重放)。
18
+
19
+ ## 2. 体积(实测)
20
+
21
+ | chunk | stock | preact build | Δ |
22
+ |---|---|---|---|
23
+ | `index-*.js`(react 家族 rides index) | 555,959 B | 434,173 B | **−121,786 B(−21.9%)** |
24
+ | `vendor-*.js`(react-free,katex/shiki/markdown 管线) | 740,575 B | 740,575 B | 0(设计内) |
25
+
26
+ ## 3. 浏览器级 A/B 验证(playwright,同脚本双跑)
27
+
28
+ | 断言 | stock React build | preact build |
29
+ |---|---|---|
30
+ | UI 语料挂载(侧栏/会话列表/Settings/输入框文本) | ✅ 全 | ✅ 全(逐字一致) |
31
+ | `#root button` 数 | 31 | 31 |
32
+ | composer(textarea/contenteditable) | 1 | 1 |
33
+ | console.error | 0 | 0 |
34
+ | shell 内 react-dom 痕迹 | **`version:"18.3.1", rendererPackageName:"react-dom"` banner 在 shell** | **无**(唯一 `react-dom` 字串 = 平台模块种子表键 `{react:Y3, "react-dom":Y3, ...}`——同一个 preact 实例登记两个平台词,设计终态) |
35
+ | pageerror | slot 重复注册 ×1 | slot 重复注册 ×1 |
36
+
37
+ **pageerror 定责(A/B + 发布前验尸修正)**:`settings.general.item` slot id `compaction-tuning` 重复注册在 **stock 上同样存在**(factory id `Ba` vs `f5` 仅 minified 差异)→ 与渲染引擎无关。**根因(publish 前验尸确认)**:canonical 树里有一份**未提交的半成品 compaction-tuning 吸收工作**(`src/compaction/` + `installCompactionTuning` 接线,随 rsync 进入 4999 副本),与 `.dsh-test` profile 仍挂着的 local-plugin 版 compaction-tuning **同 id 注册两次**——两因叠加。该半成品已 `git stash`(带说明消息)移出 0.2.3-e 发布内容,续作时须先摘除 profile 的 local-plugin 行再合入。`better-dsh/client.js` 内的 `react-dom` 匹配为 pnpm 依赖路径字符串(`@tanstack+react-virtual@…_react-dom@18.3.1…`),stock/preact 两面同在,非本体。
38
+
39
+ **user 未亲自引爆项声明**:深交互面(聊天流式渲染、shiki 高亮、markdown 管线)未逐项人工过——零 console.error 为强信号非穷尽证明(PoC 同款边界声明)。
40
+
41
+ ## 4. 顺带根除:`vendor/CLAUDE.md` ENOTDIR/exit 236 老坑
42
+
43
+ `vendor/` 根下三个文档文件(AGENTS/CLAUDE/README.md)撞 `pnpm-workspace.yaml` 的 `vendor/*` workspace glob:任何 workspace 枚举器读 `<条目>/package.json`——目录 ENOENT(容忍跳过),**文件 ENOTDIR(炸)**。历史受害面:`npm run build-client`(2026-09-03 记档)、本轮 `npx vite build`(exit 236、裸单行错误)。已移入 `vendor/docs/`(目录无 package.json → ENOENT 跳过)。换 tag 重放时记得同款处理。
44
+
45
+ **新坑记档**:`pnpm add` 之后 `npx vite` 从根解析到 **vite 8/rolldown**(错误形态完全不同)——web 构建一律走 `pnpm run build:web`(workspace 内 vite 6.4.3)。
46
+
47
+ ## 5. 范围裁决
48
+
49
+ - **不入 better-dsh npm 发布物**:本 change 是测试线 monorepo 本地 patch。插件若要随发布把 Preact UI 带到 prod,必须附带 preact 前端 dist + web-runtime override 行(PoC 路径 B 已在 0.1.3-alpha.2 验证可行)——代价是 UI 语料冻结在 fork 点,且 prod host(0.1.3-alpha.2)与测试线(0.1.5-rc.2)语料版本错位。**该决定挂 prod host 升级门下,另行裁决。**
50
+ - 因此本轮 npm alpha(0.2.3-e)的插件内容不含 Preact——发布内容 = url-schemes 系(skill:// 收口等)+ 本轮清理。
@@ -0,0 +1,63 @@
1
+ # 4999 实测报告 — skill:// 空路径清单 + lsp gate/fan-out(2026-09-14)
2
+
3
+ ## 被测构建
4
+ - canonical:`dashr/dashr` @ `0da6a9f`(skill:// bare list)+ `84a98dc`(lsp parity stages 2/3/5)+ `3a94ce1`(stage 4)+ `7373d4e`(gate)
5
+ - 部署:rsync → monorepo `packages/better-dsh/better-dsh`(tsdown + build-client)→ 4999 实例(unit `dsh-4999-test`,DSH_HOME=`.dsh-test`)重启后验证。
6
+
7
+ ## 方法
8
+ 真实 agent 会话(headless Chrome CDP 驱动 GUI,复用 `.scratch/cdp-chat.mjs`),会话 `session-3dc1ae5b`(workspace `--home-u1-workspaces-dashr--`),prompt 指示执行指定 tool call 并原样回报输出;tool result 从 session v3 jsonl(zstd)落账本取证。
9
+
10
+ ## 结果
11
+
12
+ ### 1. 裸 `skill://` → 可用技能清单 ✅
13
+ `read skill://`(无名字)返回 cwd 范围技能目录(`N available skill(s):` + 逐条 `skill://<name> — <description> (use when: …)`),实际返回 11 条(book-to-skill … markitdown),与会话 skill catalog 一致。此前"returns nothing"的空白路径消除。
14
+
15
+ ### 2. `write dvc://lsp {"action":"status"}` ✅
16
+ 返回 `{"ok":true,"gate":"unasked"}` —— gate 动作走通,session id 由 write 分发器自动注入,agent 无需手填。
17
+
18
+ ### 3. `{"action":"diagnostics","file":"<abs .ts>","all":true}` fan-out ✅
19
+ ```json
20
+ { "ok": true, "fanout": true,
21
+ "servers": ["typescript-language-server","biome","eslint","denols","tailwindcss"],
22
+ "diagnostics": [],
23
+ "summary": "fan-out …/src/index.ts: 0 diagnostic(s) across 5 server(s) — …" }
24
+ ```
25
+ 5 个覆盖 .ts 的注册 server 全部被查询、合并、按 server 标注,无崩溃。
26
+
27
+ ### 4. 结构化错误路径 ✅(负例)
28
+ 相对路径 `dashr/dashr/src/index.ts`(相对 session cwd 不存在)→ 结构化 `file not found: <cwd>/…`,非崩溃非静默。
29
+
30
+ ## 结论
31
+ 本轮三项改动(skill:// 清单、lsp gate、fan-out 诊断)在 4999 真实运行时第一人称实测通过。单测侧:lsp-device 22 过、lsp-gate 5 过、skill.spec 17 过;tsc/构建绿。
32
+
33
+ ## 遗留
34
+ - 真实 language server 端到端诊断(安装 pyright/ts 后取非空诊断、didOpen/didSave 同步行号对齐)未覆盖——本机当时无 server 二进制,fan-out 返回 0 视为"无 server/干净"两可;待装齐后补测。
35
+ - gate on 后的 warm-start/didOpen 预热延迟附挂路径需真实 server 才能观测。
36
+
37
+ ## 追加实测(同日,commit 351d942)— dvc://lsp 读面
38
+ - `read dvc://lsp/status`:同一会话先 `write {"action":"on"}` 后 read → `{"ok":true,"gate":"on"}` —— session 经 read env 注入生效,读面返回**调用会话**的 gate。
39
+ - `read dvc://lsp/diagnostics?file=<abs>&all=1`:query 经 selector 还原为参数,fan-out 5 server 正常返回。
40
+ - 写面保留 status 动作(与注入式分发对称),但查询的规范形式是读面。
41
+
42
+ ## 追加(同日,commit 660fd4b)— 两个活体缺陷修复
43
+ 1. **dvc://browser 被会话注入毒死**:dispatcher 把 `session` 塞进 args,browser device 严格 validator 报 `unknown field(s) "session"`。修复:session 改走 `execute(args, {session})` 带外传输(lsp gate 同步改读 ctx,兼容旧 in-args)。进程内实证:`dispatchDvcWrite('dvc://browser', open example.com, 'sess-1')` 真实启动 Chrome 并返回 `{"ok":true,...,"title":"Example Domain"}`。
44
+ 2. **read 普通文件路径失败**:wrapper 参数只声明 `path`,被委托方(host 原生 read 要求 `file_path`)收不到参数报 missing required property;非 string 返回值又撞 wrapper 的 string 输出 schema。修复:参数声明双键别名;委托前按被委托方**声明的 schema** 适配键名(opaque schema 原样透传);非 string 结果 JSON 归一。三个委托形态(file_path 声明/path 声明/opaque)单测覆盖。
45
+
46
+ ## 追加(同日,commit f53c609)— glob/grep URL 缺陷修复
47
+ - `glob pattern="skill://grp/*"` 曾把带 glob 元字符的 URL 整体传给 ripgrep 当字面路径(rg exit 2)。修复:`splitUrlGlob` 在路径段首个元字符(`*?[`)处切分——URL 部分走 resolvePath,尾部 glob 作为 rooted pattern 应用在资源真实目录内。进程内对真实 skill 目录实证:`skill://grp/*` 与 `skill://grp/**/*.md` 均在目录内解析,不再报 No such file。
48
+ - `grep path="skill://…"` 匹配路径改写回 URL 形式(绝对路径前缀改写 + 原生相对路径前置),模型看到 `skill://grp/SKILL.md` 而非内部磁盘位置。
49
+ - url-schema spec 的 "glob with a URL in pattern … globs the resource's real disk directory natively" 场景现在对带元字符的 URL 同样成立。
50
+
51
+ ## 追加(同日,commit 874edf2)— dsh://docs 指向上游官方文档
52
+ - 官方 harness 文档语料(241 个 md,源自 deepseek-ai/deepseek-harness docs/,经 dsh-dev-skill 抓取)vendor 进包内 `dsh-docs/`,随 `files` 发布。
53
+ - 解析顺序:显式 docsDir → `pkgRoot/dsh-docs` → `pkgRoot/docs` → `pkgRoot/../docs`;docs-dir 逐级上溯在每层先探 `dsh-docs`。
54
+ - 4999 部署后实测:`dsh://docs` 索引返回 agent-lifecycle/api-gateway/architecture/… 官方语料清单。
55
+
56
+ ## 追加(2026-09-15)— 外部调查四洞修复(commit 待填:本条 commit)
57
+ 外部 owner 级调查确认四个洞,全部修复并在 4999 部署后实测:
58
+ 1. **fan-out 死代码**:`obtainClient` 被提到 `all:true` 分支之前,primary 缺失时 fan-out 永不可达。修复:fan-out 提前分发(`diagnosticsFanOut` 独立函数),不再要求 primary client。
59
+ 2. **fan-out 失败与干净不可分**:每 server 结果现带 `status: ok|missing|error`(`perServer` 数组),summary 明示 "missing (NOT clean): …" / "errors: …"。4999 实测:`perServer:[{typescript-language-server,ok},{biome,missing},{eslint,missing},{denols,ok},{tailwindcss,missing}]`。
60
+ 3. **安装结果被丢弃**:`ensureMustHave` 的 `installServer` 结果现落入 `installFailed`(per-session),在 `status` 读面以 `installFailures` 呈现;成功安装后调 `clearCommandProbeCache` 清负探针缓存(修复负缓存永久误报)。
61
+ 4. **must-have 只在 write 后触发**:新增 `lspGateEnsure`,read/query-first 路径同样触发后台安装。附加:`resolveCommandPath` 显式探测 `~/.local/bin`、`~/.cargo/bin`、`~/go/bin`(daemon PATH 被 scrub 后 npm -g 安装位置不可见——本次 user 手工 symlink 到 /usr/local/bin 的根因)。
62
+ 5. **device summary 过期**("advertises 4, answers 11"):summary 改为完整动作枚举(read 面 + write 面)。
63
+ 6. **status 读面扩充**:`availability`(每语言 command+available)、`liveServers`、(会话内)`gate`+`installFailures`。4999 实测:python/typescript/rust available=true、go=false,liveServers 两条。
@@ -0,0 +1,44 @@
1
+ # 上游 dsh 0.1.3-alpha.2 对齐轮本地实测报告(dashr 测试线)
2
+
3
+ - 实测日期:2026-09-08
4
+ - 范围:**仅 dashr(better-dsh 插件)** 自身对齐(omp-web 不在内);OpenSpec change `openspec/changes/2026-09-08-upstream-0-1-3-alpha-2-alignment/`(G1 S1–S7 + G2 小修,v0.2.3)
5
+ - 环境事实:checkout `upstream/deepseek-harness` @ `dsh-v0.1.3-alpha.2`(`82a5fd61a7`,release merge PR #3685);Node v22.22.1(unrun 路径);pnpm 11.7.0(store 重定向 `.scratch/pnpm-store`);better-dsh 副本 = canonical `0.2.3`(rsync 双向已收敛,src/test 字节一致);`DSH_HOME=.dsh-test`(prod `~/.dsh` 未动);web `127.0.0.1:4999`
6
+ - 上游版本判定(S0 报告 `docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md`):rc.1 = 纯发布(代码零差);目标 = alpha.2(npm `alpha` dist-tag)
7
+
8
+ ## 实测结果表
9
+
10
+ | 步骤 | 结果 | 备注 |
11
+ |---|---|---|
12
+ | S1 侦察 | ✅ | 三 tag 本机拉齐;patch 载体 tag 间 diff 复核(tsdown.client.ts ±1 / pnpm-workspace.yaml +8−1;`resolveRepositoryRoot` 上游未吸收,仍需本地) |
13
+ | S2 切换与重放 | ✅ | alpha.5 脏 overlay 全量归档 `.scratch/alpha5-dashr-local-overlay.patch`(2527 行)→ stash → checkout alpha.2 → 三必需 patch 手工重放(unrun devDep / storeDir+verifyDepsBeforeRun+zeromq / tsdown `resolveRepositoryRoot`)。**overlay 定性**:其余 17 文件全部为 bun --compile 可移植补丁(注释自证;Node 下惰性/同行为),未重引(4999 走 Node),归档留存 bun 实验用 |
14
+ | S3 副本地化 | ✅ | 副本无 stale `dsh-client-runtime` peerDep;peer 范围含 alpha.2(0.1.3-alpha.2 ∈ `>=0.1.2-alpha.1 <0.2.0-0`);bundle 名 `@deepseek-ai/dsh-base`/`dsh-web-app` 不变 |
15
+ | S4/S5 安装与构建 | ✅ | `pnpm install`(**pnpm 11.7 自动插 `allowBuilds` 占位符 `set this to true or false` → 硬错,改显式布尔**,AGENTS.md 已知坑再现);`pnpm run build` 全绿 ×2(tsc host + tsdown + vite web + 224 client artifacts),better-dsh lib+client 在位 |
16
+ | S6 启动 4999 | ✅ | systemd-run `dsh-4999-test`;root 200;dump-config:`dashr-repl` 行 + `DASHR_KERNEL_PYTHON` 注入 ✓;**注**:stop 后立即 start 有 EADDRINUSE 竞态(旧实例端口未释放),需间隔 ~2s 或独立 unit 先验证 |
17
+ | S7.1 工具面 | ✅ | `tool-web` 在位;`str_replace_editor` **缺席(0)**(base/web-app 默认下架生效) |
18
+ | S7.2 client 卡片 | ✅ | boot 图含 `"id":"better-dsh"`;合并 loader bundle 200(5.2MB/224 模块),better-dsh 段与 `lib/client/index.js` **字节一致**(除 sourceMappingURL 尾行);单入口 `/plugins/??better-dsh/client.js` 404(alpha.2 只服务聚合 `??` 请求——探针改聚合提取法) |
19
+ | S7.3 行形状查表 | ✅(预查收敛) | ① connection 行形状未漂移(persona 行改 prefix/suffix 与 dashr 无交集);② `__DSH_TRANSPORT__` 读法不变(新增可选 `__DSH_CONNECTION_RECOVERY__`,缺省无害);③④⑤ 零改动 |
20
+ | S7.4 fence/isLoopback | ✅ 静态 | 页面含 `__DASHR_MOBILE__` boot script(web-trust 腿在位);`__DSH_TRANSPORT__` 0(空 authorities 惰性=设计);env 探针(`DSH_TRUSTED_HOSTS` 401/403)留手测 |
21
+ | S7.5 zoomGuard | ✅ 静态 | ④⑤ 零改动 → reconcile 路径不变;CDP 双形态留手测 |
22
+ | S7.6 telemetry | ⏳ 手测 | feedback 面已 revert(上游 13daefe073);`DSH_TELEMETRY_DISABLED=1` 立场 prod 验证 |
23
+ | S7.7 老会话读兼容 | ⏳ 手测 | `.dsh-test` 无 v1 历史会话可自动验证;建议 GUI 用旧会话验证(上游 released migration 兜底) |
24
+ | file-tool 升级矩阵 | ⏳ 手测 | 事件报告建议 3 回归项;本地链路 09-06 已过,本实例留 user GUI 复测 |
25
+
26
+ ## 发现与修复(本批次代码改动,vitest 全量 481/481 绿)
27
+
28
+ 1. **session 事件面 API 漂移(真实对齐点)**:registry 解析的 `@deepseek-ai/dsh-session@0.1.2-rc.1` 为 **format-v2 会话**(`SESSION_FORMAT_VERSION=0`;header 必填 `isSeeded:boolean`;无 `.events` 属性,改 `snapshotEvents()`/`ownEvents()`)→ dashr `url-schema/handlers/agent.ts` roster 的 `live.events` 属性读失效。修复:`live.snapshotEvents()`;测试 fixture 补 `isSeeded:false`(自包含 seed,非 fork)。见 diff。
29
+ 2. **pi-natives loader 锚点穿透**:`findPackageDir` 的 `createRequire.resolve` 快路径会经进程 globalPaths(含 pnpm `.pnpm/node_modules` hoist 根)从**任意锚点**命中已安装 addon,违反"锚点限定"契约(degradation 测试抓出)。修复:去掉 resolve 快路径,仅用自锚点向上的确定性 node_modules walk。见 diff。
30
+ 3. **escalation-guidance 附 A 定稿回填 canonical**(drift 修正):monorepo 副本已实装定稿(deniable/denied · per-call),canonical `src/index.ts` 仍旧句 → 回填;`presentation.spec.ts` 断言同步(定稿 token + 无 'retried once' 断言)。
31
+ 4. **附 C 矛盾子句结案(不暴露)**:render 证据(`renderReplBridgeInstructions` signature-only,description 散文不进模型可见面)→ 不做 dashr 侧订正;上游 schema 文本缺陷记上游面 Open item。S7 实证项(grep 装配产物 0 命中)未单独执行——本轮运行实例装配面即证(签名行、零散文)。
32
+
33
+ ## 环境注记 / Open items
34
+
35
+ - **peer 双副本分裂**:better-dsh 的 peer `@deepseek-ai/*` 经 pnpm autoInstallPeers 从 registry 装入 `.pnpm`(dsh-llm/dsh-session@0.1.2-rc.1),而部分依赖链解析到 workspace 副本 → **包级 `tsc -p tsconfig.json` 出现双身份类型分裂(69 错,dsh-llm branded 字段、SessionSeq 品牌)**;权威类型门 = 根 `tsc -b tsconfig.host.json`(`pnpm run build`,**全绿 0 错**)。vitest 全量(36 文件/481 用例)绿。非代码回归,记录待解(历史 dev-loop 在 alpha.5 未现,系本次 registry 解析到 rc.1/alpha.2 后拓扑变化)。
36
+ - **registry 发布物与 tag 疑点(上游面)**:npm `@deepseek-ai/dsh-session@0.1.2-rc.1` 实为 format-v2 API,而 git rc.1 tag(== alpha.5)按版本号-only 判定应无此改动 → 疑似 session 包独立发布线带 0.1.3-alpha 代码却标 rc.1。记录,prod 升级前需以 npm 发布物为准复验。
37
+ - 手测/用户项:老会话读兼容、fence env 探针(401/403)、zoomGuard/mobile CDP 双形态、file-tool 升级矩阵、prod 3080 复测(write 事件回归)。
38
+ - 版本:canonical `dashr/package.json` → **0.2.3**(本地 commit+tag `v0.2.3`;npm 发布按 AGENTS.md 红线另行)。
39
+
40
+ ## 产出
41
+
42
+ - S0 差异报告:`docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md`(2026-09-08 已落)
43
+ - 本报告 + OpenSpec change `2026-09-08-upstream-0-1-3-alpha-2-alignment/`(proposal/design/tasks/specs delta)
44
+ - overlay 归档:`.scratch/alpha5-dashr-local-overlay.patch` + 逐文件分片 `.scratch/overlay-triage/`
@@ -0,0 +1,110 @@
1
+ # 上游 dsh 0.1.2-alpha.5 / rc.1 → 0.1.3-alpha.2 差异调研报告
2
+
3
+ - 调研日期:2026-09-08(本机复核日;上游 rc.1 发布 2026-09-03、alpha.2 发布 2026-09-07T13:11Z)
4
+ - 方法:**clean source git diff,非 npm tarball**。本机 `upstream/deepseek-harness` checkout 拉取 `dsh-v0.1.2-rc.1` / `dsh-v0.1.3-alpha.1` / `dsh-v0.1.3-alpha.2` 三个 tag 后,以 tag 树间 diff + 仓内 `.agents/notes/implemented/` 设计笔记 + npm registry 事实三源互证。文件/行数口径:`dsh-v0.1.2-alpha.5` vs `dsh-v0.1.3-alpha.2`(rc.1 与 alpha.5 代码零差,等价);commit 数口径:`rc.1..alpha.2`(rc.1 是 alpha.2 的祖先,范围线性、无歧义)。
5
+ - 版本事实:
6
+ - **rc.1 = release-only**:`alpha.5..rc.1` 只有 2 个 commit——release commit `a66e470204`(`release(dsh): 0.1.2-rc.1`,2026-09-03)+ 1 个空 merge(`5a69ba1cdd` Merge PR #3445,把 alpha.5 发布分支并入主线);代码差**为零**(见专题一)。npm `latest`/`next` dist-tag 均指 `0.1.2-rc.1`——今天裸装 `@deepseek-ai/dsh` 拿到的就是 alpha.5 代码。
7
+ - **alpha.1 = 只 tag 未上 npm**:`dsh-v0.1.3-alpha.1` tag 存在(merge PR #3554,09-04),但 registry `versions` 里 **没有 0.1.3-alpha.1**,0.1.3 线从 alpha.2 起;`alpha` dist-tag = `0.1.3-alpha.2`。
8
+ - alpha.2 tag = merge PR #3685(worktree/release-dsh-0.1.3-alpha.2,09-07);rc.1 与 alpha.1 均为其祖先(rc.1..alpha.1 = 328,alpha.1..alpha.2 = 316)。
9
+
10
+ ---
11
+
12
+ ## 数字复核表(转述值 → 实测值)
13
+
14
+ 对来源总结逐项复核,两处需修正口径,其余全部精确命中:
15
+
16
+ | 来源总结 | 实测(本机复核) | 结论 |
17
+ |---|---|---|
18
+ | rc.1 落后 alpha.5 "1 commit" | `alpha.5..rc.1` = 2 commits(release `a66e470204` + 空 merge `5a69ba1cdd`) | 口径差异;结论不变——代码零差 |
19
+ | rc.1 vs alpha.5 "252 文件全 package.json 版本号" | 252 文件,**0 个非 package.json**,diff 行过滤 `"version"` 后**零残留** | ✅ 精确命中 |
20
+ | alpha.2 "417 commits" | `rc.1..alpha.2` 共 **644** commits = 227 merges + **417 非 merge**(first-parent 仅 76) | 417 = 非 merge 数;总数 644 |
21
+ | "~103k+/40k− across 4.8k files" | 4,866 files,**+103,306 / −39,537** | ✅ 命中 |
22
+ | "~59k+/19k− 真实代码(剔 notes/snapshots/docs)" | 仅剔这三前缀 = 1,974 files,**+84,482 / −27,248**——到不了 59k | ❌ **不可复现**(见下"剔除阶梯") |
23
+ | fix 178 / test 97 / docs 53 / ci 11 / perf 9 | 对 644 条 subject 前缀统计:fix **178** / test **97** / docs **53** / ci **11** / perf **9**(另有 refactor 27 / feat 21 / chore 13 / revert 2 / release 3 / merge+other 230) | ✅ 全命中 |
24
+ | rc.1 = latest/next;alpha = alpha.2 | `npm view dist-tags`:latest=0.1.2-rc.1, next=0.1.2-rc.1, alpha=0.1.3-alpha.2 | ✅ |
25
+ | alpha.1 从未上 npm | `npm view versions` 无 0.1.3-alpha.1 | ✅ |
26
+
27
+ **真实代码量的"剔除阶梯"(都可精确复现)**:ALL 4,866 files +103,306/−39,537 → 剔 `.agents/notes/`+`snapshots/`+`docs/` 1,974 files +84,482/−27,248 → 再剔 `pnpm-lock.yaml` 1,973 files +83,369/−27,204 → 再剔各包 `tests/`·`test/`·`__snapshots__` 1,366 files +38,948/−11,653。来源总结的 ~59k+/19k− 落在前两档之间,对应的剔除集本机未能还原(可能含更大的生成语料剔除),**引用时以阶梯为准,勿再用 59k 口径**。
28
+
29
+ 主题占比(包组级,alpha.5..alpha.2,实测):`session*`(session 组全部 8 包)211 files **+25,333/−10,849**;`client*` 358 files +10,871/−2,691;`apps/web` 95 files +2,423/−641;`subagent` 75 files +3,144/−1,955;`api` 64 files +3,695/−985;`core` 71 files +2,919/−1,861;`llm` 68 files +3,011/−493。与来源"dominant areas = client/session/subagent/core/llm/api/apps/web"一致,session 显著居首。
30
+
31
+ ---
32
+
33
+ ## 专题一:rc.1 是一个纯发布 commit——bump 过去只买一个标签
34
+
35
+ `git diff dsh-v0.1.2-alpha.5 dsh-v0.1.2-rc.1`:252 个变更文件全部是各包 `package.json`,且 diff 内容除 `"version"` 字段外零残留(无 lockfile、无源码、无配置)。rc.1 相对 alpha.5 **功能字节级一致**。
36
+
37
+ 含义:**以 rc.1 为目标 = 白动**(只换 dist-tag 外观)。真正的代码分水岭在 `dsh-v0.1.3-alpha.2`。若只想要"稳定标签",rc.1 与 alpha.5 无差别;若需要 0.1.3 线的修复,只能走 alpha 通道(alpha.2 起)。
38
+
39
+ ---
40
+
41
+ ## 专题二:session format v2 + 内嵌 assistant 流(落盘/回放契约变更)
42
+
43
+ **三个 breaking commit 全部落在 omp-web 桥接的会话持久化/回放接缝上**(均实测在 `rc.1..alpha.2` 范围内):
44
+
45
+ | commit | subject(实测原文) | 性质 |
46
+ |---|---|---|
47
+ | `f99b06eaed` (09-01) | `feat(session)!: embed assistant streams in format v2` | 断(格式面) |
48
+ | `d1521ea783` (08-31) | `feat(session)!: add released format migration` | 断(迁移面) |
49
+ | `bec6805d6a` (08-28) | `refactor(session-persistence)!: handle-based seam with a lifecycle-owned write path` | 断(写路径面) |
50
+ | `c58097a826` (08-31) | `feat(session-persistence-jsonl): cross-process write-ownership lease` | 紧邻(lease 即 `session-persistence-omp.ts` 直接对话对象) |
51
+
52
+ 配套证据(tag 树内设计笔记,路径均已核实):
53
+ - `implemented/architecture/2026-09-01-v2-embedded-assistant-streams.md`(v2 内嵌流设计)
54
+ - `implemented/architecture/2026-09-05-read-only-session-migration-preparation.md` + `2026-09-06-embedded-stream-record-readers.md`(回放侧按 compact record 读内嵌流)
55
+ - `implemented/feature/2026-08-31-cross-process-session-write-lease.md`、`implemented/simplification/2026-08-30-jsonl-only-session-persistence.md`(jsonl-only 收敛 + 跨进程写权)
56
+ - 新包齐备:`packages/session/` 下新增 `session-format`、`session-format-catalog`、`session-format-v0-to-v1`、`session-format-v1-to-v2`(src:codec/dispositions/migration/validation)、`session-log-deepseek`、`session-checkpoint-policy`;`session-persistence-jsonl/src` 现含 `lease.ts`/`migration-verifier.ts`/`format.ts`/`generation.ts`/`storage.ts`/`worker.ts`。迁移测试语料是全 diff 最大单体(`v1-to-v2/tests/migration.spec.ts` +1,251)。
57
+
58
+ 流/回放修复链(同簇,非断):`30e045dfad` `feat(agent): emit live assistant stream frames`;`165cc31eb8` `perf(llm,host): read embedded Assistant streams per compact record`;`7bab91d247` `fix(llm): retain Anthropic resolved model during replay`。
59
+
60
+ ---
61
+
62
+ ## 专题三:persistence 重构主题(读/写/迁移的 perf 潮)
63
+
64
+ 除专题二四枚外,`session-persistence*` 在本范围有一整条 perf 链:prepared reads before publication、streamed migration publication/verification、restore 冻结读(来源总结定性);`2026-09-04-session-open-performance-gate` 测试笔记佐证"打开会话性能门槛"成为一等关注。对桥接方的含义集中在专题二列出的断点 + lease——即"谁持有某 jsonl 写权、生命周期何时移交、跨进程并发写如何排他",这正是第三方持久化实现需要对齐的契约。
65
+
66
+ ---
67
+
68
+ ## 专题四:其余主题簇(非断,但升级需知)
69
+
70
+ | 簇 | 证据(实测 subject,均 in-range) | 备注 |
71
+ |---|---|---|
72
+ | **str_replace_editor 默认下架** | `36a4665144` `feat(base): remove str_replace_editor from default tools`;`965adbb5cf` `feat(sdk): disable str_replace_editor by default` | 笔记 `2026-09-05-base-default-file-editor`;升级后默认工具面少一个 editor |
73
+ | **outbound 全走 proxy** | `545e2ad914` `feat(net): route every outbound request through the configured proxy` | 未配 proxy 时无行为变化 |
74
+ | **read_image 图片卡** | `56ca8af0ee` / `a4d4404708`(ui-tool 渲染嵌套/直接 read_image 结果为图) | 前端渲染面 |
75
+ | **通用文件存储 + 提交生命周期流式** | `bafa6ae11d` `feat(conversation): stream files through submission lifecycle` | 附件面 |
76
+ | **agent/UX** | `48cc1cf1d6` `feat(agent): announce model switches`;`96ead6091d` `feat(subagent): align human inbox controls`;`040d73871b` `feat(agent-team): unify messages on steer` | |
77
+ | **message-edit:landed 又 revert** | `ef88756f13`(09-02)`feat(session, agent, web): support same-session message editing` → `e974a655a0`(09-02)`Revert "…"` | 同日往返;**别按该 feat 写适配** |
78
+ | **telemetry/feedback:default-on 又回滚** | `02a029e679` feedback 记录进 session log、`9ffe85a512` OTel 默认全量上传统计 → `13daefe073` `revert(session-telemetry-otel): leave telemetry on its own transport` | 笔记 `2026-09-05-canonical-feedback-log` / `nonofficial-feedback-otel`;prod 跑 `DSH_TELEMETRY_DISABLED=1`,升级时查 session log 是否开始夹带 feedback 记录 |
79
+ | 其余重churn | fix 178 / test 97 / docs 53 / ci 11 / perf 9;web-heavy(sending states、skill chips、terminal cards、session reveal) | 体积主导:`.agents/notes`(含 notes i18n.yaml 迁移与 archived manifest.json 重组,~2.4k files)+ session/client 组 |
80
+
81
+ ---
82
+
83
+ ## 对本线(omp-web 桥 + dashr 测试线)的含义
84
+
85
+ 1. **对 omp-web 不是 drop-in bump**。format v2(`f99b06eaed`)+ released migration(`d1521ea783`)+ handle-based seam(`bec6805d6a`)+ 写权 lease(`c58097a826`)恰好是 `session-persistence-omp.ts` / `replay.ts` 桥接的契约面。升级 = 一次 upstream-alignment 适配轮:diff 载体 → 新格式读写 + lease 语义对齐 → 迁移读兼容验证 → 冒烟,按所在仓的 AGENTS.md 节奏(dashr 侧即 S1–S7)。
86
+ 2. **别追 alpha.1**:npm 无该版本,registry 线从 alpha.2 起;本地 tag 在库即可,发布侧不存在。
87
+ 3. **dashr 自己的 4999 测试线(现 alpha.5)将来对齐 alpha.2 时的 S7 盯点**(本轮不执行):默认工具面少 `str_replace_editor`(工具清单对比);session 落盘格式迁移(老 session 读兼容靠上游 released migration,验收一条老会话打开);`__DSH_TRANSPORT__`/`connection` 行/`AppFrame` 语义属性的行形状是否被 web-heavy churn 漂移(upstream-alignment.md S7.5 三处 + S7.8 两处查表在切换轮现查);telemetry 默认面变化对 `DSH_TELEMETRY_DISABLED=1` 立场的验证。
88
+ 4. **数字口径提醒**:引用本报告数字时用复核表/剔除阶梯的实测值;"417 commits""~59k real code"两个转述口径已修正。
89
+
90
+ ---
91
+
92
+ ## 参考索引
93
+
94
+ | 主题 | 证据 |
95
+ |---|---|
96
+ | rc.1 release-only | commit `a66e470204`;`git diff alpha.5 rc.1` = 252 package.json,版本号-only |
97
+ | format v2 / 内嵌流 | commit `f99b06eaed`;笔记 `implemented/architecture/2026-09-01-v2-embedded-assistant-streams.md` |
98
+ | released 迁移 | commit `d1521ea783`;包 `packages/session/session-format-v1-to-v2/`(codec/migration/validation) |
99
+ | handle seam | commit `bec6805d6a`;`session-persistence-jsonl/src/{lease,storage,worker,migration-verifier}.ts` |
100
+ | 写权 lease | commit `c58097a826`;笔记 `implemented/feature/2026-08-31-cross-process-session-write-lease.md` |
101
+ | jsonl-only 收敛 | 笔记 `implemented/simplification/2026-08-30-jsonl-only-session-persistence.md` |
102
+ | 回放读内嵌流 | commit `165cc31eb8`;笔记 `implemented/architecture/2026-09-06-embedded-stream-record-readers.md` |
103
+ | 迁移只读准备 | 笔记 `implemented/architecture/2026-09-05-read-only-session-migration-preparation.md` |
104
+ | message-edit 往返 | commit `ef88756f13` / revert `e974a655a0`(均 09-02) |
105
+ | telemetry 往返 | commit `02a029e679`/`9ffe85a512` → revert `13daefe073`;笔记 `…/2026-09-05-{canonical-feedback-log,nonofficial-feedback-otel}.md` |
106
+ | editor 下架 | commit `36a4665144` + `965adbb5cf`;笔记 `simplification/2026-09-05-base-default-file-editor.md` |
107
+ | proxy 全覆盖 | commit `545e2ad914` |
108
+ | 图片卡 / 文件流 | commit `56ca8af0ee`/`a4d4404708`/`bafa6ae11d` |
109
+ | agent/UX | commit `48cc1cf1d6`/`96ead6091d`/`040d73871b` |
110
+ | 体积与类型 | 复核表 + 剔除阶梯;session 组 +25,333/−10,849 居首 |