better-dsh 0.2.3 → 0.2.4-b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cordis.patch.yml +47 -16
- package/docs/10_plans/2026-09-23-remote-execution-framework.md +236 -0
- package/docs/10_plans/2026-09-23-remote-framework-impl.md +2083 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/docs/50_test-reports/2026-09-17-plugins/351/241/265/345/205/255/347/273/204/344/273/266/346/213/206/345/210/206/345/256/236/346/265/213/346/212/245/345/221/212.md +76 -0
- package/docs/50_test-reports/2026-09-23-remote-framework/345/256/236/346/265/213/346/212/245/345/221/212.md +92 -0
- package/docs/50_test-reports/2026-09-23-remote-framework/347/254/254/344/270/200/344/272/272/347/247/260/345/244/215/346/265/213/346/212/245/345/221/212.md +125 -0
- package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-local-test-report.md +44 -0
- package/docs/50_test-reports/upstream-dsh-0.1.3-alpha.2-report.md +110 -0
- package/docs/50_test-reports/upstream-dsh-0.1.5-rc.2-local-test-report.md +79 -0
- 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
- 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
- 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
- package/docs/specs/agent/spec.md +54 -0
- package/docs/specs/ast/spec.md +34 -0
- package/docs/specs/compaction-recall/spec.md +46 -0
- package/docs/specs/ctx/spec.md +107 -0
- package/docs/specs/dsh/spec.md +47 -0
- package/docs/specs/dvc/spec.md +87 -0
- package/docs/specs/escalation-guidance/spec.md +44 -0
- package/docs/specs/fs-scheme-resolution/spec.md +37 -0
- package/docs/specs/hash-edit/spec.md +41 -0
- package/docs/specs/http-read/spec.md +73 -0
- package/docs/specs/kernel-provisioning/spec.md +53 -0
- package/docs/specs/lsp/spec.md +121 -0
- package/docs/specs/mobile-layout/spec.md +108 -0
- package/docs/specs/model-failover/spec.md +20 -0
- package/docs/specs/plugins-page-components/spec.md +79 -0
- package/docs/specs/preact-ui-shell/spec.md +22 -0
- package/docs/specs/repl-dispatch-resilience/spec.md +21 -0
- package/docs/specs/skill/spec.md +58 -0
- package/docs/specs/tool-surface/spec.md +222 -0
- package/docs/specs/url-schema/spec.md +148 -0
- package/docs/specs/web-trust-fence/spec.md +43 -0
- package/docs/upstream-dsh-0.1.5-rc.2-report.md +156 -0
- package/dsh-docs/AGENTS.md +75 -0
- package/dsh-docs/agent-lifecycle.md +84 -0
- package/dsh-docs/agent-lifecycle.zh.md +86 -0
- package/dsh-docs/api-gateway.md +164 -0
- package/dsh-docs/api-gateway.zh.md +164 -0
- package/dsh-docs/architecture.md +150 -0
- package/dsh-docs/architecture.zh.md +154 -0
- package/dsh-docs/capability-seams.md +543 -0
- package/dsh-docs/capability-seams.zh.md +545 -0
- package/dsh-docs/config-catalog.md +3473 -0
- package/dsh-docs/config-catalog.zh.md +3474 -0
- package/dsh-docs/cookbook/adding-a-package.md +117 -0
- package/dsh-docs/cookbook/adding-a-package.zh.md +119 -0
- package/dsh-docs/cookbook/adding-a-remote-api.md +197 -0
- package/dsh-docs/cookbook/adding-a-remote-api.zh.md +197 -0
- package/dsh-docs/cookbook/adding-a-session-format-version.md +109 -0
- package/dsh-docs/cookbook/adding-a-session-format-version.zh.md +109 -0
- package/dsh-docs/cookbook/adding-a-settings-card.md +102 -0
- package/dsh-docs/cookbook/adding-a-settings-card.zh.md +102 -0
- package/dsh-docs/cookbook/adding-a-tool.md +101 -0
- package/dsh-docs/cookbook/adding-a-tool.zh.md +103 -0
- package/dsh-docs/cookbook/adding-a-vendored-package.md +59 -0
- package/dsh-docs/cookbook/adding-a-vendored-package.zh.md +59 -0
- package/dsh-docs/cookbook/adding-an-llm-adapter.md +43 -0
- package/dsh-docs/cookbook/adding-an-llm-adapter.zh.md +43 -0
- package/dsh-docs/cookbook/extension-cookbook.md +132 -0
- package/dsh-docs/cookbook/extension-cookbook.zh.md +136 -0
- package/dsh-docs/cookbook/maintaining-dsh-code-review.md +64 -0
- package/dsh-docs/cookbook/maintaining-dsh-code-review.zh.md +64 -0
- package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
- package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
- package/dsh-docs/cordis-api/context.md +364 -0
- package/dsh-docs/cordis-api/context.zh.md +366 -0
- package/dsh-docs/cordis-api/events.md +207 -0
- package/dsh-docs/cordis-api/events.zh.md +209 -0
- package/dsh-docs/cordis-api/fiber.md +375 -0
- package/dsh-docs/cordis-api/fiber.zh.md +377 -0
- package/dsh-docs/cordis-api/inherited.md +39 -0
- package/dsh-docs/cordis-api/registry.md +152 -0
- package/dsh-docs/cordis-api/registry.zh.md +154 -0
- package/dsh-docs/cordis-api/service.md +102 -0
- package/dsh-docs/cordis-api/service.zh.md +104 -0
- package/dsh-docs/cordis-primer.md +45 -0
- package/dsh-docs/cordis-primer.zh.md +51 -0
- package/dsh-docs/cordis-tutorial/01-first-plugin.md +95 -0
- package/dsh-docs/cordis-tutorial/01-first-plugin.zh.md +95 -0
- package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
- package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +98 -0
- package/dsh-docs/cordis-tutorial/03-services.md +98 -0
- package/dsh-docs/cordis-tutorial/03-services.zh.md +98 -0
- package/dsh-docs/cordis-tutorial/04-events.md +144 -0
- package/dsh-docs/cordis-tutorial/04-events.zh.md +144 -0
- package/dsh-docs/cordis-tutorial/05-config.md +84 -0
- package/dsh-docs/cordis-tutorial/05-config.zh.md +84 -0
- package/dsh-docs/cordis-tutorial/06-composition-and-hmr.md +113 -0
- package/dsh-docs/cordis-tutorial/06-composition-and-hmr.zh.md +113 -0
- package/dsh-docs/cordis-tutorial/07-into-the-harness.md +108 -0
- package/dsh-docs/cordis-tutorial/07-into-the-harness.zh.md +108 -0
- package/dsh-docs/cordis-tutorial/index.md +60 -0
- package/dsh-docs/cordis-tutorial/index.zh.md +62 -0
- package/dsh-docs/deepseek-llm-api-wire-extensions.md +163 -0
- package/dsh-docs/deepseek-llm-api-wire-extensions.zh.md +163 -0
- package/dsh-docs/defensive-patterns.md +33 -0
- package/dsh-docs/defensive-patterns.zh.md +35 -0
- package/dsh-docs/development.md +167 -0
- package/dsh-docs/development.zh.md +173 -0
- package/dsh-docs/event-producer-consumer.md +86 -0
- package/dsh-docs/event-producer-consumer.zh.md +88 -0
- package/dsh-docs/glossary.md +45 -0
- package/dsh-docs/glossary.zh.md +45 -0
- package/dsh-docs/graph-atlas.md +22 -0
- package/dsh-docs/graph-atlas.zh.md +24 -0
- package/dsh-docs/i18n/README.md +60 -0
- package/dsh-docs/i18n/README.zh.md +62 -0
- package/dsh-docs/i18n/style-samples.md +87 -0
- package/dsh-docs/i18n/terminology.md +214 -0
- package/dsh-docs/i18n/translation-prompt.md +263 -0
- package/dsh-docs/i18n/translation-rules.md +69 -0
- package/dsh-docs/i18n/translation-rules.zh.md +69 -0
- package/dsh-docs/module-graph.md +1411 -0
- package/dsh-docs/module-graph.zh.md +1413 -0
- package/dsh-docs/persistence-catalog.md +1075 -0
- package/dsh-docs/persistence-catalog.zh.md +1077 -0
- package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.md +113 -0
- package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
- package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
- package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
- package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
- package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
- package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
- package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
- package/dsh-docs/postmortem/README.md +18 -0
- package/dsh-docs/postmortem/README.zh.md +18 -0
- package/dsh-docs/rescope.md +53 -0
- package/dsh-docs/rescope.zh.md +53 -0
- package/dsh-docs/session-format-status.md +47 -0
- package/dsh-docs/session-format-status.zh.md +47 -0
- package/dsh-docs/subsystems/README.md +61 -0
- package/dsh-docs/subsystems/README.zh.md +61 -0
- package/dsh-docs/subsystems/agent-team.md +207 -0
- package/dsh-docs/subsystems/agent-team.zh.md +207 -0
- package/dsh-docs/subsystems/approval.md +170 -0
- package/dsh-docs/subsystems/approval.zh.md +170 -0
- package/dsh-docs/subsystems/attachment.md +351 -0
- package/dsh-docs/subsystems/attachment.zh.md +351 -0
- package/dsh-docs/subsystems/client-modules.md +168 -0
- package/dsh-docs/subsystems/client-modules.zh.md +168 -0
- package/dsh-docs/subsystems/client-resources.md +91 -0
- package/dsh-docs/subsystems/client-resources.zh.md +91 -0
- package/dsh-docs/subsystems/code-runtime.md +195 -0
- package/dsh-docs/subsystems/code-runtime.zh.md +195 -0
- package/dsh-docs/subsystems/commands.md +219 -0
- package/dsh-docs/subsystems/commands.zh.md +219 -0
- package/dsh-docs/subsystems/compaction.md +238 -0
- package/dsh-docs/subsystems/compaction.zh.md +238 -0
- package/dsh-docs/subsystems/conversation.md +258 -0
- package/dsh-docs/subsystems/conversation.zh.md +258 -0
- package/dsh-docs/subsystems/core.md +1209 -0
- package/dsh-docs/subsystems/core.zh.md +1219 -0
- package/dsh-docs/subsystems/credentials.md +329 -0
- package/dsh-docs/subsystems/credentials.zh.md +329 -0
- package/dsh-docs/subsystems/extensions.md +382 -0
- package/dsh-docs/subsystems/extensions.zh.md +382 -0
- package/dsh-docs/subsystems/feedback.md +266 -0
- package/dsh-docs/subsystems/feedback.zh.md +266 -0
- package/dsh-docs/subsystems/filesystem.md +505 -0
- package/dsh-docs/subsystems/filesystem.zh.md +505 -0
- package/dsh-docs/subsystems/goal.md +277 -0
- package/dsh-docs/subsystems/goal.zh.md +277 -0
- package/dsh-docs/subsystems/invariants.md +88 -0
- package/dsh-docs/subsystems/invariants.zh.md +88 -0
- package/dsh-docs/subsystems/jobs.md +290 -0
- package/dsh-docs/subsystems/jobs.zh.md +290 -0
- package/dsh-docs/subsystems/llm-streaming.md +1080 -0
- package/dsh-docs/subsystems/llm-streaming.zh.md +1086 -0
- package/dsh-docs/subsystems/lsp.md +202 -0
- package/dsh-docs/subsystems/lsp.zh.md +202 -0
- package/dsh-docs/subsystems/permission-presets.md +131 -0
- package/dsh-docs/subsystems/permission-presets.zh.md +131 -0
- package/dsh-docs/subsystems/persistence.md +395 -0
- package/dsh-docs/subsystems/persistence.zh.md +395 -0
- package/dsh-docs/subsystems/plan.md +87 -0
- package/dsh-docs/subsystems/plan.zh.md +87 -0
- package/dsh-docs/subsystems/sandbox.md +220 -0
- package/dsh-docs/subsystems/sandbox.zh.md +220 -0
- package/dsh-docs/subsystems/schedule.md +192 -0
- package/dsh-docs/subsystems/schedule.zh.md +192 -0
- package/dsh-docs/subsystems/scope.md +59 -0
- package/dsh-docs/subsystems/scope.zh.md +59 -0
- package/dsh-docs/subsystems/session-projection.md +354 -0
- package/dsh-docs/subsystems/session-projection.zh.md +354 -0
- package/dsh-docs/subsystems/session-query.md +509 -0
- package/dsh-docs/subsystems/session-query.zh.md +509 -0
- package/dsh-docs/subsystems/session-reference.md +219 -0
- package/dsh-docs/subsystems/session-reference.zh.md +219 -0
- package/dsh-docs/subsystems/session-telemetry.md +194 -0
- package/dsh-docs/subsystems/session-telemetry.zh.md +194 -0
- package/dsh-docs/subsystems/session-title.md +204 -0
- package/dsh-docs/subsystems/session-title.zh.md +204 -0
- package/dsh-docs/subsystems/session.md +1155 -0
- package/dsh-docs/subsystems/session.zh.md +1159 -0
- package/dsh-docs/subsystems/settings.md +405 -0
- package/dsh-docs/subsystems/settings.zh.md +405 -0
- package/dsh-docs/subsystems/shell.md +303 -0
- package/dsh-docs/subsystems/shell.zh.md +303 -0
- package/dsh-docs/subsystems/sidebar-right.md +148 -0
- package/dsh-docs/subsystems/sidebar-right.zh.md +148 -0
- package/dsh-docs/subsystems/skills.md +354 -0
- package/dsh-docs/subsystems/skills.zh.md +354 -0
- package/dsh-docs/subsystems/slots.md +175 -0
- package/dsh-docs/subsystems/slots.zh.md +175 -0
- package/dsh-docs/subsystems/spill.md +117 -0
- package/dsh-docs/subsystems/spill.zh.md +117 -0
- package/dsh-docs/subsystems/storage.md +260 -0
- package/dsh-docs/subsystems/storage.zh.md +260 -0
- package/dsh-docs/subsystems/subagent.md +766 -0
- package/dsh-docs/subsystems/subagent.zh.md +770 -0
- package/dsh-docs/subsystems/subprocess.md +324 -0
- package/dsh-docs/subsystems/subprocess.zh.md +324 -0
- package/dsh-docs/subsystems/system-prompt.md +220 -0
- package/dsh-docs/subsystems/system-prompt.zh.md +220 -0
- package/dsh-docs/subsystems/terminal.md +184 -0
- package/dsh-docs/subsystems/terminal.zh.md +184 -0
- package/dsh-docs/subsystems/todo.md +32 -0
- package/dsh-docs/subsystems/todo.zh.md +32 -0
- package/dsh-docs/subsystems/token-meter.md +105 -0
- package/dsh-docs/subsystems/token-meter.zh.md +105 -0
- package/dsh-docs/subsystems/tools.md +720 -0
- package/dsh-docs/subsystems/tools.zh.md +720 -0
- package/dsh-docs/subsystems/typert.md +343 -0
- package/dsh-docs/subsystems/typert.zh.md +343 -0
- package/dsh-docs/subsystems/user-questions.md +178 -0
- package/dsh-docs/subsystems/user-questions.zh.md +178 -0
- package/dsh-docs/subsystems/web-client.md +95 -0
- package/dsh-docs/subsystems/web-client.zh.md +95 -0
- package/dsh-docs/subsystems/web-server.md +154 -0
- package/dsh-docs/subsystems/web-server.zh.md +154 -0
- package/dsh-docs/subsystems/web.md +206 -0
- package/dsh-docs/subsystems/web.zh.md +206 -0
- package/dsh-docs/subsystems/webhook.md +70 -0
- package/dsh-docs/subsystems/webhook.zh.md +70 -0
- package/dsh-docs/subsystems/workflow.md +278 -0
- package/dsh-docs/subsystems/workflow.zh.md +278 -0
- package/dsh-docs/subsystems/workspace.md +321 -0
- package/dsh-docs/subsystems/workspace.zh.md +321 -0
- package/dsh-docs/testing.md +54 -0
- package/dsh-docs/testing.zh.md +54 -0
- package/dsh-docs/tool-catalog.md +2225 -0
- package/dsh-docs/tool-catalog.zh.md +2233 -0
- package/dsh-docs/tool-execution-pipeline.md +62 -0
- package/dsh-docs/tool-execution-pipeline.zh.md +64 -0
- package/dsh-docs/user/develop/basic/config.md +106 -0
- package/dsh-docs/user/develop/basic/config.zh.md +106 -0
- package/dsh-docs/user/develop/basic/index.md +144 -0
- package/dsh-docs/user/develop/basic/index.zh.md +144 -0
- package/dsh-docs/user/develop/basic/publish.md +183 -0
- package/dsh-docs/user/develop/basic/publish.zh.md +183 -0
- package/dsh-docs/user/develop/basic/tool.md +52 -0
- package/dsh-docs/user/develop/basic/tool.zh.md +52 -0
- package/dsh-docs/user/develop/framework/events.md +143 -0
- package/dsh-docs/user/develop/framework/events.zh.md +143 -0
- package/dsh-docs/user/develop/framework/index.md +137 -0
- package/dsh-docs/user/develop/framework/index.zh.md +137 -0
- package/dsh-docs/user/develop/framework/service.md +148 -0
- package/dsh-docs/user/develop/framework/service.zh.md +150 -0
- package/dsh-docs/user/develop/practice/dynamic-cordis.md +15 -0
- package/dsh-docs/user/develop/practice/dynamic-cordis.zh.md +15 -0
- package/dsh-docs/user/develop/practice/index.md +155 -0
- package/dsh-docs/user/develop/practice/index.zh.md +155 -0
- package/dsh-docs/user/develop/practice/llm-adapter.md +189 -0
- package/dsh-docs/user/develop/practice/llm-adapter.zh.md +189 -0
- package/dsh-docs/user/guide/github-review.md +102 -0
- package/dsh-docs/user/guide/github-review.zh.md +102 -0
- package/dsh-docs/user/guide/index.md +30 -0
- package/dsh-docs/user/guide/index.zh.md +30 -0
- package/dsh-docs/user/guide/mcp-memory.md +101 -0
- package/dsh-docs/user/guide/mcp-memory.zh.md +101 -0
- package/dsh-docs/user/guide/network-proxy.md +85 -0
- package/dsh-docs/user/guide/network-proxy.zh.md +85 -0
- package/dsh-docs/user/guide/providers.md +190 -0
- package/dsh-docs/user/guide/providers.zh.md +190 -0
- package/dsh-docs/user/guide/python-sdk.md +150 -0
- package/dsh-docs/user/guide/python-sdk.zh.md +150 -0
- package/dsh-docs/user/guide/schedule.md +21 -0
- package/dsh-docs/user/guide/schedule.zh.md +21 -0
- package/dsh-docs/user/index.md +11 -0
- package/dsh-docs/user/index.zh.md +11 -0
- package/dsh-docs/web-styling.md +29 -0
- package/dsh-docs/web-styling.zh.md +29 -0
- package/eval-description.md +33 -0
- package/lib/client/index.js +328 -89
- package/lib/compaction/index.d.ts +47 -0
- package/lib/compaction/index.js +159 -0
- package/lib/failover/index.d.ts +35 -0
- package/lib/failover/index.js +141 -0
- package/lib/fs-aware/sandbox-plugin.d.ts +71 -0
- package/lib/fs-aware/sandbox-plugin.js +249 -0
- package/lib/index.d.ts +10 -41
- package/lib/index.js +226 -8173
- package/lib/lsp-server-registry-946ysdqg.js +972 -0
- package/lib/lsp-server-registry-XU6aHSqZ.js +3 -0
- package/lib/mobile/plugin.d.ts +29 -0
- package/lib/mobile/plugin.js +54 -0
- package/lib/native-capture-x_Hos2e8.js +68 -0
- package/lib/py-sdk-Chvy92MB.js +178 -0
- package/lib/py-sdk.d.ts +19 -2
- package/lib/py-sdk.js +2 -2
- package/lib/remote/plugin.d.ts +24 -0
- package/lib/remote/plugin.js +1095 -0
- package/lib/url-schemes/index.d.ts +88 -0
- package/lib/url-schemes/index.js +7200 -0
- package/lib/web-trust-BO66y72w.js +361 -0
- package/lib/web-trust-CgpBoFv3.d.ts +106 -0
- package/lib/web-trust.d.ts +2 -0
- package/lib/web-trust.js +3 -0
- package/lib/wrap-Dr8XtIak.js +747 -0
- package/package.json +87 -56
- package/url-schemes-instruction.md +22 -0
- package/control-prompt.md +0 -37
- package/docs/50_test-reports/v0.1.8d_artifacts/README.md +0 -138
- package/docs/50_test-reports/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
- package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
- package/docs/50_test-reports/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
- package/docs/50_test-reports/v0.1.8d_artifacts/functions.json +0 -592
- package/docs/50_test-reports/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
- package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
- package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
- package/docs/50_test-reports/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
- package/docs/50_test-reports/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
- package/docs/50_test-reports/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
- package/docs/50_test-reports/v0.2.0b_artifacts/hashline-probe.md +0 -5
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
- package/docs/50_test-reports/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
- package/docs/60_exploration-and-research/cordis-research.md +0 -350
- package/docs/60_exploration-and-research/dsh-web-profile-package-map.md +0 -186
- package/docs/60_exploration-and-research/dsh-web-ui-slot-system-research.md +0 -310
- package/docs/60_exploration-and-research/dsh-webui-strip-boundary-research.md +0 -300
- package/docs/60_exploration-and-research/ios-chat-app-bridge-research.md +0 -324
- package/docs/60_exploration-and-research/web-frontend-composability-research.md +0 -191
- 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
- package/docs/adr/0001-bridge-tool-layer-not-service-layer.md +0 -14
- package/docs/adr/0002-masking-is-presentation-only.md +0 -15
- package/docs/plans/A2A-messaging-channel-test-archive.md +0 -256
- package/docs/plans/code-mode-vs-rlm-ipython-comparison.md +0 -137
- package/docs/plans/dashr-blueprint-review.md +0 -201
- package/docs/plans/dashr-blueprint.md +0 -561
- package/docs/plans/dashr-compaction-window-and-archive.md +0 -307
- package/docs/plans/dashr-profile-layer-feasibility.md +0 -367
- package/docs/plans/dashr-sandbox-escalation-semantics-gap.md +0 -171
- package/docs/plans/dashr-security-sandbox-analysis.md +0 -187
- package/docs/plans/dashr-surface-invariant-and-omp-imports.md +0 -97
- package/docs/plans/ipython-kernel-interactive-interface-test-report.md +0 -152
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft.md +0 -146
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v3.md +0 -50
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v4.md +0 -79
- package/docs/plans/kernel-refactoring/Dash-vs-PrimeAgent-systemprompt-toolcatalog-comparison.md +0 -138
- package/docs/plans/kernel-refactoring/RLM-system-prompt-injection-gap-report.md +0 -161
- package/docs/plans/kernel-refactoring/V0.1.5-development-plan.md +0 -109
- package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_dsh.md +0 -50
- package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_prime.md +0 -113
- package/docs/plans/recallable-compaction.md +0 -147
- package/docs/plans/spike-tag-repro.mjs +0 -102
- package/docs/plans/upstream-analysis.md +0 -128
- package/docs/v0.1.8-improved-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -142
- package/docs/v0.1.8-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -193
- package/docs/v0.1.8b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -96
- package/docs/v0.1.8c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -127
- package/docs/v0.1.8d-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -150
- package/docs/v0.1.8d_artifacts/README.md +0 -138
- package/docs/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
- package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
- package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
- package/docs/v0.1.8d_artifacts/functions.json +0 -592
- package/docs/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
- package/docs/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
- package/docs/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
- package/docs/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
- package/docs/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
- package/docs/v0.1.8e-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -224
- package/docs/v0.1.9a-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -168
- package/docs/v0.2.0b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -123
- package/docs/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
- package/docs/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
- package/docs/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
- package/docs/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
- package/docs/v0.2.0b_artifacts/hashline-probe.md +0 -5
- package/docs/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
- package/docs/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
- package/docs/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
- package/docs/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
- package/docs/v0.2.1-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -110
- package/docs/v0.2.1b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -86
- package/docs/v0.2.1c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -66
- package/lib/py-sdk-BCaOGYz7.d.ts +0 -125
- package/lib/py-sdk-CbgYiX8O.js +0 -691
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# fs-scheme-resolution — 实测报告(change 2026-09-12-fs-scheme-resolution)
|
|
2
|
+
|
|
3
|
+
> 状态:**代码 + 单测 + 活体自测完成**;npm publish 未启动(AGENTS §〇,等 user 单次确认)。
|
|
4
|
+
|
|
5
|
+
## 1. 被测对象与身份锚定
|
|
6
|
+
|
|
7
|
+
| 项 | 值 |
|
|
8
|
+
|---|---|
|
|
9
|
+
| change | `2026-09-12-fs-scheme-resolution`(FS 层挂载 + 工具解绑——上一 change 的 Phase-2 尖兵兑现) |
|
|
10
|
+
| 实例 | `dsh-4999-test`(0.1.5-rc.2 + better-dsh monorepo 副本,home `.dsh-test`) |
|
|
11
|
+
| 挂载 | home 层 `.dsh-test/cordis.patch.yml`(新建):`{id: fs-sandbox, name: 'better-dsh/fs-aware-sandbox', config: {urlSchemes: true}}` + `{id: better-dsh, config: {hashline: false}}` |
|
|
12
|
+
| 关键裁决 | D2:ctx:///agent:// 为会话型 scheme,FS 层不解析(结构化 `CTX_SESSION_LAYER` 边界),工具层呈现分支继续服务 |
|
|
13
|
+
| 实测会话 | `session-1c6ebcab`(自驱,`.scratch/url-schemes-live-driver5.sh`) |
|
|
14
|
+
|
|
15
|
+
## 2. 代码交付
|
|
16
|
+
|
|
17
|
+
- `src/fs-aware/sandbox-plugin.ts`:`FsAwareSandboxFileSystem extends SandboxedFileSystem`(**静态**继承——替换行下沙箱包定义性在场;`fs` 服务名由 FileSystem 基类 `super(ctx, 'fs')` 烙定);override resolve/stat/readText(scheme → UrlResolver 解引用;ctx://、agent:// → `CTX_SESSION_LAYER`)+ writeText/editText(virtual → `FS_VIRTUAL_READONLY`);`urlSchemes: false` → 全 super 逐位 stock。FS 层 resolver = skill(ctx.skills + fs=this)/ dsh(ctx.settings + resolveDocsDir)/ dvc(模块级共享注册表)/ http。
|
|
18
|
+
- 构建面:tsdown 第二 entry → `lib/fs-aware/sandbox-plugin.js`;package.json `exports['./fs-aware-sandbox']`。
|
|
19
|
+
|
|
20
|
+
## 3. 验证
|
|
21
|
+
|
|
22
|
+
| 层 | 结果 |
|
|
23
|
+
|---|---|
|
|
24
|
+
| 单测 `fs-aware.spec` | **5/5**:dsh://docs 虚拟解引用 + stat、CTX_SESSION_LAYER 边界(resolve/readText/agent://)、FS_VIRTUAL_READONLY(writeText×2)、真实路径透传、gate off stock 退化 |
|
|
25
|
+
| 全量 | vitest **487 passed / 14 failed**(基线同族,宿主 API 漂移);tsc **13 基线**;openspec **2/2**(新 change strict 过) |
|
|
26
|
+
| 活体(三轮自驱同法) | 见 §4 |
|
|
27
|
+
|
|
28
|
+
## 4. 活体自测(hashline OFF = read 为零工具层参与的原生 read)
|
|
29
|
+
|
|
30
|
+
| # | 探针 | 观测 | 判定 |
|
|
31
|
+
|---|---|---|---|
|
|
32
|
+
| 1 | 原生 read `dsh://docs` | **8,929 chars 文档清单**(agent-lifecycle.md、AGENTS.md、api-gateway.md…) | ✅ **FS 闸口解析直达证据**——零工具层 scheme 代码参与 |
|
|
33
|
+
| 2 | 原生 read `dvc://` | 677 chars 设备表(ast_edit/ast_grep/browser/lsp) | ✅ 注册表共享成立 |
|
|
34
|
+
| 3 | 原生 read `ctx://session` 系 | 走工具层呈现分支(gates.urlSchemes on),未知 face → 结构化错误;`user_prompts[0]` 正常 | ✅ D2 边界:会话型留工具层;无 wrapper 的消费方则得 `CTX_SESSION_LAYER`(单测证明) |
|
|
35
|
+
| 4 | 原生 read `package.json`(path 参数) | isError=true(原生参数校验诚实失败),agent 自纠 `dashr/package.json` 成功 | ✅ 原生语义如实呈现 |
|
|
36
|
+
| 5 | 真实路径读取 | 正常(native 格式,无锚点——hashline off 的预期形态) | ✅ 真实路径零扰动 |
|
|
37
|
+
| 6 | agent 自发扩展 | eval/glob/bash 附加探针(50,520 chars 输出)全健康 | ✅ 无回归 |
|
|
38
|
+
|
|
39
|
+
压缩链(`/compact`,13 items / 7,889 tok)与 session persistence 全程正常(FS 替换未扰动会话存储——其自持 fs 不经 ctx.fs,设计如此)。
|
|
40
|
+
|
|
41
|
+
## 4b. 挂载机制的证伪与改道(重要工程记录)
|
|
42
|
+
|
|
43
|
+
「home/profile 层同 id 行重述 fs-sandbox + name 重指」在 0.1.5-rc.2 上**不可用**:三种 name 形态(bare 子路径 / 带引号 bare / 相对路径)全部**静默回滚**为 stock(dump 与活体行为双证)。根因:boot 期行导入走 `loader.internal.import`(编译期 bun-registry,仅 @deepseek-ai/* 在册),非在册名替换导入失败 → `Entry.update` 回滚;upstream 根 symlink 亦不达(import 不走 Node 分支)。**采纳改道 = 实例级方法包装**(`src/fs-aware/wrap.ts`,doc §5.3 最后手段):包装活体 ctx.fs 的 5 个公开方法,urlSchemes 总闸 + symbol 幂等 + 随重启还原;子路径模块/exports 实验回退(D1b 详录 design.md)。已知代价:上游改这 5 个方法签名即碎(公开面,可控)。
|
|
44
|
+
|
|
45
|
+
> **gates 标签(2026-09-13 补)**:§4 活体于 `urlSchemes: true + hashline: false`(原生 read + FS 包装层)取证。
|
|
46
|
+
|
|
47
|
+
## 4c. Gate on/off 变体 + LSP 成功路径(✅ 2026-09-12 深夜补测)
|
|
48
|
+
|
|
49
|
+
- **gate OFF 活体变体(task 2.4 ✅)**:双闸关闭(better-dsh `urlSchemes:false` + fs 行 false)重启后自驱实测——原生 read 把 `dsh://docs` 按相对路径折叠(`/home/u1/workspaces/dashr/dsh:/docs not found`,测试 agent 原话「只有常规的 not found…没有虚拟文件系统,也没有 scheme 解析失败之类的专门报错」),真实文件读取不受影响——**逐位等同 stock**,unit+live 双证。
|
|
50
|
+
- **LSP 成功路径(task 2.5 ✅)**:安装 typescript-language-server 6.0.0 + typescript@5.9(**坑**:TS 7.x 无 JS tsserver,t-ls 6.x 需 5.x;且 t-ls 6.0 无 `--tsserver-path` 选项,靠 workspace 根的 node_modules 发现——已装 `/home/u1/workspaces/dashr/node_modules/typescript`)。`write dvc://lsp {action:diagnostics, file:.scratch/lsp-probe.ts}` → server 拉起 → 结构化诊断**精准命中夹具故意埋的 TS2322 type error(line 8)**;同一探针的 wire 渲染含完整 payload JSON(§3.1 修复活体证实)。definition/references/hover/format 共享同一 LSP client,按需补测。
|
|
51
|
+
- 六 scheme 修复(§3.1/§3.3/§3.4)已随后续轮次活体证实:`?q=` 行过滤、glob path-backed 翻译、dvc payload 上 wire。
|
|
52
|
+
|
|
53
|
+
## 4d. skill:// 重分类为会话层 scheme(✅ 2026-09-13 user 裁决 + 活体复验)
|
|
54
|
+
|
|
55
|
+
**裁决**:技能加载路径解析(CWD / user-level global / app 运行时根如 `.claw/skills`、`.hermes/skills`;扫描深度——DSH 只扫 `skills/` 下一层(`dir/SKILL.md` 或 `*.md`),superpowers/openspec 的二层嵌套扫不到,而 OMP 式 `**/skills/*/SKILL.md` 任意深度命中)**全部是宿主 `dsh-skill-filesystem` 的业务逻辑,插件不得自写一套近似版**。第一版补通道(`sessionCwd` 配置 + scopedAware list 启发式 + 错误信息建议 `.agents/skills/<name>/SKILL.md` 直读)整体拆除。
|
|
56
|
+
|
|
57
|
+
**证伪链**(推翻上一轮「P1-b 已修复」的活体结论):
|
|
58
|
+
1. **dump-config(.dsh-test 活体)**:`dsh-web-app` bundle patch 在宿主层 **disable** 了 `skill-filesystem` 与 `tool-skill` 行 → web profile 的 **全局层没有任何 skill provider**,技能只在各 agent preset 的 scope 层可见(会话 catalog 可见书签级技能即是 preset 层工具的产物)。
|
|
59
|
+
2. **离线 probe**(monorepo 同组合):全局层 `list({cwd})` 11 项、`get('book-to-skill',{cwd})` OK——registry 本身无恙;4999 活体失败是部署组合(provider 只在 preset 层)所致,非「agent-scope 结构性不可见」。
|
|
60
|
+
3. **4999 活体 A/B**(session 8b6dcf85):FS 层读 user-global 技能(`skill://markitdown`,**无需 cwd** 即应可见)与 project 技能(`skill://book-to-skill`)**双双 `unknown`** → sessionCwd 通道与启发式在真实部署下从未生效(全局层 list 同空)。
|
|
61
|
+
|
|
62
|
+
**最终形态**:`skill://` 与 `ctx://`/`agent://` 同族,FS 层一律 `CTX_SESSION_LAYER` 边界错误(指名原生 `skill` 工具为调用通道);`sessionCwd` 从 schema、wrap 线、profile patch 行整体移除;工具层 handler lookup 收敛为 `dsh-tool-skill` 精确镜像(cwd 只取 `agent.session.header.cwd`,scope = agent);原生 `skill` 工具解禁态即为全功能调用路径。
|
|
63
|
+
|
|
64
|
+
**活体复验(5+1 探针全过,2026-09-13)**:
|
|
65
|
+
|
|
66
|
+
| 探针 | 结果 |
|
|
67
|
+
|---|---|
|
|
68
|
+
| `read skill://book-to-skill`(FS 层) | ✅ 结构化边界错误,指名原生 skill 工具(session 37899b26) |
|
|
69
|
+
| `read skill://markitdown:1-5`(FS 层,user-global 名) | ✅ 同上,与技能名无关(session bfa99754) |
|
|
70
|
+
| 原生 `skill` 工具 `name=book-to-skill` | ✅ 完整 `<skill_content>` + resourceBase(session f12a206e) |
|
|
71
|
+
| `read https://example.com` | ✅ 正常抓取,P1-a 存活(session 60418790) |
|
|
72
|
+
| `read dsh://docs:1-3` | ✅ 选择器正常(session c742a81f) |
|
|
73
|
+
| `grep path=skill://book-to-skill pattern=^#` | ✅ 560 matches,工具层通道完好(session 029aa5bb) |
|
|
74
|
+
|
|
75
|
+
回归:vitest 489 passed / 14 failed(agent-family 12 + url-schemes.spec 2,host-drift 基线族,零新增;总测试数 505→504 系删除一条已失效的 cwd-passthrough 测试);tsc 13(基线);openspec valid。构建:rsync → tsdown → build-client,`sessionCwd`/`URL_SKILL_NOT_INVOCABLE_SCOPE` 在 lib 双 chunk 0 命中。
|
|
76
|
+
|
|
77
|
+
## 5. 边界与遗留
|
|
78
|
+
|
|
79
|
+
- `urlSchemes:false` 活体变体:单测已覆盖(gate off 全 super 矩阵),活体变体启动一轮并入下次批量验证(tasks 2.4 部分完成)。
|
|
80
|
+
- `FS_VIRTUAL_READONLY` 经工具 write 不可达(write wrapper 的 scheme 分发先行拦截——dvc 执行语义保留),该错误面由非 wrapper 消费方触发,单测覆盖。
|
|
81
|
+
- prod 采用:用户侧加同款 home patch 行(模板见 `.dsh-test/cordis.patch.yml`);npm publish 未启动。
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# 2026-09-12 URL schemes 全矩阵语法实测 + scheme catalog 单一源化 — 实测报告
|
|
2
|
+
|
|
3
|
+
## 〇、元信息
|
|
4
|
+
|
|
5
|
+
| 项 | 值 |
|
|
6
|
+
|---|---|
|
|
7
|
+
| 日期 | 2026-09-12 |
|
|
8
|
+
| 变更 | `url-schemes`: scheme 枚举单一源化(新增 `catalog.ts`)+ 全 scheme/工具/语法矩阵实测 |
|
|
9
|
+
| 实测形态 | **第一人称活体实测**:在运行中的 4999 实例里,用真实 agent session 经 `eval` pad 调 `tool.read/write/grep/glob` 逐条打靶(非静态走查、非单测代理) |
|
|
10
|
+
| 实测实例 | `http://127.0.0.1:4999`,session `session-114394eb-1dc6-4ee3-8f03-d863167c2528`,`DSH_HOME=/home/u1/workspaces/dashr/.dsh-test` |
|
|
11
|
+
| canonical 源 | `/home/u1/workspaces/dashr/dashr` |
|
|
12
|
+
| 验证副本 | `upstream/deepseek-harness/packages/better-dsh/better-dsh`(AGENTS.md §二 Dev/Test 1) |
|
|
13
|
+
| 基线 | 工作树处于 `url-schema/` → `url-schemes/` 重命名进行中(未提交),非本次变更所引入 |
|
|
14
|
+
| 发布状态 | **未发布、未构建、未重启**(见 §七) |
|
|
15
|
+
|
|
16
|
+
> 起因:user 问"哪些 scheme 能在 4 个工具里用",并特别要求核验 **device(`dvc://`)** 与 **`ctx://`** 是否各自遵循统一语法(一级/二级 subpath + 冒号 selector)。同时裁定把散落的 scheme 枚举**合并为单一源**并**结构化 surface、附示例**,以提高运行时大模型的可见度。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 一、结论摘要
|
|
21
|
+
|
|
22
|
+
1. **user 的假设基本成立但不完整**:5 个自有 scheme + `http(s)://` 在 `read`/`grep`/`glob` 三个工具中**全部可用**;但 **`write` 并非全 scheme 可用——只有 `dvc://` 可写**,其余 6 个 scheme token 一律结构化拒绝(`ctx://` 另有定制文案)。同一句"write 也支持 scheme://"不成立。
|
|
23
|
+
2. **scheme 枚举点远多于"两个地方"**:实测清点为 **6 处**(`read.description`、`read.path.description`、`general-section.ts`、`write.ts` 的 `REGISTERED_SCHEMES`、`selector.ts` 的无 scheme 报错、以及 `resolver/index/grep/glob` 文档块)。这正是漂移的土壤。
|
|
24
|
+
3. **`ctx://` 的缺席是"出生缺陷"**:`git log -S'skill/agent/dsh/dvc/ctx'` 无任何命中 ⇒ 自 `074b6ae`(v0.1.8c) 引入以来,`read` 的两处枚举**从未包含 `ctx://`**,且是唯一被系统提示词单列 bullet 的 scheme。已修复并加回归护栏。
|
|
25
|
+
4. **`ctx://` 与 `dvc://` 各自"部分"遵循统一语法**:
|
|
26
|
+
- `ctx://` —— **不遵循**。它的元素寻址用 **方括号 `[n]` 且写在 path 里**,`selector.ts` 完全不认识;`/original` 是 path 后缀。它虽是 `selectorAware`,却**只接受 `:raw`/`:N-M`**,`:path/` 与 `?q=` 抛 `CTX_BAD_SELECTOR`。故"五个 scheme 共享一套 selector 语法"的文档断言**为假**。
|
|
27
|
+
- `dvc://` —— device 名只取**第一段**,`dvc://browser/sub` 的 `/sub` **被静默丢弃**;但它作为非 selectorAware handler,**接受**全部统一 selector。
|
|
28
|
+
5. 发现 **13 项偏差/缺陷**(§五),其中 **3 项为功能性缺陷**(`dsh://docs` 号称 path-backed 实未实现,导致 `glob` 返回 0 与 JSON 碎片当路径)。
|
|
29
|
+
6. 验证:副本全量 **483 测试 / 482 通过 / 1 失败**,该 1 失败为**改动前既存**的环境性失败(§六基线对照);我改动的文件 **tsc 0 error**。
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 二、改动清单
|
|
34
|
+
|
|
35
|
+
### 新增
|
|
36
|
+
|
|
37
|
+
- `src/url-schemes/catalog.ts` —— **scheme 集的唯一真源**。`SCHEME_CATALOGUE`(每 scheme:`names/display/paths/purpose/example/write/selector`)+ 派生的 `SCHEME_NAMES`、`SCHEME_DISPLAYS`、`READ_ONLY_SCHEME_COUNT` + 两个渲染器 `renderGeneralSectionText()`、`renderExampleHint()`。**零依赖**(不 import `selector.ts`/handlers),故低层模块可安全反向引用而不成环。
|
|
38
|
+
|
|
39
|
+
### 改为从单一源渲染
|
|
40
|
+
|
|
41
|
+
| 文件 | 改动 |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `src/url-schemes/general-section.ts` | 删掉硬编码 `GENERAL_SECTION_TEXT`,改 `renderGeneralSectionText()` |
|
|
44
|
+
| `src/url-schemes/tools/read.ts` | 两处枚举(工具 description + `path` 参数)不再手写;`path` 示例由 `renderExampleHint()` 生成 |
|
|
45
|
+
| `src/url-schemes/tools/write.ts` | `const REGISTERED_SCHEMES = ['agent','ctx',...]` 字面量 → `SCHEME_NAMES` |
|
|
46
|
+
| `src/url-schemes/selector.ts` | `URL_NO_SCHEME` 报错文案改由 `SCHEME_DISPLAYS` 渲染 |
|
|
47
|
+
| `test/url-schemes/general-section.spec.ts` | 预算断言更新 + **新增"6 个 scheme token 必须全部出现"的回归护栏** |
|
|
48
|
+
|
|
49
|
+
### 系统提示词预算
|
|
50
|
+
|
|
51
|
+
`url-schema:general` 段:**433 → 1280 chars(+847,约 +2.9×)**。这是本变更唯一显著的常驻开销,为 user 明示要求的"结构化 + 示例 + 提高可见度"所付;护栏断言上限设为 1400。
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 三、工具 × scheme 支持矩阵(活体实测)
|
|
56
|
+
|
|
57
|
+
`read` = 读取解析;`write` = scheme 写通道;`grep`/`glob` = URL 作 `path`/`pattern`。
|
|
58
|
+
|
|
59
|
+
| scheme | read | write | grep | glob | 备注 |
|
|
60
|
+
|---|---|---|---|---|---|
|
|
61
|
+
| `skill://` | ✗(目录为空) | ✗ `URL_WRITE_UNSUPPORTED` | ✗ | ✗ | 本 runtime 唯一完全不可用者 |
|
|
62
|
+
| `agent://` | ✓ | ✗ `URL_WRITE_UNSUPPORTED` | ✓ 物化 | ✓ 物化 | `/transcript` 要求 session **live** |
|
|
63
|
+
| `dsh://` | ✓ | ✗ `URL_WRITE_UNSUPPORTED` | ✓ 物化 | ✓ 物化 | 应走 path-backed,实际物化(缺陷 F3) |
|
|
64
|
+
| `ctx://` | ✓ | ✗ `URL_READ_ONLY`(定制文案) | ✓ 物化 | ✓ 物化 | 只读快照,语义正当 |
|
|
65
|
+
| `dvc://` | ✓ roster/doc | **✓ JSON dispatch** | ✓ 物化 | ✓ 物化 | **唯一可写** |
|
|
66
|
+
| `http(s)://` | ✓ | ✗ `URL_WRITE_UNSUPPORTED` | ✓ 物化 | ✓ 物化 | selector-exempt |
|
|
67
|
+
|
|
68
|
+
### 实测原文摘录
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
read skill:// ERR skill "" is unknown or no longer available
|
|
72
|
+
read dsh:// ERR dsh://: unknown resource "(empty)" — expected "docs" or "config"
|
|
73
|
+
read dsh://docs OK 8154B [
|
|
74
|
+
read dsh://config OK 2749B {
|
|
75
|
+
read ctx:// OK 594B ctx://session statistics snapshot …
|
|
76
|
+
read ctx://session OK 814B {
|
|
77
|
+
read ctx://session/transcript OK 122600B [0000009] USER
|
|
78
|
+
read ctx://session/compactions OK 25B (no compactions recorded)
|
|
79
|
+
read dvc:// OK 643B ast_edit… ast_grep… browser… lsp…
|
|
80
|
+
read dvc://browser OK 226B
|
|
81
|
+
read dvc://browser/sub OK 226B ← /sub 被静默忽略(F6)
|
|
82
|
+
read agent:// OK 9B no agents / roster header
|
|
83
|
+
read agent://nosuchagent/transcript ERR unknown agent … scoped to your family tree
|
|
84
|
+
|
|
85
|
+
write .scratch/url-scheme-probe.txt OK create
|
|
86
|
+
write skill:// / dsh:// / agent:// / http:// / https://
|
|
87
|
+
ERR URL_WRITE_UNSUPPORTED
|
|
88
|
+
write ctx://session ERR URL_READ_ONLY("curated read-only snapshot")
|
|
89
|
+
write dvc://nosuchdev ERR DVC_UNKNOWN_DEVICE(registered: ast_edit, ast_grep, browser, lsp)
|
|
90
|
+
write dvc://ast_grep (非 JSON) ERR DVC_BAD_ARGS
|
|
91
|
+
write dvc://ast_grep (绝对路径 JSON) OK {"matches":[…]}
|
|
92
|
+
write nosuchscheme://x ERR URL_UNREGISTERED_SCHEME
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### `grep` / `glob` 实测原文摘录
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
grep dsh://docs/subsystems/skills.md OK match.path = /dev/shm/dashr-url-*/content.txt ← 物化,非真实盘路径
|
|
99
|
+
glob pattern="dsh://docs" OK paths = ['[', ' "agent-lifecycle.md",', …] ← JSON 碎片当路径(F4)
|
|
100
|
+
glob pattern="**/*skills.md" path="dsh://docs" OK paths = [] ← 真实目录本应命中(F3)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 四、语法一致性实测(重点:`ctx://` 与 `dvc://`)
|
|
106
|
+
|
|
107
|
+
统一语法(`selector.ts`):`scheme "://" path [ selector ]`,path 到首个 `:` 或 `?` 为止;selector ∈ `:raw` | `:N`/`:N-M`/`:N-M,N2-M2` | `:path/<dotpath>` | `?q=<q>`。`http`/`https` 在 `SELECTOR_EXEMPT` 中,整段都是 path。
|
|
108
|
+
|
|
109
|
+
| 用例 | 结果 | 判定 |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| `dsh://config:1-3` / `:2,4` / `:raw` | OK | 统一语法 ✓ |
|
|
112
|
+
| `dsh://config:path/agent-loop.maxParallelToolCalls` | OK → `10` | dot-path ✓ |
|
|
113
|
+
| `dsh://config?q=agent-loop` | OK → `{"maxParallelToolCalls":10}` | query ✓ |
|
|
114
|
+
| `dsh://config:0-2` / `:9-3` | ERR 1-based / empty range | 边界守卫 ✓ |
|
|
115
|
+
| `dsh://config:path/nope.missing` | **OK → 返回全文** | **静默回落(F8)** |
|
|
116
|
+
| `ctx://session:raw` / `:1-5` | OK | selectorAware 支持 raw/lines ✓ |
|
|
117
|
+
| `ctx://session/tool_calls[0]` | OK | **方括号写在 path 里** |
|
|
118
|
+
| `ctx://session/tool_calls[3]:1-2` | OK | 方括号 + 冒号 selector **可组合** |
|
|
119
|
+
| `ctx://session?q=user_prompts` | **ERR `CTX_BAD_SELECTOR` "unsupported selector kind \"query\""** | **不支持 query(F5)** |
|
|
120
|
+
| `ctx://session/tool_calls`(无括号) | ERR `no such element (collection "tool_calls" has 37 items, 0-based…)` | 集合需括号(F9) |
|
|
121
|
+
| `ctx://session/compactions`(无括号) | OK 列出 | 与上条不一致(F9) |
|
|
122
|
+
| `ctx://session/compactions[0]/original` | ERR no such episode(本会话 0 次 compaction) | `/original` = path 后缀 |
|
|
123
|
+
| `dvc://browser:1-3` / `dvc://:1-3` | OK | 非 selectorAware → 统一 selector 生效 ✓ |
|
|
124
|
+
| `dvc://ast_grep?q=lsp` | OK → 空(无命中行) | 非 JSON 走行过滤 ✓ |
|
|
125
|
+
| `agent://<id>/transcript:1-4` / `:raw` / `?q=sleep` | OK(child live 时) | 统一 selector ✓ |
|
|
126
|
+
| `agent://<id>/bogus` | ERR `unknown child agent "bogus" of "<id>"` | **L2 ≠ 自由 subpath,而是"后代 agent"(F10)** |
|
|
127
|
+
|
|
128
|
+
### ctx 的语法实现(源码锚点)
|
|
129
|
+
|
|
130
|
+
`handlers/ctx.ts` 自述 `selectorAware: true`;`applyFace()` 只处理 `raw` 与 `lines`,其余一律 `CTX_BAD_SELECTOR`。path 解析为:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
// ── path parsing: session[/seg[[bracket]]…] ──
|
|
134
|
+
const sub = raw.slice('session'.length).replace(/^\/+/, '')
|
|
135
|
+
const segments = sub === '' ? [] : sub.split('/').filter(x => x !== '')
|
|
136
|
+
const parseSeg = (seg) => { const m = /^([a-z_]+)(?:\[(.+)\])?$/.exec(seg) … }
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
⇒ **`ctx://` 拥有"括号在 path + 冒号 selector 混用"的杂交语法**,与 `selector.ts` 的统一语法并列而非从属。
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 五、发现的偏差与缺陷
|
|
144
|
+
|
|
145
|
+
| # | severity | 结论 | 证据 |
|
|
146
|
+
|---|---|---|---|
|
|
147
|
+
| F1 | 高(已修) | `ctx://` 自 `074b6ae`(v0.1.8c) 起缺席**所有** `read` 枚举;且是唯一被系统提示词单列 bullet 的 scheme | `git log -S'skill/agent/dsh/dvc/ctx'` 零命中;实测 `read` 描述互文 |
|
|
148
|
+
| F2 | 中 | scheme 枚举点实为 **6 处**,非 user 以为的 2 处 → 已全部收敛到 `catalog.ts` | §二改动清单 |
|
|
149
|
+
| F3 | **高(未修)** | `dsh://docs` 在 `grep.ts`/`glob.ts`/`resolver.ts` 三处文档块声明为 **path-backed**,但**只有 `skill.ts` 实现了 `resolvePath`**,`dsh.ts` 没有 → grep/glob 实际走物化。后果:`glob("**/*.md", path="dsh://docs")` 返回 **0**(真实目录本应命中全部 md) | `grep -rn resolvePath handlers/` 仅 `skill.ts:159`;实测 `/dev/shm/…` |
|
|
150
|
+
| F4 | 中(未修) | `glob(pattern="dsh://docs")` 把 JSON 数组每行当 path 返回(`[`、` "agent-lifecycle.md",`)——"content-backed 的行即列表"规则对 JSON 资源语义错误 | 实测 paths |
|
|
151
|
+
| F5 | 中(未修) | `ctx://` 拒绝 4 种 selector 中的 2 种(`:path/`、`?q=`),违反"五 scheme 共享一套 selector 语法" | `CTX_BAD_SELECTOR`;`applyFace()` |
|
|
152
|
+
| F6 | 低(未修) | `dvc://<device>/<sub>` 静默丢弃 `/sub`(`deviceNameFromPath` 只取首段)——无告警,易误以为二级寻址生效 | `dvc.ts` + 实测 226B 相同 |
|
|
153
|
+
| F7 | 中(未修) | bare 枚举规则不一致:`ctx://`/`dvc://`/`agent://` 列 roster;`dsh://` 报错但自我说明;`skill://` 报错且**误导**(`skill "" is unknown`)。文档"Bare `read <scheme>://` lists that scheme's surface"对 2/5 不成立 | 实测 |
|
|
154
|
+
| F8 | 中(未修) | dot-path 未命中**静默回落全文**(`dsh://config:path/nope.missing` → 整个 config)——拼写错误无任何反馈 | `applyPath`:`node === undefined ? text` |
|
|
155
|
+
| F9 | 低(未修) | ctx 集合行为不一致:`compactions` 无括号可列;`tool_calls`/`user_prompts`/`agent_responses` 无括号报错(好在报错含条数) | 实测 |
|
|
156
|
+
| F10 | 低(信息) | `agent://<id>/<x>`:`transcript` 为保留字,其余按"后代 agent id"解析;且 `/transcript` 要求 session **live** | 报错文案 + live child 对照实测 |
|
|
157
|
+
| F11 | 低(环境) | 本 runtime `skill://` 目录为空(`.agents/skills` 未被 skill provider 挂载)→ 全矩阵唯一完全不可用 scheme,且 `skill://` 的 path-backed 快路径因此**实际不可达** | 实测 + 早前 `skill://` 解析失败 |
|
|
158
|
+
| F12 | 中(未修) | **dvc device 的相对路径按服务进程 cwd 解析,而非 agent session cwd**:同一 `{path:"dashr/…"}` 相对路径失败、绝对路径成功 | 实测对照 |
|
|
159
|
+
| F13 | 低(未修) | device 参数 schema **不可发现**:`dvc://<device>` 只回一行 summary + 泛化 usage;`ast_grep` 的 summary 恰含 `{patterns,path?}`,而 `browser` 完全不含 `action` 判别键(实测须猜 `{"action":"open","url":…}` 才通) | 实测:`{"code":"close"}` → `unknown action null`;`{"action":"open","url":"about:blank"}` → OK(随后已 `{"action":"close"}` 清理) |
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 六、验证与基线对照
|
|
164
|
+
|
|
165
|
+
### 副本(Dev/Test 1)全量单测
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
Test Files 1 failed | 38 passed (39)
|
|
169
|
+
Tests 1 failed | 482 passed (483)
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
唯一失败:`test/url-schemes/fs-backend.spec.ts > UrlAwareFileSystem backend (phase-2 spike) > builds the backend when the sandbox base resolves (dev workspace)`。
|
|
173
|
+
|
|
174
|
+
### 基线对照(改动前,同一副本、同一子集)
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
Test Files 1 failed | 18 passed (19)
|
|
178
|
+
Tests 1 failed | 273 passed (274)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
⇒ 失败集**完全同一**(同一 test 名)⇒ **本次改动零回归**;新增的 6-scheme 护栏断言在 482 通过之列。
|
|
182
|
+
|
|
183
|
+
### tsc
|
|
184
|
+
|
|
185
|
+
- 我改动的 5 个源文件 + 1 个 spec:**0 error**(`grep -cE 'catalog|general-section|selector|tools/read|tools/write'` = 0)。
|
|
186
|
+
- 副本残留 **1 个环境性 error**:`src/url-schemes/fs-backend.ts(67,31) TS2307 Cannot find module '@deepseek-ai/dsh-fs-sandbox'`。已证实:(a) 该文件 `git diff HEAD` 为空(未被本改动触碰);(b) 该模块在副本 `node_modules` 中确实不存在——AGENTS.md §二 的 devDeps 手术名单(14 个)本就不含 `dsh-fs-sandbox`;(c) 与上表既存失败同域。**非本次引入**。
|
|
187
|
+
|
|
188
|
+
### canonical 侧说明
|
|
189
|
+
|
|
190
|
+
canonical `./dashr` 直接 `tsc` 有 9 处 error(`index.ts` 的 `tool/ptc-dispatch` 事件、`handlers/agent.ts` 的 `snapshotEvents`、`url-schemes/index.ts` 的 `SessionPersistenceSurface`、测试里的 `SessionSeq`/`isSeeded`)。这符合 AGENTS.md §二:canonical 保持 npm-range optional peers(发布语义),类型自洽只存在于做了 `workspace:*` 手术的副本。上述 error 全部**不涉及本次改动文件**。
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 七、未验证 / 遗留 / 待裁决
|
|
195
|
+
|
|
196
|
+
1. **未构建、未重启 4999**:本次只落 **canonical 源 + 副本源**(6 文件已 `cp` 到位)。`lib/` 仍是改动前的构建,故 §三/§四 的矩阵描述的是**改前行为**(正是本次要刻画的对象);新的提示词/工具描述**尚未生效**。未执行 `tsdown && tsx scripts/build-client.ts` 与重启,理由:**重启 4999 会终止本 agent 会话**,且 `tsdown` 会先清空 `lib/`(含 `lib/client/`),中途失败会把 user 正在用的实例留在坏构建上——需 user 明确指令后再做。
|
|
197
|
+
2. **F3/F4/F12 属行为缺陷,未修**:修 F3 需在 `dsh.ts` 实现 `resolvePath`(或修正三处文档块承认物化);修 F4 需为 JSON 资源定义"列表"语义。均超出"centralize"授权范围,等裁决。
|
|
198
|
+
3. **F5/F6/F7/F8/F9 属语法一致性问题,未修**:是否统一(让 ctx 也吃 `?q=`、让 dvc 对多余段报错、让 skill:// bare 列 roster、让 dot-path 未命中报错)需 product 裁决——每条都会改变现有可观测行为。
|
|
199
|
+
4. **prompt 预算 +847 chars**:若 user 认为常驻开销过高,可退化为"表格只在 `read` 描述内、系统段仅保留 grammar + 一行 scheme 名单"(总量不减,但可把表格从每轮系统提示挪到工具描述;或裁剪示例)。
|
|
200
|
+
5. `skill://` 的目录为空是**部署面**问题(`.agents/skills` 未被 skill provider 挂载),与本次代码改动无关;是否挂载待定。
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## 八、复现命令
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# 渲染单一源产物(对照 §二 的预算与 §三 的枚举)
|
|
208
|
+
cd /home/u1/workspaces/dashr/dashr
|
|
209
|
+
./node_modules/.bin/tsx -e "
|
|
210
|
+
import { renderGeneralSectionText, renderExampleHint, SCHEME_NAMES } from './src/url-schemes/catalog.ts'
|
|
211
|
+
console.log(SCHEME_NAMES.join(',')); console.log(renderExampleHint())
|
|
212
|
+
console.log(renderGeneralSectionText())"
|
|
213
|
+
|
|
214
|
+
# 副本全量验证(AGENTS.md §二 的权威验证位)
|
|
215
|
+
cd /home/u1/workspaces/dashr/upstream/deepseek-harness/packages/better-dsh/better-dsh
|
|
216
|
+
../../../node_modules/.bin/tsc --noEmit
|
|
217
|
+
../../../node_modules/.bin/vitest --run
|
|
218
|
+
|
|
219
|
+
# 活体矩阵(在 4999 会话的 eval pad 内)
|
|
220
|
+
# await tool.read({"path":"ctx://session/tool_calls[0]"})
|
|
221
|
+
# await tool.write({"file_path":"dvc://ast_grep","content":'{"patterns":["x"],"path":"/abs/path"}'})
|
|
222
|
+
# await tool.glob({"pattern":"**/*.md","path":"dsh://docs"})
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## 附:基线对照的原始计数
|
|
228
|
+
|
|
229
|
+
| 运行 | 范围 | 结果 |
|
|
230
|
+
|---|---|---|
|
|
231
|
+
| 副本(改前) | `test/url-schemes test/url-schemes.spec.ts test/surface-devices` | 274 tests / **1 failed** |
|
|
232
|
+
| 副本(改后) | 同上 | 274 tests / 1 failed(同一 test) |
|
|
233
|
+
| 副本(改后) | **全量** | **483 tests / 1 failed** |
|
|
234
|
+
| canonical(改后) | 同上子集 | 14+ failed(`SessionSeq`/`isSeeded` 类型漂移所致,非本次引入) |
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# design.md 设计符合性验证报告 — URL Schemes 服务化与 ctx:// 可回溯上下文
|
|
2
|
+
|
|
3
|
+
- **被验对象**:`openspec/changes/2026-09-11-url-schemes-recallable-context/design.md`(D1–D8)
|
|
4
|
+
- **对照物**:同 change 的 spec delta(`specs/url-schema/spec.md`、`specs/ctx/spec.md`、`specs/compaction-recall/spec.md`)+ 实际代码 + 4999 活体行为
|
|
5
|
+
- **验证时间**:2026-09-12 06:41 ~ 07:0x(UTC+8)
|
|
6
|
+
- **验证者**:agent(本会话即 4999 测试实例)
|
|
7
|
+
- **结论**:**不通过(有条件)**——D1/D3 机制陈述与实现一致;D2/D4/D5/D6 存在 4 项实质偏差(其中 2 项为 spec 要求未落地:快照 `segments`、read transform 链),另有 6 项证据/文案失真。**未触发任何发布动作**(AGENTS §〇 红线未动)。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 验证环境与被验代码的身份锚定
|
|
12
|
+
|
|
13
|
+
| 项 | 值 |
|
|
14
|
+
|---|---|
|
|
15
|
+
| 运行时 | `DSH_HOME=/home/u1/workspaces/dashr/.dsh-test`,GUI `http://127.0.0.1:4999`,会话 `session-e96cd10a-41c8-4e82-89fd-5ff4118b9d41` |
|
|
16
|
+
| 插件版本 | `better-dsh@0.2.3-d` |
|
|
17
|
+
| 活体实现位置 | `upstream/deepseek-harness/packages/better-dsh/better-dsh/`(profile `web` 的 bundle 成员) |
|
|
18
|
+
| canonical 源 | `dashr/` |
|
|
19
|
+
|
|
20
|
+
**身份锚定(关键前提)**:`diff -rq dashr/src upstream/deepseek-harness/packages/better-dsh/better-dsh/src` 与 `.../test` **均无输出** ⇒ 本轮被验的 canonical 源与 4999 实际运行的代码**逐字节相同**,「源码核验」与「第一人称实测」指向同一份实现,不存在副本漂移。
|
|
21
|
+
|
|
22
|
+
## 2. 验证方法(四路独立取证)
|
|
23
|
+
|
|
24
|
+
| 路径 | 手段 | 产物 |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| A 源码锚点 | 逐文件读取 `src/url-schemes/**`,对每条 design 陈述定位实现点 | 本报告 §4 表格 |
|
|
27
|
+
| B 第一人称 live 探针 | **以本会话自己的 `read` 工具**打真实 URL(read 即被验 chassis) | §5 |
|
|
28
|
+
| C 单测全量 | `npx vitest run`(canonical `dashr/`) | `.scratch/verify-url-schemes-vitest.log` |
|
|
29
|
+
| D 类型/规格 | `npm run typecheck`;`openspec validate <change> --strict` | `.scratch/verify-url-schemes-tsc.log` |
|
|
30
|
+
|
|
31
|
+
## 3. 一句话判定表
|
|
32
|
+
|
|
33
|
+
| design 项 | 判定 | 一句话 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| D1 文法(slash/bracket/colon) | ✅ 一致 | 解析器与 ctx handler 与设计同构,live 全通 |
|
|
36
|
+
| D2 canonical/prepared 二元 | ⚠️ 部分 | 模型成立,但设计说 `/transcript` 已裁撤——实现与 ctx spec 都保留它 |
|
|
37
|
+
| D3 label 与失败剧集 | ✅ 一致 | label = `compaction/summary` seq,嵌套链、失败排除均成立 |
|
|
38
|
+
| D4 服务形态与 read chassis | ❌ 不符 | 单一注册权 ✅、capture-delegate ✅,但 **有序 transform 链是死代码**;hashline 独立化(tasks 2.3)未交付 |
|
|
39
|
+
| D5 ctx handler 重塑 | ❌ 不符 | 快照缺 **`segments`(ctx spec 明文要求)**;`system_prompt` 条件性消失;未知 key 不回显子路径 |
|
|
40
|
+
| D6 披露三层 | ⚠️ 部分 | 单源/门控/description 静默 ✅;但 **bare-root 即 help 对 `skill://` 是假的**;≤600 chars 预算说法不成立 |
|
|
41
|
+
| D7 Phase-2 继承式 fs backend | ⚠️ 未挂载 | 代码+单测齐(fail-soft),未挂载,设计的收益(未 wrap 的原生 read/edit 可读 `ctx://`)**未兑现** |
|
|
42
|
+
| D8 验证与红线 | ✅ 纪律守住 | openspec strict 过、url-schemes 8/8 文件全绿;14 挂与 tsc 13 错已独立定性为宿主 API 漂移;未 publish |
|
|
43
|
+
|
|
44
|
+
## 4. 逐项取证
|
|
45
|
+
|
|
46
|
+
### D1 文法 — ✅ 一致
|
|
47
|
+
|
|
48
|
+
- `selector.ts:36` `SCHEME_RE` 认 `scheme://`;`:59-60` 首标记(`:` 或 `?`)切 path/selector;`:72` `SELECTOR_EXEMPT={http,https}` ⇒ `:8443` 是端口、`?x=1` 是 query(与设计「variance」一致)。
|
|
49
|
+
- `:97-99` `selPart.startsWith('raw:')` ⇒ 组合式 `:raw:N-M` 解析为 `lines`,与 `:N-M` 同构(tasks 6.2 首轮抓到的 spec gap 已修)。
|
|
50
|
+
- `[<label|ordinal>]` 不进 `parseUrl`,由 handler 消费(`ctx.ts:322-329` `parseSeg` 正则 `^([a-z_]+)(?:\[(.+)\])?$`)⇒ 设计「换内容 → path/brackets;换看法 → colon modifier」在实现里成立。
|
|
51
|
+
- `handlers/ctx.ts:376-380` `pickEpisode`:`String(e.label) === bracket` 精确优先,miss 回落 `Number(bracket)` 0-based —— 与设计 D1/D3 逐字一致。
|
|
52
|
+
|
|
53
|
+
### D2 canonical / prepared — ⚠️ 部分(设计已过时)
|
|
54
|
+
|
|
55
|
+
- 成立部分:`session` 裸=快照(`ctx.ts:335-339`,`applyFace(prepared, canonical, sel, 'prepared')`),`:raw`/行窗恒作用 canonical(`applyFace` `:200-207`);`compactions[label]` 裸=8 段 summary、`:raw`=shadowedSeqs 原文(`:355-368`)。
|
|
56
|
+
- **不符**:design.md D2 写「`/original`、`/transcript`、`/events` 子路径全部裁撤」。实际:`/original` 确实裁撤(`ctx.ts:370-374` → `CTX_BAD_PATH`),但 **`/transcript` 被保留为 canonical 别名**(`ctx.ts:334` `seg0.name === 'transcript'` → `forceCanonical`),ctx spec「Bare listing」也明文要求列出 `transcript`。live 探针 `ctx://session/transcript:1-3` 正常返回 3 行(§5)。
|
|
57
|
+
- 另:design.md(D1/D5/D6)**通篇未提 `thinking` / `system` 两个集合面**,而 ctx spec 有独立 ADDED Requirement「Thinking and system collections」,实现齐备(`ctx.ts:388-436`)。design.md 是 reshape 前的产物(reshape 过程见既有实测报告 §3.2.1)。
|
|
58
|
+
|
|
59
|
+
### D3 label 与失败剧集 — ✅ 一致
|
|
60
|
+
|
|
61
|
+
- `ctx.ts:283` `if (e.type !== 'compaction/summary') continue` ⇒ label = summary 事件 seq;失败压缩无 summary 事件 ⇒ 天然不入档(与 spec「Failed compaction is not addressable」同构)。
|
|
62
|
+
- `ctx.ts:311-313` `replacesCheckpoint = prevCheckpoint !== null && d.shadowedSeqs.includes(prevCheckpoint) ? prevCheckpoint : null` ⇒ 嵌套链(信息金字塔)成立;单测 fixture 两档嵌套断言 `compacted[1].replaces_checkpoint === 21` 绿。
|
|
63
|
+
|
|
64
|
+
### D4 服务形态与 read chassis — ❌ 不符
|
|
65
|
+
|
|
66
|
+
成立部分:
|
|
67
|
+
- 服务零工具 + 四 wrapper 在工具层:`index.ts:14-24` 只 register handler,工具注册在 `installAgentTools`(`:169-261`)。
|
|
68
|
+
- capture-before-register 纪律:`native-capture.ts` + `wiring.spec` 断言 `capture:write/grep/glob/host_extra` 全部先于 `agent-register:read`,且 `NATIVE_TOOL_NAMES = ['read','write','grep','glob']`(`native-capture.ts:57`)。
|
|
69
|
+
- capture-delegate 与结构化缺省错误齐备:`NATIVE_WRITE_UNAVAILABLE`(write.ts:199)、`NATIVE_GREP/GLOB_UNAVAILABLE`(grep.ts:86 / glob.ts:84)、`NATIVE_READ_UNAVAILABLE`(read.ts:154)。
|
|
70
|
+
|
|
71
|
+
**不符(实质)**:
|
|
72
|
+
1. **有序 transform 链未接线**。`transforms.ts` 导出的 `createUrlTransform` / `createAnchorTransform` / `ReadTransform` **在全仓(src+test)零调用点**——仅被 `general-section.ts:23`、`fs-backend.ts:26` 当 **类型** 引入 `ReadGates`。`read.ts` 仍是内联双分支结构(`:117` urlSchemes 分支 / `:130` hashline 分支 / `:147` 终端 delegate)。
|
|
73
|
+
2. 由此 `transforms.ts:50` 的注释「Scheme-prefix fork — **kept in ONE place** so every stage agrees on the split」是假的:`SCHEME_URL_RE` 在 `read.ts:73` 与 `transforms.ts:50` **各定义一份**。设计 D4「chassis 内有序 transform 链」与 url-schema spec ADDED「Read chassis with ordered transforms」目前只有「单一注册权 + 终端 delegate」满足,**链本身不存在**。
|
|
74
|
+
3. 设计 D4「hashline 以 transform 身份接入(chassis 缺席时 fallback 自持最小 wrapper)」= tasks 2.3,**未做**(tasks 2.3 未勾)。当前 hashline 锚点能力**无法脱离本插件独立安装**——插件缺席即无锚点。这不是回归(旧行为相同),但 spec 的这条 SHALL 未兑现。
|
|
75
|
+
|
|
76
|
+
### D5 ctx handler 重塑 — ❌ 不符
|
|
77
|
+
|
|
78
|
+
成立部分(live 逐字核对,§5):
|
|
79
|
+
- identity 吸收(`ctx.ts:527-531`):`id/createdAt/cwd/agentPreset/status/origin/delegationDepth`;`ctx://model` / `ctx://cwd` 一级 key 已移除(live `CTX_UNKNOWN_KEY`)。
|
|
80
|
+
- `storage` / `totals` 用 DSH 原生字段名并做零值规范化(`:503-513`):live 实测 `user_prompts/injected_user_messages/agent_messages/block_reasoning/block_text/block_tool-call/tool_calls/tool_results/compactions` 九键齐。
|
|
81
|
+
- `compacted[]` 九字段 + 每档 8 段 ×100 字预览(`:533-541`、`sectionPreviews` `:186-194`);顶层 `syntax` 字段(`:518`);`hints` 三条(`:542-546`)。
|
|
82
|
+
|
|
83
|
+
**不符**:
|
|
84
|
+
1. **快照无 `segments`**。ctx spec MODIFIED「Curated snapshot keys」明文要求 prepared 面携带「per-compaction segments plus a `live` tail segment」,design D5 亦写「per-segment 分段(按 compaction 切段 + live 热区)」。`buildSnapshot` 全函数(`:508-550`)**无任何分段字段**,live `ctx://session` 亦无(§5)。且 **无任何单测断言它**——spec 要求与测试双缺口。
|
|
85
|
+
2. **`system_prompt` 卡条件性消失**:`ctx.ts:536` `system === undefined ? undefined : {...}`,`JSON.stringify` 丢弃 undefined ⇒ 无 `request/header` 的会话里该 key 整体不存在(live 实测确实缺失)。spec 说快照 SHALL carry the card;模型侧看到的是「字段不存在」而非「字段为空」。
|
|
86
|
+
3. **未知 key 不回显子路径**:spec「Unknown key echoes known keys」要求列出「currently known first-level keys **and the sub-path pointer**」。实测 `ctx://bogus` / `ctx://model` 只回 `unknown key (known: session — model/cwd folded into the session info card)`(`ctx.ts:250-253`),**无子路径清单**。(另一条兜底错误 `:556-558` 才列出全部子路径,但它只对 `session/<未知段>` 触发。)
|
|
87
|
+
4. **行窗在 bracket 元素路径上被忽略**:spec 说「line windows ... on **every** resolved resource」。实测 `ctx://session/user_prompts[0]:1-1` 与 `:2-2` 返回**同一个完整两项文本**;`agent_responses[0]:1-1` 同样。代码路径(`ctx.ts:452-462`、`:476-481`)在 bracket 命中后 `return bySeq.text` / `items[ordinal].text`,**不经 `applyFace`**。
|
|
88
|
+
|
|
89
|
+
### D6 披露 — ⚠️ 部分
|
|
90
|
+
|
|
91
|
+
成立部分:
|
|
92
|
+
- 单源:`general-section.ts:44-45` 模块期 `readFileSync` walk-up 加载包根 `url-schemes-section.md`;`package.json files` 含 `url-schemes-section.md`(漏列即 boot ENOENT,0.2.3-d 教训已内建)。
|
|
93
|
+
- 门控:`generalSection(gates)` 在 `urlSchemes: false` 返回 `undefined`(`general-section.ts:88`),单测断言绿。
|
|
94
|
+
- 工具 description 静默:四个 wrapper 的 `description:` 字符串(read.ts:89 / write.ts:149 / grep.ts:101 / glob.ts:99)**零 `scheme://`**——spec scenario「Tool descriptions stay scheme-silent」成立(`scheme://` 只出现在源码注释里)。
|
|
95
|
+
- L3:未知 label 回显有效清单(`ctx.ts:482-489` pickEpisode 列出 labels);超尺 `:raw` 尾行 note(`:357-361`)单测覆盖。
|
|
96
|
+
|
|
97
|
+
**不符**:
|
|
98
|
+
1. **bare-root 即 help 对 `skill://` 是假的**。shipped section 第 3 行写着「Reading a bare root (`ctx://`, `agent://`, `dvc://`, `skill://`) lists that scheme's surface — treat it as the scheme's help.」实测:`ctx://`(9 行 roster)、`agent://`("no agents")、`dvc://`(4 设备表)确实枚举;**`skill://` → `Error: skill "" is unknown or no longer available`**(`skill.ts:141` `URL_SKILL_NOT_FOUND`,因为 `splitSkillPath('')` 得空名去查注册表);`dsh://` 裸根亦报错 `unknown resource "(empty)" — expected "docs" or "config"`(`dsh://` 未在该句里点名,但同属「静态/系统资源」)。这是**上报给模型的事实性误导**,每次会话渲染,代价是白跑一次工具调用。
|
|
99
|
+
2. **≤600 chars 预算不成立**。tasks 4.1 与既有实测报告 §2 都写「≤600 chars(断言绿)」。实测 shipped 文件 = **1,788 字符 / 19 行**(`wc -c` 1768 字节);`general-section.spec.ts` 只断言**覆盖度**(6 schemes + `:raw:N-M` + read-only + transcript/thinking/system),**没有任何预算断言**。该说法应更正。
|
|
100
|
+
|
|
101
|
+
### D7 Phase-2 fs backend — ⚠️ 未挂载(spike 姿态正确)
|
|
102
|
+
|
|
103
|
+
- `fs-backend.ts` 实现齐:`resolve` 拦 scheme → virtual target(`targetKey` = URL)、`stat` 合成 `{type:'file',size}`、`readText` 解引用、`writeText`/`editText` 抛 `FS_VIRTUAL_READONLY`、其余 `super`;`build()` 对 `@deepseek-ai/dsh-fs-sandbox` 动态 import 失败返回 `null`(fail-soft,`:120-127`)。
|
|
104
|
+
- **未挂载**:`createUrlAwareFileSystemBackend` 在 `src/` 内零引用(只在自身模块与 `fs-backend.spec.ts`),index.ts 不 import ⇒ 设计 D7 的挂载动作(home 层同 id 行重述 `fs-sandbox`)与收益(「未 wrap 的原生 read/edit 亦能读 `ctx://`」)**均未兑现**,与 tasks 5.2「未执行」一致。
|
|
105
|
+
- 三个 spec delta 里**没有 fs 相关 requirement** ⇒ 该 spike 不构成 spec 欠账,属设计内可整体放弃项。
|
|
106
|
+
|
|
107
|
+
### D8 验证与红线 — ✅ 纪律守住
|
|
108
|
+
|
|
109
|
+
- `openspec validate 2026-09-11-url-schemes-recallable-context --strict` → **`Change ... is valid`**。
|
|
110
|
+
- url-schemes 八个 spec 文件**全绿**:`http 35 / tools-delegation 29 / ctx 19 / skill 16 / fs-backend 5 / escalation-forward 5 / wiring 4 / general-section 2` = **115 用例**。
|
|
111
|
+
- 全量:`Test Files 2 failed | 37 passed (39)`,`Tests 14 failed | 473 passed (487)`。**14 挂全部同一根因**:`TypeError: SessionSeq is not a function`,落在 `test/url-schemes.spec.ts`(2,`agent://` roster)与 `test/surface-devices/agent-family.spec.ts`(12,`agent://` family roster/addressing)——**宿主 session API 漂移,与被验 change 的代码路径无交集**(ctx/compaction 全部通过)。
|
|
112
|
+
- `tsc --noEmit` = **13 错**(非 0),分布:`src/index.ts` ×3(`tool/ptc-dispatch*` 事件词表、`SubagentRuntime.sendMessage`)、`src/url-schemes/handlers/agent.ts:344`(`Session.snapshotEvents` 不存在)、`src/url-schemes/index.ts:282`(宿主 `SessionPersistence` 缺 `stat`/`open`,对 `agent.ts` 的 `SessionPersistenceSurface` 不匹配)、测试 ×8(`SessionSeq`/`isSeeded`/never 推断)。**全部为宿主 API 漂移族**,无一落在 `ctx.ts`/`read.ts`/`selector.ts`/`transforms.ts`/`fs-backend.ts`。注:ctx handler 用 `sessionPersistence: unknown` duck-typing,是它躲过第 3 类错误的直接原因——design D4 的「duck-typed 抗漂移」在这一点上自证有效。
|
|
113
|
+
- **未 publish**:AGENTS §〇 的 a–d 四闸未启动;tasks 6.3(user 确认后归档/发布)仍待 user。
|
|
114
|
+
|
|
115
|
+
## 5. 第一人称 live 探针矩阵(本会话 `read`,即被验 read chassis)
|
|
116
|
+
|
|
117
|
+
| # | URL | 观测 | 判定 |
|
|
118
|
+
|---|---|---|---|
|
|
119
|
+
| 1 | `ctx://` | 9 行 roster(session / transcript / compactions / compactions[label\|n] / user_prompts / tool_calls / agent_responses / thinking / system) | ✅ 与 spec 覆盖一致(tasks 3.2 的「7 行」失真) |
|
|
120
|
+
| 2 | `ctx://session` | 快照 JSON:`resource/syntax/session{7 字段}/storage/totals{9 键}/compacted[]/hints[3]`;**无 `segments`**;**无 `system_prompt`**(`compacted` 空因本会话 0 压缩) | ❌ F1/F7 现场复现 |
|
|
121
|
+
| 3 | `ctx://session/transcript:1-3` | 3 行 transcript(`[0000008] USER` + 正文) | ⚠️ 设计说已裁撤,实际可用(F4) |
|
|
122
|
+
| 4 | `ctx://session/user_prompts[0]:1-1` | 返回**两项完整文本**(非 1 行) | ❌ F3(行窗被忽略) |
|
|
123
|
+
| 5 | `ctx://session/user_prompts[0]:2-2` | 与 #4 **逐字节相同** | ❌ F3 确证 |
|
|
124
|
+
| 6 | `ctx://session/agent_responses[0]:1-1` | 返回完整两项文本 | ❌ F3 确证(同代码路径) |
|
|
125
|
+
| 7 | `ctx://bogus` | `Error: ctx://bogus: unknown key (known: session — model/cwd folded into the session info card)` | ⚠️ F5(无子路径清单) |
|
|
126
|
+
| 8 | `ctx://model` | 同上 `CTX_UNKNOWN_KEY` | ✅ 一级 key 确实移除 |
|
|
127
|
+
| 9 | `skill://` | `Error: skill "" is unknown or no longer available` | ❌ F6(section 承诺的 bare-help 不存在) |
|
|
128
|
+
| 10 | `dsh://` | `Error: dsh://: unknown resource "(empty)" — expected "docs" or "config"` | ⚠️ 同类(句内未点名) |
|
|
129
|
+
| 11 | `agent://` | `no agents` | ✅ 枚举成立 |
|
|
130
|
+
| 12 | `dvc://` | 4 设备表(`ast_edit/ast_grep/browser/lsp`) | ✅ 与 section 的 devices 列一致 |
|
|
131
|
+
|
|
132
|
+
> 未能在 live 覆盖的两点,如实声明:`/original` 与 `compactions[label]` 需有效压缩档,本会话 `compactions: 0`,故 `CTX_BAD_PATH`(/original 裁撤)只由单测 `ctx.spec` 第 8 例证明;config gates 的四个分支需改 patch 行并重启实例,本轮未做(见 F10)。
|
|
133
|
+
|
|
134
|
+
## 6. 发现清单(按处置优先级)
|
|
135
|
+
|
|
136
|
+
| # | 级别 | 发现 | 证据 | 建议处置 |
|
|
137
|
+
|---|---|---|---|---|
|
|
138
|
+
| F1 | **高** | 快照缺 `segments`(per-compaction 分段 + live 热区)——ctx spec 明文要求、design D5 明文要求、无实现、无测试 | `ctx.ts:508-550` 无该字段;live #2 | 二选一:补实现(首选,spec 是契约)或在本轮明确降级并改 spec;**不可两边都不动** |
|
|
139
|
+
| F2 | **高** | read「有序 transform 链」未接线,`transforms.ts` 为死代码;`SCHEME_URL_RE` 双份与「kept in ONE place」注释矛盾;tasks 2.3(hashline 独立化)未交付 | `createUrlTransform/createAnchorTransform` 全仓零调用;`read.ts:73` vs `transforms.ts:50`;tasks 2.3 未勾 | 要么落地 extract(read.ts 走 chassis),要么把 spec 的 ADDED「ordered transform chain」降级为「单一注册 + 终端 delegate」并改注释;死代码不应留在发布面 |
|
|
140
|
+
| F3 | 中 | bracket 元素路径忽略 `:N-M` 行窗 | live #4/#5/#6;`ctx.ts:452-462`/`:476-481` 不过 `applyFace` | spec 的「every resolved resource」是硬话;补 `applyFace` 一行即可,或收窄 spec 措辞 |
|
|
141
|
+
| F4 | 中 | design.md D2 与实现/ctx spec 冲突(`/transcript` 保留为 canonical 别名) | `ctx.ts:334`;live #3;ctx spec「Bare listing」 | 改 design.md(存档件纠偏),不要改实现 |
|
|
142
|
+
| F5 | 中 | `CTX_UNKNOWN_KEY` 不回显子路径清单 | `ctx.ts:250-253`;live #7 | 把 `:556` 那份子路径清单并入 unknown-key 消息 |
|
|
143
|
+
| F6 | 中 | section 的 bare-root-as-help 对 `skill://`(及 `dsh://`)失实 | live #9/#10;`skill.ts:141` | 改 `url-schemes-section.md` 一句(点名真正支持枚举的 ctx/agent/dvc),或给 skill/dsh 补 bare 枚举 |
|
|
144
|
+
| F7 | 低 | `system_prompt` 卡在无 `request/header` 时整键消失 | `ctx.ts:536`;live #2 | 输出 `{chars:0, preview:''}` 之类的显式空卡,或 spec 注明条件性 |
|
|
145
|
+
| F8 | 低 | 「≤600 chars」说法不成立(实际 1,788 字符 / 19 行,无预算断言) | `wc -m url-schemes-section.md` = 1788;`general-section.spec.ts` 无预算断言 | 更正 tasks 4.1 与实测报告 §2;如确实要控体积,补一条真实的预算断言 |
|
|
146
|
+
| F9 | 低 | 证据链数字漂移:ctx.spec「15/15」实为 **19/19**;§3.2.1「general-section 6/6」实为 **2/2**;tasks 3.2「roster 7 行」实为 **9 行**;tasks 3.3/3.4/6.2b 仍把 `[label]/original` 当可用面(已被 §3.2.1 的 reshape 裁撤) | 本轮 vitest 逐文件计数;live #1 | 更正 tasks.md 与实测报告,避免后续 session 按错数字验收 |
|
|
147
|
+
| F10 | 低 | config gates **无工具层测试**:`urlSchemes:false`/`hashline:false` 四个分支零断言,`resolveGates` 零单测(仅 `general-section` 与 `fs-backend` 各 1 处 gate 断言) | `grep -rn 'urlSchemes: *false\|hashline: *false' test/` 仅 3 命中 | tasks 1.2 承诺的「4-gate 组合注册断言」补齐;行为本身按源码静态读到是对的 |
|
|
148
|
+
| F11 | 记录 | fs backend spike 未挂载、收益未兑现(spec 无对应 requirement,属可放弃项) | `createUrlAwareFileSystemBackend` src 内零引用;design D7 | 保持 spike 姿态;若本轮放弃,在 design/报告注明「不挂载」结论 |
|
|
149
|
+
| F12 | 记录 | 源码注释漂移:`selector.ts:6` 与 `resolver.ts:6` 写「All five schemes / 五个 handler」而注册了六个(含 http(s));`index.ts:19-22` 仍写「`read` keeps its vendored hashline file branch and **captures nothing**」(capture-read 已落地) | 文件头即证 | 顺手更正,避免下一轮再被旧注释误导 |
|
|
150
|
+
|
|
151
|
+
## 7. 结论
|
|
152
|
+
|
|
153
|
+
1. **design.md 的机制主干成立**:D1 文法、D3 label/嵌套链、D2 的 canonical/prepared 模型、D6 的单源+门控、D8 的验证纪律,均在实际代码与活体行为上找到对应,无一处是空头设计。
|
|
154
|
+
2. **但 design.md 已被 reshape 甩开**:`/transcript` 的存废、`thinking`/`system` 两面、`/original` 的重塑,设计文本停在回改之前(既有实测报告 §3.2.1 记录了 user 的 reshape 批示)。**设计文件需要一次对齐修订**,否则它作为「研究底稿 → 决策」的索引会持续误导后续 session(F4/F9)。
|
|
155
|
+
3. **两项实质欠账必须处置**:F1(快照 `segments`,spec 明文)与 F2(read transform 链,spec ADDED 明文)。两者都不是文档问题,是**契约与实现的差**;要么补实现,要么改 spec——按 AGENTS §〇 的验收同类原则,**不能靠「单测绿」把 spec 要求悄悄抹掉**(F1 恰恰是「spec 有、测试无」才活到今天的)。
|
|
156
|
+
4. **发布红线未触碰**:本轮无 `npm publish`、无 prod 改动、无 tag。tasks 6.3(user 确认 → 归档 → 发布)仍原样待 user 裁决。
|
|
157
|
+
|
|
158
|
+
**附带产物**(可复核):
|
|
159
|
+
- `.scratch/verify-url-schemes-vitest.log` — 全量单测原始输出(含 14 例失败的完整堆栈)
|
|
160
|
+
- `.scratch/verify-url-schemes-tsc.log` — tsc 13 错原始输出
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# URL Schemes 可回溯上下文 — 4999 实测剧本(change 2026-09-11-url-schemes-recallable-context)
|
|
2
|
+
|
|
3
|
+
> 实例:`http://127.0.0.1:4999/?token=<redacted>`(systemd 单元 `dsh-4999-test`,DSH_HOME=仓库内 `.dsh-test`,构建=本 change 源码树;2026-09-12 user 指令下线 omp-web-4999-test/lan-relay 后由 4986 迁入 4999)
|
|
4
|
+
> 驱动方式(0.2.3-d 先例):user 在 GUI 打开上述 URL 开一个**新会话**,把下方「粘贴给 agent 的指令」整段贴进去;agent 完成后把它的回复贴回本 change 的实测报告。
|
|
5
|
+
> **✅ 已执行(2026-09-12,agent 经 HTTP RPC 自驱,10/10 判定全过)**:被测会话 `session-eec306df`,结果与判定对照见实测报告 §3.2;本剧本存档留作复演模板。
|
|
6
|
+
|
|
7
|
+
## 粘贴给 agent 的指令
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
请按顺序执行以下第一人称实测,每步原文贴出关键输出(不要省略):
|
|
11
|
+
|
|
12
|
+
1. read ctx:// — 贴出完整 roster。
|
|
13
|
+
2. read ctx://session — 贴出 JSON 的 totals 与 compacted 字段(此时 compacted 应为空清单或不存在条目)。
|
|
14
|
+
3. 为了制造可压缩的历史:请连续 read 以下三个文件并各贴出一行内容摘要——
|
|
15
|
+
dashr/src/url-schemes/transforms.ts、dashr/src/url-schemes/handlers/ctx.ts、dashr/src/url-schemes/fs-backend.ts。
|
|
16
|
+
4. 执行 /compact(手动压缩一次)。完成后 read ctx://session/compactions — 贴出清单;记下第一个 label(记为 L1)。
|
|
17
|
+
5. read ctx://session/compactions[L1] — 贴出 8 段 summary 的前 5 行。
|
|
18
|
+
6. read ctx://session/compactions[L1]:raw — 贴出前 10 行与总行数;确认包含第 3 步读过的文件名。
|
|
19
|
+
7. 再正常对话 2-3 轮(例如问「transcript 格式 v1 冻结是什么意思」)后再次执行 /compact(第二次,嵌套前档)。然后 read ctx://session/compactions — 贴出新清单;确认第二个条目的 replaces_checkpoint 等于 L1 的 checkpoint_seq。
|
|
20
|
+
8. read ctx://session/compactions[<第二个label>] — 贴出 8 段前 5 行。
|
|
21
|
+
9. read ctx://session/compactions[L1]:raw — 关键回归:第一次压缩的原文在第二次压缩后必须仍可读;贴出前 10 行,确认包含第 3 步的文件名与 'hello world' 级别的原始内容。
|
|
22
|
+
10. read ctx://session/compactions[L1]/original:1-5 — 贴出行窗结果。
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 判定基准(对照 mapping doc §9–§15.11)
|
|
26
|
+
|
|
27
|
+
| # | 断言 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| 1 | roster 含 `ctx://session`、`compactions`、语法提示 |
|
|
30
|
+
| 2 | snapshot JSON 含 `totals`/`compacted: []`/`syntax` 字段;`session.id` 正确 |
|
|
31
|
+
| 4 | manifest 出现 1 个条目,label = compaction/summary 事件 seq |
|
|
32
|
+
| 5 | 8 段 summary 原文(prepared face) |
|
|
33
|
+
| 6 | `:raw` = 被 shadow 的原文(含第 3 步文件内容),**不含** summary 的 `## ` 段落 |
|
|
34
|
+
| 7 | 第二条目 `replaces_checkpoint` = L1 的 checkpoint_seq(嵌套链) |
|
|
35
|
+
| 9 | **嵌套后 L1 原文仍可读**(log 永不删除 ⇒ 全链可寻址) |
|
|
36
|
+
| 10 | `/original:1-5` 行窗作用于 canonical |
|
|
37
|
+
|
|
38
|
+
已知边界(非缺陷):`ctx://model`/`ctx://cwd` 一级 key 已按 spec 移除(信息卡并入 `ctx://session`);未挂 fs backend spike 时原生 read 不解析 scheme(chassis 内 URL branch 承担全部 scheme 寻址)。
|
|
39
|
+
|
|
40
|
+
## 环境事实
|
|
41
|
+
|
|
42
|
+
- 实例:4999(systemd `dsh-4999-test`,restart = `systemctl --user restart dsh-4999-test`;日志 `.scratch/dsh-4999.log`;2026-09-12 自 4986 迁入)
|
|
43
|
+
- 事故记录:4988 为 superd multi-context PoC 占用(AGENTS §二 勿杀)——首轮启动误占即 EADDRINUSE(loud fail,符合预期)后改 4986;2026-09-12 user 指令下线 omp-web-4999-test / omp-web-lan-4999-relay 后迁入 4999。
|
|
44
|
+
- 构建链:canonical rsync → devDeps 手术(14 × workspace:*)→ `pnpm --filter better-dsh exec tsdown` → `tsx scripts/build-client.ts`。
|