@herbertgao/pi-extensions 2026.8.5 → 2026.8.7
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 +5 -5
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +19 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +30 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +272 -22
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +74 -5
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +94 -77
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +48 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/message-display.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +14 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +55 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +41 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +75 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +7 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +64 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +16 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +30 -22
- package/node_modules/@herbertgao/pi-subagents/examples/agent-tool-description.md +5 -5
- package/node_modules/@herbertgao/pi-subagents/package.json +7 -7
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +7 -1
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +48 -19
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +22 -15
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +26 -2
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +219 -40
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +101 -3
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +18 -4
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +99 -0
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +22 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +51 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +20 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/fleet-list.ts +34 -10
- package/node_modules/@herbertgao/pi-subagents/src/usage.ts +129 -1
- package/node_modules/@herbertgao/pi-subagents/src/worktree.ts +29 -5
- package/node_modules/@juicesharp/rpiv-ask-user-question/README.md +3 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +46 -10
- package/node_modules/@juicesharp/rpiv-ask-user-question/config.ts +25 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/configuration.md +13 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/hosts.md +8 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/localization.md +3 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/en.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/zh.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +3 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +10 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +3 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +30 -7
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state.ts +14 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/dialog-builder.ts +30 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/tab-content-strategy.ts +26 -5
- package/node_modules/@narumitw/pi-btw/README.md +119 -103
- package/node_modules/@narumitw/pi-btw/dist/index.ts +2898 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +7 -0
- package/node_modules/@narumitw/pi-btw/package.json +13 -9
- package/node_modules/@narumitw/pi-btw/src/btw.ts +40 -42
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +55 -10
- package/node_modules/@narumitw/pi-btw/src/main-tree-picker.ts +390 -0
- package/node_modules/@narumitw/pi-btw/src/menu.ts +78 -15
- package/node_modules/@narumitw/pi-btw/src/settings.ts +22 -2
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +136 -45
- package/node_modules/pi-lens/CHANGELOG.md +1004 -0
- package/node_modules/pi-lens/README.md +11 -3
- package/node_modules/pi-lens/config/ruff/core.toml +42 -0
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +130 -27
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +427 -0
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +79 -16
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +9 -3
- package/node_modules/pi-lens/dist/clients/atomic-write.js +9 -3
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +285 -8
- package/node_modules/pi-lens/dist/clients/biome-client.js +176 -37
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +428 -0
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +119 -0
- package/node_modules/pi-lens/dist/clients/bootstrap.js +12 -1
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +12 -3
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +192 -0
- package/node_modules/pi-lens/dist/clients/bus-events-logger.js +62 -6
- package/node_modules/pi-lens/dist/clients/bus-publish.js +11 -3
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +196 -0
- package/node_modules/pi-lens/dist/clients/cascade-format.js +76 -2
- package/node_modules/pi-lens/dist/clients/cascade-types.js +9 -1
- package/node_modules/pi-lens/dist/clients/child-unref.js +54 -6
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +76 -24
- package/node_modules/pi-lens/dist/clients/console-guard-install.js +16 -4
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +249 -52
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +8 -1
- package/node_modules/pi-lens/dist/clients/debug-handles.js +5 -0
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +62 -13
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +43 -9
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +153 -37
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +298 -0
- package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +165 -11
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +325 -72
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +7 -4
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +5 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +234 -18
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +187 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +6 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +11 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +398 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +11 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +12 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +18 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +895 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +4 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +16 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +81 -41
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +16 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +23 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +331 -55
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +38 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +97 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +14 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +20 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +22 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +10 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +18 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +73 -12
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +488 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +84 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +260 -27
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +943 -93
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +86 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +72 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +106 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +9 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +18 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +4 -2
- package/node_modules/pi-lens/dist/clients/disposition-publish.js +10 -3
- package/node_modules/pi-lens/dist/clients/eval-timestamp.js +17 -0
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +28 -5
- package/node_modules/pi-lens/dist/clients/extension-log.js +317 -3
- package/node_modules/pi-lens/dist/clients/file-kinds.js +8 -2
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +294 -0
- package/node_modules/pi-lens/dist/clients/finding-identity.js +88 -0
- package/node_modules/pi-lens/dist/clients/fix-worklog.js +5 -1
- package/node_modules/pi-lens/dist/clients/format-events-publish.js +39 -8
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +500 -115
- package/node_modules/pi-lens/dist/clients/generation-guard.js +216 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +49 -21
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +181 -8
- package/node_modules/pi-lens/dist/clients/go-client.js +21 -39
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +219 -10
- package/node_modules/pi-lens/dist/clients/grammar-source.js +333 -10
- package/node_modules/pi-lens/dist/clients/host-ports.js +9 -1
- package/node_modules/pi-lens/dist/clients/installer/index.js +1119 -101
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +58 -0
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +715 -0
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +643 -97
- package/node_modules/pi-lens/dist/clients/instance-registry.js +87 -17
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +86 -15
- package/node_modules/pi-lens/dist/clients/knip-client.js +361 -24
- package/node_modules/pi-lens/dist/clients/language-policy.js +8 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +2 -0
- package/node_modules/pi-lens/dist/clients/latency-logger.js +487 -9
- package/node_modules/pi-lens/dist/clients/lazy-import.js +21 -0
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -0
- package/node_modules/pi-lens/dist/clients/lens-events.js +56 -25
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +16 -0
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +45 -2
- package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +30 -4
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +160 -20
- package/node_modules/pi-lens/dist/clients/lsp/client.js +1666 -148
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +111 -0
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +389 -0
- package/node_modules/pi-lens/dist/clients/lsp/index.js +2496 -171
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +215 -0
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +146 -14
- package/node_modules/pi-lens/dist/clients/lsp/language.js +48 -4
- package/node_modules/pi-lens/dist/clients/lsp/server.js +517 -69
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +22 -0
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +43 -0
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +172 -0
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +21 -5
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +61 -3
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +422 -28
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +30 -0
- package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +175 -0
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/mcp/analyze.js +4 -0
- package/node_modules/pi-lens/dist/clients/mcp/session.js +39 -18
- package/node_modules/pi-lens/dist/clients/model-provider.js +53 -0
- package/node_modules/pi-lens/dist/clients/module-report.js +8 -0
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +15 -1
- package/node_modules/pi-lens/dist/clients/package-manager.js +170 -14
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +27 -0
- package/node_modules/pi-lens/dist/clients/path-utils.js +160 -0
- package/node_modules/pi-lens/dist/clients/pipeline.js +178 -30
- package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +37 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +17 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +89 -22
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +85 -15
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +15 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +23 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +50 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -0
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +3 -0
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +299 -0
- package/node_modules/pi-lens/dist/clients/quiet-window-config.js +47 -0
- package/node_modules/pi-lens/dist/clients/quiet-window.js +11 -25
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +1 -1
- package/node_modules/pi-lens/dist/clients/read-guard.js +184 -10
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +49 -17
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +50 -11
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +76 -4
- package/node_modules/pi-lens/dist/clients/run-duration.js +55 -0
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +248 -13
- package/node_modules/pi-lens/dist/clients/runtime-context.js +112 -12
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +472 -61
- package/node_modules/pi-lens/dist/clients/runtime-session.js +359 -13
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +217 -22
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +269 -22
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +948 -87
- package/node_modules/pi-lens/dist/clients/rust-client.js +21 -37
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +220 -7
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +161 -0
- package/node_modules/pi-lens/dist/clients/search-read-registration.js +34 -6
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +224 -8
- package/node_modules/pi-lens/dist/clients/sg-runner.js +249 -37
- package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
- package/node_modules/pi-lens/dist/clients/smells-rollup.js +18 -11
- package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
- package/node_modules/pi-lens/dist/clients/startup-timing.js +26 -2
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +574 -32
- package/node_modules/pi-lens/dist/clients/tool-event.js +56 -5
- package/node_modules/pi-lens/dist/clients/tool-policy.js +127 -20
- package/node_modules/pi-lens/dist/clients/tool-set-policy.js +76 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +75 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +769 -64
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +11 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +90 -0
- package/node_modules/pi-lens/dist/clients/trivy-client.js +19 -1
- package/node_modules/pi-lens/dist/clients/warm-attach.js +17 -0
- package/node_modules/pi-lens/dist/clients/widget-state.js +336 -36
- package/node_modules/pi-lens/dist/clients/word-index.js +305 -33
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +214 -14
- package/node_modules/pi-lens/dist/index.js +64677 -49484
- package/node_modules/pi-lens/dist/mcp/server.js +8 -2
- package/node_modules/pi-lens/dist/tools/activate-tools.js +17 -5
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +9 -4
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +5 -2
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +469 -56
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +190 -46
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -7
- package/node_modules/pi-lens/dist/tools/symbol-search.js +1 -1
- package/node_modules/pi-lens/docs/agent-guide.md +44 -14
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +518 -501
- package/node_modules/pi-lens/docs/dispositions.md +21 -0
- package/node_modules/pi-lens/docs/features.md +33 -6
- package/node_modules/pi-lens/docs/globalconfig.md +14 -0
- package/node_modules/pi-lens/docs/language-coverage.md +71 -5
- package/node_modules/pi-lens/docs/mcp.md +2 -2
- package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
- package/node_modules/pi-lens/docs/settings.md +25 -1
- package/node_modules/pi-lens/docs/usage.md +24 -5
- package/node_modules/pi-lens/docs/word-index.md +35 -0
- package/node_modules/pi-lens/package.json +10 -6
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-js-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-object-param-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml +22 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +29 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-js-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-known-value-widening-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +216 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-js-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-runtime-typeof-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml +13 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-laundering-test.yml +11 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-parameters-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-returns-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml +10 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml +8 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +35 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/require-safety-comment-for-as-unknown-as-test.yml +177 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +1 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member-js.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-object-param.yml +60 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-chained-type-assertions.yml +66 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-compile-call.yml +63 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread-js.yml +21 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread.yml +29 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-dupe-class-members.yml +52 -8
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html-js.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-known-value-widening.yml +71 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-non-null-assertion.yml +316 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +7 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply-js.yml +29 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +30 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +41 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +42 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +22 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-runtime-typeof.yml +121 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +23 -7
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-shape-in-symbol-names.yml +68 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-laundering.yml +32 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-parameters.yml +67 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-returns.yml +106 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-any.yml +50 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-unknown.yml +56 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +32 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/require-safety-comment-for-as-unknown-as.yml +184 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/ts-void-zero.yml +5 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/self-scan-baseline.json +5 -0
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +132 -1
- package/node_modules/pi-lens/scripts/download-grammars.js +25 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +9 -0
- package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +12 -11
- package/node_modules/pi-lens/skills/pi-lens-lsp-navigation/SKILL.md +22 -22
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +87 -116
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/reference.md +170 -0
- package/node_modules/pi-lens/skills/pi-lens-write-tree-sitter-rule/SKILL.md +3 -1
- package/node_modules/pi-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +49 -0
- package/node_modules/pi-mcp-adapter/README.md +51 -6
- package/node_modules/pi-mcp-adapter/agent-dir.ts +12 -4
- package/node_modules/pi-mcp-adapter/cli.js +188 -5
- package/node_modules/pi-mcp-adapter/commands.ts +128 -22
- package/node_modules/pi-mcp-adapter/config.ts +28 -10
- package/node_modules/pi-mcp-adapter/direct-tools.ts +23 -19
- package/node_modules/pi-mcp-adapter/index.ts +219 -32
- package/node_modules/pi-mcp-adapter/init.ts +36 -4
- package/node_modules/pi-mcp-adapter/lifecycle.ts +315 -24
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +39 -6
- package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +387 -0
- package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +27 -3
- package/node_modules/pi-mcp-adapter/mcp-code.ts +4 -0
- package/node_modules/pi-mcp-adapter/mcp-panel.ts +42 -13
- package/node_modules/pi-mcp-adapter/mcp-setup-panel.ts +2 -1
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +46 -25
- package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
- package/node_modules/pi-mcp-adapter/package.json +4 -1
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +5 -4
- package/node_modules/pi-mcp-adapter/request-headers-command.ts +330 -0
- package/node_modules/pi-mcp-adapter/search-ranking.ts +92 -22
- package/node_modules/pi-mcp-adapter/server-manager.ts +145 -2
- package/node_modules/pi-mcp-adapter/session-recovery.ts +7 -0
- package/node_modules/pi-mcp-adapter/tool-approval.ts +15 -2
- package/node_modules/pi-mcp-adapter/tool-metadata.ts +38 -18
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +44 -4
- package/node_modules/pi-mcp-adapter/types.ts +95 -10
- package/node_modules/pi-mcp-adapter/ui-server.ts +18 -16
- package/node_modules/pi-mcp-adapter/utils.ts +70 -0
- package/node_modules/pi-web-access/CHANGELOG.md +37 -0
- package/node_modules/pi-web-access/README.md +38 -14
- package/node_modules/pi-web-access/anysearch.ts +4 -2
- package/node_modules/pi-web-access/auth-fetch.ts +148 -0
- package/node_modules/pi-web-access/brave.ts +16 -4
- package/node_modules/pi-web-access/chrome-cookies.ts +110 -23
- package/node_modules/pi-web-access/curator-page.ts +8 -3
- package/node_modules/pi-web-access/curator-server.ts +5 -1
- package/node_modules/pi-web-access/exa.ts +18 -7
- package/node_modules/pi-web-access/extract.ts +134 -37
- package/node_modules/pi-web-access/fetch-params.ts +17 -3
- package/node_modules/pi-web-access/firecrawl.ts +172 -12
- package/node_modules/pi-web-access/gemini-search.ts +33 -7
- package/node_modules/pi-web-access/index.ts +160 -104
- package/node_modules/pi-web-access/package.json +2 -2
- package/node_modules/pi-web-access/page-query.ts +4 -2
- package/node_modules/pi-web-access/parallel-mcp.ts +249 -0
- package/node_modules/pi-web-access/parallel.ts +2 -2
- package/node_modules/pi-web-access/query-rewrite.ts +51 -0
- package/node_modules/pi-web-access/serper.ts +211 -0
- package/node_modules/pi-web-access/summary-model-scope.ts +12 -4
- package/node_modules/pi-web-access/summary-review.ts +51 -23
- package/node_modules/pi-web-access/tavily.ts +16 -4
- package/node_modules/pi-web-access/utils.ts +87 -0
- package/node_modules/pi-web-access/valyu.ts +199 -0
- package/node_modules/pi-web-access/youtube-extract.ts +2 -2
- package/package.json +13 -13
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Process-lifetime history of successful LSP spawn plus initialize durations. */
|
|
2
|
+
const MAX_SERVER_HISTORIES = 64;
|
|
3
|
+
const successfulSpawnDurationMs = new Map();
|
|
4
|
+
export function recordSuccessfulLspSpawn(serverId, durationMs) {
|
|
5
|
+
if (!Number.isFinite(durationMs) || durationMs < 0)
|
|
6
|
+
return;
|
|
7
|
+
successfulSpawnDurationMs.delete(serverId);
|
|
8
|
+
successfulSpawnDurationMs.set(serverId, durationMs);
|
|
9
|
+
while (successfulSpawnDurationMs.size > MAX_SERVER_HISTORIES) {
|
|
10
|
+
const oldest = successfulSpawnDurationMs.keys().next().value;
|
|
11
|
+
if (oldest === undefined)
|
|
12
|
+
break;
|
|
13
|
+
successfulSpawnDurationMs.delete(oldest);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function getSuccessfulLspSpawnDurationMs(serverId) {
|
|
17
|
+
return successfulSpawnDurationMs.get(serverId);
|
|
18
|
+
}
|
|
19
|
+
/** Test-only: isolate process-lifetime history between cases. */
|
|
20
|
+
export function _clearSuccessfulLspSpawnHistoryForTests() {
|
|
21
|
+
successfulSpawnDurationMs.clear();
|
|
22
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP `textDocument/didChange` sync-kind negotiation (#1669).
|
|
3
|
+
*
|
|
4
|
+
* A server advertises how it wants document changes described via
|
|
5
|
+
* `ServerCapabilities.textDocumentSync`, either as a bare
|
|
6
|
+
* `TextDocumentSyncKind` number (the legacy pre-3.0 shape) or as a
|
|
7
|
+
* `TextDocumentSyncOptions` object whose `change` field carries the kind.
|
|
8
|
+
* pi-lens always sent a single whole-document `{ text }` change event — valid
|
|
9
|
+
* for `Full` (1) and harmless for `None` (0, since the server ignores content
|
|
10
|
+
* changes entirely), but out of spec for `Incremental` (2): an
|
|
11
|
+
* Incremental-only server expects every change event to carry a `range`.
|
|
12
|
+
*
|
|
13
|
+
* This module is the pure negotiation core, mirroring `position-encoding.ts`'s
|
|
14
|
+
* shape: read the kind from the server's `initialize` reply, defaulting to
|
|
15
|
+
* `Full` when the server doesn't advertise one — the same shape pi-lens has
|
|
16
|
+
* always sent, so an unrecognized/absent value never regresses `Full`/`None`
|
|
17
|
+
* behavior.
|
|
18
|
+
*/
|
|
19
|
+
export const TEXT_DOCUMENT_SYNC_KIND_NONE = 0;
|
|
20
|
+
export const TEXT_DOCUMENT_SYNC_KIND_FULL = 1;
|
|
21
|
+
export const TEXT_DOCUMENT_SYNC_KIND_INCREMENTAL = 2;
|
|
22
|
+
function isSyncKind(value) {
|
|
23
|
+
return value === 0 || value === 1 || value === 2;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The `change` sync kind the server negotiated, read from its `initialize`
|
|
27
|
+
* reply. Defaults to `Full` (pi-lens's historical always-whole-document
|
|
28
|
+
* behavior) when the server omits `textDocumentSync` entirely, or advertises
|
|
29
|
+
* a shape/value this function doesn't recognize.
|
|
30
|
+
*/
|
|
31
|
+
export function negotiateSyncKind(serverCapabilities) {
|
|
32
|
+
const sync = serverCapabilities?.textDocumentSync;
|
|
33
|
+
// Legacy shape: the whole field IS the kind.
|
|
34
|
+
if (isSyncKind(sync))
|
|
35
|
+
return sync;
|
|
36
|
+
// 3.0+ shape: `TextDocumentSyncOptions.change`.
|
|
37
|
+
if (sync && typeof sync === "object") {
|
|
38
|
+
const change = sync.change;
|
|
39
|
+
if (isSyncKind(change))
|
|
40
|
+
return change;
|
|
41
|
+
}
|
|
42
|
+
return TEXT_DOCUMENT_SYNC_KIND_FULL;
|
|
43
|
+
}
|
|
@@ -32,10 +32,182 @@
|
|
|
32
32
|
* `undefined`). The caller must handle `undefined` as "sync path unavailable,
|
|
33
33
|
* fall back to existing unconfirmed/timed-out behavior".
|
|
34
34
|
*/
|
|
35
|
+
import { logLatency } from "../latency-logger.js";
|
|
36
|
+
import { normalizeMapKey } from "../path-utils.js";
|
|
35
37
|
// ---------------------------------------------------------------------------
|
|
36
38
|
// Constants
|
|
37
39
|
// ---------------------------------------------------------------------------
|
|
38
40
|
export const TSSERVER_REQUEST_COMMAND = "typescript.tsserverRequest";
|
|
41
|
+
/**
|
|
42
|
+
* tsserver's synthetic inferred-project name, as its own source builds it:
|
|
43
|
+
* `"/dev/null/inferredProject" + counter + "*"`. `/dev/null` is a deliberate
|
|
44
|
+
* sentinel prefix — no real config file can live there — and matching the WHOLE
|
|
45
|
+
* string against it is the only safe test.
|
|
46
|
+
*
|
|
47
|
+
* #1645 review F4: an earlier version also matched an UNANCHORED
|
|
48
|
+
* `/inferred[-_ ]?project/i` anywhere in the string. That inverted the verdict
|
|
49
|
+
* for a real project in a directory a human happened to name that way —
|
|
50
|
+
* `/repo/inferred-project/tsconfig.json` classified as INFERRED, which demoted
|
|
51
|
+
* its genuine blocking errors. A classifier that gates authority must never key
|
|
52
|
+
* off user-controlled directory names.
|
|
53
|
+
*
|
|
54
|
+
* The optional drive-letter/backslash arm covers a host that normalizes the
|
|
55
|
+
* sentinel through win32 path handling before it reaches us; the `/dev/null`
|
|
56
|
+
* prefix is still required.
|
|
57
|
+
*/
|
|
58
|
+
const INFERRED_PROJECT_SENTINEL = /^(?:[A-Za-z]:)?[/\\]dev[/\\]null[/\\]inferredProject\d*\*?$/i;
|
|
59
|
+
/**
|
|
60
|
+
* Classify one tsserver `projectInfo` response body.
|
|
61
|
+
*
|
|
62
|
+
* `configFileName` is tsserver's own answer to "which project owns this file".
|
|
63
|
+
* A real project answers with a `tsconfig.json`/`jsconfig.json` path; a file
|
|
64
|
+
* that matches no project's `include`/`files` lands in tsserver's synthetic
|
|
65
|
+
* inferred project, whose `configFileName` is a `/dev/null/inferredProject1*`
|
|
66
|
+
* placeholder. The two are the same field, so the placeholder shape is the only
|
|
67
|
+
* thing that separates "checked against the project's real compiler options"
|
|
68
|
+
* from "checked against defaults nobody configured" (#1640).
|
|
69
|
+
*
|
|
70
|
+
* Exported so the diagnostic-demotion seam (`inferred-project.ts`) and the
|
|
71
|
+
* #1412 telemetry probe share ONE classifier — a second hand-rolled
|
|
72
|
+
* configFileName test would be a parallel source of truth for the same verdict.
|
|
73
|
+
*/
|
|
74
|
+
export function classifyProjectInfo(body) {
|
|
75
|
+
if (!body || typeof body !== "object") {
|
|
76
|
+
return { projectKind: "unassociated", association: "unassociated" };
|
|
77
|
+
}
|
|
78
|
+
const info = body;
|
|
79
|
+
const configFile = typeof info.configFileName === "string" && info.configFileName.length > 0
|
|
80
|
+
? info.configFileName
|
|
81
|
+
: undefined;
|
|
82
|
+
const inferred = configFile
|
|
83
|
+
? INFERRED_PROJECT_SENTINEL.test(configFile)
|
|
84
|
+
: false;
|
|
85
|
+
const projectKind = configFile
|
|
86
|
+
? inferred
|
|
87
|
+
? "inferred"
|
|
88
|
+
: /(?:^|[/\\])(?:tsconfig|jsconfig)\.json$/i.test(configFile)
|
|
89
|
+
? "configured"
|
|
90
|
+
: "unassociated"
|
|
91
|
+
: "unassociated";
|
|
92
|
+
return {
|
|
93
|
+
projectKind,
|
|
94
|
+
...(configFile ? { configFile } : {}),
|
|
95
|
+
association: info.languageServiceDisabled === true
|
|
96
|
+
? "language-service-disabled"
|
|
97
|
+
: projectKind === "unassociated"
|
|
98
|
+
? "unassociated"
|
|
99
|
+
: "associated",
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* #1412: after classic TypeScript's first successful didOpen, sample the
|
|
104
|
+
* tsserver project association without delaying diagnostics. The supplied
|
|
105
|
+
* executeCommand channel owns the existing bounded anti-deadlock backstop.
|
|
106
|
+
*/
|
|
107
|
+
export async function probeTsserverProjectIdentity(options) {
|
|
108
|
+
const normalizedFile = options.normalizedFile ?? normalizeMapKey(options.file);
|
|
109
|
+
const startedAt = Date.now();
|
|
110
|
+
// Logging starts only once a probe is actually eligible and attempted:
|
|
111
|
+
// ineligible servers (wrong serverId/launchVariant, no command channel) and
|
|
112
|
+
// already-probed dedupe are both routine, high-volume, and per-server — a
|
|
113
|
+
// bare return keeps them out of the telemetry stream entirely instead of
|
|
114
|
+
// writing an `lsp_typescript_project_identity` row per didOpen on every
|
|
115
|
+
// server (python, go, opengrep, ...).
|
|
116
|
+
const logOutcome = (outcome, metadata = {}) => logLatency({
|
|
117
|
+
type: "phase", phase: "lsp_typescript_project_identity", filePath: normalizedFile,
|
|
118
|
+
durationMs: Date.now() - startedAt,
|
|
119
|
+
metadata: { serverId: options.serverId, launchVariant: options.launchVariant, clientRoot: options.clientRoot, outcome, ...metadata },
|
|
120
|
+
});
|
|
121
|
+
if (options.serverId !== "typescript" ||
|
|
122
|
+
options.launchVariant !== "classic" ||
|
|
123
|
+
typeof options.commandChannel.executeCommand !== "function") {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (options.probedFiles.has(normalizedFile))
|
|
127
|
+
return;
|
|
128
|
+
// Claim before yielding so concurrent opens cannot issue duplicate probes.
|
|
129
|
+
options.probedFiles.add(normalizedFile);
|
|
130
|
+
try {
|
|
131
|
+
const outcome = await options.commandChannel.executeCommand(TSSERVER_REQUEST_COMMAND, ["projectInfo", { file: options.file, needFileNameList: false }]);
|
|
132
|
+
if (!outcome.executed) {
|
|
133
|
+
logOutcome("not-executed");
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const response = outcome.result;
|
|
137
|
+
if (!response) {
|
|
138
|
+
logOutcome("no-response");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (response.success !== true) {
|
|
142
|
+
logOutcome("unsuccessful");
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const identity = classifyProjectInfo(response.body);
|
|
146
|
+
logLatency({
|
|
147
|
+
type: "phase",
|
|
148
|
+
phase: "lsp_typescript_project_identity",
|
|
149
|
+
filePath: normalizedFile,
|
|
150
|
+
durationMs: Date.now() - startedAt,
|
|
151
|
+
metadata: {
|
|
152
|
+
outcome: "ok",
|
|
153
|
+
serverId: options.serverId,
|
|
154
|
+
launchVariant: options.launchVariant,
|
|
155
|
+
clientRoot: options.clientRoot,
|
|
156
|
+
projectKind: identity.projectKind,
|
|
157
|
+
configFile: identity.configFile,
|
|
158
|
+
association: identity.association,
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
logOutcome("threw");
|
|
164
|
+
// Best-effort telemetry: command errors/timeouts never reach diagnostics.
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* #1640: ask tsserver which project owns `file`, on demand, through the same
|
|
169
|
+
* `typescript.tsserverRequest` escape hatch the sync-diagnostics helpers use.
|
|
170
|
+
*
|
|
171
|
+
* Unlike {@link probeTsserverProjectIdentity} — fire-and-forget telemetry
|
|
172
|
+
* sampled once per didOpen — this is a request/response call a caller awaits
|
|
173
|
+
* because it needs the answer to decide how to RENDER a diagnostic.
|
|
174
|
+
*
|
|
175
|
+
* Routed through `executeReadOnlyCommandOnLiveClient` ONLY, never
|
|
176
|
+
* `executeCommand` (#1645 review F1/F2). The mutation channel would open the
|
|
177
|
+
* `workspace/applyEdit` acceptance window, clobber a concurrent command's
|
|
178
|
+
* `activeMutationContext`, carry the 30s mutation backstop instead of the short
|
|
179
|
+
* probe one, and spawn a language-server fleet to answer. All four are wrong for
|
|
180
|
+
* a passive render-path question. A service without the read-only channel is
|
|
181
|
+
* UNKNOWN, not a reason to fall back.
|
|
182
|
+
*
|
|
183
|
+
* Returns `undefined` for every "we do not know" path: no read-only channel, no
|
|
184
|
+
* live server for the file, the command is not advertised (non-classic server,
|
|
185
|
+
* older typescript-language-server), the command was not executed, the response
|
|
186
|
+
* envelope is not `{success:true}`, or the call threw/timed out. `undefined`
|
|
187
|
+
* must never be treated as "inferred" — an unanswered probe is not a verdict
|
|
188
|
+
* (AGENTS.md shape 10: an empty result must distinguish clean from unavailable).
|
|
189
|
+
*/
|
|
190
|
+
export async function fetchTsserverProjectIdentity(svc, file) {
|
|
191
|
+
try {
|
|
192
|
+
if (typeof svc.executeReadOnlyCommandOnLiveClient !== "function") {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
// No `getAdvertisedCommands` pre-flight: that helper routes through
|
|
196
|
+
// `getClientForFile`, which SPAWNS. The read-only channel already enforces
|
|
197
|
+
// allowlist-by-advertisement server-side and answers `executed:false` for
|
|
198
|
+
// a server that never advertised the command.
|
|
199
|
+
const outcome = await svc.executeReadOnlyCommandOnLiveClient(file, TSSERVER_REQUEST_COMMAND, ["projectInfo", { file, needFileNameList: false }]);
|
|
200
|
+
if (!outcome.executed)
|
|
201
|
+
return undefined;
|
|
202
|
+
const response = outcome.result;
|
|
203
|
+
if (!response || response.success !== true)
|
|
204
|
+
return undefined;
|
|
205
|
+
return classifyProjectInfo(response.body);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
39
211
|
// ---------------------------------------------------------------------------
|
|
40
212
|
// Helpers
|
|
41
213
|
// ---------------------------------------------------------------------------
|
|
@@ -26,7 +26,7 @@ export function classifyServerWaitTier(serverId, snapshot) {
|
|
|
26
26
|
return "pull-capable";
|
|
27
27
|
if (mode !== "push-only")
|
|
28
28
|
return "waits";
|
|
29
|
-
const strategy = getStrategy(serverId);
|
|
29
|
+
const strategy = getStrategy(serverId, snapshot.launchVariant);
|
|
30
30
|
if (strategy.silentOnClean !== true)
|
|
31
31
|
return "waits"; // 2*/unknown push-only
|
|
32
32
|
// #524/#529/#541/#558: `silentOnClean` on a server-id-keyed strategy is
|
|
@@ -44,6 +44,24 @@ export function classifyServerWaitTier(serverId, snapshot) {
|
|
|
44
44
|
return "waits";
|
|
45
45
|
return "tier3-silent";
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve `filePath`'s PRIMARY (non-auxiliary) server id and its live
|
|
49
|
+
* capability snapshot, or `undefined` when the file has no primary server
|
|
50
|
+
* configured. The single place that decides what "this file's server" means
|
|
51
|
+
* for wait-policy purposes — shared by {@link classifyCascadeWaitTier} and the
|
|
52
|
+
* cascade-lane wrapper in `clients/lsp/cascade-tier.ts`, which needs the same
|
|
53
|
+
* id/snapshot pair to apply its one cascade-only override.
|
|
54
|
+
*/
|
|
55
|
+
export function resolvePrimaryServerForWaitPolicy(filePath, snapshots) {
|
|
56
|
+
const servers = getServersForFileWithConfig(filePath).filter((s) => s.role !== "auxiliary");
|
|
57
|
+
const primary = servers[0];
|
|
58
|
+
if (!primary)
|
|
59
|
+
return undefined;
|
|
60
|
+
return {
|
|
61
|
+
serverId: primary.id,
|
|
62
|
+
snapshot: snapshots.find((s) => s.serverId === primary.id),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
47
65
|
/**
|
|
48
66
|
* Classify whether `filePath`'s PRIMARY language server is a cascade-lane
|
|
49
67
|
* Tier-3 (push-only, silent-on-clean) server. Ambiguous or missing capability
|
|
@@ -54,10 +72,8 @@ export function classifyServerWaitTier(serverId, snapshot) {
|
|
|
54
72
|
*/
|
|
55
73
|
export function classifyCascadeWaitTier(lspService, filePath, snapshots) {
|
|
56
74
|
void lspService; // kept in the signature for call-site clarity/typing only
|
|
57
|
-
const
|
|
58
|
-
const primary = servers[0];
|
|
75
|
+
const primary = resolvePrimaryServerForWaitPolicy(filePath, snapshots);
|
|
59
76
|
if (!primary)
|
|
60
77
|
return "waits";
|
|
61
|
-
|
|
62
|
-
return classifyServerWaitTier(primary.id, snapshot);
|
|
78
|
+
return classifyServerWaitTier(primary.serverId, primary.snapshot);
|
|
63
79
|
}
|
|
@@ -138,7 +138,8 @@ export const SERVER_DIAGNOSTIC_STRATEGIES = {
|
|
|
138
138
|
// (#242), so on a 2500ms-capped edit opengrep waits min(2500, 3500)=2500
|
|
139
139
|
// and on uncapped paths it gets its full 3500. 3500 covers warm and most
|
|
140
140
|
// cold; a cold scan that overruns isn't lost — late diagnostics are cached
|
|
141
|
-
// and surface on the next
|
|
141
|
+
// and surface on the next unchanged-content read through the content-bound
|
|
142
|
+
// auxiliary carry-over path.
|
|
142
143
|
opengrep: {
|
|
143
144
|
seedFirstPush: false,
|
|
144
145
|
pullRetryBudgetMs: 0,
|
|
@@ -174,7 +175,8 @@ export const SERVER_DIAGNOSTIC_STRATEGIES = {
|
|
|
174
175
|
// reopen-on-resync. A native single-workflow audit is sub-second offline;
|
|
175
176
|
// online mode may add a GitHub-API round-trip, so 2000ms gives headroom
|
|
176
177
|
// (bounded by the per-edit caller cap as a ceiling, #242), and any late online
|
|
177
|
-
// finding
|
|
178
|
+
// finding can surface on the next unchanged-content read through the
|
|
179
|
+
// content-bound auxiliary carry-over path.
|
|
178
180
|
zizmor: {
|
|
179
181
|
seedFirstPush: true,
|
|
180
182
|
pullRetryBudgetMs: 0,
|
|
@@ -230,6 +232,59 @@ export const SERVER_DIAGNOSTIC_STRATEGIES = {
|
|
|
230
232
|
// warm-up attempt and its retry, with zero diagnostics either time).
|
|
231
233
|
silentOnClean: true,
|
|
232
234
|
},
|
|
235
|
+
// cue lsp serve (#1522, #1519, #1520). Measured directly against the real
|
|
236
|
+
// v0.17.1 binary (`getWorkspaceDiagnosticsSupport` reports
|
|
237
|
+
// `mode: "push-only"`; no pull support advertised).
|
|
238
|
+
//
|
|
239
|
+
// It reports load/parse (syntax) errors as you type, but leaves
|
|
240
|
+
// conflicting-value/constraint-failure (evaluation) errors to `cue vet`
|
|
241
|
+
// — the #1522 cue-vet auxiliary runner covers that gap. So the syntax
|
|
242
|
+
// diagnostics this strategy governs are a REAL but PARTIAL signal, not
|
|
243
|
+
// full CUE validation.
|
|
244
|
+
//
|
|
245
|
+
// silentOnClean: true — the load-bearing finding. A cold `didOpen` on an
|
|
246
|
+
// already-CLEAN file publishes NOTHING inside the wait budget (measured:
|
|
247
|
+
// `touchFile` returns `inconclusive: true, inconclusiveReason:
|
|
248
|
+
// "diagnostics-wait"` after the full budget, never an affirmative empty
|
|
249
|
+
// array). This reproduces the #1520 review's original "reports
|
|
250
|
+
// conclusively clean while still waiting" concern for the clean-cold-open
|
|
251
|
+
// case specifically. It is NOT silent on every transition, though: once a
|
|
252
|
+
// document is open and a `didChange` lands, the server DOES publish —
|
|
253
|
+
// both the error (edit clean→broken: confirmed, ~930ms warm) and an
|
|
254
|
+
// explicit empty array clearing it (edit broken→clean: confirmed,
|
|
255
|
+
// ~320ms warm, `contentHash`-bound). That edit-triggered empty publish is
|
|
256
|
+
// exactly what the shared push-only clean-confirm gate needs
|
|
257
|
+
// `silentOnClean` for — it only ever governs the "no publish, notify
|
|
258
|
+
// succeeded" case, never a case that already got a real publish.
|
|
259
|
+
//
|
|
260
|
+
// seedFirstPush: true — the one cold-open case that DOES publish (a
|
|
261
|
+
// file that is already broken) sends the complete single diagnostic on
|
|
262
|
+
// its first push; there is no observed partial-then-complete sequence to
|
|
263
|
+
// wait out.
|
|
264
|
+
//
|
|
265
|
+
// aggregateWaitMs: 2000 covers the measured warm edit-to-publish latency
|
|
266
|
+
// (~930ms, syntax reparse) with margin; a cold spawn's first push (~2.1s
|
|
267
|
+
// end-to-end including process start) is bounded separately by
|
|
268
|
+
// maxClientWaitMs, not this per-diagnostics budget.
|
|
269
|
+
cue: {
|
|
270
|
+
seedFirstPush: true,
|
|
271
|
+
pullRetryBudgetMs: 0,
|
|
272
|
+
debounceMs: 150,
|
|
273
|
+
aggregateWaitMs: 2000,
|
|
274
|
+
expectSemanticSecondPush: false,
|
|
275
|
+
reopenOnResync: false,
|
|
276
|
+
silentOnClean: true,
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
/** Native TS7 can publish multiple versionless partial-program snapshots for a
|
|
280
|
+
* single open. Its first push is therefore provisional; a quiet window, rather
|
|
281
|
+
* than a protocol-unstable publication count, establishes the settled push. */
|
|
282
|
+
const NATIVE_TS7_DIAGNOSTIC_STRATEGY = {
|
|
283
|
+
...SERVER_DIAGNOSTIC_STRATEGIES.typescript,
|
|
284
|
+
seedFirstPush: false,
|
|
285
|
+
// Native TS7 demonstrably publishes on clean, so the classic-only marker
|
|
286
|
+
// must not leak through the shared server id.
|
|
287
|
+
silentOnClean: false,
|
|
233
288
|
};
|
|
234
289
|
/** Fallback for unknown servers. Conservative defaults. */
|
|
235
290
|
export const DEFAULT_STRATEGY = {
|
|
@@ -239,6 +294,9 @@ export const DEFAULT_STRATEGY = {
|
|
|
239
294
|
aggregateWaitMs: 1500,
|
|
240
295
|
expectSemanticSecondPush: false,
|
|
241
296
|
};
|
|
242
|
-
export function getStrategy(serverId) {
|
|
297
|
+
export function getStrategy(serverId, launchVariant) {
|
|
298
|
+
if (serverId === "typescript" && launchVariant === "native-ts7") {
|
|
299
|
+
return NATIVE_TS7_DIAGNOSTIC_STRATEGY;
|
|
300
|
+
}
|
|
243
301
|
return SERVER_DIAGNOSTIC_STRATEGIES[serverId] ?? DEFAULT_STRATEGY;
|
|
244
302
|
}
|