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
@@ -1,367 +0,0 @@
1
- # 可行性研究:DASHR 从 Agent Preset 层上升到 Profile 层
2
-
3
- > 日期:2026-08-16 · 类型:纯可行性研究(不干预开发、不改 v0.5 蓝图)
4
- > 触发:用户提出——Dash 有 Profile(`dsh --profile`)与 Agent Preset 两层,
5
- > 现蓝图把 DASHR 做成"与内建 PTC 编码模式同级的第五 preset",能否再拔高
6
- > 一层,到 Profile 层面去做?
7
- > 方法:直读 `deepseek-harness @47f9438` 的 boot / bundle / preset 三层源码 +
8
- > 活体 profile 目录(`~/.dsh/profiles/`)+ DASHR 两包实测,逐条取证。
9
- > v1.1(2026-08-16 补):新增 §9 决策附录(四模式核实/隔离实测/Web UI 复用)、
10
- > §10 形态收敛(直接做成 Profile)+ TUI 可行性(三条思路源码取证 + 生态实证)。
11
- > 一句话结论:**可行,且机制已内置——Profile 层的可分发原子是 bundle
12
- > (声明 `dsh.bundle.patch` 的包);"上升到 Profile 层"精确等价于"把
13
- > DASHR 从 plugin+preset 变成 bundle(甚至一个 headless 式的独立运行时
14
- > profile)"。内建先例就是 headless。**
15
-
16
- ---
17
-
18
- ## 0. 结论摘要(TL;DR)
19
-
20
- 1. **用户"两层"直觉需修正为四层 + 一个正交层**(§1)。Profile 与 Agent
21
- Preset **不是上下级**,而是两个不同阶段的层:Profile 是 boot 层(决定
22
- 挂哪些 bundle/插件),Agent Preset 是 session 层(决定模型看到哪些
23
- 工具/提示)。真正的"Profile 层的可分发插件"原语是 **bundle**。
24
- 2. **"上升到 Profile 层" = 成为 bundle**。精确语义是:DASHR 的 runtime
25
- 半边(`rlmRuntime` 服务 + presentation + 生命周期)从 preset 的
26
- per-session scope 移到 **boot 层 / host realm**;模型面半边(工具 +
27
- 提示)仍是 preset,但借 bundle 覆盖 `agent-presets.default` 变成
28
- **默认 preset**(甚至像 headless 那样干脆不需要 preset 名册)。
29
- 3. **最硬的实证支点**:DASHR 现在两个包 `dsh: null`(非 bundle),装包后
30
- preset 连注册都要靠手动 `--patch` overlay(`dashr-presentation/README`
31
- L48-73 实证)。升 bundle 后这一步由 bundle 自己的 `cordis.patch.yml`
32
- 在 boot 时自动完成——一次 `dsh plugin add` 全落。
33
- 4. **内建先例 = headless**:`headless` bundle 就是"编码模式做成运行时"的
34
- 官方示范——boot 层直接挂 `code-runtime` worker-thread,无 preset 名册,
35
- `tools.mode` 走 `DSH_TOOLS_MODE`。DASHR 的"Profile 层"完全可以照抄这
36
- 条,做一个 `dashr` profile:boot 挂 `rlmRuntime`,运行时即 RLM 模式。
37
- 5. **代价**:boot 层耦合面变宽(依赖 `agent-presets`/`session`/`sandbox`
38
- 等行 id 稳定),与 v0.5 §7.6"运行时零上游依赖"决策存在**真实张力**,
39
- 需重新权衡(§6)。
40
-
41
- ---
42
-
43
- ## 1. 源码证实的真实分层(修正"两层"直觉)
44
-
45
- 活体 `~/.dsh/profiles/web/package.json` + `packages/boot/app-boot/src/profile.ts`
46
- + `packages/preset/agent-presets/` 三处对读,实际是**四层 + 一个正交层**:
47
-
48
- ```
49
- boot 阶段(决定"装了什么运行时") session 阶段(决定"模型看到什么")
50
- ┌─ Profile ~/.dsh/profiles/<name>/ ┌─ Agent Preset(正交,非下级)
51
- │ package.json: dsh.profile.bundles[] agent.cordis.yml 列表 = 面向模型的
52
- │ cordis.patch.yml(用户层) 工具行 + 提示行 + scoped 服务
53
- │ └─ Bundle npm 包,声明 dsh.bundle.patch 发现:roots 扫描(system shipped
54
- │ cordis.patch.yml = insert 行 + 覆盖行 + ~/.dsh/.agent-presets/)
55
- │ └─ Plugin 单个 Cordis entry(id+name+config) 选择:default + 会话头 + 事件,锁
56
- ```
57
-
58
- **证据**:
59
- - Profile 本体:`profile.ts` L36-96(`Profile`/`ProfileLayer`/`bundles`);
60
- `PROFILE_TEMPLATES` L114-117(`web`/`headless` 自动初始化);
61
- `DEFAULT_PROFILE_BUNDLES = ['@deepseek-ai/dsh-base']` L125。
62
- - Bundle 声明:`profile.ts` L42-45(`dsh.bundle.patch`);L371-397
63
- (`loadProfile` 解析 bundle patch,缺 `dsh.bundle` 则 fail-loud L392-394)。
64
- - 装配:空根 `[]` + bundle 层按序 + profile 层 + home 层 + overlay
65
- (`apps/cli/src/profile-boot.ts` `composeProfile`)。
66
- - Preset 发现:`discovery.ts` `COMPOSITION_FILE='agent.cordis.yml'` L26、
67
- `USER_PRESET_DIR='.agent-presets'` L41、`discoverPresets` 按 roots 优先级
68
- L177-186;`preset.ts` `Config{default,roots,includeUserRoot}` L51-62。
69
-
70
- ---
71
-
72
- ## 2. 各层"能做什么 / 不能做什么"(层级决定能力)
73
-
74
- | 层 | 挂载时机 | realm | 能贡献 | 不能贡献 |
75
- |---|---|---|---|---|
76
- | **Bundle** | boot(进程启动) | root/host | **任何行**:llm、session、sandbox、subagent、system-prompt、`agent-presets` 本身、以及新 runtime 服务 | — |
77
- | **Agent Preset** | session(每会话挂) | scoped(per-session) | 工具行、system-prompt 段、`isolate` realm 的 scoped 服务 | **root realm 服务被拒**(`mount.ts` 头注 + `leakedServices`:泄露到 root realm 的行直接拒载) |
78
-
79
- **推论(本研究的核心)**:
80
- - runtime 服务(`rlmRuntime`、kernel 生命周期、sandbox 套壳、subagent 桥)
81
- **天生是 bundle 的事**——它们要在 boot 时进 host realm、按 Session/Agent
82
- 键控,而不是挤进 preset 的 per-session scope。
83
- - 模型面(`run_cell` transport、py-sdk、工具 schema 抑制)**天生是 preset
84
- 的事**——它们本来就是 per-session 组合。
85
- - DASHR 现状把**两者都塞进 preset**,正是 §7.4.1 realm 勘误(isolate 是
86
- per-mount 非 per-session)与 root-realm-reject 风险的根因。分层错位,
87
- 不是缺能力。
88
-
89
- ---
90
-
91
- ## 3. DASHR 现在到底在哪一层(实测)
92
-
93
- | 项 | 实测 | 层 |
94
- |---|---|---|
95
- | `dashr/package.json` | `dsh: null`,deps 仅 schemastery + zeromq | **非 bundle** → plain dependency |
96
- | `dashr-presentation/package.json` | `dsh: null` | **非 bundle** → plain dependency |
97
- | preset 文件 | `dashr-presentation/preset/dashr/{agent.cordis.yml,preset.yml}` | session 层 |
98
- | preset 注册方式 | README L48-73:**手动 `--patch` overlay** 给 `agent-presets` 加 `roots` 指到 `node_modules/dashr-tool-presentation/preset`,再手动设 default | **手动的 boot overlay** |
99
-
100
- 即现状 = **plugin(依赖)+ preset(会话模式),且 preset 注册是手动的
101
- boot overlay**。`dsh plugin add <pkg>` 对 `dsh: null` 的包只会装成
102
- "plain dependency, not a profile layer"(`plugin.ts` `reconcilePlugins`
103
- L44-47 的 warning 分支),preset 名册根本不会自动知道它。
104
-
105
- ---
106
-
107
- ## 4. 上升方案:两级目标
108
-
109
- ### 4.1 Target 1 — DASHR 成为 bundle(Profile 层,叠加到既有 profile)
110
-
111
- 最小改动:给一个包声明 bundle,其 `cordis.patch.yml` 在 boot 时完成三件事:
112
-
113
- ```yaml
114
- # dashr 包 package.json
115
- "dsh": { "bundle": { "patch": "./cordis.patch.yml" } }
116
-
117
- # dashr 包 cordis.patch.yml(boot 层,root realm)
118
- - insert:
119
- - id: rlm-runtime
120
- name: 'dashr-code-runtime-ipython' # ① runtime 服务,boot 时 host realm
121
- - id: rlm-presentation
122
- name: 'dashr-tool-presentation' # ② run_cell transport + py-sdk
123
-
124
- - id: agent-presets # ③ 覆盖 preset 名册(web 才有此行)
125
- config:
126
- default: dashr
127
- roots:
128
- - path: <bundle-dir>/preset # 本包自带 preset 目录
129
- trust: system
130
- ```
131
-
132
- 效果:`dsh plugin add dashr-code-runtime-ipython` 一次命令 → `reconcilePlugins`
133
- 检测到 `dsh.bundle.patch` → 自动追加进 `dsh.profile.bundles` → boot 时
134
- runtime + presentation 挂 host realm、preset root 注册、default 翻到 dashr。
135
- **手动 `--patch` 消失**。
136
-
137
- ### 4.2 Target 2 — DASHR 成为独立运行时 profile(headless 式一等运行时)
138
-
139
- **没有"profile package"这种可分发原语**——profile 是用户本地目录,创建靠
140
- `dsh plugin --profile dashr add <pkg>`(`DEFAULT_PROFILE_BUNDLES=[dsh-base]`)。
141
- 所以"发一个 profile"实际是**发一个 bundle + 安装器/文档**。但语义上可以做
142
- 成 headless 的镜像:
143
-
144
- ```
145
- dashr bundle(照抄 headless/cordis.patch.yml 的结构,~25 行)
146
- - id: system-prompt → RLM persona 覆盖
147
- - id: tools → 呈现 RLM cell 界面(对应 headless 的 mode: DSH_TOOLS_MODE)
148
- - insert: rlm-runtime + rlm-presentation + dashr-startup + dashr-runner
149
- ```
150
-
151
- 对比 headless(`packages/bundle/headless/cordis.patch.yml` 全文仅 ~25 行):
152
- 它 **boot 层直接挂 `code-runtime` worker-thread,无 preset 名册**,
153
- `dsh --profile headless "<task>"` 即"编码模式做成一等运行时"。DASHR 照此做
154
- `dsh --profile dashr "<task>"`,即"RLM 做成一等运行时"。这比 Target 1
155
- 更进一步:**连 preset 名册都可有可无**(像 headless 那样 tools.mode 直给)。
156
-
157
- ---
158
-
159
- ## 5. 价值(为什么上升,按权重)
160
-
161
- 1. **runtime 逃出 preset scope**(最大):`rlmRuntime` 从 per-session 的
162
- isolate realm 挤迫,改为 boot 层 host realm + 显式 Session/Agent 键控。
163
- 直接消除 §7.4.1 的 realm-per-mount 勘误与 root-realm-reject 风险。
164
- 2. **身份对齐乃至超越**:PTC 编码模式在 web 里**仍只是五选一的 preset**
165
- (`default: standard`,会话内切换);而 DASHR 升 bundle 后拥有 boot 层,
166
- 是"运行时"而非"模式"——比"与 PTC 同级"更进一步,对标的是 headless。
167
- 3. **boot 级能力组合解锁**:sandbox 套 kernel、subagent 桥 boot 化、snapshot
168
- store、persona、compaction——这些现在被 preset 边界挡住的项,全部可在
169
- bundle 层落地。
170
- 4. **装包摩擦归零**:手动 `--patch` overlay(§3 实证痛点)→ 一次
171
- `dsh plugin add` 自动全落。
172
-
173
- ## 6. 代价与风险(诚实记录,与 v0.5 决策的张力)
174
-
175
- 1. **boot 层耦合面变宽**:bundle 依赖 `agent-presets`/`session`/`sandbox`/
176
- `system-prompt` 等**行 id 与 config 形状稳定**。这与 v0.5 §7.6 换键 +
177
- vendored SD 换来的"运行时零上游依赖"是**相反方向**——前者买自主,后者
178
- 买 boot 杠杆。这是本路线最需要用户拍板的一处权衡。
179
- 2. **`agent-presets` 行只在 `web-app` bundle**(L421-424,`default: standard`),
180
- `dsh-base` 与 `headless` 都没有(实测)。→ Target 1 的"覆盖 default"只在
181
- web profile 成立;headless 场景要走 Target 2(tools.mode 直给),不依赖
182
- preset 名册。这是关键的平台分叉,必须写进方案。
183
- 3. **root realm 服务 = process-global**:per-session 键控从"preset 隔离"变为
184
- "自己 key"。M3-A 已交付 `Map<principal,kernel>` + lazy per-key +
185
- `agent/disposed` per-key teardown,机械件已具备,语义要重述。
186
- 4. **发行面**:bundle 需声明 `dsh.bundle.patch`,且行 id 与 dsh 实际一致
187
- (pre-release 漂移面,比现在宽)。
188
- 5. **两包形态**:bundle 的 patch 按"行名→包名"引用插件,runtime 与
189
- presentation 两包需一个 bundle 包(或 meta-bundle)统一 insert;要么合并
190
- 成单包,要么增一个壳包。
191
-
192
- ## 7. 与 v0.5 蓝图的关系
193
-
194
- - **不改 v0.5 蓝图**;本研究是**平行的"再拔高"路线**,可作为 M4 之后
195
- (或独立分支)的选型输入,不排入当前 M3-B/M4 计划。
196
- - 与 §7.4"第五 preset"不冲突:Target 1 把 runtime 半边升到 bundle、preset
197
- 保留为默认 face;Target 2 把 DASHR 整个做成 headless 式运行时 profile。
198
- 两者都是从"五选一模式"走向"一等运行时"的同一条路上不同深度。
199
-
200
- ## 8. 待决 / 待核清单(供讨论,非本文结论)
201
-
202
- | # | 问题 | 现状 |
203
- |---|---|---|
204
- | 1 | 目标选 Target 1(bundle 叠加)还是 Target 2(headless 式独立 profile)? | 开放 |
205
- | 2 | bundle 内 `rlmRuntime` 用 root realm 还是 isolate realm 的正确 boot 语义 | 开放 |
206
- | 3 | 是否接受 boot 层耦合 dsh 行 id(与 §7.6 零依赖决策的权衡) | 开放,需拍板 |
207
- | 4 | 发行形态:runtime+presentation 两包 + 壳 bundle,还是合并单包 | 开放(包名 scope 仍悬置) |
208
- | 5 | web(Target 1)与 headless(Target 2)是否两条都要,还是先一条 | 开放 |
209
-
210
- ---
211
-
212
- ## 9. 决策附录(2026-08-16 补充:四模式核实 / 隔离实测 / Web UI 复用)
213
-
214
- ### 9.1 四个模式核实(用户"标准/极简/PTC/Creator"四点全对)
215
-
216
- 实读 `apps/cli/config/agent-presets/<id>/preset.yml`:
217
-
218
- | preset id | 显示名 | order | 说明 |
219
- |---|---|---|---|
220
- | `standard` | 标准模式 | 1 | 全功能编码 Agent |
221
- | `code` | PTC 模式 | 2 | Code Mode SDK 呈现工具 |
222
- | `minimal` | 极简模式 | 3 | bash + str_replace_editor 双工具 |
223
- | `cordis` | 创造模式 | 4 | = 你说的 "Creator";用于创作自定义 preset |
224
-
225
- 加第 5 preset `dashr`(RLM 模式)到名册 = 正确路径,与现开发一致。
226
-
227
- ### 9.2 web 是默认 profile、无 TUI 入口
228
-
229
- - `web` 是 hardcoded alias(`args.ts` 原文:"`web` is a hardcoded alias for
230
- `--profile web`");无参数默认起 web。
231
- - `PROFILE_TEMPLATES` 只有 `web`/`headless`;帮助文本里的 `tui` 只是"自定义
232
- profile 名"举例,非出厂模板。
233
- - 结论:交互面 = Web UI(web profile)+ headless 一次性;无 TUI。
234
-
235
- ### 9.3 Web UI = `dsh-web-app` bundle,自包含、原样复用
236
-
237
- `web-app/cordis.patch.yml` 内 UI 相关行:`web-startup` / `webserver` /
238
- `web-runtime`(`dsh-web-app` 本体)、`api-gateway`(`dsh-host-apiproxy`)、
239
- `api-remotes`、`ui-theme` / `ui-layout` / `ui-sidebar` / `ui-settings-*` /
240
- `ui-conversation` …。→ 复用 = 把 `@deepseek-ai/dsh-web-app` 写进
241
- `dsh.profile.bundles`,**不 fork 源码**。
242
-
243
- ### 9.4 profile 之间不隔离(影响"独立 dashr profile"决策)
244
-
245
- - session 按 **workspace(cwd)** 隔离:`~/.dsh/sessions/<转义cwd>/session-<uuid>/`;
246
- session 头记 `agentPreset`,不记 profile。
247
- - `settings.yaml` / credentials **全局**(`~/.dsh/` 下,跨 profile 共享)。
248
- - 含义:独立 `dashr` profile 得到"默认 = RLM + 干净名册",但**得不到数据
249
- 隔离**;若只要"在 Web UI 里加一个 RLM 模式",最简做法是直接扩展现有 web
250
- profile(`dsh plugin --profile web add <dashr-bundle>`),连新 profile 都
251
- 不用建。
252
-
253
- ### 9.5 现状 ≈ Target 1(升 bundle 是"装法正式化",非重构)
254
-
255
- | | 现状(开发中) | 升 bundle(Target 1) |
256
- |---|---|---|
257
- | 包声明 | 两包 `dsh: null`(普通依赖) | 声明 `dsh.bundle.patch` |
258
- | preset 注册 | 手动 `--patch` overlay | bundle 的 `cordis.patch.yml` boot 自动 |
259
- | Web UI | 复用 `dsh-web-app` | 同左(不变) |
260
- | 安装 | `dsh plugin add` 只装普通依赖 | 同命令,自动进 bundles + 挂 runtime + 注册 preset + 设 default |
261
-
262
- ---
263
-
264
- ## 10. 形态收敛:直接做成 Profile(bundle)+ TUI 作为 surface bundle
265
-
266
- ### 10.1 "直接做成 Profile" 的确认(POFA = Profile 解读)
267
-
268
- 用户新判断:Profile 也好、preset 也好,如今都按 bundle 发布,DASHR 既然
269
- 实质是运行时,就直接做成 Profile 层。**成立,且与 §4 收敛一致**:
270
-
271
- - 可分发原语只有 bundle;"Profile 层"与"preset 层"的差别不在发布形态,
272
- 而在**挂载阶段与 realm**(§2)。
273
- - DASHR 的 runtime 半边(`rlmRuntime`/presentation/生命周期)本就该在 boot
274
- 层;模型面半边(`run_cell`/py-sdk)仍是 preset、设为默认。
275
- - 所以"直接做成 Profile"= 把 DASHR 声明成 bundle + 复用 web-app,其余照旧
276
- (§4.1 Target 1)。不是新路线,是把现开发正式化。
277
-
278
- ### 10.2 "同一包既借 Web UI 又用 TUI"——架构上天然成立,且已被生态证实
279
-
280
- dsh 把"交互面"抽象为 **surface bundle**:`dsh-web-app`(Web)、
281
- `dsh-headless`(一次性)。TUI 只是**第三个 surface bundle**,与 runtime
282
- bundle 正交:
283
-
284
- ```
285
- dsh-base(核心)+ DASHR runtime bundle(kernel+presentation,surface 无关)
286
- ├─ + dsh-web-app → dashr-web(借 Web UI)
287
- └─ + dsh-tui → dashr-tui(用 TUI)
288
- ```
289
-
290
- 所以"一个包"= DASHR runtime bundle 一个,同时喂给两个 surface,不需要 fork
291
- 任何东西。
292
-
293
- **关键实证(web 检索 2026-08-16)**:生态里已有现成 TUI,且正是
294
- "out-of-tree dsh plugin bundle"或"over the one DSH HTTP contract":
295
-
296
- - [openguardrails/dsh-tui](https://github.com/openguardrails/dsh-tui) —
297
- Claude Code-style TUI,明确是 **out-of-tree dsh plugin bundle**
298
- - [MashedPotato817/dsh-tui](https://github.com/MashedPotato817/dsh-tui) —
299
- Claude Code-style 对话 + Vim modal + HUD,**走 DSH 单一 HTTP 契约**(即
300
- 复用 web-app 暴露的 `api-gateway`/`api-proxy` RPC,不是 fork Web UI)
301
- - npm [`@dsh-tui/dsh-tui`](https://www.npmjs.com/package/@dsh-tui/dsh-tui)
302
- - [lhjnano/orcatui](https://github.com/lhjnano/orcatui) — 终端多 agent 编排器
303
- (N agent side-by-side,各自 PTY/worktree)——正是你要的 tmux 式 manager 形态
304
-
305
- 这直接回答"要不要抄 Web UI 源码":**TUI 甚至不碰 web-app 源码,它是跑在
306
- 同一条 host RPC 上的另一个 client**。思路 #1(参考开源)因此不是"再多参考
307
- 一个 repo",而是**几乎可以直接踩在现成项目上**。
308
-
309
- ### 10.3 三条 TUI 思路的源码级可行性
310
-
311
- | 思路 | 实测依据 | 工作量 | 风险 |
312
- |---|---|---|---|
313
- | 1 参考开源 dsh-tui | 已存在,out-of-tree bundle + DSH HTTP 契约 | **低**(复用/参考) | 协议随 dsh 0.1.x 漂移;社区项目成熟度待核 |
314
- | 2 复用 PA TUI | `@earendil-works/pi-tui` 自研轻量 ANSI(仅 chalk/get-east-asian-width/marked/mime-types 5 依赖),组件系统齐全(box/input/editor/select-list/markdown/image/loader…)+ `modes/`(`interactive-mode`、`agents-view-mode`=多 agent 视图、`daemon`+`agent-connection`) | **中偏高**(组件可抄,渲染循环/数据源要重接 dsh agent loop + session 事件) | pi-tui 耦合 PA 的 session/daemon 模型;双上游维护 |
315
- | 3 自建 TUI | dsh **无 TUI 源码**(`packages/terminal` 是 shell/PTY 后端组 `terminal`/`terminal-bash`/`tool-terminal`,非 UI;无 ink/blessed 依赖)——用户猜测正确 | **高**(全量) | — |
316
-
317
- 结论:TUI 应作为**独立 surface bundle + 独立里程碑**,与 runtime bundle 解耦;
318
- Web UI(复用 web-app)先跑通,TUI 从思路 #1 起步(参考现成 dsh-tui),
319
- 思路 #2 仅在需要 PA 式"agents-view 多 agent 视图"时再评估移植 pi-tui 组件层。
320
-
321
- ---
322
-
323
- ## 11. 决策结论(暂缓,留后路)
324
-
325
- 2026-08-16 用户定调:**暂不决定**,资料落盘存档即可。
326
-
327
- 1. **暂不深整合 TUI**:官方现处 0.x 早期,bundle 走 Web UI 路径(与 DeepSeek
328
- Web Chat 一脉相承,更 future-proof);官方后续(0.7/0.8 附近)可能自出
329
- TUI。现在 Web UI 已够用,且没有"必须用 TUI 才能完成"的工作。
330
- 2. **留后路原则**:GUI 主攻大方向 + CLI/TUI/headless 必须留入口(LLM 本身
331
- TUI-native / 命令行-native / headless-native,GUI 再成熟也要留尾巴)。
332
- 官方已有 headless 入口,正合此逻辑。
333
- 3. **观望两条趋势**(观察项,非任务):
334
- - 整体是否"GUI 进发、同时留 TUI 尾巴";
335
- - 官方 TUI 是否落地(0.7/0.8)。
336
- 4. **再评估触发条件**:官方出 TUI / 官方 bundle 形态定型 / 出现必须 TUI 的
337
- 工作。
338
-
339
- 对 §8 待决清单的处置:**不关闭、保持开放**,但排期上不主动推进——Target 1
340
- vs 2、TUI 路线选择全部挂起,等官方信号。
341
-
342
- ---
343
-
344
- ## 附:证据索引
345
-
346
- | 结论 | 出处(clone 内实读) |
347
- |---|---|
348
- | Profile = `dsh.profile.bundles` + 用户 patch | `packages/boot/app-boot/src/profile.ts` L36-96 |
349
- | Bundle = 声明 `dsh.bundle.patch`;缺则 fail-loud | `profile.ts` L42-45, L371-397 |
350
- | `dsh plugin add` 按 `dsh.bundle.patch` 有无 reconcile | `apps/cli/src/plugin.ts` L22-25, L39-75 |
351
- | 空根 + bundle 层按序装配 | `apps/cli/src/profile-boot.ts` `composeProfile` |
352
- | Preset = `agent.cordis.yml` 目录,roots 扫描 + 优先级 | `packages/preset/agent-presets/src/discovery.ts` |
353
- | Preset `default` + `roots` 配置 | `preset.ts` L51-62 |
354
- | Preset 拒 root realm 服务 | `mount.ts` 头注 + `leakedServices` |
355
- | 会话选择 + 锁定 | `session.ts`;agent-presets README L148 |
356
- | `agent-presets` 行只在 web-app,`default: standard` | `packages/bundle/web-app/cordis.patch.yml` L421-424 |
357
- | headless = boot 挂 code-runtime、无 preset 名册 | `packages/bundle/headless/cordis.patch.yml` 全文 |
358
- | DASHR 两包 `dsh: null`(非 bundle) | `dashr/dashr/package.json`、`dashr-presentation/package.json` |
359
- | DASHR preset 注册靠手动 `--patch` | `dashr-presentation/README.md` L48-73 |
360
- | 四预设显示名(标准/PTC/极简/创造) | `apps/cli/config/agent-presets/<id>/preset.yml` |
361
- | `web` = 无参数默认别名 | `apps/cli/src/args.ts` L13, L66-70 |
362
- | Web UI 行全在 web-app bundle(自包含) | `packages/bundle/web-app/cordis.patch.yml` L99-198 |
363
- | session 按 workspace(cwd) 隔离、非 profile | `~/.dsh/sessions/<转义cwd>/session-<uuid>/`(活体) |
364
- | settings/credentials 全局共享 | `~/.dsh/settings.yaml`(活体) |
365
- | PA TUI = `pi-tui` 自研轻量 ANSI(5 依赖)+ `modes/` | `prime-agent/packages/tui/`;`packages/coding-agent/src/modes/` |
366
- | dsh 无 TUI 源码(terminal = PTY 后端组) | `packages/terminal/`(组目录:terminal/terminal-bash/tool-terminal) |
367
- | 生态已有 dsh-tui(out-of-tree bundle / DSH HTTP) | web 检索:openguardrails、MashedPotato817、@dsh-tui、orcatui |
@@ -1,171 +0,0 @@
1
- # DSH 沙箱-审批语义缺口:模型先验抑制升级尝试
2
-
3
- > 日期:2026-09-01
4
- > 范围:upstream DSH 运行时权限语义(`@deepseek-ai/dsh-sandbox` / `dsh-sandbox-policy` / `dsh-permission-presets` / `dsh-user-approval`,全部结论来自安装包源码核实 + 本机实测)
5
- > 性质:源码证据链 + 语义缺口分析 + 设计提案
6
- > 关联:`docs/plans/dashr-security-sandbox-analysis.md`(2026-08-17,kernel 沙箱边界穿透);同 session 的 workspace-write 沙箱实测(bwrap `--unshare-pid`,宿主 PID 不可见)
7
-
8
- ## 0. 结论先行(TL;DR)
9
-
10
- **问题**:workspace-write 模式下,模型上下文主动声明 "Current DSH file policy: workspace-write…"(一个只描述限制、不描述出口的句子),却没有告知"受限操作可按调用**单次升级**(`allowed-once`)"。这给大模型注入了一个先验——"整个运行时是沙箱化的、不可绕过的"。后果是模型倾向于**自我设限**:面对 out-of-box 命令时直接报告"受限运行时干不了",**根本不会去尝试**,因此**永远看不到** denial 返回里附带的升级提示。Denial message 是"后话"——它只对**先尝试过**的模型可见;先验一旦抑制了尝试,升级路径对整个运行时就是永不可见的死信息。
11
-
12
- **提议**:沙箱限制**对用户可见**(UI badge + 审批弹窗),但对模型采取"**后知**"披露(model-late disclosure)——不预先声明"你被沙箱化/不可变",让模型先尝试、撞 denial、再从 denial + escalation hint 中学习"可单次升级"。形成「尝试 → 拒绝 → 可升级」的完整闭环,而不是「告知 → 自我设限 → 死锁」。
13
-
14
- **事实支撑**(§2 证据链):DSH 自身就是"双 knob"模型(sandbox/mode × approval/policy,解耦设计,源码原话 "independent … knobs");升级语义字面为 `allowed-once`(单次、按调用、执行前审批);且三个模式的上下文语句**存在不对称**——read-only 模式反而含有反自我审查指令,workspace-write 没有。
15
-
16
- ---
17
-
18
- ## 1. 背景与动机
19
-
20
- - Agent 运行时(DeepSeek Harness)的工具执行经 bwrap 沙箱:`--ro-bind / / --unshare-pid --tmpfs /tmp --bind <workspace>`。根文件系统只读、独立 PID namespace、/tmp 为私有 tmpfs、网络 namespace 共享(实测,2026-09-01)。
21
- - 沙箱之外存在一条**单次热升级**通道:工具调用可带 `sandbox_permissions` 重试,经用户审批后该次调用以更宽模式执行(`allowed-once`),下一条调用回到原有效模式。
22
- - 这条通道**语义上无法从"我被沙箱化"推导出来**:Sandbox(capability 层)与 Approval(decision 层)是正交维度;一个只被告知"你被沙箱化"的模型,不会自行推导出"ask for approval 可以解开沙箱"。
23
- - 本文记录该语义缺口,并提出"用户可见、模型后知"的披露策略。
24
-
25
- ## 2. 源码事实核对(证据链)
26
-
27
- 全部结论可在安装包源码中复现:`<dsh>/node_modules/@deepseek-ai/dsh-{sandbox,sandbox-policy,permission-presets,user-approval}/lib/`。
28
-
29
- ### 2.1 双 knob 模型(`dsh-permission-presets`)
30
-
31
- 设计文档原话:*"User-facing permission presets over the **independent** sandbox-mode and approval-policy knobs."*
32
-
33
- - **knob 1 — sandbox/mode**:`read-only | workspace-write | danger-full-access`
34
- - **knob 2 — approval/policy**:`ask | never`(仅两个值)
35
-
36
- preset 只是两 knob 的捆绑,默认表:
37
-
38
- | preset | sandbox | approval |
39
- |---|---|---|
40
- | `workspace-write` | workspace-write | **ask** |
41
- | `danger-full-access` | danger-full-access | **never** |
42
-
43
- 推论:官方把 unboxed 与 never 绑定,等于承认"ask 的触发源是 denial"——unboxed 模式没有 denial 事件,ask 就成了惰性 knob。用户设想的 "unboxed ask"(unboxed + ask)不是内置 preset,但 `presets` 表可配置、任意组合允许(不匹配任何表项时投影报 `custom`)。
44
-
45
- ### 2.2 单次升级机制(`dsh-sandbox/lib/types/escalation.d.ts` + `lib/index.js`)
46
-
47
- - 升级**在执行前**解决:`approveEscalation` — *"resolve a sandbox-escalation request BEFORE anything executes"*,有序 fail-closed:严格加宽校验 → 审批通道 → 结果映射。
48
- - 审批结果枚举字面:**`'allowed-once' | 'rejected' | 'cancelled' | 'unavailable'`**。
49
- - 粒度**恰好这一次调用**:*"Returns the granted mode to stamp onto exactly this call"*;`SandboxPolicy` 注释 *"an approved escalated retry is a new call with a wider policy"*。→ 不是"逃出沙箱",是**调用级换挡**。
50
- - 严格加宽阶梯(执行期校验,非 schema 静态值):
51
-
52
- ```js
53
- WIDER_MODES = { "read-only": ["workspace-write","danger-full-access"],
54
- "workspace-write": ["danger-full-access"] }
55
- ```
56
-
57
- - 非加宽请求**永不弹审批**(*"a non-widening request never prompts a human"*,直接拒)。
58
- - 无审批通道 / 无 agent → fail closed,绝不静默放行。
59
- - `sandbox_permissions` 与 `justification` 必须成对(理由缺失 = malformed ask)。
60
-
61
- ### 2.3 三个模式的模型上下文语句(`dsh-sandbox-policy/lib/index.js` `renderPolicyContext`)——**不对称在这里**
62
-
63
- | 模式 | 模型看到的上下文 | 是否提及升级 |
64
- |---|---|---|
65
- | `read-only` | "…**Do not refuse a required modification from this policy alone: try an available tool normally and follow any denial and escalation guidance it returns.**" | **是**(反自我审查指令 + 升级预告) |
66
- | `workspace-write` | "Current DSH file policy: workspace-write. …may modify files under the session workspace: … Some platform temporary areas may also be writable." | **否** |
67
- | `danger-full-access` | "The DSH file sandbox does not restrict file modifications by available operations." | 不适用(已是顶) |
68
-
69
- **最常用的 workspace-write 模式没有任何升级提示,而最该防自我设限的 read-only 反而有。** 这正是语义缺口的具体落点。
70
-
71
- ### 2.4 denial + escalation hint:反应式教学(`dsh-sandbox/lib/index.js`)
72
-
73
- - denial 标记:`[sandbox: file access denied under workspace-write mode]`
74
- - 同轮升级提示:`[sandbox: escalation available — retry this exact command once with sandbox_permissions (the narrowest wider mode that suffices) + justification; the approval prompt asks the user]`
75
-
76
- 设计意图(源码注释):nudge *"lives at the decision point so the sanctioned retry does not depend on the model recalling the tool description"*。→ 设计者已知"模型会忘",把提示放在 denial 处。但**它依赖模型先触发 denial**。
77
-
78
- ### 2.5 审批通道(`dsh-user-approval`)
79
-
80
- - `APPROVAL_POLICIES = ["ask","never"]`。
81
- - `ask` 语句:*"Operations that require approval may ask through the configured answerers; without an available answerer, the request fails closed."* —— 未枚举"什么需要审批"。
82
- - `never` 语句(反向教学):*"…do not request sandbox escalation (do not set `sandbox_permissions`)."*
83
- - 审批请求当前**唯一喂入方是升级路径**;不存在"unboxed 下某工具类仍强制审批"的 gate(无硬编码 hook)。→ 想让 unboxed+ask 非惰性,需要给 `request()` 加第二个喂入方。
84
-
85
- ### 2.6 schema 层补充(实测)
86
-
87
- 工具 schema **始终**广播升级词汇(`ESCALATION_TARGETS = ["workspace-write","danger-full-access"]`,受限即广播)。设计注释:防止 session *"stranded … with no lever"*。→ 升级的**词汇**模型永远拿得到;缺口只在**上下文先验**,不在 schema。修 prompt 即可,不用动 schema。
88
-
89
- ## 3. 语义缺口的形式化表述
90
-
91
- ```
92
- 先验注入("workspace-write 限制")→ 模型自我设限("受限运行时,干不了")
93
- → 不尝试 out-of-box 操作 → denial 永不触发
94
- → escalation hint 永不可见 → 升级通道对模型是死信息
95
- → 自我设限成为自我实现的预言
96
- ```
97
-
98
- - Denial message 是**后话**:它只奖励"先尝试"的模型;不尝试的模型永远到不了决策点。
99
- - 触发尝试的常见前提恰恰是**用户主动要求探索边界**(如"你给我探测一下沙箱边界"),日常任务注意力被任务本身拽住,不会自发地元思考能力边界。
100
- - 与 `danger-full-access`(unboxed + never)形成**巨大反差**:一边是"受限且不告知出口",另一边是"全开放且不询问"。中间态(workspace-write + ask 可单次升级)的语义价值因此被埋没。
101
-
102
- ## 4. 设计提案:用户可见、模型后知(model-late disclosure)
103
-
104
- ### 4.1 核心主张
105
-
106
- > 沙箱限制应该**对用户可见**(UI badge、审批弹窗、`/permission` 视图),但**不必在 prompt 里预先声明给模型**——尤其不要用"你被沙箱化、不可改"的表述注入先验。让模型自然去做 out-of-box 尝试(命令行、tool call),然后在 denial 返回值里给它语义提醒(现有 escalation hint 已具备),告诉它可以单次升级。这才是完整闭环。
107
-
108
- - 对用户:策略透明(弹窗携带 `justification` 原文 + 审计记录,通道已存在)。
109
- - 对模型:**不预设失败**,尝试 → denial → hint → escalate(可选)→ 用户批准 → 该调用执行。
110
- - 安全面不扩大:denial 拦截在沙箱层,**命令根本没执行**("nothing has run");尝试失败只是多一轮调用,不构成越权。
111
-
112
- ### 4.2 具体落地选项(按侵入度排序)
113
-
114
- 1. **最小改动(推荐先做)**:改写 `renderPolicyContext` 的 workspace-write 语句,对齐 read-only 的句式——不宣称限制不可变,改为中性 + 出口预告:
115
- - 例如:"Current DSH file policy: workspace-write (restricted writes; some platform temporary areas may also be writable). Do not refuse a required operation from this policy alone: try the tool normally and follow any denial and escalation guidance it returns."
116
- 2. **严格后知(用户主张)**:workspace-write 下完全不向模型声明沙箱状态(策略仅对用户 UI 可见),升级教学完全依赖 denial + hint。副作用:模型可能对常规受限操作(如工作区外写配置)多打几轮 denial——代价小,且正是教学素材。可做成配置开关(如 `discloseSandboxToModel: false`)。
117
- 3. **unboxed ask 前置条件**:若要提供 unboxed+ask preset,必须先实现强制审批 hook(§2.5 所述 `request()` 的第二个喂入方),否则 ask knob 是装饰性的。
118
-
119
- ### 4.3 披露对称性原则(通用准则)
120
-
121
- 无论披露什么,**约束与出口必须成对披露**:告诉模型存在约束,就同时告诉它缓解阀(read-only 语句已示范;`never` 语句是反向示范);不告诉它约束,就由 denial 在决策点教学。禁止"只披露约束、不披露出口"——那是把模型锁进自我实现的预言里。
122
-
123
- ### 4.4 零侵入实现路径(插件侧,机制已核实 2026-09-01)
124
-
125
- > 结论:中性披露**不需要侵入 upstream 源码**。System Prompt 按两个独立集合组装——sections(主 prompt 区)与 contexts("Current runtime context" 快照区);两区都支持插件注册,且有组装期改写钩子。
126
-
127
- **机制核实**(`dsh-system-prompt` + `dsh-agent-loop` 源码):
128
- - `ctx.systemPrompt.section()` / `context()` 均为公开 API,任意 order 可注册;contexts 按 order 排序渲染进 `"Current runtime context. This snapshot supersedes…"` 快照(`sandbox:policy`=110,`approval:policy`=115,`subagent:delegation`=120)。
129
- - `assemble()` 尾部有 `system-prompt/assemble` waterfall("the returned waterfall value is authoritative")——插件可整体改写 assembly,含 contexts 文本。
130
- - DASHR 已注册 `dashr:control-prompt`(section,order 100)与 `dashr:tool-catalog`(150)——注入通道现成。
131
-
132
- **三条路径**(按与政策段落的贴合度排序):
133
- 1. **A. 插件注册 context(order 116)**:`ctx.systemPrompt.context({ name: 'dashr:escalation-guidance', order: 116, text: … })`。渲染进**同一个** runtime-context 快照,紧贴 `approval:policy`(115)之后——模型视为运行时事实的一部分;零上游改动、声明式、无冲突。
134
- 2. **B. assemble waterfall 原位改写**:注册 `system-prompt/assemble` listener,把 `assembly.contexts` 中 `sandbox:policy` 的 text 替换为中性 + 出口预告版。模型看到的是政策段落**本体**被改写,等同原位 patch;代价是 waterfall 语义(last non-undefined wins)需与其他 listener 协调。
135
- 3. **C. 现有 section 追加一句**:在 `dashr:control-prompt` 加一句。可用,但落在主 prompt 区,与 `sandbox:policy`(快照区)**物理分离**——正是"都在 System Prompt 但隔了一段距离"的情形;且 order 100 先于快照区渲染,属次优位。
136
-
137
- 推荐:**A 为主,B 为可选强化**。两者都不改 upstream 一行代码。
138
-
139
- **最终决策(2026-09-01,并入升级批次)**——选项 A 的落地规格:
140
-
141
- - **注入文本(精简:只披露能力,不劝导行为)**:
142
- `Restricted operations may be retried once with sandbox_permissions for single-call escalation, pending user approval.`
143
- (语义即"受限操作可带 sandbox_permissions 单次升级(需用户审批)";**不做**"不要仅凭策略拒绝、先尝试"之类的行为劝导——尝试与否由模型自行决定,运行时只负责让杠杆可知。注入文本用英文,与上游 runtime-context 快照的英文语句同文风。)
144
- - **注入条件(模式判断,仅 workspace-write)**:`text: (ctx) => 有效模式 === 'workspace-write' ? TEXT : ''`(空文本被渲染器过滤,等同 pass):
145
- - `read-only`:pass —— 上游该模式语句已自带反自我审查 + 升级指引(§2.3),无需重复;
146
- - `danger-full-access`:pass —— unboxed,无升级目标可言。
147
- - **机制**:§4.4-A(`ctx.systemPrompt.context({ name: 'dashr:escalation-guidance', order: 116 })`),声明式、零上游改动。
148
- - **批次**:作为一次升级批次中的一项变更,与其余待改项一次性采集实施(§6)。
149
-
150
- ## 5. 权衡与反方观点
151
-
152
- | 维度 | 后知披露的代价 | 缓解 |
153
- |---|---|---|
154
- | 尝试轮次 | 模型可能对常规受限操作多尝试几次才收敛 | denial 是廉价信号;read-only 语句已验证"尝试→指引"模式可用 |
155
- | 用户困惑 | 用户可能看到模型频繁撞 denial | 弹窗/审计已把决策权交还用户;UI badge 表明当前策略 |
156
- | 与"尽量减少 out-of-box 危险动作"的设计哲学 | 后知披露确实会鼓励更多 out-of-box 尝试 | 但尝试被 denial 拦截,**不执行**;真正执行仍需用户审批,风险决策点不变 |
157
- | 模型上下文长度 | 移除先验可省一行;增加出口预告也只是一行 | 净变化为零量级 |
158
-
159
- 反方观点(诚实记录):部分设计者会主张"先验设限"正是安全冗余——模型宁可少做也不越权。但该冗余的代价是把**合法且已有人工审批兜底**的升级通道变成死信息,属于可用性损失换来的虚假安全。审批弹窗(ask)本身就是人工决策点,真正的安全边界在用户那里,不在模型的自我设限里。
160
-
161
- ## 6. 落地建议清单
162
-
163
- - [ ] **插件侧实现(无需上游改动)**:DASHR 注册 `dashr:escalation-guidance` context(order 116,§4.4-A),按 §4.4 最终决策的文本与模式条件实施——仅 workspace-write 注入精简版单次升级披露(read-only / danger-full-access pass)。若改走 upstream PR 路线,再落 `renderPolicyContext`(§4.2-1)。
164
- - [ ] (可选)新增配置项 `discloseSandboxToModel`,默认保留当前披露、可选严格后知(§4.2-2)。
165
- - [ ] 若做 unboxed ask preset:为 `ctx.approval.request()` 增加与沙箱无关的强制审批喂入方(按工具类/高危类),并配套文档说明 ask 只在有触发源时有意义(§4.2-3)。
166
- - [ ] 文档化披露对称性原则(§4.3)为权限语义设计不变量。
167
- - [ ] 将"双 knob 解耦(sandbox = enforcement,approval = decision,可组合不可推导)"写入项目约定(CONTEXT.md 或 ADR)。
168
-
169
- ## 7. 结论
170
-
171
- 语义缺口真实存在且可定位到具体代码行(`dsh-sandbox-policy/lib/index.js` 的 `renderPolicyContext`);修复方向明确——**用户可见、模型后知**:策略对用户透明,对模型不注入"不可变"先验,让 denial + escalation hint 在决策点完成升级教学。该改动不扩大攻击面(denial 拦截在执行前),不增加人工决策负担(审批通道已存在),只消除"模型连试都不敢试"的死锁。