@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
|
@@ -31,6 +31,10 @@ import { formatRunDurationMs } from "./run-duration.js";
|
|
|
31
31
|
import { MAX_ADVISORY_AFFECTED_FILES, gateFindingsByPathFreshness, snapshotAdvisoryProvenance, } from "./advisory-provenance.js";
|
|
32
32
|
import { sweepInlineBlockerFreshness } from "./blocker-freshness.js";
|
|
33
33
|
import { sweepInlineBlockerPastEof } from "./blocker-past-eof.js";
|
|
34
|
+
// #2001/#2002: collect-later delivery for slow auxiliary LSP servers.
|
|
35
|
+
import { getLSPService } from "./lsp/index.js";
|
|
36
|
+
import { drainPendingAuxiliaryCoverage, isPendingAuxiliaryPastRearmTtl, markPendingAuxiliaryCoverage, } from "./lsp/pending-aux-coverage.js";
|
|
37
|
+
import { convertLspDiagnostics } from "./dispatch/utils/lsp-diagnostics.js";
|
|
34
38
|
// #1631 review V2: moved to its own leaf module so a low-level store
|
|
35
39
|
// (widget-state.ts) can use the marker without importing this orchestrator —
|
|
36
40
|
// see clients/stale-marker.ts's doc comment.
|
|
@@ -267,7 +271,8 @@ export async function handleTurnEnd(deps) {
|
|
|
267
271
|
dbg(`turn_end: foreign live owner retained (${turnState.owner?.kind ?? "legacy"}:${turnState.owner?.id ?? turnState.sessionId})`);
|
|
268
272
|
return;
|
|
269
273
|
}
|
|
270
|
-
if (access === "available" &&
|
|
274
|
+
if (access === "available" &&
|
|
275
|
+
(turnState.files || turnState.owner || turnState.sessionId)) {
|
|
271
276
|
dbg("turn_end: evicting stale turn-state owner");
|
|
272
277
|
cacheManager.clearTurnState(cwd, currentOwner);
|
|
273
278
|
turnState = cacheManager.readTurnState(cwd);
|
|
@@ -583,7 +588,9 @@ export async function handleTurnEnd(deps) {
|
|
|
583
588
|
neighborCount: uniqueNeighborFiles.length,
|
|
584
589
|
metadata: {
|
|
585
590
|
neighborFiles: uniqueNeighborFiles.slice(0, 10),
|
|
586
|
-
suggestedTestFiles: testSuggestions
|
|
591
|
+
suggestedTestFiles: testSuggestions
|
|
592
|
+
.slice(0, 10)
|
|
593
|
+
.map((s) => s.testFile),
|
|
587
594
|
runner: testSuggestions[0]?.runner,
|
|
588
595
|
truncated: testSuggestions.length > 10,
|
|
589
596
|
zeroSuggestions: testSuggestions.length === 0,
|
|
@@ -1461,9 +1468,12 @@ export async function handleTurnEnd(deps) {
|
|
|
1461
1468
|
generation: testRunGeneration,
|
|
1462
1469
|
files: provenanceFiles,
|
|
1463
1470
|
});
|
|
1464
|
-
const superseded = launchedFrom.revision.sessionId !==
|
|
1465
|
-
|
|
1466
|
-
launchedFrom.revision.
|
|
1471
|
+
const superseded = launchedFrom.revision.sessionId !==
|
|
1472
|
+
publishedAgainst.revision.sessionId ||
|
|
1473
|
+
launchedFrom.revision.projectSeq !==
|
|
1474
|
+
publishedAgainst.revision.projectSeq ||
|
|
1475
|
+
launchedFrom.revision.turnIndex !==
|
|
1476
|
+
publishedAgainst.revision.turnIndex ||
|
|
1467
1477
|
launchedFrom.files.some((file, index) => publishedAgainst.files[index]?.sha256 !== file.sha256 ||
|
|
1468
1478
|
publishedAgainst.files[index]?.path !== file.path);
|
|
1469
1479
|
// #628: the turn advancing while tests ran no longer means the
|
|
@@ -1516,6 +1526,13 @@ export async function handleTurnEnd(deps) {
|
|
|
1516
1526
|
// git-guard blocker. `formatResult` already renders the
|
|
1517
1527
|
// error-only case as "Could not run tests: ...".
|
|
1518
1528
|
if (failed > 0 || error) {
|
|
1529
|
+
// #2028: "Test file not found" is an expected skip
|
|
1530
|
+
// (conventional test path without an actual file),
|
|
1531
|
+
// not an actionable failure. Don't surface it.
|
|
1532
|
+
if (error &&
|
|
1533
|
+
String(r.value?.error ?? "").includes("Test file not found")) {
|
|
1534
|
+
continue;
|
|
1535
|
+
}
|
|
1519
1536
|
const formatted = testRunnerClient.formatResult(r.value);
|
|
1520
1537
|
if (formatted)
|
|
1521
1538
|
failures.push(formatted);
|
|
@@ -1541,7 +1558,8 @@ export async function handleTurnEnd(deps) {
|
|
|
1541
1558
|
provenance: publishedAgainst,
|
|
1542
1559
|
superseded,
|
|
1543
1560
|
}, cwd);
|
|
1544
|
-
if (getFlag("lens-guard") &&
|
|
1561
|
+
if (getFlag("lens-guard") &&
|
|
1562
|
+
firedSessionId === runtime.telemetrySessionId) {
|
|
1545
1563
|
// #1524: `&& !value.error` — a runner-error result has
|
|
1546
1564
|
// `failed === 0` (the suite never ran, so nothing could
|
|
1547
1565
|
// fail), but it is not a pass. Without the filter it
|
|
@@ -1791,6 +1809,129 @@ export async function handleTurnEnd(deps) {
|
|
|
1791
1809
|
});
|
|
1792
1810
|
}
|
|
1793
1811
|
cacheManager.incrementTurnCycle(cwd, currentOwner);
|
|
1812
|
+
// #2001/#2002: collect-later delivery for auxiliary LSP servers whose
|
|
1813
|
+
// aux-grace window expired without a publication (opengrep on Windows:
|
|
1814
|
+
// ~8s per scan against a 2s grace — the scanner's eventual findings sat
|
|
1815
|
+
// in its client cache, agent-invisible). Probe each pending pair through
|
|
1816
|
+
// the read-only cache seam (never spawns), freshness-gate the result
|
|
1817
|
+
// against when the pair was marked, and deliver survivors as an advisory.
|
|
1818
|
+
// A pair whose client is alive but has STILL published nothing re-arms
|
|
1819
|
+
// (baseline preserved, TTL anchor advanced) until the re-arm TTL; a dead
|
|
1820
|
+
// client drops silently.
|
|
1821
|
+
const lateAuxStart = Date.now();
|
|
1822
|
+
const drainedPairs = drainPendingAuxiliaryCoverage();
|
|
1823
|
+
let lateAuxDelivered = 0;
|
|
1824
|
+
let lateAuxStale = 0;
|
|
1825
|
+
let lateAuxMissing = 0;
|
|
1826
|
+
let lateAuxRearmed = 0;
|
|
1827
|
+
let lateAuxClientGone = 0;
|
|
1828
|
+
let lateAuxProbeFailed = 0;
|
|
1829
|
+
if (drainedPairs.length > 0) {
|
|
1830
|
+
const byFile = new Map();
|
|
1831
|
+
for (const pair of drainedPairs) {
|
|
1832
|
+
const list = byFile.get(pair.filePath);
|
|
1833
|
+
if (list)
|
|
1834
|
+
list.push(pair);
|
|
1835
|
+
else
|
|
1836
|
+
byFile.set(pair.filePath, [pair]);
|
|
1837
|
+
}
|
|
1838
|
+
try {
|
|
1839
|
+
const service = getLSPService();
|
|
1840
|
+
for (const [lateAuxPath, pairs] of byFile) {
|
|
1841
|
+
let cached;
|
|
1842
|
+
try {
|
|
1843
|
+
cached = await service.readCachedDiagnosticsForServers(lateAuxPath, new Set(pairs.map((p) => p.serverId)));
|
|
1844
|
+
}
|
|
1845
|
+
catch {
|
|
1846
|
+
// #2027 round-1 P3-2: count dropped pairs — never silent.
|
|
1847
|
+
lateAuxProbeFailed += pairs.length;
|
|
1848
|
+
for (const pair of pairs) {
|
|
1849
|
+
markPendingAuxiliaryCoverage(pair.filePath, [pair.serverId], Date.now());
|
|
1850
|
+
}
|
|
1851
|
+
continue;
|
|
1852
|
+
}
|
|
1853
|
+
const displayLateAuxPath = toRunnerDisplayPath(cwd, lateAuxPath);
|
|
1854
|
+
for (const pair of pairs) {
|
|
1855
|
+
const rawDiags = cached.get(pair.serverId);
|
|
1856
|
+
if (rawDiags === undefined) {
|
|
1857
|
+
// No live client for this server any more — best-effort probe,
|
|
1858
|
+
// drop the pair silently.
|
|
1859
|
+
lateAuxClientGone += 1;
|
|
1860
|
+
continue;
|
|
1861
|
+
}
|
|
1862
|
+
if (rawDiags.length === 0) {
|
|
1863
|
+
// Still scanning (or published nothing yet) — keep waiting
|
|
1864
|
+
// so a scan finishing before the NEXT turn end still
|
|
1865
|
+
// delivers. Two clocks, deliberately decoupled: the
|
|
1866
|
+
// freshness baseline (`markedAtMs`) NEVER moves — it is what
|
|
1867
|
+
// the delivery gate stats against — while the re-arm TTL is
|
|
1868
|
+
// anchored on `lastRearmedAtMs`, advanced by every successful
|
|
1869
|
+
// empty probe: the scanner is demonstrably alive, just slow.
|
|
1870
|
+
if (!isPendingAuxiliaryPastRearmTtl(pair)) {
|
|
1871
|
+
markPendingAuxiliaryCoverage(lateAuxPath, [pair.serverId], pair.markedAtMs, Date.now());
|
|
1872
|
+
lateAuxRearmed += 1;
|
|
1873
|
+
}
|
|
1874
|
+
continue;
|
|
1875
|
+
}
|
|
1876
|
+
const converted = convertLspDiagnostics(rawDiags, lateAuxPath, {
|
|
1877
|
+
tool: "lsp",
|
|
1878
|
+
});
|
|
1879
|
+
if (converted.length === 0)
|
|
1880
|
+
continue;
|
|
1881
|
+
// Freshness kernel (#1634 gated surface): stat the cited file
|
|
1882
|
+
// against the mark timestamp. Missing → drop (no remediation for
|
|
1883
|
+
// a deleted file); mtime drifted past the mark → drop too, NOT
|
|
1884
|
+
// demote — unlike the cached-blocker gates these findings were
|
|
1885
|
+
// NEVER delivered before, and the edit that drifted the file
|
|
1886
|
+
// already re-touched it (a fresh pending pair supersedes this
|
|
1887
|
+
// one), so a stale-arm replay would double-report old content.
|
|
1888
|
+
// Both drops are COUNTED here and in the latency record below —
|
|
1889
|
+
// never silent (shape 10).
|
|
1890
|
+
const gate = gateFindingsByPathFreshness({
|
|
1891
|
+
store: "late-auxiliary-findings",
|
|
1892
|
+
findings: converted,
|
|
1893
|
+
cwd,
|
|
1894
|
+
scannedAt: pair.markedAtMs,
|
|
1895
|
+
citedPath: () => lateAuxPath,
|
|
1896
|
+
});
|
|
1897
|
+
lateAuxStale += gate.stale.length;
|
|
1898
|
+
lateAuxMissing +=
|
|
1899
|
+
converted.length - gate.live.length - gate.stale.length;
|
|
1900
|
+
if (gate.stale.length > 0) {
|
|
1901
|
+
// Stale findings mean the scan predates the last edit.
|
|
1902
|
+
// Re-arm with a REFRESHED baseline so the next turn probes
|
|
1903
|
+
// the newer revision (#2027 round-1 P2-1).
|
|
1904
|
+
markPendingAuxiliaryCoverage(lateAuxPath, [pair.serverId], Date.now());
|
|
1905
|
+
}
|
|
1906
|
+
if (gate.live.length === 0)
|
|
1907
|
+
continue;
|
|
1908
|
+
const lines = gate.live.map((f) => ` ${displayLateAuxPath}:${f.line}:${f.column} [${f.rule}] ${f.message}`);
|
|
1909
|
+
lateAuxDelivered += gate.live.length;
|
|
1910
|
+
// @delivery-surface: runtime-turn:late-auxiliary-findings
|
|
1911
|
+
advisoryParts.push(`🕐 Late auxiliary diagnostics (${pair.serverId} answered after its grace window):\n${lines.join("\n")}`);
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
}
|
|
1915
|
+
catch (err) {
|
|
1916
|
+
dbg(`turn_end: late-auxiliary probe failed: ${err}`);
|
|
1917
|
+
}
|
|
1918
|
+
logLatency({
|
|
1919
|
+
type: "phase",
|
|
1920
|
+
toolName: "turn_end",
|
|
1921
|
+
filePath: cwd,
|
|
1922
|
+
phase: "late_auxiliary_findings",
|
|
1923
|
+
durationMs: Date.now() - lateAuxStart,
|
|
1924
|
+
metadata: {
|
|
1925
|
+
pending: drainedPairs.length,
|
|
1926
|
+
delivered: lateAuxDelivered,
|
|
1927
|
+
stale: lateAuxStale,
|
|
1928
|
+
missing: lateAuxMissing,
|
|
1929
|
+
rearmed: lateAuxRearmed,
|
|
1930
|
+
clientGone: lateAuxClientGone,
|
|
1931
|
+
probeFailed: lateAuxProbeFailed,
|
|
1932
|
+
},
|
|
1933
|
+
});
|
|
1934
|
+
}
|
|
1794
1935
|
const labeledAdvisoryParts = advisoryParts.map((p) => `ℹ️ Advisory — no action required this turn:\n${p}`);
|
|
1795
1936
|
// Stale-secret parts sit between the two tiers and are NOT relabelled — they
|
|
1796
1937
|
// ship the imperative preamble they were built with (#1622 review M2).
|
|
@@ -34,9 +34,7 @@ export class RustClient {
|
|
|
34
34
|
availability;
|
|
35
35
|
log;
|
|
36
36
|
constructor(verbose = false) {
|
|
37
|
-
this.log = verbose
|
|
38
|
-
? createSubsystemLogger("rust")
|
|
39
|
-
: () => { };
|
|
37
|
+
this.log = verbose ? createSubsystemLogger("rust") : () => { };
|
|
40
38
|
this.availability = createToolchainAvailability({
|
|
41
39
|
tool: "cargo",
|
|
42
40
|
label: "Cargo",
|
|
@@ -37,6 +37,38 @@ export function hasSpawnFailureKind(error, kind) {
|
|
|
37
37
|
"kind" in error &&
|
|
38
38
|
error.kind === kind);
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* #2010: derive teardown evidence from observed timestamps.
|
|
42
|
+
*
|
|
43
|
+
* Pure by design so every branch is deterministically unit-testable,
|
|
44
|
+
* including the natural-exit-at-budget-expiry race where the timeout
|
|
45
|
+
* callback arms a kill against an already-dead child.
|
|
46
|
+
*
|
|
47
|
+
* - No recorded kill start (the guard saw the child already dying), no
|
|
48
|
+
* observed death at all, or death PREDATING the kill start: the child
|
|
49
|
+
* left on its own -> "exited", ms 0. Claiming a kill we cannot
|
|
50
|
+
* distinguish from a natural exit would be invented evidence.
|
|
51
|
+
* - Death observed after the kill started: "escalate-kill" when the
|
|
52
|
+
* SIGKILL escalation fired, otherwise "killed-by-signal"; ms is the
|
|
53
|
+
* observed gap (floor 0 - clock jitter must never produce a negative).
|
|
54
|
+
*/
|
|
55
|
+
export function resolveTeardownOutcome(input) {
|
|
56
|
+
// Another path (abort / output-limit) owns this death: emitting teardown
|
|
57
|
+
// evidence here would describe a kill this timeout didn't perform.
|
|
58
|
+
if (input.killStartedAtMs === undefined ||
|
|
59
|
+
input.deathObservedAtMs === undefined) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
// True natural-exit race: the child beat the budget-expired kill by a
|
|
63
|
+
// hair - death observed before (or exactly at) the kill start.
|
|
64
|
+
if (input.deathObservedAtMs <= input.killStartedAtMs) {
|
|
65
|
+
return { ms: 0, outcome: "exited" };
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
ms: Math.max(0, input.deathObservedAtMs - input.killStartedAtMs),
|
|
69
|
+
outcome: input.escalated ? "escalate-kill" : "killed-by-signal",
|
|
70
|
+
};
|
|
71
|
+
}
|
|
40
72
|
function toError(error) {
|
|
41
73
|
return error instanceof Error ? error : new Error(String(error));
|
|
42
74
|
}
|
|
@@ -74,7 +106,12 @@ function cwdIsUnresolvableSync(cwd) {
|
|
|
74
106
|
*/
|
|
75
107
|
function commandProbablyPresent(command) {
|
|
76
108
|
const exts = process.platform === "win32"
|
|
77
|
-
? [
|
|
109
|
+
? [
|
|
110
|
+
"",
|
|
111
|
+
...(process.env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD")
|
|
112
|
+
.split(";")
|
|
113
|
+
.filter(Boolean),
|
|
114
|
+
]
|
|
78
115
|
: [""];
|
|
79
116
|
const existsWithExt = (base) => {
|
|
80
117
|
for (const ext of exts) {
|
|
@@ -192,7 +229,15 @@ function killPidTreeSync(pid) {
|
|
|
192
229
|
return;
|
|
193
230
|
}
|
|
194
231
|
try {
|
|
195
|
-
process
|
|
232
|
+
// #2026: negative pid = whole process group (POSIX children spawn
|
|
233
|
+
// detached), reaching grandchildren too. Any failure (ESRCH = already
|
|
234
|
+
// gone, EPERM = raced) falls through to the direct-child attempt.
|
|
235
|
+
try {
|
|
236
|
+
process.kill(-pid, "SIGKILL");
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
process.kill(pid, "SIGKILL");
|
|
240
|
+
}
|
|
196
241
|
}
|
|
197
242
|
catch {
|
|
198
243
|
// Child already exited.
|
|
@@ -268,10 +313,16 @@ function cmdEscapeArg(arg) {
|
|
|
268
313
|
* that already worked. The `chcp 65001` prefix forces the UTF-8 code page (so
|
|
269
314
|
* tool output isn't mangled by the system code page) and, as a side benefit,
|
|
270
315
|
* keeps the (possibly quoted) command off the front of the line, avoiding
|
|
271
|
-
* cmd.exe's `/s` outer-quote-stripping quirk.
|
|
316
|
+
* cmd.exe's `/s` outer-quote-stripping quirk. #2023: chcp is invoked via its
|
|
317
|
+
* absolute `%SystemRoot%\System32\chcp.com` path and chained with `&`, not
|
|
318
|
+
* `&&` — a child environment whose PATH cannot resolve System32 used to fail
|
|
319
|
+
* the bare `chcp` lookup, and `&&` then short-circuited EVERY .cmd/.bat spawn
|
|
320
|
+
* into exit 1 with empty output. With the pin plus `&`, even a chcp failure
|
|
321
|
+
* can never suppress the real command.
|
|
272
322
|
*/
|
|
273
323
|
export function buildWindowsShellCommand(command, args) {
|
|
274
|
-
|
|
324
|
+
const chcp = `${process.env.SystemRoot ?? "C:\\Windows"}\\System32\\chcp.com`;
|
|
325
|
+
return `${chcp} 65001 >nul 2>&1 & ${[command, ...args].map(cmdEscapeArg).join(" ")}`;
|
|
275
326
|
}
|
|
276
327
|
/**
|
|
277
328
|
* The extensions this resolver treats as executable suffixes on their own,
|
|
@@ -859,6 +910,15 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
859
910
|
// a ref'd 1s timer that outlives the child it was escalating against
|
|
860
911
|
// would keep a one-shot `pi --print` process alive for up to 1s.
|
|
861
912
|
let escalationTimer;
|
|
913
|
+
let teardownStartedAtMs;
|
|
914
|
+
let teardownEscalated = false;
|
|
915
|
+
// #2010: teardown evidence for the spawn's OWN timeout. The wall clock
|
|
916
|
+
// starts when the budget expires and the tree-kill is issued, and stops
|
|
917
|
+
// when the process tree is observed dead (`await killPromise` settles)
|
|
918
|
+
// - measured SEPARATELY from the budget itself, so a slow teardown is
|
|
919
|
+
// visible instead of silently inflating "how long the tool ran".
|
|
920
|
+
// `teardownEscalated` names whether SIGTERM sufficed or the SIGKILL
|
|
921
|
+
// escalation fired (POSIX; Windows taskkill /F is always forceful).
|
|
862
922
|
// #1114: `child.killed` is set by Node the moment `kill()` successfully
|
|
863
923
|
// SENDS a signal, not when the child actually dies — so gating the
|
|
864
924
|
// escalation on `!child.killed` right after a successful `SIGTERM` send
|
|
@@ -994,6 +1054,14 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
994
1054
|
return;
|
|
995
1055
|
}
|
|
996
1056
|
let child;
|
|
1057
|
+
// #2026: on POSIX, run the child in its OWN process group (detached).
|
|
1058
|
+
// killTree/killPidTreeSync then signal the whole GROUP (-pid), which
|
|
1059
|
+
// makes grandchildren (npm -> node, sh -> sleep, etc.) die with their
|
|
1060
|
+
// tool instead of surviving every timeout as orphans. Detachment stops
|
|
1061
|
+
// direct terminal-signal delivery, so EVERY POSIX pid registers for
|
|
1062
|
+
// lifetime cleanup - pi's signal/exit handlers forward the kill,
|
|
1063
|
+
// preserving die-with-host semantics.
|
|
1064
|
+
const posixProcessGroup = process.platform !== "win32";
|
|
997
1065
|
try {
|
|
998
1066
|
child = spawn(spawnCmd, spawnArgs, {
|
|
999
1067
|
cwd: spawnCwd,
|
|
@@ -1001,6 +1069,7 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
1001
1069
|
windowsHide: true,
|
|
1002
1070
|
shell: false,
|
|
1003
1071
|
windowsVerbatimArguments,
|
|
1072
|
+
detached: posixProcessGroup,
|
|
1004
1073
|
});
|
|
1005
1074
|
}
|
|
1006
1075
|
catch (err) {
|
|
@@ -1022,7 +1091,10 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
1022
1091
|
}));
|
|
1023
1092
|
return;
|
|
1024
1093
|
}
|
|
1025
|
-
if (options?.lifetimeCoupled
|
|
1094
|
+
if (child.pid && (posixProcessGroup || options?.lifetimeCoupled)) {
|
|
1095
|
+
// #2026: POSIX registers unconditionally - detached children no
|
|
1096
|
+
// longer receive terminal signals directly, so the lifetime
|
|
1097
|
+
// cleanup's signal forwarding IS their die-with-host path.
|
|
1026
1098
|
installLifetimeCleanup();
|
|
1027
1099
|
lifetimeState.pids.add(child.pid);
|
|
1028
1100
|
}
|
|
@@ -1066,11 +1138,56 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
1066
1138
|
child.kill("SIGKILL");
|
|
1067
1139
|
}
|
|
1068
1140
|
}
|
|
1141
|
+
else if (posixProcessGroup && child.pid && child.pid > 0) {
|
|
1142
|
+
// #2026: signal the whole process group. Grandchildren spawned
|
|
1143
|
+
// by the tool share its group, so one signal reaches the whole
|
|
1144
|
+
// tree; a negative-pid ESRCH means it already exited.
|
|
1145
|
+
const pgid = -child.pid;
|
|
1146
|
+
try {
|
|
1147
|
+
process.kill(pgid, "SIGTERM");
|
|
1148
|
+
}
|
|
1149
|
+
catch {
|
|
1150
|
+
child.kill("SIGTERM");
|
|
1151
|
+
}
|
|
1152
|
+
// #2027 round-1: gate the SIGKILL escalation on GROUP liveness,
|
|
1153
|
+
// not direct-child death - a tool can exit instantly on SIGTERM
|
|
1154
|
+
// while a SIGTERM-hardy grandchild keeps the group alive. The
|
|
1155
|
+
// timer stays REF'D for group mode (max 1s tail after resolve):
|
|
1156
|
+
// it is the only backstop for this group once finalize deletes
|
|
1157
|
+
// the pid from lifetimeState.
|
|
1158
|
+
escalationTimer = setTimeout(() => {
|
|
1159
|
+
let groupAlive = true;
|
|
1160
|
+
try {
|
|
1161
|
+
process.kill(pgid, 0);
|
|
1162
|
+
}
|
|
1163
|
+
catch {
|
|
1164
|
+
groupAlive = false;
|
|
1165
|
+
}
|
|
1166
|
+
if (!groupAlive)
|
|
1167
|
+
return;
|
|
1168
|
+
teardownEscalated = true;
|
|
1169
|
+
logLatency({
|
|
1170
|
+
type: "phase",
|
|
1171
|
+
phase: "spawn_group_kill_escalation",
|
|
1172
|
+
filePath: "",
|
|
1173
|
+
durationMs: 0,
|
|
1174
|
+
metadata: { pgid: child.pid },
|
|
1175
|
+
});
|
|
1176
|
+
try {
|
|
1177
|
+
process.kill(pgid, "SIGKILL");
|
|
1178
|
+
}
|
|
1179
|
+
catch {
|
|
1180
|
+
// Raced with group exit.
|
|
1181
|
+
}
|
|
1182
|
+
}, 1000);
|
|
1183
|
+
}
|
|
1069
1184
|
else {
|
|
1070
1185
|
child.kill("SIGTERM");
|
|
1071
1186
|
escalationTimer = setTimeout(() => {
|
|
1072
|
-
if (!closed)
|
|
1187
|
+
if (!closed) {
|
|
1188
|
+
teardownEscalated = true;
|
|
1073
1189
|
child.kill("SIGKILL");
|
|
1190
|
+
}
|
|
1074
1191
|
}, 1000);
|
|
1075
1192
|
}
|
|
1076
1193
|
};
|
|
@@ -1119,14 +1236,21 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
1119
1236
|
// boolean here, before any await, means `waitForPipeIdle` can check
|
|
1120
1237
|
// "did close already happen" synchronously the moment it runs.
|
|
1121
1238
|
let closeSeen = false;
|
|
1239
|
+
// #2010: WHEN death was observed - the stop-clock for teardown evidence
|
|
1240
|
+
// and the discriminator for its outcome. A close that predates the
|
|
1241
|
+
// budget-expired kill means the child exited on its own ("exited"), no
|
|
1242
|
+
// matter that the timer callback raced and armed a kill anyway.
|
|
1243
|
+
let closedAtMs;
|
|
1122
1244
|
child.on("close", () => {
|
|
1123
1245
|
closeSeen = true;
|
|
1246
|
+
closedAtMs ??= Date.now();
|
|
1124
1247
|
});
|
|
1125
1248
|
// Timeout handling - KILL the process, don't just abandon it
|
|
1126
1249
|
const timeoutId = setTimeout(() => {
|
|
1127
1250
|
timedOut = true;
|
|
1128
1251
|
if (!killed && !child.killed) {
|
|
1129
1252
|
killed = true;
|
|
1253
|
+
teardownStartedAtMs = Date.now();
|
|
1130
1254
|
killPromise = killTree();
|
|
1131
1255
|
}
|
|
1132
1256
|
}, timeout);
|
|
@@ -1267,11 +1391,14 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
1267
1391
|
await killPromise;
|
|
1268
1392
|
if (resolved)
|
|
1269
1393
|
return;
|
|
1270
|
-
// #1109: the child has exited
|
|
1271
|
-
//
|
|
1272
|
-
//
|
|
1273
|
-
|
|
1394
|
+
// #1109: the child has exited - clear the non-Windows escalation
|
|
1395
|
+
// timer so it doesn't linger as a ref'd handle. #2027 EXCEPTION:
|
|
1396
|
+
// in POSIX group mode the timer is the liveness-gated SIGKILL
|
|
1397
|
+
// backstop for SIGTERM-hardy grandchildren; it stays armed and
|
|
1398
|
+
// self-cleans within 1s of firing (max 1s ref'd tail).
|
|
1399
|
+
if (escalationTimer && !posixProcessGroup) {
|
|
1274
1400
|
clearTimeout(escalationTimer);
|
|
1401
|
+
}
|
|
1275
1402
|
// #1673 review F1: latch the verdict as DECIDED here, before the
|
|
1276
1403
|
// idle-pipe wait — not after it. `code`/`signal`/`timedOut`/`aborted`
|
|
1277
1404
|
// are already fixed by this point (they don't change during the
|
|
@@ -1294,6 +1421,15 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
1294
1421
|
const signalInfo = signal ? { signal } : {};
|
|
1295
1422
|
if (timedOut) {
|
|
1296
1423
|
const cause = new Error(`Process timed out after ${timeout}ms (killed with ${signal || "SIGTERM"})`);
|
|
1424
|
+
// #2010: teardown evidence lives ONLY on the timeout path - it
|
|
1425
|
+
// describes how long the tree took to die after the budget
|
|
1426
|
+
// expired, and how it died ("exited" = the child beat the signal;
|
|
1427
|
+
// "killed-by-signal" / "escalate-kill" = how WE ended it).
|
|
1428
|
+
const timeoutTeardown = resolveTeardownOutcome({
|
|
1429
|
+
killStartedAtMs: teardownStartedAtMs,
|
|
1430
|
+
deathObservedAtMs: closedAtMs,
|
|
1431
|
+
escalated: teardownEscalated,
|
|
1432
|
+
});
|
|
1297
1433
|
resolve({
|
|
1298
1434
|
stdout,
|
|
1299
1435
|
stderr,
|
|
@@ -1301,6 +1437,7 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
1301
1437
|
error: cause,
|
|
1302
1438
|
failure: "timeout",
|
|
1303
1439
|
...signalInfo,
|
|
1440
|
+
...(timeoutTeardown && { timeoutTeardown }),
|
|
1304
1441
|
spawnFailure: new SpawnFailureError("timeout", cause.message, cause),
|
|
1305
1442
|
...outputInfo,
|
|
1306
1443
|
resourceUsage,
|
|
@@ -1383,8 +1520,10 @@ export async function safeSpawnAsync(command, args, options) {
|
|
|
1383
1520
|
closed = true;
|
|
1384
1521
|
clearTimeout(timeoutId);
|
|
1385
1522
|
abortSignal?.removeEventListener("abort", onAbort);
|
|
1386
|
-
|
|
1523
|
+
// #2027: group-mode timer stays armed as the grandchild backstop.
|
|
1524
|
+
if (escalationTimer && !posixProcessGroup) {
|
|
1387
1525
|
clearTimeout(escalationTimer);
|
|
1526
|
+
}
|
|
1388
1527
|
if (child.pid)
|
|
1389
1528
|
lifetimeState.pids.delete(child.pid);
|
|
1390
1529
|
const resourceUsage = finishResourceUsage();
|
|
@@ -89,9 +89,7 @@ export class SecurityScanClient {
|
|
|
89
89
|
*/
|
|
90
90
|
constructor(toolName, verbose = false) {
|
|
91
91
|
this.toolName = toolName;
|
|
92
|
-
this.log = verbose
|
|
93
|
-
? createSubsystemLogger(toolName)
|
|
94
|
-
: () => { };
|
|
92
|
+
this.log = verbose ? createSubsystemLogger(toolName) : () => { };
|
|
95
93
|
}
|
|
96
94
|
/**
|
|
97
95
|
* Resolve (once) whether the scanner is usable, sharing the probe promise
|
|
@@ -31,7 +31,9 @@ export function formatSlopScoreSummary(summary) {
|
|
|
31
31
|
}
|
|
32
32
|
const topRules = summary.ruleCounts.slice(0, 3);
|
|
33
33
|
const detail = topRules.length > 0
|
|
34
|
-
? " (" +
|
|
34
|
+
? " (" +
|
|
35
|
+
topRules.map((entry) => entry.ruleId + " ×" + entry.count).join(", ") +
|
|
36
|
+
")"
|
|
35
37
|
: "";
|
|
36
38
|
return `Slop score: ${summary.scorePerKloc.toFixed(1)}/KLOC${detail}`;
|
|
37
39
|
}
|
|
@@ -151,9 +151,7 @@ export class SgRunner {
|
|
|
151
151
|
*/
|
|
152
152
|
sweepDurablyMissing = [];
|
|
153
153
|
constructor(verbose = false) {
|
|
154
|
-
this.log = verbose
|
|
155
|
-
? createSubsystemLogger("sg-runner")
|
|
156
|
-
: () => { };
|
|
154
|
+
this.log = verbose ? createSubsystemLogger("sg-runner") : () => { };
|
|
157
155
|
}
|
|
158
156
|
/**
|
|
159
157
|
* Check if ast-grep CLI is available, auto-install if not.
|
|
@@ -72,9 +72,9 @@ export function sourceTwinCandidates(filePath) {
|
|
|
72
72
|
: ext === ".cjs"
|
|
73
73
|
? [".cts", ".ts", ".tsx", ".mts"]
|
|
74
74
|
: ext === ".jsx"
|
|
75
|
-
// Deliberately retain the broad fallback: a .jsx next to a .ts
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
? // Deliberately retain the broad fallback: a .jsx next to a .ts
|
|
76
|
+
// is treated as a build artifact even without a .tsx sibling.
|
|
77
|
+
[".tsx", ".ts", ".mts", ".cts"]
|
|
78
78
|
: ext === ".js"
|
|
79
79
|
? [".ts", ".tsx", ".mts", ".cts"]
|
|
80
80
|
: [];
|
|
@@ -251,7 +251,7 @@ function classifySkipGeneratedOrArtifact(filePath, options) {
|
|
|
251
251
|
});
|
|
252
252
|
}
|
|
253
253
|
function shouldSkipGeneratedOrArtifact(filePath, options) {
|
|
254
|
-
return classifySkipGeneratedOrArtifact(filePath, options).verdict === "generated";
|
|
254
|
+
return (classifySkipGeneratedOrArtifact(filePath, options).verdict === "generated");
|
|
255
255
|
}
|
|
256
256
|
/**
|
|
257
257
|
* Extract the basename (filename without extension) from a path.
|
|
@@ -281,7 +281,8 @@ export function findSourceSibling(filePath, probeCache) {
|
|
|
281
281
|
const dir = getDir(filePath);
|
|
282
282
|
const base = getBasename(filePath);
|
|
283
283
|
for (const [sourceExt, shadowedExts] of Object.entries(SOURCE_PRECEDENCE)) {
|
|
284
|
-
if (!sourceExtsForCompiledExt(sourceExt).length &&
|
|
284
|
+
if (!sourceExtsForCompiledExt(sourceExt).length &&
|
|
285
|
+
shadowedExts.includes(ext)) {
|
|
285
286
|
const siblingPath = path.join(dir, base + sourceExt);
|
|
286
287
|
if (probeExists(siblingPath, probeCache))
|
|
287
288
|
return siblingPath;
|
|
@@ -296,7 +297,10 @@ export function findSourceSibling(filePath, probeCache) {
|
|
|
296
297
|
* Omit for the original, uncached behavior.
|
|
297
298
|
*/
|
|
298
299
|
function sourceExtsForCompiledExt(sourceExt) {
|
|
299
|
-
return sourceExt === ".ts" ||
|
|
300
|
+
return sourceExt === ".ts" ||
|
|
301
|
+
sourceExt === ".tsx" ||
|
|
302
|
+
sourceExt === ".mts" ||
|
|
303
|
+
sourceExt === ".cts"
|
|
300
304
|
? [sourceExt]
|
|
301
305
|
: [];
|
|
302
306
|
}
|
|
@@ -31,7 +31,7 @@ import * as fs from "node:fs";
|
|
|
31
31
|
import * as path from "node:path";
|
|
32
32
|
import { isExcludedDirName } from "./file-utils.js";
|
|
33
33
|
import { isGeneratedArtifactDirectoryName } from "./generated-artifacts.js";
|
|
34
|
-
import { createDeadline, yieldIfOverBudget
|
|
34
|
+
import { createDeadline, yieldIfOverBudget } from "./cooperative-budget.js";
|
|
35
35
|
/**
|
|
36
36
|
* Read a directory's entries, returning `[]` for a permission-denied or
|
|
37
37
|
* missing directory instead of throwing. Shared by every walker below — a
|