@herbertgao/pi-extensions 2026.8.4 → 2026.8.5
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 +4 -4
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +10 -2
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +10 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +24 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +91 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +7 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +7 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +21 -12
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +4 -5
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +5 -8
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +22 -12
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +2 -4
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +8 -0
- package/node_modules/@herbertgao/pi-subagents/package.json +8 -4
- package/node_modules/@herbertgao/pi-subagents/src/agent-color.ts +72 -67
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +255 -0
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +191 -3
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +15 -2
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +289 -113
- package/node_modules/@herbertgao/pi-subagents/src/output-file.ts +24 -1
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +24 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/schedule-menu.ts +9 -8
- package/node_modules/@herbertgao/pi-subagents/src/ui/select-item.ts +48 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/keyboard.md +7 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +7 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +16 -5
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +4 -2
- package/node_modules/@narumitw/pi-btw/README.md +8 -7
- package/node_modules/@narumitw/pi-btw/package.json +2 -2
- package/node_modules/@narumitw/pi-btw/src/menu.ts +1 -0
- package/node_modules/pi-lens/CHANGELOG.md +2440 -954
- package/node_modules/pi-lens/README.md +13 -0
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +73 -18
- package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +21 -4
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +68 -16
- package/node_modules/pi-lens/dist/clients/ast-grep-types.js +0 -1
- package/node_modules/pi-lens/dist/clients/ast-grep-yaml-synth.js +37 -10
- package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +63 -0
- package/node_modules/pi-lens/dist/clients/atomic-write.js +114 -14
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +193 -23
- package/node_modules/pi-lens/dist/clients/biome-client.js +29 -25
- package/node_modules/pi-lens/dist/clients/bootstrap.js +11 -2
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +34 -0
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +192 -0
- package/node_modules/pi-lens/dist/clients/bus-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +47 -5
- package/node_modules/pi-lens/dist/clients/cache-manager.js +97 -9
- package/node_modules/pi-lens/dist/clients/cache-observability.js +301 -14
- package/node_modules/pi-lens/dist/clients/call-graph.js +449 -117
- package/node_modules/pi-lens/dist/clients/child-unref.js +85 -0
- package/node_modules/pi-lens/dist/clients/codebase-model.js +52 -23
- package/node_modules/pi-lens/dist/clients/collateral-test-role.js +40 -0
- package/node_modules/pi-lens/dist/clients/complexity-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/console-guard-install.js +14 -0
- package/node_modules/pi-lens/dist/clients/cooperative-budget.js +42 -0
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/debug-handles.js +206 -0
- package/node_modules/pi-lens/dist/clients/debug-heap.js +167 -0
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +153 -0
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +347 -75
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +61 -11
- package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +63 -20
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +23 -7
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +8 -18
- package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +8 -5
- package/node_modules/pi-lens/dist/clients/dispatch/indent-detect.js +35 -0
- package/node_modules/pi-lens/dist/clients/dispatch/inline-suppressions.js +17 -8
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +1085 -681
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +14 -0
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +11 -1
- package/node_modules/pi-lens/dist/clients/dispatch/rule-id-normalize.js +50 -0
- package/node_modules/pi-lens/dist/clients/dispatch/rule-policy.js +135 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +23 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +5 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +3 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +154 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +3 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +14 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +4 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +9 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +4 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +2 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +2 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +163 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +37 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +13 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +3 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +277 -26
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +22 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +5 -4
- package/node_modules/pi-lens/dist/clients/disposition-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/durable-store.js +97 -0
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +94 -3
- package/node_modules/pi-lens/dist/clients/extension-log.js +139 -0
- package/node_modules/pi-lens/dist/clients/extension-mode.js +73 -0
- package/node_modules/pi-lens/dist/clients/file-kinds.js +57 -0
- package/node_modules/pi-lens/dist/clients/file-role.js +18 -3
- package/node_modules/pi-lens/dist/clients/file-utils.js +56 -34
- package/node_modules/pi-lens/dist/clients/format-events-publish.js +16 -3
- package/node_modules/pi-lens/dist/clients/format-service.js +24 -8
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +8 -0
- package/node_modules/pi-lens/dist/clients/formatters.js +358 -61
- package/node_modules/pi-lens/dist/clients/generated-artifacts.js +148 -15
- package/node_modules/pi-lens/dist/clients/git-guard.js +681 -11
- package/node_modules/pi-lens/dist/clients/git-tracked-ignore.js +4 -0
- package/node_modules/pi-lens/dist/clients/go-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +8 -0
- package/node_modules/pi-lens/dist/clients/grammar-source.js +12 -4
- package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +21 -3
- package/node_modules/pi-lens/dist/clients/host-ports.js +31 -0
- package/node_modules/pi-lens/dist/clients/installer/index.js +390 -99
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +142 -172
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +31 -54
- package/node_modules/pi-lens/dist/clients/knip-client.js +15 -36
- package/node_modules/pi-lens/dist/clients/language-policy.js +14 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +13 -7
- package/node_modules/pi-lens/dist/clients/latency-logger.js +23 -1
- package/node_modules/pi-lens/dist/clients/lens-config.js +12 -1
- package/node_modules/pi-lens/dist/clients/lens-engine.js +86 -17
- package/node_modules/pi-lens/dist/clients/lens-events.js +27 -4
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +8 -0
- package/node_modules/pi-lens/dist/clients/lens-map.js +94 -19
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +30 -0
- package/node_modules/pi-lens/dist/clients/log-cleanup.js +2 -1
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/client.js +493 -48
- package/node_modules/pi-lens/dist/clients/lsp/config.js +13 -2
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +86 -0
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +1012 -121
- package/node_modules/pi-lens/dist/clients/lsp/index.js +1807 -780
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +32 -26
- package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/ruby-drive-dirs.js +83 -0
- package/node_modules/pi-lens/dist/clients/lsp/server.js +196 -32
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +28 -4
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +8 -0
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +248 -0
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +123 -32
- package/node_modules/pi-lens/dist/clients/mcp/ipc.js +157 -24
- package/node_modules/pi-lens/dist/clients/mcp/session.js +216 -8
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +115 -0
- package/node_modules/pi-lens/dist/clients/metrics-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/metrics-history.js +2 -1
- package/node_modules/pi-lens/dist/clients/module-report-lsp.js +5 -0
- package/node_modules/pi-lens/dist/clients/module-report.js +168 -3
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +319 -118
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +1 -1
- package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +120 -5
- package/node_modules/pi-lens/dist/clients/path-utils.js +110 -9
- package/node_modules/pi-lens/dist/clients/pipeline.js +47 -13
- package/node_modules/pi-lens/dist/clients/print-mode.js +21 -0
- package/node_modules/pi-lens/dist/clients/project-changes.js +40 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +3 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +8 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +21 -1
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +86 -9
- package/node_modules/pi-lens/dist/clients/project-report.js +27 -13
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +175 -20
- package/node_modules/pi-lens/dist/clients/project-trust.js +181 -0
- package/node_modules/pi-lens/dist/clients/quiet-window.js +18 -4
- package/node_modules/pi-lens/dist/clients/read-bridge.js +147 -0
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +159 -1
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +150 -29
- package/node_modules/pi-lens/dist/clients/read-guard.js +185 -4
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +70 -84
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +1122 -221
- package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +2 -1
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +21 -10
- package/node_modules/pi-lens/dist/clients/review-graph/symbol-id.js +46 -0
- package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +57 -6
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +51 -3
- package/node_modules/pi-lens/dist/clients/review-graph-logger.js +30 -1
- package/node_modules/pi-lens/dist/clients/ruff-client.js +27 -44
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +107 -73
- package/node_modules/pi-lens/dist/clients/runtime-context.js +36 -12
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +74 -6
- package/node_modules/pi-lens/dist/clients/runtime-session.js +405 -117
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +71 -48
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +218 -23
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +237 -64
- package/node_modules/pi-lens/dist/clients/rust-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +777 -62
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +2 -1
- package/node_modules/pi-lens/dist/clients/session-state-store.js +3 -2
- package/node_modules/pi-lens/dist/clients/sg-runner.js +284 -174
- package/node_modules/pi-lens/dist/clients/slow-fs.js +2 -1
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +224 -0
- package/node_modules/pi-lens/dist/clients/source-filter.js +184 -20
- package/node_modules/pi-lens/dist/clients/source-walker.js +66 -10
- package/node_modules/pi-lens/dist/clients/startup-scan.js +15 -16
- package/node_modules/pi-lens/dist/clients/startup-timing.js +1 -1
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +38 -8
- package/node_modules/pi-lens/dist/clients/tool-event.js +35 -0
- package/node_modules/pi-lens/dist/clients/tool-policy.js +388 -39
- package/node_modules/pi-lens/dist/clients/tool-render.js +155 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +6 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +419 -50
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +21 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +7 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +7 -2
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +44 -7
- package/node_modules/pi-lens/dist/clients/user-notify.js +51 -0
- package/node_modules/pi-lens/dist/clients/vanished-instance-marker.js +57 -0
- package/node_modules/pi-lens/dist/clients/warm-attach.js +33 -13
- package/node_modules/pi-lens/dist/clients/widget-state.js +300 -43
- package/node_modules/pi-lens/dist/clients/word-index.js +391 -64
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +89 -6
- package/node_modules/pi-lens/dist/index.js +49361 -36888
- package/node_modules/pi-lens/dist/mcp/analyze-cli.js +182 -29
- package/node_modules/pi-lens/dist/mcp/server.js +211 -44
- package/node_modules/pi-lens/dist/tools/ast-grep-search.js +93 -27
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +200 -36
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +153 -40
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -3
- package/node_modules/pi-lens/dist/tools/module-report.js +9 -0
- package/node_modules/pi-lens/docs/agent-guide.md +2 -2
- package/node_modules/pi-lens/docs/agent-tools.md +21 -10
- package/node_modules/pi-lens/docs/analysisall.md +192 -0
- package/node_modules/pi-lens/docs/api-ports-inventory.md +165 -0
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +5 -2
- package/node_modules/pi-lens/docs/durable-store-audit-1202.md +32 -0
- package/node_modules/pi-lens/docs/environment-variables.md +44 -0
- package/node_modules/pi-lens/docs/fable.md +27 -0
- package/node_modules/pi-lens/docs/features.md +31 -2
- package/node_modules/pi-lens/docs/globalconfig.md +45 -1
- package/node_modules/pi-lens/docs/language-coverage.md +4 -3
- package/node_modules/pi-lens/docs/lsp-capability-matrix.md +2 -2
- package/node_modules/pi-lens/docs/mcp.md +37 -4
- package/node_modules/pi-lens/docs/servercapabilities.md +3 -3
- package/node_modules/pi-lens/docs/settings.md +12 -1
- package/node_modules/pi-lens/docs/tools.md +4 -1
- package/node_modules/pi-lens/docs/usage.md +18 -0
- package/node_modules/pi-lens/package.json +10 -10
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-except-test.yml +49 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-host-path-in-win32-branch-test.yml +87 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-nested-links-test.yml +11 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-raw-json-store-write-test.yml +17 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-win32-isabsolute-for-qualification-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-except.yml +3 -15
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +25 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-nested-links.yml +7 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +30 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +23 -0
- package/node_modules/pi-lens/rules/tree-sitter-queries/tsx/no-nested-links.yml +4 -6
- package/node_modules/pi-lens/rules/tree-sitter-queries/typescript/duplicate-function-arg.yml +2 -2
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +55 -2
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +25 -0
- package/node_modules/pi-mcp-adapter/README.md +34 -3
- package/node_modules/pi-mcp-adapter/agent-plugin-loader.ts +1 -1
- package/node_modules/pi-mcp-adapter/commands.ts +15 -7
- package/node_modules/pi-mcp-adapter/direct-tools.ts +54 -7
- package/node_modules/pi-mcp-adapter/host-html-template.ts +0 -8
- package/node_modules/pi-mcp-adapter/index.ts +8 -3
- package/node_modules/pi-mcp-adapter/init.ts +29 -5
- package/node_modules/pi-mcp-adapter/lifecycle.ts +0 -4
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +1 -2
- package/node_modules/pi-mcp-adapter/mcp-auth.ts +60 -2
- package/node_modules/pi-mcp-adapter/mcp-panel.ts +45 -9
- package/node_modules/pi-mcp-adapter/mcp-script-worker.mjs +22 -20
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +27 -4
- package/node_modules/pi-mcp-adapter/npx-resolver.ts +81 -26
- package/node_modules/pi-mcp-adapter/package.json +3 -3
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +108 -26
- package/node_modules/pi-mcp-adapter/search-ranking.ts +86 -7
- package/node_modules/pi-mcp-adapter/server-manager.ts +36 -7
- package/node_modules/pi-mcp-adapter/session-recovery.ts +8 -2
- package/node_modules/pi-mcp-adapter/tool-approval.ts +48 -7
- package/node_modules/pi-mcp-adapter/tool-metadata.ts +42 -4
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +138 -12
- package/node_modules/pi-mcp-adapter/types.ts +93 -27
- package/node_modules/pi-mcp-adapter/ui-server.ts +20 -1
- package/package.json +11 -12
- package/node_modules/pi-lens/dist/clients/ast-grep-parser.js +0 -86
- package/node_modules/pi-lens/dist/clients/lsp/interactive-install.js +0 -367
- package/node_modules/pi-lens/dist/clients/lsp/lsp-index.js +0 -10
- package/node_modules/pi-lens/dist/clients/lsp/server-strategies.js +0 -5
- package/node_modules/pi-lens/dist/clients/project-metadata.js +0 -690
- package/node_modules/pi-lens/dist/clients/source-groups.js +0 -96
- package/node_modules/pi-lens/dist/clients/startup-marker.js +0 -6
- package/node_modules/pi-lens/dist/clients/types.js +0 -11
|
@@ -43,11 +43,14 @@ function toSearchReads(matches) {
|
|
|
43
43
|
}
|
|
44
44
|
return out;
|
|
45
45
|
}
|
|
46
|
-
// Default and
|
|
46
|
+
// Default and ceilings for agent-facing search inputs. `maxMatches` lets a caller
|
|
47
47
|
// trade volume for completeness within these bounds (the default preserves the
|
|
48
|
-
// historical page size).
|
|
48
|
+
// historical page size). Explicit path lists are capped like the other bounded
|
|
49
|
+
// multi-file tools, while a single directory path remains a valid project scope.
|
|
49
50
|
const DEFAULT_PAGE_SIZE = 50;
|
|
50
51
|
const MAX_PAGE_SIZE = 200;
|
|
52
|
+
const MAX_PATHS = 200;
|
|
53
|
+
const AST_GREP_SEARCH_TIMEOUT_MS = 30_000;
|
|
51
54
|
/**
|
|
52
55
|
* Compact, file-grouped rendering for high-volume searches (refs #345). Instead
|
|
53
56
|
* of each match's full body, emit one line per file with its 1-based
|
|
@@ -225,19 +228,20 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
225
228
|
name: "ast_grep_search",
|
|
226
229
|
label: "AST Search",
|
|
227
230
|
description: "Search code using AST-aware pattern matching. IMPORTANT: Use specific AST patterns, NOT text search.\n\n" +
|
|
228
|
-
"✅ GOOD patterns (
|
|
229
|
-
" - function $NAME() { $$$BODY }
|
|
230
|
-
" - fetchMetrics(
|
|
231
|
-
' - import {
|
|
232
|
-
" - console.log($MSG)
|
|
231
|
+
"✅ GOOD patterns (complete AST shapes; $$$ accepts zero or more nodes):\n" +
|
|
232
|
+
" - function $NAME($$$ARGS) { $$$BODY } (function declaration)\n" +
|
|
233
|
+
" - fetchMetrics($$$ARGS) (call with any arguments)\n" +
|
|
234
|
+
' - import { $$$NAMES } from "module-name" (exact string-literal import)\n' +
|
|
235
|
+
" - console.log($MSG) (method call)\n\n" +
|
|
233
236
|
"❌ BAD patterns (multiple nodes / raw text):\n" +
|
|
234
|
-
' - it"test name"
|
|
235
|
-
" - console.log without args
|
|
237
|
+
' - it"test name" (missing parens - use it($TEST))\n' +
|
|
238
|
+
" - console.log without args (incomplete code)\n" +
|
|
236
239
|
" - arbitrary text without code structure\n\n" +
|
|
237
|
-
"
|
|
240
|
+
'Metavariables match AST nodes, not text inside quoted string literals: `from "$PATH"` matches the literal text $PATH. Use an exact quoted string for a known import, or grep for wildcard text. ' +
|
|
238
241
|
"Use 'paths' to scope to specific files/folders. " +
|
|
239
|
-
"
|
|
240
|
-
"
|
|
242
|
+
"Use 'nodeKind' to find every node of a known AST kind, or 'ast_grep_dump' first when the kind is unknown. " +
|
|
243
|
+
"Avoid 'selector' unless you know the exact AST node kind; it narrows matching and does not extract fields. " +
|
|
244
|
+
'If this tool is inactive, call pi_lens_activate_tools with tools=["ast_grep_search"]; activation takes effect next turn. If zero matches, retry once with a simpler AST pattern, then use ast_grep_dump on a small representative snippet before falling back to grep.',
|
|
241
245
|
promptSnippet: "AST-aware structural code search",
|
|
242
246
|
renderResult: compactRenderResult(({ details, isError, text }) => {
|
|
243
247
|
if (details?.validateOnly) {
|
|
@@ -257,14 +261,15 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
257
261
|
}),
|
|
258
262
|
parameters: Type.Object({
|
|
259
263
|
pattern: Type.Optional(Type.String({
|
|
260
|
-
description: "AST pattern (use function/class/call context, not text). Required unless `rule` is provided.",
|
|
264
|
+
description: "AST pattern (use function/class/call context, not text). Required unless `rule` or `nodeKind` is provided. Do not put metavariables inside quoted string literals; they match literally.",
|
|
261
265
|
})),
|
|
262
266
|
lang: Type.String({
|
|
263
267
|
enum: [...LANGUAGES],
|
|
264
268
|
description: "Target language",
|
|
265
269
|
}),
|
|
266
270
|
paths: Type.Optional(Type.Array(Type.String(), {
|
|
267
|
-
|
|
271
|
+
maxItems: MAX_PATHS,
|
|
272
|
+
description: `Specific files/folders to search (max ${MAX_PATHS} entries)`,
|
|
268
273
|
})),
|
|
269
274
|
selector: Type.Optional(Type.String({
|
|
270
275
|
description: "Advanced: restrict search to a specific AST node kind (for example 'call_expression' or 'function_declaration'). This narrows matching; it does not extract fields from matches.",
|
|
@@ -272,11 +277,17 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
272
277
|
context: Type.Optional(Type.Number({
|
|
273
278
|
description: "Show N lines before/after each match for context",
|
|
274
279
|
})),
|
|
280
|
+
nodeKind: Type.Optional(Type.String({
|
|
281
|
+
description: "Expert grammar-specific escape hatch: find every node of this exact AST kind (for example `call_expression`) without writing a pattern. Node kinds are not universal across languages; use ast_grep_dump to discover them. Mutually exclusive with `pattern` and `rule`; can be combined with structural constraints.",
|
|
282
|
+
})),
|
|
275
283
|
insideKind: Type.Optional(Type.String({
|
|
276
284
|
description: 'Restrict matches to nodes inside an ancestor of this AST node kind. Example: `insideKind: "function_declaration"` finds the pattern only when it appears inside a function body. Searches all ancestors (stopBy: end), not just the immediate parent. Synthesizes a YAML rule — takes precedence over `selector` and `strictness`.',
|
|
277
285
|
})),
|
|
278
286
|
hasKind: Type.Optional(Type.String({
|
|
279
|
-
description: 'Restrict matches to nodes
|
|
287
|
+
description: 'Restrict matches to nodes whose immediate child has this AST node kind (ast-grep default stopBy: neighbor). Example: `hasKind: "await_expression"`.',
|
|
288
|
+
})),
|
|
289
|
+
hasDescendantKind: Type.Optional(Type.String({
|
|
290
|
+
description: "Restrict matches to nodes containing this AST node kind anywhere in their descendants. Explicit recursive form (`stopBy: end`); use this instead of `hasKind` when nesting is not immediate.",
|
|
280
291
|
})),
|
|
281
292
|
follows: Type.Optional(Type.String({
|
|
282
293
|
description: 'Restrict matches to nodes that immediately follow a sibling matching this pattern. Example: `follows: "return $X"` finds the pattern only when preceded by a return statement.',
|
|
@@ -309,12 +320,15 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
309
320
|
// tool-call one. Honor both so a broad search cancels on Escape.
|
|
310
321
|
const abortSignal = combineAbortSignals(_signal, ctx.signal);
|
|
311
322
|
const startedAt = Date.now();
|
|
312
|
-
const
|
|
323
|
+
const deadlineAt = startedAt + AST_GREP_SEARCH_TIMEOUT_MS;
|
|
324
|
+
const { paths, nodeKind, selector, context, skip, maxMatches, groupByFile, strictness, rule, insideKind, hasKind, hasDescendantKind, follows, precedes, validateOnly, } = params;
|
|
313
325
|
const pattern = typeof params.pattern === "string" ? params.pattern : "";
|
|
314
326
|
const rawLang = typeof params.lang === "string" ? params.lang : "";
|
|
327
|
+
const normalizedNodeKind = typeof nodeKind === "string" ? nodeKind.trim() : "";
|
|
315
328
|
const skipOffset = Math.max(0, Math.floor(skip ?? 0));
|
|
316
329
|
const lang = rawLang.replace(/^"|"$/g, "");
|
|
317
330
|
const searchPathsCount = paths?.length ?? 1;
|
|
331
|
+
const executionOptions = { signal: abortSignal, deadlineAt };
|
|
318
332
|
function logOutcome(outcome, details = {}) {
|
|
319
333
|
try {
|
|
320
334
|
const errorRaw = _telemetryErrorForTest(details.errorRaw);
|
|
@@ -360,7 +374,22 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
360
374
|
}
|
|
361
375
|
try {
|
|
362
376
|
const rawRule = typeof rule === "string" ? rule : undefined;
|
|
363
|
-
const hasRawRule =
|
|
377
|
+
const hasRawRule = Boolean(rawRule?.trim());
|
|
378
|
+
const hasPattern = Boolean(pattern.trim());
|
|
379
|
+
const hasNodeKind = normalizedNodeKind.length > 0;
|
|
380
|
+
const rawPaths = params.paths;
|
|
381
|
+
if (rawPaths !== undefined &&
|
|
382
|
+
(!Array.isArray(rawPaths) ||
|
|
383
|
+
rawPaths.length > MAX_PATHS ||
|
|
384
|
+
rawPaths.some((value) => typeof value !== "string"))) {
|
|
385
|
+
const errorRaw = `paths must contain at most ${MAX_PATHS} string entries`;
|
|
386
|
+
logOutcome("error", { errorRaw });
|
|
387
|
+
return {
|
|
388
|
+
content: [{ type: "text", text: `Error: ${errorRaw}` }],
|
|
389
|
+
isError: true,
|
|
390
|
+
details: {},
|
|
391
|
+
};
|
|
392
|
+
}
|
|
364
393
|
const rawRuleError = rawRuleValidationError(rawRule);
|
|
365
394
|
if (rawRuleError) {
|
|
366
395
|
logOutcome("error", { errorRaw: rawRuleError });
|
|
@@ -372,11 +401,16 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
372
401
|
details: {},
|
|
373
402
|
};
|
|
374
403
|
}
|
|
375
|
-
if (!
|
|
376
|
-
logOutcome("error", {
|
|
404
|
+
if (!hasPattern && !hasRawRule && !hasNodeKind) {
|
|
405
|
+
logOutcome("error", {
|
|
406
|
+
errorRaw: "pattern is required unless rule or nodeKind is provided",
|
|
407
|
+
});
|
|
377
408
|
return {
|
|
378
409
|
content: [
|
|
379
|
-
{
|
|
410
|
+
{
|
|
411
|
+
type: "text",
|
|
412
|
+
text: "Error: pattern is required unless rule or nodeKind is provided",
|
|
413
|
+
},
|
|
380
414
|
],
|
|
381
415
|
isError: true,
|
|
382
416
|
details: {},
|
|
@@ -422,7 +456,9 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
422
456
|
}
|
|
423
457
|
if (abortSignal?.aborted)
|
|
424
458
|
return abortError();
|
|
425
|
-
if (!hasRawRule &&
|
|
459
|
+
if (!hasRawRule &&
|
|
460
|
+
hasPattern &&
|
|
461
|
+
looksLikeRuleYamlOrPlainText(pattern)) {
|
|
426
462
|
logOutcome("error", {
|
|
427
463
|
errorRaw: "pattern looks like rule YAML or plain text (rejected pre-spawn)",
|
|
428
464
|
});
|
|
@@ -457,6 +493,24 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
457
493
|
details: {},
|
|
458
494
|
};
|
|
459
495
|
}
|
|
496
|
+
if (hasNodeKind && hasPattern) {
|
|
497
|
+
const errorRaw = "nodeKind cannot be combined with pattern";
|
|
498
|
+
logOutcome("error", { errorRaw });
|
|
499
|
+
return {
|
|
500
|
+
content: [{ type: "text", text: `Error: ${errorRaw}` }],
|
|
501
|
+
isError: true,
|
|
502
|
+
details: {},
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
if (hasNodeKind && hasRawRule) {
|
|
506
|
+
const errorRaw = "nodeKind cannot be combined with rule";
|
|
507
|
+
logOutcome("error", { errorRaw });
|
|
508
|
+
return {
|
|
509
|
+
content: [{ type: "text", text: `Error: ${errorRaw}` }],
|
|
510
|
+
isError: true,
|
|
511
|
+
details: {},
|
|
512
|
+
};
|
|
513
|
+
}
|
|
460
514
|
const searchPaths = paths?.length ? paths : [ctx.cwd || "."];
|
|
461
515
|
const PAGE_SIZE = Math.max(1, Math.min(MAX_PAGE_SIZE, Number.isFinite(maxMatches)
|
|
462
516
|
? Math.floor(maxMatches)
|
|
@@ -464,13 +518,23 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
464
518
|
// Phase 3: synthesize YAML from structural-intent params
|
|
465
519
|
let effectiveRule = hasRawRule ? rawRule : undefined;
|
|
466
520
|
if (!effectiveRule &&
|
|
467
|
-
|
|
521
|
+
(hasNodeKind ||
|
|
522
|
+
hasStructuralIntent({
|
|
523
|
+
nodeKind: normalizedNodeKind,
|
|
524
|
+
insideKind,
|
|
525
|
+
hasKind,
|
|
526
|
+
hasDescendantKind,
|
|
527
|
+
follows,
|
|
528
|
+
precedes,
|
|
529
|
+
}))) {
|
|
468
530
|
try {
|
|
469
531
|
effectiveRule = synthesizeRule({
|
|
470
|
-
pattern,
|
|
532
|
+
pattern: hasPattern ? pattern : undefined,
|
|
533
|
+
nodeKind: hasNodeKind ? normalizedNodeKind : undefined,
|
|
471
534
|
lang,
|
|
472
535
|
insideKind,
|
|
473
536
|
hasKind,
|
|
537
|
+
hasDescendantKind,
|
|
474
538
|
follows,
|
|
475
539
|
precedes,
|
|
476
540
|
});
|
|
@@ -491,10 +555,11 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
491
555
|
}
|
|
492
556
|
if (validateOnly) {
|
|
493
557
|
const validation = effectiveRule?.trim()
|
|
494
|
-
? await astGrepClient.validateRule(effectiveRule)
|
|
558
|
+
? await astGrepClient.validateRule(effectiveRule, executionOptions)
|
|
495
559
|
: await astGrepClient.validatePattern(pattern, lang, {
|
|
496
560
|
selector,
|
|
497
561
|
strictness,
|
|
562
|
+
...executionOptions,
|
|
498
563
|
});
|
|
499
564
|
if (!validation.valid) {
|
|
500
565
|
logOutcome("error", { errorRaw: validation.error });
|
|
@@ -530,7 +595,7 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
530
595
|
if (effectiveRule && effectiveRule.trim().length > 0) {
|
|
531
596
|
if (abortSignal?.aborted)
|
|
532
597
|
return abortError();
|
|
533
|
-
const ruleResult = await astGrepClient.searchWithRule(effectiveRule, searchPaths);
|
|
598
|
+
const ruleResult = await astGrepClient.searchWithRule(effectiveRule, searchPaths, executionOptions);
|
|
534
599
|
if (abortSignal?.aborted)
|
|
535
600
|
return abortError();
|
|
536
601
|
if (ruleResult.error) {
|
|
@@ -551,7 +616,7 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
551
616
|
const hasMore = afterSkip.length > PAGE_SIZE;
|
|
552
617
|
const output = groupByFile
|
|
553
618
|
? formatGroupedByFile(page)
|
|
554
|
-
: astGrepClient.formatMatches(page);
|
|
619
|
+
: astGrepClient.formatMatches(page, false, false, PAGE_SIZE);
|
|
555
620
|
const paginationNote = hasMore && page.length > 0
|
|
556
621
|
? `\n\n(Showing ${page.length} of ${ruleResult.matches.length - skipOffset} remaining matches. Use skip=${skipOffset + PAGE_SIZE} for the next page.)`
|
|
557
622
|
: "";
|
|
@@ -586,6 +651,7 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
586
651
|
selector,
|
|
587
652
|
context,
|
|
588
653
|
strictness,
|
|
654
|
+
...executionOptions,
|
|
589
655
|
});
|
|
590
656
|
if (abortSignal?.aborted)
|
|
591
657
|
return abortError();
|
|
@@ -605,7 +671,7 @@ export function createAstGrepSearchTool(astGrepClient) {
|
|
|
605
671
|
const hasMore = afterSkip.length > PAGE_SIZE || result.truncated;
|
|
606
672
|
const output = groupByFile
|
|
607
673
|
? formatGroupedByFile(page)
|
|
608
|
-
: astGrepClient.formatMatches(page);
|
|
674
|
+
: astGrepClient.formatMatches(page, false, false, PAGE_SIZE);
|
|
609
675
|
const hint = page.length === 0 && !result.error
|
|
610
676
|
? getPatternHint(pattern, lang, selector)
|
|
611
677
|
: undefined;
|