pi-lens 4.2.1 → 4.4.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/CHANGELOG.md +1562 -0
- package/README.md +157 -24
- package/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/dist/chunk-22AVIGXS.js +560 -0
- package/dist/chunk-27BBHSZC.js +106 -0
- package/dist/chunk-2BEMIWEW.js +51 -0
- package/dist/chunk-2EECBNC5.js +89 -0
- package/dist/chunk-34U7PLGE.js +23 -0
- package/dist/chunk-3I5QFT3N.js +181 -0
- package/dist/chunk-3MED75HT.js +37 -0
- package/dist/chunk-47D2BO4S.js +87 -0
- package/dist/chunk-4RERDEXR.js +348 -0
- package/dist/chunk-4W2PLC4J.js +27 -0
- package/dist/chunk-52H5B5TC.js +202 -0
- package/dist/chunk-54B42YRX.js +27 -0
- package/dist/chunk-5RXBNSW2.js +266 -0
- package/dist/chunk-5THXD6X5.js +201 -0
- package/dist/chunk-5W3R6LFT.js +24 -0
- package/dist/chunk-5ZEJHV35.js +341 -0
- package/dist/chunk-6P62QVEA.js +118 -0
- package/dist/chunk-6QIUX4EP.js +459 -0
- package/dist/chunk-6VCD4VKZ.js +78 -0
- package/dist/chunk-7F72PXY2.js +326 -0
- package/dist/chunk-7FBF7NPR.js +998 -0
- package/dist/chunk-7U2IDNXN.js +37 -0
- package/dist/chunk-ABBOA7UD.js +157 -0
- package/dist/chunk-AHDW3GPE.js +50 -0
- package/dist/chunk-AJ3QXTRQ.js +756 -0
- package/dist/chunk-AJVLWNFN.js +1610 -0
- package/dist/chunk-AJXODZY6.js +112 -0
- package/dist/chunk-ARFCXG7S.js +84 -0
- package/dist/chunk-AS44CFQ4.js +708 -0
- package/dist/chunk-AWE5TMPO.js +38 -0
- package/dist/chunk-B3I2UUT4.js +4692 -0
- package/dist/chunk-BRJKOBZP.js +331 -0
- package/dist/chunk-BW5KFIQC.js +59 -0
- package/dist/chunk-C2AUYXQH.js +149 -0
- package/dist/chunk-CGGAIP7J.js +29 -0
- package/dist/chunk-D6QS3U6M.js +30 -0
- package/dist/chunk-DFVMIKMQ.js +349 -0
- package/dist/chunk-DIULIWKU.js +169 -0
- package/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/dist/chunk-E2WFBRHM.js +213 -0
- package/dist/chunk-E4MAEDPM.js +50 -0
- package/dist/chunk-EOKRQ3SA.js +30 -0
- package/dist/chunk-F3AU2TMM.js +2626 -0
- package/dist/chunk-F3P7VQ7H.js +170 -0
- package/dist/chunk-FC4RP4I2.js +12 -0
- package/dist/chunk-FJNKANOS.js +32 -0
- package/dist/chunk-GUOGVTCQ.js +146 -0
- package/dist/chunk-GVXA6CCE.js +18 -0
- package/dist/chunk-HHYAELLJ.js +2334 -0
- package/dist/chunk-HMFXILPV.js +83 -0
- package/dist/chunk-HVUZXSWK.js +421 -0
- package/dist/chunk-HWBZIGMJ.js +62 -0
- package/dist/chunk-I3R7GKDR.js +17 -0
- package/dist/chunk-I7SPGOWI.js +55 -0
- package/dist/chunk-IIXOAGHR.js +38 -0
- package/dist/chunk-IVP5KAB7.js +2250 -0
- package/dist/chunk-IXEBJSUE.js +22 -0
- package/dist/chunk-JOLITGCC.js +27 -0
- package/dist/chunk-K6VYLB2U.js +145 -0
- package/dist/chunk-LJDODBBZ.js +78 -0
- package/dist/chunk-LNAKEO63.js +78 -0
- package/dist/chunk-LSMJ6KBE.js +4139 -0
- package/dist/chunk-LW6XKDZQ.js +5565 -0
- package/dist/chunk-N3YQJI6O.js +899 -0
- package/dist/chunk-NABLC7W3.js +148 -0
- package/dist/chunk-NKOUFPQF.js +659 -0
- package/dist/chunk-NL5GLMFI.js +211 -0
- package/dist/chunk-NMABWBZN.js +327 -0
- package/dist/chunk-NTHH2J74.js +27 -0
- package/dist/chunk-NTUJEGDZ.js +59 -0
- package/dist/chunk-NXL4FFQQ.js +47 -0
- package/dist/chunk-NXPS2L6U.js +466 -0
- package/dist/chunk-O5WILGMI.js +42 -0
- package/dist/chunk-O6TQT6RI.js +48 -0
- package/dist/chunk-OAXNDZJ7.js +323 -0
- package/dist/chunk-ODEEOXPH.js +44 -0
- package/dist/chunk-OQGFCZJ4.js +4533 -0
- package/dist/chunk-ORTMY4Q4.js +282 -0
- package/dist/chunk-OS32RNR2.js +442 -0
- package/dist/chunk-PAK6IDME.js +189 -0
- package/dist/chunk-PWFHBTSF.js +406 -0
- package/dist/chunk-Q5U6FMDI.js +2352 -0
- package/dist/chunk-QOZXJ4NA.js +3364 -0
- package/dist/chunk-QYF5S6P6.js +45 -0
- package/dist/chunk-RIISMHKN.js +36 -0
- package/dist/chunk-RPD4ZSB7.js +25 -0
- package/dist/chunk-RPD5K5NC.js +79 -0
- package/dist/chunk-RUOG5D2C.js +262 -0
- package/dist/chunk-T4ERT73Y.js +599 -0
- package/dist/chunk-T6D4Q4AQ.js +54 -0
- package/dist/chunk-TGPXLY2J.js +391 -0
- package/dist/chunk-TLGFBM3F.js +12116 -0
- package/dist/chunk-TO6WL3GM.js +88 -0
- package/dist/chunk-TT22N74J.js +517 -0
- package/dist/chunk-TVN5N6GY.js +21216 -0
- package/dist/chunk-U3VGR4VU.js +308 -0
- package/dist/chunk-UK3CMEAL.js +1250 -0
- package/dist/chunk-UOPVJQ4N.js +103 -0
- package/dist/chunk-UXVNL3D7.js +23 -0
- package/dist/chunk-UY752QSN.js +45 -0
- package/dist/chunk-V5PXFSZK.js +188 -0
- package/dist/chunk-V7R425XG.js +398 -0
- package/dist/chunk-VCSRSYLF.js +81 -0
- package/dist/chunk-VD4JQCQC.js +162 -0
- package/dist/chunk-VDBPVIKD.js +62 -0
- package/dist/chunk-VHQLPIRJ.js +114 -0
- package/dist/chunk-VN2AXLEX.js +5414 -0
- package/dist/chunk-VNMT7C64.js +478 -0
- package/dist/chunk-WONERJTP.js +309 -0
- package/dist/chunk-XECLWQZN.js +85 -0
- package/dist/chunk-XIMYZ3JA.js +27 -0
- package/dist/chunk-XK4CIILI.js +144 -0
- package/dist/chunk-Y4T27COV.js +562 -0
- package/dist/chunk-YGVYKNSN.js +1860 -0
- package/dist/chunk-YLF3PPT5.js +308 -0
- package/dist/chunk-YSNFMJKN.js +14 -0
- package/dist/chunk-Z3CCVDUB.js +76 -0
- package/dist/chunk-Z54ZSOBZ.js +61 -0
- package/dist/chunk-ZAWW3AF6.js +97 -0
- package/dist/chunk-ZMOL6RQC.js +167 -0
- package/dist/index.js +19039 -8956
- package/dist/mcp/analyze-cli.js +186 -228
- package/dist/mcp/cli.js +137 -98
- package/dist/mcp/server.js +22592 -1564
- package/dist/mcp/worker.js +97 -38
- package/dist/probes/installer.js +135 -0
- package/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/dist/workers/review-graph-persist-worker.js +15 -0
- package/docs/adr/0001-stale-advisory-live-arm.md +29 -0
- package/docs/adr/0002-workspace-hash-rendezvous.md +30 -0
- package/docs/adr/0003-git-guard-latch-writer.md +203 -0
- package/docs/adr/0004-disposition-policy-seam.md +38 -0
- package/docs/adr/0005-tool-availability-enforcement-seam.md +29 -0
- package/docs/adr/0006-derived-state-benchmark-first.md +31 -0
- package/docs/adr/0007-end-to-end-witness-per-seam-slice.md +38 -0
- package/docs/adr/0008-turn-end-lane-interface.md +165 -0
- package/docs/adr/0009-reported-path-attribution.md +114 -0
- package/docs/adr/README.md +26 -0
- package/docs/agent-guide.md +13 -4
- package/docs/agent-tools.md +60 -1
- package/docs/ast-grep_rules_catalog.md +6 -4
- package/docs/configuration.md +75 -2
- package/docs/engineering-principles.md +202 -0
- package/docs/environment-variables.md +113 -6
- package/docs/features.md +10 -6
- package/docs/globalconfig.md +7 -1
- package/docs/io-bridge-v2-migration.md +94 -0
- package/docs/language-coverage.md +17 -0
- package/docs/lsp-capability-matrix.md +131 -32
- package/docs/lsp-idle-eviction.md +124 -0
- package/docs/mcp.md +21 -5
- package/docs/merge-queue-rollout.md +77 -0
- package/docs/pi-lens-fixer.md +161 -39
- package/docs/pi-lens-investigator.md +77 -20
- package/docs/pi-lens-merge-policy.md +694 -0
- package/docs/pi-lens-monitor.md +73 -7
- package/docs/pi-lens-retro.md +6 -4
- package/docs/pi-lens-reviewer.md +190 -34
- package/docs/pi-lens-subagent.md +247 -37
- package/docs/pi-lens-warden.md +18 -7
- package/docs/public-api-stability.md +56 -0
- package/docs/release-qa-baseline.md +86 -17
- package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/docs/servercapabilities.md +66 -52
- package/docs/settings.md +13 -3
- package/docs/subagent-compat.md +1 -1
- package/docs/usage.md +5 -1
- package/grammars/tree-sitter-bash.wasm +0 -0
- package/grammars/tree-sitter-bash.wasm.json +3 -3
- package/package.json +23 -9
- package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
- package/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
- package/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
- package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
- package/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
- package/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
- package/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
- package/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
- package/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
- package/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
- package/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
- package/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
- package/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/scripts/download-grammars.js +5 -0
- package/scripts/grammars.lock.json +6 -1
- package/scripts/install-selftest.mjs +38 -35
- package/scripts/lib/host-provided-deps.mjs +13 -4
- package/scripts/lib/web-tree-sitter-dir.mjs +141 -0
- package/dist/clients/actionable-warnings-logger.js +0 -35
- package/dist/clients/actionable-warnings.js +0 -1594
- package/dist/clients/advisory-provenance.js +0 -457
- package/dist/clients/agent-behavior-client.js +0 -147
- package/dist/clients/agent-nudge.js +0 -325
- package/dist/clients/analysed-root.js +0 -1
- package/dist/clients/ast-grep-client.js +0 -731
- package/dist/clients/ast-grep-rule-manager.js +0 -146
- package/dist/clients/ast-grep-tool-logger.js +0 -118
- package/dist/clients/ast-grep-types.js +0 -10
- package/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/dist/clients/atomic-write-staging.js +0 -75
- package/dist/clients/atomic-write.js +0 -189
- package/dist/clients/availability-probe-flight.js +0 -12
- package/dist/clients/bash-file-access.js +0 -1056
- package/dist/clients/biome-client.js +0 -357
- package/dist/clients/blocker-freshness.js +0 -837
- package/dist/clients/blocker-past-eof.js +0 -129
- package/dist/clients/bootstrap.js +0 -569
- package/dist/clients/bounded-cache.js +0 -190
- package/dist/clients/bounded-pid-file-lock.js +0 -202
- package/dist/clients/bounded-telemetry.js +0 -295
- package/dist/clients/build-identity.js +0 -95
- package/dist/clients/bundled-resource-health.js +0 -113
- package/dist/clients/bus-events-logger.js +0 -105
- package/dist/clients/bus-publish.js +0 -171
- package/dist/clients/cache/rule-cache.js +0 -190
- package/dist/clients/cache-manager.js +0 -465
- package/dist/clients/cache-observability.js +0 -1313
- package/dist/clients/call-graph.js +0 -852
- package/dist/clients/cargo-manifest.js +0 -422
- package/dist/clients/cascade-budget.js +0 -196
- package/dist/clients/cascade-format.js +0 -315
- package/dist/clients/cascade-logger.js +0 -31
- package/dist/clients/cascade-types.js +0 -9
- package/dist/clients/child-unref.js +0 -115
- package/dist/clients/code-quality-warnings.js +0 -286
- package/dist/clients/codebase-model.js +0 -173
- package/dist/clients/collateral-test-role.js +0 -40
- package/dist/clients/complexity-client.js +0 -462
- package/dist/clients/config-core/deny.js +0 -221
- package/dist/clients/config-core/index.js +0 -50
- package/dist/clients/config-core/merge.js +0 -357
- package/dist/clients/config-core/normalize.js +0 -340
- package/dist/clients/config-core/process-spec.js +0 -248
- package/dist/clients/config-core/provenance.js +0 -164
- package/dist/clients/config-core/records.js +0 -218
- package/dist/clients/config-core/resolve.js +0 -125
- package/dist/clients/config-core/safe-object.js +0 -78
- package/dist/clients/config-core/schema.js +0 -165
- package/dist/clients/config-diagnostic-codes.js +0 -283
- package/dist/clients/config-locations.js +0 -160
- package/dist/clients/config-resolve.js +0 -792
- package/dist/clients/config-schema.js +0 -251
- package/dist/clients/config-warn.js +0 -407
- package/dist/clients/console-guard-install.js +0 -26
- package/dist/clients/cooperative-budget.js +0 -42
- package/dist/clients/dead-code-client.js +0 -510
- package/dist/clients/dead-code-logger.js +0 -30
- package/dist/clients/deadline-utils.js +0 -280
- package/dist/clients/debug-handles.js +0 -211
- package/dist/clients/debug-heap.js +0 -174
- package/dist/clients/deferred-lsp-work.js +0 -106
- package/dist/clients/degradation-ledger.js +0 -396
- package/dist/clients/demoted-finding-render.js +0 -169
- package/dist/clients/dependency-checker.js +0 -862
- package/dist/clients/deps/ast-grep-napi.js +0 -22
- package/dist/clients/deps/js-yaml.js +0 -9
- package/dist/clients/deps/minimatch.js +0 -4
- package/dist/clients/deps/pi-tui.js +0 -14
- package/dist/clients/deps/typebox.js +0 -14
- package/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/dist/clients/deps/web-tree-sitter.js +0 -24
- package/dist/clients/diagnostic-dispositions.js +0 -594
- package/dist/clients/diagnostic-line-freshness.js +0 -305
- package/dist/clients/diagnostic-logger.js +0 -73
- package/dist/clients/diagnostic-tracker.js +0 -105
- package/dist/clients/diagnostics-publish.js +0 -230
- package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/dist/clients/dispatch/dispatcher.js +0 -1269
- package/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/dist/clients/dispatch/fact-runner.js +0 -30
- package/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/dist/clients/dispatch/fact-store.js +0 -377
- package/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/dist/clients/dispatch/facts/file-content.js +0 -19
- package/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/dist/clients/dispatch/finding-policy.js +0 -222
- package/dist/clients/dispatch/indent-detect.js +0 -411
- package/dist/clients/dispatch/inline-suppressions.js +0 -70
- package/dist/clients/dispatch/integration.js +0 -2377
- package/dist/clients/dispatch/lazy.js +0 -11
- package/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/dist/clients/dispatch/plan.js +0 -278
- package/dist/clients/dispatch/priorities.js +0 -20
- package/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/dist/clients/dispatch/rule-ignores.js +0 -62
- package/dist/clients/dispatch/rule-policy.js +0 -135
- package/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/dist/clients/dispatch/runner-context.js +0 -52
- package/dist/clients/dispatch/runners/actionlint.js +0 -113
- package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/dist/clients/dispatch/runners/biome-check.js +0 -283
- package/dist/clients/dispatch/runners/cpp-check.js +0 -236
- package/dist/clients/dispatch/runners/credo.js +0 -80
- package/dist/clients/dispatch/runners/cue-vet.js +0 -398
- package/dist/clients/dispatch/runners/dart-analyze.js +0 -202
- package/dist/clients/dispatch/runners/detekt.js +0 -169
- package/dist/clients/dispatch/runners/dotnet-build.js +0 -159
- package/dist/clients/dispatch/runners/elixir-check.js +0 -210
- package/dist/clients/dispatch/runners/eslint.js +0 -154
- package/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/dist/clients/dispatch/runners/gleam-check.js +0 -87
- package/dist/clients/dispatch/runners/go-vet.js +0 -90
- package/dist/clients/dispatch/runners/golangci-lint.js +0 -120
- package/dist/clients/dispatch/runners/hadolint.js +0 -79
- package/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/dist/clients/dispatch/runners/htmlhint.js +0 -108
- package/dist/clients/dispatch/runners/index.js +0 -108
- package/dist/clients/dispatch/runners/javac.js +0 -89
- package/dist/clients/dispatch/runners/ktlint.js +0 -136
- package/dist/clients/dispatch/runners/lsp.js +0 -378
- package/dist/clients/dispatch/runners/markdownlint.js +0 -160
- package/dist/clients/dispatch/runners/mypy.js +0 -101
- package/dist/clients/dispatch/runners/oxlint.js +0 -398
- package/dist/clients/dispatch/runners/php-lint.js +0 -62
- package/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/dist/clients/dispatch/runners/pyright.js +0 -169
- package/dist/clients/dispatch/runners/rubocop.js +0 -90
- package/dist/clients/dispatch/runners/ruff.js +0 -89
- package/dist/clients/dispatch/runners/rust-clippy.js +0 -251
- package/dist/clients/dispatch/runners/shellcheck.js +0 -169
- package/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/dist/clients/dispatch/runners/spellcheck.js +0 -121
- package/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/dist/clients/dispatch/runners/sqlfluff.js +0 -174
- package/dist/clients/dispatch/runners/stylelint.js +0 -158
- package/dist/clients/dispatch/runners/swiftlint.js +0 -154
- package/dist/clients/dispatch/runners/taplo.js +0 -168
- package/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/dist/clients/dispatch/runners/tflint.js +0 -110
- package/dist/clients/dispatch/runners/tree-sitter.js +0 -620
- package/dist/clients/dispatch/runners/trivy-config.js +0 -247
- package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -85
- package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/dist/clients/dispatch/runners/utils.js +0 -15
- package/dist/clients/dispatch/runners/vale.js +0 -116
- package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/dist/clients/dispatch/runners/yamllint.js +0 -85
- package/dist/clients/dispatch/runners/zig-check.js +0 -91
- package/dist/clients/dispatch/suppress-writer.js +0 -69
- package/dist/clients/dispatch/tool-profile.js +0 -30
- package/dist/clients/dispatch/types.js +0 -21
- package/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/dist/clients/disposition-logger.js +0 -32
- package/dist/clients/disposition-publish.js +0 -124
- package/dist/clients/durable-store.js +0 -97
- package/dist/clients/effective-config.js +0 -413
- package/dist/clients/env-utils.js +0 -83
- package/dist/clients/error-class.js +0 -23
- package/dist/clients/eval-timestamp.js +0 -17
- package/dist/clients/event-loop-hold.js +0 -274
- package/dist/clients/event-loop-monitor.js +0 -250
- package/dist/clients/extension-log.js +0 -504
- package/dist/clients/extension-mode.js +0 -73
- package/dist/clients/feature-hints.js +0 -103
- package/dist/clients/file-kinds.js +0 -412
- package/dist/clients/file-role.js +0 -134
- package/dist/clients/file-time.js +0 -160
- package/dist/clients/file-utils.js +0 -1032
- package/dist/clients/finding-delivery-gate.js +0 -463
- package/dist/clients/finding-identity.js +0 -88
- package/dist/clients/fix-worklog.js +0 -103
- package/dist/clients/format-events-publish.js +0 -343
- package/dist/clients/format-service.js +0 -222
- package/dist/clients/formatters-lazy.js +0 -9
- package/dist/clients/formatters.js +0 -1994
- package/dist/clients/freshness-cadence.js +0 -17
- package/dist/clients/freshness.js +0 -38
- package/dist/clients/generated-artifacts.js +0 -394
- package/dist/clients/generation-guard.js +0 -215
- package/dist/clients/git-guard.js +0 -923
- package/dist/clients/git-tracked-ignore.js +0 -243
- package/dist/clients/gitleaks-client.js +0 -509
- package/dist/clients/go-client.js +0 -104
- package/dist/clients/govulncheck-client.js +0 -605
- package/dist/clients/gradle-ktfmt-style.js +0 -252
- package/dist/clients/grammar-source.js +0 -465
- package/dist/clients/gzip-stage-write.js +0 -135
- package/dist/clients/hashline-anchor.js +0 -424
- package/dist/clients/hook-budgets.js +0 -76
- package/dist/clients/host-edit-normalize.js +0 -140
- package/dist/clients/host-ports.js +0 -39
- package/dist/clients/indent-retarget.js +0 -154
- package/dist/clients/install-diagnostics.js +0 -143
- package/dist/clients/installer/index.js +0 -5167
- package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/dist/clients/instance-reaper-state.js +0 -7
- package/dist/clients/instance-reaper.js +0 -1137
- package/dist/clients/instance-registry-lock.js +0 -145
- package/dist/clients/instance-registry.js +0 -773
- package/dist/clients/jscpd-client.js +0 -370
- package/dist/clients/json-cache-read.js +0 -65
- package/dist/clients/knip-client.js +0 -788
- package/dist/clients/language-policy.js +0 -252
- package/dist/clients/language-profile.js +0 -361
- package/dist/clients/language-registry.js +0 -603
- package/dist/clients/latency-logger.js +0 -719
- package/dist/clients/lazy-import.js +0 -21
- package/dist/clients/ledger-bounds.js +0 -54
- package/dist/clients/lens-config.js +0 -346
- package/dist/clients/lens-engine.js +0 -358
- package/dist/clients/lens-events.js +0 -125
- package/dist/clients/lens-flag-registry.js +0 -467
- package/dist/clients/lens-map.js +0 -1156
- package/dist/clients/live-bus-emitter.js +0 -74
- package/dist/clients/log-cleanup.js +0 -222
- package/dist/clients/lsp/aggregation.js +0 -178
- package/dist/clients/lsp/cascade-tier.js +0 -421
- package/dist/clients/lsp/client.js +0 -4465
- package/dist/clients/lsp/config.js +0 -689
- package/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/dist/clients/lsp/document-drift.js +0 -467
- package/dist/clients/lsp/edits.js +0 -1219
- package/dist/clients/lsp/index.js +0 -8305
- package/dist/clients/lsp/inferred-project.js +0 -216
- package/dist/clients/lsp/jvm-runtime.js +0 -298
- package/dist/clients/lsp/language.js +0 -63
- package/dist/clients/lsp/launch.js +0 -725
- package/dist/clients/lsp/lombok.js +0 -158
- package/dist/clients/lsp/path-utils.js +0 -5
- package/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/dist/clients/lsp/position-encoding.js +0 -61
- package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/dist/clients/lsp/server.js +0 -3209
- package/dist/clients/lsp/session-roots.js +0 -192
- package/dist/clients/lsp/spawn-history.js +0 -17
- package/dist/clients/lsp/sync-kind.js +0 -42
- package/dist/clients/lsp/tsserver-sync.js +0 -332
- package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/dist/clients/lsp/wait-policy/index.js +0 -10
- package/dist/clients/lsp/wait-policy/strategies.js +0 -303
- package/dist/clients/lsp/watch-queue.js +0 -61
- package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/dist/clients/lsp-budget.js +0 -186
- package/dist/clients/lsp-document-symbols.js +0 -110
- package/dist/clients/lsp-lazy.js +0 -9
- package/dist/clients/lsp-mutation.js +0 -396
- package/dist/clients/lsp-status.js +0 -59
- package/dist/clients/map-with-concurrency.js +0 -40
- package/dist/clients/mcp/analyze.js +0 -420
- package/dist/clients/mcp/host-shim.js +0 -31
- package/dist/clients/mcp/ipc.js +0 -335
- package/dist/clients/mcp/review.js +0 -151
- package/dist/clients/mcp/session.js +0 -412
- package/dist/clients/memory-sampler.js +0 -208
- package/dist/clients/message-end-attribution.js +0 -30
- package/dist/clients/metrics-client.js +0 -107
- package/dist/clients/metrics-history.js +0 -327
- package/dist/clients/middle-man-analysis.js +0 -263
- package/dist/clients/model-provider.js +0 -53
- package/dist/clients/module-report-lsp.js +0 -189
- package/dist/clients/module-report.js +0 -2150
- package/dist/clients/mutating-tool.js +0 -651
- package/dist/clients/mutation-attribution.js +0 -368
- package/dist/clients/mutation-bridge.js +0 -240
- package/dist/clients/ndjson-logger.js +0 -734
- package/dist/clients/observed-mutation-sources.js +0 -101
- package/dist/clients/observed-mutation.js +0 -1253
- package/dist/clients/oldtext-autopatch.js +0 -128
- package/dist/clients/opaque-mutation-scan.js +0 -496
- package/dist/clients/opengrep-client.js +0 -328
- package/dist/clients/opengrep-config.js +0 -76
- package/dist/clients/package-manager.js +0 -607
- package/dist/clients/package-root.js +0 -38
- package/dist/clients/partial-edit-apply.js +0 -439
- package/dist/clients/path-attribution-telemetry.js +0 -43
- package/dist/clients/path-keyed-map.js +0 -108
- package/dist/clients/path-utils.js +0 -1244
- package/dist/clients/performance-report.js +0 -331
- package/dist/clients/persist-debounce.js +0 -70
- package/dist/clients/persistent-reverify.js +0 -271
- package/dist/clients/php-cs-fixer-config.js +0 -119
- package/dist/clients/pipeline.js +0 -1425
- package/dist/clients/post-autofix-notice.js +0 -37
- package/dist/clients/print-mode.js +0 -21
- package/dist/clients/probe-home-state.js +0 -228
- package/dist/clients/process-bridge.js +0 -66
- package/dist/clients/process-singletons.js +0 -210
- package/dist/clients/process-snapshot.js +0 -68
- package/dist/clients/project-changes.js +0 -181
- package/dist/clients/project-conventions.js +0 -171
- package/dist/clients/project-diagnostics/cache.js +0 -137
- package/dist/clients/project-diagnostics/extractors.js +0 -109
- package/dist/clients/project-diagnostics/fresh-fetch.js +0 -650
- package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/dist/clients/project-diagnostics/scanner.js +0 -520
- package/dist/clients/project-diagnostics/types.js +0 -1
- package/dist/clients/project-lens-config.js +0 -799
- package/dist/clients/project-report.js +0 -701
- package/dist/clients/project-scale.js +0 -237
- package/dist/clients/project-scan-policy.js +0 -11
- package/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/dist/clients/project-snapshot.js +0 -1653
- package/dist/clients/project-trust.js +0 -181
- package/dist/clients/python-environment.js +0 -217
- package/dist/clients/python-provenance.js +0 -639
- package/dist/clients/quiet-window-config.js +0 -47
- package/dist/clients/quiet-window.js +0 -236
- package/dist/clients/read-bridge.js +0 -139
- package/dist/clients/read-expansion.js +0 -266
- package/dist/clients/read-guard-logger.js +0 -251
- package/dist/clients/read-guard-tool-lines.js +0 -1306
- package/dist/clients/read-guard.js +0 -1561
- package/dist/clients/recent-touches.js +0 -240
- package/dist/clients/redact/secrets.js +0 -449
- package/dist/clients/resource-sampler.js +0 -628
- package/dist/clients/reverse-deps.js +0 -270
- package/dist/clients/review-graph/builder.js +0 -5118
- package/dist/clients/review-graph/format.js +0 -33
- package/dist/clients/review-graph/git-identity.js +0 -157
- package/dist/clients/review-graph/import-resolvers.js +0 -481
- package/dist/clients/review-graph/persist-worker.js +0 -10
- package/dist/clients/review-graph/query.js +0 -244
- package/dist/clients/review-graph/revision-drift.js +0 -21
- package/dist/clients/review-graph/service.js +0 -96
- package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/dist/clients/review-graph/symbol-id.js +0 -103
- package/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/dist/clients/review-graph/types.js +0 -1
- package/dist/clients/review-graph/workspace-modules.js +0 -449
- package/dist/clients/review-graph-logger.js +0 -81
- package/dist/clients/ruff-client.js +0 -152
- package/dist/clients/rules-scanner.js +0 -131
- package/dist/clients/run-duration.js +0 -55
- package/dist/clients/runtime-agent-end.js +0 -746
- package/dist/clients/runtime-config.js +0 -77
- package/dist/clients/runtime-context.js +0 -211
- package/dist/clients/runtime-coordinator.js +0 -1290
- package/dist/clients/runtime-session.js +0 -2485
- package/dist/clients/runtime-tool-call.js +0 -1284
- package/dist/clients/runtime-tool-result.js +0 -2034
- package/dist/clients/runtime-turn.js +0 -3600
- package/dist/clients/rust-client.js +0 -97
- package/dist/clients/safe-spawn.js +0 -2166
- package/dist/clients/sanitize.js +0 -286
- package/dist/clients/scan-utils.js +0 -25
- package/dist/clients/scratch-tree-policy.js +0 -165
- package/dist/clients/search-read-registration.js +0 -94
- package/dist/clients/secret-findings.js +0 -114
- package/dist/clients/security-scan-client.js +0 -352
- package/dist/clients/session-event-guard.js +0 -297
- package/dist/clients/session-lifecycle.js +0 -484
- package/dist/clients/session-start-observability.js +0 -94
- package/dist/clients/session-state-store.js +0 -101
- package/dist/clients/session-summary.js +0 -15
- package/dist/clients/sessionstart-logger.js +0 -27
- package/dist/clients/sg-runner.js +0 -876
- package/dist/clients/sgconfig.js +0 -347
- package/dist/clients/shared-checkout-guard.js +0 -338
- package/dist/clients/single-flight.js +0 -158
- package/dist/clients/situational-tool-telemetry.js +0 -108
- package/dist/clients/skills-resolver.js +0 -141
- package/dist/clients/slow-fs.js +0 -138
- package/dist/clients/smells-rollup.js +0 -231
- package/dist/clients/source-filter.js +0 -596
- package/dist/clients/source-walker.js +0 -211
- package/dist/clients/spawn-output-cap.js +0 -37
- package/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/dist/clients/stale-marker.js +0 -17
- package/dist/clients/startup-scan.js +0 -400
- package/dist/clients/startup-timing.js +0 -130
- package/dist/clients/string-utils.js +0 -33
- package/dist/clients/subagent-mode.js +0 -111
- package/dist/clients/symbol-containment.js +0 -24
- package/dist/clients/symbol-types.js +0 -5
- package/dist/clients/test-runner-client.js +0 -2507
- package/dist/clients/test-runner-delivery.js +0 -287
- package/dist/clients/todo-scanner.js +0 -229
- package/dist/clients/tool-agreement.js +0 -423
- package/dist/clients/tool-config.js +0 -249
- package/dist/clients/tool-cwd.js +0 -270
- package/dist/clients/tool-definition.js +0 -47
- package/dist/clients/tool-event.js +0 -105
- package/dist/clients/tool-policy.js +0 -2755
- package/dist/clients/tool-probe.js +0 -53
- package/dist/clients/tool-render.js +0 -156
- package/dist/clients/tool-set-policy.js +0 -118
- package/dist/clients/tree-sitter-cache.js +0 -364
- package/dist/clients/tree-sitter-client.js +0 -4134
- package/dist/clients/tree-sitter-logger.js +0 -100
- package/dist/clients/tree-sitter-navigator.js +0 -269
- package/dist/clients/tree-sitter-query-loader.js +0 -569
- package/dist/clients/tree-sitter-shared.js +0 -158
- package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/dist/clients/trivy-client.js +0 -467
- package/dist/clients/tui-fit.js +0 -50
- package/dist/clients/turn-context.js +0 -52
- package/dist/clients/turn-summary-render.js +0 -72
- package/dist/clients/turn-summary.js +0 -132
- package/dist/clients/typos-config.js +0 -29
- package/dist/clients/user-notify.js +0 -51
- package/dist/clients/vanished-instance-marker.js +0 -57
- package/dist/clients/warm-attach.js +0 -246
- package/dist/clients/widget-state.js +0 -1677
- package/dist/clients/word-index-logger.js +0 -49
- package/dist/clients/word-index-store.js +0 -459
- package/dist/clients/word-index.js +0 -2080
- package/dist/clients/workspace-topology.js +0 -389
- package/dist/clients/write-ordering-guard.js +0 -65
- package/dist/clients/zizmor-config.js +0 -327
- package/dist/i18n.js +0 -69
- package/dist/mcp/build-staleness.js +0 -124
- package/dist/scripts/lib/process-scan.mjs +0 -583
- package/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/dist/tools/activate-tools.js +0 -87
- package/dist/tools/ast-grep-outline.js +0 -137
- package/dist/tools/ast-grep-replace.js +0 -244
- package/dist/tools/ast-grep-search.js +0 -762
- package/dist/tools/effective-config.js +0 -90
- package/dist/tools/lens-diagnostic-mark.js +0 -375
- package/dist/tools/lens-diagnostics.js +0 -2544
- package/dist/tools/lsp-diagnostics.js +0 -1634
- package/dist/tools/lsp-navigation.js +0 -1367
- package/dist/tools/lsp-structured-output.js +0 -294
- package/dist/tools/module-report.js +0 -382
- package/dist/tools/project-report.js +0 -86
- package/dist/tools/render-compact.js +0 -374
- package/dist/tools/scan-progress.js +0 -53
- package/dist/tools/shared.js +0 -29
- package/dist/tools/symbol-search.js +0 -155
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
2
|
-
function asRecord(value) {
|
|
3
|
-
return typeof value === "object" && value !== null
|
|
4
|
-
? value
|
|
5
|
-
: undefined;
|
|
6
|
-
}
|
|
7
|
-
function finiteNumber(value) {
|
|
8
|
-
return typeof value === "number" && Number.isFinite(value)
|
|
9
|
-
? value
|
|
10
|
-
: undefined;
|
|
11
|
-
}
|
|
12
|
-
function lspStatusFromFailureKind(failureKind) {
|
|
13
|
-
if (failureKind === "success" || failureKind === "fallback_success") {
|
|
14
|
-
return "success";
|
|
15
|
-
}
|
|
16
|
-
if (failureKind === "empty_result")
|
|
17
|
-
return "empty";
|
|
18
|
-
if (failureKind === "unsupported")
|
|
19
|
-
return "unsupported";
|
|
20
|
-
if (failureKind === "bad_input" ||
|
|
21
|
-
failureKind === "invalid_operation" ||
|
|
22
|
-
failureKind === "missing_file_path") {
|
|
23
|
-
return "bad_input";
|
|
24
|
-
}
|
|
25
|
-
if (failureKind === "no_server")
|
|
26
|
-
return "no_server";
|
|
27
|
-
if (failureKind === "lsp_disabled")
|
|
28
|
-
return "lsp_disabled";
|
|
29
|
-
if (failureKind === "filepath_is_directory")
|
|
30
|
-
return "filepath_is_directory";
|
|
31
|
-
if (failureKind === "tracked_snapshot")
|
|
32
|
-
return "tracked_snapshot";
|
|
33
|
-
return "error";
|
|
34
|
-
}
|
|
35
|
-
function lspToolLocationFromUriRange(uri, range) {
|
|
36
|
-
if (typeof uri !== "string" || !uri.startsWith("file:"))
|
|
37
|
-
return undefined;
|
|
38
|
-
const rangeLike = asRecord(range);
|
|
39
|
-
const startLine = finiteNumber(rangeLike?.start?.line);
|
|
40
|
-
const startCharacter = finiteNumber(rangeLike?.start?.character);
|
|
41
|
-
const endLine = finiteNumber(rangeLike?.end?.line);
|
|
42
|
-
const endCharacter = finiteNumber(rangeLike?.end?.character);
|
|
43
|
-
if (startLine === undefined ||
|
|
44
|
-
startCharacter === undefined ||
|
|
45
|
-
endLine === undefined ||
|
|
46
|
-
endCharacter === undefined) {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
try {
|
|
50
|
-
return {
|
|
51
|
-
uri,
|
|
52
|
-
filePath: fileURLToPath(uri),
|
|
53
|
-
// LLM-facing coordinates: 1-based, matching editor/tool params.
|
|
54
|
-
range: {
|
|
55
|
-
start: {
|
|
56
|
-
line: Math.floor(startLine) + 1,
|
|
57
|
-
character: Math.floor(startCharacter) + 1,
|
|
58
|
-
},
|
|
59
|
-
end: {
|
|
60
|
-
line: Math.floor(endLine) + 1,
|
|
61
|
-
character: Math.floor(endCharacter) + 1,
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
function lspToolLocationFromFileRange(filePath, range) {
|
|
71
|
-
if (!filePath || filePath === "(workspace)")
|
|
72
|
-
return undefined;
|
|
73
|
-
const rangeLike = asRecord(range);
|
|
74
|
-
const startLine = finiteNumber(rangeLike?.start?.line);
|
|
75
|
-
const startCharacter = finiteNumber(rangeLike?.start?.character);
|
|
76
|
-
const endLine = finiteNumber(rangeLike?.end?.line);
|
|
77
|
-
const endCharacter = finiteNumber(rangeLike?.end?.character);
|
|
78
|
-
if (startLine === undefined ||
|
|
79
|
-
startCharacter === undefined ||
|
|
80
|
-
endLine === undefined ||
|
|
81
|
-
endCharacter === undefined) {
|
|
82
|
-
return undefined;
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
uri: pathToFileURL(filePath).href,
|
|
86
|
-
filePath,
|
|
87
|
-
range: {
|
|
88
|
-
start: {
|
|
89
|
-
line: Math.floor(startLine) + 1,
|
|
90
|
-
character: Math.floor(startCharacter) + 1,
|
|
91
|
-
},
|
|
92
|
-
end: {
|
|
93
|
-
line: Math.floor(endLine) + 1,
|
|
94
|
-
character: Math.floor(endCharacter) + 1,
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
function pushToolLocation(out, uri, range) {
|
|
100
|
-
const loc = lspToolLocationFromUriRange(uri, range);
|
|
101
|
-
if (loc)
|
|
102
|
-
out.push(loc);
|
|
103
|
-
}
|
|
104
|
-
function collectLocationSummaries(result, filePath) {
|
|
105
|
-
const out = [];
|
|
106
|
-
for (const entry of Array.isArray(result) ? result : [result]) {
|
|
107
|
-
const record = asRecord(entry);
|
|
108
|
-
if (!record)
|
|
109
|
-
continue;
|
|
110
|
-
pushToolLocation(out, record.uri, record.range);
|
|
111
|
-
pushToolLocation(out, record.targetUri, record.targetSelectionRange ?? record.targetRange);
|
|
112
|
-
if (!record.uri && !record.targetUri) {
|
|
113
|
-
const local = lspToolLocationFromFileRange(filePath, record.range);
|
|
114
|
-
let alreadyIncluded = false;
|
|
115
|
-
for (const loc of out) {
|
|
116
|
-
if (loc.uri === local?.uri) {
|
|
117
|
-
alreadyIncluded = true;
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
if (local && !alreadyIncluded)
|
|
122
|
-
out.push(local);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return out;
|
|
126
|
-
}
|
|
127
|
-
function collectWorkspaceSymbolLocationSummaries(result) {
|
|
128
|
-
const out = [];
|
|
129
|
-
for (const entry of Array.isArray(result) ? result : [result]) {
|
|
130
|
-
const symbol = asRecord(entry);
|
|
131
|
-
const location = asRecord(symbol?.location);
|
|
132
|
-
if (!location)
|
|
133
|
-
continue;
|
|
134
|
-
pushToolLocation(out, location.uri, location.range);
|
|
135
|
-
pushToolLocation(out, location.targetUri, location.targetSelectionRange ?? location.targetRange);
|
|
136
|
-
}
|
|
137
|
-
return out;
|
|
138
|
-
}
|
|
139
|
-
function collectCallHierarchyLocationSummaries(result, operation) {
|
|
140
|
-
const out = [];
|
|
141
|
-
for (const entry of Array.isArray(result) ? result : [result]) {
|
|
142
|
-
const record = asRecord(entry);
|
|
143
|
-
const item = asRecord(operation === "incomingCalls" ? record?.from : record?.to);
|
|
144
|
-
pushToolLocation(out, item?.uri, item?.selectionRange ?? item?.range);
|
|
145
|
-
}
|
|
146
|
-
return out;
|
|
147
|
-
}
|
|
148
|
-
function collectLspToolLocationsForOperation(operation, result, filePath) {
|
|
149
|
-
if ([
|
|
150
|
-
"definition",
|
|
151
|
-
"typeDefinition",
|
|
152
|
-
"declaration",
|
|
153
|
-
"references",
|
|
154
|
-
"implementation",
|
|
155
|
-
"prepareCallHierarchy",
|
|
156
|
-
].includes(operation)) {
|
|
157
|
-
return collectLocationSummaries(result, filePath);
|
|
158
|
-
}
|
|
159
|
-
if (operation === "workspaceSymbol") {
|
|
160
|
-
return collectWorkspaceSymbolLocationSummaries(result);
|
|
161
|
-
}
|
|
162
|
-
if (operation === "documentSymbol" || operation === "findSymbol") {
|
|
163
|
-
return collectLocationSummaries(result, filePath);
|
|
164
|
-
}
|
|
165
|
-
if (operation === "incomingCalls" || operation === "outgoingCalls") {
|
|
166
|
-
return collectCallHierarchyLocationSummaries(result, operation);
|
|
167
|
-
}
|
|
168
|
-
return [];
|
|
169
|
-
}
|
|
170
|
-
function parseBalancedJsonPrefix(text) {
|
|
171
|
-
const trimmed = text.trim();
|
|
172
|
-
const start = trimmed.search(/[[{]/);
|
|
173
|
-
if (start < 0)
|
|
174
|
-
return undefined;
|
|
175
|
-
const open = trimmed[start];
|
|
176
|
-
const close = open === "[" ? "]" : "}";
|
|
177
|
-
let depth = 0;
|
|
178
|
-
let inString = false;
|
|
179
|
-
let escaped = false;
|
|
180
|
-
for (let i = start; i < trimmed.length; i += 1) {
|
|
181
|
-
const ch = trimmed[i];
|
|
182
|
-
if (inString) {
|
|
183
|
-
if (escaped)
|
|
184
|
-
escaped = false;
|
|
185
|
-
else if (ch === "\\")
|
|
186
|
-
escaped = true;
|
|
187
|
-
else if (ch === '"')
|
|
188
|
-
inString = false;
|
|
189
|
-
continue;
|
|
190
|
-
}
|
|
191
|
-
if (ch === '"') {
|
|
192
|
-
inString = true;
|
|
193
|
-
continue;
|
|
194
|
-
}
|
|
195
|
-
if (ch === open)
|
|
196
|
-
depth += 1;
|
|
197
|
-
if (ch === close)
|
|
198
|
-
depth -= 1;
|
|
199
|
-
if (depth === 0) {
|
|
200
|
-
try {
|
|
201
|
-
return {
|
|
202
|
-
value: JSON.parse(trimmed.slice(start, i + 1)),
|
|
203
|
-
rest: trimmed.slice(i + 1).trim(),
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
catch {
|
|
207
|
-
return undefined;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
return undefined;
|
|
212
|
-
}
|
|
213
|
-
function parseLspNavigationTextPayload(text) {
|
|
214
|
-
const notes = [];
|
|
215
|
-
const hints = [];
|
|
216
|
-
const errors = [];
|
|
217
|
-
const trimmed = text.trim();
|
|
218
|
-
if (!trimmed)
|
|
219
|
-
return { notes, hints, errors };
|
|
220
|
-
try {
|
|
221
|
-
return { result: JSON.parse(trimmed), notes, hints, errors };
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
// Continue with note/hint extraction and balanced-prefix parsing.
|
|
225
|
-
}
|
|
226
|
-
const lines = trimmed.split(/\r?\n/);
|
|
227
|
-
let jsonCandidate = trimmed;
|
|
228
|
-
if (/^Note:/i.test(lines[0] ?? "") && lines.length > 1) {
|
|
229
|
-
notes.push((lines.shift() ?? "").replace(/^Note:\s*/i, ""));
|
|
230
|
-
jsonCandidate = lines.join("\n").trim();
|
|
231
|
-
}
|
|
232
|
-
const parsed = parseBalancedJsonPrefix(jsonCandidate);
|
|
233
|
-
if (parsed) {
|
|
234
|
-
for (const entry of parsed.rest.split(/\r?\n/)) {
|
|
235
|
-
const line = entry.trim();
|
|
236
|
-
if (!line)
|
|
237
|
-
continue;
|
|
238
|
-
if (/^Hint:/i.test(line))
|
|
239
|
-
hints.push(line.replace(/^Hint:\s*/i, ""));
|
|
240
|
-
else if (/^Note:/i.test(line))
|
|
241
|
-
notes.push(line.replace(/^Note:\s*/i, ""));
|
|
242
|
-
else
|
|
243
|
-
notes.push(line);
|
|
244
|
-
}
|
|
245
|
-
return { result: parsed.value, notes, hints, errors };
|
|
246
|
-
}
|
|
247
|
-
for (const entry of lines) {
|
|
248
|
-
const line = entry.trim();
|
|
249
|
-
if (!line)
|
|
250
|
-
continue;
|
|
251
|
-
if (/^Hint:/i.test(line))
|
|
252
|
-
hints.push(line.replace(/^Hint:\s*/i, ""));
|
|
253
|
-
else if (/^Note:/i.test(line))
|
|
254
|
-
notes.push(line.replace(/^Note:\s*/i, ""));
|
|
255
|
-
else if (/^LSP error:/i.test(line))
|
|
256
|
-
errors.push(line);
|
|
257
|
-
else
|
|
258
|
-
notes.push(line);
|
|
259
|
-
}
|
|
260
|
-
return { notes, hints, errors };
|
|
261
|
-
}
|
|
262
|
-
function withoutUndefined(value) {
|
|
263
|
-
for (const key of Object.keys(value)) {
|
|
264
|
-
if (value[key] === undefined)
|
|
265
|
-
delete value[key];
|
|
266
|
-
}
|
|
267
|
-
return value;
|
|
268
|
-
}
|
|
269
|
-
export function buildLspNavigationEnvelope(options) {
|
|
270
|
-
const parsed = parseLspNavigationTextPayload(options.text ?? "");
|
|
271
|
-
const status = lspStatusFromFailureKind(options.failureKind);
|
|
272
|
-
const result = parsed.result;
|
|
273
|
-
const notes = [...parsed.notes];
|
|
274
|
-
const hints = [...parsed.hints];
|
|
275
|
-
const errors = [...parsed.errors];
|
|
276
|
-
if (options.isError && errors.length === 0 && (options.text ?? "").trim()) {
|
|
277
|
-
errors.push((options.text ?? "").trim());
|
|
278
|
-
}
|
|
279
|
-
const locations = collectLspToolLocationsForOperation(options.operation, result, options.filePath ?? "");
|
|
280
|
-
return withoutUndefined({
|
|
281
|
-
tool: "lsp_navigation",
|
|
282
|
-
operation: options.operation,
|
|
283
|
-
ok: !options.isError,
|
|
284
|
-
status,
|
|
285
|
-
filePath: options.filePath,
|
|
286
|
-
resultCount: options.resultCount,
|
|
287
|
-
result,
|
|
288
|
-
locations: locations.length > 0 ? locations : undefined,
|
|
289
|
-
notes: notes.length > 0 ? notes : undefined,
|
|
290
|
-
hints: hints.length > 0 ? hints : undefined,
|
|
291
|
-
errors: errors.length > 0 ? errors : undefined,
|
|
292
|
-
metadata: options.details,
|
|
293
|
-
});
|
|
294
|
-
}
|
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* module_report + read_symbol tool definitions (#245).
|
|
3
|
-
*
|
|
4
|
-
* Agent-facing surface for the structured read-substitute flow: module_report
|
|
5
|
-
* gives a navigable overview of a module (outline + signatures + who-uses-this +
|
|
6
|
-
* ready-to-use read args); read_symbol returns one symbol's verbatim body;
|
|
7
|
-
* read_enclosing maps a file+line search/diagnostic hit to the smallest enclosing
|
|
8
|
-
* symbol/callback body. The exact-body tools wire the read-guard tie-in — a body
|
|
9
|
-
* they return is recorded as a genuine read of that range (module_report
|
|
10
|
-
* deliberately does not, since an outline is shape, not body).
|
|
11
|
-
*/
|
|
12
|
-
import * as path from "node:path";
|
|
13
|
-
import { Type } from "../clients/deps/typebox.js";
|
|
14
|
-
import { logLatency } from "../clients/latency-logger.js";
|
|
15
|
-
import { moduleReport, readEnclosing, readSymbol, renderCompactModuleReport, } from "../clients/module-report.js";
|
|
16
|
-
import { baseName, compactRenderResult } from "./render-compact.js";
|
|
17
|
-
function resolveFile(filePath, cwd) {
|
|
18
|
-
return path.isAbsolute(filePath)
|
|
19
|
-
? filePath
|
|
20
|
-
: path.resolve(cwd || ".", filePath);
|
|
21
|
-
}
|
|
22
|
-
function errorMessage(err) {
|
|
23
|
-
return err instanceof Error ? err.message : String(err);
|
|
24
|
-
}
|
|
25
|
-
export function createModuleReportTool(getProjectRoot) {
|
|
26
|
-
return {
|
|
27
|
-
name: "module_report",
|
|
28
|
-
label: "Module Report",
|
|
29
|
-
description: "Return a navigable source-module outline with symbols, references, and read handles. An outline shows shape, not bodies, and does not satisfy read-before-edit; `read_symbol` and `read_enclosing` return body text and record read coverage. On a cold cache, project_report and symbol_search return available: false with a retry hint and start a non-blocking background build; module_report degrades to outline-only with cache freshness explicit. Example: use module_report on `src/app.ts` before read_symbol.",
|
|
30
|
-
promptSnippet: "Outline a source module before reading a body",
|
|
31
|
-
renderResult: compactRenderResult(({ details, args, isError }) => {
|
|
32
|
-
const base = baseName(args.path) || "module";
|
|
33
|
-
if (isError || details?.available === false) {
|
|
34
|
-
return `module_report ${base} — unavailable`;
|
|
35
|
-
}
|
|
36
|
-
const parts = [
|
|
37
|
-
`${details?.symbols ?? 0} symbols`,
|
|
38
|
-
`${details?.exports ?? 0} exports`,
|
|
39
|
-
];
|
|
40
|
-
if (details?.callbacks)
|
|
41
|
-
parts.push(`${details.callbacks} callbacks`);
|
|
42
|
-
const view = details?.view && details.view !== "default" ? ` [${details.view}]` : "";
|
|
43
|
-
return `module_report ${base} ${parts.join(" · ")}${view}`;
|
|
44
|
-
}),
|
|
45
|
-
parameters: Type.Object({
|
|
46
|
-
path: Type.String({
|
|
47
|
-
description: "Source file, e.g. `src/app.ts`.",
|
|
48
|
-
}),
|
|
49
|
-
maxRefsPerSymbol: Type.Optional(Type.Number({
|
|
50
|
-
description: "Cap on who-uses-this entries per symbol (default 10).",
|
|
51
|
-
})),
|
|
52
|
-
focus: Type.Optional(Type.String({
|
|
53
|
-
description: "Optional task hint used only to rank recommendedReads (does not expand scope or trigger scans).",
|
|
54
|
-
})),
|
|
55
|
-
view: Type.Optional(Type.String({
|
|
56
|
-
enum: ["summary", "default", "compact"],
|
|
57
|
-
description: "Payload tier. summary returns top-level entries/recommendedReads and section provenance with heavy callback/usedBy/blast-radius payloads omitted. compact (cheapest) returns a line-oriented TEXT rendering of the full report instead of JSON.",
|
|
58
|
-
})),
|
|
59
|
-
blastRadius: Type.Optional(Type.Boolean({
|
|
60
|
-
description: "Include the cross-file blast-radius section: transitive dependents aggregated to ranked file reads. Read-only over the cached graph (omitted when cold).",
|
|
61
|
-
})),
|
|
62
|
-
blastRadiusDepth: Type.Optional(Type.Number({
|
|
63
|
-
description: "Max hops for the blast-radius walk (default 3). Only used with blastRadius.",
|
|
64
|
-
})),
|
|
65
|
-
callGraph: Type.Optional(Type.Boolean({
|
|
66
|
-
description: "Include bounded derived callers/callees from the cached FunctionCallGraph; cold or stale cache state is explicit.",
|
|
67
|
-
})),
|
|
68
|
-
maxCallGraphEntries: Type.Optional(Type.Number({
|
|
69
|
-
description: "Per-direction cap for call-graph relations (default 20).",
|
|
70
|
-
})),
|
|
71
|
-
}),
|
|
72
|
-
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
73
|
-
// Resolve the file against the agent's cwd (sibling-tool convention); build
|
|
74
|
-
// the review graph at the project root so cross-file who-uses-this is whole.
|
|
75
|
-
const absFile = resolveFile(params.path, ctx.cwd);
|
|
76
|
-
const cwd = getProjectRoot() || ctx.cwd || ".";
|
|
77
|
-
let report;
|
|
78
|
-
try {
|
|
79
|
-
report = await moduleReport(absFile, cwd, {
|
|
80
|
-
maxRefsPerSymbol: params.maxRefsPerSymbol,
|
|
81
|
-
focus: params.focus,
|
|
82
|
-
view: params.view,
|
|
83
|
-
blastRadius: params.blastRadius,
|
|
84
|
-
blastRadiusDepth: params.blastRadiusDepth,
|
|
85
|
-
callGraph: params.callGraph,
|
|
86
|
-
maxCallGraphEntries: params.maxCallGraphEntries,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
catch (err) {
|
|
90
|
-
return {
|
|
91
|
-
content: [
|
|
92
|
-
{
|
|
93
|
-
type: "text",
|
|
94
|
-
text: `Module report failed for ${path.basename(absFile)}: ${errorMessage(err)}`,
|
|
95
|
-
},
|
|
96
|
-
],
|
|
97
|
-
isError: true,
|
|
98
|
-
details: { available: false },
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
// view:"compact" renders the report as line-oriented text (roughly a
|
|
102
|
-
// quarter of the JSON cost for the same info) instead of JSON. Every
|
|
103
|
-
// other view returns compact (unindented) JSON — omitting indentation
|
|
104
|
-
// alone saves ~30% on the wire without changing the schema. Tests use
|
|
105
|
-
// JSON.parse for the JSON views, so they are agnostic to whitespace.
|
|
106
|
-
const text = params.view === "compact"
|
|
107
|
-
? renderCompactModuleReport(report)
|
|
108
|
-
: JSON.stringify(report);
|
|
109
|
-
return {
|
|
110
|
-
content: [{ type: "text", text }],
|
|
111
|
-
isError: !report.available,
|
|
112
|
-
details: {
|
|
113
|
-
available: report.available,
|
|
114
|
-
staleness: report.staleness,
|
|
115
|
-
symbols: report.summary.symbols,
|
|
116
|
-
exports: report.summary.exports,
|
|
117
|
-
callbacks: report.callbacks.length,
|
|
118
|
-
callbackSupport: report.callbackSupport,
|
|
119
|
-
view: report.view ?? "default",
|
|
120
|
-
},
|
|
121
|
-
};
|
|
122
|
-
},
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
function recordReadCoverage(recordSymbolRead, result, phase) {
|
|
126
|
-
if (!result.name ||
|
|
127
|
-
!result.kind ||
|
|
128
|
-
typeof result.startLine !== "number" ||
|
|
129
|
-
typeof result.endLine !== "number") {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
try {
|
|
133
|
-
recordSymbolRead(result.path, {
|
|
134
|
-
name: result.name,
|
|
135
|
-
kind: result.kind,
|
|
136
|
-
startLine: result.startLine,
|
|
137
|
-
endLine: result.endLine,
|
|
138
|
-
});
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
catch (err) {
|
|
142
|
-
logLatency({
|
|
143
|
-
type: "phase",
|
|
144
|
-
phase,
|
|
145
|
-
filePath: result.path,
|
|
146
|
-
durationMs: 0,
|
|
147
|
-
metadata: { error: errorMessage(err) },
|
|
148
|
-
});
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
export function createReadSymbolTool(getProjectRoot, recordSymbolRead) {
|
|
153
|
-
return {
|
|
154
|
-
name: "read_symbol",
|
|
155
|
-
label: "Read Symbol",
|
|
156
|
-
description: "Return one symbol's verbatim source. An outline shows shape, not bodies, and does not satisfy read-before-edit; `read_symbol` and `read_enclosing` return body text and record read coverage. Example: use read_symbol after module_report identifies `parseConfig`.",
|
|
157
|
-
promptSnippet: "Read one symbol's body instead of the whole file",
|
|
158
|
-
renderResult: compactRenderResult(({ details, args, isError, lineCount }) => {
|
|
159
|
-
const base = baseName(args.path);
|
|
160
|
-
if (isError || details?.found === false) {
|
|
161
|
-
const sym = typeof args.symbol === "string" ? args.symbol : "?";
|
|
162
|
-
return `read_symbol "${sym}" ${base} — not found`;
|
|
163
|
-
}
|
|
164
|
-
const range = details?.startLine && details?.endLine
|
|
165
|
-
? `:${details.startLine}-${details.endLine} (${details.endLine - details.startLine + 1} lines)`
|
|
166
|
-
: ` (${lineCount} lines)`;
|
|
167
|
-
return `read_symbol ${details?.kind ?? ""} ${details?.name ?? ""} ${base}${range}`.replace(/\s+/g, " ");
|
|
168
|
-
}),
|
|
169
|
-
parameters: Type.Object({
|
|
170
|
-
path: Type.String({
|
|
171
|
-
description: "Absolute or workspace-relative path to the source file.",
|
|
172
|
-
}),
|
|
173
|
-
symbol: Type.String({
|
|
174
|
-
description: "Exact symbol name or callback handle to read (e.g. a function, class, type, or module_report callbacks[].name). Accepts a dotted `Class.method` name to resolve a member.",
|
|
175
|
-
}),
|
|
176
|
-
kind: Type.Optional(Type.String({
|
|
177
|
-
description: "Optional kind filter (e.g. function, interface, class) to disambiguate when multiple same-file symbols share the requested name. Omitting it returns the first match, same as today.",
|
|
178
|
-
})),
|
|
179
|
-
}),
|
|
180
|
-
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
181
|
-
const absFile = resolveFile(params.path, ctx.cwd);
|
|
182
|
-
const cwd = getProjectRoot() || ctx.cwd || ".";
|
|
183
|
-
let result;
|
|
184
|
-
try {
|
|
185
|
-
result = await readSymbol(absFile, params.symbol, cwd, {
|
|
186
|
-
kind: params.kind,
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
catch (err) {
|
|
190
|
-
return {
|
|
191
|
-
content: [
|
|
192
|
-
{
|
|
193
|
-
type: "text",
|
|
194
|
-
text: `Read symbol failed for ${path.basename(absFile)}: ${errorMessage(err)}`,
|
|
195
|
-
},
|
|
196
|
-
],
|
|
197
|
-
isError: true,
|
|
198
|
-
details: { found: false },
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
if (!result.found) {
|
|
202
|
-
const warningSuffix = result.warnings?.length
|
|
203
|
-
? ` Warnings: ${result.warnings.join("; ")}`
|
|
204
|
-
: "";
|
|
205
|
-
const suggestionSuffix = result.suggestions?.length
|
|
206
|
-
? ` Did you mean: ${result.suggestions.join(", ")}?`
|
|
207
|
-
: " Use module_report to list available symbols.";
|
|
208
|
-
const text = result.error
|
|
209
|
-
? `Could not inspect ${path.basename(absFile)}: ${result.error}${warningSuffix}`
|
|
210
|
-
: `Symbol "${params.symbol}" not found in ${path.basename(absFile)}.${suggestionSuffix}${warningSuffix}`;
|
|
211
|
-
return {
|
|
212
|
-
content: [{ type: "text", text }],
|
|
213
|
-
isError: true,
|
|
214
|
-
details: {
|
|
215
|
-
found: false,
|
|
216
|
-
...(result.error ? { error: result.error } : {}),
|
|
217
|
-
...(result.warnings ? { warnings: result.warnings } : {}),
|
|
218
|
-
...(result.suggestions ? { suggestions: result.suggestions } : {}),
|
|
219
|
-
},
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
// Read-substitute tie-in (#245): a readSymbol body IS a real read of that
|
|
223
|
-
// range, so record it as read-guard coverage for the symbol. Keep the tool
|
|
224
|
-
// response useful even if the guard hook itself fails; surface that fact in
|
|
225
|
-
// details so callers know the returned body may not unlock a later edit.
|
|
226
|
-
const readRecorded = recordReadCoverage(recordSymbolRead, result, "read_symbol_guard_error");
|
|
227
|
-
const ambiguityNote = result.ambiguous
|
|
228
|
-
? ` (${result.ambiguous.count} matches — returned the ${result.kind}; pass \`kind\` to disambiguate: ${result.ambiguous.kinds.join(", ")})`
|
|
229
|
-
: "";
|
|
230
|
-
const header = `${result.kind} ${result.name}${ambiguityNote} ${path.basename(result.path)}:${result.startLine}-${result.endLine}`;
|
|
231
|
-
const guardWarning = readRecorded
|
|
232
|
-
? ""
|
|
233
|
-
: "\n\nWarning: read coverage recording failed; the returned body may not satisfy the edit guard.";
|
|
234
|
-
return {
|
|
235
|
-
content: [
|
|
236
|
-
{
|
|
237
|
-
type: "text",
|
|
238
|
-
text: `${header}${guardWarning}\n\n${result.source ?? ""}`,
|
|
239
|
-
},
|
|
240
|
-
],
|
|
241
|
-
details: {
|
|
242
|
-
found: true,
|
|
243
|
-
name: result.name,
|
|
244
|
-
kind: result.kind,
|
|
245
|
-
startLine: result.startLine,
|
|
246
|
-
endLine: result.endLine,
|
|
247
|
-
readRecorded,
|
|
248
|
-
...(result.ambiguous ? { ambiguous: result.ambiguous } : {}),
|
|
249
|
-
},
|
|
250
|
-
};
|
|
251
|
-
},
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
export function createReadEnclosingTool(getProjectRoot, recordSymbolRead) {
|
|
255
|
-
return {
|
|
256
|
-
name: "read_enclosing",
|
|
257
|
-
label: "Read Enclosing",
|
|
258
|
-
description: "Return the smallest symbol or callback enclosing a line. An outline shows shape, not bodies, and does not satisfy read-before-edit; `read_symbol` and `read_enclosing` return body text and record read coverage. Example: use read_enclosing after a diagnostic points to line 42.",
|
|
259
|
-
promptSnippet: "Read the enclosing symbol or callback body for a line",
|
|
260
|
-
renderResult: compactRenderResult(({ details, args, isError }) => {
|
|
261
|
-
const base = baseName(args.path);
|
|
262
|
-
if (isError || details?.found === false) {
|
|
263
|
-
const ln = typeof args.line === "number" ? args.line : "?";
|
|
264
|
-
return `read_enclosing ${base}:${ln} — no enclosing symbol`;
|
|
265
|
-
}
|
|
266
|
-
const range = details?.startLine && details?.endLine
|
|
267
|
-
? `:${details.startLine}-${details.endLine}`
|
|
268
|
-
: "";
|
|
269
|
-
return `read_enclosing ${details?.kind ?? ""} ${details?.name ?? ""} ${base}${range}`.replace(/\s+/g, " ");
|
|
270
|
-
}),
|
|
271
|
-
parameters: Type.Object({
|
|
272
|
-
path: Type.String({
|
|
273
|
-
description: "Absolute or workspace-relative path to the source file.",
|
|
274
|
-
}),
|
|
275
|
-
line: Type.Number({
|
|
276
|
-
description: "1-based line number inside the desired symbol/callback.",
|
|
277
|
-
}),
|
|
278
|
-
kinds: Type.Optional(Type.Array(Type.String(), {
|
|
279
|
-
description: "Optional kind filter, e.g. function, method, callback, class, object_property_callback.",
|
|
280
|
-
})),
|
|
281
|
-
maxLines: Type.Optional(Type.Number({
|
|
282
|
-
description: "Optional maximum body size to return. Oversized matches obey onOversize.",
|
|
283
|
-
})),
|
|
284
|
-
onOversize: Type.Optional(Type.String({
|
|
285
|
-
enum: ["error", "slice", "outline"],
|
|
286
|
-
description: "Behavior when the enclosing body exceeds maxLines. error (default) returns metadata only; slice returns a bounded partial read around line; outline returns nested symbols/callbacks with read handles.",
|
|
287
|
-
})),
|
|
288
|
-
aroundLine: Type.Optional(Type.Number({
|
|
289
|
-
description: "Maximum lines for onOversize=slice; defaults to maxLines, then 80.",
|
|
290
|
-
})),
|
|
291
|
-
}),
|
|
292
|
-
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
293
|
-
const absFile = resolveFile(params.path, ctx.cwd);
|
|
294
|
-
const cwd = getProjectRoot() || ctx.cwd || ".";
|
|
295
|
-
let result;
|
|
296
|
-
try {
|
|
297
|
-
result = await readEnclosing(absFile, params.line, cwd, {
|
|
298
|
-
kinds: params.kinds,
|
|
299
|
-
maxLines: params.maxLines,
|
|
300
|
-
onOversize: params.onOversize,
|
|
301
|
-
aroundLine: params.aroundLine,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
catch (err) {
|
|
305
|
-
return {
|
|
306
|
-
content: [
|
|
307
|
-
{
|
|
308
|
-
type: "text",
|
|
309
|
-
text: `Read enclosing failed for ${path.basename(absFile)}:${params.line}: ${errorMessage(err)}`,
|
|
310
|
-
},
|
|
311
|
-
],
|
|
312
|
-
isError: true,
|
|
313
|
-
details: { found: false },
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
if (!result.found) {
|
|
317
|
-
const warningSuffix = result.warnings?.length
|
|
318
|
-
? ` Warnings: ${result.warnings.join("; ")}`
|
|
319
|
-
: "";
|
|
320
|
-
const outlineSuffix = result.outline?.length
|
|
321
|
-
? `\n\nNested outline:\n${JSON.stringify(result.outline)}`
|
|
322
|
-
: "";
|
|
323
|
-
const text = result.error
|
|
324
|
-
? `Could not read enclosing range in ${path.basename(absFile)}:${result.line}: ${result.error}${warningSuffix}${outlineSuffix}`
|
|
325
|
-
: `No enclosing symbol/callback found in ${path.basename(absFile)}:${result.line}.${warningSuffix}`;
|
|
326
|
-
return {
|
|
327
|
-
content: [{ type: "text", text }],
|
|
328
|
-
isError: true,
|
|
329
|
-
details: {
|
|
330
|
-
found: false,
|
|
331
|
-
line: result.line,
|
|
332
|
-
...(result.name ? { name: result.name } : {}),
|
|
333
|
-
...(result.kind ? { kind: result.kind } : {}),
|
|
334
|
-
...(result.startLine ? { startLine: result.startLine } : {}),
|
|
335
|
-
...(result.endLine ? { endLine: result.endLine } : {}),
|
|
336
|
-
...(result.enclosingStartLine
|
|
337
|
-
? { enclosingStartLine: result.enclosingStartLine }
|
|
338
|
-
: {}),
|
|
339
|
-
...(result.enclosingEndLine
|
|
340
|
-
? { enclosingEndLine: result.enclosingEndLine }
|
|
341
|
-
: {}),
|
|
342
|
-
...(result.selection ? { selection: result.selection } : {}),
|
|
343
|
-
...(result.outline ? { outline: result.outline } : {}),
|
|
344
|
-
...(result.error ? { error: result.error } : {}),
|
|
345
|
-
...(result.warnings ? { warnings: result.warnings } : {}),
|
|
346
|
-
},
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
const readRecorded = recordReadCoverage(recordSymbolRead, result, "read_enclosing_guard_error");
|
|
350
|
-
const range = result.partial
|
|
351
|
-
? `${result.startLine}-${result.endLine} (partial of ${result.enclosingStartLine}-${result.enclosingEndLine})`
|
|
352
|
-
: `${result.startLine}-${result.endLine}`;
|
|
353
|
-
const header = `${result.kind} ${result.name} ${path.basename(result.path)}:${range}`;
|
|
354
|
-
const guardWarning = readRecorded
|
|
355
|
-
? ""
|
|
356
|
-
: "\n\nWarning: read coverage recording failed; the returned body may not satisfy the edit guard.";
|
|
357
|
-
return {
|
|
358
|
-
content: [
|
|
359
|
-
{
|
|
360
|
-
type: "text",
|
|
361
|
-
text: `${header}${guardWarning}\n\n${result.source ?? ""}`,
|
|
362
|
-
},
|
|
363
|
-
],
|
|
364
|
-
details: {
|
|
365
|
-
found: true,
|
|
366
|
-
name: result.name,
|
|
367
|
-
kind: result.kind,
|
|
368
|
-
line: result.line,
|
|
369
|
-
startLine: result.startLine,
|
|
370
|
-
endLine: result.endLine,
|
|
371
|
-
enclosingStartLine: result.enclosingStartLine,
|
|
372
|
-
enclosingEndLine: result.enclosingEndLine,
|
|
373
|
-
parentChain: result.parentChain,
|
|
374
|
-
partial: result.partial,
|
|
375
|
-
selection: result.selection,
|
|
376
|
-
readRecorded,
|
|
377
|
-
...(result.warnings ? { warnings: result.warnings } : {}),
|
|
378
|
-
},
|
|
379
|
-
};
|
|
380
|
-
},
|
|
381
|
-
};
|
|
382
|
-
}
|