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,350 +0,0 @@
1
- # Cordis 框架研究
2
-
3
- > 记录:2026-08-21 · 一手核验:vendored `@deepseek-ai/cordis` 4.x(本地 4.0.1)源码 +
4
- > `github.com/cordiverse/cordis`(6770★)+ `github.com/cordiverse/paper`(2532★)+
5
- > dsh 官方 docs(`master` @ 2026-08-19)+ dsh `vendor/README.md`。
6
- > 本文是 Cordis 单侧研究(与 Dash 解耦后的文档;Dash 侧见 `dash-research.md`)。
7
-
8
- ---
9
-
10
- ## 1. 总览与时空可组合性
11
-
12
- ### 一句话
13
-
14
- **Cordis 是"时空可组合性的元框架"(A Meta-Framework of Spatiotemporal Composability)**:
15
- 一个 TypeScript 插件框架,把经典类型论的 *effect/coeffect* 对偶落成两套运行时机制——
16
- **可逆效应(Revertible Effects,时间维)** 与 **反应式余效应(Reactive Coeffects,空间维)**,
17
- 使插件"插得上也拔得下、依赖变化自动激活/停用",全程免重启进程。
18
-
19
- ### 血统与时间线
20
-
21
- - 作者 **Shigma(施一凡)**,Koishi 聊天机器人框架作者(2020-01 首版)。2023 年已写
22
- 《可逆的插件系统》设计文(koishi.chat cookbook)——论文雏形,非学术论文。
23
- - **2026-08-13**:论文 + dsh 开源同日。论文 *A Programming Paradigm for Spatiotemporal
24
- Composability*,DeepSeek × 北大,88 页,`github.com/cordiverse/paper`("Draft of August
25
- 13, 2026",active revision)。
26
- - `Cordis` = 拉丁语"心";Koishi 的一切都从 Cordis 开始。全程先工程后理论,DeepSeek 参与
27
- 是 2026 年的事。
28
-
29
- ### 理论支柱:effect / coeffect 对偶 → 运行时机制
30
-
31
- | 维度 | 论文概念 | 工程语义 | 解决的问题 |
32
- |---|---|---|---|
33
- | **时间维** | **Revertible Effects** | 每次上下文修改配显式逆函数,叠成撤销链;卸载时反向执行 | 插件"插得上拔不下"(状态残留、伤及运行中组件) |
34
- | **空间维** | **Reactive Coeffects** | 组件声明依赖 → 自动拓扑编排;依赖齐→ACTIVE,缺→INACTIVE;提供者撤走→依赖者先停;回归→自动恢复 | 补丁式依赖维护 / 循环依赖 / 手写编排代码 |
35
-
36
- 并统一 effect context 与 coeffect context 为**单一 context 类型**(这即"编程范式"),再组合成
37
- **component(组件)**,给出**动态组合的演算**,其元理论把时空可组合性从单组件推广到整个
38
- 交错组件系统。
39
-
40
- ### 作为代码的实现(源码级取证)
41
-
42
- 核心包 9 个源文件(`context/service/fiber/events/registry/reflect/logger/utils/index`,
43
- **实测 2693 行**)。四个构件落地时空可组合性:
44
-
45
- - **`Context`** = 运行时代理(proxy):属性读取走服务解析器(`ctx.tools`/`ctx.llm` 由服务名
46
- 解析,非 import 具体实现)。`extend()`/`isolate()`/`intercept()` 创建作用域子 context。
47
- - **`Fiber`** = 一个插件应用的运行时。持有 `_disposables`(DisposableList)、`inject`(依赖
48
- 声明)、`store`(已解析实现)、`state`(FiberState)、`epoch`(依赖满足度签名)。
49
- - **时间维** `Fiber.effect(execute, label)`:`execute` 立即执行,产出 disposer 被收集;
50
- disposer 被调 **或** fiber 卸载时,disposers **逆注册序(LIFO)** 执行(
51
- `disposables.splice(0).reverse()`)。
52
- - **空间维** `inject` + `_checkImpl` + `_refresh` + `epoch`:遍历每个依赖,任一缺失 →
53
- `epoch=INACTIVE` → `_unload()`(停用);全部存在 → `epoch=':uid:uid...'` → `_reload()`
54
- (激活);**提供者 fiber uid 变化** → epoch 变化 → 依赖者先 unload 再 reload。
55
- - **`Service`** = 服务基类:构造函数 `super(ctx, name)` 即 `ctx.reflect.provide(...)` 注册,
56
- 随所属 fiber 卸载自动注销。
57
- - **`EventsService`** = 事件总线,五种派发模式 `emit/parallel/serial/bail/waterfall`
58
- (waterfall 是 around-middleware,`next()` 委派、不调则短路)。
59
-
60
- ### 生产验证与自认局限
61
-
62
- Koishi:4 年、4000+ 社区插件、作者互不相识,唯一协调机制 = 反应式余效应;切存储后端 /
63
- 重连 IM 适配器时仅依赖变化的插件重激活。论文自认局限:仅 Koishi 一生态验证、仅 TS 单语言
64
- 数据、无与其他替代架构的直接对比。
65
-
66
- ---
67
-
68
- ## 2. 非特权核心(No Privileged Core)
69
-
70
- ### 你的理解的校验(逐点)
71
-
72
- 你的 mental model 基本正确,有两处需要精确化:
73
-
74
- > "基底 binary 可以看作一个入口"
75
-
76
- ✅ 精确。`dsh` 这个 binary 是 `apps/cli` 产出的 `lib/bin.js`,官方自述为 **"a thin
77
- self-executing composition"**(薄的自执行组合)——它只做一件事:调 `dsh-app-boot` 的
78
- `boot()`。
79
-
80
- > "核心自己自举(bootstrap)为一个 plugin"
81
-
82
- ⚠️ 半对。**框架基底(Context + reflect/registry/events/logger 四服务)不是 plugin,它就是
83
- 框架本身**——不是"自举成 plugin",而是"进程里那个被 `new Context()` 造出来的根容器"。
84
- 真正被"自举/挂载"的是 **App 的插件树**(dsh 的 ~195 个插件),它们经 Loader 从
85
- `dsh-base` 的 `cordis.patch.yml` 逐行 insert 到根 context 上。
86
-
87
- > "如果你基于 Cordis 写了另一个 plugin,让它自举为一个核心也是可以的"
88
-
89
- ✅ 对,且措辞可更准:你不是"写一个 plugin 当核心",而是**写一个 Cordis App(一个插件树 +
90
- 一个薄 bin)**,它与 Dash 地位完全平等。Dash 只是"基于 Cordis 的 App 特例"。
91
-
92
- > "Dash 第一个自举的 plugin 就成了核心"
93
-
94
- ⚠️ 需要修正。**没有"第一个插件成为核心"这回事**。"no privileged core" 的准确含义是:
95
- **框架之外没有任何硬编码的、不可替换的模块**。看起来像"核心"的东西(`session`/
96
- `system-prompt`/`tools`/`agent`/`agent-loop` 这六件"脊柱")**全是 `dsh-base` 的
97
- `cordis.patch.yml` 里的普通插件行**,可被上层 patch 按 id 整行替换。所谓"核心"只是
98
- "恰好提供了别人 inject 的基础服务的那个插件",并非特权位。
99
-
100
- ### Bootstrap 链(源码取证)
101
-
102
- ```
103
- dsh 二进制(lib/bin.js,薄壳)
104
- └─ boot(binName, configPath, ...) # dsh-app-boot
105
- ├─ new Context() # 根容器(框架基底,非 plugin)
106
- ├─ 注册 cordis:include + cordis:group builtins
107
- ├─ 安装 Loader
108
- ├─ mountRootInclude(...) # 挂载 cordis.yml 配置树
109
- │ └─ 逐层叠加:bundle patch 层 → profile patch → home patch → --patch
110
- │ └─ 每行 = 一个 plugin(含 dsh-base 的 agent-loop 等"核心")
111
- ├─ assertEntriesLoaded / Activated # 全部解析/激活,否则 fail loud
112
- └─ 返回根 Context
113
- ```
114
-
115
- **关键证据**:`dsh-app-boot` 的 `boot()` 注释明言 "Create the root context, install Loader,
116
- ... mount and await the include tree ... return the root context"。核心(框架)与 App
117
- (插件树)的边界就在 `new Context()` 这一行:它之上全是可 patch 的插件,它本身才是唯一的
118
- "内核"。
119
-
120
- ---
121
-
122
- ## 3. 架构结构测绘
123
-
124
- ### Monorepo 包结构(`cordiverse/cordis`,9 包)
125
-
126
- ```
127
- cordis/
128
- └── packages/
129
- ├── core/ → 发布为 `cordis`:Context/Fiber/Service/Events/Registry/Reflect/Logger
130
- ├── loader/ → `@cordisjs/plugin-loader`:声明式配置加载(YAML/JSON 行 → 插件树)
131
- ├── include/ → `@cordisjs/plugin-include`:配置子树挂载 + `!!js` 表达式
132
- ├── hmr/ → `@cordisjs/plugin-hmr`:热模块替换(保存 → 仅重应用该插件)
133
- ├── group/ → `@cordisjs/plugin-group`:插件分组(isolate realm)
134
- ├── timer/ → `@cordisjs/plugin-timer`:定时服务
135
- ├── create/ → 脚手架(Node 22+)
136
- ├── logger-console/ → 控制台日志后端
137
- └── utils/ → 共享工具
138
- ```
139
-
140
- ### 核心组件与关系
141
-
142
- ```mermaid
143
- flowchart TD
144
- C["Context<br/>运行时 proxy"] --> RF["ReflectService<br/>provide/inject 服务解析器"]
145
- C --> RG["RegistryService<br/>plugin 注册 + Inject"]
146
- C --> EV["EventsService<br/>emit/parallel/serial/bail/waterfall"]
147
- C --> LG["LoggerService"]
148
- RG -->|"ctx.plugin() → Fiber"| F["Fiber<br/>一个插件实例的运行时"]
149
- RF -->|"super(ctx,name) 注册"| S["Service<br/>服务基类"]
150
- S -->|"随 fiber 卸载自动注销"| F
151
- F -->|"effect() 收集 disposer → 逆序撤销(时间维)"| UT["utils / DisposableList"]
152
- F -->|"inject + epoch → 激活/停用(空间维)"| RF
153
- L["loader<br/>import() 模块 → ctx.registry.plugin"] --> RG
154
- I["include<br/>配置子树挂载"] --> L
155
- H["hmr<br/>热重载"] --> F
156
- ```
157
-
158
- ---
159
-
160
- ## 4. 开发语言与打包编译
161
-
162
- ### 4.1 进程内约束(TS-only,Node ESM)
163
-
164
- - `cordis/package.json`:`"type": "module"`、`"main": "lib/index.js"`;依赖仅
165
- `@standard-schema/spec` + `cosmokit`——**零 native addon、零 WASM、零 child_process**。
166
- - 插件入口只有三种形状:`Function(ctx, config)` / `Constructor` / `Object{apply}`,必须求值
167
- 为 JS 可调用对象。
168
- - 插件加载:`tree.import(specifier)` → `unwrapExports()` → `ctx.registry.plugin(...)`。
169
- `ModuleFormat = 'builtin'|'commonjs'|'json'|'module'|'wasm'`(仅 Node loader 格式)。
170
-
171
- ### 4.2 打包编译引擎:能否换成 Bun
172
-
173
- **结论:Cordis 核心(零 native 依赖)可 trivial 编译成 Bun 单文件可执行;dsh 全量表面
174
- "可行但有工程成本",不是"被卡死"。Claude Code 就是现成先例。**
175
-
176
- | 项 | Bun 支持 | 说明 |
177
- |---|---|---|
178
- | `bun build --compile` 单文件可执行 | ✅ | 内嵌 Bun 运行时,客户端无需装 Node;`--target=bun-linux-x64` 交叉编译 |
179
- | `node:child_process`(spawn/PTY) | ✅ | 全支持 |
180
- | `node:worker_threads` | ✅(小缺口) | postMessage/SharedArrayBuffer 支持;resourceLimits/execArgv 部分 |
181
- | `node-pty`(native addon) | ❌ | 历史性坏(oven-sh/bun#7362);Bun 官方替代 = **Bun.Terminal**(v1.3.5 起) |
182
- | `node-addon-landlock-run`(N-API) | ⚠️ | N-API 可加载,但 `.node` 须**静态 require + 逐 target 预编译**才能嵌入 `--compile` |
183
- | tsdown(Rolldown+Oxc) | ⚠️ | 是 Rolldown+Oxc(非 esbuild);Bun 下运行是 experimental,跑 bundler 需 Node 22+ |
184
-
185
- **Claude Code 先例(前提确认为真)**:Anthropic 自 ~v2.1.113 起把 Claude Code 以
186
- **Bun 编译的 standalone 原生二进制**发布(`curl`/brew/winget 装的就是它;npm 包只是下载并
187
- 链接同一二进制的 wrapper,运行时不碰 Node)。**Anthropic 2025-12 收购了 Bun**,部分原因就是
188
- Claude Code 以这种方式 ship。所以"用 Bun 预编译 + 直接 ship binary"不是假设,是存在证明。
189
-
190
- **推荐落地路径**(与 Claude Code 一致):**195 个 npm 包继续用 tsdown 在 Node CI 构建
191
- (不动),只在最终 app 装配 + 编译阶段用 `bun build --compile`**。硬阻塞只有两个:
192
- `node-pty` → 换 `Bun.Terminal`;`node-addon-landlock-run` → 逐 OS/arch 预编译并静态 require。
193
-
194
- ---
195
-
196
- ## 5. 异构代码衔接层(Hetero-Language Bridge)
197
-
198
- ### 结论:官方**已经实现**了"异构语言成为插件模块",形式 = 进程边界 + IPC 桥
199
-
200
- 你对"其实是不是 subprocess 倒无所谓,只要逻辑层自洽、实现无感"的判断是对的——Cordis 的
201
- "everything is plugin" 抽象**确实自洽**:从 Cordis 视角看,`PythonCodeRuntime` 就是一个
202
- 普通 Service provider;它内部 spawn 一个 Python 子进程、用 fd3 桥接,是藏在 `ctx.codeRuntime`
203
- 缝隙背后的实现细节,消费者无感。
204
-
205
- ### 官方实现(`dsh-code-runtime-python` 的 fd3 帧协议)
206
-
207
- 仓库里**真实实现**(非 stub):`packages/code-runtime/code-runtime-python/`(`src/index.ts`
208
- + `py/protocol.py` + e2e tests)。机制:
209
-
210
- - 每个 model program 跑在**全新 `python3 -I` 子进程**里;`stdio: [pipe, pipe, pipe, pipe]`
211
- 的第 4 项 = **fd 3**,作为 framed-JSON 通道;stdout/stderr 留给程序自己的输出。
212
- - **帧 = fd 3 上的 JSON-lines**(每行一个 JSON 对象)。子→宿主:`boot-ack`/`call`/`log`/
213
- `done`;宿主→子:`boot`(首帧)/`run`(`boot-ack` 后)/每 `call` 一个 `reply`。
214
- - **宿主把每帧都当敌对输入**(`validateChildFrame` 逐字段校验 + 重建):model 代码对 fd 3
215
- 有完全访问权、可伪造任意帧,所以进站的 forged 字段被丢弃、非有限 call id 不会回显。
216
- - **无损 JSON codec**(无 `JSON.stringify` 深度限制;迭代遍历;超安全整数走 `BigInt`;
217
- 字节计量),保证 `CodeJsonValue` 深度无界也能过线。
218
- - `py/protocol.py` 是 TS `src/protocol.ts` 的镜像:`TypedDict` 形状 + `PROTOCOL_FD = 3` +
219
- `log_truncation_marker`(**字节级一致**);`protocol-mirror.e2e.ts` 起真实 `python3` 断言
220
- 两侧字段名/必填性不漂移(曾因 round-12 三次字段漂移而加此守卫)。
221
-
222
- TS 侧 `src/index.ts` 把 `PythonCodeRuntime` 注册为 `ctx.codeRuntime` 的 provider——**这就是
223
- "Python 成为 Cordis 插件"的官方答案:TS 宿主侧插件 + 外语子进程 + fd3 JSON-lines IPC**。
224
-
225
- ### 全部异构缝隙(进程边界是唯一的跨语言方式)
226
-
227
- | 缝隙 | 协议 | 边界 | 可达语言 |
228
- |---|---|---|---|
229
- | `ctx.subprocess`(subprocess-local) | stdio + 进程组 | `node:child_process`+node-pty | 任意可执行 |
230
- | `ctx.shell`(bash/pwsh-local) | `bash -c`/pwsh | 出进程 | 任意命令 |
231
- | `dsh-mcp-client` | MCP = JSON-RPC 2.0(stdio / Streamable HTTP) | 出进程/远程 | 语言无关(Python MCP SDK 成熟) |
232
- | `ctx.codeRuntime`(code-runtime-python) | fd3 framed-JSON-lines | Python 子进程 | Python |
233
- | `dsh-sandbox`/`fs-sandbox`/`bash-sandbox` | 策略包装 subprocess/fs | 出进程 | 底层缝隙可达的任意语言 |
234
- | `dsh-typert-*` | Typert RPC 装饰器 + endpoint registry | 进程内 TS 反射 | 仅 TS |
235
-
236
- > 注意:默认 `web` profile 只 bundle `dsh-code-runtime-worker-thread`(TS 后端);Python 后端
237
- > 在仓库里但不随默认 profile 发布,需显式安装。
238
-
239
- ---
240
-
241
- ## 6. Rust 重写
242
-
243
- ### 结论:核心重写**已有人做完**;但"Rust Cordis 兼容纯 TS 插件"不是进程内可行的,"万能"的
244
- 真相是"TS 插件变成又一种异构语言桥"
245
-
246
- - **Cordis 源码量**:核心实测 **2693 行** TS(9 文件);上游仓库总 2590 KB(含 docs/tests)。
247
- - **`cordis-rs` 已经存在**(`docs.rs/cordis-rs`):`@deepseek-ai/cordis` 4.x 的 Rust 移植,
248
- 证明**原生核心(作用域 DI / 生命周期拥有的效应 / Fiber 状态机 / 事件总线 / registry /
249
- reflect / logger)能干净地移植到 Rust**。Rust 插件走 `plugin_sync`/`plugin_async`,无 JS 引擎。
250
- - **异构语言插件**:当前最佳实践 = **WASM Component Model(wasmtime + WIT/bindgen)**;
251
- **Extism** 作为便捷多语言 PDK 层(Rust/Python/Go/JS/TS/C#/Zig/C/C++)。
252
- - **"兼容纯 TS Cordis 插件"的真相**:**进程内不现实**。现有 Cordis/dsh 插件是 Node 程序
253
- (`node:child_process`/`worker_threads`/`node-pty` native addon/ESM import `cordis`/ctx proxy/
254
- inject epoch/热重载)。**没有任何嵌入式 JS 引擎**能提供这套 Node 面——`deno_core`(V8) 默认
255
- 无 Node built-ins;QuickJS/Boa 无 Node API;Extism JS PDK(QuickJS-ng in WASM)明确无
256
- 事件循环/`child_process`/Worker/fs/net、sync-per-export。因此纯 TS 插件必须**在真实
257
- Node/Bun 运行时里出进程跑,走 RPC 桥**——即第 5 节的同一种异构桥,恰好是"又多一种插件类型"。
258
-
259
- | 机制 | 跨语言 | 能跑现有 JS 插件? | 先例 |
260
- |---|---|---|---|
261
- | 原生 Rust 核心(cordis-rs) | 仅 Rust | ❌ | cordis-rs(已 ship) |
262
- | WASM Component Model(wasmtime) | ✅(WIT 多语言) | ❌ | wasmtime 生态 |
263
- | Extism PDK | ✅(Rust/Py/Go/JS/C#...) | ❌(JS PDK 无 Node 面) | Extism |
264
- | 嵌入式 V8(deno_core)/QuickJS/Boa | 仅 JS 子集 | ⚠️ 须重实现 `cordis` + ctx proxy + inject epoch | 无先例 |
265
- | **出进程 Node/Bun + RPC 桥** | ✅(任意语言) | ✅(真实 Node/Bun 跑 TS 插件) | 第 5 节 fd3 / MCP |
266
-
267
- **诚实成本**:原生核心 8–15k LOC / 4–8 周达到对等;**JS 互操作是真正耗时数月的硬层**
268
- (要么在嵌入式引擎里重实现 Node API 面——无先例,`napi-rs` 是反方向;要么让响应式
269
- inject-epoch 语义跨进程边界保持一致)。所以正确的心智模型不是"Rust 版 Cordis 万能兼容 TS",
270
- 而是 **原生 Rust 核心 + TS 插件作为又一种异构语言类型(出进程 Node/Bun + 桥)**。
271
-
272
- ---
273
-
274
- ## 7. 进程内框架与 Recursive Cordis
275
-
276
- ### 7.1 进程内框架的含义(承接你未完成的 1.5)
277
-
278
- Cordis 是**单进程内**的框架:`Context` 是一个进程内的 proxy,服务解析、事件派发、效应撤销
279
- 全部在内存中。这意味着**一切跨进程/跨机器的组合都必须显式引入 IPC**——Cordis 自己不提供
280
- "远程 context 镜像"(把一个远程进程的服务透明地当作本地 `inject` 到的服务)。
281
-
282
- ### 7.2 Recursive Cordis:include 子树 vs alien-binary + IPC 融合
283
-
284
- 你说的两种方案,可行性截然不同:
285
-
286
- **(a) include 子树(直接加载 Dash 插件)——原生、零 IPC、已实现。**
287
- Cordis Multica 作为唯一基底启动 `new Context()`,用 `cordis:include` 把 Dash 的 agent 运行时
288
- 插件直接挂到同一根 context 下(`dsh-app-boot` 的 `mountRootInclude` + dsh 自己 per-session
289
- preset 机制就是同一机制)。Dash 自己的 Cordis 基座**不启动**,Dash 插件直接挂在 Multica 下。
290
- **这就是你说的"直接加载 Dash plugin 就行"——正确,这是默认该走的路。**
291
-
292
- **(b) alien-binary-plugin(启动一个完整 Dash)+ IPC 融合——可行但"融合"是净新增工作。**
293
- "写一个 plugin 去 spawn 一个完整 Dash binary"本身**trivial**:一个 inject `ctx.subprocess` 的
294
- 插件即可。但难点在**"IPC 间的 Cordis 融合"**——把两个 Cordis context 的服务/事件在进程边界
295
- 上桥接起来。**Cordis 没有现成的跨进程 context 桥**:dsh 的跨进程原语(`dsh-sdk-jsonrpc-server`
296
- /sdk-client、`dsh-acp`、`dsh-api-remotes`/api-gateway)暴露的是**一个面**(如 agent 面),不是
297
- **context 本身**(任意服务/事件)。所以:
298
-
299
- - "大家都是 Cordis,IPC 更容易"在**语义层**成立(共享事件/服务词汇,设计桥时有共同语言);
300
- - 在**机制层**不成立:桥本身是净新增,官方未 ship。
301
-
302
- **判定**:两条路不矛盾。默认走 (a)(零 IPC、原生、已实现);(b) 只在"必须让一个完整 Dash
303
- 独立成进程/独立沙箱/独立升级"时才有意义,且要自建 context-bridge 协议(可复用 sdk/acp/
304
- typert 原语)。当前阶段 (b) 是研究级工作,不是免费午餐。
305
-
306
- ---
307
-
308
- ## 8. 同类竞品调研
309
-
310
- 真正**同时**达到时间维(运行时保证的逆函数撤销)+ 空间维(响应式依赖自动激活/停用)的,
311
- 只有 **Cordis、其直系祖先 Koishi、经典对手 OSGi**。
312
-
313
- | 框架 | 语言 | 时间维 | 空间维 | 免重启卸载 |
314
- |---|---|---|---|---|
315
- | **Cordis** | TS | ✅ `Fiber.effect()` LIFO 撤销 | ✅ `inject`+epoch | ✅ |
316
- | **Koishi** | TS | ✅ `fork.dispose()` 逆序撤销 | ✅ 服务 DI | ✅ 热重载 |
317
- | **OSGi + DS** | Java | ✅* bundle stop + `@Deactivate` | ✅ DS `bind/unbind/reconfigure` | ✅ |
318
- | Effect-TS | TS | ✅ Scope/LIFO finalizers | ❌ 无响应式服务激活 | 部分 |
319
- | VS Code Extension Host | TS | ❌ 手动 dispose,无法原地重置 | ❌ activation 一次性 | ❌ 须宿主重载 |
320
- | Inversify / NestJS / Angular | TS | ❌ OnDestroy 是 shutdown 语义 | ❌ 容器图静态 | ❌ |
321
- | Spring(core) | Java | ❌ Spring-DM 已移除 | ❌ `@RefreshScope` 非响应式激活 | ❌ |
322
- | .NET(MEF/Autofac) | C# | 部分(程序集无法卸载) | 部分 recomposition | ❌ 须 AppDomain |
323
- | Umzug(迁移) | JS | ✅* 仅时间维(up/down) | ❌ | N/A |
324
- | webpack/Tapable、Rollup、esbuild | JS | N/A 构建期 | ❌ | N/A |
325
-
326
- **判定**:OSGi 是 Cordis 之前唯一同构的双支柱系统(且免重启卸载);Cordis 的差异化不在
327
- "有没有"而在**严谨度 + 人体工学**——每个 ctx 变更都带运行时追踪的逆函数、逆序重放(路径无关/
328
- 合流性),OSGi 的 `deactivate()` 可靠但依赖作者纪律。Koishi 是直系祖先。Effect-TS 只到时间维;
329
- VS Code 是论文要反对的反例;Nest/Angular/Inversify/Spring/MEF 是空间维或 teardown-only;
330
- Umzug 是相邻的时间维-only;bundler 是构建期。**Cordis 的主张在"类"上不唯一,但在托管语言里
331
- 是形式化根基最干净、免重启实现最彻底的一个。**
332
-
333
- ---
334
-
335
- ## 来源
336
-
337
- - `github.com/cordiverse/cordis`(TypeScript/MIT,`packages/{core,create,group,hmr,include,
338
- loader,logger-console,timer,utils}`)
339
- - `github.com/cordiverse/paper` —— *A Programming Paradigm for Spatiotemporal Composability*
340
- (Draft 2026-08-13)
341
- - dsh 仓库 `vendor/README.md`(vendored 清单 + 18 项本地修改 + sync 流程)、
342
- `packages/boot/app-boot/README.md`(bootstrap)、
343
- `.agents/notes/.../2026-07-31-code-runtime-python-fd3-protocol.md` + `py/protocol.py`(fd3)
344
- - Vendored 源码 `~/.dsh/profiles/node_modules/@deepseek-ai/cordis/src/*.ts`(@4.0.1,实测 2693 行)
345
- - Bun 官方 docs(`bun build --compile` / Node-API / Bun.Terminal)、`anthropic.com/news/
346
- anthropic-acquires-bun`、Claude Code quickstart
347
- - `docs.rs/cordis-rs`、`arroyo.dev/blog/rust-plugin-systems`、`extism.org`、`wasmtime`、
348
- `deno_core` / `rquickjs` / `Boa`、`tartanllama.xyz/posts/wasm-plugins`
349
- - 竞品:OSGi Core Spec 9.0、`github.com/koishijs/koishi`、Effect v3 Scope、VS Code extension
350
- anatomy
@@ -1,186 +0,0 @@
1
- # DSH Web Profile 包分类测绘
2
-
3
- > 记录:2026-08-31 · 一手核验:`~/.dsh/profiles/node_modules/@deepseek-ai/`(220 包,dsh-alpha
4
- > 4.x 全量)+ `~/workspaces/dsh-alpha/packages/` 源码(client 各包 src import 逐文件 grep)。
5
- > 范围:Web Profile(含 headless-only 包一并列出,但标注为"非 Web")。
6
-
7
- ---
8
-
9
- ## 1. 一句话结论
10
-
11
- **DSH Web 的依赖不是一条干净的"核心 → 中间层 → UI"三层管道,而是"双轨":**
12
-
13
- - **运行时数据**走干净的管道:`核心(service) → 中间层(api-controller RPC) → UI`。
14
- - **类型**却是**双轨旁路**:UI 层**跳过中间层,直接 import 底层核心的类型**
15
- (`dsh-session/types`、`dsh-llm`、`dsh-agent`、`dsh-scope`)。
16
-
17
- **量化证据**:40 个 `dsh-client-ui-*` 包里,**17 个直接 import 底层核心**(session/llm/agent/scope),
18
- 共约 70 个文件;其中 `ui-conversation`、`ui-chat` 各 14 个文件。这是"UI 直接 import 底层"的铁证。
19
-
20
- ---
21
-
22
- ## 2. 数据流验证(你问的核心问题)
23
-
24
- ### 2.1 UI 直接 import 底层核心(跳过中间层)
25
-
26
- ```
27
- ui-conversation: 14 文件
28
- ui-chat: 14 文件
29
- ui-workspace: 5 文件
30
- ui-workflow-run: 3 文件
31
- ui-trajectory: 3 文件
32
- ui-subagent: 3 文件
33
- ui-input-trigger: 3 文件
34
- ui-message-feedback: 2 文件
35
- ui-goal: 2 文件
36
- ui-commands: 2 文件
37
- + 7 个包各 1 文件(session / skill / plan / model-selection / deliverables / approval / user-questions)
38
- ```
39
-
40
- 具体例子(`ui-session/src/client/index.ts`):
41
-
42
- ```ts
43
- import type { SessionId } from '@deepseek-ai/dsh-session/types' // 直接 import 底层
44
- import type {} from '@deepseek-ai/dsh-api-session-controller/client' // 同时 import 中间层
45
- ```
46
-
47
- ### 2.2 判定
48
-
49
- **是,UI 层既走中间层(拿运行时数据),又跳过中间层(拿类型)。** 两条轨:
50
-
51
- | 轨 | 路径 | 内容 |
52
- |---|---|---|
53
- | 数据轨 | 核心 service → api-controller → RPC → UI | 运行时数据(会话列表、transcript、模型) |
54
- | 类型轨 | 核心 types → UI **直接 import** | `SessionId`/`SessionEvent`/`ContentBlock` 等形状 |
55
-
56
- **这正是"UI 类型耦合在底层、不在中间层"的机制层证据**——你之前问"alias dsh-session 能不能
57
- 只服务前端 100 行",答案是**不能**,因为前端 17 个包、约 70 个文件直接 import 了 dsh-session/
58
- dsh-llm 的类型,alias 必须覆盖这些。
59
-
60
- ---
61
-
62
- ## 3. 四层分类清单(220 包)
63
-
64
- ### ① Cordis 框架底层(15)
65
-
66
- | 组 | 包 |
67
- |---|---|
68
- | 框架核心 | `cordis` |
69
- | 框架插件 | `cordis-plugin-loader` `cordis-plugin-include` `cordis-plugin-group` `cordis-plugin-timer` `cordis-plugin-hmr` |
70
- | 框架配套 | `cosmokit` `schemastery` `node-addon-landlock-run` |
71
- | 共享基础 | `dsh-invariants` `dsh-brand` `dsh-timeout` `dsh-atomic-write` `dsh-util-crypto` `dsh-util-workspace-path` |
72
-
73
- ### ② DSH 核心底层(约 140,含 headless)
74
-
75
- | 组 | 包 |
76
- |---|---|
77
- | 入口/自举 | `dsh` `dsh-base` `dsh-app-boot` `dsh-home-paths` `dsh-launch-environment` |
78
- | host 基建 | `dsh-host-webserver` `dsh-host-frontend-static` `dsh-host-directory-picker`(+auto/browse/native) `dsh-host-plugin-inventory` |
79
- | **Session(17)** | `dsh-session` `dsh-session-persistence` `dsh-session-persistence-jsonl` `dsh-session-projection` `dsh-session-projection-cache` `dsh-session-query` `dsh-session-query-sqlite` `dsh-session-title` `dsh-session-title-first-prompt-llm` `dsh-session-title-llm` `dsh-session-log-deepseek` `dsh-session-log-export` `dsh-session-stats` `dsh-session-telemetry` `dsh-session-telemetry-otel` `dsh-session-checkpoint-policy` `dsh-session-reference` |
80
- | **LLM(5)** | `dsh-llm` `dsh-llm-deepseek` `dsh-llm-pi-ai` `dsh-llm-retry` `dsh-deepseek-llm-api-extensions` |
81
- | **Agent(7)** | `dsh-agent` `dsh-agent-loop` `dsh-agent-presets` `dsh-agent-default-model` `dsh-agent-instructions` `dsh-agent-tool-presentation` `dsh-agent-spine-demo` |
82
- | scope/workspace | `dsh-scope` `dsh-workspace` |
83
- | **Tools(20)** | `dsh-tools` `dsh-tool-{ask-user,bash,bash-persistent,call-timeout-policy,cordis,fs,fs-search,goal,jobs,pwsh,pwsh-persistent,ralph,skill,str-replace-editor,subagent,subagent-control,subagent-report,todo,web,workflow}` |
84
- | 命令/技能 | `dsh-commands` `dsh-command-{compact,feedback,goal}` `dsh-skill` `dsh-skill-{badge,filesystem}` |
85
- | 子代理/子进程 | `dsh-subagent` `dsh-subagent-{fork-in-process,in-process-driver,spawn-in-process}` `dsh-subprocess` `dsh-subprocess-local` |
86
- | shell/sandbox/fs | `dsh-shell` `dsh-shell-env` `dsh-bash-{local,sandbox}` `dsh-pwsh-{local,sandbox}` `dsh-sandbox` `dsh-sandbox-{local,policy,windows-acl}` `dsh-fs` `dsh-fs-{local,observation-policy,sandbox}` `dsh-win32-process` |
87
- | code-runtime | `dsh-code-runtime` `dsh-code-runtime-worker-thread` |
88
- | 存储/spill/压缩 | `dsh-storage` `dsh-storage-{domain,json}` `dsh-spill` `dsh-spill-{local,policy}` `dsh-compaction` `dsh-compaction-{basic,tool-result-pruner}` |
89
- | jobs/attachment/credential | `dsh-jobs` `dsh-jobs-local` `dsh-attachment` `dsh-attachment-local` `dsh-credentials` `dsh-credentials-local` |
90
- | 权限/审批 | `dsh-permission-presets` `dsh-authorization` `dsh-user-approval` `dsh-user-questions` |
91
- | 消息/引用 | `dsh-message-feedback` `dsh-file-reference` `dsh-file-reference-local` |
92
- | goal/plan/persona/system | `dsh-goal` `dsh-goal-round-driver` `dsh-plan-mode` `dsh-persona` `dsh-system-prompt` `dsh-schedule` `dsh-time-context` `dsh-tmux-context` |
93
- | hooks | `dsh-hook-protocol` `dsh-hooks-claude-code` `dsh-hooks-codex` |
94
- | MCP/杂项 | `dsh-mcp-client` `dsh-token-meter` `dsh-output-retention` `dsh-native-command` `dsh-repeat-tool-reminder` `dsh-settings` `dsh-settings-file` `dsh-workflow` `dsh-workflow-worker-thread` `dsh-plugin-package-inventory-deepseek` |
95
- | *headless-only* | `dsh-headless` `dsh-cmdline` `dsh-terminal` `dsh-terminal-bash` |
96
-
97
- ### ③ DSH 中间层(API/RPC 转接,约 16)
98
-
99
- | 组 | 包 |
100
- |---|---|
101
- | API BFF | `dsh-api-gateway` `dsh-api-remotes` `dsh-api-session-controller` `dsh-api-settings-controller` `dsh-api-workspace-controller` |
102
- | RPC 机制 | `dsh-typert-protocol` `dsh-typert-registry` `dsh-typert-loader` |
103
- | RPC 传输 | `dsh-client-connection` |
104
- | 双半 runner | `dsh-cordis-host-runner` `dsh-cordis-client-runner` |
105
- | ACP | `dsh-acp` `dsh-acp-app` |
106
- | SDK | `dsh-sdk-app` `dsh-sdk-jsonrpc-server` `dsh-sdk-minimal` `dsh-sdk-protocol` |
107
-
108
- ### ④ DSH UI 层(约 50)
109
-
110
- | 组 | 包 |
111
- |---|---|
112
- | **UI 组件(40)** | `dsh-client-ui-{agent-preset,approval,attachment,brand-official,chat,commands,conversation,cordis,deliverables,directory-picker-browse,directory-picker-native,goal,input-trigger,jobs,layout,message-feedback,model-selection,permission-presets,plan,reference,renderer,session,settings,settings-general,settings-models,settings-plugin-inventory,settings-plugins,sidebar,skill,subagent,theme,tool,trajectory,user-questions,workflow-run,workspace}`(40 个) |
113
- | client 基建 | `dsh-client-modules` `dsh-client-locale` `dsh-client-hmr` `dsh-client-store` |
114
- | web 组装 | `dsh-web` `dsh-web-app` `dsh-web-frontend` |
115
- | web 工具 | `dsh-web-fetch-http` `dsh-web-search-deepseek` `dsh-webhook` `dsh-webhook-github` |
116
-
117
- ---
118
-
119
- ## 4. Mermaid 分层图
120
-
121
- ```mermaid
122
- flowchart TD
123
- subgraph L1["① Cordis 框架底层"]
124
- cordis["cordis"]
125
- cp["cordis-plugin-loader / include / group / timer / hmr"]
126
- base["cosmokit · schemastery · node-addon-landlock-run"]
127
- shared["dsh-invariants · dsh-brand · dsh-timeout · dsh-atomic-write · dsh-util-*"]
128
- end
129
-
130
- subgraph L2["② DSH 核心底层"]
131
- boot["dsh · dsh-base · dsh-app-boot · dsh-home-paths"]
132
- host["dsh-host-webserver · host-frontend-static · host-directory-picker · host-plugin-inventory"]
133
- session["dsh-session · session-persistence · session-projection · session-query · session-title · session-log · session-stats · session-telemetry"]
134
- llm["dsh-llm · llm-deepseek · llm-pi-ai · llm-retry · deepseek-llm-api-extensions"]
135
- agent["dsh-agent · agent-loop · agent-presets · agent-default-model · agent-instructions"]
136
- scope["dsh-scope · dsh-workspace"]
137
- tools["dsh-tools · dsh-tool-*(20)· dsh-command-* · dsh-skill-* · dsh-subagent-*"]
138
- runtime["dsh-subprocess · shell · bash · pwsh · sandbox · fs · code-runtime · storage · spill · compaction · jobs · attachment · credentials"]
139
- policy["dsh-permission-presets · authorization · user-approval · hook-protocol · mcp-client"]
140
- end
141
-
142
- subgraph L3["③ DSH 中间层(API/RPC 转接)"]
143
- api["dsh-api-gateway · api-remotes · api-session-controller · api-settings-controller · api-workspace-controller"]
144
- rpc["dsh-typert-protocol · typert-registry · typert-loader · client-connection"]
145
- runner["dsh-cordis-host-runner · cordis-client-runner"]
146
- ext["dsh-acp · acp-app · dsh-sdk-app · sdk-jsonrpc-server · sdk-protocol"]
147
- end
148
-
149
- subgraph L4["④ DSH UI 层"]
150
- renderer["dsh-client-ui-renderer(SlotRegistry + React mount)"]
151
- shell["dsh-client-ui-layout · sidebar · theme"]
152
- chat["dsh-client-ui-chat · session · conversation · trajectory · message-feedback"]
153
- model["dsh-client-ui-model-selection · agent-preset · permission-presets"]
154
- ws["dsh-client-ui-workspace · goal · plan · jobs · workflow-run · deliverables"]
155
- misc["dsh-client-ui-* 其余(approval · attachment · commands · reference · skill · subagent · tool · user-questions · input-trigger · settings-* · directory-picker-* · cordis · brand-official)"]
156
- infra["dsh-client-modules · client-locale · client-hmr · client-store"]
157
- web["dsh-web · dsh-web-app · dsh-web-frontend"]
158
- end
159
-
160
- L2 -->|"运行时数据(service → RPC)"| L3
161
- L3 -->|"运行时数据(RPC → 浏览器)"| L4
162
- L2 -.->|"类型直连:SessionId / SessionEvent / ContentBlock(跳过中间层,17 个 UI 包约 70 文件)"| L4
163
- L1 --> L2
164
- ```
165
-
166
- ---
167
-
168
- ## 5. 关键发现汇总
169
-
170
- 1. **不是干净三层管道**:数据走 `核心→中间层→UI`,但**类型走 `核心→UI` 旁路**。
171
- 2. **类型耦合在底层,不在中间层**:`dsh-client-ui-session` 直接 `import { SessionId } from
172
- 'dsh-session/types'`,`ui-chat`/`ui-conversation` 各 14 文件直接 import dsh-session/dsh-llm。
173
- 3. **对桥接层的意义**:要斩断 dsh-session,代价不在 api-controller(中间层),而在 UI 层那
174
- ~70 个文件的类型 import——这才是真正的耦合点。
175
- 4. **中间层(api-controller)是运行时数据的分发器**,不是类型隔离层;类型隔离在 UI 层直接
176
- import 底层时就破了。
177
-
178
- ---
179
-
180
- ## 来源
181
-
182
- - `~/.dsh/profiles/node_modules/@deepseek-ai/`:220 包清单(`ls`)+ 各包 `package.json` 的
183
- `description`/`peerDependencies`/`dependencies`。
184
- - `~/workspaces/dsh-alpha/packages/client/`:`ui-*/src` 逐文件 grep `import ... from
185
- '@deepseek-ai/dsh-(session|llm|agent|scope)'` 与 `'@deepseek-ai/dsh-api-*-controller/client'`。
186
- - 关联:`dsh-web-ui-slot-system-research.md`(UI 插槽机制)、`cordis-research.md`(Cordis 服务端)。