@herbertgao/pi-extensions 2026.10.1 → 2026.10.3
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 +14 -17
- 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/{remote-pi → @herbertgao/pi-agency}/LICENSE +1 -1
- 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/@herbertgao/pi-subagents/CHANGELOG.md +8 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +1 -1
- package/node_modules/@herbertgao/pi-subagents/package.json +4 -5
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +1 -1
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +1 -1
- package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +48 -72
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +1 -1
- package/node_modules/@herbertgao/pi-subagents/src/output-file.ts +15 -6
- package/node_modules/@herbertgao/pi-subagents/src/workflow/collisions.ts +4 -1
- package/node_modules/@herbertgao/pi-subagents/src/workflow/json-schema.ts +9 -8
- package/node_modules/@narumitw/pi-caffeinate/dist/index.ts +6 -1
- package/node_modules/@narumitw/pi-caffeinate/dist/index.ts.map +2 -2
- package/node_modules/@narumitw/pi-caffeinate/package.json +3 -3
- package/node_modules/@narumitw/pi-caffeinate/src/dbus-inhibit.ts +13 -1
- 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 +1159 -0
- package/node_modules/pi-lens/README.md +116 -25
- package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +6 -2
- 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-2FQ62SPM.js +83 -0
- package/node_modules/pi-lens/dist/chunk-2UMYMRI3.js +118 -0
- package/node_modules/pi-lens/dist/chunk-34OCDWOS.js +48 -0
- package/node_modules/pi-lens/dist/chunk-3FERWMCH.js +144 -0
- package/node_modules/pi-lens/dist/chunk-3JL6IFD7.js +97 -0
- package/node_modules/pi-lens/dist/chunk-3JSEWUWI.js +327 -0
- package/node_modules/pi-lens/dist/chunk-3MED75HT.js +37 -0
- package/node_modules/pi-lens/dist/chunk-3MRXIJ6I.js +79 -0
- package/node_modules/pi-lens/dist/chunk-3P4PF2BX.js +2250 -0
- package/node_modules/pi-lens/dist/chunk-3PNFWVHT.js +201 -0
- package/node_modules/pi-lens/dist/chunk-3TTPKMEF.js +162 -0
- package/node_modules/pi-lens/dist/chunk-5JHXUETW.js +326 -0
- package/node_modules/pi-lens/dist/chunk-5W3R6LFT.js +24 -0
- package/node_modules/pi-lens/dist/chunk-64LU2OVH.js +341 -0
- package/node_modules/pi-lens/dist/chunk-6B5I6ICN.js +44 -0
- package/node_modules/pi-lens/dist/chunk-6P54TMWL.js +274 -0
- package/node_modules/pi-lens/dist/chunk-6UYA642J.js +145 -0
- package/node_modules/pi-lens/dist/chunk-6XX5HCLK.js +398 -0
- package/node_modules/pi-lens/dist/chunk-7AXO3ZDF.js +30 -0
- package/node_modules/pi-lens/dist/chunk-7BX5DWSA.js +1907 -0
- package/node_modules/pi-lens/dist/chunk-7ELY2CSM.js +902 -0
- package/node_modules/pi-lens/dist/chunk-7M4T5N3V.js +38 -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-AFZYMAIV.js +756 -0
- package/node_modules/pi-lens/dist/chunk-ALQRYH6O.js +112 -0
- package/node_modules/pi-lens/dist/chunk-AXKPQ6ZI.js +1610 -0
- package/node_modules/pi-lens/dist/chunk-BHWHXMQ2.js +62 -0
- package/node_modules/pi-lens/dist/chunk-BJF25SUG.js +22 -0
- package/node_modules/pi-lens/dist/chunk-BNKLYOOO.js +18 -0
- package/node_modules/pi-lens/dist/chunk-BW5KFIQC.js +59 -0
- package/node_modules/pi-lens/dist/chunk-CBD2B5CP.js +599 -0
- package/node_modules/pi-lens/dist/chunk-CFYISHUW.js +42 -0
- package/node_modules/pi-lens/dist/chunk-CMU4RMJB.js +30 -0
- package/node_modules/pi-lens/dist/chunk-CULQYFLU.js +14 -0
- package/node_modules/pi-lens/dist/chunk-D65GOCJB.js +289 -0
- package/node_modules/pi-lens/dist/chunk-D6YF5HKX.js +59 -0
- package/node_modules/pi-lens/dist/chunk-DMS52BEP.js +342 -0
- package/node_modules/pi-lens/dist/chunk-ELVWJYRV.js +211 -0
- package/node_modules/pi-lens/dist/chunk-EUT3B22Y.js +27 -0
- package/node_modules/pi-lens/dist/chunk-F5VLZHUW.js +146 -0
- package/node_modules/pi-lens/dist/chunk-FC4RP4I2.js +12 -0
- package/node_modules/pi-lens/dist/chunk-FGALODG3.js +55 -0
- package/node_modules/pi-lens/dist/chunk-G3RLJYA2.js +2358 -0
- package/node_modules/pi-lens/dist/chunk-GAYGGICG.js +32 -0
- package/node_modules/pi-lens/dist/chunk-H2W2AXD3.js +419 -0
- package/node_modules/pi-lens/dist/chunk-H5EV3VMF.js +114 -0
- package/node_modules/pi-lens/dist/chunk-HREZQCT3.js +106 -0
- package/node_modules/pi-lens/dist/chunk-HSIRMK2D.js +517 -0
- package/node_modules/pi-lens/dist/chunk-IMSQR4WO.js +184 -0
- package/node_modules/pi-lens/dist/chunk-IQZXOZ7S.js +4816 -0
- package/node_modules/pi-lens/dist/chunk-IR6XFA5P.js +37 -0
- package/node_modules/pi-lens/dist/chunk-IUKPRZER.js +78 -0
- package/node_modules/pi-lens/dist/chunk-IUR76K6A.js +262 -0
- package/node_modules/pi-lens/dist/chunk-J3FZR3YY.js +98 -0
- package/node_modules/pi-lens/dist/chunk-J6DFZDFA.js +562 -0
- package/node_modules/pi-lens/dist/chunk-J7WJZ6W7.js +50 -0
- package/node_modules/pi-lens/dist/chunk-JONGANYH.js +202 -0
- package/node_modules/pi-lens/dist/chunk-KJCWXUUS.js +425 -0
- package/node_modules/pi-lens/dist/chunk-KJN4IOEJ.js +17 -0
- package/node_modules/pi-lens/dist/chunk-KMGPUKFD.js +25 -0
- package/node_modules/pi-lens/dist/chunk-LD7WFTRX.js +4533 -0
- package/node_modules/pi-lens/dist/chunk-LJDODBBZ.js +78 -0
- package/node_modules/pi-lens/dist/chunk-LNOMA3MP.js +169 -0
- package/node_modules/pi-lens/dist/chunk-MGIWSROG.js +2334 -0
- package/node_modules/pi-lens/dist/chunk-MQA2YBAH.js +308 -0
- package/node_modules/pi-lens/dist/chunk-MTDRLSI7.js +21720 -0
- package/node_modules/pi-lens/dist/chunk-N2IRDBZI.js +2355 -0
- package/node_modules/pi-lens/dist/chunk-N77WFUL7.js +50 -0
- package/node_modules/pi-lens/dist/chunk-N7YNJE5R.js +466 -0
- package/node_modules/pi-lens/dist/chunk-NABLC7W3.js +148 -0
- package/node_modules/pi-lens/dist/chunk-NFXP47RV.js +999 -0
- package/node_modules/pi-lens/dist/chunk-NJF2X5XF.js +45 -0
- package/node_modules/pi-lens/dist/chunk-NXL4FFQQ.js +47 -0
- package/node_modules/pi-lens/dist/chunk-O7HZX7CA.js +309 -0
- package/node_modules/pi-lens/dist/chunk-OC7LYAU5.js +708 -0
- package/node_modules/pi-lens/dist/chunk-OEX24ECI.js +348 -0
- package/node_modules/pi-lens/dist/chunk-OYOB3ZFG.js +78 -0
- package/node_modules/pi-lens/dist/chunk-OYTMZXRF.js +41 -0
- package/node_modules/pi-lens/dist/chunk-OZJINN4O.js +84 -0
- package/node_modules/pi-lens/dist/chunk-PCHDGUKT.js +23 -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-RJFED73B.js +79 -0
- package/node_modules/pi-lens/dist/chunk-RTQNRM5X.js +27 -0
- package/node_modules/pi-lens/dist/chunk-S6AMWKPC.js +189 -0
- package/node_modules/pi-lens/dist/chunk-T4QZ6FEH.js +308 -0
- package/node_modules/pi-lens/dist/chunk-T54VJRAD.js +5456 -0
- package/node_modules/pi-lens/dist/chunk-TA5L5KWQ.js +167 -0
- package/node_modules/pi-lens/dist/chunk-TQFBZVCG.js +27 -0
- package/node_modules/pi-lens/dist/chunk-U52SAGRM.js +62 -0
- package/node_modules/pi-lens/dist/chunk-UEAHAMEI.js +5814 -0
- package/node_modules/pi-lens/dist/chunk-UGSMCQ4D.js +327 -0
- package/node_modules/pi-lens/dist/chunk-UOPVJQ4N.js +103 -0
- package/node_modules/pi-lens/dist/chunk-USHG4DLH.js +459 -0
- package/node_modules/pi-lens/dist/chunk-UXVNL3D7.js +23 -0
- package/node_modules/pi-lens/dist/chunk-V5MEBST3.js +4139 -0
- package/node_modules/pi-lens/dist/chunk-VGEVL5EQ.js +29 -0
- package/node_modules/pi-lens/dist/chunk-VPWKF3GN.js +87 -0
- package/node_modules/pi-lens/dist/chunk-VSMJK3ZJ.js +1250 -0
- package/node_modules/pi-lens/dist/chunk-VYKKMYVT.js +560 -0
- package/node_modules/pi-lens/dist/chunk-VZHJS6DR.js +442 -0
- package/node_modules/pi-lens/dist/chunk-WATC3IQR.js +213 -0
- package/node_modules/pi-lens/dist/chunk-WPE5FPGR.js +54 -0
- package/node_modules/pi-lens/dist/chunk-WSEWKCXU.js +188 -0
- package/node_modules/pi-lens/dist/chunk-WW5BLB74.js +659 -0
- package/node_modules/pi-lens/dist/chunk-XGUL4SLQ.js +406 -0
- package/node_modules/pi-lens/dist/chunk-XHSCVSOL.js +170 -0
- package/node_modules/pi-lens/dist/chunk-XIMYZ3JA.js +27 -0
- package/node_modules/pi-lens/dist/chunk-YLN4K6WD.js +385 -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-Z6BB4JLQ.js +478 -0
- package/node_modules/pi-lens/dist/chunk-Z7QQA2KT.js +27 -0
- package/node_modules/pi-lens/dist/chunk-ZETYB3XG.js +2626 -0
- package/node_modules/pi-lens/dist/chunk-ZMOMPX2Z.js +87 -0
- package/node_modules/pi-lens/dist/chunk-ZOEYVXSV.js +149 -0
- package/node_modules/pi-lens/dist/chunk-ZZUFZUQZ.js +12120 -0
- package/node_modules/pi-lens/dist/index.js +39712 -29876
- 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 +22688 -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 +5 -4
- package/node_modules/pi-lens/docs/configuration.md +28 -2
- package/node_modules/pi-lens/docs/custom-rules.md +25 -2
- package/node_modules/pi-lens/docs/environment-variables.md +86 -8
- package/node_modules/pi-lens/docs/features.md +45 -5
- package/node_modules/pi-lens/docs/globalconfig.md +2 -1
- package/node_modules/pi-lens/docs/io-bridge-v2-migration.md +94 -0
- package/node_modules/pi-lens/docs/lsp-capability-matrix.md +37 -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 +160 -88
- package/node_modules/pi-lens/docs/pi-lens-investigator.md +74 -26
- package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +736 -0
- package/node_modules/pi-lens/docs/pi-lens-monitor.md +75 -7
- package/node_modules/pi-lens/docs/pi-lens-retro.md +6 -4
- package/node_modules/pi-lens/docs/pi-lens-reviewer.md +189 -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/schema/pi-lens-config-v1.json +530 -0
- package/node_modules/pi-lens/docs/servercapabilities.md +56 -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/docs/word-index.md +6 -0
- 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/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
- 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/node_modules/pi-web-access/CHANGELOG.md +28 -0
- package/node_modules/pi-web-access/README.md +10 -6
- package/node_modules/pi-web-access/ceramic.ts +219 -0
- package/node_modules/pi-web-access/curator-page.ts +3 -1
- package/node_modules/pi-web-access/curator-server.ts +1 -0
- package/node_modules/pi-web-access/dist/index.js +846 -588
- package/node_modules/pi-web-access/dist/mcp-cli.js +725 -516
- package/node_modules/pi-web-access/gemini-search.ts +8 -4
- package/node_modules/pi-web-access/github-extract.ts +34 -2
- package/node_modules/pi-web-access/index.ts +72 -30
- package/node_modules/pi-web-access/openai-search.ts +3 -3
- package/node_modules/pi-web-access/package.json +2 -2
- package/node_modules/pi-web-access/page-query.ts +6 -9
- package/node_modules/pi-web-access/parallel-mcp.ts +2 -0
- package/node_modules/pi-web-access/query-rewrite.ts +2 -2
- package/node_modules/pi-web-access/storage.ts +49 -0
- package/node_modules/pi-web-access/summary-review.ts +7 -6
- package/node_modules/pi-web-access/utils.ts +21 -6
- package/node_modules/pi-web-access/web-tool-core.ts +1 -0
- package/package.json +19 -19
- 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
- package/node_modules/pi-web-access/opencode-session-headers.ts +0 -24
- package/node_modules/remote-pi/README.md +0 -675
- package/node_modules/remote-pi/dist/actions/handlers.d.ts +0 -122
- package/node_modules/remote-pi/dist/actions/handlers.js +0 -160
- package/node_modules/remote-pi/dist/actions/handlers.js.map +0 -1
- package/node_modules/remote-pi/dist/actions/registry.d.ts +0 -39
- package/node_modules/remote-pi/dist/actions/registry.js +0 -58
- package/node_modules/remote-pi/dist/actions/registry.js.map +0 -1
- package/node_modules/remote-pi/dist/bin/supervisord.d.ts +0 -2
- package/node_modules/remote-pi/dist/bin/supervisord.js +0 -86
- package/node_modules/remote-pi/dist/bin/supervisord.js.map +0 -1
- package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +0 -58
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js +0 -71
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +0 -1
- package/node_modules/remote-pi/dist/commands/list_commands.d.ts +0 -60
- package/node_modules/remote-pi/dist/commands/list_commands.js +0 -73
- package/node_modules/remote-pi/dist/commands/list_commands.js.map +0 -1
- package/node_modules/remote-pi/dist/config.d.ts +0 -62
- package/node_modules/remote-pi/dist/config.js +0 -115
- package/node_modules/remote-pi/dist/config.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/client.d.ts +0 -20
- package/node_modules/remote-pi/dist/daemon/client.js +0 -131
- package/node_modules/remote-pi/dist/daemon/client.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +0 -176
- package/node_modules/remote-pi/dist/daemon/control_protocol.js +0 -63
- package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +0 -45
- package/node_modules/remote-pi/dist/daemon/cron_log.js +0 -72
- package/node_modules/remote-pi/dist/daemon/cron_log.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +0 -80
- package/node_modules/remote-pi/dist/daemon/cron_registry.js +0 -194
- package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/id.d.ts +0 -24
- package/node_modules/remote-pi/dist/daemon/id.js +0 -36
- package/node_modules/remote-pi/dist/daemon/id.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/install.d.ts +0 -170
- package/node_modules/remote-pi/dist/daemon/install.js +0 -547
- package/node_modules/remote-pi/dist/daemon/install.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/registry.d.ts +0 -63
- package/node_modules/remote-pi/dist/daemon/registry.js +0 -153
- package/node_modules/remote-pi/dist/daemon/registry.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +0 -194
- package/node_modules/remote-pi/dist/daemon/rpc_child.js +0 -389
- package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +0 -1
- package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +0 -93
- package/node_modules/remote-pi/dist/daemon/supervisor.js +0 -596
- package/node_modules/remote-pi/dist/daemon/supervisor.js.map +0 -1
- package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +0 -26
- package/node_modules/remote-pi/dist/extension_ui_bridge.js +0 -341
- package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +0 -1
- package/node_modules/remote-pi/dist/index.d.ts +0 -213
- package/node_modules/remote-pi/dist/index.js +0 -4996
- package/node_modules/remote-pi/dist/index.js.map +0 -1
- package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +0 -10
- package/node_modules/remote-pi/dist/mcp/mesh_result.js +0 -42
- package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +0 -1
- package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +0 -16
- package/node_modules/remote-pi/dist/mcp/mesh_server.js +0 -327
- package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/canonical.d.ts +0 -30
- package/node_modules/remote-pi/dist/mesh/canonical.js +0 -61
- package/node_modules/remote-pi/dist/mesh/canonical.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/client.d.ts +0 -18
- package/node_modules/remote-pi/dist/mesh/client.js +0 -125
- package/node_modules/remote-pi/dist/mesh/client.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/encoding.d.ts +0 -38
- package/node_modules/remote-pi/dist/mesh/encoding.js +0 -216
- package/node_modules/remote-pi/dist/mesh/encoding.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +0 -73
- package/node_modules/remote-pi/dist/mesh/self_revoke.js +0 -401
- package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/siblings.d.ts +0 -49
- package/node_modules/remote-pi/dist/mesh/siblings.js +0 -159
- package/node_modules/remote-pi/dist/mesh/siblings.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/types.d.ts +0 -34
- package/node_modules/remote-pi/dist/mesh/types.js +0 -11
- package/node_modules/remote-pi/dist/mesh/types.js.map +0 -1
- package/node_modules/remote-pi/dist/mesh/verify.d.ts +0 -17
- package/node_modules/remote-pi/dist/mesh/verify.js +0 -86
- package/node_modules/remote-pi/dist/mesh/verify.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/crypto.d.ts +0 -8
- package/node_modules/remote-pi/dist/pairing/crypto.js +0 -22
- package/node_modules/remote-pi/dist/pairing/crypto.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/handshake.d.ts +0 -28
- package/node_modules/remote-pi/dist/pairing/handshake.js +0 -113
- package/node_modules/remote-pi/dist/pairing/handshake.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +0 -16
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js +0 -103
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/qr.d.ts +0 -59
- package/node_modules/remote-pi/dist/pairing/qr.js +0 -125
- package/node_modules/remote-pi/dist/pairing/qr.js.map +0 -1
- package/node_modules/remote-pi/dist/pairing/storage.d.ts +0 -120
- package/node_modules/remote-pi/dist/pairing/storage.js +0 -604
- package/node_modules/remote-pi/dist/pairing/storage.js.map +0 -1
- package/node_modules/remote-pi/dist/protocol/codec.d.ts +0 -7
- package/node_modules/remote-pi/dist/protocol/codec.js +0 -49
- package/node_modules/remote-pi/dist/protocol/codec.js.map +0 -1
- package/node_modules/remote-pi/dist/protocol/types.d.ts +0 -393
- package/node_modules/remote-pi/dist/protocol/types.js +0 -2
- package/node_modules/remote-pi/dist/protocol/types.js.map +0 -1
- package/node_modules/remote-pi/dist/rooms.d.ts +0 -29
- package/node_modules/remote-pi/dist/rooms.js +0 -57
- package/node_modules/remote-pi/dist/rooms.js.map +0 -1
- package/node_modules/remote-pi/dist/session/address.d.ts +0 -49
- package/node_modules/remote-pi/dist/session/address.js +0 -58
- package/node_modules/remote-pi/dist/session/address.js.map +0 -1
- package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +0 -55
- package/node_modules/remote-pi/dist/session/agent_bridge.js +0 -146
- package/node_modules/remote-pi/dist/session/agent_bridge.js.map +0 -1
- package/node_modules/remote-pi/dist/session/bridge.d.ts +0 -37
- package/node_modules/remote-pi/dist/session/bridge.js +0 -130
- package/node_modules/remote-pi/dist/session/bridge.js.map +0 -1
- package/node_modules/remote-pi/dist/session/broker.d.ts +0 -189
- package/node_modules/remote-pi/dist/session/broker.js +0 -507
- package/node_modules/remote-pi/dist/session/broker.js.map +0 -1
- package/node_modules/remote-pi/dist/session/broker_remote.d.ts +0 -74
- package/node_modules/remote-pi/dist/session/broker_remote.js +0 -583
- package/node_modules/remote-pi/dist/session/broker_remote.js.map +0 -1
- package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +0 -33
- package/node_modules/remote-pi/dist/session/cwd_lock.js +0 -126
- package/node_modules/remote-pi/dist/session/cwd_lock.js.map +0 -1
- package/node_modules/remote-pi/dist/session/envelope.d.ts +0 -33
- package/node_modules/remote-pi/dist/session/envelope.js +0 -117
- package/node_modules/remote-pi/dist/session/envelope.js.map +0 -1
- package/node_modules/remote-pi/dist/session/global_config.d.ts +0 -33
- package/node_modules/remote-pi/dist/session/global_config.js +0 -73
- package/node_modules/remote-pi/dist/session/global_config.js.map +0 -1
- package/node_modules/remote-pi/dist/session/ipc.d.ts +0 -27
- package/node_modules/remote-pi/dist/session/ipc.js +0 -22
- package/node_modules/remote-pi/dist/session/ipc.js.map +0 -1
- package/node_modules/remote-pi/dist/session/leader_election.d.ts +0 -32
- package/node_modules/remote-pi/dist/session/leader_election.js +0 -106
- package/node_modules/remote-pi/dist/session/leader_election.js.map +0 -1
- package/node_modules/remote-pi/dist/session/local_config.d.ts +0 -55
- package/node_modules/remote-pi/dist/session/local_config.js +0 -157
- package/node_modules/remote-pi/dist/session/local_config.js.map +0 -1
- package/node_modules/remote-pi/dist/session/mesh_message.d.ts +0 -20
- package/node_modules/remote-pi/dist/session/mesh_message.js +0 -28
- package/node_modules/remote-pi/dist/session/mesh_message.js.map +0 -1
- package/node_modules/remote-pi/dist/session/mesh_node.d.ts +0 -116
- package/node_modules/remote-pi/dist/session/mesh_node.js +0 -573
- package/node_modules/remote-pi/dist/session/mesh_node.js.map +0 -1
- package/node_modules/remote-pi/dist/session/peer.d.ts +0 -139
- package/node_modules/remote-pi/dist/session/peer.js +0 -451
- package/node_modules/remote-pi/dist/session/peer.js.map +0 -1
- package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +0 -13
- package/node_modules/remote-pi/dist/session/peer_inventory.js +0 -48
- package/node_modules/remote-pi/dist/session/peer_inventory.js.map +0 -1
- package/node_modules/remote-pi/dist/session/peer_limits.d.ts +0 -9
- package/node_modules/remote-pi/dist/session/peer_limits.js +0 -21
- package/node_modules/remote-pi/dist/session/peer_limits.js.map +0 -1
- package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +0 -39
- package/node_modules/remote-pi/dist/session/setup_wizard.js +0 -63
- package/node_modules/remote-pi/dist/session/setup_wizard.js.map +0 -1
- package/node_modules/remote-pi/dist/session/tool_gate.d.ts +0 -5
- package/node_modules/remote-pi/dist/session/tool_gate.js +0 -11
- package/node_modules/remote-pi/dist/session/tool_gate.js.map +0 -1
- package/node_modules/remote-pi/dist/session/tools.d.ts +0 -24
- package/node_modules/remote-pi/dist/session/tools.js +0 -252
- package/node_modules/remote-pi/dist/session/tools.js.map +0 -1
- package/node_modules/remote-pi/dist/session/wizard.d.ts +0 -13
- package/node_modules/remote-pi/dist/session/wizard.js +0 -20
- package/node_modules/remote-pi/dist/session/wizard.js.map +0 -1
- package/node_modules/remote-pi/dist/settings.d.ts +0 -15
- package/node_modules/remote-pi/dist/settings.js +0 -52
- package/node_modules/remote-pi/dist/settings.js.map +0 -1
- package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +0 -37
- package/node_modules/remote-pi/dist/transport/peer_channel.js +0 -98
- package/node_modules/remote-pi/dist/transport/peer_channel.js.map +0 -1
- package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +0 -29
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js +0 -62
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +0 -1
- package/node_modules/remote-pi/dist/transport/relay_client.d.ts +0 -91
- package/node_modules/remote-pi/dist/transport/relay_client.js +0 -206
- package/node_modules/remote-pi/dist/transport/relay_client.js.map +0 -1
- package/node_modules/remote-pi/dist/ui/footer.d.ts +0 -32
- package/node_modules/remote-pi/dist/ui/footer.js +0 -34
- package/node_modules/remote-pi/dist/ui/footer.js.map +0 -1
- package/node_modules/remote-pi/docs/daemon.md +0 -289
- package/node_modules/remote-pi/package.json +0 -92
- package/node_modules/remote-pi/service-templates/launchd.plist.template +0 -35
- package/node_modules/remote-pi/service-templates/systemd.service.template +0 -19
- package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +0 -10
- package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +0 -38
- package/node_modules/remote-pi/skills/agent-network/SKILL.md +0 -310
|
@@ -1,876 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SgRunner - encapsulates ast-grep subprocess management
|
|
3
|
-
*
|
|
4
|
-
* Extracted from AstGrepClient to simplify the main client.
|
|
5
|
-
* Handles: spawn, spawnSync, temp dir management, JSON parsing.
|
|
6
|
-
*/
|
|
7
|
-
import { createSubsystemLogger } from "./extension-log.js";
|
|
8
|
-
import * as fs from "node:fs";
|
|
9
|
-
import * as os from "node:os";
|
|
10
|
-
import * as path from "node:path";
|
|
11
|
-
import { getSgCommand, resolveManagedToolClient, } from "./dispatch/runners/utils/runner-helpers.js";
|
|
12
|
-
import { getProjectIgnoreGlobs } from "./file-utils.js";
|
|
13
|
-
import { findGlobalBinary } from "./package-manager.js";
|
|
14
|
-
import { safeSpawnAsync } from "./safe-spawn.js";
|
|
15
|
-
import { probeToolAsync } from "./tool-probe.js";
|
|
16
|
-
import { truncatedByOutputCap } from "./spawn-output-cap.js";
|
|
17
|
-
import { createSingleFlight } from "./single-flight.js";
|
|
18
|
-
import { classifyProbeFailure, describeInstallAttempt, createAvailabilityLatch, logAvailabilityDecision, startHostStallSampler, } from "./dispatch/runners/utils/availability-policy.js";
|
|
19
|
-
/**
|
|
20
|
-
* Build the `bash -c` argv that runs `cmd` with `allArgs` as POSITIONAL
|
|
21
|
-
* parameters. The script is the constant `"$0" "$@"`, so bash re-emits the
|
|
22
|
-
* command and every arg verbatim — no parameter expansion, no word-splitting.
|
|
23
|
-
*
|
|
24
|
-
* Two properties this guarantees, neither of which string-interpolation could:
|
|
25
|
-
* - ast-grep `$METAVAR` patterns reach the binary literally (not shell-expanded).
|
|
26
|
-
* - an environment-derived command path (PATH-resolved `ast-grep`/`sg`/`npx`)
|
|
27
|
-
* cannot inject shell — it's argv[0], never part of the script string
|
|
28
|
-
* (CodeQL js/shell-command-injection-from-environment).
|
|
29
|
-
*/
|
|
30
|
-
export function buildBashRunArgs(cmd, allArgs) {
|
|
31
|
-
return ["-c", '"$0" "$@"', cmd, ...allArgs];
|
|
32
|
-
}
|
|
33
|
-
function sgExcludeArgsForProject(rootDir) {
|
|
34
|
-
return getProjectIgnoreGlobs(rootDir).flatMap((glob) => [
|
|
35
|
-
"--globs",
|
|
36
|
-
`!${glob}`,
|
|
37
|
-
]);
|
|
38
|
-
}
|
|
39
|
-
const DEFAULT_EXEC_TIMEOUT_MS = 30_000;
|
|
40
|
-
/** Budget for a single `--version` candidate probe, ms. */
|
|
41
|
-
const PROBE_TIMEOUT_MS = 5_000;
|
|
42
|
-
const MAX_SG_OUTPUT_BYTES = 8 * 1024 * 1024;
|
|
43
|
-
/**
|
|
44
|
-
* Format metavariable captures for display below a match line.
|
|
45
|
-
* Single captures: $VAR=x $NAME=foo
|
|
46
|
-
* Multi captures: $$$ARGS=a,b,c
|
|
47
|
-
* Returns undefined when there are no meaningful captures.
|
|
48
|
-
*/
|
|
49
|
-
function formatMetaVarCaptures(mv) {
|
|
50
|
-
if (!mv)
|
|
51
|
-
return undefined;
|
|
52
|
-
const parts = [];
|
|
53
|
-
for (const [name, node] of Object.entries(mv.single)) {
|
|
54
|
-
if (node.text)
|
|
55
|
-
parts.push(`$${name}=${node.text}`);
|
|
56
|
-
}
|
|
57
|
-
for (const [name, nodes] of Object.entries(mv.multi)) {
|
|
58
|
-
if (nodes.length > 0) {
|
|
59
|
-
const joined = nodes.map((n) => n.text).join("");
|
|
60
|
-
if (joined)
|
|
61
|
-
parts.push(`$$$${name}=${joined}`);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
for (const [name, value] of Object.entries(mv.transformed)) {
|
|
65
|
-
if (value)
|
|
66
|
-
parts.push(`@${name}=${value}`);
|
|
67
|
-
}
|
|
68
|
-
if (parts.length === 0)
|
|
69
|
-
return undefined;
|
|
70
|
-
return ` ${parts.join(" ")}`;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Parse ast-grep `--json` stdout into a match array, or return `null` when the
|
|
74
|
-
* text is not a match payload. ast-grep emits either a JSON array or (rarely) a
|
|
75
|
-
* single object; both are normalized to an array. A JSON scalar/`null` is
|
|
76
|
-
* rejected (returns `null`) so a hypothetical error-report scalar on stdout can
|
|
77
|
-
* never be misread as a phantom match.
|
|
78
|
-
*/
|
|
79
|
-
function tryParseSgMatches(stdout) {
|
|
80
|
-
try {
|
|
81
|
-
const parsed = JSON.parse(stdout);
|
|
82
|
-
if (Array.isArray(parsed))
|
|
83
|
-
return parsed;
|
|
84
|
-
if (parsed !== null && typeof parsed === "object")
|
|
85
|
-
return [parsed];
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// The truncation veto lives at the head of `exec`/`interpretScanResult` now
|
|
93
|
-
// (#2100), so this stays a pure parser rather than re-asking a settled question.
|
|
94
|
-
function tryParseNonZeroSgMatches(result) {
|
|
95
|
-
if (!result.stdout.trim())
|
|
96
|
-
return null;
|
|
97
|
-
// Trimmed on purpose: a leading BOM survives JSON.parse's whitespace
|
|
98
|
-
// tolerance but String.trim() strips it (matches the pre-refactor guard).
|
|
99
|
-
return tryParseSgMatches(result.stdout.trim());
|
|
100
|
-
}
|
|
101
|
-
export class SgRunner {
|
|
102
|
-
log;
|
|
103
|
-
sgPath = null;
|
|
104
|
-
sgArgsPrefix = [];
|
|
105
|
-
/**
|
|
106
|
-
* Availability memo, backed by the shared transient-aware latch (#1476).
|
|
107
|
-
*
|
|
108
|
-
* Before this, one failed sweep over every candidate — timeouts included —
|
|
109
|
-
* latched `false` for the life of the process AND ran a full auto-install
|
|
110
|
-
* first. A host stall during warm-up therefore both disabled ast-grep until
|
|
111
|
-
* restart and paid for an install nobody needed.
|
|
112
|
-
*/
|
|
113
|
-
availabilityLatch = createAvailabilityLatch();
|
|
114
|
-
/**
|
|
115
|
-
* At-most-one sweep in flight, via the shared primitive (#1753). One
|
|
116
|
-
* instance owns one question, so the key is a constant.
|
|
117
|
-
*/
|
|
118
|
-
ensureFlight = createSingleFlight();
|
|
119
|
-
/**
|
|
120
|
-
* Whether a DIRECT candidate — one that would have been ast-grep itself —
|
|
121
|
-
* failed for a transient reason in the current sweep. Only these block the
|
|
122
|
-
* install: a slow `npx` says nothing about whether ast-grep is on this
|
|
123
|
-
* machine, and letting it block turned "ast-grep is genuinely absent on a
|
|
124
|
-
* slow host" into "ast-grep is never installed and npx is re-spawned every
|
|
125
|
-
* sweep, forever".
|
|
126
|
-
*/
|
|
127
|
-
sweepSawTransient = false;
|
|
128
|
-
sweepTransientCause = "probe-timeout";
|
|
129
|
-
/**
|
|
130
|
-
* The DIRECT candidates that were unreachable, in ask order (#1568).
|
|
131
|
-
*
|
|
132
|
-
* The sweep returns at the first candidate that answers, so at the moment of
|
|
133
|
-
* a win this is exactly the set of preferred tiers the winner did not beat on
|
|
134
|
-
* the merits. Fallbacks are excluded on purpose: `npx` is asked before the
|
|
135
|
-
* global-bin and platform-package tiers, and a slow `npx` says nothing about
|
|
136
|
-
* a winner that is a real binary.
|
|
137
|
-
*
|
|
138
|
-
* Basenames, because a candidate can be an absolute global-bin or
|
|
139
|
-
* platform-package path and this list is written to latency.log (#1568
|
|
140
|
-
* review F3).
|
|
141
|
-
*/
|
|
142
|
-
sweepUnreachable = [];
|
|
143
|
-
/** A transient on the npx fallback: not evidence, but not nothing either. */
|
|
144
|
-
sweepFallbackTransient = false;
|
|
145
|
-
sweepFallbackCause = "probe-timeout";
|
|
146
|
-
/** Host stall summed over every probe of the current sweep, ms. */
|
|
147
|
-
sweepHostStallMs = 0;
|
|
148
|
-
/**
|
|
149
|
-
* Candidates — direct or fallback — that this sweep probed and found
|
|
150
|
-
* DURABLY missing (real ENOENT/non-installable, not a stall) (#1593). The
|
|
151
|
-
* retained-arm fallback below only sees whether SOME candidate stalled; this
|
|
152
|
-
* list lets it also check whether the memoized winner itself is one of the
|
|
153
|
-
* candidates this very sweep just disproved, rather than re-serving a
|
|
154
|
-
* command that ENOENTed a moment ago because an unrelated sibling stalled.
|
|
155
|
-
*/
|
|
156
|
-
sweepDurablyMissing = [];
|
|
157
|
-
constructor(verbose = false) {
|
|
158
|
-
this.log = verbose ? createSubsystemLogger("sg-runner") : () => { };
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Check if ast-grep CLI is available, auto-install if not.
|
|
162
|
-
*
|
|
163
|
-
* Re-entrancy safe: concurrent first-time callers share one flight, so
|
|
164
|
-
* probing/auto-install isn't duplicated across session-start tasks. The
|
|
165
|
-
* share and the clear-in-finally belong to `singleFlight` (#1753); this
|
|
166
|
-
* method owns only the latch short-circuit above it. The sweep-local
|
|
167
|
-
* bookkeeping `doEnsureAvailable` resets on entry is untouched — it is
|
|
168
|
-
* per-sweep state, not concurrency state.
|
|
169
|
-
*/
|
|
170
|
-
async ensureAvailable() {
|
|
171
|
-
// Fast path: already decided. `read()` returns null when the last verdict
|
|
172
|
-
// was transient and its cooldown expired, which re-enters the sweep.
|
|
173
|
-
const memo = this.availabilityLatch.read();
|
|
174
|
-
if (memo !== null)
|
|
175
|
-
return memo;
|
|
176
|
-
return this.ensureFlight.run("ast-grep", () => this.doEnsureAvailable());
|
|
177
|
-
}
|
|
178
|
-
async doEnsureAvailable() {
|
|
179
|
-
const startedAt = Date.now();
|
|
180
|
-
this.sweepSawTransient = false;
|
|
181
|
-
this.sweepTransientCause = "probe-timeout";
|
|
182
|
-
this.sweepUnreachable = [];
|
|
183
|
-
this.sweepFallbackTransient = false;
|
|
184
|
-
this.sweepFallbackCause = "probe-timeout";
|
|
185
|
-
this.sweepHostStallMs = 0;
|
|
186
|
-
this.sweepDurablyMissing = [];
|
|
187
|
-
// Step 1: PATH — canonical binary names + npx fallback.
|
|
188
|
-
// Prefer ast-grep over sg on Linux: /usr/bin/sg is util-linux, not ast-grep.
|
|
189
|
-
const pathCommand = await this.probeCommandCandidates([
|
|
190
|
-
{ cmd: "ast-grep", argsPrefix: [] },
|
|
191
|
-
{ cmd: "sg", argsPrefix: [] },
|
|
192
|
-
// `npx --no -- ast-grep` starts a Node process before it can answer, so
|
|
193
|
-
// it is the candidate most likely to blow a 5 s budget on a cold or busy
|
|
194
|
-
// box. Marked a fallback so its timeout cannot veto the install.
|
|
195
|
-
{ cmd: "npx", argsPrefix: ["--no", "--", "ast-grep"], fallback: true },
|
|
196
|
-
]);
|
|
197
|
-
if (pathCommand) {
|
|
198
|
-
this.sgPath = pathCommand.cmd;
|
|
199
|
-
this.sgArgsPrefix = pathCommand.argsPrefix;
|
|
200
|
-
this.noteAvailable(startedAt, `ast-grep found on PATH: ${pathCommand.cmd}`);
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
// Step 1b: any package manager's global bin dir (npm/pnpm/yarn/bun).
|
|
204
|
-
// Catches a `pnpm add -g @ast-grep/cli` shim whose bin dir is off PATH (so
|
|
205
|
-
// Step 1 misses) and which is a global — not a local node_modules platform
|
|
206
|
-
// package — so Step 2 misses it too (#375).
|
|
207
|
-
for (const name of ["ast-grep", "sg"]) {
|
|
208
|
-
const globalBin = await findGlobalBinary(name);
|
|
209
|
-
if (globalBin && (await this.probeCommand(globalBin, []))) {
|
|
210
|
-
this.sgPath = globalBin;
|
|
211
|
-
this.sgArgsPrefix = [];
|
|
212
|
-
this.noteAvailable(startedAt, `ast-grep found in global bin: ${globalBin}`);
|
|
213
|
-
return true;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
// Step 2: platform-specific npm package binaries.
|
|
217
|
-
// Covers setups where @ast-grep/cli-{os}-{arch} is installed but the binary
|
|
218
|
-
// directory is not on PATH (common with pnpm, Yarn PnP, or isolated installs).
|
|
219
|
-
const platformBinary = await this.probePlatformPackageBinary();
|
|
220
|
-
if (platformBinary) {
|
|
221
|
-
this.sgPath = platformBinary;
|
|
222
|
-
this.sgArgsPrefix = [];
|
|
223
|
-
this.noteAvailable(startedAt, `ast-grep found via platform package: ${platformBinary}`);
|
|
224
|
-
return true;
|
|
225
|
-
}
|
|
226
|
-
// Step 3: Homebrew (macOS only).
|
|
227
|
-
if (process.platform === "darwin") {
|
|
228
|
-
const brewBinary = await this.probeHomebrew();
|
|
229
|
-
if (brewBinary) {
|
|
230
|
-
this.sgPath = brewBinary;
|
|
231
|
-
this.sgArgsPrefix = [];
|
|
232
|
-
this.noteAvailable(startedAt, `ast-grep found via Homebrew: ${brewBinary}`);
|
|
233
|
-
return true;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
// A timeout on a DIRECT candidate means the machine answered, not the tool
|
|
237
|
-
// (#1476). Installing ast-grep because the host event loop stalled is a
|
|
238
|
-
// heavyweight reaction to a hiccup, and latching the result disabled the
|
|
239
|
-
// tool until restart. Retry the sweep later instead.
|
|
240
|
-
//
|
|
241
|
-
// The npx fallback is deliberately NOT part of this test. Gating the
|
|
242
|
-
// install on it regressed the very host this change targets: a slow box
|
|
243
|
-
// with no ast-grep timed out `npx --no -- ast-grep` every sweep, so the
|
|
244
|
-
// install below was never reached and the slow npx was re-spawned on each
|
|
245
|
-
// escalating retry instead — worse than the latch it replaced.
|
|
246
|
-
if (this.sweepSawTransient) {
|
|
247
|
-
// Nothing answered, transiently, while we are still holding a command a
|
|
248
|
-
// previous provisional sweep proved working. Discarding it here would
|
|
249
|
-
// run #1476 backwards — a timeout erasing a positive result — and it
|
|
250
|
-
// would send the sweep on to Step 4 to install a tool that is already
|
|
251
|
-
// runnable. Keep the winner and re-arm the cooldown (#1568 review F1).
|
|
252
|
-
// #1593: a sibling tier stalling this sweep is not license to re-serve
|
|
253
|
-
// a winner that THIS SAME sweep just proved durably missing.
|
|
254
|
-
if (this.availabilityLatch.isProvisional() &&
|
|
255
|
-
this.sgPath &&
|
|
256
|
-
!this.sweepDurablyMissing.includes(this.sgPath)) {
|
|
257
|
-
this.noteAvailable(startedAt, `ast-grep re-probe stalled; keeping ${this.sgPath}`, { retained: true });
|
|
258
|
-
return true;
|
|
259
|
-
}
|
|
260
|
-
this.log("ast-grep availability probe timed out; will retry (not installing)");
|
|
261
|
-
return this.noteUnavailable(startedAt, "transient", this.sweepTransientCause);
|
|
262
|
-
}
|
|
263
|
-
// Step 4: install via the typed shared seam, then validate the returned
|
|
264
|
-
// absolute binary before publishing it.
|
|
265
|
-
const installed = await resolveManagedToolClient({
|
|
266
|
-
toolId: "ast-grep",
|
|
267
|
-
cwd: process.cwd(),
|
|
268
|
-
probe: async () => ({ outcome: "missing" }),
|
|
269
|
-
acceptInstalled: async (installedPath) => (await this.probeCommand(installedPath, [])) ? installedPath : null,
|
|
270
|
-
});
|
|
271
|
-
if (installed.outcome === "success") {
|
|
272
|
-
this.sgPath = installed.value;
|
|
273
|
-
this.sgArgsPrefix = [];
|
|
274
|
-
this.noteAvailable(startedAt, `ast-grep auto-installed: ${installed.value}`);
|
|
275
|
-
return true;
|
|
276
|
-
}
|
|
277
|
-
// The install failed AND the npx fallback never got a fair hearing, so
|
|
278
|
-
// "ast-grep is not installed" is not a fact yet. Expire the verdict.
|
|
279
|
-
if (this.sweepFallbackTransient) {
|
|
280
|
-
return this.noteUnavailable(startedAt, "transient", this.sweepFallbackCause);
|
|
281
|
-
}
|
|
282
|
-
// #1500: ASSERTED, not derived — and justified, because every candidate
|
|
283
|
-
// probe answered "not found", so the absence is real. What the install did
|
|
284
|
-
// is recorded as evidence rather than folded into the verdict: it is the one
|
|
285
|
-
// fact separating "never installable here" from "the download failed", and
|
|
286
|
-
// from "no install was attempted at all" (auto-install off, trust denied,
|
|
287
|
-
// or an attempt already suppressed this session).
|
|
288
|
-
const { getInstallAttempt } = await import("./installer/index.js");
|
|
289
|
-
return this.noteUnavailable(startedAt, "missing", "not-found", describeInstallAttempt(getInstallAttempt("ast-grep"), {
|
|
290
|
-
installedButRejected: installed.outcome === "non-installable",
|
|
291
|
-
}), "caller");
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Record a successful sweep, with one decision record.
|
|
295
|
-
*
|
|
296
|
-
* The win is latched for the session UNLESS a direct candidate ahead of it
|
|
297
|
-
* was unreachable (#1568). `sweepSawTransient` is set only by candidates the
|
|
298
|
-
* sweep already asked, and the sweep returns at the first one that answers,
|
|
299
|
-
* so at this point the flag means "a tier the winner is supposed to lose to
|
|
300
|
-
* never got a fair hearing". Latching that pinned the session to
|
|
301
|
-
* `npx --no -- ast-grep` — a Node start per invocation — over a healthy
|
|
302
|
-
* ast-grep on PATH, until the next restart. Provisional instead: served now,
|
|
303
|
-
* re-swept once the stalled tier's cooldown expires.
|
|
304
|
-
*
|
|
305
|
-
* The install arm cannot reach here provisionally: `doEnsureAvailable`
|
|
306
|
-
* returns before Step 4 whenever `sweepSawTransient` is set.
|
|
307
|
-
*
|
|
308
|
-
* `retained` marks the other provisional case (#1568 review F1): no candidate
|
|
309
|
-
* answered at all, and the winner being reported is the one the previous
|
|
310
|
-
* sweep found, kept rather than discarded on a timeout.
|
|
311
|
-
*/
|
|
312
|
-
noteAvailable(startedAt, message, opts = {}) {
|
|
313
|
-
const provisional = this.sweepSawTransient;
|
|
314
|
-
let retryAfterMs = 0;
|
|
315
|
-
if (provisional) {
|
|
316
|
-
retryAfterMs = this.availabilityLatch.noteProvisionallyAvailable(this.sweepTransientCause);
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
this.availabilityLatch.noteAvailable();
|
|
320
|
-
}
|
|
321
|
-
this.log(message);
|
|
322
|
-
logAvailabilityDecision({
|
|
323
|
-
tool: "ast-grep",
|
|
324
|
-
verdict: "available",
|
|
325
|
-
outcome: "success",
|
|
326
|
-
cause: provisional ? this.sweepTransientCause : "ok",
|
|
327
|
-
elapsedMs: Date.now() - startedAt,
|
|
328
|
-
latched: !provisional,
|
|
329
|
-
classifiedBy: "probe",
|
|
330
|
-
hostStallMs: this.sweepHostStallMs,
|
|
331
|
-
budgetMs: PROBE_TIMEOUT_MS,
|
|
332
|
-
...(provisional && {
|
|
333
|
-
provisional: true,
|
|
334
|
-
unreachablePreferred: [...this.sweepUnreachable],
|
|
335
|
-
...(opts.retained === true && { retained: true }),
|
|
336
|
-
...(retryAfterMs > 0 && { retryAfterMs }),
|
|
337
|
-
}),
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Record a failed sweep. A `transient` outcome expires after a bounded
|
|
342
|
-
* cooldown; anything else is remembered for the session, as before. The
|
|
343
|
-
* elapsed/stall numbers describe the WHOLE sweep, because the verdict is
|
|
344
|
-
* about the sweep rather than any single candidate — reporting zero here
|
|
345
|
-
* would erase the evidence that cracked #1467.
|
|
346
|
-
*/
|
|
347
|
-
noteUnavailable(startedAt, outcome, cause, evidence,
|
|
348
|
-
/**
|
|
349
|
-
* How this arm reached its verdict. Per arm on purpose (#1500 review): the
|
|
350
|
-
* sweep's own transient/missing conclusions ARE derived from candidate
|
|
351
|
-
* probes, but the post-install assertion is not, and hardcoding `"probe"`
|
|
352
|
-
* here labelled an assertion as a derivation — the exact confusion the
|
|
353
|
-
* field was added to remove.
|
|
354
|
-
*/
|
|
355
|
-
classifiedBy = "probe") {
|
|
356
|
-
const retryAfterMs = this.availabilityLatch.noteUnavailable(outcome, cause);
|
|
357
|
-
logAvailabilityDecision({
|
|
358
|
-
tool: "ast-grep",
|
|
359
|
-
verdict: "unavailable",
|
|
360
|
-
outcome,
|
|
361
|
-
cause,
|
|
362
|
-
elapsedMs: Date.now() - startedAt,
|
|
363
|
-
latched: outcome !== "transient",
|
|
364
|
-
hostStallMs: this.sweepHostStallMs,
|
|
365
|
-
...(retryAfterMs > 0 && { retryAfterMs }),
|
|
366
|
-
budgetMs: PROBE_TIMEOUT_MS,
|
|
367
|
-
classifiedBy,
|
|
368
|
-
...(evidence !== undefined && { evidence }),
|
|
369
|
-
});
|
|
370
|
-
return false;
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Probe platform-specific @ast-grep/cli-{os}-{arch} npm packages.
|
|
374
|
-
* These ship the binary at the package root (sg / sg.exe).
|
|
375
|
-
*/
|
|
376
|
-
async probePlatformPackageBinary() {
|
|
377
|
-
const { platform, arch } = process;
|
|
378
|
-
const exeName = platform === "win32" ? "sg.exe" : "sg";
|
|
379
|
-
// Map Node.js platform/arch to @ast-grep/cli package suffix.
|
|
380
|
-
const pkgSuffixes = [];
|
|
381
|
-
if (platform === "linux" && arch === "x64")
|
|
382
|
-
pkgSuffixes.push("linux-x64-gnu");
|
|
383
|
-
if (platform === "linux" && arch === "arm64")
|
|
384
|
-
pkgSuffixes.push("linux-arm64-gnu");
|
|
385
|
-
if (platform === "darwin" && arch === "arm64")
|
|
386
|
-
pkgSuffixes.push("darwin-arm64");
|
|
387
|
-
if (platform === "darwin" && arch === "x64")
|
|
388
|
-
pkgSuffixes.push("darwin-x64");
|
|
389
|
-
if (platform === "win32" && arch === "x64")
|
|
390
|
-
pkgSuffixes.push("win32-x64-msvc");
|
|
391
|
-
if (platform === "win32" && arch === "arm64")
|
|
392
|
-
pkgSuffixes.push("win32-arm64-msvc");
|
|
393
|
-
// Search roots: local node_modules and any parent node_modules directories.
|
|
394
|
-
const searchRoots = [];
|
|
395
|
-
let dir = process.cwd();
|
|
396
|
-
for (let depth = 0; depth < 5; depth++) {
|
|
397
|
-
searchRoots.push(path.join(dir, "node_modules"));
|
|
398
|
-
const parent = path.dirname(dir);
|
|
399
|
-
if (parent === dir)
|
|
400
|
-
break;
|
|
401
|
-
dir = parent;
|
|
402
|
-
}
|
|
403
|
-
for (const suffix of pkgSuffixes) {
|
|
404
|
-
const pkgName = `@ast-grep/cli-${suffix}`;
|
|
405
|
-
for (const root of searchRoots) {
|
|
406
|
-
const candidate = path.join(root, pkgName, exeName);
|
|
407
|
-
try {
|
|
408
|
-
if (fs.existsSync(candidate) &&
|
|
409
|
-
(await this.probeCommand(candidate, []))) {
|
|
410
|
-
return candidate;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
catch {
|
|
414
|
-
// not found or not executable — try next
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
return undefined;
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* Probe Homebrew installation (macOS only).
|
|
422
|
-
* Runs `brew --prefix ast-grep` and checks the resulting bin directory.
|
|
423
|
-
*/
|
|
424
|
-
async probeHomebrew() {
|
|
425
|
-
try {
|
|
426
|
-
const result = await safeSpawnAsync("brew", ["--prefix", "ast-grep"], {
|
|
427
|
-
timeout: 3000,
|
|
428
|
-
});
|
|
429
|
-
if (result.error || result.status !== 0)
|
|
430
|
-
return undefined;
|
|
431
|
-
const prefix = result.stdout.trim();
|
|
432
|
-
if (!prefix)
|
|
433
|
-
return undefined;
|
|
434
|
-
for (const name of ["ast-grep", "sg"]) {
|
|
435
|
-
const candidate = path.join(prefix, "bin", name);
|
|
436
|
-
if (fs.existsSync(candidate) &&
|
|
437
|
-
(await this.probeCommand(candidate, []))) {
|
|
438
|
-
return candidate;
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
catch {
|
|
443
|
-
// brew not installed or timed out
|
|
444
|
-
}
|
|
445
|
-
return undefined;
|
|
446
|
-
}
|
|
447
|
-
isAstGrepVersionOutput(output) {
|
|
448
|
-
return /\bast[- ]grep\b/i.test(output);
|
|
449
|
-
}
|
|
450
|
-
/**
|
|
451
|
-
* Probe one candidate. A failure is CLASSIFIED, not merely counted: a
|
|
452
|
-
* timeout/abort marks the whole sweep transient so the caller retries later
|
|
453
|
-
* instead of installing and latching. A command that answers but is not
|
|
454
|
-
* ast-grep (Linux `/usr/bin/sg` is util-linux) is a durable no.
|
|
455
|
-
*/
|
|
456
|
-
async probeCommand(cmd, argsPrefix, fallback = false) {
|
|
457
|
-
// Host-side budget: measure the loop stall that overlapped the window so
|
|
458
|
-
// the classifier can tell "the tool is slow" from "the host was busy".
|
|
459
|
-
const sampler = startHostStallSampler();
|
|
460
|
-
let result;
|
|
461
|
-
let hostStallMs;
|
|
462
|
-
try {
|
|
463
|
-
result = await probeToolAsync(cmd, [...argsPrefix, "--version"], {
|
|
464
|
-
timeout: PROBE_TIMEOUT_MS,
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
finally {
|
|
468
|
-
hostStallMs = sampler.stop();
|
|
469
|
-
this.sweepHostStallMs += hostStallMs;
|
|
470
|
-
}
|
|
471
|
-
if (!result.error &&
|
|
472
|
-
result.status === 0 &&
|
|
473
|
-
this.isAstGrepVersionOutput(`${result.stdout}\n${result.stderr}`)) {
|
|
474
|
-
return true;
|
|
475
|
-
}
|
|
476
|
-
const { outcome, cause } = classifyProbeFailure(result, { hostStallMs });
|
|
477
|
-
if (outcome === "transient") {
|
|
478
|
-
if (fallback) {
|
|
479
|
-
this.sweepFallbackTransient = true;
|
|
480
|
-
this.sweepFallbackCause = cause;
|
|
481
|
-
}
|
|
482
|
-
else {
|
|
483
|
-
this.sweepSawTransient = true;
|
|
484
|
-
this.sweepTransientCause = cause;
|
|
485
|
-
const name = path.basename(cmd);
|
|
486
|
-
if (!this.sweepUnreachable.includes(name)) {
|
|
487
|
-
this.sweepUnreachable.push(name);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
else if (!this.sweepDurablyMissing.includes(cmd)) {
|
|
492
|
-
this.sweepDurablyMissing.push(cmd);
|
|
493
|
-
}
|
|
494
|
-
return false;
|
|
495
|
-
}
|
|
496
|
-
async probeCommandCandidates(candidates) {
|
|
497
|
-
for (const candidate of candidates) {
|
|
498
|
-
if (await this.probeCommand(candidate.cmd, candidate.argsPrefix, candidate.fallback ?? false)) {
|
|
499
|
-
return candidate;
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
return undefined;
|
|
503
|
-
}
|
|
504
|
-
/**
|
|
505
|
-
* Get the ast-grep command to use, plus any npx prefix arguments.
|
|
506
|
-
*/
|
|
507
|
-
getSgCommand() {
|
|
508
|
-
return {
|
|
509
|
-
cmd: this.sgPath || "ast-grep",
|
|
510
|
-
argsPrefix: this.sgArgsPrefix,
|
|
511
|
-
};
|
|
512
|
-
}
|
|
513
|
-
failureForSpawnResult(result) {
|
|
514
|
-
if (result.failure === "aborted")
|
|
515
|
-
return "aborted";
|
|
516
|
-
switch (result.spawnFailure?.kind) {
|
|
517
|
-
case "tool-not-found":
|
|
518
|
-
return "unavailable";
|
|
519
|
-
case "timeout":
|
|
520
|
-
return "timeout";
|
|
521
|
-
case "killed":
|
|
522
|
-
return result.failure === "aborted" ? "aborted" : "cli-failure";
|
|
523
|
-
case "cwd-unresolvable":
|
|
524
|
-
case "permission-denied":
|
|
525
|
-
case "spawn-failed":
|
|
526
|
-
case undefined:
|
|
527
|
-
return result.error ? "cli-failure" : undefined;
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
formatPatternError(stderr, args) {
|
|
531
|
-
if (stderr.includes("Multiple AST nodes are detected")) {
|
|
532
|
-
return (`Invalid AST pattern: The pattern appears to contain multiple AST nodes or is malformed.\n` +
|
|
533
|
-
`Common causes:\n` +
|
|
534
|
-
` 1. Missing parentheses: use it($TEST) not it"test"\n` +
|
|
535
|
-
` 2. Raw text without structure: use console.log($MSG) not just "console.log"\n` +
|
|
536
|
-
` 3. Unclosed quotes or brackets\n\n` +
|
|
537
|
-
`Original error: ${stderr}`);
|
|
538
|
-
}
|
|
539
|
-
if (stderr.includes("Cannot parse query")) {
|
|
540
|
-
return (`Pattern syntax error: The pattern could not be parsed as valid code.\n` +
|
|
541
|
-
`Tips:\n` +
|
|
542
|
-
` - Patterns must be valid ${args.includes("--lang") ? args[args.indexOf("--lang") + 1] : "language"} syntax\n` +
|
|
543
|
-
` - Use metavariables like $NAME, $ARGS for variable parts\n` +
|
|
544
|
-
` - Example: 'function $NAME($$$PARAMS) { $$$BODY }'\n\n` +
|
|
545
|
-
`Original error: ${stderr}`);
|
|
546
|
-
}
|
|
547
|
-
return stderr;
|
|
548
|
-
}
|
|
549
|
-
async execRaw(args, timeout = DEFAULT_EXEC_TIMEOUT_MS, options = {}) {
|
|
550
|
-
const command = this.getSgCommand();
|
|
551
|
-
const result = await safeSpawnAsync(command.cmd, [...command.argsPrefix, ...args], {
|
|
552
|
-
timeout,
|
|
553
|
-
deadlineAt: options.deadlineAt,
|
|
554
|
-
signal: options.signal,
|
|
555
|
-
maxOutputBytes: MAX_SG_OUTPUT_BYTES,
|
|
556
|
-
});
|
|
557
|
-
const failure = this.failureForSpawnResult(result);
|
|
558
|
-
return {
|
|
559
|
-
stdout: result.stdout,
|
|
560
|
-
stderr: result.stderr,
|
|
561
|
-
status: result.status,
|
|
562
|
-
error: result.error?.message,
|
|
563
|
-
failure,
|
|
564
|
-
...(result.outputTruncated ? { outputTruncated: true } : {}),
|
|
565
|
-
};
|
|
566
|
-
}
|
|
567
|
-
/**
|
|
568
|
-
* Run ast-grep asynchronously, return parsed matches. The Windows Git
|
|
569
|
-
* Bash/MSYS path deliberately remains positional-argument based, but the
|
|
570
|
-
* child itself now goes through safeSpawnAsync so cancellation, deadlines,
|
|
571
|
-
* tree-kill, and output caps are shared with every other CLI runner.
|
|
572
|
-
*/
|
|
573
|
-
async exec(args, options = {}) {
|
|
574
|
-
const command = this.getSgCommand();
|
|
575
|
-
const allArgs = [...command.argsPrefix, ...args];
|
|
576
|
-
const isWindows = process.platform === "win32";
|
|
577
|
-
const hasBash = Boolean(process.env.MSYSTEM || process.env.GIT_SHELL);
|
|
578
|
-
const useBash = isWindows && hasBash;
|
|
579
|
-
const result = await safeSpawnAsync(useBash ? "bash" : command.cmd, useBash ? buildBashRunArgs(command.cmd, allArgs) : allArgs, {
|
|
580
|
-
timeout: DEFAULT_EXEC_TIMEOUT_MS,
|
|
581
|
-
deadlineAt: options.deadlineAt,
|
|
582
|
-
signal: options.signal,
|
|
583
|
-
maxOutputBytes: MAX_SG_OUTPUT_BYTES,
|
|
584
|
-
});
|
|
585
|
-
const empty = () => ({
|
|
586
|
-
matches: [],
|
|
587
|
-
totalMatches: 0,
|
|
588
|
-
truncated: false,
|
|
589
|
-
});
|
|
590
|
-
// FIRST (#2100): hitting the cap makes safe-spawn SIGTERM ast-grep, so a
|
|
591
|
-
// truncated run also classifies as a killed spawn. Read after the two
|
|
592
|
-
// gates below, this guard could only ever describe a run that exited
|
|
593
|
-
// before the signal reached it. A timed-out or aborted run carries the
|
|
594
|
-
// flag too and keeps its own classification below.
|
|
595
|
-
if (truncatedByOutputCap(result)) {
|
|
596
|
-
return {
|
|
597
|
-
...empty(),
|
|
598
|
-
error: "Failed to parse output: output was truncated",
|
|
599
|
-
};
|
|
600
|
-
}
|
|
601
|
-
const spawnFailure = this.failureForSpawnResult(result);
|
|
602
|
-
if (spawnFailure) {
|
|
603
|
-
return {
|
|
604
|
-
...empty(),
|
|
605
|
-
error: spawnFailure === "unavailable"
|
|
606
|
-
? "ast-grep CLI not found. Install: npm i -D @ast-grep/cli"
|
|
607
|
-
: result.error?.message || "ast-grep CLI failed to start",
|
|
608
|
-
};
|
|
609
|
-
}
|
|
610
|
-
if (result.status !== 0) {
|
|
611
|
-
const stdout = result.stdout.trim();
|
|
612
|
-
const stderr = result.stderr.trim();
|
|
613
|
-
// ast-grep's linter-style contract: a rule with `severity: error`
|
|
614
|
-
// that MATCHES exits 1 with valid JSON matches on stdout (stderr
|
|
615
|
-
// carries "Scan succeeded and found error level diagnostics"). An
|
|
616
|
-
// exit code that means "scan succeeded with findings" must never be
|
|
617
|
-
// classified as a CLI failure — parse the matches. Only fall through
|
|
618
|
-
// to failure when the JSON isn't parseable (a real diagnostic).
|
|
619
|
-
if (result.status === 1 && stdout) {
|
|
620
|
-
const matches = tryParseNonZeroSgMatches(result);
|
|
621
|
-
if (matches) {
|
|
622
|
-
return {
|
|
623
|
-
matches,
|
|
624
|
-
totalMatches: matches.length,
|
|
625
|
-
truncated: false,
|
|
626
|
-
};
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
// ast-grep uses status 1 with no output for a genuine no-match in
|
|
630
|
-
// some CLI versions. Preserve that historical empty-result behavior;
|
|
631
|
-
// any stderr (including an invalid kind/YAML diagnostic) is a failure.
|
|
632
|
-
if (result.status === 1 && !stdout && !stderr)
|
|
633
|
-
return empty();
|
|
634
|
-
return {
|
|
635
|
-
...empty(),
|
|
636
|
-
error: this.formatPatternError(stderr || `Command failed with exit code ${result.status}`, args),
|
|
637
|
-
};
|
|
638
|
-
}
|
|
639
|
-
if (!result.stdout.trim())
|
|
640
|
-
return empty();
|
|
641
|
-
{
|
|
642
|
-
const matches = tryParseSgMatches(result.stdout);
|
|
643
|
-
if (matches) {
|
|
644
|
-
return {
|
|
645
|
-
matches,
|
|
646
|
-
totalMatches: matches.length,
|
|
647
|
-
truncated: false,
|
|
648
|
-
};
|
|
649
|
-
}
|
|
650
|
-
return { ...empty(), error: "Failed to parse output" };
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
// --- Shared helpers for temp-dir rule scans ---
|
|
654
|
-
prepareTempScan(ruleId, ruleYaml) {
|
|
655
|
-
const sessionDir = fs.mkdtempSync(path.join(os.tmpdir(), `pi-lens-temp-${ruleId}-`));
|
|
656
|
-
try {
|
|
657
|
-
const rulesSubdir = path.join(sessionDir, "rules");
|
|
658
|
-
const configFile = path.join(sessionDir, ".sgconfig.yml");
|
|
659
|
-
fs.mkdirSync(rulesSubdir, { recursive: true });
|
|
660
|
-
fs.writeFileSync(configFile, `ruleDirs:\n - ./rules\n`);
|
|
661
|
-
fs.writeFileSync(path.join(rulesSubdir, `${ruleId}.yml`), ruleYaml);
|
|
662
|
-
return { sessionDir, configFile };
|
|
663
|
-
}
|
|
664
|
-
catch (error) {
|
|
665
|
-
this.cleanupTempScan(sessionDir);
|
|
666
|
-
throw error;
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
cleanupTempScan(sessionDir) {
|
|
670
|
-
try {
|
|
671
|
-
fs.rmSync(sessionDir, { recursive: true, force: true });
|
|
672
|
-
}
|
|
673
|
-
catch (err) {
|
|
674
|
-
this.log(`Cleanup failed: ${err.message}`);
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
interpretScanResult(result, args) {
|
|
678
|
-
// FIRST (#2100): same reason as `exec` above — the cap kill is our own
|
|
679
|
-
// SIGTERM, so `failureForSpawnResult` answers "cli-failure" for it and
|
|
680
|
-
// the truncation guard below never speaks.
|
|
681
|
-
if (truncatedByOutputCap(result)) {
|
|
682
|
-
return {
|
|
683
|
-
matches: [],
|
|
684
|
-
status: result.status,
|
|
685
|
-
error: "Failed to parse ast-grep scan output: output was truncated",
|
|
686
|
-
failure: "parse-failure",
|
|
687
|
-
};
|
|
688
|
-
}
|
|
689
|
-
const failure = this.failureForSpawnResult(result);
|
|
690
|
-
if (failure) {
|
|
691
|
-
return {
|
|
692
|
-
matches: [],
|
|
693
|
-
status: result.status,
|
|
694
|
-
error: result.error?.message || "ast-grep CLI failed to start",
|
|
695
|
-
failure,
|
|
696
|
-
};
|
|
697
|
-
}
|
|
698
|
-
if (result.status !== 0) {
|
|
699
|
-
const stdout = result.stdout.trim();
|
|
700
|
-
const stderr = result.stderr.trim();
|
|
701
|
-
// ast-grep's linter-style contract: a rule with `severity: error`
|
|
702
|
-
// that MATCHES exits 1 with valid JSON matches on stdout (stderr
|
|
703
|
-
// carries "Scan succeeded and found error level diagnostics"). An
|
|
704
|
-
// exit code that means "scan succeeded with findings" must never be
|
|
705
|
-
// classified as a CLI failure — parse the matches. Only fall through
|
|
706
|
-
// to failure when the JSON isn't parseable (a real diagnostic).
|
|
707
|
-
if (result.status === 1 && stdout) {
|
|
708
|
-
const matches = tryParseNonZeroSgMatches(result);
|
|
709
|
-
if (matches) {
|
|
710
|
-
return { matches, status: result.status };
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
// Preserve ast-grep's status-1/no-output no-match convention. A
|
|
714
|
-
// diagnostic on stderr is never treated as a no-match.
|
|
715
|
-
if (result.status === 1 && !stdout && !stderr) {
|
|
716
|
-
return { matches: [], status: result.status };
|
|
717
|
-
}
|
|
718
|
-
return {
|
|
719
|
-
matches: [],
|
|
720
|
-
status: result.status,
|
|
721
|
-
error: this.formatPatternError(stderr || `ast-grep scan failed with exit code ${result.status}`, args),
|
|
722
|
-
failure: "cli-failure",
|
|
723
|
-
};
|
|
724
|
-
}
|
|
725
|
-
if (!result.stdout.trim())
|
|
726
|
-
return { matches: [], status: result.status };
|
|
727
|
-
{
|
|
728
|
-
const matches = tryParseSgMatches(result.stdout);
|
|
729
|
-
if (matches) {
|
|
730
|
-
return { matches, status: result.status };
|
|
731
|
-
}
|
|
732
|
-
return {
|
|
733
|
-
matches: [],
|
|
734
|
-
status: result.status,
|
|
735
|
-
error: "Failed to parse ast-grep scan output: invalid JSON",
|
|
736
|
-
failure: "parse-failure",
|
|
737
|
-
};
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
async tempScanDetailedAsync(dir, ruleId, ruleYaml, timeout = DEFAULT_EXEC_TIMEOUT_MS, options = {}) {
|
|
741
|
-
let sessionDir;
|
|
742
|
-
try {
|
|
743
|
-
({ sessionDir } = this.prepareTempScan(ruleId, ruleYaml));
|
|
744
|
-
const configFile = path.join(sessionDir, ".sgconfig.yml");
|
|
745
|
-
const { cmd: sgCmd, args: sgPre } = getSgCommand();
|
|
746
|
-
const result = await safeSpawnAsync(sgCmd, [
|
|
747
|
-
...sgPre,
|
|
748
|
-
"scan",
|
|
749
|
-
"--config",
|
|
750
|
-
configFile,
|
|
751
|
-
"--json",
|
|
752
|
-
...sgExcludeArgsForProject(dir),
|
|
753
|
-
dir,
|
|
754
|
-
], {
|
|
755
|
-
timeout,
|
|
756
|
-
deadlineAt: options.deadlineAt,
|
|
757
|
-
signal: options.signal,
|
|
758
|
-
maxOutputBytes: MAX_SG_OUTPUT_BYTES,
|
|
759
|
-
});
|
|
760
|
-
return this.interpretScanResult(result, ["scan"]);
|
|
761
|
-
}
|
|
762
|
-
finally {
|
|
763
|
-
if (sessionDir)
|
|
764
|
-
this.cleanupTempScan(sessionDir);
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
/** Backwards-compatible match-only wrapper for existing session scanners. */
|
|
768
|
-
async tempScanAsync(dir, ruleId, ruleYaml, timeout = DEFAULT_EXEC_TIMEOUT_MS, options = {}) {
|
|
769
|
-
const result = await this.tempScanDetailedAsync(dir, ruleId, ruleYaml, timeout, options);
|
|
770
|
-
return result.matches;
|
|
771
|
-
}
|
|
772
|
-
/**
|
|
773
|
-
* Run a rule scan with optional fix application.
|
|
774
|
-
* Dry-run: --json (returns matches for preview).
|
|
775
|
-
* Apply: --update-all (writes fixes defined in the YAML `fix:` field).
|
|
776
|
-
*/
|
|
777
|
-
async tempScanWithFixAsync(dir, ruleId, ruleYaml, applyFixes, timeout = DEFAULT_EXEC_TIMEOUT_MS, options = {}) {
|
|
778
|
-
let sessionDir;
|
|
779
|
-
try {
|
|
780
|
-
({ sessionDir } = this.prepareTempScan(ruleId, ruleYaml));
|
|
781
|
-
const configFile = path.join(sessionDir, ".sgconfig.yml");
|
|
782
|
-
const { cmd: sgCmd, args: sgPre } = getSgCommand();
|
|
783
|
-
const scanArgs = [
|
|
784
|
-
...sgPre,
|
|
785
|
-
"scan",
|
|
786
|
-
"--config",
|
|
787
|
-
configFile,
|
|
788
|
-
"--json",
|
|
789
|
-
...sgExcludeArgsForProject(dir),
|
|
790
|
-
dir,
|
|
791
|
-
];
|
|
792
|
-
const spawnOptions = {
|
|
793
|
-
timeout,
|
|
794
|
-
deadlineAt: options.deadlineAt,
|
|
795
|
-
signal: options.signal,
|
|
796
|
-
maxOutputBytes: MAX_SG_OUTPUT_BYTES,
|
|
797
|
-
};
|
|
798
|
-
if (!applyFixes) {
|
|
799
|
-
const result = await safeSpawnAsync(sgCmd, scanArgs, spawnOptions);
|
|
800
|
-
const scan = this.interpretScanResult(result, ["scan"]);
|
|
801
|
-
return scan.failure || scan.error
|
|
802
|
-
? { matches: [], error: scan.error }
|
|
803
|
-
: { matches: scan.matches };
|
|
804
|
-
}
|
|
805
|
-
// Apply: capture matches BEFORE writing — once --update-all applies
|
|
806
|
-
// the fix the rule no longer matches, so a post-apply json pass would
|
|
807
|
-
// report zero even on a successful apply. Count first, then write.
|
|
808
|
-
const jsonResult = await safeSpawnAsync(sgCmd, scanArgs, spawnOptions);
|
|
809
|
-
const scan = this.interpretScanResult(jsonResult, ["scan"]);
|
|
810
|
-
if (scan.failure || scan.error) {
|
|
811
|
-
return { matches: [], error: scan.error };
|
|
812
|
-
}
|
|
813
|
-
const applyResult = await safeSpawnAsync(sgCmd, [
|
|
814
|
-
...sgPre,
|
|
815
|
-
"scan",
|
|
816
|
-
"--config",
|
|
817
|
-
configFile,
|
|
818
|
-
"--update-all",
|
|
819
|
-
...sgExcludeArgsForProject(dir),
|
|
820
|
-
dir,
|
|
821
|
-
], spawnOptions);
|
|
822
|
-
if (applyResult.error ||
|
|
823
|
-
applyResult.failure ||
|
|
824
|
-
applyResult.status !== 0) {
|
|
825
|
-
return {
|
|
826
|
-
matches: [],
|
|
827
|
-
error: applyResult.error?.message ||
|
|
828
|
-
`ast-grep apply failed with exit code ${applyResult.status}`,
|
|
829
|
-
};
|
|
830
|
-
}
|
|
831
|
-
return { matches: scan.matches };
|
|
832
|
-
}
|
|
833
|
-
catch (err) {
|
|
834
|
-
return { matches: [], error: String(err) };
|
|
835
|
-
}
|
|
836
|
-
finally {
|
|
837
|
-
if (sessionDir)
|
|
838
|
-
this.cleanupTempScan(sessionDir);
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
/**
|
|
842
|
-
* Format matches for display
|
|
843
|
-
*/
|
|
844
|
-
formatMatches(matches, isDryRun = false, maxItems = 50, showModeIndicator = false) {
|
|
845
|
-
if (matches.length === 0) {
|
|
846
|
-
if (showModeIndicator) {
|
|
847
|
-
return isDryRun
|
|
848
|
-
? "[DRY-RUN] No matches found."
|
|
849
|
-
: "[NOT APPLIED] No matches found — nothing was changed. Run ast_grep_search to confirm the pattern matches before applying.";
|
|
850
|
-
}
|
|
851
|
-
return "No matches found";
|
|
852
|
-
}
|
|
853
|
-
const shown = matches.slice(0, maxItems);
|
|
854
|
-
const lines = shown.map((m) => {
|
|
855
|
-
const loc = `${m.file}:${m.range.start.line + 1}:${m.range.start.column + 1}`;
|
|
856
|
-
const text = m.text.length > 100 ? `${m.text.slice(0, 100)}...` : m.text;
|
|
857
|
-
const langSuffix = m.language ? ` [${m.language}]` : "";
|
|
858
|
-
const base = isDryRun && m.replacement
|
|
859
|
-
? `${loc}\n - ${text}\n + ${m.replacement}`
|
|
860
|
-
: `${loc}: ${text}${langSuffix}`;
|
|
861
|
-
const captures = formatMetaVarCaptures(m.metaVariables);
|
|
862
|
-
return captures ? `${base}\n${captures}` : base;
|
|
863
|
-
});
|
|
864
|
-
if (matches.length > maxItems) {
|
|
865
|
-
lines.unshift(`Found ${matches.length} matches (showing first ${maxItems}):`);
|
|
866
|
-
}
|
|
867
|
-
if (showModeIndicator) {
|
|
868
|
-
const prefix = isDryRun ? "[DRY-RUN]" : "[APPLIED]";
|
|
869
|
-
const suffix = isDryRun
|
|
870
|
-
? "\n\n(Dry run — use apply=true to apply changes)"
|
|
871
|
-
: "";
|
|
872
|
-
return `${prefix} ${matches.length} replacement(s):\n\n${lines.join("\n")}${suffix}`;
|
|
873
|
-
}
|
|
874
|
-
return lines.join("\n");
|
|
875
|
-
}
|
|
876
|
-
}
|