@herbertgao/pi-extensions 2026.8.11 → 2026.8.13
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 +23 -10
- package/{node_modules/@herbertgao/pi-mermaid-open/LICENSE → THIRD_PARTY_NOTICES.md} +19 -1
- package/node_modules/@czottmann/pi-automode/CHANGELOG.md +15 -0
- package/node_modules/@czottmann/pi-automode/README.md +5 -3
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-001-permission-precedence-and-trust-boundaries.md +2 -0
- package/node_modules/@czottmann/pi-automode/docs/adr/ADR-002-global-config-in-extension-data-directory.md +60 -0
- package/node_modules/@czottmann/pi-automode/docs/adr/INDEX.md +1 -0
- package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +4 -4
- package/node_modules/@czottmann/pi-automode/docs/configuration.md +20 -4
- package/node_modules/@czottmann/pi-automode/docs/observability-logging.md +1 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/bash.ts +692 -0
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +181 -3
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +4 -1
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +143 -36
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +103 -148
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +32 -6
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +344 -22
- package/node_modules/@czottmann/pi-automode/extensions/auto-mode.ts +1 -0
- package/node_modules/@czottmann/pi-automode/package.json +4 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +4 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +21 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +19 -19
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +4 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +10 -2
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +10 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +21 -15
- package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +11 -8
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +184 -106
- package/node_modules/@herbertgao/pi-subagents/src/cross-extension-rpc.ts +31 -11
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +9 -1
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +156 -31
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +17 -0
- package/node_modules/@herbertgao/pi-subagents/src/model-resolver.ts +14 -0
- package/node_modules/@herbertgao/pi-subagents/src/schedule.ts +8 -0
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +32 -1
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +17 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +23 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +259 -24
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
- package/node_modules/@luxusai/pi-hindsight/CHANGELOG.md +376 -0
- package/node_modules/@luxusai/pi-hindsight/README.md +92 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/001-memory-lifecycle-and-scope.md +56 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/002-explicit-routing-strategy-seam.md +169 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/003-tui-memory-mode-vocabulary.md +107 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/004-lifeos-dual-bank-design.md +89 -0
- package/node_modules/@luxusai/pi-hindsight/docs/adr/005-domain-banks-and-agent-first-surface.md +189 -0
- package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark.webp +0 -0
- package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark@2x.webp +0 -0
- package/node_modules/@luxusai/pi-hindsight/docs/coding-memory-evaluation.md +54 -0
- package/node_modules/@luxusai/pi-hindsight/docs/compatibility.md +75 -0
- package/node_modules/@luxusai/pi-hindsight/docs/hindsight-core-functions.md +300 -0
- package/node_modules/@luxusai/pi-hindsight/docs/mission-and-mental-model-quality.md +158 -0
- package/node_modules/@luxusai/pi-hindsight/docs/next-opt-out-design.md +164 -0
- package/node_modules/@luxusai/pi-hindsight/docs/risky-memory-modes.md +139 -0
- package/node_modules/@luxusai/pi-hindsight/docs/starter-mental-model-suggestions.md +74 -0
- package/node_modules/@luxusai/pi-hindsight/docs/surface-reference.md +261 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-operations.ts +151 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-selection.ts +18 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-settings-presenter.ts +46 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-templates.ts +383 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/banking.ts +240 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/knowledge-page-seed.ts +176 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/banks/retain-strategies.ts +178 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/client-retry.ts +41 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/client.ts +386 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/fetch-compat.ts +39 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/client/timeout.ts +34 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-defaults.ts +140 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-model.ts +61 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-registry.ts +925 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-field-paths.ts +247 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-normalize.ts +547 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config-writer.ts +480 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/config.ts +182 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/config/setup-gate.ts +86 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-execute.ts +1010 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-parse.ts +175 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-plan.ts +425 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-presentation.ts +210 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-sessions.ts +817 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/index.ts +25 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/git-seed.ts +319 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-recall.ts +196 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-retain.ts +189 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-runtime.ts +65 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle.ts +260 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/mental-models.ts +244 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/observation-scopes.ts +59 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-cleanup.ts +82 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-visibility.ts +45 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall.ts +331 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-cursor.ts +354 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-job-builder.ts +66 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-receipts.ts +132 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain.ts +228 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-bank-template-operations.ts +74 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-config-operations.ts +16 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-control-operations.ts +648 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-diagnostics-operations.ts +105 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-identity.ts +68 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-service.ts +71 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-types.ts +13 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-recall-operations.ts +162 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-retain-operations.ts +131 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-scope.ts +104 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-session-operations.ts +37 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/operation-catalog.ts +893 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/reflect-presenter.ts +35 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/scope-migrate.ts +177 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/operations/tools.ts +7 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/flush-presenter.ts +21 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/jsonl-queue-store.ts +112 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-delivery.ts +111 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-lock.ts +214 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-operations.ts +70 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue.ts +392 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/bank-template-presentation.ts +45 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/commands.ts +9 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/guided-setup.ts +860 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/prefill-input.ts +105 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-flow.ts +189 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-server-probe.ts +299 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-actions.ts +201 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-facts.ts +47 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-render.ts +239 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-types.ts +50 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui.ts +259 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/tui/tool-presenters.ts +77 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/types.ts +534 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/diagnostics.ts +319 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/messages.ts +325 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/sanitize.ts +42 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-memory-meta.ts +244 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-operations.ts +56 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/session.ts +50 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-fields.ts +167 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-health.ts +207 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/utils/status.ts +120 -0
- package/node_modules/@luxusai/pi-hindsight/extensions/version.ts +8 -0
- package/node_modules/@luxusai/pi-hindsight/package.json +118 -0
- package/node_modules/@luxusai/pi-hindsight/skills/hindsight-memory-doctor/SKILL.md +75 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts +143 -46
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +3 -3
- package/node_modules/@narumitw/pi-btw/package.json +6 -6
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +136 -22
- package/node_modules/{@herbertgao → @tifan}/pi-copy-response/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-copy-response/package.json +5 -15
- package/node_modules/{@herbertgao → @tifan}/pi-handoff/README.md +4 -6
- package/node_modules/@tifan/pi-handoff/package.json +43 -0
- package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/index.ts +1 -1
- package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/package.json +5 -15
- package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/README.md +5 -7
- package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/package.json +5 -19
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/README.md +4 -6
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/package.json +6 -16
- package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/src/index.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-recap/README.md +4 -6
- package/node_modules/@tifan/pi-recap/package.json +42 -0
- package/node_modules/{@herbertgao → @tifan}/pi-recap/src/models.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-rename/README.md +13 -8
- package/node_modules/@tifan/pi-rename/package.json +47 -0
- package/node_modules/@tifan/pi-rename/src/herdr-label.ts +4 -0
- package/node_modules/{@herbertgao → @tifan}/pi-rename/src/index.ts +4 -16
- package/node_modules/{@herbertgao → @tifan}/pi-rename/src/models.ts +1 -6
- package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/README.md +2 -4
- package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/package.json +5 -15
- package/node_modules/pi-lens/CHANGELOG.md +96 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +2 -1
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +14 -5
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +48 -18
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +16 -4
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +3 -1
- package/node_modules/pi-lens/dist/clients/biome-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +21 -8
- package/node_modules/pi-lens/dist/clients/bounded-cache.js +24 -8
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +4 -3
- package/node_modules/pi-lens/dist/clients/cache-manager.js +6 -7
- package/node_modules/pi-lens/dist/clients/cache-observability.js +461 -66
- package/node_modules/pi-lens/dist/clients/call-graph.js +238 -63
- package/node_modules/pi-lens/dist/clients/codebase-model.js +13 -5
- package/node_modules/pi-lens/dist/clients/complexity-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +19 -8
- package/node_modules/pi-lens/dist/clients/dead-code-logger.js +1 -2
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +3 -1
- package/node_modules/pi-lens/dist/clients/debug-heap.js +8 -1
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +1 -1
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +11 -7
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +39 -2
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +2 -3
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +13 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +9 -4
- package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +6 -2
- package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +31 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +5 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +10 -14
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +5 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +25 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +3 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +4 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +25 -10
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +28 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +212 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +8 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +10 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +23 -14
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +7 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +5 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +7 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +13 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +17 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +7 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +24 -1
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +35 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +1 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +6 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +1 -1
- package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +2 -1
- package/node_modules/pi-lens/dist/clients/dispatch/types.js +6 -1
- package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +6 -2
- package/node_modules/pi-lens/dist/clients/extension-log.js +5 -3
- package/node_modules/pi-lens/dist/clients/feature-hints.js +8 -1
- package/node_modules/pi-lens/dist/clients/file-kinds.js +34 -129
- package/node_modules/pi-lens/dist/clients/file-utils.js +17 -1
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +57 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +144 -27
- package/node_modules/pi-lens/dist/clients/freshness.js +38 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +43 -13
- package/node_modules/pi-lens/dist/clients/go-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/grammar-source.js +1 -1
- package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +30 -4
- package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +1 -3
- package/node_modules/pi-lens/dist/clients/install-diagnostics.js +4 -2
- package/node_modules/pi-lens/dist/clients/installer/index.js +86 -77
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +5 -2
- package/node_modules/pi-lens/dist/clients/instance-registry.js +4 -2
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +6 -1
- package/node_modules/pi-lens/dist/clients/knip-client.js +29 -15
- package/node_modules/pi-lens/dist/clients/language-profile.js +4 -1
- package/node_modules/pi-lens/dist/clients/latency-logger.js +13 -2
- package/node_modules/pi-lens/dist/clients/lens-config.js +1 -1
- package/node_modules/pi-lens/dist/clients/lens-map.js +8 -3
- package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +1 -1
- package/node_modules/pi-lens/dist/clients/lsp/config.js +4 -6
- package/node_modules/pi-lens/dist/clients/lsp/edits.js +119 -32
- package/node_modules/pi-lens/dist/clients/lsp/index.js +94 -35
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +2 -1
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +4 -1
- package/node_modules/pi-lens/dist/clients/lsp/launch.js +11 -3
- package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +152 -0
- package/node_modules/pi-lens/dist/clients/lsp/server.js +19 -7
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +10 -2
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +9 -4
- package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -3
- package/node_modules/pi-lens/dist/clients/lsp-mutation.js +10 -20
- package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +1 -1
- package/node_modules/pi-lens/dist/clients/memory-sampler.js +73 -7
- package/node_modules/pi-lens/dist/clients/metrics-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +8 -3
- package/node_modules/pi-lens/dist/clients/module-report-lsp.js +7 -1
- package/node_modules/pi-lens/dist/clients/module-report.js +14 -17
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +3 -5
- package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +220 -0
- package/node_modules/pi-lens/dist/clients/package-manager.js +6 -1
- package/node_modules/pi-lens/dist/clients/pipeline.js +57 -9
- package/node_modules/pi-lens/dist/clients/project-conventions.js +2 -8
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +10 -7
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +2 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +13 -9
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +3 -1
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -2
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +12 -5
- package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +48 -0
- package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +15 -1
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +472 -66
- package/node_modules/pi-lens/dist/clients/read-expansion.js +12 -2
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +5 -4
- package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +5 -2
- package/node_modules/pi-lens/dist/clients/read-guard.js +1 -1
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +1 -1
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +6 -5
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +42 -17
- package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +8 -2
- package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +10 -1
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +2 -1
- package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +4 -2
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +2 -2
- package/node_modules/pi-lens/dist/clients/ruff-client.js +6 -5
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +63 -31
- package/node_modules/pi-lens/dist/clients/runtime-context.js +12 -4
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +83 -4
- package/node_modules/pi-lens/dist/clients/runtime-session.js +14 -0
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +59 -3
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +148 -34
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +147 -6
- package/node_modules/pi-lens/dist/clients/rust-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +150 -11
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +1 -3
- package/node_modules/pi-lens/dist/clients/session-summary.js +3 -1
- package/node_modules/pi-lens/dist/clients/sg-runner.js +1 -3
- package/node_modules/pi-lens/dist/clients/source-filter.js +10 -6
- package/node_modules/pi-lens/dist/clients/source-walker.js +1 -1
- package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +96 -0
- package/node_modules/pi-lens/dist/clients/startup-scan.js +4 -1
- package/node_modules/pi-lens/dist/clients/tool-definition.js +7 -0
- package/node_modules/pi-lens/dist/clients/tool-policy.js +26 -11
- package/node_modules/pi-lens/dist/clients/tool-render.js +2 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +10 -4
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +2 -2
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +12 -5
- package/node_modules/pi-lens/dist/clients/warm-attach.js +12 -5
- package/node_modules/pi-lens/dist/clients/widget-state.js +27 -11
- package/node_modules/pi-lens/dist/clients/word-index.js +3 -1
- package/node_modules/pi-lens/dist/clients/workspace-topology.js +8 -2
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +9 -1
- package/node_modules/pi-lens/dist/i18n.js +13 -5
- package/node_modules/pi-lens/dist/index.js +10797 -8627
- package/node_modules/pi-lens/dist/mcp/server.js +3 -1
- package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +68 -12
- package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +21 -7
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +164 -35
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +24 -7
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +3 -1
- package/node_modules/pi-lens/dist/tools/module-report.js +1 -1
- package/node_modules/pi-lens/dist/tools/project-report.js +1 -1
- package/node_modules/pi-lens/dist/tools/symbol-search.js +5 -2
- package/node_modules/pi-lens/docs/durable-store-audit-1202.md +1 -1
- package/node_modules/pi-lens/docs/servercapabilities.md +1 -1
- package/node_modules/pi-lens/package.json +160 -156
- package/node_modules/pi-lens/rules/typos/_typos.toml +2 -2
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +31 -13
- package/node_modules/pi-lens/scripts/download-grammars.js +9 -3
- package/node_modules/pi-lens/scripts/rpc-load-check.mjs +30 -9
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +47 -0
- package/node_modules/pi-mcp-adapter/README.md +42 -13
- package/node_modules/pi-mcp-adapter/commands.ts +4 -2
- package/node_modules/pi-mcp-adapter/config.ts +45 -5
- package/node_modules/pi-mcp-adapter/direct-tools.ts +103 -92
- package/node_modules/pi-mcp-adapter/dist/agent-dir.d.ts +10 -0
- package/node_modules/pi-mcp-adapter/dist/agent-dir.js +63 -0
- package/node_modules/pi-mcp-adapter/dist/agent-dir.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.d.ts +8 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js +356 -0
- package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/config.d.ts +123 -0
- package/node_modules/pi-mcp-adapter/dist/config.js +1087 -0
- package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.d.ts +19 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +319 -0
- package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.d.ts +2 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js +156 -0
- package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.d.ts +1 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.js +15 -0
- package/node_modules/pi-mcp-adapter/dist/resource-tools.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/types.d.ts +564 -0
- package/node_modules/pi-mcp-adapter/dist/types.js +287 -0
- package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.d.ts +6 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js +37 -0
- package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.d.ts +104 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js +59 -0
- package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.d.ts +4 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js +27 -0
- package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js.map +1 -0
- package/node_modules/pi-mcp-adapter/dist/utils.d.ts +32 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js +338 -0
- package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -0
- package/node_modules/pi-mcp-adapter/failure-backoff.ts +23 -0
- package/node_modules/pi-mcp-adapter/index.ts +204 -82
- package/node_modules/pi-mcp-adapter/init.ts +41 -30
- package/node_modules/pi-mcp-adapter/lifecycle.ts +16 -8
- package/node_modules/pi-mcp-adapter/mcp-code.ts +2 -0
- package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +66 -16
- package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +95 -7
- package/node_modules/pi-mcp-adapter/mcp-probe.ts +18 -4
- package/node_modules/pi-mcp-adapter/mcp-references.ts +368 -0
- package/node_modules/pi-mcp-adapter/mcp-status.ts +8 -19
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +20 -12
- package/node_modules/pi-mcp-adapter/namespace-tools.ts +276 -0
- package/node_modules/pi-mcp-adapter/package.json +24 -6
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +66 -10
- package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -0
- package/node_modules/pi-mcp-adapter/server-manager.ts +63 -12
- package/node_modules/pi-mcp-adapter/state.ts +1 -3
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +16 -2
- package/node_modules/pi-mcp-adapter/types.ts +48 -1
- package/node_modules/pi-mcp-adapter/ui-server.ts +3 -19
- package/node_modules/pi-mcp-adapter/ui-session.ts +2 -1
- package/node_modules/pi-mcp-adapter/utils.ts +21 -19
- package/node_modules/pi-web-access/CHANGELOG.md +26 -0
- package/node_modules/pi-web-access/README.md +71 -14
- package/node_modules/pi-web-access/chrome-cookies.ts +115 -35
- package/node_modules/pi-web-access/credential-source.ts +6 -2
- package/node_modules/pi-web-access/curator-page.ts +5 -3
- package/node_modules/pi-web-access/curator-server.ts +2 -1
- package/node_modules/pi-web-access/extract.ts +89 -9
- package/node_modules/pi-web-access/fetch-params.ts +13 -0
- package/node_modules/pi-web-access/gemini-adc.ts +298 -0
- package/node_modules/pi-web-access/gemini-api.ts +59 -15
- package/node_modules/pi-web-access/gemini-search.ts +58 -18
- package/node_modules/pi-web-access/gemini-url-context.ts +3 -2
- package/node_modules/pi-web-access/gemini-web-config.ts +57 -7
- package/node_modules/pi-web-access/gemini-web.ts +9 -3
- package/node_modules/pi-web-access/github-api.ts +5 -4
- package/node_modules/pi-web-access/github-issue-pr.ts +700 -0
- package/node_modules/pi-web-access/index.ts +403 -297
- package/node_modules/pi-web-access/kimi-search.ts +234 -0
- package/node_modules/pi-web-access/openai-search.ts +118 -21
- package/node_modules/pi-web-access/package.json +3 -2
- package/node_modules/pi-web-access/ssrf-protection.ts +4 -1
- package/node_modules/pi-web-access/utils.ts +307 -1
- package/node_modules/pi-web-access/youtube-extract.ts +2 -2
- package/package.json +46 -37
- package/node_modules/@herbertgao/pi-copy-response/CHANGELOG.md +0 -49
- package/node_modules/@herbertgao/pi-copy-response/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-handoff/CHANGELOG.md +0 -83
- package/node_modules/@herbertgao/pi-handoff/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-handoff/package.json +0 -60
- package/node_modules/@herbertgao/pi-inline-skills/CHANGELOG.md +0 -57
- package/node_modules/@herbertgao/pi-inline-skills/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-mermaid-open/CHANGELOG.md +0 -39
- package/node_modules/@herbertgao/pi-preferred-thinking/CHANGELOG.md +0 -63
- package/node_modules/@herbertgao/pi-preferred-thinking/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-recap/CHANGELOG.md +0 -101
- package/node_modules/@herbertgao/pi-recap/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-recap/package.json +0 -55
- package/node_modules/@herbertgao/pi-rename/CHANGELOG.md +0 -49
- package/node_modules/@herbertgao/pi-rename/LICENSE +0 -22
- package/node_modules/@herbertgao/pi-rename/package.json +0 -63
- package/node_modules/@herbertgao/pi-titlebar-spinner/CHANGELOG.md +0 -25
- package/node_modules/@herbertgao/pi-titlebar-spinner/LICENSE +0 -22
- /package/node_modules/{@herbertgao → @tifan}/pi-copy-response/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/complete-text.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/session-query.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/herdr-plugin.toml +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/viewer.mjs +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/index.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/model-picker.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/sanitize.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/tui.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/model-picker.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/naming.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/sanitize.ts +0 -0
- /package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/src/index.ts +0 -0
|
@@ -1823,80 +1823,62 @@ onTransient,
|
|
|
1823
1823
|
* the expiry as transient rather than as a verdict (#1657).
|
|
1824
1824
|
*/
|
|
1825
1825
|
timeoutMs = 10000) {
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
}
|
|
1826
|
+
// #2015: safeSpawnAsync instead of raw spawn. Raw spawn's timeout
|
|
1827
|
+
// SIGTERMed only cmd.exe on Windows (.cmd shims run shell:true), orphaning
|
|
1828
|
+
// the grandchild node process - which kept scanning, held handles against
|
|
1829
|
+
// the cleanup rm, and turned one slow cold-start verify into an
|
|
1830
|
+
// install/verify/reinstall loop (23 SIGTERMs observed in one day).
|
|
1831
|
+
// lifetimeCoupled tree-kill prevents orphans; result.signal gives a typed
|
|
1832
|
+
// kill-reason for transient classification.
|
|
1833
|
+
const isWindows = installerPlatform() === "win32";
|
|
1834
|
+
const hasKnownWindowsExt = /\.(cmd|exe|ps1)$/i.test(binPath);
|
|
1835
|
+
// On Windows, resolve the best executable path:
|
|
1836
|
+
// - extensionless → prefer .cmd (cmd.exe-safe)
|
|
1837
|
+
// - .ps1 → prefer .cmd sibling to avoid PowerShell execution-policy hangs
|
|
1838
|
+
// - .cmd / .exe → use as-is
|
|
1839
|
+
let execPath = isWindows && !hasKnownWindowsExt ? `${binPath}.cmd` : binPath;
|
|
1840
|
+
if (isWindows && /\.ps1$/i.test(execPath)) {
|
|
1841
|
+
const cmdSibling = `${execPath.slice(0, -4)}.cmd`;
|
|
1842
|
+
if (require("node:fs").existsSync(cmdSibling)) {
|
|
1843
|
+
execPath = cmdSibling;
|
|
1845
1844
|
}
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1845
|
+
}
|
|
1846
|
+
const useShell = isWindows && /\.(cmd|bat)$/i.test(execPath);
|
|
1847
|
+
// safe-spawn routes .cmd/.bat through its cmd.exe wrapper internally
|
|
1848
|
+
// (shell:false always at the child boundary; the wrapper string is built
|
|
1849
|
+
// there), so no shell option exists or is needed here.
|
|
1850
|
+
void useShell;
|
|
1851
|
+
try {
|
|
1852
|
+
const result = await safeSpawnAsync(execPath, ["--version"], {
|
|
1853
|
+
timeout: timeoutMs,
|
|
1854
|
+
});
|
|
1855
|
+
const output = `${result.stdout}\n${result.stderr}`;
|
|
1856
|
+
if (result.status === 0 && !result.error) {
|
|
1857
|
+
debugLog(`Verified: ${binPath} (version: ${result.stdout.trim()})`);
|
|
1858
|
+
onVersionOutput?.(result.stdout);
|
|
1859
|
+
return true;
|
|
1855
1860
|
}
|
|
1856
|
-
|
|
1857
|
-
//
|
|
1858
|
-
//
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
onTransient?.();
|
|
1862
|
-
resolve(false);
|
|
1863
|
-
return;
|
|
1861
|
+
if (isLspTransportRequiredError(output)) {
|
|
1862
|
+
// Valid stdio LSP server that rejects `--version` (#208) — the
|
|
1863
|
+
// transport-required error proves the binary works.
|
|
1864
|
+
debugLog(`Verified (stdio LSP, transport-required): ${binPath}`);
|
|
1865
|
+
return true;
|
|
1864
1866
|
}
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
}
|
|
1881
|
-
else {
|
|
1882
|
-
// `code === null` (usually paired with a `signal`) means the
|
|
1883
|
-
// spawn timeout fired and the process was killed before it could
|
|
1884
|
-
// exit on its own — a stall, not a verdict from the binary.
|
|
1885
|
-
if (code === null || signal)
|
|
1886
|
-
onTransient?.();
|
|
1887
|
-
logSessionStart(`auto-install verify: failed for ${binPath} (exit=${code}${signal ? `, signal=${signal}` : ""})`);
|
|
1888
|
-
resolve(false);
|
|
1889
|
-
}
|
|
1890
|
-
});
|
|
1891
|
-
proc.on("error", (err) => {
|
|
1892
|
-
const errno = err.code;
|
|
1893
|
-
if (errno === "EAGAIN" || errno === "EBUSY" || errno === "ETIMEDOUT") {
|
|
1894
|
-
onTransient?.();
|
|
1895
|
-
}
|
|
1896
|
-
logSessionStart(`auto-install verify: error for ${binPath}: ${err.message}`);
|
|
1897
|
-
resolve(false);
|
|
1898
|
-
});
|
|
1899
|
-
});
|
|
1867
|
+
// A kill (timeout fired) or spawn-boundary failure is a stall, not a
|
|
1868
|
+
// verdict from the binary (#1569 transient semantics).
|
|
1869
|
+
if (result.signal !== undefined || result.spawnFailure)
|
|
1870
|
+
onTransient?.();
|
|
1871
|
+
logSessionStart(`auto-install verify: failed for ${binPath} (kind=${result.signal ? `killed-signal=${result.signal}` : result.error ? "spawn-error" : "exit-nonzero"}${result.status !== null ? `, exit=${result.status}` : ""})`);
|
|
1872
|
+
return false;
|
|
1873
|
+
}
|
|
1874
|
+
catch (err) {
|
|
1875
|
+
// Spawn-boundary throw (Windows `spawn UNKNOWN`/EINVAL, the pidusage
|
|
1876
|
+
// bug class, #533) — best-effort verify, resolve rather than reject.
|
|
1877
|
+
// The prober itself never ran, so this says nothing about the binary.
|
|
1878
|
+
logSessionStart(`auto-install verify: spawn threw for ${binPath} (${err instanceof Error ? err.message : String(err)})`);
|
|
1879
|
+
onTransient?.();
|
|
1880
|
+
return false;
|
|
1881
|
+
}
|
|
1900
1882
|
}
|
|
1901
1883
|
/**
|
|
1902
1884
|
* Get detailed status for all tools
|
|
@@ -3005,7 +2987,10 @@ export async function acquireManagedInstallGate(context) {
|
|
|
3005
2987
|
};
|
|
3006
2988
|
}
|
|
3007
2989
|
if (!assertInstallAllowed(context)) {
|
|
3008
|
-
return {
|
|
2990
|
+
return {
|
|
2991
|
+
ok: false,
|
|
2992
|
+
reason: `project trust: ${projectTrustDenialReason()}`,
|
|
2993
|
+
};
|
|
3009
2994
|
}
|
|
3010
2995
|
// Held for the whole strategy call, not just the final write — a refresh
|
|
3011
2996
|
// can race a concurrent `ensureTool` install of the SAME tool into the SAME
|
|
@@ -3580,7 +3565,9 @@ async function installArchiveTool(tool) {
|
|
|
3580
3565
|
await fs.rm(tmpArchive, { force: true });
|
|
3581
3566
|
if (!extracted.ok) {
|
|
3582
3567
|
logSessionStart(`archive-install ${tool.id}: extraction failed: ${extracted.stderr} — keeping installed version`);
|
|
3583
|
-
await fs
|
|
3568
|
+
await fs
|
|
3569
|
+
.rm(tmpExtractDir, { recursive: true, force: true })
|
|
3570
|
+
.catch(() => { });
|
|
3584
3571
|
return undefined;
|
|
3585
3572
|
}
|
|
3586
3573
|
// Tree bundle (no launcher): the whole extracted tree IS the artifact. Verify
|
|
@@ -3596,7 +3583,9 @@ async function installArchiveTool(tool) {
|
|
|
3596
3583
|
}
|
|
3597
3584
|
catch {
|
|
3598
3585
|
logSessionStart(`archive-install ${tool.id}: tree marker not found at ${tmpMarker} after extraction — keeping installed version`);
|
|
3599
|
-
await fs
|
|
3586
|
+
await fs
|
|
3587
|
+
.rm(tmpExtractDir, { recursive: true, force: true })
|
|
3588
|
+
.catch(() => { });
|
|
3600
3589
|
return undefined;
|
|
3601
3590
|
}
|
|
3602
3591
|
await swapExtractedDir(tool.id, tmpExtractDir, extractDir);
|
|
@@ -3616,7 +3605,9 @@ async function installArchiveTool(tool) {
|
|
|
3616
3605
|
}
|
|
3617
3606
|
catch {
|
|
3618
3607
|
logSessionStart(`archive-install ${tool.id}: launcher not found at ${tmpResolvedInner} after extraction — keeping installed version`);
|
|
3619
|
-
await fs
|
|
3608
|
+
await fs
|
|
3609
|
+
.rm(tmpExtractDir, { recursive: true, force: true })
|
|
3610
|
+
.catch(() => { });
|
|
3620
3611
|
return undefined;
|
|
3621
3612
|
}
|
|
3622
3613
|
if (!isWindows)
|
|
@@ -3645,7 +3636,9 @@ async function installArchiveTool(tool) {
|
|
|
3645
3636
|
}
|
|
3646
3637
|
catch (err) {
|
|
3647
3638
|
await fs.rm(tmpArchive, { force: true }).catch(() => { });
|
|
3648
|
-
await fs
|
|
3639
|
+
await fs
|
|
3640
|
+
.rm(tmpExtractDir, { recursive: true, force: true })
|
|
3641
|
+
.catch(() => { });
|
|
3649
3642
|
logSessionStart(`archive-install ${tool.id}: install failed: ${err.message} — keeping installed version`);
|
|
3650
3643
|
return undefined;
|
|
3651
3644
|
}
|
|
@@ -3729,8 +3722,12 @@ async function installNpmTool(packageName, binaryName) {
|
|
|
3729
3722
|
// postinstall scripts that complete asynchronously after npm exits 0.
|
|
3730
3723
|
debugLog(`Verifying ${binaryName}...`);
|
|
3731
3724
|
let isValid = false;
|
|
3725
|
+
let lastAttemptTransient = false;
|
|
3732
3726
|
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
3733
|
-
|
|
3727
|
+
lastAttemptTransient = false;
|
|
3728
|
+
isValid = await verifyToolBinary(binPath, undefined, () => {
|
|
3729
|
+
lastAttemptTransient = true;
|
|
3730
|
+
});
|
|
3734
3731
|
if (isValid)
|
|
3735
3732
|
break;
|
|
3736
3733
|
if (attempt < 3) {
|
|
@@ -3738,6 +3735,18 @@ async function installNpmTool(packageName, binaryName) {
|
|
|
3738
3735
|
await new Promise((r) => setTimeout(r, 1000 * attempt));
|
|
3739
3736
|
}
|
|
3740
3737
|
}
|
|
3738
|
+
if (!isValid && lastAttemptTransient) {
|
|
3739
|
+
// #2015: a killed/spawn-failed prober is NOT a verdict about the
|
|
3740
|
+
// binary (#1569 semantics). Cold-start verifies on fresh installs
|
|
3741
|
+
// legitimately exceed the budget on Windows (Defender/OneDrive
|
|
3742
|
+
// first-touch scanning of new node_modules). Deleting a possibly-
|
|
3743
|
+
// healthy install here is what turned one slow verify into the
|
|
3744
|
+
// reinstall loop - keep the installation; the next ensureTool
|
|
3745
|
+
// re-probes the existing binary via discovery instead of
|
|
3746
|
+
// reinstalling from scratch.
|
|
3747
|
+
logSessionStart(`auto-install ${packageName}: verification inconclusive (transient); keeping installation for re-probe`);
|
|
3748
|
+
return undefined;
|
|
3749
|
+
}
|
|
3741
3750
|
if (!isValid) {
|
|
3742
3751
|
logSessionStart(`auto-install ${packageName}: installed but verification failed, cleaning up`);
|
|
3743
3752
|
// Clean up the broken installation
|
|
@@ -776,7 +776,10 @@ function parseNonNegativeMs(raw) {
|
|
|
776
776
|
* would make the whole backstop silently return zero rows, and this is the
|
|
777
777
|
* one part of the fix that cannot be checked from a Windows dev machine.
|
|
778
778
|
*/
|
|
779
|
-
export const POSIX_PS_ARGS = [
|
|
779
|
+
export const POSIX_PS_ARGS = [
|
|
780
|
+
"-eo",
|
|
781
|
+
"pid=,ppid=,etime=,args=",
|
|
782
|
+
];
|
|
780
783
|
/** Parse `ps -o etime` output: `[[dd-]hh:]mm:ss`. Returns undefined for any
|
|
781
784
|
* shape the column did not produce (a `ps` without the column emits the
|
|
782
785
|
* command line where the token was expected). */
|
|
@@ -795,7 +798,7 @@ export function ageMsFromPosixEtime(raw) {
|
|
|
795
798
|
if (parts.some((part) => !Number.isFinite(part)))
|
|
796
799
|
return undefined;
|
|
797
800
|
const [hours, minutes, seconds] = parts.length === 3 ? parts : [0, parts[0], parts[1]];
|
|
798
|
-
return ((
|
|
801
|
+
return ((days * 24 + hours) * 60 * 60 + minutes * 60 + seconds) * 1000;
|
|
799
802
|
}
|
|
800
803
|
/**
|
|
801
804
|
* Fire-and-forget REGISTRY-INDEPENDENT backstop sweep (#658): finds
|
|
@@ -36,7 +36,7 @@ import { getGlobalPiLensDir } from "./file-utils.js";
|
|
|
36
36
|
// import is actually invoked.
|
|
37
37
|
import { realIsPidAlive } from "./instance-reaper.js";
|
|
38
38
|
import { normalizeFilePath } from "./path-utils.js";
|
|
39
|
-
import { getSubagentIdentity, isSubagentSession
|
|
39
|
+
import { getSubagentIdentity, isSubagentSession } from "./subagent-mode.js";
|
|
40
40
|
function registryPath() {
|
|
41
41
|
return path.join(getGlobalPiLensDir(), "instances.json");
|
|
42
42
|
}
|
|
@@ -429,7 +429,9 @@ export function computeResourceFootprint(instances, isPidAlive) {
|
|
|
429
429
|
*/
|
|
430
430
|
export async function getResourceFootprint(isPidAlive = realIsPidAlive) {
|
|
431
431
|
const instances = await readInstanceRegistry();
|
|
432
|
-
const deadPids = new Set(instances
|
|
432
|
+
const deadPids = new Set(instances
|
|
433
|
+
.filter((instance) => !isPidAlive(instance.pid))
|
|
434
|
+
.map((instance) => instance.pid));
|
|
433
435
|
if (deadPids.size > 0) {
|
|
434
436
|
// Fire-and-forget: a health-report read must never block on, or fail
|
|
435
437
|
// because of, a registry write.
|
|
@@ -238,7 +238,12 @@ export class JscpdClient {
|
|
|
238
238
|
".",
|
|
239
239
|
...(hasConfig
|
|
240
240
|
? []
|
|
241
|
-
: [
|
|
241
|
+
: [
|
|
242
|
+
"--min-lines",
|
|
243
|
+
String(minLines),
|
|
244
|
+
"--min-tokens",
|
|
245
|
+
String(minTokens),
|
|
246
|
+
]),
|
|
242
247
|
"--reporters",
|
|
243
248
|
"json",
|
|
244
249
|
"--output",
|
|
@@ -134,7 +134,9 @@ export function classifyKnipBinary(binary, targetDir) {
|
|
|
134
134
|
if (binary === null)
|
|
135
135
|
return "managed-or-path";
|
|
136
136
|
const relative = path.relative(path.resolve(targetDir), path.resolve(binary));
|
|
137
|
-
return relative === "" ||
|
|
137
|
+
return relative === "" ||
|
|
138
|
+
relative.startsWith("..") ||
|
|
139
|
+
path.isAbsolute(relative)
|
|
138
140
|
? "global"
|
|
139
141
|
: "project";
|
|
140
142
|
}
|
|
@@ -199,9 +201,7 @@ export class KnipClient {
|
|
|
199
201
|
*/
|
|
200
202
|
recordedToolchains = new Set();
|
|
201
203
|
constructor(verbose = false) {
|
|
202
|
-
this.log = verbose
|
|
203
|
-
? createSubsystemLogger("knip")
|
|
204
|
-
: () => { };
|
|
204
|
+
this.log = verbose ? createSubsystemLogger("knip") : () => { };
|
|
205
205
|
}
|
|
206
206
|
/** Re-arm content-keyed reuse at the session boundary. */
|
|
207
207
|
resetSessionState() {
|
|
@@ -223,7 +223,13 @@ export class KnipClient {
|
|
|
223
223
|
* repos often have no package.json at their own root).
|
|
224
224
|
*/
|
|
225
225
|
resolveProjectRoot(startDir, homeDirOverride) {
|
|
226
|
-
return findNearestMarkerRoot(startDir, [
|
|
226
|
+
return findNearestMarkerRoot(startDir, [
|
|
227
|
+
"package.json",
|
|
228
|
+
"knip.json",
|
|
229
|
+
"knip.ts",
|
|
230
|
+
"knip.config.js",
|
|
231
|
+
"knip.config.ts",
|
|
232
|
+
], { boundaries: [".git", ".hg", ".svn"], homeDir: homeDirOverride });
|
|
227
233
|
}
|
|
228
234
|
/**
|
|
229
235
|
* Check if knip CLI is available, auto-install if not.
|
|
@@ -332,8 +338,7 @@ export class KnipClient {
|
|
|
332
338
|
this.log(`Analysis already in flight for ${key}; sharing result`);
|
|
333
339
|
return existing;
|
|
334
340
|
}
|
|
335
|
-
const promise = this.runAnalyze(key)
|
|
336
|
-
.then((result) => {
|
|
341
|
+
const promise = this.runAnalyze(key).then((result) => {
|
|
337
342
|
const executed = { ...result, execution: "executed" };
|
|
338
343
|
if (result.success && options.projectSeq !== undefined) {
|
|
339
344
|
this.completedByProject.set(key, {
|
|
@@ -343,12 +348,17 @@ export class KnipClient {
|
|
|
343
348
|
});
|
|
344
349
|
}
|
|
345
350
|
return executed;
|
|
346
|
-
})
|
|
347
|
-
.finally(() => {
|
|
348
|
-
this.inFlight.delete(key);
|
|
349
351
|
});
|
|
350
|
-
|
|
351
|
-
|
|
352
|
+
// Identity-guarded release (#1968, #1967's pattern): delete only if
|
|
353
|
+
// THIS build is still the registered one. A bare delete-by-key lets a
|
|
354
|
+
// late-settling build A evict a live build B that replaced the entry
|
|
355
|
+
// mid-flight, and the next caller starts a duplicate.
|
|
356
|
+
const wrapped = promise.finally(() => {
|
|
357
|
+
if (this.inFlight.get(key) === wrapped)
|
|
358
|
+
this.inFlight.delete(key);
|
|
359
|
+
});
|
|
360
|
+
this.inFlight.set(key, wrapped);
|
|
361
|
+
return wrapped;
|
|
352
362
|
}
|
|
353
363
|
readMemoFileSignal(filePath) {
|
|
354
364
|
try {
|
|
@@ -371,9 +381,12 @@ export class KnipClient {
|
|
|
371
381
|
matchesMemoSignal(targetDir, signal) {
|
|
372
382
|
const current = {
|
|
373
383
|
packageJson: this.readMemoFileSignal(path.join(targetDir, "package.json")),
|
|
374
|
-
config: signal.config
|
|
384
|
+
config: signal.config
|
|
385
|
+
? this.readMemoFileSignal(signal.config.path)
|
|
386
|
+
: null,
|
|
375
387
|
};
|
|
376
|
-
return (JSON.stringify(current.packageJson) ===
|
|
388
|
+
return (JSON.stringify(current.packageJson) ===
|
|
389
|
+
JSON.stringify(signal.packageJson) &&
|
|
377
390
|
JSON.stringify(current.config) === JSON.stringify(signal.config));
|
|
378
391
|
}
|
|
379
392
|
async runAnalyze(targetDir) {
|
|
@@ -593,7 +606,8 @@ export class KnipClient {
|
|
|
593
606
|
if (pinned.size === 0)
|
|
594
607
|
return result;
|
|
595
608
|
const isPinnedDepIssue = (issue) => (issue.type === "dependency" || issue.type === "devDependency") &&
|
|
596
|
-
(pinned.has(issue.name) ||
|
|
609
|
+
(pinned.has(issue.name) ||
|
|
610
|
+
(!!issue.package && pinned.has(issue.package)));
|
|
597
611
|
const issues = result.issues.filter((issue) => !isPinnedDepIssue(issue));
|
|
598
612
|
const unusedDeps = result.unusedDeps.filter((issue) => !isPinnedDepIssue(issue));
|
|
599
613
|
return unusedDeps.length === result.unusedDeps.length
|
|
@@ -279,7 +279,10 @@ export async function collectSourceFilesForWarmup(rootDir, maxFiles = MAX_WARMUP
|
|
|
279
279
|
if (entry.isDirectory()) {
|
|
280
280
|
// Never checked symlinks — always follows them (unlike
|
|
281
281
|
// source-filter.ts's collectSourceFiles*, refs #191).
|
|
282
|
-
if (!shouldRecurseIntoDir(entry, fullPath, {
|
|
282
|
+
if (!shouldRecurseIntoDir(entry, fullPath, {
|
|
283
|
+
ignoreMatcher,
|
|
284
|
+
followSymlinks: true,
|
|
285
|
+
})) {
|
|
283
286
|
continue;
|
|
284
287
|
}
|
|
285
288
|
stack.push(fullPath);
|
|
@@ -73,6 +73,10 @@ let recentPhases = [];
|
|
|
73
73
|
* their own work. `lsp_scanner_coverage_gap` reports the touch's elapsed time for
|
|
74
74
|
* joinability. Letting any of them win `lastPhase` would attribute a `loop_block`
|
|
75
75
|
* to the record instead of to the touch that is actually stalled.
|
|
76
|
+
*
|
|
77
|
+
* #1996: `cache_usage_summary` is a zero-duration session rollup over earlier
|
|
78
|
+
* usage records. It reports no new work and therefore cannot own last-phase
|
|
79
|
+
* stall attribution.
|
|
76
80
|
*/
|
|
77
81
|
const LAST_PHASE_EXCLUDED = new Set([
|
|
78
82
|
"loop_block",
|
|
@@ -82,6 +86,7 @@ const LAST_PHASE_EXCLUDED = new Set([
|
|
|
82
86
|
"agent_end_deferred_mutation_drain",
|
|
83
87
|
"agent_end_deferred_mutation_requeue",
|
|
84
88
|
"session_end_bus_rollup",
|
|
89
|
+
"cache_usage_summary",
|
|
85
90
|
"lsp_aux_wait_outcome",
|
|
86
91
|
"tool_set_mutation",
|
|
87
92
|
"availability_decision",
|
|
@@ -221,7 +226,11 @@ export function phaseFinished(token) {
|
|
|
221
226
|
if (!liveBrackets.delete(token))
|
|
222
227
|
return;
|
|
223
228
|
closedBrackets = [
|
|
224
|
-
{
|
|
229
|
+
{
|
|
230
|
+
phase: token.phase,
|
|
231
|
+
startedAt: token.startedAt,
|
|
232
|
+
closedAt: new Date().toISOString(),
|
|
233
|
+
},
|
|
225
234
|
...closedBrackets,
|
|
226
235
|
].slice(0, CLOSED_BRACKET_CAP);
|
|
227
236
|
}
|
|
@@ -507,7 +516,9 @@ export function resetCurrentPhaseForSession() {
|
|
|
507
516
|
}
|
|
508
517
|
export function logLatency(entry) {
|
|
509
518
|
const ts = new Date().toISOString();
|
|
510
|
-
if (entry.type === "phase" &&
|
|
519
|
+
if (entry.type === "phase" &&
|
|
520
|
+
entry.phase &&
|
|
521
|
+
!LAST_PHASE_EXCLUDED.has(entry.phase)) {
|
|
511
522
|
recentPhases = [{ phase: entry.phase, ts }, ...recentPhases].slice(0, RECENT_PHASE_CAP);
|
|
512
523
|
}
|
|
513
524
|
if (isTestMode()) {
|
|
@@ -111,7 +111,7 @@ export function loadPiLensGlobalConfig(configPath = getPiLensGlobalConfigPath())
|
|
|
111
111
|
formatSection.mode = format.mode;
|
|
112
112
|
}
|
|
113
113
|
else {
|
|
114
|
-
// #533: a present-but-invalid mode (e.g. "immedaite") warns and
|
|
114
|
+
// #533: a present-but-invalid mode (e.g. "immedaite") warns and // spellchecker:disable-line
|
|
115
115
|
// falls back; an absent mode stays silent.
|
|
116
116
|
if ("mode" in format) {
|
|
117
117
|
warnInvalid('format.mode must be "immediate" or "deferred"');
|
|
@@ -224,7 +224,12 @@ export function aggregateGraphToFiles(graph, options) {
|
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
226
|
else {
|
|
227
|
-
files.set(id, {
|
|
227
|
+
files.set(id, {
|
|
228
|
+
id,
|
|
229
|
+
path: id,
|
|
230
|
+
language: node.language || "",
|
|
231
|
+
symbolCount: 0,
|
|
232
|
+
});
|
|
228
233
|
}
|
|
229
234
|
continue;
|
|
230
235
|
}
|
|
@@ -394,8 +399,8 @@ function seededPosition(id, width, height) {
|
|
|
394
399
|
const hx = fnv1a(id);
|
|
395
400
|
const hy = fnv1a(`${id}\u0000y`);
|
|
396
401
|
return {
|
|
397
|
-
x: (hx % 10000) / 10000 * width,
|
|
398
|
-
y: (hy % 10000) / 10000 * height,
|
|
402
|
+
x: ((hx % 10000) / 10000) * width,
|
|
403
|
+
y: ((hy % 10000) / 10000) * height,
|
|
399
404
|
};
|
|
400
405
|
}
|
|
401
406
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { recordDegradation } from "./degradation-ledger.js";
|
|
2
2
|
import { probeCtxActive } from "./session-lifecycle.js";
|
|
3
|
-
import { logBusEvent
|
|
3
|
+
import { logBusEvent } from "./bus-events-logger.js";
|
|
4
4
|
const STALE_CTX_MESSAGE = "This extension ctx is stale after session replacement";
|
|
5
5
|
/** Ledger a dead activation once, at the publisher's occurrence-window guard. */
|
|
6
6
|
export function recordStaleBusFailure(subject, error) {
|
|
@@ -74,9 +74,7 @@ async function readLSPConfig(configPath) {
|
|
|
74
74
|
content = await fs.readFile(configPath, "utf-8");
|
|
75
75
|
}
|
|
76
76
|
catch (error) {
|
|
77
|
-
if (error instanceof Error &&
|
|
78
|
-
"code" in error &&
|
|
79
|
-
error.code === "ENOENT") {
|
|
77
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
80
78
|
return undefined;
|
|
81
79
|
}
|
|
82
80
|
warnInvalidLSPConfig(configPath, error);
|
|
@@ -218,7 +216,8 @@ export async function initLSPConfig(cwd) {
|
|
|
218
216
|
if (config.serverOverrides) {
|
|
219
217
|
for (const [id, entry] of Object.entries(config.serverOverrides)) {
|
|
220
218
|
if (entry && typeof entry === "object" && !Array.isArray(entry)) {
|
|
221
|
-
const initOpts = entry
|
|
219
|
+
const initOpts = entry
|
|
220
|
+
.initializationOptions;
|
|
222
221
|
if (initOpts !== undefined &&
|
|
223
222
|
typeof initOpts === "object" &&
|
|
224
223
|
initOpts !== null &&
|
|
@@ -291,8 +290,7 @@ export function getServersForFileWithConfig(filePath) {
|
|
|
291
290
|
* now report the same primary-vs-auxiliary split for the same file.
|
|
292
291
|
*/
|
|
293
292
|
export function primaryServerId(filePath) {
|
|
294
|
-
return getServersForFileWithConfig(filePath).find((s) => s.role !== "auxiliary")
|
|
295
|
-
?.id;
|
|
293
|
+
return getServersForFileWithConfig(filePath).find((s) => s.role !== "auxiliary")?.id;
|
|
296
294
|
}
|
|
297
295
|
/**
|
|
298
296
|
* Look up an initializationOptions override for a built-in server.
|