deadbyte-mcp 0.8.9 → 0.9.0
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/CONTEXT.md +41 -0
- package/MANIFEST.SHA256 +348 -83
- package/R34-BASELINE.json +9 -0
- package/README.txt +135 -9
- package/bench/fixtures/corpus.json +17 -0
- package/bin/WORKER-REGISTRY.txt +3 -3
- package/bin/appcontainer-stage.exe +0 -0
- package/bin/appcontainer-stage.obj +0 -0
- package/bin/bootstrap-advapi32.exe +0 -0
- package/bin/bootstrap-advapi32.obj +0 -0
- package/bin/bootstrap-exitcode.exe +0 -0
- package/bin/bootstrap-exitcode.obj +0 -0
- package/bin/bootstrap-kernel32.exe +0 -0
- package/bin/bootstrap-kernel32.obj +0 -0
- package/bin/child-control-probe.exe +0 -0
- package/bin/child-control-probe.obj +0 -0
- package/bin/child-control-stage.exe +0 -0
- package/bin/child-control-stage.obj +0 -0
- package/bin/contained-reverse-worker.exe +0 -0
- package/bin/contained-reverse-worker.obj +0 -0
- package/bin/contained-transform-worker.exe +0 -0
- package/bin/contained-transform-worker.obj +0 -0
- package/bin/containment-probe.exe +0 -0
- package/bin/containment-probe.obj +0 -0
- package/bin/deadbyte-contain.exe +0 -0
- package/bin/deadbyte-contain.obj +0 -0
- package/bin/deadbyte-exec.exe +0 -0
- package/bin/deadbyte-exec.obj +0 -0
- package/bin/deadbyte-process-host.exe +0 -0
- package/bin/deadbyte-process-host.obj +0 -0
- package/bin/deadbyte-tunnel-host.exe +0 -0
- package/bin/deadbyte-tunnel-host.obj +0 -0
- package/controller/README.TXT +10 -4
- package/controller/deadbyte-controller.config.psd1.example +14 -0
- package/controller/deadbyte-controller.ps1 +144 -19
- package/controller/deadbyte-process-policy.json +5 -5
- package/controller/deadbyte-semantic-lsp-config.json +95 -0
- package/deadbyte-mcp-0.8.9.tgz +0 -0
- package/docs/ADR-0001-PRODUCTION-BASELINE-SEAMS.md +29 -0
- package/docs/ARCHITECTURE.md +6 -5
- package/docs/superpowers/plans/2026-09-16-deadbyte-loop-engine.md +846 -0
- package/docs/superpowers/plans/2026-09-17-r35-production-successor.md +408 -0
- package/docs/superpowers/specs/2026-09-16-deadbyte-loop-engine-design.md +435 -0
- package/docs/superpowers/specs/2026-09-17-r35-production-successor-design.md +220 -0
- package/node_modules/typescript/LICENSE.txt +55 -0
- package/node_modules/typescript/README.md +50 -0
- package/node_modules/typescript/SECURITY.md +41 -0
- package/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
- package/node_modules/typescript/bin/tsc +2 -0
- package/node_modules/typescript/bin/tsserver +2 -0
- package/node_modules/typescript/lib/_tsc.js +133818 -0
- package/node_modules/typescript/lib/_tsserver.js +659 -0
- package/node_modules/typescript/lib/_typingsInstaller.js +222 -0
- package/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/de/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/es/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/it/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/lib.d.ts +22 -0
- package/node_modules/typescript/lib/lib.decorators.d.ts +384 -0
- package/node_modules/typescript/lib/lib.decorators.legacy.d.ts +22 -0
- package/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +41 -0
- package/node_modules/typescript/lib/lib.dom.d.ts +39429 -0
- package/node_modules/typescript/lib/lib.dom.iterable.d.ts +571 -0
- package/node_modules/typescript/lib/lib.es2015.collection.d.ts +147 -0
- package/node_modules/typescript/lib/lib.es2015.core.d.ts +597 -0
- package/node_modules/typescript/lib/lib.es2015.d.ts +28 -0
- package/node_modules/typescript/lib/lib.es2015.generator.d.ts +77 -0
- package/node_modules/typescript/lib/lib.es2015.iterable.d.ts +605 -0
- package/node_modules/typescript/lib/lib.es2015.promise.d.ts +81 -0
- package/node_modules/typescript/lib/lib.es2015.proxy.d.ts +128 -0
- package/node_modules/typescript/lib/lib.es2015.reflect.d.ts +144 -0
- package/node_modules/typescript/lib/lib.es2015.symbol.d.ts +46 -0
- package/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +326 -0
- package/node_modules/typescript/lib/lib.es2016.array.include.d.ts +116 -0
- package/node_modules/typescript/lib/lib.es2016.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2016.full.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2016.intl.d.ts +31 -0
- package/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2017.d.ts +26 -0
- package/node_modules/typescript/lib/lib.es2017.date.d.ts +31 -0
- package/node_modules/typescript/lib/lib.es2017.full.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2017.intl.d.ts +44 -0
- package/node_modules/typescript/lib/lib.es2017.object.d.ts +49 -0
- package/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +135 -0
- package/node_modules/typescript/lib/lib.es2017.string.d.ts +45 -0
- package/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +53 -0
- package/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +77 -0
- package/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +53 -0
- package/node_modules/typescript/lib/lib.es2018.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2018.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2018.intl.d.ts +83 -0
- package/node_modules/typescript/lib/lib.es2018.promise.d.ts +30 -0
- package/node_modules/typescript/lib/lib.es2018.regexp.d.ts +37 -0
- package/node_modules/typescript/lib/lib.es2019.array.d.ts +79 -0
- package/node_modules/typescript/lib/lib.es2019.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2019.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2019.intl.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2019.object.d.ts +33 -0
- package/node_modules/typescript/lib/lib.es2019.string.d.ts +37 -0
- package/node_modules/typescript/lib/lib.es2019.symbol.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2020.bigint.d.ts +765 -0
- package/node_modules/typescript/lib/lib.es2020.d.ts +27 -0
- package/node_modules/typescript/lib/lib.es2020.date.d.ts +42 -0
- package/node_modules/typescript/lib/lib.es2020.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2020.intl.d.ts +474 -0
- package/node_modules/typescript/lib/lib.es2020.number.d.ts +28 -0
- package/node_modules/typescript/lib/lib.es2020.promise.d.ts +47 -0
- package/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +99 -0
- package/node_modules/typescript/lib/lib.es2020.string.d.ts +44 -0
- package/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +41 -0
- package/node_modules/typescript/lib/lib.es2021.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2021.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2021.intl.d.ts +166 -0
- package/node_modules/typescript/lib/lib.es2021.promise.d.ts +48 -0
- package/node_modules/typescript/lib/lib.es2021.string.d.ts +33 -0
- package/node_modules/typescript/lib/lib.es2021.weakref.d.ts +78 -0
- package/node_modules/typescript/lib/lib.es2022.array.d.ts +121 -0
- package/node_modules/typescript/lib/lib.es2022.d.ts +25 -0
- package/node_modules/typescript/lib/lib.es2022.error.d.ts +75 -0
- package/node_modules/typescript/lib/lib.es2022.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2022.intl.d.ts +145 -0
- package/node_modules/typescript/lib/lib.es2022.object.d.ts +26 -0
- package/node_modules/typescript/lib/lib.es2022.regexp.d.ts +39 -0
- package/node_modules/typescript/lib/lib.es2022.string.d.ts +25 -0
- package/node_modules/typescript/lib/lib.es2023.array.d.ts +924 -0
- package/node_modules/typescript/lib/lib.es2023.collection.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2023.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2023.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2023.intl.d.ts +56 -0
- package/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +65 -0
- package/node_modules/typescript/lib/lib.es2024.collection.d.ts +29 -0
- package/node_modules/typescript/lib/lib.es2024.d.ts +26 -0
- package/node_modules/typescript/lib/lib.es2024.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2024.object.d.ts +29 -0
- package/node_modules/typescript/lib/lib.es2024.promise.d.ts +35 -0
- package/node_modules/typescript/lib/lib.es2024.regexp.d.ts +25 -0
- package/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +68 -0
- package/node_modules/typescript/lib/lib.es2024.string.d.ts +29 -0
- package/node_modules/typescript/lib/lib.es5.d.ts +4601 -0
- package/node_modules/typescript/lib/lib.es6.d.ts +23 -0
- package/node_modules/typescript/lib/lib.esnext.array.d.ts +35 -0
- package/node_modules/typescript/lib/lib.esnext.collection.d.ts +96 -0
- package/node_modules/typescript/lib/lib.esnext.d.ts +29 -0
- package/node_modules/typescript/lib/lib.esnext.decorators.d.ts +28 -0
- package/node_modules/typescript/lib/lib.esnext.disposable.d.ts +193 -0
- package/node_modules/typescript/lib/lib.esnext.error.d.ts +24 -0
- package/node_modules/typescript/lib/lib.esnext.float16.d.ts +445 -0
- package/node_modules/typescript/lib/lib.esnext.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.esnext.intl.d.ts +21 -0
- package/node_modules/typescript/lib/lib.esnext.iterator.d.ts +148 -0
- package/node_modules/typescript/lib/lib.esnext.promise.d.ts +34 -0
- package/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +25 -0
- package/node_modules/typescript/lib/lib.scripthost.d.ts +322 -0
- package/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +41 -0
- package/node_modules/typescript/lib/lib.webworker.d.ts +13150 -0
- package/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +23 -0
- package/node_modules/typescript/lib/lib.webworker.iterable.d.ts +340 -0
- package/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/tsc.js +8 -0
- package/node_modules/typescript/lib/tsserver.js +8 -0
- package/node_modules/typescript/lib/tsserverlibrary.d.ts +17 -0
- package/node_modules/typescript/lib/tsserverlibrary.js +21 -0
- package/node_modules/typescript/lib/typesMap.json +497 -0
- package/node_modules/typescript/lib/typescript.d.ts +11437 -0
- package/node_modules/typescript/lib/typescript.js +200276 -0
- package/node_modules/typescript/lib/typingsInstaller.js +8 -0
- package/node_modules/typescript/lib/watchGuard.js +53 -0
- package/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +2122 -0
- package/node_modules/typescript/package.json +120 -0
- package/package.json +5 -3
- package/proof/CONTAINMENT-BUILD.txt +6 -6
- package/proof/R34-TASK8-SUPERVISOR-CHECKPOINT.json +29 -0
- package/proof/R34-TASK9-MCP-SURFACE-CHECKPOINT.json +28 -0
- package/scripts/capability-benchmark.mjs +27 -0
- package/scripts/deferred-slot-operation.mjs +4 -2
- package/scripts/final-closure-verify.mjs +10 -10
- package/scripts/final-closure.mjs +11 -11
- package/scripts/gate-windows.ps1 +3 -3
- package/scripts/release-parity.mjs +14 -14
- package/scripts/semantic-preflight.ps1 +73 -0
- package/scripts/tool-surface-snapshot.mjs +73 -0
- package/scripts/windows-gate-evidence.mjs +5 -5
- package/src/audit-verify.mjs +6 -2
- package/src/autonomous-action-reconcile.mjs +142 -0
- package/src/autonomous-context-engine.mjs +255 -0
- package/src/autonomous-live-state.mjs +17 -0
- package/src/autonomous-local-supervisor.mjs +249 -0
- package/src/autonomous-loop-state.mjs +304 -0
- package/src/autonomous-output-contracts.mjs +22 -3
- package/src/autonomous-plan.mjs +181 -0
- package/src/autonomous-planner-contracts.mjs +44 -0
- package/src/autonomous-planner.mjs +91 -6
- package/src/autonomous-policy.mjs +15 -2
- package/src/autonomous-progress.mjs +127 -0
- package/src/autonomous-runtime.mjs +601 -48
- package/src/autonomous-supervisor-host.mjs +70 -0
- package/src/autonomous-supervisor.mjs +31 -8
- package/src/capability-benchmark-runner.mjs +108 -0
- package/src/capability-benchmark.mjs +50 -0
- package/src/coding-mcp-tools.mjs +46 -3
- package/src/coding-output-contracts.mjs +45 -0
- package/src/context-provenance.mjs +86 -0
- package/src/deadbyte-cli.mjs +136 -30
- package/src/document-adapter.mjs +43 -0
- package/src/lsp-stdio-client.mjs +112 -0
- package/src/machine-fs-smoke-client.mjs +2 -1
- package/src/mcp-server.mjs +17 -3
- package/src/observation-smoke-client.mjs +3 -2
- package/src/operator-surface.mjs +37 -0
- package/src/provider-circuit.mjs +125 -0
- package/src/release-generation.mjs +44 -5
- package/src/remote-mcp-autonomous-smoke-client.mjs +53 -14
- package/src/remote-mcp-coding-smoke-client.mjs +5 -4
- package/src/remote-mcp-r24-disarmed-smoke-client.mjs +4 -2
- package/src/remote-mcp-r33-parity-client.mjs +1 -1
- package/src/remote-mcp-r34-parity-client.mjs +177 -0
- package/src/remote-mcp-smoke-client.mjs +2 -1
- package/src/remote-result-journal.mjs +114 -0
- package/src/runtime-update.mjs +58 -8
- package/src/semantic-backend-registry.mjs +39 -0
- package/src/semantic-code.mjs +179 -0
- package/src/semantic-lsp-backend.mjs +183 -0
- package/src/semantic-lsp-config.mjs +112 -0
- package/src/tool-surface-ledger.mjs +92 -0
- package/src/version.mjs +1 -1
- package/test/audit-verify.test.mjs +1 -1
- package/test/autonomous-action-reconcile.test.mjs +106 -0
- package/test/autonomous-adversarial.test.mjs +149 -6
- package/test/autonomous-context-engine.test.mjs +181 -0
- package/test/autonomous-live-state.test.mjs +27 -0
- package/test/autonomous-local-supervisor.test.mjs +403 -0
- package/test/autonomous-loop-state.test.mjs +126 -0
- package/test/autonomous-loop-v2.test.mjs +105 -0
- package/test/autonomous-loop.test.mjs +79 -1
- package/test/autonomous-output-contract.test.mjs +54 -0
- package/test/autonomous-plan.test.mjs +101 -0
- package/test/autonomous-progress.test.mjs +106 -0
- package/test/autonomous-r34-e2e.test.mjs +338 -0
- package/test/autonomous-runtime.test.mjs +3 -3
- package/test/autonomous-supervisor-integration.test.mjs +48 -3
- package/test/capability-benchmark-runner.test.mjs +49 -0
- package/test/capability-benchmark.test.mjs +47 -0
- package/test/cli-entrypoint.test.mjs +12 -0
- package/test/coding-catalog-consistency.test.mjs +24 -0
- package/test/coding-plane.test.mjs +3 -3
- package/test/context-provenance.test.mjs +61 -0
- package/test/controller-r27.test.mjs +4 -3
- package/test/controller.test.mjs +52 -0
- package/test/core.test.mjs +1 -1
- package/test/deferred-slot-operation-behavior.test.mjs +5 -1
- package/test/deferred-slot-operation.test.mjs +2 -1
- package/test/document-adapter.test.mjs +23 -0
- package/test/fixtures/lsp-framed-server.mjs +33 -0
- package/test/fixtures/semantic/cpp/compile_commands.json +4 -0
- package/test/fixtures/semantic/cpp/lib.cpp +2 -0
- package/test/fixtures/semantic/cpp/lib.hpp +2 -0
- package/test/fixtures/semantic/cpp/main.cpp +2 -0
- package/test/fixtures/semantic/python/lib.py +2 -0
- package/test/fixtures/semantic/python/main.py +2 -0
- package/test/fixtures/semantic/rust/Cargo.lock +7 -0
- package/test/fixtures/semantic/rust/Cargo.toml +8 -0
- package/test/fixtures/semantic/rust/src/lib.rs +3 -0
- package/test/fixtures/semantic/rust/src/main.rs +5 -0
- package/test/fixtures/semantic/rust/src/math.rs +3 -0
- package/test/fixtures/semantic/rust/target/.rustc_info.json +1 -0
- package/test/fixtures/semantic/rust/target/CACHEDIR.TAG +3 -0
- package/test/fixtures/semantic/rust/target/debug/.cargo-lock +0 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-4c168fa33c79d09c/dep-test-lib-semantic_rust +0 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-4c168fa33c79d09c/invoked.timestamp +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-4c168fa33c79d09c/test-lib-semantic_rust +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-4c168fa33c79d09c/test-lib-semantic_rust.json +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-5dcd474439c54a26/dep-test-bin-semantic_rust_bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-5dcd474439c54a26/invoked.timestamp +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-5dcd474439c54a26/test-bin-semantic_rust_bin +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-5dcd474439c54a26/test-bin-semantic_rust_bin.json +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-6212ccd976aa3808/dep-lib-semantic_rust +0 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-6212ccd976aa3808/invoked.timestamp +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-6212ccd976aa3808/lib-semantic_rust +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-6212ccd976aa3808/lib-semantic_rust.json +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-d741378dccdef61c/bin-semantic_rust_bin +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-d741378dccdef61c/bin-semantic_rust_bin.json +1 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-d741378dccdef61c/dep-bin-semantic_rust_bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-d741378dccdef61c/invoked.timestamp +1 -0
- package/test/fixtures/semantic/rust/target/debug/deps/libsemantic_rust-4c168fa33c79d09c.rmeta +0 -0
- package/test/fixtures/semantic/rust/target/debug/deps/libsemantic_rust-6212ccd976aa3808.rmeta +0 -0
- package/test/fixtures/semantic/rust/target/debug/deps/libsemantic_rust_bin-5dcd474439c54a26.rmeta +0 -0
- package/test/fixtures/semantic/rust/target/debug/deps/libsemantic_rust_bin-d741378dccdef61c.rmeta +0 -0
- package/test/fixtures/semantic/rust/target/debug/deps/semantic_rust-4c168fa33c79d09c.d +5 -0
- package/test/fixtures/semantic/rust/target/debug/deps/semantic_rust-6212ccd976aa3808.d +5 -0
- package/test/fixtures/semantic/rust/target/debug/deps/semantic_rust_bin-5dcd474439c54a26.d +6 -0
- package/test/fixtures/semantic/rust/target/debug/deps/semantic_rust_bin-d741378dccdef61c.d +6 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-1nzlugxi6lq16/s-hmdgo8b6hg-1n6glhc-1qb77z00k06rqw4jdkj92spax/dep-graph.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-1nzlugxi6lq16/s-hmdgo8b6hg-1n6glhc-1qb77z00k06rqw4jdkj92spax/query-cache.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-1nzlugxi6lq16/s-hmdgo8b6hg-1n6glhc-1qb77z00k06rqw4jdkj92spax/work-products.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-1nzlugxi6lq16/s-hmdgo8b6hg-1n6glhc.lock +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq-9twkpivsqnjon278x20bddozq/dep-graph.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq-9twkpivsqnjon278x20bddozq/metadata.rmeta +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq-9twkpivsqnjon278x20bddozq/query-cache.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq-9twkpivsqnjon278x20bddozq/work-products.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq.lock +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-1jxcbdeehal7q/s-hmdgo8bxlf-1qr24o3-cmu3jai030no72y8u9eurrnjj/dep-graph.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-1jxcbdeehal7q/s-hmdgo8bxlf-1qr24o3-cmu3jai030no72y8u9eurrnjj/query-cache.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-1jxcbdeehal7q/s-hmdgo8bxlf-1qr24o3-cmu3jai030no72y8u9eurrnjj/work-products.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-1jxcbdeehal7q/s-hmdgo8bxlf-1qr24o3.lock +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-2ocx55p60ni6b/s-hmdgo8bxj8-0ir41qt-diy9mqvc2eoiblmhjs3stcgi3/dep-graph.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-2ocx55p60ni6b/s-hmdgo8bxj8-0ir41qt-diy9mqvc2eoiblmhjs3stcgi3/query-cache.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-2ocx55p60ni6b/s-hmdgo8bxj8-0ir41qt-diy9mqvc2eoiblmhjs3stcgi3/work-products.bin +0 -0
- package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-2ocx55p60ni6b/s-hmdgo8bxj8-0ir41qt.lock +0 -0
- package/test/fixtures/semantic/rust/target/flycheck0/stderr +1 -0
- package/test/fixtures/semantic/rust/target/flycheck0/stdout +5 -0
- package/test/fixtures/semantic/typescript/lib.ts +3 -0
- package/test/fixtures/semantic/typescript/main.ts +2 -0
- package/test/fixtures/tool-surface-stdio-server.mjs +14 -0
- package/test/helpers/autonomous-r34-fixture.mjs +120 -0
- package/test/lsp-stdio-client.test.mjs +72 -0
- package/test/multi-file-read.test.mjs +41 -0
- package/test/observation-integration.test.mjs +3 -3
- package/test/production-docs.test.mjs +48 -0
- package/test/prompts-resources.test.mjs +35 -0
- package/test/provider-circuit.test.mjs +93 -0
- package/test/public-autonomous-ingress-budget.test.mjs +28 -0
- package/test/r33-closeout-regression.test.mjs +3 -3
- package/test/r33-finalization.test.mjs +19 -16
- package/test/release-generation.test.mjs +23 -2
- package/test/release-version.test.mjs +24 -17
- package/test/remote-r24-catalog.test.mjs +5 -4
- package/test/remote-result-journal.test.mjs +58 -0
- package/test/remote-session-cli.test.mjs +150 -15
- package/test/runtime-self-update.test.mjs +63 -0
- package/test/semantic-backend-registry.test.mjs +29 -0
- package/test/semantic-code.test.mjs +66 -0
- package/test/semantic-lsp-backend.test.mjs +99 -0
- package/test/semantic-lsp-config.test.mjs +81 -0
- package/test/semantic-lsp-readiness.test.mjs +34 -0
- package/test/semantic-lsp-transient-empty.test.mjs +32 -0
- package/test/semantic-lsp-transient-null.test.mjs +31 -0
- package/test/semantic-multilang.test.mjs +72 -0
- package/test/semantic-runtime-routing.test.mjs +32 -0
- package/test/semantic-server-config-integration.test.mjs +66 -0
- package/test/tool-surface-ledger.test.mjs +59 -0
- package/test/tool-surface-snapshot.test.mjs +17 -0
- package/test/tracer-bullet.test.mjs +77 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { lstat, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
|
|
4
|
+
export const REMOTE_RESULT_JOURNAL_SCHEMA='deadbyte.remote-result-journal.v1';
|
|
5
|
+
const SESSION=/^[0-9a-f]{24}$/;
|
|
6
|
+
const HASH=/^[0-9a-f]{64}$/;
|
|
7
|
+
const STATUS=new Set(['ok','error']);
|
|
8
|
+
|
|
9
|
+
function text(value,label,max){
|
|
10
|
+
if(typeof value!=='string'||value.length<1||value.length>max||value.includes('\0')) throw new Error(`${label} invalid`);
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function iso(value,label){
|
|
14
|
+
const parsed=Date.parse(value);
|
|
15
|
+
if(typeof value!=='string'||!Number.isFinite(parsed)) throw new Error(`${label} invalid`);
|
|
16
|
+
return new Date(parsed).toISOString();
|
|
17
|
+
}
|
|
18
|
+
function validateSession(value){
|
|
19
|
+
if(typeof value!=='string'||!SESSION.test(value)) throw new Error('remote result session_id invalid');
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
function validateEvent(raw,index=null){
|
|
23
|
+
if(!raw||typeof raw!=='object'||Array.isArray(raw)) throw new Error('remote result event invalid');
|
|
24
|
+
const seq=raw.seq;
|
|
25
|
+
if(!Number.isSafeInteger(seq)||seq<1) throw new Error('remote result seq invalid');
|
|
26
|
+
const sessionId=validateSession(raw.session_id);
|
|
27
|
+
const requestId=text(raw.request_id,'remote result request_id',256);
|
|
28
|
+
const tool=text(raw.tool,'remote result tool',128);
|
|
29
|
+
if(!STATUS.has(raw.status)) throw new Error('remote result status invalid');
|
|
30
|
+
const observed=iso(raw.observed_at_utc,'remote result observed_at_utc');
|
|
31
|
+
if(typeof raw.payload_sha256!=='string'||!HASH.test(raw.payload_sha256)) throw new Error('remote result payload_sha256 invalid');
|
|
32
|
+
if(index!==null&&seq!==index) throw new Error('remote result sequence mismatch');
|
|
33
|
+
return Object.freeze({session_id:sessionId,seq,request_id:requestId,tool,status:raw.status,
|
|
34
|
+
observed_at_utc:observed,payload_sha256:raw.payload_sha256});
|
|
35
|
+
}
|
|
36
|
+
function identity(item){return `${item.request_id}\0${item.status}\0${item.payload_sha256}`;}
|
|
37
|
+
export function parseRemoteResultCursor(cursor){
|
|
38
|
+
if(typeof cursor!=='string') throw new Error('remote result cursor invalid');
|
|
39
|
+
const match=/^r1:([0-9a-f]{24}):(0|[1-9][0-9]{0,15})$/.exec(cursor);
|
|
40
|
+
if(!match) throw new Error('remote result cursor invalid');
|
|
41
|
+
const seq=Number(match[2]);
|
|
42
|
+
if(!Number.isSafeInteger(seq)||seq<0) throw new Error('remote result cursor invalid');
|
|
43
|
+
return {session_id:match[1],seq};
|
|
44
|
+
}
|
|
45
|
+
function cursorFor(sessionId,seq){return `r1:${sessionId}:${seq}`;}
|
|
46
|
+
async function requireRegularIfExists(file){
|
|
47
|
+
try{
|
|
48
|
+
const info=await lstat(file);
|
|
49
|
+
if(!info.isFile()||info.isSymbolicLink()) throw new Error('remote result journal must be regular non-symlink file');
|
|
50
|
+
return true;
|
|
51
|
+
}catch(error){if(error?.code==='ENOENT') return false;throw error;}
|
|
52
|
+
}
|
|
53
|
+
function validateStored(value,sessionId){
|
|
54
|
+
if(!value||typeof value!=='object'||Array.isArray(value)||value.schema!==REMOTE_RESULT_JOURNAL_SCHEMA) throw new Error('remote result journal schema invalid');
|
|
55
|
+
if(value.session_id!==sessionId) throw new Error('remote result journal session mismatch');
|
|
56
|
+
if(!Array.isArray(value.events)) throw new Error('remote result journal events invalid');
|
|
57
|
+
let prior=0;
|
|
58
|
+
const events=value.events.map(raw=>{
|
|
59
|
+
const event=validateEvent(raw);
|
|
60
|
+
if(event.session_id!==sessionId||event.seq<=prior) throw new Error('remote result journal sequence invalid');
|
|
61
|
+
prior=event.seq;return event;
|
|
62
|
+
});
|
|
63
|
+
if(!Number.isSafeInteger(value.next_seq)||value.next_seq<1||value.next_seq!==(events.at(-1)?.seq??0)+1) throw new Error('remote result journal next_seq invalid');
|
|
64
|
+
return {schema:REMOTE_RESULT_JOURNAL_SCHEMA,session_id:sessionId,next_seq:value.next_seq,events};
|
|
65
|
+
}
|
|
66
|
+
async function atomicWrite(file,value){
|
|
67
|
+
await mkdir(path.dirname(file),{recursive:true});
|
|
68
|
+
const temp=`${file}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;
|
|
69
|
+
await writeFile(temp,`${JSON.stringify(value)}\n`,{encoding:'utf8',flag:'wx'});
|
|
70
|
+
await rename(temp,file);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export async function openRemoteResultJournal({filePath,sessionId,maxEntries=2048}={}){
|
|
74
|
+
const file=path.resolve(text(filePath,'remote result journal path',1024));
|
|
75
|
+
const sid=validateSession(sessionId);
|
|
76
|
+
if(!Number.isInteger(maxEntries)||maxEntries<1||maxEntries>100000) throw new Error('remote result maxEntries invalid');
|
|
77
|
+
let state;
|
|
78
|
+
if(await requireRegularIfExists(file)){
|
|
79
|
+
let raw;try{raw=JSON.parse(await readFile(file,'utf8'));}catch{throw new Error('remote result journal JSON invalid');}
|
|
80
|
+
state=validateStored(raw,sid);
|
|
81
|
+
}else{
|
|
82
|
+
state={schema:REMOTE_RESULT_JOURNAL_SCHEMA,session_id:sid,next_seq:1,events:[]};
|
|
83
|
+
await atomicWrite(file,state);
|
|
84
|
+
}
|
|
85
|
+
async function persist(){
|
|
86
|
+
state.events=state.events.slice(-maxEntries);
|
|
87
|
+
await atomicWrite(file,state);
|
|
88
|
+
}
|
|
89
|
+
return Object.freeze({
|
|
90
|
+
file_path:file,session_id:sid,
|
|
91
|
+
cursor(){return cursorFor(sid,state.next_seq-1);},
|
|
92
|
+
async recordTerminal(input){
|
|
93
|
+
const candidate=validateEvent({session_id:sid,seq:state.next_seq,...input});
|
|
94
|
+
const key=identity(candidate);
|
|
95
|
+
const existing=state.events.find(event=>identity(event)===key);
|
|
96
|
+
if(existing) return {duplicate:true,event:existing,cursor:cursorFor(sid,state.next_seq-1)};
|
|
97
|
+
const event=candidate;
|
|
98
|
+
state.events.push(event);state.next_seq+=1;await persist();
|
|
99
|
+
return {duplicate:false,event,cursor:cursorFor(sid,event.seq)};
|
|
100
|
+
},
|
|
101
|
+
async replayAfter(cursor,{limit=100}={}){
|
|
102
|
+
if(!Number.isInteger(limit)||limit<1||limit>500) throw new Error('remote result replay limit invalid');
|
|
103
|
+
const parsed=parseRemoteResultCursor(cursor);
|
|
104
|
+
if(parsed.session_id!==sid) throw new Error('remote result cursor session mismatch');
|
|
105
|
+
const first=state.events[0]?.seq??state.next_seq;
|
|
106
|
+
const last=state.next_seq-1;
|
|
107
|
+
if(parsed.seq<first-1) throw new Error('cursor_outside_retention');
|
|
108
|
+
if(parsed.seq>last) throw new Error('remote result cursor ahead of journal');
|
|
109
|
+
const events=state.events.filter(event=>event.seq>parsed.seq).slice(0,limit);
|
|
110
|
+
const nextSeq=events.at(-1)?.seq??parsed.seq;
|
|
111
|
+
return {events:events.map(event=>({...event})),next_cursor:cursorFor(sid,nextSeq),has_more:state.events.some(event=>event.seq>nextSeq)};
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
package/src/runtime-update.mjs
CHANGED
|
@@ -45,29 +45,33 @@ function normalizePersistentPublicOrigin(value){
|
|
|
45
45
|
return publicOrigin.origin;
|
|
46
46
|
}
|
|
47
47
|
export function parseUpdateArgs(argv){
|
|
48
|
-
const out={stage:null,developmentRoot:null,expectedVersion:null,expectedManifest:null,sourceRoot:null,restoreStandingGrants:false,recoverOfflinePredecessor:false,enableMachineFs:false,enableObservation:false,cloudTransport:null,bridgeBootstrap:null,processPolicyBootstrap:null,hostCommandPins:[]};
|
|
49
|
-
const cloud={},bridge={},processPolicy={},seen=new Set(),hostPinIds=new Set();
|
|
48
|
+
const out={stage:null,developmentRoot:null,expectedVersion:null,expectedManifest:null,sourceRoot:null,restoreStandingGrants:false,recoverOfflinePredecessor:false,enableMachineFs:false,enableObservation:false,enableAutonomousSupervisor:false,cloudTransport:null,bridgeBootstrap:null,processPolicyBootstrap:null,semanticLspBootstrap:null,hostCommandPins:[]};
|
|
49
|
+
const cloud={},bridge={},processPolicy={},semanticLsp={},seen=new Set(),hostPinIds=new Set();
|
|
50
50
|
const bridgeFlags=new Map([
|
|
51
51
|
['--bridge-root','root'],['--bridge-script-sha256','scriptSha256']
|
|
52
52
|
]);
|
|
53
53
|
const processPolicyFlags=new Map([
|
|
54
54
|
['--process-policy','path'],['--process-policy-sha256','sha256']
|
|
55
55
|
]);
|
|
56
|
+
const semanticLspFlags=new Map([
|
|
57
|
+
['--semantic-lsp-config','path'],['--semantic-lsp-config-sha256','sha256']
|
|
58
|
+
]);
|
|
56
59
|
const cloudFlags=new Map([
|
|
57
60
|
['--cloud-cloudflared','cloudflaredPath'],['--cloud-cloudflared-sha256','cloudflaredSha256'],
|
|
58
61
|
['--cloud-token-file','tokenFilePath'],['--cloud-token-sha256','tokenFileSha256'],
|
|
59
62
|
['--cloud-child-working-directory','childWorkingDirectory'],['--cloud-public-origin','publicOrigin']
|
|
60
63
|
]);
|
|
61
|
-
const valued=new Set(['--stage','--development-root','--expected-version','--expected-manifest','--source-root','--host-command-pin',...bridgeFlags.keys(),...processPolicyFlags.keys(),...cloudFlags.keys()]);
|
|
64
|
+
const valued=new Set(['--stage','--development-root','--expected-version','--expected-manifest','--source-root','--host-command-pin',...bridgeFlags.keys(),...processPolicyFlags.keys(),...semanticLspFlags.keys(),...cloudFlags.keys()]);
|
|
62
65
|
for(let index=0;index<argv.length;index++){
|
|
63
66
|
const arg=argv[index];
|
|
64
|
-
if(arg==='--restore-standing-grants'||arg==='--recover-offline-predecessor'||arg==='--enable-machine-fs'||arg==='--enable-observation'){
|
|
67
|
+
if(arg==='--restore-standing-grants'||arg==='--recover-offline-predecessor'||arg==='--enable-machine-fs'||arg==='--enable-observation'||arg==='--enable-autonomous-supervisor'){
|
|
65
68
|
if(seen.has(arg)) throw new Error(`duplicate self-update argument '${arg}'`);
|
|
66
69
|
seen.add(arg);
|
|
67
70
|
if(arg==='--restore-standing-grants') out.restoreStandingGrants=true;
|
|
68
71
|
else if(arg==='--recover-offline-predecessor') out.recoverOfflinePredecessor=true;
|
|
69
72
|
else if(arg==='--enable-machine-fs') out.enableMachineFs=true;
|
|
70
|
-
else out.enableObservation=true;
|
|
73
|
+
else if(arg==='--enable-observation') out.enableObservation=true;
|
|
74
|
+
else out.enableAutonomousSupervisor=true;
|
|
71
75
|
continue;
|
|
72
76
|
}
|
|
73
77
|
if(arg==='--host-command-pin'){
|
|
@@ -91,6 +95,7 @@ export function parseUpdateArgs(argv){
|
|
|
91
95
|
else if(arg==='--source-root') out.sourceRoot=path.resolve(value);
|
|
92
96
|
else if(bridgeFlags.has(arg)) bridge[bridgeFlags.get(arg)]=value;
|
|
93
97
|
else if(processPolicyFlags.has(arg)) processPolicy[processPolicyFlags.get(arg)]=value;
|
|
98
|
+
else if(semanticLspFlags.has(arg)) semanticLsp[semanticLspFlags.get(arg)]=value;
|
|
94
99
|
else cloud[cloudFlags.get(arg)]=value;
|
|
95
100
|
}
|
|
96
101
|
if(!out.stage) throw new Error('--stage is required');
|
|
@@ -111,6 +116,13 @@ export function parseUpdateArgs(argv){
|
|
|
111
116
|
if(!HEX64.test(sha256)) throw new Error('process policy SHA-256 must be lowercase hex');
|
|
112
117
|
out.processPolicyBootstrap={path:path.resolve(processPolicy.path),sha256};
|
|
113
118
|
}
|
|
119
|
+
const semanticLspFields=[...semanticLspFlags.values()],semanticLspPresent=semanticLspFields.filter(key=>semanticLsp[key]!==undefined);
|
|
120
|
+
if(semanticLspPresent.length!==0&&semanticLspPresent.length!==semanticLspFields.length) throw new Error('semantic LSP config bootstrap requires path plus SHA-256 as one pair');
|
|
121
|
+
if(semanticLspPresent.length===semanticLspFields.length){
|
|
122
|
+
const sha256=String(semanticLsp.sha256).toLowerCase();
|
|
123
|
+
if(!HEX64.test(sha256)) throw new Error('semantic LSP config SHA-256 must be lowercase hex');
|
|
124
|
+
out.semanticLspBootstrap={path:path.resolve(semanticLsp.path),sha256};
|
|
125
|
+
}
|
|
114
126
|
const cloudFields=[...cloudFlags.values()],present=cloudFields.filter(key=>cloud[key]!==undefined);
|
|
115
127
|
if(present.length!==0&&present.length!==cloudFields.length) throw new Error('named tunnel bootstrap requires cloud path/hash/token/workdir plus persistent public origin');
|
|
116
128
|
if(present.length===cloudFields.length){
|
|
@@ -262,6 +274,30 @@ export async function prepareBridgeSpec(config,bootstrap){
|
|
|
262
274
|
return next;
|
|
263
275
|
}
|
|
264
276
|
|
|
277
|
+
export async function prepareAutonomousSupervisorSpec(config,{releaseRoot,enable=false}={}){
|
|
278
|
+
const next=structuredClone(config);
|
|
279
|
+
if(!enable) return next;
|
|
280
|
+
if(next.AutonomousRuntimeEnabled!==true) throw new Error('autonomous supervisor bootstrap requires AutonomousRuntimeEnabled');
|
|
281
|
+
if(typeof releaseRoot!=='string'||!path.isAbsolute(releaseRoot)) throw new Error('autonomous supervisor release root must be absolute');
|
|
282
|
+
const release=path.resolve(releaseRoot),script=path.join(release,'src','autonomous-supervisor-host.mjs');
|
|
283
|
+
const scriptStat=await lstat(script);
|
|
284
|
+
if(!scriptStat.isFile()||scriptStat.isSymbolicLink()) throw new Error('autonomous supervisor script must be a regular release file');
|
|
285
|
+
const bridge=next.Bridge;
|
|
286
|
+
if(!bridge||typeof bridge.FilePath!=='string'||!path.isAbsolute(bridge.FilePath)||!HEX64.test(String(bridge.FileSha256??''))) {
|
|
287
|
+
throw new Error('autonomous supervisor bootstrap requires pinned Bridge executable identity');
|
|
288
|
+
}
|
|
289
|
+
const executable=path.resolve(bridge.FilePath),exeStat=await lstat(executable);
|
|
290
|
+
if(!exeStat.isFile()||exeStat.isSymbolicLink()) throw new Error('autonomous supervisor executable must be a regular file');
|
|
291
|
+
const executableSha256=await sha256File(executable);
|
|
292
|
+
if(executableSha256!==String(bridge.FileSha256)) throw new Error('autonomous supervisor executable pin drift detected');
|
|
293
|
+
next.AutonomousSupervisorEnabled=true;
|
|
294
|
+
next.Supervisor={
|
|
295
|
+
FilePath:executable,FileSha256:executableSha256,Arguments:'src\\autonomous-supervisor-host.mjs',WorkingDirectory:release,
|
|
296
|
+
ScriptPath:script,ScriptSha256:await sha256File(script)
|
|
297
|
+
};
|
|
298
|
+
return next;
|
|
299
|
+
}
|
|
300
|
+
|
|
265
301
|
function quoteWindowsArgument(value){
|
|
266
302
|
const text=String(value??'');
|
|
267
303
|
if(text.length<1||/["\r\n\0]/.test(text)) throw new Error('named tunnel argument contains unsafe characters');
|
|
@@ -285,6 +321,14 @@ export async function prepareProcessPolicyBootstrap(bootstrap){
|
|
|
285
321
|
return {...pinned,policy};
|
|
286
322
|
}
|
|
287
323
|
|
|
324
|
+
export async function prepareSemanticLspConfigBootstrap(bootstrap){
|
|
325
|
+
if(!bootstrap) return null;
|
|
326
|
+
const pinned=await verifyPinnedRegularFile(bootstrap.path,bootstrap.sha256,'semantic LSP config');
|
|
327
|
+
const config=await readJson(pinned.path);
|
|
328
|
+
if(config?.schema!=='deadbyte.semantic-lsp-config.v1'||!Array.isArray(config.servers)) throw new Error('semantic LSP config schema invalid');
|
|
329
|
+
return {...pinned,config};
|
|
330
|
+
}
|
|
331
|
+
|
|
288
332
|
async function preparePinnedCommandPolicy(policy,{commandPins=[],schema,label}={}){
|
|
289
333
|
if(!policy) return {policy:null,repinned:[],matchedCommandIds:[]};
|
|
290
334
|
if(policy.schema!==schema||policy.enabled!==true||!policy.commands||typeof policy.commands!=='object'||Array.isArray(policy.commands)) {
|
|
@@ -715,7 +759,7 @@ function publicPointer(pointer){
|
|
|
715
759
|
release_root:pointer.release_root,generation_root:pointer.generation_root,generation_manifest_sha256:pointer.generation_manifest_sha256,
|
|
716
760
|
launcher_sha256:pointer.launcher_sha256,config_path:pointer.config_path};
|
|
717
761
|
}
|
|
718
|
-
export async function performSlotUpdate({stage,developmentRoot,expectedVersion,expectedManifest,sourceRoot=null,stateRoot=DEFAULT_STATE_ROOT,restoreStandingGrants=false,recoverOfflinePredecessor=false,cloudTransport=null,bridgeBootstrap=null,processPolicyBootstrap=null,enableMachineFs=false,enableObservation=false,hostCommandPins=[]}){
|
|
762
|
+
export async function performSlotUpdate({stage,developmentRoot,expectedVersion,expectedManifest,sourceRoot=null,stateRoot=DEFAULT_STATE_ROOT,restoreStandingGrants=false,recoverOfflinePredecessor=false,cloudTransport=null,bridgeBootstrap=null,processPolicyBootstrap=null,semanticLspBootstrap=null,enableMachineFs=false,enableObservation=false,enableAutonomousSupervisor=false,hostCommandPins=[]}){
|
|
719
763
|
if(process.platform!=='win32') throw new Error('R27 slot update is Windows-only');
|
|
720
764
|
const state=path.resolve(stateRoot),stageRoot=path.resolve(stage),development=assertDevelopmentRootSafe(developmentRoot,state);
|
|
721
765
|
const key=await loadUpdateKey(state); const updateId=`r27-${expectedManifest.slice(0,16)}-${Date.now().toString(36)}-${randomBytes(4).toString('hex')}`;
|
|
@@ -740,6 +784,11 @@ export async function performSlotUpdate({stage,developmentRoot,expectedVersion,e
|
|
|
740
784
|
control.processPolicy=processBootstrap.policy;
|
|
741
785
|
control.config.ProcessRuntimeEnabled=true;
|
|
742
786
|
}
|
|
787
|
+
const semanticBootstrap=await prepareSemanticLspConfigBootstrap(semanticLspBootstrap);
|
|
788
|
+
if(semanticBootstrap){
|
|
789
|
+
control.config.SemanticLspConfigFile=semanticBootstrap.path;
|
|
790
|
+
control.config.SemanticLspConfigSha256=semanticBootstrap.sha256;
|
|
791
|
+
}
|
|
743
792
|
if(enableMachineFs){
|
|
744
793
|
if(control.config.CodingRuntimeEnabled!==true) throw new Error('MachineFsRuntimeEnabled requires CodingRuntimeEnabled');
|
|
745
794
|
control.config.MachineFsRuntimeEnabled=true;
|
|
@@ -751,6 +800,7 @@ export async function performSlotUpdate({stage,developmentRoot,expectedVersion,e
|
|
|
751
800
|
}
|
|
752
801
|
control.config=await prepareBridgeSpec(control.config,bridgeBootstrap);
|
|
753
802
|
control.config=await prepareNamedTunnelCloudSpec(control.config,{releaseRoot:slot.release_root,bootstrap:cloudTransport});
|
|
803
|
+
control.config=await prepareAutonomousSupervisorSpec(control.config,{releaseRoot:slot.release_root,enable:enableAutonomousSupervisor});
|
|
754
804
|
authorityPreparation=await prepareAuthorityPolicies({hostPolicy:control.hostPolicy,codingPolicy:control.codingPolicy},{commandPins:hostCommandPins});
|
|
755
805
|
control.hostPolicy=authorityPreparation.hostPolicy;
|
|
756
806
|
control.codingPolicy=authorityPreparation.codingPolicy;
|
|
@@ -942,8 +992,8 @@ export async function runSlotUpdateCli(argv=process.argv.slice(2),{stateRoot=DEF
|
|
|
942
992
|
const args=parseUpdateArgs(argv);
|
|
943
993
|
const result=await performSlotUpdate({stage:args.stage,developmentRoot:args.developmentRoot,expectedVersion:args.expectedVersion,
|
|
944
994
|
expectedManifest:args.expectedManifest,sourceRoot:args.sourceRoot,stateRoot,restoreStandingGrants:args.restoreStandingGrants,recoverOfflinePredecessor:args.recoverOfflinePredecessor,
|
|
945
|
-
cloudTransport:args.cloudTransport,bridgeBootstrap:args.bridgeBootstrap,processPolicyBootstrap:args.processPolicyBootstrap,enableMachineFs:args.enableMachineFs,
|
|
946
|
-
enableObservation:args.enableObservation,hostCommandPins:args.hostCommandPins});
|
|
995
|
+
cloudTransport:args.cloudTransport,bridgeBootstrap:args.bridgeBootstrap,processPolicyBootstrap:args.processPolicyBootstrap,semanticLspBootstrap:args.semanticLspBootstrap,enableMachineFs:args.enableMachineFs,
|
|
996
|
+
enableObservation:args.enableObservation,enableAutonomousSupervisor:args.enableAutonomousSupervisor,hostCommandPins:args.hostCommandPins});
|
|
947
997
|
console.log(`R27_SLOT_UPDATE_PASS version=${args.expectedVersion}`);
|
|
948
998
|
console.log(`UPDATE_ID ${result.update_id}`); console.log(`RECEIPT_SHA256 ${result.receipt_sha256}`);
|
|
949
999
|
console.log(`STATE_PATH ${result.state_path}`); console.log(`ACTIVE_RELEASE ${result.pointer.release_id}`);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
|
|
3
|
+
const REQUIRED_METHODS=['outline','definition','references','replaceSymbol','diagnostics'];
|
|
4
|
+
|
|
5
|
+
function normalizeExtension(value){
|
|
6
|
+
if(typeof value!=='string'||value.length<2||!value.startsWith('.')) throw new Error(`invalid semantic extension: ${String(value)}`);
|
|
7
|
+
return value.toLowerCase();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function createSemanticBackendRegistry({backends}){
|
|
11
|
+
if(!Array.isArray(backends)||backends.length<1) throw new Error('semantic backend registry requires backends');
|
|
12
|
+
const ids=new Set();
|
|
13
|
+
const byExtension=new Map();
|
|
14
|
+
const normalized=[];
|
|
15
|
+
for(const backend of backends){
|
|
16
|
+
if(!backend||typeof backend!=='object'||Array.isArray(backend)) throw new Error('semantic backend must be an object');
|
|
17
|
+
if(typeof backend.id!=='string'||backend.id.length<1) throw new Error('semantic backend id missing');
|
|
18
|
+
if(ids.has(backend.id)) throw new Error(`duplicate semantic backend id: ${backend.id}`);
|
|
19
|
+
ids.add(backend.id);
|
|
20
|
+
if(!(backend.extensions instanceof Set)||backend.extensions.size<1) throw new Error(`semantic backend ${backend.id} extensions missing`);
|
|
21
|
+
for(const method of REQUIRED_METHODS) if(typeof backend[method]!=='function') throw new Error(`semantic backend ${backend.id} missing method ${method}`);
|
|
22
|
+
const extensions=[...backend.extensions].map(normalizeExtension).sort();
|
|
23
|
+
for(const ext of extensions){
|
|
24
|
+
if(byExtension.has(ext)) throw new Error(`semantic extension ${ext} already owned by ${byExtension.get(ext).id}`);
|
|
25
|
+
byExtension.set(ext,backend);
|
|
26
|
+
}
|
|
27
|
+
normalized.push({id:backend.id,extensions});
|
|
28
|
+
}
|
|
29
|
+
normalized.sort((a,b)=>a.id.localeCompare(b.id,'en'));
|
|
30
|
+
return Object.freeze({
|
|
31
|
+
backendForPath(relativePath){
|
|
32
|
+
const ext=path.extname(String(relativePath)).toLowerCase();
|
|
33
|
+
const backend=byExtension.get(ext);
|
|
34
|
+
if(!backend) throw new Error(`unsupported semantic language: ${ext||'<none>'}`);
|
|
35
|
+
return backend;
|
|
36
|
+
},
|
|
37
|
+
languages(){return normalized.map(item=>({id:item.id,extensions:[...item.extensions]}));}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import * as ts from 'typescript';
|
|
5
|
+
import { createSemanticBackendRegistry } from './semantic-backend-registry.mjs';
|
|
6
|
+
|
|
7
|
+
const SOURCE_EXTENSIONS=new Set(['.ts','.tsx','.mts','.cts','.js','.jsx','.mjs','.cjs']);
|
|
8
|
+
const MAX_PROJECT_ENTRIES=2000;
|
|
9
|
+
const MAX_SOURCE_FILES=1000;
|
|
10
|
+
|
|
11
|
+
function digest(value){return createHash('sha256').update(JSON.stringify(value)).digest('hex');}
|
|
12
|
+
function relNormalized(value){return value.replaceAll('\\','/').replace(/^\.\//,'');}
|
|
13
|
+
function inside(root,target){const rel=path.relative(root,target);return rel===''||(!rel.startsWith(`..${path.sep}`)&&rel!=='..'&&!path.isAbsolute(rel));}
|
|
14
|
+
function denied(root,absolute){
|
|
15
|
+
if(!inside(root.real_path,absolute)) return true;
|
|
16
|
+
const rel=relNormalized(path.relative(root.real_path,absolute)).toLowerCase();
|
|
17
|
+
return root.deny_paths.some(item=>rel===item||rel.startsWith(`${item}/`));
|
|
18
|
+
}
|
|
19
|
+
function sourceExtension(file){return SOURCE_EXTENSIONS.has(path.extname(file).toLowerCase());}
|
|
20
|
+
function defaultOptions(){return {target:ts.ScriptTarget.ES2022,module:ts.ModuleKind.NodeNext,moduleResolution:ts.ModuleResolutionKind.NodeNext,allowJs:true,checkJs:true,strict:false,noEmit:true,jsx:ts.JsxEmit.Preserve,resolveJsonModule:true,skipLibCheck:true};}
|
|
21
|
+
function parseOptions(configText,rootPath){
|
|
22
|
+
if(!configText) return defaultOptions();
|
|
23
|
+
const parsed=ts.parseConfigFileTextToJson(path.join(rootPath,'tsconfig.json'),configText);
|
|
24
|
+
if(parsed.error) return defaultOptions();
|
|
25
|
+
const converted=ts.convertCompilerOptionsFromJson(parsed.config?.compilerOptions??{},rootPath);
|
|
26
|
+
return {...defaultOptions(),...converted.options,noEmit:true};
|
|
27
|
+
}
|
|
28
|
+
function lineColumn(source,pos){const p=source.getLineAndCharacterOfPosition(Math.max(0,Math.min(pos,source.getFullWidth())));return {line:p.line,column:p.character};}
|
|
29
|
+
function locationFromSpan(project,fileName,textSpan,name='',kind='unknown'){
|
|
30
|
+
const absolute=path.resolve(fileName);
|
|
31
|
+
if(!inside(project.root.real_path,absolute)||denied(project.root,absolute)) return null;
|
|
32
|
+
const source=project.service.getProgram()?.getSourceFile(absolute);
|
|
33
|
+
if(!source) return null;
|
|
34
|
+
const start=lineColumn(source,textSpan.start); const end=lineColumn(source,textSpan.start+textSpan.length);
|
|
35
|
+
return {path:relNormalized(path.relative(project.root.real_path,absolute)),name:String(name||''),kind:String(kind||'unknown'),start_line:start.line,start_column:start.column,end_line:end.line,end_column:end.column};
|
|
36
|
+
}
|
|
37
|
+
async function buildProject(codingRuntime,rootId){
|
|
38
|
+
const status=await codingRuntime.sessionStatus();
|
|
39
|
+
if(!status.armed) throw new Error(`coding plane is disarmed: ${status.reason}`);
|
|
40
|
+
if(!status.root_ids.includes(rootId)) throw new Error(`coding root '${rootId}' is outside active lease`);
|
|
41
|
+
const root=codingRuntime.policy.roots[rootId];
|
|
42
|
+
if(!root||root.read!==true) throw new Error(`coding root '${rootId}' does not allow read`);
|
|
43
|
+
const tree=await codingRuntime.tree({rootId,path:'.',maxDepth:12,maxEntries:MAX_PROJECT_ENTRIES});
|
|
44
|
+
if(tree.truncated) throw new Error(`semantic project exceeds ${MAX_PROJECT_ENTRIES} entry bound; use a narrower coding root`);
|
|
45
|
+
const relativeFiles=tree.entries.filter(item=>item.type==='file'&&sourceExtension(item.path)).map(item=>item.path);
|
|
46
|
+
if(relativeFiles.length>MAX_SOURCE_FILES) throw new Error(`semantic project exceeds ${MAX_SOURCE_FILES} source file bound`);
|
|
47
|
+
const files=relativeFiles.map(rel=>path.join(root.real_path,...rel.split('/')));
|
|
48
|
+
let configText='';
|
|
49
|
+
if(tree.entries.some(item=>item.type==='file'&&item.path==='tsconfig.json')) configText=await readFile(path.join(root.real_path,'tsconfig.json'),'utf8');
|
|
50
|
+
const options=parseOptions(configText,root.real_path);
|
|
51
|
+
const versions=new Map(files.map(file=>[path.resolve(file),'1']));
|
|
52
|
+
const tsLibRoot=path.dirname(ts.getDefaultLibFilePath(options));
|
|
53
|
+
const allowedRead=file=>{
|
|
54
|
+
const absolute=path.resolve(file);
|
|
55
|
+
if(inside(tsLibRoot,absolute)) return true;
|
|
56
|
+
return inside(root.real_path,absolute)&&!denied(root,absolute);
|
|
57
|
+
};
|
|
58
|
+
const host={
|
|
59
|
+
getScriptFileNames:()=>files,
|
|
60
|
+
getScriptVersion:file=>versions.get(path.resolve(file))??'1',
|
|
61
|
+
getScriptSnapshot:file=>{if(!allowedRead(file))return undefined;const text=ts.sys.readFile(file);return text===undefined?undefined:ts.ScriptSnapshot.fromString(text);},
|
|
62
|
+
getCurrentDirectory:()=>root.real_path,
|
|
63
|
+
getCompilationSettings:()=>options,
|
|
64
|
+
getDefaultLibFileName:opts=>ts.getDefaultLibFilePath(opts),
|
|
65
|
+
fileExists:file=>allowedRead(file)&&ts.sys.fileExists(file),
|
|
66
|
+
readFile:file=>allowedRead(file)?ts.sys.readFile(file):undefined,
|
|
67
|
+
readDirectory:(dir,extensions,excludes,includes,depth)=>inside(root.real_path,path.resolve(dir))?ts.sys.readDirectory(dir,extensions,excludes,includes,depth):[],
|
|
68
|
+
directoryExists:dir=>allowedRead(path.join(dir,'_probe'))&&ts.sys.directoryExists?.(dir),
|
|
69
|
+
getDirectories:dir=>inside(root.real_path,path.resolve(dir))?(ts.sys.getDirectories?.(dir)??[]):[],
|
|
70
|
+
useCaseSensitiveFileNames:()=>ts.sys.useCaseSensitiveFileNames,
|
|
71
|
+
getNewLine:()=>ts.sys.newLine
|
|
72
|
+
};
|
|
73
|
+
const service=ts.createLanguageService(host,ts.createDocumentRegistry());
|
|
74
|
+
return {root,files,service,options};
|
|
75
|
+
}
|
|
76
|
+
function targetFile(project,relativePath){
|
|
77
|
+
const absolute=path.resolve(project.root.real_path,...relNormalized(relativePath).split('/'));
|
|
78
|
+
if(!inside(project.root.real_path,absolute)||denied(project.root,absolute)||!sourceExtension(absolute)) throw new Error('semantic target must be an allowed JS/TS source file');
|
|
79
|
+
const source=project.service.getProgram()?.getSourceFile(absolute);
|
|
80
|
+
if(!source) throw new Error(`semantic source unavailable: ${relativePath}`);
|
|
81
|
+
return {absolute,source};
|
|
82
|
+
}
|
|
83
|
+
function offsetAt(source,line,column){
|
|
84
|
+
if(!Number.isInteger(line)||line<0||!Number.isInteger(column)||column<0) throw new Error('line and column must be non-negative integers');
|
|
85
|
+
if(line>=source.getLineStarts().length) throw new Error('line is outside source file');
|
|
86
|
+
const lineStart=source.getPositionOfLineAndCharacter(line,0);
|
|
87
|
+
const lineEnd=line+1<source.getLineStarts().length?source.getPositionOfLineAndCharacter(line+1,0):source.getFullWidth();
|
|
88
|
+
const pos=lineStart+column;
|
|
89
|
+
if(pos>lineEnd) throw new Error('column is outside source line');
|
|
90
|
+
return pos;
|
|
91
|
+
}
|
|
92
|
+
function flattenNavigation(project,target,fileSha,maxSymbols){
|
|
93
|
+
const tree=project.service.getNavigationTree(target.absolute);
|
|
94
|
+
const out=[];
|
|
95
|
+
const visit=(item,container='')=>{
|
|
96
|
+
if(out.length>=maxSymbols) return;
|
|
97
|
+
const span=item.spans?.[0];
|
|
98
|
+
if(span&&item.text&&item.text!=='<global>'){
|
|
99
|
+
const loc=locationFromSpan(project,target.absolute,span,item.text,item.kind);
|
|
100
|
+
if(loc){
|
|
101
|
+
const nameSpan=item.nameSpan??span; const nameLoc=locationFromSpan(project,target.absolute,nameSpan,item.text,item.kind)??loc;
|
|
102
|
+
const symbolId=digest({schema:'deadbyte.semantic-symbol.v1',backend:'typescript',path:loc.path,file_sha256:fileSha,name:item.text,kind:item.kind,start:span.start,length:span.length});
|
|
103
|
+
out.push({...loc,symbol_id:symbolId,container_name:container,name_start_line:nameLoc.start_line,name_start_column:nameLoc.start_column,_span:span});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for(const child of item.childItems??[]) visit(child,item.text&&item.text!=='<global>'?item.text:container);
|
|
107
|
+
};
|
|
108
|
+
visit(tree,'');
|
|
109
|
+
return {symbols:out.slice(0,maxSymbols),truncated:out.length>=maxSymbols};
|
|
110
|
+
}
|
|
111
|
+
function diagnosticCategory(category){return ts.DiagnosticCategory[category]?.toLowerCase?.()??'unknown';}
|
|
112
|
+
|
|
113
|
+
export function createTypeScriptSemanticBackend({codingRuntime}){
|
|
114
|
+
if(!codingRuntime) throw new Error('TypeScript semantic backend requires coding runtime');
|
|
115
|
+
async function outline({rootId,relativePath,maxSymbols=200}){
|
|
116
|
+
if(!Number.isInteger(maxSymbols)||maxSymbols<1||maxSymbols>500) throw new Error('max_symbols must be in [1, 500]');
|
|
117
|
+
const file=await codingRuntime.fileRead({rootId,relativePath,encoding:'utf8'});
|
|
118
|
+
const project=await buildProject(codingRuntime,rootId); const target=targetFile(project,relativePath);
|
|
119
|
+
const flat=flattenNavigation(project,target,file.sha256,maxSymbols);
|
|
120
|
+
return {status:'ok',root_id:rootId,path:relativePath,file_sha256:file.sha256,engine:`typescript-${ts.version}`,symbols:flat.symbols.map(({_span,...x})=>x),truncated:flat.truncated};
|
|
121
|
+
}
|
|
122
|
+
async function definition({rootId,relativePath,line,column,maxResults=50}){
|
|
123
|
+
if(!Number.isInteger(maxResults)||maxResults<1||maxResults>200) throw new Error('max_results must be in [1, 200]');
|
|
124
|
+
await codingRuntime.fileRead({rootId,relativePath,encoding:'utf8'});
|
|
125
|
+
const project=await buildProject(codingRuntime,rootId); const target=targetFile(project,relativePath); const pos=offsetAt(target.source,line,column);
|
|
126
|
+
const defs=project.service.getDefinitionAtPosition(target.absolute,pos)??[];
|
|
127
|
+
const locations=defs.map(item=>locationFromSpan(project,item.fileName,item.textSpan,item.name,item.kind)).filter(Boolean).slice(0,maxResults);
|
|
128
|
+
return {status:'ok',root_id:rootId,path:relativePath,line,column,engine:`typescript-${ts.version}`,locations,truncated:defs.length>maxResults};
|
|
129
|
+
}
|
|
130
|
+
async function references({rootId,relativePath,line,column,maxResults=200}){
|
|
131
|
+
if(!Number.isInteger(maxResults)||maxResults<1||maxResults>500) throw new Error('max_results must be in [1, 500]');
|
|
132
|
+
await codingRuntime.fileRead({rootId,relativePath,encoding:'utf8'});
|
|
133
|
+
const project=await buildProject(codingRuntime,rootId); const target=targetFile(project,relativePath); const pos=offsetAt(target.source,line,column);
|
|
134
|
+
const refs=project.service.getReferencesAtPosition(target.absolute,pos)??[];
|
|
135
|
+
const locations=refs.map(item=>locationFromSpan(project,item.fileName,item.textSpan,'','reference')).filter(Boolean).slice(0,maxResults);
|
|
136
|
+
return {status:'ok',root_id:rootId,path:relativePath,line,column,engine:`typescript-${ts.version}`,locations,truncated:refs.length>maxResults};
|
|
137
|
+
}
|
|
138
|
+
async function replaceSymbol({rootId,relativePath,symbolId,newBody,expectedSha256}){
|
|
139
|
+
if(typeof newBody!=='string'||newBody.length>524288) throw new Error('new_body exceeds 524288 characters');
|
|
140
|
+
const file=await codingRuntime.fileRead({rootId,relativePath,encoding:'utf8'});
|
|
141
|
+
if(file.sha256!==expectedSha256) throw new Error(`semantic replace precondition mismatch: expected ${expectedSha256}, found ${file.sha256}`);
|
|
142
|
+
const project=await buildProject(codingRuntime,rootId); const target=targetFile(project,relativePath);
|
|
143
|
+
const flat=flattenNavigation(project,target,file.sha256,500);
|
|
144
|
+
const symbol=flat.symbols.find(item=>item.symbol_id===symbolId);
|
|
145
|
+
if(!symbol) throw new Error('semantic symbol_id is stale or unknown for current file');
|
|
146
|
+
const oldBody=target.source.text.slice(symbol._span.start,symbol._span.start+symbol._span.length);
|
|
147
|
+
const result=await codingRuntime.textReplace({rootId,relativePath,oldString:oldBody,newString:newBody,expectedSha256,expectedReplacements:1});
|
|
148
|
+
return {...result,symbol_id:symbolId,symbol_name:symbol.name,engine:`typescript-${ts.version}`};
|
|
149
|
+
}
|
|
150
|
+
async function diagnostics({rootId,relativePath,maxResults=200}){
|
|
151
|
+
if(!Number.isInteger(maxResults)||maxResults<1||maxResults>500) throw new Error('max_results must be in [1, 500]');
|
|
152
|
+
await codingRuntime.fileRead({rootId,relativePath,encoding:'utf8'});
|
|
153
|
+
const project=await buildProject(codingRuntime,rootId); const target=targetFile(project,relativePath);
|
|
154
|
+
const all=[...project.service.getSyntacticDiagnostics(target.absolute),...project.service.getSemanticDiagnostics(target.absolute)];
|
|
155
|
+
const diagnosticsOut=all.slice(0,maxResults).map(item=>{
|
|
156
|
+
const span=Number.isInteger(item.start)&&Number.isInteger(item.length)?{start:item.start,length:item.length}:{start:0,length:0};
|
|
157
|
+
const loc=locationFromSpan(project,target.absolute,span,'','diagnostic');
|
|
158
|
+
return {message:ts.flattenDiagnosticMessageText(item.messageText,'\n'),code:String(item.code),severity:diagnosticCategory(item.category),...(loc?{location:loc}:{})};
|
|
159
|
+
});
|
|
160
|
+
return {status:'ok',root_id:rootId,path:relativePath,engine:`typescript-${ts.version}`,diagnostics:diagnosticsOut,truncated:all.length>maxResults};
|
|
161
|
+
}
|
|
162
|
+
return Object.freeze({id:'typescript',extensions:new Set(SOURCE_EXTENSIONS),outline,definition,references,replaceSymbol,diagnostics});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function createSemanticCodeRuntime({codingRuntime,backends=[]}){
|
|
166
|
+
if(!codingRuntime) throw new Error('semantic runtime requires coding runtime');
|
|
167
|
+
if(!Array.isArray(backends)) throw new Error('semantic runtime backends must be an array');
|
|
168
|
+
const typescript=createTypeScriptSemanticBackend({codingRuntime});
|
|
169
|
+
const registry=createSemanticBackendRegistry({backends:[typescript,...backends]});
|
|
170
|
+
const route=(method,args)=>registry.backendForPath(args.relativePath)[method](args);
|
|
171
|
+
return Object.freeze({
|
|
172
|
+
outline:async args=>route('outline',args),
|
|
173
|
+
definition:async args=>route('definition',args),
|
|
174
|
+
references:async args=>route('references',args),
|
|
175
|
+
replaceSymbol:async args=>route('replaceSymbol',args),
|
|
176
|
+
diagnostics:async args=>route('diagnostics',args),
|
|
177
|
+
languages:()=>registry.languages()
|
|
178
|
+
});
|
|
179
|
+
}
|