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.
- package/cordis.patch.yml +1 -1
- 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/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/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 +327 -88
- package/lib/fs-aware/sandbox-plugin.d.ts +71 -0
- package/lib/fs-aware/sandbox-plugin.js +249 -0
- package/lib/index.d.ts +22 -22
- package/lib/index.js +3095 -3204
- package/lib/lsp-server-registry-DkaYmTwt.js +972 -0
- package/lib/lsp-server-registry-_hk-Wcia.js +3 -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/wrap-JFjcWwZf.js +747 -0
- package/package.json +9 -3
- 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
package/cordis.patch.yml
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
name: 'better-dsh'
|
|
16
16
|
config:
|
|
17
17
|
python: !!js process.env.DASHR_KERNEL_PYTHON ?? 'python3'
|
|
18
|
-
# NOTE (v0.2.
|
|
18
|
+
# NOTE (v0.2.2a): trustedPageAuthorities' DERIVED default lives in the
|
|
19
19
|
# plugin's Config schema (src/index.ts), NOT here — a profile/home
|
|
20
20
|
# layer row with this id whole-row-overrides this config object, which
|
|
21
21
|
# would wipe any default declared at the bundle layer (empirically
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# 事件报告:write 工具 sandbox 升级透传 bug(复发 + 新失败模式:调用挂起)
|
|
2
|
+
|
|
3
|
+
> 日期:2026-09-06 · 环境:DSH v0.1.2-alpha 线(prod 3080 / Web GUI),session 模型 GLM,
|
|
4
|
+
> file policy = workspace-write(workspace:`/home/u1/workspaces/dashr`),approval policy = ask。
|
|
5
|
+
> 前置记录:2026-09-03 edit 工具同类 bug(session `8e966430`,"hashline edit escalation
|
|
6
|
+
> passthrough bug";dashr 插件侧修复 commit `e27fdec` + 报告 follow-up `419ca0e`——该修复仅覆盖
|
|
7
|
+
> vendored hashline edit 路径,本次 write 工具复发说明 harness 层文件工具透传问题未除根)。
|
|
8
|
+
|
|
9
|
+
## 场景
|
|
10
|
+
|
|
11
|
+
向 workspace 之外写文件:`/home/u1/workspaces/superd/docs/00-blueprint.md`(Super D 蓝图,
|
|
12
|
+
新建同级仓)。workspace-write 模式下首次尝试即被拒(`Read-only file system` / file access denied),
|
|
13
|
+
按规则走单次 `sandbox_permissions` 升级重试。
|
|
14
|
+
|
|
15
|
+
## 失败 1(已知 bug 复发):write 的升级字段被丢弃
|
|
16
|
+
|
|
17
|
+
首次 `write` 调用携带 `sandbox_permissions: "danger-full-access"` + justification,直接返回
|
|
18
|
+
`[sandbox: file access denied under workspace-write mode]`——**未弹出任何审批卡片**,升级字段
|
|
19
|
+
疑似在 harness 透传层被丢弃。与 2026-09-03 记录的 edit 工具症状同类:**文件类工具(write/edit)
|
|
20
|
+
的 sandbox_permissions 透传失效,bash 工具的升级正常**。
|
|
21
|
+
|
|
22
|
+
## 失败 2(新失败模式,更严重):升级后的 write 调用挂起至手动停止
|
|
23
|
+
|
|
24
|
+
agent 推理链(UI 可见):此前一次 bash 升级到 workspace-write 被拒,报错提示"升级必须严格宽于
|
|
25
|
+
当前模式"(当前已是 workspace-write);据此判断应改用 danger-full-access 重试 `write`。
|
|
26
|
+
该重试调用**表面上已发出,但此后 >5 分钟 agent 无任何活动**——非响应/挂起。用户在 UI 按
|
|
27
|
+
"stop" 并发新 prompt 才恢复。
|
|
28
|
+
|
|
29
|
+
即:升级版 write 不仅没有触发审批提示,还把整个 turn 挂死直到手动中断。两种可能根因待查:
|
|
30
|
+
(a) 审批提示从未渲染(透传丢失后 promise 悬空);(b) 调用 promise 永不 settle。
|
|
31
|
+
|
|
32
|
+
## 有效的 workaround
|
|
33
|
+
|
|
34
|
+
`bash` heredoc + `sandbox_permissions: "danger-full-access"` —— bash 的升级链路正常,审批弹出、
|
|
35
|
+
批准后写入成功(superd 仓蓝图 + git commit `1c1969a` 均经此路径完成)。
|
|
36
|
+
|
|
37
|
+
## 建议
|
|
38
|
+
|
|
39
|
+
1. **修复前**:跨 workspace 文件写入一律走 bash heredoc + 升级,不用 write/edit 的升级。
|
|
40
|
+
2. **根因排查**:write/edit 的 sandbox_permissions 透传丢失点(harness 文件工具包装层);
|
|
41
|
+
以及挂起问题——需区分"审批提示未渲染"与"promise 未 settle",二者修法不同。
|
|
42
|
+
3. 回归范围:至少覆盖 write / edit / undo_last_edit 三个文件工具 × workspace-write 与
|
|
43
|
+
read-only 两种基线模式下的升级路径。
|
|
44
|
+
|
|
45
|
+
## 同日复测(本地 Web GUI):write 升级链路实测通过
|
|
46
|
+
|
|
47
|
+
> 环境差异:prod 3080 / GLM → 本地 Web GUI(127.0.0.1:4999)/ deepseek-v4-flash;
|
|
48
|
+
> file policy = workspace-write(workspace:`/home/u1/workspaces/temp`),approval policy = ask。
|
|
49
|
+
> 测试目标(workspace 之外):`/home/u1/workspaces/base/.scratch/dsh_ws_test.txt`
|
|
50
|
+
|
|
51
|
+
### 实测记录
|
|
52
|
+
|
|
53
|
+
1. **基线越界 write → 立即被拒,无审批卡**:
|
|
54
|
+
`[sandbox: file access denied under workspace-write mode]`
|
|
55
|
+
且拒绝消息自带第二行 affordance 提示(本轮行为的关键信号源):
|
|
56
|
+
`[sandbox: escalation available — retry this exact operation once with sandbox_permissions (the narrowest wider mode that suffices) + justification; the approval prompt asks the user]`
|
|
57
|
+
2. **单次升级重试**:`sandbox_permissions: "danger-full-access"` + justification → 返回
|
|
58
|
+
`Created`(审批通过),未再出现 denial;磁盘校验 `-rw------- 1 u1 u1 26`,内容
|
|
59
|
+
`test write from dsh agent`。
|
|
60
|
+
3. 全程**无挂起、无字段丢弃、无静默失败**。
|
|
61
|
+
|
|
62
|
+
**结论**:本地构建上 write 升级链路(字段透传 → 审批渲染 → promise settle)实测通过,与 prod 3080
|
|
63
|
+
报告的「字段丢弃 + 挂起」复发症状不一致 → 缺陷疑为环境/构建相关(或已被修复)。建议按上文
|
|
64
|
+
「建议 3」在 prod 3080 上回归 write / edit / undo_last_edit × workspace-write 与 read-only 基线。
|
|
65
|
+
|
|
66
|
+
## 附 A:escalation 提示机制的优化(reminder 文案)
|
|
67
|
+
|
|
68
|
+
同一机制在 system prompt 中至少出现三处,语义同一但角色不同:
|
|
69
|
+
① 工具 schema 参数声明(affordance / API 表面,只声明字段存在);
|
|
70
|
+
② policy 规则段(procedure:何时、怎么用 + 大量禁令);
|
|
71
|
+
③ runtime-context 快照补充句(情境重启,位于每次 turn 顶部、工具调用前最后读到的位置)。
|
|
72
|
+
|
|
73
|
+
本轮讨论聚焦③的措辞。现文:
|
|
74
|
+
|
|
75
|
+
> Restricted operations may be retried once with sandbox_permissions for single-call escalation,
|
|
76
|
+
> pending user approval.
|
|
77
|
+
|
|
78
|
+
对字面论 / 风险厌恶型模型,存在两种可被误读的推理路径:
|
|
79
|
+
|
|
80
|
+
(a) **配额式误读**:「once」被理解为一次性越权许可——只能带 escalation 请求一次;若首次升级被
|
|
81
|
+
user deny,模型可能推断整个机制已耗尽、连后续命令也不再尝试升级。但 runtime **无状态**:不记录某
|
|
82
|
+
命令是否已 escalate / 被 deny,系统不存在这类配额。
|
|
83
|
+
(b) **ask-first 误读**:「pending user approval」被读成先征得批准再 retry,与 policy 的
|
|
84
|
+
「don\'t detour through chat — the retry itself raises the approval prompt」相悖。
|
|
85
|
+
|
|
86
|
+
「once」的字面语义与真实策略(单次 retry)并不冲突;歧义在于**未声明机制的 per-call / 无状态属性**,
|
|
87
|
+
而该属性正是阻止 (a) 误读的关键事实。因此措辞应从「配额式」改为「机制式」,显式声明:per-call、
|
|
88
|
+
无配额记录、审批由 retry 自动触发、单次 deny 只作用于该 call。
|
|
89
|
+
|
|
90
|
+
**定稿(同日终版,替换③;上文「主推 / 短变体」作废)**:
|
|
91
|
+
|
|
92
|
+
> A sandbox-deniable/denied call may be escalated with `sandbox_permissions="danger-full-access"` and a
|
|
93
|
+
> one-line `justification`; the runtime will prompt for user approval. Escalation and its
|
|
94
|
+
> approval/denial are per-call.
|
|
95
|
+
|
|
96
|
+
双词并列**中立覆盖两条路径**:`deniable`——读到本段、且按 policy 可演绎判定为越界的调用(workspace +
|
|
97
|
+
temporary 之外)直接升级,不做 doomed 往返;`denied`——未注意本段、已被拒的调用同样可升级。全文无
|
|
98
|
+
retry / once / 配额措辞。安全边界是**双重硬 guard**:sandbox(policy 判定)+ user approval(审批卡);
|
|
99
|
+
预升级至多多弹一张可拒审批卡,无实害,「等审批」的心理摩擦天然抑制滥用。`danger-full-access` 经源码
|
|
100
|
+
核对(`escalation.ts` `WIDER_MODES`:workspace-write → [danger-full-access],且本句仅在该模式下渲染),
|
|
101
|
+
参数名与 justification 单句配对均与 schema 一致。
|
|
102
|
+
|
|
103
|
+
**具体 example(agent 视角最小推演)**:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
#1 write(workspace 外路径) → denied(无审批,返回 marker + affordance 行)
|
|
107
|
+
#2 write(同路径, sandbox_permissions="danger-full-access", justification="…") → 弹审批卡
|
|
108
|
+
user 点 deny
|
|
109
|
+
→ 语义:该 call 就此结束(stop and explain),≠ 「escalation 机制已耗尽」
|
|
110
|
+
#3 稍后另一条命令被拒 → 仍可走同一升级路径(per-call,runtime 无配额记录)
|
|
111
|
+
✗ 错误推理:#2 被 deny ⇒ 我不能再发起任何 escalation
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**配套建议**:
|
|
115
|
+
|
|
116
|
+
- ②policy 段的关键句(rejected = final for that command,但不禁止后续命令升级)与③措辞需锁死一致,
|
|
117
|
+
避免三处漂移;
|
|
118
|
+
- 最强一层是**环境内信号**:denial 消息自带 affordance 行(本轮实测可见,现构建已带)。它零 token、
|
|
119
|
+
位置恰好、不可能被 attention 漏掉;应作为固定格式保留,并让提示中的 mode / 参数名与消息完全一致。
|
|
120
|
+
|
|
121
|
+
## 附 B:保留并补充该 reminder 的必要性(语态 / 效价问题)
|
|
122
|
+
|
|
123
|
+
系统 prompt 原本已含等价语义(②policy 段),但该段 **permission 密度低、被高强度禁令包围**
|
|
124
|
+
(Do not detour… / Never escalate speculatively / A rejected escalation is final / no exception /
|
|
125
|
+
a denial is final)。LLM 对禁令性词语的权重显著高于许可性陈述;风险厌恶型模型读后的净效价收敛为
|
|
126
|
+
「escalation 是高风险的非常规动作,能避则避」——这为观测到的「静默失败」(denial 后直接放弃、从不
|
|
127
|
+
尝试升级)提供了行为学解释:**这不是注意力丢失,而是语态 / 效价问题**。
|
|
128
|
+
|
|
129
|
+
③是全文唯一「零否定、纯许可」的 escalation 表述,且位于 turn 顶部快照(决策前最后读到)→ 命题上
|
|
130
|
+
与②重复,但功能上不冗余:它承载 **grant(放行)**,②承载 **procedure(程序 + 禁令)**。本轮复测中
|
|
131
|
+
agent 在 denial 后正确、立即升级,除错误消息 affordance 外,③的纯许可语态是「敢试」的直接依据。
|
|
132
|
+
|
|
133
|
+
结论:③应保留并按附 A 修正措辞;不要在静态 prompt 中继续增加第四处副本(边际收益到顶),后续投资
|
|
134
|
+
应放在 denial 消息的 affordance 质量(直接给出该传的 mode)。
|
|
135
|
+
|
|
136
|
+
## 附 C(新发现 · 待修):rules 段「escalating up front is fine only when this session already denied the same access」自相矛盾
|
|
137
|
+
|
|
138
|
+
> 追加于定稿同日;定位为文本漂移,修复另行排期,本轮未改动任何源码。
|
|
139
|
+
|
|
140
|
+
**归属结论(同日追查)**:该子句位于**上游** DSH v0.1.2-alpha.5 源码——本 checkout 即
|
|
141
|
+
github.com/deepseek-ai/deepseek-harness 的浅克隆(HEAD `db6bdc3576`,唯一 remote 为上游
|
|
142
|
+
origin);`packages/shell/tool-bash/src/index.ts:89` 与 `packages/shell/tool-pwsh/src/index.ts:140`
|
|
143
|
+
均经 `git ls-files` 确认是上游跟踪文件。blame 止于 `47f943859b`(2026-08-13,上游 PR #2519
|
|
144
|
+
merge)系浅克隆边界,真实引入 commit 更早、被截断。对照:刚定稿的快照句(dashr:escalation-
|
|
145
|
+
guidance,`packages/better-dsh/better-dsh/src/index.ts`)属 Better Dash(repo:pgmi-builds/
|
|
146
|
+
better-dsh),在上游 tree 内为 untracked(`??`)叠层。**修复含义**:改矛盾句 = 改上游跟踪
|
|
147
|
+
文件,不能直接 commit 进本 checkout;两条路——上游 PR,或在 better-dsh 的 prompt 装配层覆盖
|
|
148
|
+
订正 bash/pwsh 工具描述(与 dashr:escalation-guidance 同款注入方式)。
|
|
149
|
+
|
|
150
|
+
**自相矛盾分析**:按字面语义,「escalating up front」(未尝试即升级)与「already denied the
|
|
151
|
+
same access」(已尝试且被拒,同一 access)互斥——后者成立则前者必然不成立,条件永远无法满足。
|
|
152
|
+
属两条规则被硬拼成一句的编辑事故。**推断的原意**:同一 access 已被本 session 拒绝过一次之后,
|
|
153
|
+
再次需要时不必重发 doomed 调用、可直接升级(豁免重复往返)——但这层豁免语义句子本身没写出来。
|
|
154
|
+
|
|
155
|
+
**事实核对(源码)**:
|
|
156
|
+
|
|
157
|
+
- 该子句仅存在于两处模型可见的工具描述:`packages/shell/tool-bash/src/index.ts:89`、
|
|
158
|
+
`packages/shell/tool-pwsh/src/index.ts:140`;并随描述文本进入 35 个
|
|
159
|
+
`snapshots/**/tool-schemas*.expected.json` 快照(随源重生成,不需手改)。
|
|
160
|
+
- 同策略的文档版本(tool-bash / tool-pwsh 的 README.md 与 README.zh.md)**均无此子句**
|
|
161
|
+
(0 命中)——同一策略在工具描述与文档中本就是两个版本(次级漂移)。
|
|
162
|
+
- runtime 无 prior-denial 状态:`approveEscalation`(`packages/sandbox/sandbox/src/escalation.ts`)
|
|
163
|
+
只有三道闸——参数配对、严格更宽(`WIDER_MODES`)、审批通道。文档所称
|
|
164
|
+
「a request with no real prior denial … fails closed」在代码中并未实现为状态检查;
|
|
165
|
+
该子句纯属 prompt 层规范。
|
|
166
|
+
|
|
167
|
+
**与本轮定稿的关系**:附 A 定稿(快照句)规定 deniable(policy 可演绎判定越界)调用可直接升级;
|
|
168
|
+
本子句规定 upfront 升级仅在 same-access 已 denied 后才允许——同一动作两个触发定义,且其中之一
|
|
169
|
+
自相矛盾。rules 段禁令权重高(见附 B 效价分析),模型大概率取 deny-first 读法,与快照句的
|
|
170
|
+
deniable 路径持续张力。
|
|
171
|
+
|
|
172
|
+
**修复方向(未实施,待排期)**:把豁免语义显式化,例如「once this session has already denied
|
|
173
|
+
the same access, you may escalate again without re-firing the doomed call」;或与 deniable 原则
|
|
174
|
+
统一为「policy 可演绎判定将被拒的调用可直接升级」。需同步:tool-bash / tool-pwsh 工具描述 ×2、
|
|
175
|
+
README ×2(en/zh 一并对齐)、35 个快照重生成;并与 deniable/denied 的 deny-first vs 预判升级
|
|
176
|
+
产品决策对齐后再动。
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# 诊断报告:hashline edit `E_RANGE_UNVERIFIED` 跨轮会话键失效
|
|
2
|
+
|
|
3
|
+
> 日期:2026-09-08 · 环境:DSH v0.1.2-alpha 线(Web GUI),file policy = workspace-write
|
|
4
|
+
> (workspace:`/home/u1/workspaces/dashr`),better-dsh hashline edit 桥(vendored
|
|
5
|
+
> `dashr/src/url-schema/vendored/hashline/`,dsh-better-edit 工具集)。
|
|
6
|
+
> 性质:**行为诊断**(非实测计划);一次真实触发 + 源码级与账本级取证。
|
|
7
|
+
> 前置关联:`2026-09-06-write工具sandbox升级透传bug复发及挂起-事件报告.md`(同桥另一缺陷线)。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 0. 一句话结论
|
|
12
|
+
|
|
13
|
+
`E_RANGE_UNVERIFIED` 拒绝**不是校验代码的 bug**:write 后 auto-read 确实记了账,但 hashline
|
|
14
|
+
的 served 账本按 **(session_id, path)** 键存储,而本部署**每个对话轮(continuation round)更换
|
|
15
|
+
harness session id**——上一轮 write-hook 记的账,下一轮 edit 用自己的新键去查,必然查空。锚点
|
|
16
|
+
与磁盘内容当时完全匹配(echo 可证),拒绝是**出处(provenance)账本问题,不是 staleness**。
|
|
17
|
+
fail-closed 与批量原子性按设计工作,零数据损伤;代价是**跨轮编辑必须冗余 read 一次**。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. 现象与错误解剖
|
|
22
|
+
|
|
23
|
+
原始报错(13-tuple 批量 edit 的第 0 个 tuple):
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Error: [E_BATCH_ABORT] edits[0] (…/docs/superd/01-component-boundaries.md) failed:
|
|
27
|
+
[E_RANGE_UNVERIFIED] cannot verify range against served state in …:
|
|
28
|
+
remove_from "Utw" has no served position; remove_to "Utw" has no served position.
|
|
29
|
+
Current range:
|
|
30
|
+
Utw│# Super D 组件边界与 UI 组合层(v0.1)
|
|
31
|
+
Retry with these anchors (no read needed). … The whole batch was rejected and
|
|
32
|
+
NOTHING was written — no file changed and earlier items in the batch were NOT applied.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
三层套叠,每层各自按契约工作:
|
|
36
|
+
|
|
37
|
+
| 错误码 | 含义 | 触发条件 | 本次是否命中 |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| `E_RANGE_UNVERIFIED` | 出处校验失败:锚点 hash 在**本会话 served 账本**查无位置 | 账本没记过"你看过这行" | ✅(本案) |
|
|
40
|
+
| `E_RANGE_STALE` | 内容漂移:served 位置上的 hash 与当前文件不一致 | 文件在 serve 之后被改过 | ❌ |
|
|
41
|
+
| `E_RANGE_UNSERVED` | 区间中洞:起止锚在账,中间行从未 served | 部分服务(截断读后编辑跨页) | ❌ |
|
|
42
|
+
| `E_BATCH_ABORT` | 批量原子中止:任一 tuple 失败 ⇒ 整批不写、先前 tuple 也不应用 | 防半套状态 | ✅(外层包装) |
|
|
43
|
+
|
|
44
|
+
注意 echo 行 `Utw│# Super D 组件边界与 UI 组合层(v0.1)` 与磁盘逐字节一致——**锚点本身完全
|
|
45
|
+
有效**,拒绝纯粹因为账本查无出处。
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 2. 事发回放(时间线)
|
|
50
|
+
|
|
51
|
+
| 时刻 | 轮 | 动作 | 结果 |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| 轮 B | 蓝图 + 边界文档轮 | `write` 创建 `01-component-boundaries.md`(244 行) | write-hook 触发:结果尾部带 `--- Auto-read (hashline anchors) ---`,全文件锚点(`Utw…Pb8`);`readAndServe → recordServed` 记账,键 = 轮 B 的 session id |
|
|
54
|
+
| 轮 B→C | 轮边界 | harness 换 session id | (无感知) |
|
|
55
|
+
| 轮 C | 透传/认证轮 | 拿 auto-read 锚点提交 13-tuple edit | `loadServed(轮C键, path)` = 空 → `E_RANGE_UNVERIFIED` → 整批拒绝,**零写入** |
|
|
56
|
+
| 轮 C | 同轮 | `read` 全文(重新记账到轮 C 键)→ 原样重交 | 13/13 全部成功 |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 3. 取证
|
|
61
|
+
|
|
62
|
+
### 3.1 代码链(vendored hashline,全部一手核对)
|
|
63
|
+
|
|
64
|
+
| 环节 | 文件 | 事实 |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| 拒绝点 | `hashline/anchor-pipeline.js:462` `verifyServedRange()` | 先 `servedPositionsOf(served, hash)` 查账:查无 → `E_RANGE_UNVERIFIED`;查到但内容不匹配 → `E_RANGE_STALE`;区间中洞 → `E_RANGE_UNSERVED` |
|
|
67
|
+
| 批量原子性 | `edit-engine.js:270` | 任一 item 失败 → `[E_BATCH_ABORT]` + 当前区间 echo,整批不写 |
|
|
68
|
+
| write 记账 | `write-hook.js`(`tools/post-execute` 监听) | write 成功后调 `readAndServe(io, path, cwd, { sessionKey: execSessionKey(exec) })`——**渲染锚点与记账是同一次调用**,preview 出现 = 记账执行过;catch 兜底只影响回显不影响 write 本体 |
|
|
69
|
+
| 账本读写 | `read-and-serve.js` → `session-view.js` `recordServed/loadServed` | served 按 **(session_id, path)** 唯一键 upsert |
|
|
70
|
+
| 键推导 | `session-view.js:47-58` | `sessionKeyFor(exec.agent?.session.id)`;缺 id 时落到进程级 `randomUUID()` 兜底键 |
|
|
71
|
+
| 存储位置 | `paths.js` `configDir(cwd)` | `<workspace>/.dsh_better_edit/hash-store.sqlite`;workspace = `exec.agent.session.header.cwd`(`withWorkspace` 传播) |
|
|
72
|
+
|
|
73
|
+
### 3.2 账本验尸(sqlite 实查)
|
|
74
|
+
|
|
75
|
+
库:`/home/u1/workspaces/dashr/.dsh_better_edit/hash-store.sqlite`(表:snapshots / meta / undo /
|
|
76
|
+
served;served 666 行、579 快照)。
|
|
77
|
+
|
|
78
|
+
本对话相关行(节选,按时间):
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
09-08 01:18 session-cb07ad10… (轮 A:dash-research 深化轮)
|
|
82
|
+
09-08 02:13 session-a1b3097d… 01-component-boundaries.md ["Utw","AuN",…] ← v0.1 布局
|
|
83
|
+
09-08 02:15 session-a1b3097d… 00-blueprint.md ["aD5",…]
|
|
84
|
+
09-08 03:20 session-a61bbf92… 00-blueprint.md ["C7S",…](v0.3 期)
|
|
85
|
+
09-08 03:41 session-328368a6… 01-component-boundaries.md ["pKk",…] ← v0.3 后布局
|
|
86
|
+
09-08 03:53 session-328368a6… 00-blueprint.md ["rJz",…]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
关键观察:
|
|
90
|
+
|
|
91
|
+
1. **每轮一个键**:served 表共 50+ 个 distinct session 键(含大量无 `session-` 前缀的裸 UUID——
|
|
92
|
+
`sessionKeyFor(undefined)` 的进程兜底键,来自 preview/test 形态)。本对话各轮 `memory_flush`
|
|
93
|
+
回显的 session id 与账本键一一对应(轮 A=`cb07ad10…`、轮 B=`7104efad…`),**轮 B 的键在
|
|
94
|
+
本库无任何行**——它的 read/edit/write-hook 记账落在了别处(store 跟随 exec cwd)或同样因
|
|
95
|
+
轮界不可见;轮 C 的编辑因此查空。
|
|
96
|
+
2. **(session, path) upsert 语义**:同键同路径后写覆盖前写,跨键各留一行——这正是"跨轮每换
|
|
97
|
+
一键就重读一次"摩擦的账面痕迹(blueprint 在 4+ 个键下各有一行)。
|
|
98
|
+
3. **snapshots 表全局按 path**(不分会话)——与 served 的会话隔离形成对照:文件指纹证据本来
|
|
99
|
+
就有全局权威,只有"谁看过"是会话私有的。
|
|
100
|
+
|
|
101
|
+
### 3.3 判定时刻的锚点有效性
|
|
102
|
+
|
|
103
|
+
拒绝时的 echo 显示 `Utw` 行与磁盘一致;且调用方必须先在**当前文件哈希表**里定位出锚点区间才能
|
|
104
|
+
构造该 echo(`verifyServedRange` 收到 `fileHashes` 与定位后的 `startLine/endLine`)。即:**锚点
|
|
105
|
+
与磁盘逐字节匹配的条件下仍然被拒**——拒绝条件是纯账本出处,非内容漂移。这是提出修复方案 1
|
|
106
|
+
(content-match 快道)的直接依据。
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 4. 判定
|
|
111
|
+
|
|
112
|
+
**没有坏的部分**(逐项核对通过):
|
|
113
|
+
|
|
114
|
+
- 校验逻辑三分支语义正确、先账本后内容、顺序合理;
|
|
115
|
+
- write-hook 记账链无缺陷(渲染与记账同调用,preview 出现即记账执行);
|
|
116
|
+
- fail-closed:查不到出处一律拒绝,绝不带疑写入;
|
|
117
|
+
- 批量原子性:`E_BATCH_ABORT` 整批回滚,先前的 tuple 不落盘(本案 13 tuple 零写入);
|
|
118
|
+
- 恢复路径干净:一次 `read` 重记帐后原样重交即全绿。
|
|
119
|
+
|
|
120
|
+
**缺口**(设计假设与部署现实不符):
|
|
121
|
+
|
|
122
|
+
- 账本假设"一个逻辑对话 = 一个稳定 session id";本部署每个 continuation round 换新 id(且
|
|
123
|
+
store 目录跟随 exec cwd),**跨轮 served 必然不可见** ⇒ 每个轮界对每个待编辑文件强制一次
|
|
124
|
+
冗余 read——纯摩擦、无风险、可完全消除。
|
|
125
|
+
- 报错文案 `"Retry with these anchors (no read needed)"` 对多 tuple 批是误导:echo 只把
|
|
126
|
+
`edits[0]` 的区间记为 served,原样重交会在 `edits[1]` 上再失败、循环往复;正确指引是
|
|
127
|
+
"read 一次后整批重交"。
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 5. 修复建议(better-dsh,按性价比排序)
|
|
132
|
+
|
|
133
|
+
1. **content-match 快道(推荐)**:`verifyServedRange` 已持有当前 `fileHashes` 与定位区间——
|
|
134
|
+
当锚点 hash 在当前文件的定位区间上**逐行全匹配**时直接接受。byte-exact 保障不损(全匹配
|
|
135
|
+
⇔ 自锚点生成以来该区间未变),served 账本从"门禁"降级为 echo/undo 的辅助。整体消灭此类
|
|
136
|
+
摩擦,且不依赖 harness 侧任何改动。
|
|
137
|
+
2. **served 键去 session 化**:per-workspace 一份;或当前键为空时采纳该 path 的最近 serves
|
|
138
|
+
(`snapshots` 已是全局按 path 的先例)。改动小,但弱化"多会话并行同一文件"的隔离语义,
|
|
139
|
+
需评估并发场景。
|
|
140
|
+
3. **改键源**:若 harness exec 暴露 conversation/root id(resume/continuation 的稳定根),
|
|
141
|
+
以其代替 `session.id` 做键——语义最正,依赖上游字段存在。
|
|
142
|
+
4. **廉价修(文案)**:多 tuple 批失败时指引改为"对本文件 read 一次后整批重交";顺带在
|
|
143
|
+
`E_RANGE_UNVERIFIED` 文案中点明"write auto-read 的锚点跨轮不可复用"这一部署事实。
|
|
144
|
+
|
|
145
|
+
建议 1 与 2/3 不互斥:1 消摩擦,2/3 修语义。落地走 openspec change 流程(含单测:write → 模拟
|
|
146
|
+
换 sessionKey → edit 应成功/回退行为明确)。
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 6. 复现与回归要点
|
|
151
|
+
|
|
152
|
+
- 触发条件:轮 N `write`(或 read)文件 → 轮 N+1 直接 edit 同文件 → 必现
|
|
153
|
+
`E_RANGE_UNVERIFIED`(首个 tuple 即拒)。
|
|
154
|
+
- 快速复现(不依赖轮界):同文件两次 edit 之间,用不同 `sessionKey` 调 `loadServed` 即等价
|
|
155
|
+
(单测可直接构造)。
|
|
156
|
+
- 回归断言:修复后 write/read 的锚点在**任意后续轮**直接可用;`E_RANGE_STALE`(真漂移)与
|
|
157
|
+
`E_RANGE_UNSERVED`(区间中洞)行为不变;批量原子性不变。
|
|
158
|
+
|
|
159
|
+
## 来源
|
|
160
|
+
|
|
161
|
+
- 一手源码:`dashr/src/url-schema/vendored/hashline/{write-hook,read-and-serve,session-view,
|
|
162
|
+
paths}.js`、`hashline/anchor-pipeline.js`(verifyServedRange)、`edit-engine.js`(批量中止)
|
|
163
|
+
- 一手账本:`/home/u1/workspaces/dashr/.dsh_better_edit/hash-store.sqlite`(served/snapshots/
|
|
164
|
+
undo 表实查,2026-09-08)
|
|
165
|
+
- 触发实录:本 session 轮 B→轮 C(`docs/superd/01-component-boundaries.md`,13-tuple 批,
|
|
166
|
+
拒绝后 read 重交 13/13 成功)
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
## 7. 勘误与设计裁决(2026-09-08 第二轮复核,user 主持)
|
|
172
|
+
|
|
173
|
+
> 本节修正上文 §0/§2/§4 的关键归因错误,并记录用户裁决的修复方向。原文保留作诊断过程记录。
|
|
174
|
+
|
|
175
|
+
### 7.1 勘误:"每轮换 session id" 不成立,真实机制是会话树 fork
|
|
176
|
+
|
|
177
|
+
| 上文断言 | 复核结论 | 一手证据 |
|
|
178
|
+
|---|---|---|
|
|
179
|
+
| "本部署每个 continuation round 更换 harness session id" | **不成立**。账本键 = `exec.agent?.session.id` 原样(`session-view.js:47-58`,无加工),与 `~/.dsh/sessions/<workspace>/session-<uuid>/` 目录及 `session.jsonl.zstd` header.id **一一对应**;同 id 跨多小时/多轮复用(328368a6:03:41+03:53 两笔;2f3a8234:04:27→11:41 跨 7h,本报告即该会话所写) | dashr 桶 6 个 session 目录与账本键全对上 |
|
|
180
|
+
| "轮 B→C harness 换 id(无感知)" | 真实机制 = **DSH 会话是树,延续/fork 产生新节点**:header 带 `parentSession` + `seedLength`;`packages/core/session/src/index.ts` 有显式 `fork(source, boundary?, childSessionId?)`(注释:"Seeding with an existing event log replays/forks a session")。fork 对 UI 与上下文透明,故 agent/user 均感知为"同一对话" | 实测谱系:`345e1e12 →fork→ cb07ad10 (seed 23,388)`;`a1b3097d(根, 01:24) →fork(03:08)→ 328368a6 (seed 65,305) →fork(03:11)→ a61bbf92 (seed 65,308)`;`2f3a8234` 独立根 |
|
|
181
|
+
| 病根表述 | 修正为:**轮 B write(02:13:16/02:15:02,键 a1b3097d)与轮 C edit(03:41:38/03:53:15,键 328368a6)分属父子会话节点**,served 按 (session节点, path) 记账 → 子节点查空 → `E_RANGE_UNVERIFIED`。fail-closed、批量原子、恢复路径等结论不变 | 账本 sqlite 逐行时间核对 |
|
|
182
|
+
| "memory_flush 回显 session id 与账本键一一对应(轮 B=7104efad…)" | **不成立,观察源即错**。corti-memory `memory_flush` 回显的是 `exec?.session?.id`(`corti-memory/dist/index.js:381-384`,fallback `lastSeenSessionId`/"dsh-session"),**不是写账本的 `exec.agent?.session.id`**;7104efad 属 `/home/u1/workspaces/base`(workspace.json:base 桶 updated `09-07T18:13:19Z` = 本地 09-08 02:13;base 桶 `session-7104efad…/session.jsonl.zstd` 206KB,02:13–02:18 活跃),而账本 02:13 行键 = a1b3097d | 两个 id 分属不同 workspace 的会话对象 |
|
|
183
|
+
|
|
184
|
+
### 7.2 write 语义与守卫归属(确认)
|
|
185
|
+
|
|
186
|
+
- better-dsh **未干预 write 执行**:上游 `packages/fs/tool-fs/src/write.ts` 自述 *"Model-facing full-file write … no policy means an unconditional atomic create-or-overwrite"*,确认信封 *"no file content is echoed back"*。better-dsh 仅经 `tools/post-execute` 追加锚点回放(模型面 content)。
|
|
187
|
+
- **整文件写在逻辑上不要求"之前见过"**:新文件天然无此前提;已有文件的守卫归覆盖确认层(DSH approval policy + `dsh-fs-observation-policy` 的 createIfAbsent/replaceIfVersion),与 hashline 无关。上文 §5 建议 4 中"write auto-read 锚点跨轮不可复用"的文案指引随 §7.3 裁决一并重写。
|
|
188
|
+
|
|
189
|
+
### 7.3 hook 时机与回放必要性(裁决)
|
|
190
|
+
|
|
191
|
+
- `tools/post-execute` 即 **tool-result 相位**水漏(`pre-execute → execute → post-execute`;core/tools invariant:"post-execute must follow pre-execute or execute";spill-policy 同瀑布组合;签名 `(exec, result, next) → Promise<PostToolDecision>`,write-hook `await next()` 后追加内容,**异步安全**)。挂点选对了。
|
|
192
|
+
- 脆弱点:`final-result` 路径 **bypass post-execute**(core/tools `index.ts:421`)——未来异步/后台写工具若走该路径,回放会静默丢失。
|
|
193
|
+
- **回放与 edit 解耦(裁决)**:OMP write 模型面 = 成功确认 + 新 `[path#TAG]`,**不回显内容**(渲染器 12/6 行预览仅 UI 侧)。DSH write-hook 现回放全文件锚点预览(`fmtReadPreview` 默认上限 `DEFAULT_MAX_LINES=2000` 行、单行 200KB)——对整文件写是过度供给。裁决:write 结果**仅返回动作确认(+ 可选新 tag 头)**,内容核实由 agent 主动 read;write-hook 回放砍掉或降级为确认行。
|
|
194
|
+
|
|
195
|
+
### 7.4 locator 去 session 化(裁决)
|
|
196
|
+
|
|
197
|
+
- 键 = **canonical 绝对路径(现成键,零新增)**:全部状态表本就以 `resolveTarget()` 的绝对路径为主键——`snapshots(path PRIMARY KEY)`、`undo(path PRIMARY KEY)` 现状即无 session;唯一 session 化的 `served` 去 `session_id` 列、PK 改 `(path)`,drift `reported` 列随行走。绝对路径单机全局唯一,集中单库不撞键。**不引入 CWD basename 前缀**(第三轮复核裁决):模型面 locator(行级 3-char 锚)永远伴随 edit 调用的显式 path 参数使用,不存在"裸 hash 找文件"的 surface,前缀列零收益——minimal effort 即删列。
|
|
198
|
+
- 全量哈希(xxh64 `contentChecksum`)仍是内容身份,现库 checksum 命中原样保留;跨会话共享同 path 的 served 行是期望行为(内容权威下"谁看过"无判定义务)。随键清理:`wipeServedState(sessionKey)` 删除;`SERVED_TTL_MS` 7 天 TTL 按 `updated_at` 照常 prune(`hash-store.js:488`)。迁移 = `HASH_STORE_VERSION` 6→7 重建 served 表;旧 12 个点目录弃置(TTL 反正清空,不作数据导入)。
|
|
199
|
+
- **§5 建议 3(改用 conversation/root id 作键源)作废**:host session id 引入 fork/子代理嵌套等不可控复杂度,被本节 path 键方案整体取代。建议 1(content-match 快道)与本节合流:内容即权威,served 出处账本对校验不再必需(undo/echo 归属另议)。
|
|
200
|
+
|
|
201
|
+
### 7.5 存储布局:"到处拉屎"(裁决:集中化)
|
|
202
|
+
|
|
203
|
+
- 现状:`configDir(cwd)` 把 `hash-store.sqlite` 落在每个 workspace 下,实测 **12 个 workspace 各一份**(base 1.4MB、dashr 6.1MB+4MB WAL、superd/research/dsh-omp/browser-agent/temp/agent-harness/kb-dev/sidecarx/SoftEng/orchestra …)。
|
|
204
|
+
- 裁决(第三轮精化):迁移到 **`$DSH_HOME/storages/dsh-better-edit/hash-store.sqlite`**。`storages/` 是宿主状态数据区(workspace.json / message_feedback.json / session_projcache),语义对口;实测 `~/.dsh/plugins/dsh-better-edit/` 是安装脚手架位(README/code/cordis/minimal/standard),代码里原"无 cwd 兜底"指向 `plugins/` 属语义错位,一并修正。实现 = `configDir(cwd)` 删除 cwd 分支,统一走 `resolveDshHome()`(感知 `DSH_HOME` → 4999 测试线 `.dsh-test` 自动隔离)。
|
|
205
|
+
|
|
206
|
+
### 7.6 修复批次合并
|
|
207
|
+
|
|
208
|
+
§7.2–§7.5 与原 §5 建议 1/2/4 合并为**一个 openspec change**(暂名 `hashline-content-locator`):内容寻址 locator + 集中存储 + write 回放解耦 + 多 tuple 失败文案修正。回归断言沿用 §6,另加:write→(fork 会话)→edit 应直接成功;`.dsh_better_edit/` 不再新建;上游 `~/.dsh` 下单库增长可观测。
|
|
209
|
+
|
|
210
|
+
### 7.7 渊源备注
|
|
211
|
+
|
|
212
|
+
better-dsh vendored 头注自述 *"a dsh port of pi-hashline-edit-lsz"*(pi 系 = OMP 同族,即用户所称 "BetaEdit" 分支)。两支同源已分岔:OMP = 整文件快照 + 4-hex tag + session 级内存 store;DSH 分支 = 3-char 行锚(62³ 文件内唯一分配)+ (session,path) served 账本 + per-workspace SQLite。本次裁决实质是把 DSH 分支的校验权威从"会话出处"迁回 OMP 所在的"内容快照"一边,存储形态再叠加集中化。
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
## 8. 落地回执(v0.2.3b,2026-09-08)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
§7 五项裁决已实现并实测:change `openspec/changes/2026-09-08-v0-2-3b-hashline-content-locator/`;
|
|
221
|
+
单测 `test/hashline-store.spec.ts` 12/12;4999 第一人称实测见
|
|
222
|
+
`v0.2.3b-hashline-content-locator实测报告.md`。要点:中心库落位
|
|
223
|
+
`.dsh-test/storages/dsh-better-edit/`(served 表无 session_id 列)、write 无回放、
|
|
224
|
+
内容快道在账本未见时直接放行;实测发现宿主 `dsh-fs-observation-policy` 的
|
|
225
|
+
`E_NOT_OBSERVED`(read-before-edit)为跨会话 edit 的另一道设计内守卫,予以保留。
|
|
226
|
+
发布闸:a 实测 ✅ / b 报告 ✅ / c user 确认 ⏳。
|