@herbertgao/pi-extensions 2026.10.1 → 2026.10.2
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/README.md +13 -9
- package/THIRD_PARTY_NOTICES.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +1 -1
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-help.md +1 -1
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +2 -2
- package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +1 -1
- package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +21 -21
- package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +1 -1
- package/node_modules/@dietrichgebert/ponytail/AGENTS.md +21 -21
- package/node_modules/@dietrichgebert/ponytail/README.md +68 -72
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +7 -0
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +30 -30
- package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-map.js +103 -0
- package/node_modules/@dietrichgebert/ponytail/package.json +2 -2
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +33 -101
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +89 -32
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +13 -12
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +17 -16
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +9 -10
- package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +96 -57
- package/node_modules/@herbertgao/pi-agency/LICENSE +21 -0
- package/node_modules/@herbertgao/pi-agency/README.md +40 -0
- package/node_modules/@herbertgao/pi-agency/package.json +53 -0
- package/node_modules/@herbertgao/pi-agency/src/index.ts +441 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +12 -12
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +30 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +15 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +27 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +4 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +2 -2
- package/node_modules/@narumitw/pi-caffeinate/package.json +3 -3
- package/node_modules/@tifan/pi-mermaid-open/package.json +5 -1
- package/node_modules/@tifan/pi-mermaid-open/src/index.ts +26 -9
- package/node_modules/@tifan/pi-recap/package.json +1 -1
- package/node_modules/@tifan/pi-recap/src/index.ts +104 -20
- package/node_modules/@tifan/pi-recap/src/models.ts +46 -4
- package/node_modules/pi-antigravity/README.md +23 -2
- package/node_modules/pi-antigravity/package.json +5 -3
- package/node_modules/pi-antigravity/src/diagnostics/diagnostics.ts +3 -2
- package/node_modules/pi-antigravity/src/features/generate-image.ts +72 -0
- package/node_modules/pi-antigravity/src/features/google-search.ts +71 -0
- package/node_modules/pi-antigravity/src/image/image.ts +86 -47
- package/node_modules/pi-antigravity/src/image/native.ts +69 -0
- package/node_modules/pi-antigravity/src/index.ts +52 -137
- package/node_modules/pi-antigravity/src/search/search.ts +130 -31
- package/node_modules/pi-antigravity/src/stream/stream.ts +162 -113
- package/node_modules/pi-antigravity/src/types/enums.ts +1 -0
- package/node_modules/pi-antigravity/src/types/types.ts +1 -1
- package/node_modules/pi-antigravity/src/utils/security.ts +47 -1
- package/node_modules/pi-antigravity/src/utils/util.ts +38 -6
- package/node_modules/pi-lens/CHANGELOG.md +1064 -0
- package/node_modules/pi-lens/README.md +115 -25
- package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/node_modules/pi-lens/dist/chunk-22AVIGXS.js +560 -0
- package/node_modules/pi-lens/dist/chunk-27BBHSZC.js +106 -0
- package/node_modules/pi-lens/dist/chunk-2BEMIWEW.js +51 -0
- package/node_modules/pi-lens/dist/chunk-2EECBNC5.js +89 -0
- package/node_modules/pi-lens/dist/chunk-34U7PLGE.js +23 -0
- package/node_modules/pi-lens/dist/chunk-3I5QFT3N.js +181 -0
- package/node_modules/pi-lens/dist/chunk-3MED75HT.js +37 -0
- package/node_modules/pi-lens/dist/chunk-47D2BO4S.js +87 -0
- package/node_modules/pi-lens/dist/chunk-4RERDEXR.js +348 -0
- package/node_modules/pi-lens/dist/chunk-4W2PLC4J.js +27 -0
- package/node_modules/pi-lens/dist/chunk-52H5B5TC.js +202 -0
- package/node_modules/pi-lens/dist/chunk-54B42YRX.js +27 -0
- package/node_modules/pi-lens/dist/chunk-5RXBNSW2.js +266 -0
- package/node_modules/pi-lens/dist/chunk-5THXD6X5.js +201 -0
- package/node_modules/pi-lens/dist/chunk-5W3R6LFT.js +24 -0
- package/node_modules/pi-lens/dist/chunk-5ZEJHV35.js +341 -0
- package/node_modules/pi-lens/dist/chunk-6P62QVEA.js +118 -0
- package/node_modules/pi-lens/dist/chunk-6QIUX4EP.js +459 -0
- package/node_modules/pi-lens/dist/chunk-6VCD4VKZ.js +78 -0
- package/node_modules/pi-lens/dist/chunk-7F72PXY2.js +326 -0
- package/node_modules/pi-lens/dist/chunk-7FBF7NPR.js +998 -0
- package/node_modules/pi-lens/dist/chunk-7U2IDNXN.js +37 -0
- package/node_modules/pi-lens/dist/chunk-ABBOA7UD.js +157 -0
- package/node_modules/pi-lens/dist/chunk-AHDW3GPE.js +50 -0
- package/node_modules/pi-lens/dist/chunk-AJ3QXTRQ.js +756 -0
- package/node_modules/pi-lens/dist/chunk-AJVLWNFN.js +1610 -0
- package/node_modules/pi-lens/dist/chunk-AJXODZY6.js +112 -0
- package/node_modules/pi-lens/dist/chunk-ARFCXG7S.js +84 -0
- package/node_modules/pi-lens/dist/chunk-AS44CFQ4.js +708 -0
- package/node_modules/pi-lens/dist/chunk-AWE5TMPO.js +38 -0
- package/node_modules/pi-lens/dist/chunk-B3I2UUT4.js +4692 -0
- package/node_modules/pi-lens/dist/chunk-BRJKOBZP.js +331 -0
- package/node_modules/pi-lens/dist/chunk-BW5KFIQC.js +59 -0
- package/node_modules/pi-lens/dist/chunk-C2AUYXQH.js +149 -0
- package/node_modules/pi-lens/dist/chunk-CGGAIP7J.js +29 -0
- package/node_modules/pi-lens/dist/chunk-D6QS3U6M.js +30 -0
- package/node_modules/pi-lens/dist/chunk-DFVMIKMQ.js +349 -0
- package/node_modules/pi-lens/dist/chunk-DIULIWKU.js +169 -0
- package/node_modules/pi-lens/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/node_modules/pi-lens/dist/chunk-E2WFBRHM.js +213 -0
- package/node_modules/pi-lens/dist/chunk-E4MAEDPM.js +50 -0
- package/node_modules/pi-lens/dist/chunk-EOKRQ3SA.js +30 -0
- package/node_modules/pi-lens/dist/chunk-F3AU2TMM.js +2626 -0
- package/node_modules/pi-lens/dist/chunk-F3P7VQ7H.js +170 -0
- package/node_modules/pi-lens/dist/chunk-FC4RP4I2.js +12 -0
- package/node_modules/pi-lens/dist/chunk-FJNKANOS.js +32 -0
- package/node_modules/pi-lens/dist/chunk-GUOGVTCQ.js +146 -0
- package/node_modules/pi-lens/dist/chunk-GVXA6CCE.js +18 -0
- package/node_modules/pi-lens/dist/chunk-HHYAELLJ.js +2334 -0
- package/node_modules/pi-lens/dist/chunk-HMFXILPV.js +83 -0
- package/node_modules/pi-lens/dist/chunk-HVUZXSWK.js +421 -0
- package/node_modules/pi-lens/dist/chunk-HWBZIGMJ.js +62 -0
- package/node_modules/pi-lens/dist/chunk-I3R7GKDR.js +17 -0
- package/node_modules/pi-lens/dist/chunk-I7SPGOWI.js +55 -0
- package/node_modules/pi-lens/dist/chunk-IIXOAGHR.js +38 -0
- package/node_modules/pi-lens/dist/chunk-IVP5KAB7.js +2250 -0
- package/node_modules/pi-lens/dist/chunk-IXEBJSUE.js +22 -0
- package/node_modules/pi-lens/dist/chunk-JOLITGCC.js +27 -0
- package/node_modules/pi-lens/dist/chunk-K6VYLB2U.js +145 -0
- package/node_modules/pi-lens/dist/chunk-LJDODBBZ.js +78 -0
- package/node_modules/pi-lens/dist/chunk-LNAKEO63.js +78 -0
- package/node_modules/pi-lens/dist/chunk-LSMJ6KBE.js +4139 -0
- package/node_modules/pi-lens/dist/chunk-LW6XKDZQ.js +5565 -0
- package/node_modules/pi-lens/dist/chunk-N3YQJI6O.js +899 -0
- package/node_modules/pi-lens/dist/chunk-NABLC7W3.js +148 -0
- package/node_modules/pi-lens/dist/chunk-NKOUFPQF.js +659 -0
- package/node_modules/pi-lens/dist/chunk-NL5GLMFI.js +211 -0
- package/node_modules/pi-lens/dist/chunk-NMABWBZN.js +327 -0
- package/node_modules/pi-lens/dist/chunk-NTHH2J74.js +27 -0
- package/node_modules/pi-lens/dist/chunk-NTUJEGDZ.js +59 -0
- package/node_modules/pi-lens/dist/chunk-NXL4FFQQ.js +47 -0
- package/node_modules/pi-lens/dist/chunk-NXPS2L6U.js +466 -0
- package/node_modules/pi-lens/dist/chunk-O5WILGMI.js +42 -0
- package/node_modules/pi-lens/dist/chunk-O6TQT6RI.js +48 -0
- package/node_modules/pi-lens/dist/chunk-OAXNDZJ7.js +323 -0
- package/node_modules/pi-lens/dist/chunk-ODEEOXPH.js +44 -0
- package/node_modules/pi-lens/dist/chunk-OQGFCZJ4.js +4533 -0
- package/node_modules/pi-lens/dist/chunk-ORTMY4Q4.js +282 -0
- package/node_modules/pi-lens/dist/chunk-OS32RNR2.js +442 -0
- package/node_modules/pi-lens/dist/chunk-PAK6IDME.js +189 -0
- package/node_modules/pi-lens/dist/chunk-PWFHBTSF.js +406 -0
- package/node_modules/pi-lens/dist/chunk-Q5U6FMDI.js +2352 -0
- package/node_modules/pi-lens/dist/chunk-QOZXJ4NA.js +3364 -0
- package/node_modules/pi-lens/dist/chunk-QYF5S6P6.js +45 -0
- package/node_modules/pi-lens/dist/chunk-RIISMHKN.js +36 -0
- package/node_modules/pi-lens/dist/chunk-RPD4ZSB7.js +25 -0
- package/node_modules/pi-lens/dist/chunk-RPD5K5NC.js +79 -0
- package/node_modules/pi-lens/dist/chunk-RUOG5D2C.js +262 -0
- package/node_modules/pi-lens/dist/chunk-T4ERT73Y.js +599 -0
- package/node_modules/pi-lens/dist/chunk-T6D4Q4AQ.js +54 -0
- package/node_modules/pi-lens/dist/chunk-TGPXLY2J.js +391 -0
- package/node_modules/pi-lens/dist/chunk-TLGFBM3F.js +12116 -0
- package/node_modules/pi-lens/dist/chunk-TO6WL3GM.js +88 -0
- package/node_modules/pi-lens/dist/chunk-TT22N74J.js +517 -0
- package/node_modules/pi-lens/dist/chunk-TVN5N6GY.js +21216 -0
- package/node_modules/pi-lens/dist/chunk-U3VGR4VU.js +308 -0
- package/node_modules/pi-lens/dist/chunk-UK3CMEAL.js +1250 -0
- package/node_modules/pi-lens/dist/chunk-UOPVJQ4N.js +103 -0
- package/node_modules/pi-lens/dist/chunk-UXVNL3D7.js +23 -0
- package/node_modules/pi-lens/dist/chunk-UY752QSN.js +45 -0
- package/node_modules/pi-lens/dist/chunk-V5PXFSZK.js +188 -0
- package/node_modules/pi-lens/dist/chunk-V7R425XG.js +398 -0
- package/node_modules/pi-lens/dist/chunk-VCSRSYLF.js +81 -0
- package/node_modules/pi-lens/dist/chunk-VD4JQCQC.js +162 -0
- package/node_modules/pi-lens/dist/chunk-VDBPVIKD.js +62 -0
- package/node_modules/pi-lens/dist/chunk-VHQLPIRJ.js +114 -0
- package/node_modules/pi-lens/dist/chunk-VN2AXLEX.js +5414 -0
- package/node_modules/pi-lens/dist/chunk-VNMT7C64.js +478 -0
- package/node_modules/pi-lens/dist/chunk-WONERJTP.js +309 -0
- package/node_modules/pi-lens/dist/chunk-XECLWQZN.js +85 -0
- package/node_modules/pi-lens/dist/chunk-XIMYZ3JA.js +27 -0
- package/node_modules/pi-lens/dist/chunk-XK4CIILI.js +144 -0
- package/node_modules/pi-lens/dist/chunk-Y4T27COV.js +562 -0
- package/node_modules/pi-lens/dist/chunk-YGVYKNSN.js +1860 -0
- package/node_modules/pi-lens/dist/chunk-YLF3PPT5.js +308 -0
- package/node_modules/pi-lens/dist/chunk-YSNFMJKN.js +14 -0
- package/node_modules/pi-lens/dist/chunk-Z3CCVDUB.js +76 -0
- package/node_modules/pi-lens/dist/chunk-Z54ZSOBZ.js +61 -0
- package/node_modules/pi-lens/dist/chunk-ZAWW3AF6.js +97 -0
- package/node_modules/pi-lens/dist/chunk-ZMOL6RQC.js +167 -0
- package/node_modules/pi-lens/dist/index.js +16456 -8335
- package/node_modules/pi-lens/dist/mcp/analyze-cli.js +186 -232
- package/node_modules/pi-lens/dist/mcp/cli.js +137 -98
- package/node_modules/pi-lens/dist/mcp/server.js +22589 -1573
- package/node_modules/pi-lens/dist/mcp/worker.js +97 -38
- package/node_modules/pi-lens/dist/probes/installer.js +135 -0
- package/node_modules/pi-lens/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/node_modules/pi-lens/dist/workers/review-graph-persist-worker.js +15 -0
- package/node_modules/pi-lens/docs/agent-guide.md +13 -4
- package/node_modules/pi-lens/docs/agent-tools.md +42 -0
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +3 -2
- package/node_modules/pi-lens/docs/configuration.md +20 -1
- package/node_modules/pi-lens/docs/environment-variables.md +52 -2
- package/node_modules/pi-lens/docs/features.md +8 -4
- package/node_modules/pi-lens/docs/globalconfig.md +1 -0
- package/node_modules/pi-lens/docs/io-bridge-v2-migration.md +94 -0
- package/node_modules/pi-lens/docs/lsp-capability-matrix.md +36 -4
- package/node_modules/pi-lens/docs/lsp-idle-eviction.md +124 -0
- package/node_modules/pi-lens/docs/mcp.md +21 -5
- package/node_modules/pi-lens/docs/merge-queue-rollout.md +77 -0
- package/node_modules/pi-lens/docs/pi-lens-fixer.md +156 -88
- package/node_modules/pi-lens/docs/pi-lens-investigator.md +74 -26
- package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +694 -0
- package/node_modules/pi-lens/docs/pi-lens-monitor.md +73 -7
- package/node_modules/pi-lens/docs/pi-lens-retro.md +6 -4
- package/node_modules/pi-lens/docs/pi-lens-reviewer.md +188 -48
- package/node_modules/pi-lens/docs/pi-lens-subagent.md +246 -45
- package/node_modules/pi-lens/docs/pi-lens-warden.md +18 -7
- package/node_modules/pi-lens/docs/public-api-stability.md +55 -0
- package/node_modules/pi-lens/docs/release-qa-baseline.md +84 -17
- package/node_modules/pi-lens/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/node_modules/pi-lens/docs/servercapabilities.md +53 -49
- package/node_modules/pi-lens/docs/settings.md +1 -0
- package/node_modules/pi-lens/docs/usage.md +5 -1
- package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm +0 -0
- package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm.json +3 -3
- package/node_modules/pi-lens/package.json +18 -6
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/node_modules/pi-lens/scripts/download-grammars.js +5 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +6 -1
- package/node_modules/pi-lens/scripts/install-selftest.mjs +33 -34
- package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +13 -4
- package/node_modules/pi-lens/scripts/lib/web-tree-sitter-dir.mjs +18 -0
- package/package.json +15 -10
- package/node_modules/@dietrichgebert/ponytail/README.es.md +0 -212
- package/node_modules/@dietrichgebert/ponytail/README.ja.md +0 -212
- package/node_modules/@dietrichgebert/ponytail/README.ko.md +0 -212
- package/node_modules/@dietrichgebert/ponytail/README.zh-CN.md +0 -212
- package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +0 -35
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +0 -1610
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +0 -593
- package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +0 -147
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +0 -325
- package/node_modules/pi-lens/dist/clients/analysed-root.js +0 -1
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +0 -731
- package/node_modules/pi-lens/dist/clients/ast-grep-rule-manager.js +0 -146
- package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +0 -118
- package/node_modules/pi-lens/dist/clients/ast-grep-types.js +0 -10
- package/node_modules/pi-lens/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +0 -75
- package/node_modules/pi-lens/dist/clients/atomic-write.js +0 -189
- package/node_modules/pi-lens/dist/clients/availability-probe-flight.js +0 -12
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +0 -1056
- package/node_modules/pi-lens/dist/clients/biome-client.js +0 -357
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +0 -837
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +0 -129
- package/node_modules/pi-lens/dist/clients/bootstrap.js +0 -569
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +0 -190
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +0 -202
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +0 -295
- package/node_modules/pi-lens/dist/clients/build-identity.js +0 -95
- package/node_modules/pi-lens/dist/clients/bundled-resource-health.js +0 -113
- package/node_modules/pi-lens/dist/clients/bus-events-logger.js +0 -105
- package/node_modules/pi-lens/dist/clients/bus-publish.js +0 -171
- package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +0 -190
- package/node_modules/pi-lens/dist/clients/cache-manager.js +0 -524
- package/node_modules/pi-lens/dist/clients/cache-observability.js +0 -1313
- package/node_modules/pi-lens/dist/clients/call-graph.js +0 -852
- package/node_modules/pi-lens/dist/clients/cargo-manifest.js +0 -422
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +0 -196
- package/node_modules/pi-lens/dist/clients/cascade-format.js +0 -315
- package/node_modules/pi-lens/dist/clients/cascade-logger.js +0 -31
- package/node_modules/pi-lens/dist/clients/cascade-types.js +0 -9
- package/node_modules/pi-lens/dist/clients/child-unref.js +0 -124
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +0 -286
- package/node_modules/pi-lens/dist/clients/codebase-model.js +0 -173
- package/node_modules/pi-lens/dist/clients/collateral-test-role.js +0 -40
- package/node_modules/pi-lens/dist/clients/complexity-client.js +0 -462
- package/node_modules/pi-lens/dist/clients/config-core/deny.js +0 -221
- package/node_modules/pi-lens/dist/clients/config-core/index.js +0 -50
- package/node_modules/pi-lens/dist/clients/config-core/merge.js +0 -357
- package/node_modules/pi-lens/dist/clients/config-core/normalize.js +0 -340
- package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +0 -248
- package/node_modules/pi-lens/dist/clients/config-core/provenance.js +0 -164
- package/node_modules/pi-lens/dist/clients/config-core/records.js +0 -218
- package/node_modules/pi-lens/dist/clients/config-core/resolve.js +0 -125
- package/node_modules/pi-lens/dist/clients/config-core/safe-object.js +0 -78
- package/node_modules/pi-lens/dist/clients/config-core/schema.js +0 -165
- package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +0 -285
- package/node_modules/pi-lens/dist/clients/config-locations.js +0 -388
- package/node_modules/pi-lens/dist/clients/config-resolve.js +0 -798
- package/node_modules/pi-lens/dist/clients/config-schema.js +0 -251
- package/node_modules/pi-lens/dist/clients/config-warn.js +0 -407
- package/node_modules/pi-lens/dist/clients/console-guard-install.js +0 -26
- package/node_modules/pi-lens/dist/clients/cooperative-budget.js +0 -42
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +0 -510
- package/node_modules/pi-lens/dist/clients/dead-code-logger.js +0 -30
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +0 -280
- package/node_modules/pi-lens/dist/clients/debug-handles.js +0 -211
- package/node_modules/pi-lens/dist/clients/debug-heap.js +0 -174
- package/node_modules/pi-lens/dist/clients/deferred-lsp-work.js +0 -106
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +0 -426
- package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +0 -169
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +0 -885
- package/node_modules/pi-lens/dist/clients/deps/ast-grep-napi.js +0 -22
- package/node_modules/pi-lens/dist/clients/deps/js-yaml.js +0 -9
- package/node_modules/pi-lens/dist/clients/deps/minimatch.js +0 -4
- package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +0 -14
- package/node_modules/pi-lens/dist/clients/deps/typebox.js +0 -14
- package/node_modules/pi-lens/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/node_modules/pi-lens/dist/clients/deps/web-tree-sitter.js +0 -24
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +0 -630
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +0 -305
- package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +0 -73
- package/node_modules/pi-lens/dist/clients/diagnostic-tracker.js +0 -105
- package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +0 -230
- package/node_modules/pi-lens/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/node_modules/pi-lens/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +0 -1269
- package/node_modules/pi-lens/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/node_modules/pi-lens/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/node_modules/pi-lens/dist/clients/dispatch/fact-runner.js +0 -30
- package/node_modules/pi-lens/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/node_modules/pi-lens/dist/clients/dispatch/fact-store.js +0 -377
- package/node_modules/pi-lens/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/node_modules/pi-lens/dist/clients/dispatch/facts/file-content.js +0 -19
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/node_modules/pi-lens/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/node_modules/pi-lens/dist/clients/dispatch/finding-policy.js +0 -339
- package/node_modules/pi-lens/dist/clients/dispatch/indent-detect.js +0 -417
- package/node_modules/pi-lens/dist/clients/dispatch/inline-suppressions.js +0 -89
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +0 -2377
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +0 -11
- package/node_modules/pi-lens/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +0 -278
- package/node_modules/pi-lens/dist/clients/dispatch/priorities.js +0 -20
- package/node_modules/pi-lens/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/node_modules/pi-lens/dist/clients/dispatch/rule-ignores.js +0 -69
- package/node_modules/pi-lens/dist/clients/dispatch/rule-policy.js +0 -135
- package/node_modules/pi-lens/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/node_modules/pi-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/node_modules/pi-lens/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/node_modules/pi-lens/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/node_modules/pi-lens/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/node_modules/pi-lens/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/node_modules/pi-lens/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/node_modules/pi-lens/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/node_modules/pi-lens/dist/clients/dispatch/runner-context.js +0 -52
- package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +0 -111
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +0 -296
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +0 -219
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +0 -82
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +0 -416
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +0 -183
- package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +0 -176
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +0 -164
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +0 -195
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +0 -137
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +0 -167
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +0 -104
- package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +0 -135
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +0 -91
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +0 -117
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +0 -108
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +0 -99
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +0 -110
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +0 -379
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +0 -167
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +0 -102
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +0 -414
- package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +0 -85
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +0 -169
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +0 -99
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +0 -88
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +0 -256
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +0 -173
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +0 -128
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +0 -183
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +0 -166
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +0 -163
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +0 -174
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +0 -125
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +0 -643
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +0 -253
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -15
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +0 -128
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +0 -95
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +0 -79
- package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +0 -79
- package/node_modules/pi-lens/dist/clients/dispatch/tool-profile.js +0 -30
- package/node_modules/pi-lens/dist/clients/dispatch/types.js +0 -21
- package/node_modules/pi-lens/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/node_modules/pi-lens/dist/clients/disposition-logger.js +0 -32
- package/node_modules/pi-lens/dist/clients/disposition-publish.js +0 -124
- package/node_modules/pi-lens/dist/clients/durable-store.js +0 -97
- package/node_modules/pi-lens/dist/clients/effective-config.js +0 -415
- package/node_modules/pi-lens/dist/clients/env-utils.js +0 -83
- package/node_modules/pi-lens/dist/clients/error-class.js +0 -23
- package/node_modules/pi-lens/dist/clients/eval-timestamp.js +0 -17
- package/node_modules/pi-lens/dist/clients/event-loop-hold.js +0 -274
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +0 -250
- package/node_modules/pi-lens/dist/clients/extension-log.js +0 -504
- package/node_modules/pi-lens/dist/clients/extension-mode.js +0 -73
- package/node_modules/pi-lens/dist/clients/feature-hints.js +0 -103
- package/node_modules/pi-lens/dist/clients/file-kinds.js +0 -412
- package/node_modules/pi-lens/dist/clients/file-role.js +0 -134
- package/node_modules/pi-lens/dist/clients/file-time.js +0 -160
- package/node_modules/pi-lens/dist/clients/file-utils.js +0 -1032
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +0 -494
- package/node_modules/pi-lens/dist/clients/finding-identity.js +0 -88
- package/node_modules/pi-lens/dist/clients/fix-worklog.js +0 -103
- package/node_modules/pi-lens/dist/clients/format-events-publish.js +0 -343
- package/node_modules/pi-lens/dist/clients/format-service.js +0 -222
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +0 -9
- package/node_modules/pi-lens/dist/clients/formatters.js +0 -2032
- package/node_modules/pi-lens/dist/clients/freshness-cadence.js +0 -17
- package/node_modules/pi-lens/dist/clients/freshness.js +0 -38
- package/node_modules/pi-lens/dist/clients/generated-artifacts.js +0 -394
- package/node_modules/pi-lens/dist/clients/generation-guard.js +0 -215
- package/node_modules/pi-lens/dist/clients/git-guard.js +0 -1136
- package/node_modules/pi-lens/dist/clients/git-tracked-ignore.js +0 -243
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +0 -509
- package/node_modules/pi-lens/dist/clients/go-client.js +0 -104
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +0 -605
- package/node_modules/pi-lens/dist/clients/gradle-ktfmt-style.js +0 -348
- package/node_modules/pi-lens/dist/clients/grammar-source.js +0 -465
- package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +0 -135
- package/node_modules/pi-lens/dist/clients/hashline-anchor.js +0 -424
- package/node_modules/pi-lens/dist/clients/hook-budgets.js +0 -76
- package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +0 -140
- package/node_modules/pi-lens/dist/clients/host-ports.js +0 -39
- package/node_modules/pi-lens/dist/clients/indent-retarget.js +0 -154
- package/node_modules/pi-lens/dist/clients/inline-blocker-dispositions.js +0 -186
- package/node_modules/pi-lens/dist/clients/install-diagnostics.js +0 -156
- package/node_modules/pi-lens/dist/clients/installer/index.js +0 -5416
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/node_modules/pi-lens/dist/clients/instance-reaper-state.js +0 -7
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +0 -1137
- package/node_modules/pi-lens/dist/clients/instance-registry-lock.js +0 -145
- package/node_modules/pi-lens/dist/clients/instance-registry.js +0 -773
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +0 -378
- package/node_modules/pi-lens/dist/clients/json-cache-read.js +0 -65
- package/node_modules/pi-lens/dist/clients/knip-client.js +0 -788
- package/node_modules/pi-lens/dist/clients/language-policy.js +0 -252
- package/node_modules/pi-lens/dist/clients/language-profile.js +0 -361
- package/node_modules/pi-lens/dist/clients/language-registry.js +0 -603
- package/node_modules/pi-lens/dist/clients/latency-logger.js +0 -727
- package/node_modules/pi-lens/dist/clients/lazy-import.js +0 -21
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +0 -54
- package/node_modules/pi-lens/dist/clients/lens-config.js +0 -404
- package/node_modules/pi-lens/dist/clients/lens-engine.js +0 -358
- package/node_modules/pi-lens/dist/clients/lens-events.js +0 -125
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +0 -467
- package/node_modules/pi-lens/dist/clients/lens-map.js +0 -1156
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +0 -74
- package/node_modules/pi-lens/dist/clients/log-cleanup.js +0 -222
- package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +0 -178
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +0 -421
- package/node_modules/pi-lens/dist/clients/lsp/client.js +0 -4593
- package/node_modules/pi-lens/dist/clients/lsp/config.js +0 -691
- package/node_modules/pi-lens/dist/clients/lsp/content-limits.js +0 -41
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +0 -467
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +0 -1219
- package/node_modules/pi-lens/dist/clients/lsp/index.js +0 -8305
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +0 -216
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +0 -298
- package/node_modules/pi-lens/dist/clients/lsp/language.js +0 -63
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +0 -746
- package/node_modules/pi-lens/dist/clients/lsp/lombok.js +0 -158
- package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +0 -5
- package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/node_modules/pi-lens/dist/clients/lsp/position-encoding.js +0 -61
- package/node_modules/pi-lens/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/node_modules/pi-lens/dist/clients/lsp/server.js +0 -3290
- package/node_modules/pi-lens/dist/clients/lsp/session-roots.js +0 -192
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +0 -17
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -56
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +0 -332
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/index.js +0 -10
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +0 -392
- package/node_modules/pi-lens/dist/clients/lsp/watch-queue.js +0 -61
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/node_modules/pi-lens/dist/clients/lsp-budget.js +0 -186
- package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +0 -110
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +0 -9
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +0 -396
- package/node_modules/pi-lens/dist/clients/lsp-status.js +0 -59
- package/node_modules/pi-lens/dist/clients/map-with-concurrency.js +0 -40
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +0 -420
- package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +0 -31
- package/node_modules/pi-lens/dist/clients/mcp/ipc.js +0 -523
- package/node_modules/pi-lens/dist/clients/mcp/review.js +0 -197
- package/node_modules/pi-lens/dist/clients/mcp/session.js +0 -412
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +0 -208
- package/node_modules/pi-lens/dist/clients/message-end-attribution.js +0 -30
- package/node_modules/pi-lens/dist/clients/metrics-client.js +0 -107
- package/node_modules/pi-lens/dist/clients/metrics-history.js +0 -327
- package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +0 -263
- package/node_modules/pi-lens/dist/clients/model-provider.js +0 -53
- package/node_modules/pi-lens/dist/clients/module-report-lsp.js +0 -189
- package/node_modules/pi-lens/dist/clients/module-report.js +0 -2150
- package/node_modules/pi-lens/dist/clients/mutating-tool.js +0 -651
- package/node_modules/pi-lens/dist/clients/mutation-attribution.js +0 -368
- package/node_modules/pi-lens/dist/clients/mutation-bridge.js +0 -240
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +0 -734
- package/node_modules/pi-lens/dist/clients/observed-mutation-sources.js +0 -101
- package/node_modules/pi-lens/dist/clients/observed-mutation.js +0 -1253
- package/node_modules/pi-lens/dist/clients/oldtext-autopatch.js +0 -128
- package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +0 -496
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +0 -333
- package/node_modules/pi-lens/dist/clients/opengrep-config.js +0 -76
- package/node_modules/pi-lens/dist/clients/package-manager.js +0 -607
- package/node_modules/pi-lens/dist/clients/package-root.js +0 -38
- package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +0 -439
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +0 -43
- package/node_modules/pi-lens/dist/clients/path-keyed-map.js +0 -108
- package/node_modules/pi-lens/dist/clients/path-utils.js +0 -1244
- package/node_modules/pi-lens/dist/clients/performance-report.js +0 -331
- package/node_modules/pi-lens/dist/clients/persist-debounce.js +0 -70
- package/node_modules/pi-lens/dist/clients/persistent-reverify.js +0 -271
- package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +0 -119
- package/node_modules/pi-lens/dist/clients/pipeline.js +0 -1480
- package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +0 -37
- package/node_modules/pi-lens/dist/clients/print-mode.js +0 -21
- package/node_modules/pi-lens/dist/clients/probe-home-state.js +0 -228
- package/node_modules/pi-lens/dist/clients/process-bridge.js +0 -66
- package/node_modules/pi-lens/dist/clients/process-singletons.js +0 -210
- package/node_modules/pi-lens/dist/clients/process-snapshot.js +0 -68
- package/node_modules/pi-lens/dist/clients/project-changes.js +0 -181
- package/node_modules/pi-lens/dist/clients/project-conventions.js +0 -171
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +0 -137
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +0 -109
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +0 -520
- package/node_modules/pi-lens/dist/clients/project-diagnostics/types.js +0 -1
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +0 -807
- package/node_modules/pi-lens/dist/clients/project-report.js +0 -701
- package/node_modules/pi-lens/dist/clients/project-scale.js +0 -237
- package/node_modules/pi-lens/dist/clients/project-scan-policy.js +0 -11
- package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +0 -1653
- package/node_modules/pi-lens/dist/clients/project-trust.js +0 -181
- package/node_modules/pi-lens/dist/clients/python-environment.js +0 -217
- package/node_modules/pi-lens/dist/clients/python-provenance.js +0 -639
- package/node_modules/pi-lens/dist/clients/quiet-window-config.js +0 -47
- package/node_modules/pi-lens/dist/clients/quiet-window.js +0 -236
- package/node_modules/pi-lens/dist/clients/read-bridge.js +0 -139
- package/node_modules/pi-lens/dist/clients/read-expansion.js +0 -266
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +0 -251
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +0 -1306
- package/node_modules/pi-lens/dist/clients/read-guard.js +0 -1561
- package/node_modules/pi-lens/dist/clients/recent-touches.js +0 -240
- package/node_modules/pi-lens/dist/clients/redact/secrets.js +0 -449
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +0 -628
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +0 -270
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +0 -5126
- package/node_modules/pi-lens/dist/clients/review-graph/format.js +0 -33
- package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +0 -163
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +0 -481
- package/node_modules/pi-lens/dist/clients/review-graph/persist-worker.js +0 -10
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +0 -244
- package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +0 -21
- package/node_modules/pi-lens/dist/clients/review-graph/service.js +0 -96
- package/node_modules/pi-lens/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/node_modules/pi-lens/dist/clients/review-graph/symbol-id.js +0 -103
- package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/node_modules/pi-lens/dist/clients/review-graph/types.js +0 -1
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +0 -449
- package/node_modules/pi-lens/dist/clients/review-graph-logger.js +0 -81
- package/node_modules/pi-lens/dist/clients/ruff-client.js +0 -179
- package/node_modules/pi-lens/dist/clients/rules-scanner.js +0 -131
- package/node_modules/pi-lens/dist/clients/run-duration.js +0 -55
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +0 -746
- package/node_modules/pi-lens/dist/clients/runtime-config.js +0 -77
- package/node_modules/pi-lens/dist/clients/runtime-context.js +0 -211
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +0 -1324
- package/node_modules/pi-lens/dist/clients/runtime-session.js +0 -2485
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +0 -1295
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +0 -2049
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +0 -3767
- package/node_modules/pi-lens/dist/clients/rust-client.js +0 -97
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +0 -2357
- package/node_modules/pi-lens/dist/clients/sanitize.js +0 -286
- package/node_modules/pi-lens/dist/clients/scan-utils.js +0 -25
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +0 -165
- package/node_modules/pi-lens/dist/clients/search-read-registration.js +0 -94
- package/node_modules/pi-lens/dist/clients/secret-findings.js +0 -114
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +0 -352
- package/node_modules/pi-lens/dist/clients/session-event-guard.js +0 -297
- package/node_modules/pi-lens/dist/clients/session-lifecycle.js +0 -484
- package/node_modules/pi-lens/dist/clients/session-start-observability.js +0 -94
- package/node_modules/pi-lens/dist/clients/session-state-store.js +0 -101
- package/node_modules/pi-lens/dist/clients/session-summary.js +0 -15
- package/node_modules/pi-lens/dist/clients/sessionstart-logger.js +0 -27
- package/node_modules/pi-lens/dist/clients/sg-runner.js +0 -876
- package/node_modules/pi-lens/dist/clients/sgconfig.js +0 -347
- package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +0 -338
- package/node_modules/pi-lens/dist/clients/single-flight.js +0 -158
- package/node_modules/pi-lens/dist/clients/situational-tool-telemetry.js +0 -108
- package/node_modules/pi-lens/dist/clients/skills-resolver.js +0 -141
- package/node_modules/pi-lens/dist/clients/slow-fs.js +0 -138
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +0 -231
- package/node_modules/pi-lens/dist/clients/source-filter.js +0 -596
- package/node_modules/pi-lens/dist/clients/source-walker.js +0 -211
- package/node_modules/pi-lens/dist/clients/spawn-output-cap.js +0 -120
- package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/node_modules/pi-lens/dist/clients/stale-marker.js +0 -17
- package/node_modules/pi-lens/dist/clients/startup-scan.js +0 -400
- package/node_modules/pi-lens/dist/clients/startup-timing.js +0 -130
- package/node_modules/pi-lens/dist/clients/string-utils.js +0 -33
- package/node_modules/pi-lens/dist/clients/subagent-mode.js +0 -111
- package/node_modules/pi-lens/dist/clients/symbol-containment.js +0 -24
- package/node_modules/pi-lens/dist/clients/symbol-types.js +0 -5
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +0 -2507
- package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +0 -287
- package/node_modules/pi-lens/dist/clients/todo-scanner.js +0 -229
- package/node_modules/pi-lens/dist/clients/tool-agreement.js +0 -423
- package/node_modules/pi-lens/dist/clients/tool-config.js +0 -249
- package/node_modules/pi-lens/dist/clients/tool-cwd.js +0 -270
- package/node_modules/pi-lens/dist/clients/tool-definition.js +0 -47
- package/node_modules/pi-lens/dist/clients/tool-event.js +0 -105
- package/node_modules/pi-lens/dist/clients/tool-policy.js +0 -2755
- package/node_modules/pi-lens/dist/clients/tool-probe.js +0 -53
- package/node_modules/pi-lens/dist/clients/tool-render.js +0 -156
- package/node_modules/pi-lens/dist/clients/tool-set-policy.js +0 -118
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +0 -364
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +0 -4195
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +0 -100
- package/node_modules/pi-lens/dist/clients/tree-sitter-navigator.js +0 -269
- package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +0 -569
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +0 -158
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/node_modules/pi-lens/dist/clients/trivy-client.js +0 -467
- package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -50
- package/node_modules/pi-lens/dist/clients/turn-context.js +0 -52
- package/node_modules/pi-lens/dist/clients/turn-end/lane.js +0 -51
- package/node_modules/pi-lens/dist/clients/turn-end/lanes/govulncheck.js +0 -112
- package/node_modules/pi-lens/dist/clients/turn-end/lanes/secrets.js +0 -204
- package/node_modules/pi-lens/dist/clients/turn-summary-render.js +0 -72
- package/node_modules/pi-lens/dist/clients/turn-summary.js +0 -132
- package/node_modules/pi-lens/dist/clients/typos-config.js +0 -29
- package/node_modules/pi-lens/dist/clients/user-notify.js +0 -51
- package/node_modules/pi-lens/dist/clients/vanished-instance-marker.js +0 -57
- package/node_modules/pi-lens/dist/clients/warm-attach.js +0 -305
- package/node_modules/pi-lens/dist/clients/widget-state.js +0 -1808
- package/node_modules/pi-lens/dist/clients/word-index-logger.js +0 -49
- package/node_modules/pi-lens/dist/clients/word-index-store.js +0 -459
- package/node_modules/pi-lens/dist/clients/word-index.js +0 -2080
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +0 -443
- package/node_modules/pi-lens/dist/clients/write-ordering-guard.js +0 -65
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +0 -340
- package/node_modules/pi-lens/dist/i18n.js +0 -69
- package/node_modules/pi-lens/dist/mcp/build-staleness.js +0 -124
- package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +0 -583
- package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/node_modules/pi-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
- package/node_modules/pi-lens/dist/tools/activate-tools.js +0 -87
- package/node_modules/pi-lens/dist/tools/ast-grep-outline.js +0 -137
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +0 -244
- package/node_modules/pi-lens/dist/tools/ast-grep-search.js +0 -762
- package/node_modules/pi-lens/dist/tools/effective-config.js +0 -90
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +0 -375
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +0 -2571
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +0 -1745
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +0 -1367
- package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +0 -294
- package/node_modules/pi-lens/dist/tools/module-report.js +0 -382
- package/node_modules/pi-lens/dist/tools/project-report.js +0 -86
- package/node_modules/pi-lens/dist/tools/render-compact.js +0 -374
- package/node_modules/pi-lens/dist/tools/scan-progress.js +0 -53
- package/node_modules/pi-lens/dist/tools/shared.js +0 -29
- package/node_modules/pi-lens/dist/tools/symbol-search.js +0 -155
|
@@ -1,1367 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* lsp_navigation tool definition
|
|
3
|
-
*
|
|
4
|
-
* Extracted from index.ts for maintainability.
|
|
5
|
-
*/
|
|
6
|
-
import * as nodeFs from "node:fs";
|
|
7
|
-
import * as path from "node:path";
|
|
8
|
-
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
9
|
-
import { Type } from "../clients/deps/typebox.js";
|
|
10
|
-
import { logLatency } from "../clients/latency-logger.js";
|
|
11
|
-
import { newLspMutationCorrelationId, recordLspMutationOutcome, } from "../clients/lsp-mutation.js";
|
|
12
|
-
import { uriToPath } from "../clients/path-utils.js";
|
|
13
|
-
import { escapeRegExp } from "../clients/string-utils.js";
|
|
14
|
-
import { isRecordableProjectPath } from "../clients/file-utils.js";
|
|
15
|
-
import { compactRenderResult } from "./render-compact.js";
|
|
16
|
-
import { applyWorkspaceEdit, summarizeWorkspaceEdit, } from "../clients/lsp/edits.js";
|
|
17
|
-
import { getLSPService, } from "../clients/lsp/index.js";
|
|
18
|
-
import { buildLspNavigationEnvelope } from "./lsp-structured-output.js";
|
|
19
|
-
import { SYMBOL_KIND_NAMES } from "../clients/lsp-document-symbols.js";
|
|
20
|
-
const VALID_OPERATIONS = [
|
|
21
|
-
"definition",
|
|
22
|
-
"typeDefinition",
|
|
23
|
-
"declaration",
|
|
24
|
-
"references",
|
|
25
|
-
"hover",
|
|
26
|
-
"signatureHelp",
|
|
27
|
-
"documentSymbol",
|
|
28
|
-
"findSymbol",
|
|
29
|
-
"workspaceSymbol",
|
|
30
|
-
"codeAction",
|
|
31
|
-
"rename",
|
|
32
|
-
"rename_file",
|
|
33
|
-
"implementation",
|
|
34
|
-
"prepareCallHierarchy",
|
|
35
|
-
"incomingCalls",
|
|
36
|
-
"outgoingCalls",
|
|
37
|
-
"executeCommand",
|
|
38
|
-
"workspaceDiagnostics",
|
|
39
|
-
"capabilities",
|
|
40
|
-
];
|
|
41
|
-
const NAVIGABLE_SYMBOL_KINDS = new Set([
|
|
42
|
-
5, // Class
|
|
43
|
-
6, // Method
|
|
44
|
-
8, // Field
|
|
45
|
-
11, // Interface
|
|
46
|
-
12, // Function
|
|
47
|
-
13, // Variable
|
|
48
|
-
22, // EnumMember
|
|
49
|
-
23, // Struct
|
|
50
|
-
]);
|
|
51
|
-
function normalizeOperation(value) {
|
|
52
|
-
if (typeof value !== "string")
|
|
53
|
-
return "";
|
|
54
|
-
return value.trim().replace(/^["']+|["']+$/g, "");
|
|
55
|
-
}
|
|
56
|
-
function isValidOperation(value) {
|
|
57
|
-
return VALID_OPERATIONS.includes(value);
|
|
58
|
-
}
|
|
59
|
-
function operationSupportStatus(operation, support) {
|
|
60
|
-
if (!support)
|
|
61
|
-
return null;
|
|
62
|
-
if (operation === "definition")
|
|
63
|
-
return support.definition;
|
|
64
|
-
if (operation === "typeDefinition")
|
|
65
|
-
return support.typeDefinition;
|
|
66
|
-
if (operation === "declaration")
|
|
67
|
-
return support.declaration;
|
|
68
|
-
if (operation === "references")
|
|
69
|
-
return support.references;
|
|
70
|
-
if (operation === "hover")
|
|
71
|
-
return support.hover;
|
|
72
|
-
if (operation === "signatureHelp")
|
|
73
|
-
return support.signatureHelp;
|
|
74
|
-
if (operation === "documentSymbol" || operation === "findSymbol")
|
|
75
|
-
return support.documentSymbol;
|
|
76
|
-
if (operation === "workspaceSymbol")
|
|
77
|
-
return support.workspaceSymbol;
|
|
78
|
-
if (operation === "codeAction")
|
|
79
|
-
return support.codeAction;
|
|
80
|
-
if (operation === "rename")
|
|
81
|
-
return support.rename;
|
|
82
|
-
if (operation === "implementation")
|
|
83
|
-
return support.implementation;
|
|
84
|
-
if (operation === "prepareCallHierarchy" ||
|
|
85
|
-
operation === "incomingCalls" ||
|
|
86
|
-
operation === "outgoingCalls")
|
|
87
|
-
return support.callHierarchy;
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
function emptyReasonForOperation(operation) {
|
|
91
|
-
if (operation === "signatureHelp")
|
|
92
|
-
return "position-sensitive-or-no-signature";
|
|
93
|
-
if (operation === "codeAction")
|
|
94
|
-
return "no-applicable-actions";
|
|
95
|
-
if (operation === "rename")
|
|
96
|
-
return "no-rename-edits-or-symbol-not-renamable";
|
|
97
|
-
if (operation === "rename_file")
|
|
98
|
-
return "no-file-rename-result";
|
|
99
|
-
if (operation === "findSymbol")
|
|
100
|
-
return "no-matching-symbols";
|
|
101
|
-
if (operation === "workspaceSymbol")
|
|
102
|
-
return "no-matching-symbols-or-server-index-unavailable";
|
|
103
|
-
if (operation === "capabilities")
|
|
104
|
-
return "no-active-lsp-servers";
|
|
105
|
-
if (operation === "executeCommand")
|
|
106
|
-
return "command-returned-no-result";
|
|
107
|
-
if (operation === "incomingCalls" || operation === "outgoingCalls")
|
|
108
|
-
return "no-call-hierarchy-results";
|
|
109
|
-
return "no-results";
|
|
110
|
-
}
|
|
111
|
-
function parseSymbolSelector(symbol) {
|
|
112
|
-
const trimmed = symbol.trim();
|
|
113
|
-
const match = /^([^#]*)(?:#(-?\d+))?$/.exec(trimmed);
|
|
114
|
-
const baseSymbol = (match?.[1] ?? trimmed).trim();
|
|
115
|
-
const rawOccurrence = match?.[2];
|
|
116
|
-
if (!rawOccurrence)
|
|
117
|
-
return { baseSymbol, occurrence: 1 };
|
|
118
|
-
const occurrence = Number.parseInt(rawOccurrence, 10);
|
|
119
|
-
if (!Number.isFinite(occurrence) || occurrence < 1) {
|
|
120
|
-
return {
|
|
121
|
-
baseSymbol,
|
|
122
|
-
occurrence: 1,
|
|
123
|
-
debug: `invalid occurrence selector #${rawOccurrence}; using #1`,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
return { baseSymbol, occurrence };
|
|
127
|
-
}
|
|
128
|
-
function findNthMatch(lineText, regex, occurrence) {
|
|
129
|
-
let seen = 0;
|
|
130
|
-
regex.lastIndex = 0;
|
|
131
|
-
let match;
|
|
132
|
-
while ((match = regex.exec(lineText)) !== null) {
|
|
133
|
-
seen += 1;
|
|
134
|
-
if (seen === occurrence)
|
|
135
|
-
return match;
|
|
136
|
-
if (match[0].length === 0)
|
|
137
|
-
regex.lastIndex += 1;
|
|
138
|
-
}
|
|
139
|
-
return null;
|
|
140
|
-
}
|
|
141
|
-
function firstNonWhitespaceCharacter(lineText) {
|
|
142
|
-
const match = /\S/.exec(lineText);
|
|
143
|
-
return (match?.index ?? 0) + 1;
|
|
144
|
-
}
|
|
145
|
-
function resolveSymbolColumn(content, line1, character, symbol) {
|
|
146
|
-
if (typeof character === "number" && character > 0) {
|
|
147
|
-
return { character, strategy: "explicit" };
|
|
148
|
-
}
|
|
149
|
-
const lineText = content.split(/\r?\n/)[line1 - 1] ?? "";
|
|
150
|
-
if (!symbol || symbol.trim().length === 0) {
|
|
151
|
-
return {
|
|
152
|
-
character: 1,
|
|
153
|
-
strategy: "fallback",
|
|
154
|
-
debug: "character omitted and no symbol supplied; using column 1",
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
const { baseSymbol, occurrence, debug } = parseSymbolSelector(symbol);
|
|
158
|
-
if (!baseSymbol) {
|
|
159
|
-
return {
|
|
160
|
-
character: firstNonWhitespaceCharacter(lineText),
|
|
161
|
-
requestedSymbol: symbol,
|
|
162
|
-
baseSymbol,
|
|
163
|
-
requestedOccurrence: occurrence,
|
|
164
|
-
usedOccurrence: 1,
|
|
165
|
-
strategy: "fallback",
|
|
166
|
-
debug: debug ?? "empty symbol selector; using first non-whitespace column",
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
const pattern = `\\b${escapeRegExp(baseSymbol)}\\b`;
|
|
170
|
-
const exactRegex = new RegExp(pattern, "g");
|
|
171
|
-
const exact = findNthMatch(lineText, exactRegex, occurrence);
|
|
172
|
-
if (exact) {
|
|
173
|
-
return {
|
|
174
|
-
character: exact.index + 1,
|
|
175
|
-
requestedSymbol: symbol,
|
|
176
|
-
baseSymbol,
|
|
177
|
-
requestedOccurrence: occurrence,
|
|
178
|
-
usedOccurrence: occurrence,
|
|
179
|
-
strategy: "word-boundary",
|
|
180
|
-
debug,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
const firstExact = findNthMatch(lineText, exactRegex, 1);
|
|
184
|
-
if (firstExact && occurrence !== 1) {
|
|
185
|
-
return {
|
|
186
|
-
character: firstExact.index + 1,
|
|
187
|
-
requestedSymbol: symbol,
|
|
188
|
-
baseSymbol,
|
|
189
|
-
requestedOccurrence: occurrence,
|
|
190
|
-
usedOccurrence: 1,
|
|
191
|
-
strategy: "word-boundary",
|
|
192
|
-
debug: `${debug ? `${debug}; ` : ""}occurrence #${occurrence} not found; using #1`,
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
const insensitiveRegex = new RegExp(pattern, "gi");
|
|
196
|
-
const insensitive = findNthMatch(lineText, insensitiveRegex, occurrence);
|
|
197
|
-
if (insensitive) {
|
|
198
|
-
return {
|
|
199
|
-
character: insensitive.index + 1,
|
|
200
|
-
requestedSymbol: symbol,
|
|
201
|
-
baseSymbol,
|
|
202
|
-
requestedOccurrence: occurrence,
|
|
203
|
-
usedOccurrence: occurrence,
|
|
204
|
-
strategy: "case-insensitive",
|
|
205
|
-
debug: debug ?? "exact-case symbol not found; used case-insensitive match",
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
const firstInsensitive = findNthMatch(lineText, insensitiveRegex, 1);
|
|
209
|
-
if (firstInsensitive && occurrence !== 1) {
|
|
210
|
-
return {
|
|
211
|
-
character: firstInsensitive.index + 1,
|
|
212
|
-
requestedSymbol: symbol,
|
|
213
|
-
baseSymbol,
|
|
214
|
-
requestedOccurrence: occurrence,
|
|
215
|
-
usedOccurrence: 1,
|
|
216
|
-
strategy: "case-insensitive",
|
|
217
|
-
debug: `${debug ? `${debug}; ` : ""}occurrence #${occurrence} not found case-insensitively; using #1`,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
return {
|
|
221
|
-
character: firstNonWhitespaceCharacter(lineText),
|
|
222
|
-
requestedSymbol: symbol,
|
|
223
|
-
baseSymbol,
|
|
224
|
-
requestedOccurrence: occurrence,
|
|
225
|
-
usedOccurrence: 1,
|
|
226
|
-
strategy: "fallback",
|
|
227
|
-
debug: `${debug ? `${debug}; ` : ""}symbol not found on line; using first non-whitespace column`,
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
function tokenAtPosition(content, line1, char1) {
|
|
231
|
-
const lines = content.split(/\r?\n/);
|
|
232
|
-
const line = lines[line1 - 1];
|
|
233
|
-
if (!line)
|
|
234
|
-
return undefined;
|
|
235
|
-
const chars = [...line];
|
|
236
|
-
const idx = Math.max(0, Math.min(chars.length - 1, char1 - 1));
|
|
237
|
-
const isWord = (ch) => !!ch && /[A-Za-z0-9_?!]/.test(ch);
|
|
238
|
-
let left = idx;
|
|
239
|
-
let right = idx;
|
|
240
|
-
if (!isWord(chars[idx]) && isWord(chars[idx + 1])) {
|
|
241
|
-
left = idx + 1;
|
|
242
|
-
right = idx + 1;
|
|
243
|
-
}
|
|
244
|
-
while (left > 0 && isWord(chars[left - 1]))
|
|
245
|
-
left -= 1;
|
|
246
|
-
while (right < chars.length - 1 && isWord(chars[right + 1]))
|
|
247
|
-
right += 1;
|
|
248
|
-
const token = chars
|
|
249
|
-
.slice(left, right + 1)
|
|
250
|
-
.join("")
|
|
251
|
-
.trim();
|
|
252
|
-
return token.length > 0 ? token : undefined;
|
|
253
|
-
}
|
|
254
|
-
function symbolKindLabel(kind) {
|
|
255
|
-
// Single source of truth for LSP SymbolKind names (#883 doctrine; the
|
|
256
|
-
// Sonar-flagged duplicate table lived here). Navigation keeps its own
|
|
257
|
-
// "symbol" fallback for unknown kinds instead of the lsp-symbol-<n> form.
|
|
258
|
-
return kind == null ? "symbol" : (SYMBOL_KIND_NAMES[kind] ?? "symbol");
|
|
259
|
-
}
|
|
260
|
-
function rangeStart(range) {
|
|
261
|
-
const start = range?.start;
|
|
262
|
-
return {
|
|
263
|
-
line: typeof start?.line === "number" ? start.line + 1 : undefined,
|
|
264
|
-
character: typeof start?.character === "number" ? start.character + 1 : undefined,
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
function findSymbolMatches(symbols, query, options) {
|
|
268
|
-
const normalizedQuery = query.trim().toLowerCase();
|
|
269
|
-
if (!normalizedQuery)
|
|
270
|
-
return [];
|
|
271
|
-
const matches = [];
|
|
272
|
-
const matchesText = (symbol) => {
|
|
273
|
-
const values = [symbol.name, symbol.detail]
|
|
274
|
-
.filter((value) => Boolean(value))
|
|
275
|
-
.map((value) => value.trim().toLowerCase());
|
|
276
|
-
return options.exactMatch
|
|
277
|
-
? values.some((value) => value === normalizedQuery)
|
|
278
|
-
: values.some((value) => value.includes(normalizedQuery));
|
|
279
|
-
};
|
|
280
|
-
const matchesKind = (symbol) => {
|
|
281
|
-
if (options.kinds.size === 0)
|
|
282
|
-
return true;
|
|
283
|
-
return options.kinds.has(symbolKindLabel(symbol.kind).toLowerCase());
|
|
284
|
-
};
|
|
285
|
-
const visit = (entries, depth) => {
|
|
286
|
-
for (const symbol of entries) {
|
|
287
|
-
if (symbol.name && matchesText(symbol) && matchesKind(symbol)) {
|
|
288
|
-
const preferredRange = symbol.selectionRange ?? symbol.range;
|
|
289
|
-
const start = rangeStart(preferredRange);
|
|
290
|
-
matches.push({
|
|
291
|
-
name: symbol.name,
|
|
292
|
-
kind: symbolKindLabel(symbol.kind),
|
|
293
|
-
kindCode: symbol.kind,
|
|
294
|
-
detail: symbol.detail,
|
|
295
|
-
line: start.line,
|
|
296
|
-
character: start.character,
|
|
297
|
-
depth,
|
|
298
|
-
location: symbol.location,
|
|
299
|
-
range: preferredRange,
|
|
300
|
-
});
|
|
301
|
-
if (matches.length >= options.maxResults)
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
if (!options.topLevelOnly && symbol.children?.length) {
|
|
305
|
-
visit(symbol.children, depth + 1);
|
|
306
|
-
if (matches.length >= options.maxResults)
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
};
|
|
311
|
-
visit(symbols, 1);
|
|
312
|
-
return matches;
|
|
313
|
-
}
|
|
314
|
-
function flattenSymbols(symbols) {
|
|
315
|
-
const all = [];
|
|
316
|
-
for (const symbol of symbols) {
|
|
317
|
-
all.push(symbol);
|
|
318
|
-
if (symbol.children && symbol.children.length > 0) {
|
|
319
|
-
all.push(...flattenSymbols(symbol.children));
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
return all;
|
|
323
|
-
}
|
|
324
|
-
function pickLocalSymbolLocation(symbols, token, filePath) {
|
|
325
|
-
const flat = flattenSymbols(symbols).filter((symbol) => symbol.name === token);
|
|
326
|
-
if (flat.length === 0)
|
|
327
|
-
return [];
|
|
328
|
-
const uri = pathToFileURL(filePath).href;
|
|
329
|
-
return flat
|
|
330
|
-
.map((symbol) => {
|
|
331
|
-
if (symbol.location?.uri && symbol.location.range) {
|
|
332
|
-
return { uri: symbol.location.uri, range: symbol.location.range };
|
|
333
|
-
}
|
|
334
|
-
if (symbol.range) {
|
|
335
|
-
return { uri, range: symbol.range };
|
|
336
|
-
}
|
|
337
|
-
return undefined;
|
|
338
|
-
})
|
|
339
|
-
.filter((entry) => Boolean(entry));
|
|
340
|
-
}
|
|
341
|
-
function workspaceSymbolDedupeKey(symbol) {
|
|
342
|
-
const location = symbol.location;
|
|
343
|
-
const start = rangeStart(location?.range ?? symbol.range ?? symbol.selectionRange);
|
|
344
|
-
return [
|
|
345
|
-
symbol.name ?? "",
|
|
346
|
-
symbol.detail ?? "",
|
|
347
|
-
symbol.kind ?? "",
|
|
348
|
-
location?.uri ?? "",
|
|
349
|
-
start.line ?? "",
|
|
350
|
-
start.character ?? "",
|
|
351
|
-
].join(":");
|
|
352
|
-
}
|
|
353
|
-
function dedupeWorkspaceSymbols(symbols) {
|
|
354
|
-
const out = [];
|
|
355
|
-
const seen = new Set();
|
|
356
|
-
for (const symbol of symbols) {
|
|
357
|
-
const key = workspaceSymbolDedupeKey(symbol);
|
|
358
|
-
if (seen.has(key))
|
|
359
|
-
continue;
|
|
360
|
-
seen.add(key);
|
|
361
|
-
out.push(symbol);
|
|
362
|
-
}
|
|
363
|
-
return out;
|
|
364
|
-
}
|
|
365
|
-
function asRecord(value) {
|
|
366
|
-
return typeof value === "object" && value !== null
|
|
367
|
-
? value
|
|
368
|
-
: undefined;
|
|
369
|
-
}
|
|
370
|
-
function searchReadFromUriRange(uri, range) {
|
|
371
|
-
if (typeof uri !== "string" || !uri.startsWith("file:"))
|
|
372
|
-
return undefined;
|
|
373
|
-
const rangeLike = asRecord(range);
|
|
374
|
-
const startLine = rangeLike?.start?.line;
|
|
375
|
-
if (typeof startLine !== "number" || !Number.isFinite(startLine)) {
|
|
376
|
-
return undefined;
|
|
377
|
-
}
|
|
378
|
-
const endLine = rangeLike?.end?.line;
|
|
379
|
-
try {
|
|
380
|
-
return {
|
|
381
|
-
file: fileURLToPath(uri),
|
|
382
|
-
startLine: Math.max(1, Math.floor(startLine) + 1),
|
|
383
|
-
endLine: typeof endLine === "number" && Number.isFinite(endLine)
|
|
384
|
-
? Math.max(1, Math.floor(endLine) + 1)
|
|
385
|
-
: undefined,
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
catch {
|
|
389
|
-
return undefined;
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
function pushSearchRead(out, uri, range) {
|
|
393
|
-
const loc = searchReadFromUriRange(uri, range);
|
|
394
|
-
if (loc)
|
|
395
|
-
out.push(loc);
|
|
396
|
-
}
|
|
397
|
-
function collectLocationSearchReads(result) {
|
|
398
|
-
const out = [];
|
|
399
|
-
for (const entry of Array.isArray(result) ? result : [result]) {
|
|
400
|
-
const record = asRecord(entry);
|
|
401
|
-
if (!record)
|
|
402
|
-
continue;
|
|
403
|
-
pushSearchRead(out, record.uri, record.range);
|
|
404
|
-
pushSearchRead(out, record.targetUri, record.targetSelectionRange ?? record.targetRange);
|
|
405
|
-
}
|
|
406
|
-
return out;
|
|
407
|
-
}
|
|
408
|
-
function collectWorkspaceSymbolSearchReads(result) {
|
|
409
|
-
const out = [];
|
|
410
|
-
for (const entry of Array.isArray(result) ? result : [result]) {
|
|
411
|
-
const symbol = asRecord(entry);
|
|
412
|
-
const location = asRecord(symbol?.location);
|
|
413
|
-
if (!location)
|
|
414
|
-
continue;
|
|
415
|
-
pushSearchRead(out, location.uri, location.range);
|
|
416
|
-
pushSearchRead(out, location.targetUri, location.targetSelectionRange ?? location.targetRange);
|
|
417
|
-
}
|
|
418
|
-
return out;
|
|
419
|
-
}
|
|
420
|
-
function collectCallHierarchySearchReads(result, operation, callHierarchyItem) {
|
|
421
|
-
const out = [];
|
|
422
|
-
for (const entry of Array.isArray(result) ? result : [result]) {
|
|
423
|
-
const record = asRecord(entry);
|
|
424
|
-
if (!record)
|
|
425
|
-
continue;
|
|
426
|
-
const item = asRecord(operation === "incomingCalls" ? record.from : record.to);
|
|
427
|
-
pushSearchRead(out, item?.uri, item?.selectionRange ?? item?.range);
|
|
428
|
-
const rangeUri = operation === "incomingCalls" ? item?.uri : callHierarchyItem?.uri;
|
|
429
|
-
const fromRanges = record.fromRanges;
|
|
430
|
-
if (Array.isArray(fromRanges)) {
|
|
431
|
-
for (const range of fromRanges)
|
|
432
|
-
pushSearchRead(out, rangeUri, range);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
return out;
|
|
436
|
-
}
|
|
437
|
-
function collectSearchReadsForOperation(operation, result, callHierarchyItem) {
|
|
438
|
-
if ([
|
|
439
|
-
"definition",
|
|
440
|
-
"typeDefinition",
|
|
441
|
-
"declaration",
|
|
442
|
-
"references",
|
|
443
|
-
"implementation",
|
|
444
|
-
].includes(operation)) {
|
|
445
|
-
return collectLocationSearchReads(result);
|
|
446
|
-
}
|
|
447
|
-
if (operation === "workspaceSymbol") {
|
|
448
|
-
return collectWorkspaceSymbolSearchReads(result);
|
|
449
|
-
}
|
|
450
|
-
if (operation === "incomingCalls" || operation === "outgoingCalls") {
|
|
451
|
-
return collectCallHierarchySearchReads(result, operation, callHierarchyItem);
|
|
452
|
-
}
|
|
453
|
-
return [];
|
|
454
|
-
}
|
|
455
|
-
function formatCapabilities(snapshots, filePath) {
|
|
456
|
-
if (snapshots.length === 0) {
|
|
457
|
-
return filePath
|
|
458
|
-
? `No active LSP server for ${path.basename(filePath)}. Open/touch the file first or run another LSP operation to start the server.`
|
|
459
|
-
: "No active LSP servers in this session.";
|
|
460
|
-
}
|
|
461
|
-
const rows = [
|
|
462
|
-
["definition", (s) => !!s.operationSupport.definition],
|
|
463
|
-
["typeDefinition", (s) => !!s.operationSupport.typeDefinition],
|
|
464
|
-
["declaration", (s) => !!s.operationSupport.declaration],
|
|
465
|
-
["references", (s) => !!s.operationSupport.references],
|
|
466
|
-
["hover", (s) => !!s.operationSupport.hover],
|
|
467
|
-
["rename", (s) => !!s.operationSupport.rename],
|
|
468
|
-
["codeAction", (s) => !!s.operationSupport.codeAction],
|
|
469
|
-
["codeAction/resolve", (s) => !!s.operationSupport.codeActionResolve],
|
|
470
|
-
["workspace/willRenameFiles", (s) => !!s.operationSupport.willRenameFiles],
|
|
471
|
-
["workspaceSymbol", (s) => !!s.operationSupport.workspaceSymbol],
|
|
472
|
-
["implementation", (s) => !!s.operationSupport.implementation],
|
|
473
|
-
["signatureHelp", (s) => !!s.operationSupport.signatureHelp],
|
|
474
|
-
["incomingCalls", (s) => !!s.operationSupport.callHierarchy],
|
|
475
|
-
["outgoingCalls", (s) => !!s.operationSupport.callHierarchy],
|
|
476
|
-
[
|
|
477
|
-
"workspaceDiagnostics",
|
|
478
|
-
(s) => s.workspaceDiagnosticsSupport.mode === "pull",
|
|
479
|
-
"pull diagnostics",
|
|
480
|
-
],
|
|
481
|
-
[
|
|
482
|
-
"rename_file",
|
|
483
|
-
() => true,
|
|
484
|
-
"filesystem rename; preflight support shown above",
|
|
485
|
-
],
|
|
486
|
-
];
|
|
487
|
-
const lines = [];
|
|
488
|
-
for (const snapshot of snapshots) {
|
|
489
|
-
const label = filePath
|
|
490
|
-
? `${snapshot.serverId} (${path.basename(filePath)})`
|
|
491
|
-
: `${snapshot.serverId} (${snapshot.root})`;
|
|
492
|
-
lines.push(label);
|
|
493
|
-
for (const [name, supported, note] of rows) {
|
|
494
|
-
const suffix = note ? ` (${note})` : "";
|
|
495
|
-
lines.push(` ${name} ${supported(snapshot) ? "✓" : "✗"}${suffix}`);
|
|
496
|
-
}
|
|
497
|
-
const commands = snapshot.advertisedCommands ?? [];
|
|
498
|
-
lines.push(` executeCommand ${commands.length > 0 ? "✓" : "✗"} (${commands.length} advertised command(s)` +
|
|
499
|
-
(commands.length > 0 ? `: ${commands.slice(0, 20).join(", ")}` : "") +
|
|
500
|
-
")");
|
|
501
|
-
}
|
|
502
|
-
return lines.join("\n");
|
|
503
|
-
}
|
|
504
|
-
function classifyCodeActions(actions) {
|
|
505
|
-
if (!actions || actions.length === 0)
|
|
506
|
-
return { quickfix: 0, refactor: 0, other: 0 };
|
|
507
|
-
let quickfix = 0;
|
|
508
|
-
let refactor = 0;
|
|
509
|
-
let other = 0;
|
|
510
|
-
for (const action of actions) {
|
|
511
|
-
const kind = action.kind ?? "";
|
|
512
|
-
if (kind.startsWith("quickfix"))
|
|
513
|
-
quickfix += 1;
|
|
514
|
-
else if (kind.startsWith("refactor"))
|
|
515
|
-
refactor += 1;
|
|
516
|
-
else
|
|
517
|
-
other += 1;
|
|
518
|
-
}
|
|
519
|
-
return { quickfix, refactor, other };
|
|
520
|
-
}
|
|
521
|
-
async function openFileBestEffort(lspService, filePath, waitForDiagnostics = false) {
|
|
522
|
-
let fileContent;
|
|
523
|
-
try {
|
|
524
|
-
fileContent = nodeFs.readFileSync(filePath, "utf-8");
|
|
525
|
-
}
|
|
526
|
-
catch {
|
|
527
|
-
return;
|
|
528
|
-
}
|
|
529
|
-
if (!fileContent)
|
|
530
|
-
return;
|
|
531
|
-
try {
|
|
532
|
-
// #2598: `touchFile` is defined unconditionally on the real `LSPService`
|
|
533
|
-
// (clients/lsp/index.ts), so the former `typeof … === "function"` hedge
|
|
534
|
-
// and its `openFile` arm were reachable only from a partial test double
|
|
535
|
-
// (AGENTS.md shape 7). Nothing here reads the result — a touch that
|
|
536
|
-
// resolves no clients is already the no-op this helper wants.
|
|
537
|
-
await lspService.touchFile(filePath, fileContent, {
|
|
538
|
-
diagnostics: waitForDiagnostics ? "document" : "none",
|
|
539
|
-
source: "lsp_navigation",
|
|
540
|
-
clientScope: waitForDiagnostics ? "all" : "primary",
|
|
541
|
-
});
|
|
542
|
-
}
|
|
543
|
-
catch {
|
|
544
|
-
/* LSP server may not be ready yet — proceed anyway */
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
export function createLspNavigationTool(
|
|
548
|
-
/**
|
|
549
|
-
* Resolves a flag, optionally scoped to a call's `cwd` (#792). Callers that
|
|
550
|
-
* need per-request project config (e.g. the MCP host, which has no single
|
|
551
|
-
* "current project root" the way an in-pi session does) can rebuild their
|
|
552
|
-
* flag resolver against `cwd` instead of whatever directory the tool was
|
|
553
|
-
* constructed in; callers that only have a single fixed project root (e.g.
|
|
554
|
-
* pi's own `getLensFlag`) may ignore the second argument.
|
|
555
|
-
*/
|
|
556
|
-
getFlag, mutationDeps) {
|
|
557
|
-
return {
|
|
558
|
-
name: "lsp_navigation",
|
|
559
|
-
label: "LSP Navigate",
|
|
560
|
-
description: 'Navigate source with language-server operations such as definition, references, hover, and rename. Example: use `{operation: "references", path: "src/app.ts", line: 12}`.',
|
|
561
|
-
promptSnippet: "Navigate definitions and references with LSP",
|
|
562
|
-
renderResult: compactRenderResult(({ details, args, isError, text }) => {
|
|
563
|
-
const op = details?.operation ??
|
|
564
|
-
(typeof args.operation === "string" ? args.operation : "lsp");
|
|
565
|
-
if (isError || details?.supported === false) {
|
|
566
|
-
return `lsp_navigation ${op} — ${details?.emptyReason ?? text.split("\n")[0] ?? "unavailable"}`;
|
|
567
|
-
}
|
|
568
|
-
const n = details?.resultCount ?? 0;
|
|
569
|
-
if (n === 0) {
|
|
570
|
-
return `lsp_navigation ${op} — ${details?.emptyReason ?? "no results"}`;
|
|
571
|
-
}
|
|
572
|
-
return `lsp_navigation ${op} — ${n} result${n === 1 ? "" : "s"}`;
|
|
573
|
-
}),
|
|
574
|
-
parameters: Type.Object({
|
|
575
|
-
operation: Type.String({
|
|
576
|
-
description: "LSP operation to perform. Valid values: definition, typeDefinition, declaration, references, hover, signatureHelp, documentSymbol, findSymbol, workspaceSymbol, codeAction, rename, rename_file, implementation, prepareCallHierarchy, incomingCalls, outgoingCalls, executeCommand, workspaceDiagnostics, capabilities.",
|
|
577
|
-
}),
|
|
578
|
-
path: Type.Optional(Type.String({
|
|
579
|
-
description: "Target file path.",
|
|
580
|
-
})),
|
|
581
|
-
line: Type.Optional(Type.Number({
|
|
582
|
-
description: "1-based line number.",
|
|
583
|
-
})),
|
|
584
|
-
character: Type.Optional(Type.Number({
|
|
585
|
-
description: "1-based character offset.",
|
|
586
|
-
})),
|
|
587
|
-
symbol: Type.Optional(Type.String({
|
|
588
|
-
description: "Symbol for automatic character resolution.",
|
|
589
|
-
})),
|
|
590
|
-
endLine: Type.Optional(Type.Number({
|
|
591
|
-
description: "1-based range end line.",
|
|
592
|
-
})),
|
|
593
|
-
endCharacter: Type.Optional(Type.Number({
|
|
594
|
-
description: "1-based range end character.",
|
|
595
|
-
})),
|
|
596
|
-
newName: Type.Optional(Type.String({
|
|
597
|
-
description: "New symbol name.",
|
|
598
|
-
})),
|
|
599
|
-
newFilePath: Type.Optional(Type.String({
|
|
600
|
-
description: "New file path.",
|
|
601
|
-
})),
|
|
602
|
-
apply: Type.Optional(Type.Boolean({
|
|
603
|
-
description: "Apply a mutation instead of previewing it.",
|
|
604
|
-
})),
|
|
605
|
-
command: Type.Optional(Type.String({
|
|
606
|
-
description: "Server command identifier.",
|
|
607
|
-
})),
|
|
608
|
-
commandArguments: Type.Optional(Type.Array(Type.Unknown(), {
|
|
609
|
-
description: "Arguments for the server command.",
|
|
610
|
-
})),
|
|
611
|
-
query: Type.Optional(Type.String({
|
|
612
|
-
description: "Symbol search query.",
|
|
613
|
-
})),
|
|
614
|
-
kinds: Type.Optional(Type.Array(Type.String(), {
|
|
615
|
-
description: "Symbol-kind filters.",
|
|
616
|
-
})),
|
|
617
|
-
exactMatch: Type.Optional(Type.Boolean({
|
|
618
|
-
description: "Require an exact symbol match.",
|
|
619
|
-
})),
|
|
620
|
-
topLevelOnly: Type.Optional(Type.Boolean({
|
|
621
|
-
description: "Exclude nested symbols.",
|
|
622
|
-
})),
|
|
623
|
-
maxResults: Type.Optional(Type.Number({
|
|
624
|
-
description: "Maximum symbol matches.",
|
|
625
|
-
})),
|
|
626
|
-
callHierarchyItem: Type.Optional(Type.Object({
|
|
627
|
-
name: Type.String(),
|
|
628
|
-
kind: Type.Number(),
|
|
629
|
-
uri: Type.String(),
|
|
630
|
-
range: Type.Object({
|
|
631
|
-
start: Type.Object({
|
|
632
|
-
line: Type.Number(),
|
|
633
|
-
character: Type.Number(),
|
|
634
|
-
}),
|
|
635
|
-
end: Type.Object({
|
|
636
|
-
line: Type.Number(),
|
|
637
|
-
character: Type.Number(),
|
|
638
|
-
}),
|
|
639
|
-
}),
|
|
640
|
-
selectionRange: Type.Object({
|
|
641
|
-
start: Type.Object({
|
|
642
|
-
line: Type.Number(),
|
|
643
|
-
character: Type.Number(),
|
|
644
|
-
}),
|
|
645
|
-
end: Type.Object({
|
|
646
|
-
line: Type.Number(),
|
|
647
|
-
character: Type.Number(),
|
|
648
|
-
}),
|
|
649
|
-
}),
|
|
650
|
-
}, {})),
|
|
651
|
-
}),
|
|
652
|
-
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
653
|
-
const startedAt = Date.now();
|
|
654
|
-
let supported = null;
|
|
655
|
-
let diagnosticsMode = "unknown";
|
|
656
|
-
let columnResolution;
|
|
657
|
-
let mutationContext;
|
|
658
|
-
let requestedApply = false;
|
|
659
|
-
const workspaceScopeAttribution = {};
|
|
660
|
-
const finalize = (payload, meta) => {
|
|
661
|
-
if (payload.isError &&
|
|
662
|
-
requestedApply &&
|
|
663
|
-
mutationContext &&
|
|
664
|
-
["rename", "rename_file", "executeCommand"].includes(meta.operation)) {
|
|
665
|
-
recordLspMutationOutcome(mutationContext, "failed");
|
|
666
|
-
}
|
|
667
|
-
const normalizedFilePath = meta.filePath.replace(/\\/g, "/");
|
|
668
|
-
logLatency({
|
|
669
|
-
type: "phase",
|
|
670
|
-
phase: "lsp_navigation_result",
|
|
671
|
-
filePath: normalizedFilePath,
|
|
672
|
-
durationMs: Date.now() - startedAt,
|
|
673
|
-
metadata: {
|
|
674
|
-
operation: meta.operation,
|
|
675
|
-
failureKind: meta.failureKind,
|
|
676
|
-
resultCount: meta.resultCount,
|
|
677
|
-
supported,
|
|
678
|
-
diagnosticsMode,
|
|
679
|
-
columnResolution,
|
|
680
|
-
...(Object.keys(workspaceScopeAttribution).length > 0
|
|
681
|
-
? { workspaceScopeAttribution }
|
|
682
|
-
: {}),
|
|
683
|
-
},
|
|
684
|
-
});
|
|
685
|
-
const text = payload.content[0]?.text ?? "";
|
|
686
|
-
const envelope = buildLspNavigationEnvelope({
|
|
687
|
-
operation: meta.operation,
|
|
688
|
-
filePath: meta.filePath,
|
|
689
|
-
failureKind: meta.failureKind,
|
|
690
|
-
resultCount: meta.resultCount,
|
|
691
|
-
text,
|
|
692
|
-
isError: payload.isError,
|
|
693
|
-
details: payload.details,
|
|
694
|
-
});
|
|
695
|
-
return {
|
|
696
|
-
...payload,
|
|
697
|
-
content: [
|
|
698
|
-
{
|
|
699
|
-
type: "text",
|
|
700
|
-
// Compact JSON: omit indentation. Saves ~50% on rename / workspace-edits payloads
|
|
701
|
-
// while keeping the envelope machine-parseable. Tests use JSON.parse so
|
|
702
|
-
// they are agnostic to whitespace.
|
|
703
|
-
text: JSON.stringify(envelope),
|
|
704
|
-
},
|
|
705
|
-
],
|
|
706
|
-
details: {
|
|
707
|
-
...payload.details,
|
|
708
|
-
failureKind: meta.failureKind,
|
|
709
|
-
},
|
|
710
|
-
};
|
|
711
|
-
};
|
|
712
|
-
if (getFlag("no-lsp", ctx.cwd)) {
|
|
713
|
-
return finalize({
|
|
714
|
-
content: [
|
|
715
|
-
{
|
|
716
|
-
type: "text",
|
|
717
|
-
text: "lsp_navigation requires LSP to be enabled. Remove --no-lsp to use LSP navigation.",
|
|
718
|
-
},
|
|
719
|
-
],
|
|
720
|
-
isError: true,
|
|
721
|
-
}, {
|
|
722
|
-
operation: "precheck",
|
|
723
|
-
filePath: "(workspace)",
|
|
724
|
-
failureKind: "lsp_disabled",
|
|
725
|
-
resultCount: 0,
|
|
726
|
-
});
|
|
727
|
-
}
|
|
728
|
-
const { operation: rawOperation, path: rawPath, line, character, symbol, endLine, endCharacter, newName, newFilePath, apply, command, commandArguments, query, kinds, exactMatch, topLevelOnly, maxResults, callHierarchyItem, } = params;
|
|
729
|
-
const normalizedOperation = normalizeOperation(rawOperation);
|
|
730
|
-
if (!isValidOperation(normalizedOperation)) {
|
|
731
|
-
return finalize({
|
|
732
|
-
content: [
|
|
733
|
-
{
|
|
734
|
-
type: "text",
|
|
735
|
-
text: `Unknown lsp_navigation operation "${normalizedOperation || String(rawOperation ?? "") || ""}". ` +
|
|
736
|
-
`Valid operations: ${VALID_OPERATIONS.join(", ")}`,
|
|
737
|
-
},
|
|
738
|
-
],
|
|
739
|
-
isError: true,
|
|
740
|
-
details: {
|
|
741
|
-
rawOperation,
|
|
742
|
-
normalizedOperation,
|
|
743
|
-
validOperations: VALID_OPERATIONS,
|
|
744
|
-
},
|
|
745
|
-
}, {
|
|
746
|
-
operation: normalizedOperation || "invalid",
|
|
747
|
-
filePath: "(workspace)",
|
|
748
|
-
failureKind: "invalid_operation",
|
|
749
|
-
resultCount: 0,
|
|
750
|
-
});
|
|
751
|
-
}
|
|
752
|
-
const operation = normalizedOperation;
|
|
753
|
-
requestedApply = apply === true;
|
|
754
|
-
if (requestedApply &&
|
|
755
|
-
["rename", "rename_file", "executeCommand"].includes(operation)) {
|
|
756
|
-
const cwd = ctx.cwd || ".";
|
|
757
|
-
// Name the specific LSP operation in the receipt rather than a
|
|
758
|
-
// generic "lsp-edit" tag, so a rename's change-log entry reads
|
|
759
|
-
// differently from an executeCommand-solicited edit (#2450).
|
|
760
|
-
const mutationSource = operation === "executeCommand" ? "lsp-execute-command" : "lsp-rename";
|
|
761
|
-
mutationContext = {
|
|
762
|
-
cwd,
|
|
763
|
-
correlationId: newLspMutationCorrelationId(_toolCallId),
|
|
764
|
-
tool: `lsp_navigation:${operation}`,
|
|
765
|
-
source: mutationSource,
|
|
766
|
-
...mutationDeps,
|
|
767
|
-
readGuard: getFlag("no-read-guard", cwd)
|
|
768
|
-
? undefined
|
|
769
|
-
: mutationDeps?.readGuard,
|
|
770
|
-
// #2450 review round 2 (F4)/round 3 (F2, F4): the SAME gate
|
|
771
|
-
// `registerMutationBridge` applies internally in `index.ts`, so
|
|
772
|
-
// this directly-threaded path and the bridge fallback
|
|
773
|
-
// (`clients/lsp-mutation.ts`, reached when `mutationDeps` is
|
|
774
|
-
// absent/partial — e.g. the MCP server) agree on which files
|
|
775
|
-
// count as project source, rather than the direct path
|
|
776
|
-
// recording an ignored/vendor write the fallback would drop.
|
|
777
|
-
// `no-read-guard` is intentionally NOT checked here (round 3
|
|
778
|
-
// F2): it gates only the read-guard stamp above, the same
|
|
779
|
-
// canonical split `clients/runtime-tool-result.ts` applies
|
|
780
|
-
// (`:1120`, `:1485`) — bookkeeping (turn-state / receipts)
|
|
781
|
-
// still runs under `--no-read-guard`. Judge against the
|
|
782
|
-
// project root, not the request `cwd` (round 3 F4): a
|
|
783
|
-
// sub-package `cwd` must not read a sibling-package rename as
|
|
784
|
-
// external.
|
|
785
|
-
isRecordable: (filePath) => {
|
|
786
|
-
return isRecordableProjectPath(filePath, mutationDeps?.runtime?.projectRoot ?? cwd);
|
|
787
|
-
},
|
|
788
|
-
};
|
|
789
|
-
}
|
|
790
|
-
const isCallHierarchyTraversal = operation === "incomingCalls" || operation === "outgoingCalls";
|
|
791
|
-
const needsFilePath = operation !== "workspaceDiagnostics" &&
|
|
792
|
-
operation !== "workspaceSymbol" &&
|
|
793
|
-
operation !== "executeCommand" &&
|
|
794
|
-
operation !== "capabilities" &&
|
|
795
|
-
!isCallHierarchyTraversal;
|
|
796
|
-
if (needsFilePath && (!rawPath || rawPath.trim().length === 0)) {
|
|
797
|
-
return finalize({
|
|
798
|
-
content: [
|
|
799
|
-
{
|
|
800
|
-
type: "text",
|
|
801
|
-
text: `path is required for ${operation}`,
|
|
802
|
-
},
|
|
803
|
-
],
|
|
804
|
-
isError: true,
|
|
805
|
-
}, {
|
|
806
|
-
operation,
|
|
807
|
-
filePath: "(workspace)",
|
|
808
|
-
failureKind: "missing_file_path",
|
|
809
|
-
resultCount: 0,
|
|
810
|
-
});
|
|
811
|
-
}
|
|
812
|
-
const filePath = rawPath
|
|
813
|
-
? path.isAbsolute(rawPath)
|
|
814
|
-
? rawPath
|
|
815
|
-
: path.resolve(ctx.cwd || ".", rawPath)
|
|
816
|
-
: "";
|
|
817
|
-
let filePathIsDirectory = false;
|
|
818
|
-
if (filePath) {
|
|
819
|
-
try {
|
|
820
|
-
filePathIsDirectory = nodeFs.statSync(filePath).isDirectory();
|
|
821
|
-
}
|
|
822
|
-
catch {
|
|
823
|
-
// non-existent path — existing error paths handle this
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
const lspService = getLSPService();
|
|
827
|
-
if (operation === "capabilities") {
|
|
828
|
-
const snapshots = rawPath
|
|
829
|
-
? await lspService.getCapabilitySnapshots(filePath)
|
|
830
|
-
: await lspService.getCapabilitySnapshots(undefined, workspaceScopeAttribution);
|
|
831
|
-
const output = formatCapabilities(snapshots, rawPath ? filePath : undefined);
|
|
832
|
-
return finalize({
|
|
833
|
-
content: [{ type: "text", text: output }],
|
|
834
|
-
details: {
|
|
835
|
-
operation,
|
|
836
|
-
resultCount: snapshots.length,
|
|
837
|
-
servers: snapshots.map((snapshot) => snapshot.serverId),
|
|
838
|
-
},
|
|
839
|
-
}, {
|
|
840
|
-
operation,
|
|
841
|
-
filePath: rawPath ? filePath : "(workspace)",
|
|
842
|
-
failureKind: snapshots.length === 0 ? "empty_result" : "success",
|
|
843
|
-
resultCount: snapshots.length,
|
|
844
|
-
});
|
|
845
|
-
}
|
|
846
|
-
if (operation === "workspaceDiagnostics") {
|
|
847
|
-
const wsDiagSupport = rawPath
|
|
848
|
-
? await lspService.getWorkspaceDiagnosticsSupport(filePath)
|
|
849
|
-
: await lspService.getWorkspaceDiagnosticsSupport(undefined, workspaceScopeAttribution);
|
|
850
|
-
diagnosticsMode = wsDiagSupport?.mode ?? "unknown";
|
|
851
|
-
if (rawPath && !filePathIsDirectory) {
|
|
852
|
-
const hasLSP = lspService.supportsLSP(filePath);
|
|
853
|
-
if (!hasLSP) {
|
|
854
|
-
return finalize({
|
|
855
|
-
content: [
|
|
856
|
-
{
|
|
857
|
-
type: "text",
|
|
858
|
-
text: `No LSP server available for ${path.basename(filePath)}. Check that the language server is installed.`,
|
|
859
|
-
},
|
|
860
|
-
],
|
|
861
|
-
isError: true,
|
|
862
|
-
}, {
|
|
863
|
-
operation,
|
|
864
|
-
filePath,
|
|
865
|
-
failureKind: "no_server",
|
|
866
|
-
resultCount: 0,
|
|
867
|
-
});
|
|
868
|
-
}
|
|
869
|
-
await openFileBestEffort(lspService, filePath, true);
|
|
870
|
-
const diagnostics = await lspService.getDiagnostics(filePath);
|
|
871
|
-
const result = [
|
|
872
|
-
{
|
|
873
|
-
filePath,
|
|
874
|
-
diagnostics,
|
|
875
|
-
count: diagnostics.length,
|
|
876
|
-
},
|
|
877
|
-
];
|
|
878
|
-
const noteMap = {
|
|
879
|
-
pull: "Note: path mode requests pull diagnostics for this file and returns the aggregated result",
|
|
880
|
-
"push-only": "Note: server is push-only; result depends on published diagnostics for this file",
|
|
881
|
-
};
|
|
882
|
-
const note = noteMap[diagnosticsMode] ??
|
|
883
|
-
"Note: workspace diagnostics mode unknown (no active capability snapshot)";
|
|
884
|
-
const resultCount = diagnostics.length;
|
|
885
|
-
return finalize({
|
|
886
|
-
content: [
|
|
887
|
-
{
|
|
888
|
-
type: "text",
|
|
889
|
-
text: `${note}\n${JSON.stringify(result)}`,
|
|
890
|
-
},
|
|
891
|
-
],
|
|
892
|
-
details: {
|
|
893
|
-
operation,
|
|
894
|
-
resultCount,
|
|
895
|
-
diagnosticsMode,
|
|
896
|
-
coverage: "requested-file",
|
|
897
|
-
},
|
|
898
|
-
}, {
|
|
899
|
-
operation,
|
|
900
|
-
filePath,
|
|
901
|
-
failureKind: resultCount === 0 ? "empty_result" : "success",
|
|
902
|
-
resultCount,
|
|
903
|
-
});
|
|
904
|
-
}
|
|
905
|
-
const allDiagnostics = await lspService.getAllDiagnostics();
|
|
906
|
-
const result = Array.from(allDiagnostics.entries()).map(([trackedFile, { diags }]) => ({
|
|
907
|
-
filePath: trackedFile,
|
|
908
|
-
diagnostics: diags,
|
|
909
|
-
count: diags.length,
|
|
910
|
-
}));
|
|
911
|
-
const noteMap2 = {
|
|
912
|
-
"push-only": "Note: push-only tracked diagnostics snapshot (not full workspace pull diagnostics).",
|
|
913
|
-
pull: "Note: tracked diagnostics snapshot from active clients. Provide path to force file-level diagnostics collection",
|
|
914
|
-
};
|
|
915
|
-
const note = noteMap2[diagnosticsMode] ??
|
|
916
|
-
"Note: workspace diagnostics mode unknown (no active capability snapshot)";
|
|
917
|
-
return finalize({
|
|
918
|
-
content: [
|
|
919
|
-
{
|
|
920
|
-
type: "text",
|
|
921
|
-
text: `${note}\n${JSON.stringify(result)}`,
|
|
922
|
-
},
|
|
923
|
-
],
|
|
924
|
-
details: {
|
|
925
|
-
operation,
|
|
926
|
-
resultCount: result.length,
|
|
927
|
-
diagnosticsMode,
|
|
928
|
-
coverage: "tracked-open-files",
|
|
929
|
-
},
|
|
930
|
-
}, {
|
|
931
|
-
operation,
|
|
932
|
-
filePath: rawPath ? filePath : "(workspace)",
|
|
933
|
-
failureKind: diagnosticsMode === "push-only" ? "tracked_snapshot" : "success",
|
|
934
|
-
resultCount: result.length,
|
|
935
|
-
});
|
|
936
|
-
}
|
|
937
|
-
if (needsFilePath && filePathIsDirectory) {
|
|
938
|
-
return finalize({
|
|
939
|
-
content: [
|
|
940
|
-
{
|
|
941
|
-
type: "text",
|
|
942
|
-
text: `path must be a source file, got directory: ${filePath}. Pass a source file path, or omit path for workspace-level operations.`,
|
|
943
|
-
},
|
|
944
|
-
],
|
|
945
|
-
isError: true,
|
|
946
|
-
}, {
|
|
947
|
-
operation,
|
|
948
|
-
filePath,
|
|
949
|
-
failureKind: "filepath_is_directory",
|
|
950
|
-
resultCount: 0,
|
|
951
|
-
});
|
|
952
|
-
}
|
|
953
|
-
const hasLSP = filePath ? lspService.supportsLSP(filePath) : false;
|
|
954
|
-
if (needsFilePath && !hasLSP) {
|
|
955
|
-
return finalize({
|
|
956
|
-
content: [
|
|
957
|
-
{
|
|
958
|
-
type: "text",
|
|
959
|
-
text: `No LSP server available for ${path.basename(filePath)}. Check that the language server is installed.`,
|
|
960
|
-
},
|
|
961
|
-
],
|
|
962
|
-
isError: true,
|
|
963
|
-
}, {
|
|
964
|
-
operation,
|
|
965
|
-
filePath,
|
|
966
|
-
failureKind: "no_server",
|
|
967
|
-
resultCount: 0,
|
|
968
|
-
});
|
|
969
|
-
}
|
|
970
|
-
if (needsFilePath) {
|
|
971
|
-
const support = await lspService.getOperationSupport(filePath);
|
|
972
|
-
supported = operationSupportStatus(operation, support);
|
|
973
|
-
if (supported === false) {
|
|
974
|
-
return finalize({
|
|
975
|
-
content: [
|
|
976
|
-
{
|
|
977
|
-
type: "text",
|
|
978
|
-
text: `LSP server for ${path.basename(filePath)} does not advertise support for ${operation}`,
|
|
979
|
-
},
|
|
980
|
-
],
|
|
981
|
-
isError: true,
|
|
982
|
-
details: {
|
|
983
|
-
operation,
|
|
984
|
-
supported: false,
|
|
985
|
-
emptyReason: "unsupported",
|
|
986
|
-
},
|
|
987
|
-
}, { operation, filePath, failureKind: "unsupported", resultCount: 0 });
|
|
988
|
-
}
|
|
989
|
-
await openFileBestEffort(lspService, filePath);
|
|
990
|
-
}
|
|
991
|
-
// Convert 1-based editor coords to 0-based LSP coords.
|
|
992
|
-
const lspLine = (line ?? 1) - 1;
|
|
993
|
-
const needsPosition = [
|
|
994
|
-
"definition",
|
|
995
|
-
"typeDefinition",
|
|
996
|
-
"declaration",
|
|
997
|
-
"references",
|
|
998
|
-
"hover",
|
|
999
|
-
"signatureHelp",
|
|
1000
|
-
"codeAction",
|
|
1001
|
-
"rename",
|
|
1002
|
-
"implementation",
|
|
1003
|
-
"prepareCallHierarchy",
|
|
1004
|
-
].includes(operation);
|
|
1005
|
-
const resolvedCharacter = needsPosition && filePath
|
|
1006
|
-
? resolveSymbolColumn(nodeFs.existsSync(filePath)
|
|
1007
|
-
? nodeFs.readFileSync(filePath, "utf-8")
|
|
1008
|
-
: "", line ?? 1, character, symbol)
|
|
1009
|
-
: {
|
|
1010
|
-
character: character ?? 1,
|
|
1011
|
-
strategy: "explicit",
|
|
1012
|
-
};
|
|
1013
|
-
columnResolution = resolvedCharacter;
|
|
1014
|
-
const lspChar = resolvedCharacter.character - 1;
|
|
1015
|
-
const lspEndLine = (endLine ?? line ?? 1) - 1;
|
|
1016
|
-
const lspEndChar = (endCharacter ?? resolvedCharacter.character) - 1;
|
|
1017
|
-
const runWorkspaceSymbolOperation = async () => {
|
|
1018
|
-
const support = rawPath
|
|
1019
|
-
? await lspService.getOperationSupport(filePath)
|
|
1020
|
-
: await lspService.getOperationSupport(undefined, workspaceScopeAttribution);
|
|
1021
|
-
supported = operationSupportStatus(operation, support);
|
|
1022
|
-
if (supported === false) {
|
|
1023
|
-
throw new Error("__UNSUPPORTED__ Active LSP server does not advertise support for workspaceSymbol");
|
|
1024
|
-
}
|
|
1025
|
-
if (!query || query.trim().length === 0) {
|
|
1026
|
-
throw new Error("__BADINPUT__ query parameter required for workspaceSymbol");
|
|
1027
|
-
}
|
|
1028
|
-
if (rawPath) {
|
|
1029
|
-
await openFileBestEffort(lspService, filePath);
|
|
1030
|
-
}
|
|
1031
|
-
try {
|
|
1032
|
-
const raw = rawPath
|
|
1033
|
-
? await lspService.workspaceSymbol(query ?? "", filePath)
|
|
1034
|
-
: await lspService.workspaceSymbol(query ?? "", undefined, workspaceScopeAttribution);
|
|
1035
|
-
const filtered = (Array.isArray(raw) ? raw : [raw]).filter((s) => typeof s === "object" &&
|
|
1036
|
-
s !== null &&
|
|
1037
|
-
(!s.kind || NAVIGABLE_SYMBOL_KINDS.has(s.kind)));
|
|
1038
|
-
return dedupeWorkspaceSymbols(filtered).slice(0, 15);
|
|
1039
|
-
}
|
|
1040
|
-
catch (err) {
|
|
1041
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
1042
|
-
if (rawPath && /No Project/i.test(msg)) {
|
|
1043
|
-
await openFileBestEffort(lspService, filePath);
|
|
1044
|
-
await new Promise((resolve) => setTimeout(resolve, 120));
|
|
1045
|
-
const retryRaw = await lspService.workspaceSymbol(query ?? "", filePath);
|
|
1046
|
-
const retrySymbols = (Array.isArray(retryRaw) ? retryRaw : [retryRaw]).filter((s) => typeof s === "object" && s !== null);
|
|
1047
|
-
return dedupeWorkspaceSymbols(retrySymbols);
|
|
1048
|
-
}
|
|
1049
|
-
throw err;
|
|
1050
|
-
}
|
|
1051
|
-
};
|
|
1052
|
-
const runOperation = async () => {
|
|
1053
|
-
switch (operation) {
|
|
1054
|
-
case "definition":
|
|
1055
|
-
return lspService.definition(filePath, lspLine, lspChar);
|
|
1056
|
-
case "typeDefinition":
|
|
1057
|
-
return lspService.typeDefinition(filePath, lspLine, lspChar);
|
|
1058
|
-
case "declaration":
|
|
1059
|
-
return lspService.declaration(filePath, lspLine, lspChar);
|
|
1060
|
-
case "references":
|
|
1061
|
-
return lspService.references(filePath, lspLine, lspChar);
|
|
1062
|
-
case "hover":
|
|
1063
|
-
return lspService.hover(filePath, lspLine, lspChar);
|
|
1064
|
-
case "signatureHelp":
|
|
1065
|
-
return lspService.signatureHelp(filePath, lspLine, lspChar);
|
|
1066
|
-
case "documentSymbol":
|
|
1067
|
-
return lspService.documentSymbol(filePath);
|
|
1068
|
-
case "findSymbol": {
|
|
1069
|
-
if (!query || query.trim().length === 0) {
|
|
1070
|
-
throw new Error("__BADINPUT__ query parameter required for findSymbol");
|
|
1071
|
-
}
|
|
1072
|
-
const symbols = (await lspService.documentSymbol(filePath));
|
|
1073
|
-
return findSymbolMatches(symbols, query, {
|
|
1074
|
-
maxResults: Math.max(1, Math.min(100, maxResults ?? 20)),
|
|
1075
|
-
topLevelOnly: topLevelOnly ?? false,
|
|
1076
|
-
exactMatch: exactMatch ?? false,
|
|
1077
|
-
kinds: new Set((kinds ?? [])
|
|
1078
|
-
.map((kind) => kind.trim().toLowerCase())
|
|
1079
|
-
.filter(Boolean)),
|
|
1080
|
-
});
|
|
1081
|
-
}
|
|
1082
|
-
case "workspaceSymbol":
|
|
1083
|
-
return runWorkspaceSymbolOperation();
|
|
1084
|
-
case "codeAction":
|
|
1085
|
-
return lspService.codeAction(filePath, lspLine, lspChar, lspEndLine, lspEndChar);
|
|
1086
|
-
case "rename": {
|
|
1087
|
-
if (!newName || newName.trim().length === 0) {
|
|
1088
|
-
throw new Error("__BADINPUT__ newName parameter required for rename");
|
|
1089
|
-
}
|
|
1090
|
-
const edit = await lspService.rename(filePath, lspLine, lspChar, newName);
|
|
1091
|
-
if (!edit)
|
|
1092
|
-
return null;
|
|
1093
|
-
if (!apply) {
|
|
1094
|
-
return {
|
|
1095
|
-
applied: false,
|
|
1096
|
-
summary: summarizeWorkspaceEdit(edit, ctx.cwd || "."),
|
|
1097
|
-
edit,
|
|
1098
|
-
};
|
|
1099
|
-
}
|
|
1100
|
-
const applied = await applyWorkspaceEdit(edit, ctx.cwd || ".", {
|
|
1101
|
-
mutationContext,
|
|
1102
|
-
});
|
|
1103
|
-
for (const touchedFile of applied.files) {
|
|
1104
|
-
try {
|
|
1105
|
-
await openFileBestEffort(lspService, touchedFile, false);
|
|
1106
|
-
}
|
|
1107
|
-
catch {
|
|
1108
|
-
// Best-effort LSP resync only; disk edit already succeeded.
|
|
1109
|
-
}
|
|
1110
|
-
}
|
|
1111
|
-
return { applied: true, ...applied };
|
|
1112
|
-
}
|
|
1113
|
-
case "rename_file": {
|
|
1114
|
-
if (!newFilePath || newFilePath.trim().length === 0) {
|
|
1115
|
-
throw new Error("__BADINPUT__ newFilePath parameter required for rename_file");
|
|
1116
|
-
}
|
|
1117
|
-
const resolvedNewFilePath = path.isAbsolute(newFilePath)
|
|
1118
|
-
? newFilePath
|
|
1119
|
-
: path.resolve(ctx.cwd || ".", newFilePath);
|
|
1120
|
-
const result = await lspService.renameFile(filePath, resolvedNewFilePath, {
|
|
1121
|
-
cwd: ctx.cwd || ".",
|
|
1122
|
-
apply: apply ?? false,
|
|
1123
|
-
...(mutationContext ? { mutationContext } : {}),
|
|
1124
|
-
});
|
|
1125
|
-
if (result.applied) {
|
|
1126
|
-
for (const touchedFile of result.files ?? []) {
|
|
1127
|
-
try {
|
|
1128
|
-
await openFileBestEffort(lspService, touchedFile, false);
|
|
1129
|
-
}
|
|
1130
|
-
catch {
|
|
1131
|
-
// Best-effort LSP resync only; disk edit already succeeded.
|
|
1132
|
-
}
|
|
1133
|
-
}
|
|
1134
|
-
}
|
|
1135
|
-
return result;
|
|
1136
|
-
}
|
|
1137
|
-
case "implementation":
|
|
1138
|
-
return lspService.implementation(filePath, lspLine, lspChar);
|
|
1139
|
-
case "prepareCallHierarchy":
|
|
1140
|
-
return lspService.prepareCallHierarchy(filePath, lspLine, lspChar);
|
|
1141
|
-
case "executeCommand": {
|
|
1142
|
-
if (!command || command.trim().length === 0) {
|
|
1143
|
-
throw new Error("__BADINPUT__ command parameter required for executeCommand");
|
|
1144
|
-
}
|
|
1145
|
-
const advertised = rawPath
|
|
1146
|
-
? await lspService.getAdvertisedCommands(filePath)
|
|
1147
|
-
: await lspService.getAdvertisedCommands(undefined, workspaceScopeAttribution);
|
|
1148
|
-
const isAdvertised = advertised.includes(command);
|
|
1149
|
-
// Dry-run by default: report advertisement status without running.
|
|
1150
|
-
// Mutation only on explicit apply:true (and the client re-checks
|
|
1151
|
-
// the allowlist — defense in depth).
|
|
1152
|
-
if (apply !== true) {
|
|
1153
|
-
return {
|
|
1154
|
-
executed: false,
|
|
1155
|
-
dryRun: true,
|
|
1156
|
-
command,
|
|
1157
|
-
advertised: isAdvertised,
|
|
1158
|
-
advertisedCommands: advertised,
|
|
1159
|
-
note: isAdvertised
|
|
1160
|
-
? "Command is advertised. Re-run with apply:true to execute."
|
|
1161
|
-
: "Command is NOT advertised by the active server; execution would be refused.",
|
|
1162
|
-
};
|
|
1163
|
-
}
|
|
1164
|
-
if (!isAdvertised) {
|
|
1165
|
-
throw new Error(`__UNSUPPORTED__ command "${command}" is not advertised by the active LSP server (advertised: ${advertised.join(", ") || "none"})`);
|
|
1166
|
-
}
|
|
1167
|
-
return rawPath
|
|
1168
|
-
? lspService.executeCommand(filePath, command, commandArguments, mutationContext)
|
|
1169
|
-
: lspService.executeCommand(undefined, command, commandArguments, mutationContext, workspaceScopeAttribution);
|
|
1170
|
-
}
|
|
1171
|
-
case "incomingCalls": {
|
|
1172
|
-
if (!callHierarchyItem) {
|
|
1173
|
-
throw new Error("__BADINPUT__ callHierarchyItem parameter required for incomingCalls");
|
|
1174
|
-
}
|
|
1175
|
-
// #1803 fix-round F1: needsFilePath is false for call-hierarchy
|
|
1176
|
-
// traversal (the operand is callHierarchyItem, not path), so the
|
|
1177
|
-
// shared needsFilePath pre-check at line ~1319 never runs for
|
|
1178
|
-
// this operation — LSPService.incomingCalls' own capability gate
|
|
1179
|
-
// (clients/lsp/index.ts) returns a bare [], which this tool layer
|
|
1180
|
-
// cannot distinguish from "supported server, zero callers found".
|
|
1181
|
-
// Pre-check here, keyed off the item's own uri (the file the
|
|
1182
|
-
// resolved server is scoped to), mirrors
|
|
1183
|
-
// runWorkspaceSymbolOperation's supported-check above: throwing
|
|
1184
|
-
// __UNSUPPORTED__ routes through the catch block below into the
|
|
1185
|
-
// same discriminated isError:true/emptyReason:"unsupported" shape
|
|
1186
|
-
// every other capability-gated operation already reports.
|
|
1187
|
-
supported = operationSupportStatus(operation, await lspService.getOperationSupport(uriToPath(callHierarchyItem.uri)));
|
|
1188
|
-
if (supported === false) {
|
|
1189
|
-
throw new Error("__UNSUPPORTED__ Active LSP server does not advertise support for incomingCalls");
|
|
1190
|
-
}
|
|
1191
|
-
return lspService.incomingCalls(callHierarchyItem);
|
|
1192
|
-
}
|
|
1193
|
-
case "outgoingCalls": {
|
|
1194
|
-
if (!callHierarchyItem) {
|
|
1195
|
-
throw new Error("__BADINPUT__ callHierarchyItem parameter required for outgoingCalls");
|
|
1196
|
-
}
|
|
1197
|
-
// #1803 fix-round F1: same pre-check as incomingCalls above.
|
|
1198
|
-
supported = operationSupportStatus(operation, await lspService.getOperationSupport(uriToPath(callHierarchyItem.uri)));
|
|
1199
|
-
if (supported === false) {
|
|
1200
|
-
throw new Error("__UNSUPPORTED__ Active LSP server does not advertise support for outgoingCalls");
|
|
1201
|
-
}
|
|
1202
|
-
return lspService.outgoingCalls(callHierarchyItem);
|
|
1203
|
-
}
|
|
1204
|
-
default:
|
|
1205
|
-
return [];
|
|
1206
|
-
}
|
|
1207
|
-
};
|
|
1208
|
-
let result;
|
|
1209
|
-
let usedDocumentSymbolFallback = false;
|
|
1210
|
-
try {
|
|
1211
|
-
result = await runOperation();
|
|
1212
|
-
const isEmptyInitial = !result || (Array.isArray(result) && result.length === 0);
|
|
1213
|
-
const shouldRetryOnEmpty = isEmptyInitial &&
|
|
1214
|
-
needsFilePath &&
|
|
1215
|
-
[
|
|
1216
|
-
"definition",
|
|
1217
|
-
"typeDefinition",
|
|
1218
|
-
"declaration",
|
|
1219
|
-
"references",
|
|
1220
|
-
"hover",
|
|
1221
|
-
"signatureHelp",
|
|
1222
|
-
"codeAction",
|
|
1223
|
-
"rename",
|
|
1224
|
-
"implementation",
|
|
1225
|
-
].includes(operation);
|
|
1226
|
-
if (shouldRetryOnEmpty) {
|
|
1227
|
-
await openFileBestEffort(lspService, filePath, true);
|
|
1228
|
-
result = await runOperation();
|
|
1229
|
-
}
|
|
1230
|
-
const stillEmpty = !result || (Array.isArray(result) && result.length === 0);
|
|
1231
|
-
if (stillEmpty && needsFilePath && operation === "definition") {
|
|
1232
|
-
const content = nodeFs.readFileSync(filePath, "utf-8");
|
|
1233
|
-
const token = line && character
|
|
1234
|
-
? tokenAtPosition(content, line, character)
|
|
1235
|
-
: undefined;
|
|
1236
|
-
if (token) {
|
|
1237
|
-
const docSymbols = (await lspService.documentSymbol(filePath));
|
|
1238
|
-
const locations = pickLocalSymbolLocation(docSymbols, token, filePath);
|
|
1239
|
-
if (locations.length > 0) {
|
|
1240
|
-
result = locations;
|
|
1241
|
-
usedDocumentSymbolFallback = true;
|
|
1242
|
-
}
|
|
1243
|
-
}
|
|
1244
|
-
}
|
|
1245
|
-
if (mutationContext &&
|
|
1246
|
-
requestedApply &&
|
|
1247
|
-
!mutationContext.summaryEmitted) {
|
|
1248
|
-
const outcome = operation === "rename_file" &&
|
|
1249
|
-
result &&
|
|
1250
|
-
typeof result === "object" &&
|
|
1251
|
-
"applied" in result &&
|
|
1252
|
-
result.applied === false
|
|
1253
|
-
? "failed"
|
|
1254
|
-
: operation === "executeCommand" &&
|
|
1255
|
-
result &&
|
|
1256
|
-
typeof result === "object" &&
|
|
1257
|
-
"executed" in result &&
|
|
1258
|
-
result.executed === false
|
|
1259
|
-
? "failed"
|
|
1260
|
-
: "skipped";
|
|
1261
|
-
recordLspMutationOutcome(mutationContext, outcome);
|
|
1262
|
-
}
|
|
1263
|
-
}
|
|
1264
|
-
catch (err) {
|
|
1265
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
1266
|
-
if (msg.startsWith("__UNSUPPORTED__ ")) {
|
|
1267
|
-
return finalize({
|
|
1268
|
-
content: [
|
|
1269
|
-
{
|
|
1270
|
-
type: "text",
|
|
1271
|
-
text: msg.replace("__UNSUPPORTED__ ", ""),
|
|
1272
|
-
},
|
|
1273
|
-
],
|
|
1274
|
-
isError: true,
|
|
1275
|
-
details: {
|
|
1276
|
-
operation,
|
|
1277
|
-
supported: false,
|
|
1278
|
-
emptyReason: "unsupported",
|
|
1279
|
-
},
|
|
1280
|
-
}, { operation, filePath, failureKind: "unsupported", resultCount: 0 });
|
|
1281
|
-
}
|
|
1282
|
-
if (msg.startsWith("__BADINPUT__ ")) {
|
|
1283
|
-
return finalize({
|
|
1284
|
-
content: [
|
|
1285
|
-
{
|
|
1286
|
-
type: "text",
|
|
1287
|
-
text: msg.replace("__BADINPUT__ ", ""),
|
|
1288
|
-
},
|
|
1289
|
-
],
|
|
1290
|
-
isError: true,
|
|
1291
|
-
details: {},
|
|
1292
|
-
}, { operation, filePath, failureKind: "bad_input", resultCount: 0 });
|
|
1293
|
-
}
|
|
1294
|
-
return finalize({
|
|
1295
|
-
content: [
|
|
1296
|
-
{
|
|
1297
|
-
type: "text",
|
|
1298
|
-
text: `LSP error: ${err instanceof Error ? err.message : String(err)}`,
|
|
1299
|
-
},
|
|
1300
|
-
],
|
|
1301
|
-
isError: true,
|
|
1302
|
-
details: {},
|
|
1303
|
-
}, { operation, filePath, failureKind: "lsp_error", resultCount: 0 });
|
|
1304
|
-
}
|
|
1305
|
-
const isEmpty = !result || (Array.isArray(result) && result.length === 0);
|
|
1306
|
-
const fileCtx = filePath ? " at " + path.basename(filePath) : "";
|
|
1307
|
-
const lineCtx = line ? ":" + line + ":" + character : "";
|
|
1308
|
-
let output = isEmpty
|
|
1309
|
-
? "No results for " + operation + fileCtx + lineCtx
|
|
1310
|
-
: JSON.stringify(result);
|
|
1311
|
-
if (isEmpty && operation === "workspaceSymbol" && !rawPath) {
|
|
1312
|
-
output +=
|
|
1313
|
-
"\nHint: provide path to scope workspaceSymbol to the active language server/root.";
|
|
1314
|
-
}
|
|
1315
|
-
if (usedDocumentSymbolFallback) {
|
|
1316
|
-
output +=
|
|
1317
|
-
"\nNote: served from documentSymbol fallback due to empty primary result.";
|
|
1318
|
-
}
|
|
1319
|
-
if (operation === "references" &&
|
|
1320
|
-
Array.isArray(result) &&
|
|
1321
|
-
result.length <= 2) {
|
|
1322
|
-
output +=
|
|
1323
|
-
"\nHint: references from usage sites can be partial; retry from the symbol definition for broader cross-file results.";
|
|
1324
|
-
}
|
|
1325
|
-
const actionStats = operation === "codeAction" && Array.isArray(result)
|
|
1326
|
-
? classifyCodeActions(result)
|
|
1327
|
-
: null;
|
|
1328
|
-
if (operation === "codeAction" && actionStats) {
|
|
1329
|
-
if (actionStats.quickfix === 0 && actionStats.refactor > 0) {
|
|
1330
|
-
output +=
|
|
1331
|
-
"\nNote: no diagnostic quick fixes returned; refactor-only actions available.";
|
|
1332
|
-
}
|
|
1333
|
-
}
|
|
1334
|
-
const resultCount = Array.isArray(result)
|
|
1335
|
-
? result.length
|
|
1336
|
-
: result
|
|
1337
|
-
? 1
|
|
1338
|
-
: 0;
|
|
1339
|
-
const searchReads = collectSearchReadsForOperation(operation, result, callHierarchyItem);
|
|
1340
|
-
return finalize({
|
|
1341
|
-
content: [{ type: "text", text: output }],
|
|
1342
|
-
details: {
|
|
1343
|
-
operation,
|
|
1344
|
-
supported,
|
|
1345
|
-
searchReads: searchReads.length > 0 ? searchReads : undefined,
|
|
1346
|
-
emptyReason: isEmpty
|
|
1347
|
-
? emptyReasonForOperation(operation)
|
|
1348
|
-
: undefined,
|
|
1349
|
-
codeActionKinds: actionStats ?? undefined,
|
|
1350
|
-
columnResolution: columnResolution?.strategy === "explicit"
|
|
1351
|
-
? undefined
|
|
1352
|
-
: columnResolution,
|
|
1353
|
-
resultCount,
|
|
1354
|
-
},
|
|
1355
|
-
}, {
|
|
1356
|
-
operation,
|
|
1357
|
-
filePath: rawPath ? filePath : "(workspace)",
|
|
1358
|
-
failureKind: isEmpty
|
|
1359
|
-
? "empty_result"
|
|
1360
|
-
: usedDocumentSymbolFallback
|
|
1361
|
-
? "fallback_success"
|
|
1362
|
-
: "success",
|
|
1363
|
-
resultCount,
|
|
1364
|
-
});
|
|
1365
|
-
},
|
|
1366
|
-
};
|
|
1367
|
-
}
|