pi-lens 4.2.1 → 4.4.0
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/CHANGELOG.md +1562 -0
- package/README.md +157 -24
- package/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/dist/chunk-22AVIGXS.js +560 -0
- package/dist/chunk-27BBHSZC.js +106 -0
- package/dist/chunk-2BEMIWEW.js +51 -0
- package/dist/chunk-2EECBNC5.js +89 -0
- package/dist/chunk-34U7PLGE.js +23 -0
- package/dist/chunk-3I5QFT3N.js +181 -0
- package/dist/chunk-3MED75HT.js +37 -0
- package/dist/chunk-47D2BO4S.js +87 -0
- package/dist/chunk-4RERDEXR.js +348 -0
- package/dist/chunk-4W2PLC4J.js +27 -0
- package/dist/chunk-52H5B5TC.js +202 -0
- package/dist/chunk-54B42YRX.js +27 -0
- package/dist/chunk-5RXBNSW2.js +266 -0
- package/dist/chunk-5THXD6X5.js +201 -0
- package/dist/chunk-5W3R6LFT.js +24 -0
- package/dist/chunk-5ZEJHV35.js +341 -0
- package/dist/chunk-6P62QVEA.js +118 -0
- package/dist/chunk-6QIUX4EP.js +459 -0
- package/dist/chunk-6VCD4VKZ.js +78 -0
- package/dist/chunk-7F72PXY2.js +326 -0
- package/dist/chunk-7FBF7NPR.js +998 -0
- package/dist/chunk-7U2IDNXN.js +37 -0
- package/dist/chunk-ABBOA7UD.js +157 -0
- package/dist/chunk-AHDW3GPE.js +50 -0
- package/dist/chunk-AJ3QXTRQ.js +756 -0
- package/dist/chunk-AJVLWNFN.js +1610 -0
- package/dist/chunk-AJXODZY6.js +112 -0
- package/dist/chunk-ARFCXG7S.js +84 -0
- package/dist/chunk-AS44CFQ4.js +708 -0
- package/dist/chunk-AWE5TMPO.js +38 -0
- package/dist/chunk-B3I2UUT4.js +4692 -0
- package/dist/chunk-BRJKOBZP.js +331 -0
- package/dist/chunk-BW5KFIQC.js +59 -0
- package/dist/chunk-C2AUYXQH.js +149 -0
- package/dist/chunk-CGGAIP7J.js +29 -0
- package/dist/chunk-D6QS3U6M.js +30 -0
- package/dist/chunk-DFVMIKMQ.js +349 -0
- package/dist/chunk-DIULIWKU.js +169 -0
- package/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/dist/chunk-E2WFBRHM.js +213 -0
- package/dist/chunk-E4MAEDPM.js +50 -0
- package/dist/chunk-EOKRQ3SA.js +30 -0
- package/dist/chunk-F3AU2TMM.js +2626 -0
- package/dist/chunk-F3P7VQ7H.js +170 -0
- package/dist/chunk-FC4RP4I2.js +12 -0
- package/dist/chunk-FJNKANOS.js +32 -0
- package/dist/chunk-GUOGVTCQ.js +146 -0
- package/dist/chunk-GVXA6CCE.js +18 -0
- package/dist/chunk-HHYAELLJ.js +2334 -0
- package/dist/chunk-HMFXILPV.js +83 -0
- package/dist/chunk-HVUZXSWK.js +421 -0
- package/dist/chunk-HWBZIGMJ.js +62 -0
- package/dist/chunk-I3R7GKDR.js +17 -0
- package/dist/chunk-I7SPGOWI.js +55 -0
- package/dist/chunk-IIXOAGHR.js +38 -0
- package/dist/chunk-IVP5KAB7.js +2250 -0
- package/dist/chunk-IXEBJSUE.js +22 -0
- package/dist/chunk-JOLITGCC.js +27 -0
- package/dist/chunk-K6VYLB2U.js +145 -0
- package/dist/chunk-LJDODBBZ.js +78 -0
- package/dist/chunk-LNAKEO63.js +78 -0
- package/dist/chunk-LSMJ6KBE.js +4139 -0
- package/dist/chunk-LW6XKDZQ.js +5565 -0
- package/dist/chunk-N3YQJI6O.js +899 -0
- package/dist/chunk-NABLC7W3.js +148 -0
- package/dist/chunk-NKOUFPQF.js +659 -0
- package/dist/chunk-NL5GLMFI.js +211 -0
- package/dist/chunk-NMABWBZN.js +327 -0
- package/dist/chunk-NTHH2J74.js +27 -0
- package/dist/chunk-NTUJEGDZ.js +59 -0
- package/dist/chunk-NXL4FFQQ.js +47 -0
- package/dist/chunk-NXPS2L6U.js +466 -0
- package/dist/chunk-O5WILGMI.js +42 -0
- package/dist/chunk-O6TQT6RI.js +48 -0
- package/dist/chunk-OAXNDZJ7.js +323 -0
- package/dist/chunk-ODEEOXPH.js +44 -0
- package/dist/chunk-OQGFCZJ4.js +4533 -0
- package/dist/chunk-ORTMY4Q4.js +282 -0
- package/dist/chunk-OS32RNR2.js +442 -0
- package/dist/chunk-PAK6IDME.js +189 -0
- package/dist/chunk-PWFHBTSF.js +406 -0
- package/dist/chunk-Q5U6FMDI.js +2352 -0
- package/dist/chunk-QOZXJ4NA.js +3364 -0
- package/dist/chunk-QYF5S6P6.js +45 -0
- package/dist/chunk-RIISMHKN.js +36 -0
- package/dist/chunk-RPD4ZSB7.js +25 -0
- package/dist/chunk-RPD5K5NC.js +79 -0
- package/dist/chunk-RUOG5D2C.js +262 -0
- package/dist/chunk-T4ERT73Y.js +599 -0
- package/dist/chunk-T6D4Q4AQ.js +54 -0
- package/dist/chunk-TGPXLY2J.js +391 -0
- package/dist/chunk-TLGFBM3F.js +12116 -0
- package/dist/chunk-TO6WL3GM.js +88 -0
- package/dist/chunk-TT22N74J.js +517 -0
- package/dist/chunk-TVN5N6GY.js +21216 -0
- package/dist/chunk-U3VGR4VU.js +308 -0
- package/dist/chunk-UK3CMEAL.js +1250 -0
- package/dist/chunk-UOPVJQ4N.js +103 -0
- package/dist/chunk-UXVNL3D7.js +23 -0
- package/dist/chunk-UY752QSN.js +45 -0
- package/dist/chunk-V5PXFSZK.js +188 -0
- package/dist/chunk-V7R425XG.js +398 -0
- package/dist/chunk-VCSRSYLF.js +81 -0
- package/dist/chunk-VD4JQCQC.js +162 -0
- package/dist/chunk-VDBPVIKD.js +62 -0
- package/dist/chunk-VHQLPIRJ.js +114 -0
- package/dist/chunk-VN2AXLEX.js +5414 -0
- package/dist/chunk-VNMT7C64.js +478 -0
- package/dist/chunk-WONERJTP.js +309 -0
- package/dist/chunk-XECLWQZN.js +85 -0
- package/dist/chunk-XIMYZ3JA.js +27 -0
- package/dist/chunk-XK4CIILI.js +144 -0
- package/dist/chunk-Y4T27COV.js +562 -0
- package/dist/chunk-YGVYKNSN.js +1860 -0
- package/dist/chunk-YLF3PPT5.js +308 -0
- package/dist/chunk-YSNFMJKN.js +14 -0
- package/dist/chunk-Z3CCVDUB.js +76 -0
- package/dist/chunk-Z54ZSOBZ.js +61 -0
- package/dist/chunk-ZAWW3AF6.js +97 -0
- package/dist/chunk-ZMOL6RQC.js +167 -0
- package/dist/index.js +19039 -8956
- package/dist/mcp/analyze-cli.js +186 -228
- package/dist/mcp/cli.js +137 -98
- package/dist/mcp/server.js +22592 -1564
- package/dist/mcp/worker.js +97 -38
- package/dist/probes/installer.js +135 -0
- package/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/dist/workers/review-graph-persist-worker.js +15 -0
- package/docs/adr/0001-stale-advisory-live-arm.md +29 -0
- package/docs/adr/0002-workspace-hash-rendezvous.md +30 -0
- package/docs/adr/0003-git-guard-latch-writer.md +203 -0
- package/docs/adr/0004-disposition-policy-seam.md +38 -0
- package/docs/adr/0005-tool-availability-enforcement-seam.md +29 -0
- package/docs/adr/0006-derived-state-benchmark-first.md +31 -0
- package/docs/adr/0007-end-to-end-witness-per-seam-slice.md +38 -0
- package/docs/adr/0008-turn-end-lane-interface.md +165 -0
- package/docs/adr/0009-reported-path-attribution.md +114 -0
- package/docs/adr/README.md +26 -0
- package/docs/agent-guide.md +13 -4
- package/docs/agent-tools.md +60 -1
- package/docs/ast-grep_rules_catalog.md +6 -4
- package/docs/configuration.md +75 -2
- package/docs/engineering-principles.md +202 -0
- package/docs/environment-variables.md +113 -6
- package/docs/features.md +10 -6
- package/docs/globalconfig.md +7 -1
- package/docs/io-bridge-v2-migration.md +94 -0
- package/docs/language-coverage.md +17 -0
- package/docs/lsp-capability-matrix.md +131 -32
- package/docs/lsp-idle-eviction.md +124 -0
- package/docs/mcp.md +21 -5
- package/docs/merge-queue-rollout.md +77 -0
- package/docs/pi-lens-fixer.md +161 -39
- package/docs/pi-lens-investigator.md +77 -20
- package/docs/pi-lens-merge-policy.md +694 -0
- package/docs/pi-lens-monitor.md +73 -7
- package/docs/pi-lens-retro.md +6 -4
- package/docs/pi-lens-reviewer.md +190 -34
- package/docs/pi-lens-subagent.md +247 -37
- package/docs/pi-lens-warden.md +18 -7
- package/docs/public-api-stability.md +56 -0
- package/docs/release-qa-baseline.md +86 -17
- package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/docs/servercapabilities.md +66 -52
- package/docs/settings.md +13 -3
- package/docs/subagent-compat.md +1 -1
- package/docs/usage.md +5 -1
- package/grammars/tree-sitter-bash.wasm +0 -0
- package/grammars/tree-sitter-bash.wasm.json +3 -3
- package/package.json +23 -9
- package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
- package/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
- package/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
- package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
- package/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
- package/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
- package/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
- package/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
- package/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
- package/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
- package/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
- package/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
- package/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/scripts/download-grammars.js +5 -0
- package/scripts/grammars.lock.json +6 -1
- package/scripts/install-selftest.mjs +38 -35
- package/scripts/lib/host-provided-deps.mjs +13 -4
- package/scripts/lib/web-tree-sitter-dir.mjs +141 -0
- package/dist/clients/actionable-warnings-logger.js +0 -35
- package/dist/clients/actionable-warnings.js +0 -1594
- package/dist/clients/advisory-provenance.js +0 -457
- package/dist/clients/agent-behavior-client.js +0 -147
- package/dist/clients/agent-nudge.js +0 -325
- package/dist/clients/analysed-root.js +0 -1
- package/dist/clients/ast-grep-client.js +0 -731
- package/dist/clients/ast-grep-rule-manager.js +0 -146
- package/dist/clients/ast-grep-tool-logger.js +0 -118
- package/dist/clients/ast-grep-types.js +0 -10
- package/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/dist/clients/atomic-write-staging.js +0 -75
- package/dist/clients/atomic-write.js +0 -189
- package/dist/clients/availability-probe-flight.js +0 -12
- package/dist/clients/bash-file-access.js +0 -1056
- package/dist/clients/biome-client.js +0 -357
- package/dist/clients/blocker-freshness.js +0 -837
- package/dist/clients/blocker-past-eof.js +0 -129
- package/dist/clients/bootstrap.js +0 -569
- package/dist/clients/bounded-cache.js +0 -190
- package/dist/clients/bounded-pid-file-lock.js +0 -202
- package/dist/clients/bounded-telemetry.js +0 -295
- package/dist/clients/build-identity.js +0 -95
- package/dist/clients/bundled-resource-health.js +0 -113
- package/dist/clients/bus-events-logger.js +0 -105
- package/dist/clients/bus-publish.js +0 -171
- package/dist/clients/cache/rule-cache.js +0 -190
- package/dist/clients/cache-manager.js +0 -465
- package/dist/clients/cache-observability.js +0 -1313
- package/dist/clients/call-graph.js +0 -852
- package/dist/clients/cargo-manifest.js +0 -422
- package/dist/clients/cascade-budget.js +0 -196
- package/dist/clients/cascade-format.js +0 -315
- package/dist/clients/cascade-logger.js +0 -31
- package/dist/clients/cascade-types.js +0 -9
- package/dist/clients/child-unref.js +0 -115
- package/dist/clients/code-quality-warnings.js +0 -286
- package/dist/clients/codebase-model.js +0 -173
- package/dist/clients/collateral-test-role.js +0 -40
- package/dist/clients/complexity-client.js +0 -462
- package/dist/clients/config-core/deny.js +0 -221
- package/dist/clients/config-core/index.js +0 -50
- package/dist/clients/config-core/merge.js +0 -357
- package/dist/clients/config-core/normalize.js +0 -340
- package/dist/clients/config-core/process-spec.js +0 -248
- package/dist/clients/config-core/provenance.js +0 -164
- package/dist/clients/config-core/records.js +0 -218
- package/dist/clients/config-core/resolve.js +0 -125
- package/dist/clients/config-core/safe-object.js +0 -78
- package/dist/clients/config-core/schema.js +0 -165
- package/dist/clients/config-diagnostic-codes.js +0 -283
- package/dist/clients/config-locations.js +0 -160
- package/dist/clients/config-resolve.js +0 -792
- package/dist/clients/config-schema.js +0 -251
- package/dist/clients/config-warn.js +0 -407
- package/dist/clients/console-guard-install.js +0 -26
- package/dist/clients/cooperative-budget.js +0 -42
- package/dist/clients/dead-code-client.js +0 -510
- package/dist/clients/dead-code-logger.js +0 -30
- package/dist/clients/deadline-utils.js +0 -280
- package/dist/clients/debug-handles.js +0 -211
- package/dist/clients/debug-heap.js +0 -174
- package/dist/clients/deferred-lsp-work.js +0 -106
- package/dist/clients/degradation-ledger.js +0 -396
- package/dist/clients/demoted-finding-render.js +0 -169
- package/dist/clients/dependency-checker.js +0 -862
- package/dist/clients/deps/ast-grep-napi.js +0 -22
- package/dist/clients/deps/js-yaml.js +0 -9
- package/dist/clients/deps/minimatch.js +0 -4
- package/dist/clients/deps/pi-tui.js +0 -14
- package/dist/clients/deps/typebox.js +0 -14
- package/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/dist/clients/deps/web-tree-sitter.js +0 -24
- package/dist/clients/diagnostic-dispositions.js +0 -594
- package/dist/clients/diagnostic-line-freshness.js +0 -305
- package/dist/clients/diagnostic-logger.js +0 -73
- package/dist/clients/diagnostic-tracker.js +0 -105
- package/dist/clients/diagnostics-publish.js +0 -230
- package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/dist/clients/dispatch/dispatcher.js +0 -1269
- package/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/dist/clients/dispatch/fact-runner.js +0 -30
- package/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/dist/clients/dispatch/fact-store.js +0 -377
- package/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/dist/clients/dispatch/facts/file-content.js +0 -19
- package/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/dist/clients/dispatch/finding-policy.js +0 -222
- package/dist/clients/dispatch/indent-detect.js +0 -411
- package/dist/clients/dispatch/inline-suppressions.js +0 -70
- package/dist/clients/dispatch/integration.js +0 -2377
- package/dist/clients/dispatch/lazy.js +0 -11
- package/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/dist/clients/dispatch/plan.js +0 -278
- package/dist/clients/dispatch/priorities.js +0 -20
- package/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/dist/clients/dispatch/rule-ignores.js +0 -62
- package/dist/clients/dispatch/rule-policy.js +0 -135
- package/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/dist/clients/dispatch/runner-context.js +0 -52
- package/dist/clients/dispatch/runners/actionlint.js +0 -113
- package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/dist/clients/dispatch/runners/biome-check.js +0 -283
- package/dist/clients/dispatch/runners/cpp-check.js +0 -236
- package/dist/clients/dispatch/runners/credo.js +0 -80
- package/dist/clients/dispatch/runners/cue-vet.js +0 -398
- package/dist/clients/dispatch/runners/dart-analyze.js +0 -202
- package/dist/clients/dispatch/runners/detekt.js +0 -169
- package/dist/clients/dispatch/runners/dotnet-build.js +0 -159
- package/dist/clients/dispatch/runners/elixir-check.js +0 -210
- package/dist/clients/dispatch/runners/eslint.js +0 -154
- package/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/dist/clients/dispatch/runners/gleam-check.js +0 -87
- package/dist/clients/dispatch/runners/go-vet.js +0 -90
- package/dist/clients/dispatch/runners/golangci-lint.js +0 -120
- package/dist/clients/dispatch/runners/hadolint.js +0 -79
- package/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/dist/clients/dispatch/runners/htmlhint.js +0 -108
- package/dist/clients/dispatch/runners/index.js +0 -108
- package/dist/clients/dispatch/runners/javac.js +0 -89
- package/dist/clients/dispatch/runners/ktlint.js +0 -136
- package/dist/clients/dispatch/runners/lsp.js +0 -378
- package/dist/clients/dispatch/runners/markdownlint.js +0 -160
- package/dist/clients/dispatch/runners/mypy.js +0 -101
- package/dist/clients/dispatch/runners/oxlint.js +0 -398
- package/dist/clients/dispatch/runners/php-lint.js +0 -62
- package/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/dist/clients/dispatch/runners/pyright.js +0 -169
- package/dist/clients/dispatch/runners/rubocop.js +0 -90
- package/dist/clients/dispatch/runners/ruff.js +0 -89
- package/dist/clients/dispatch/runners/rust-clippy.js +0 -251
- package/dist/clients/dispatch/runners/shellcheck.js +0 -169
- package/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/dist/clients/dispatch/runners/spellcheck.js +0 -121
- package/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/dist/clients/dispatch/runners/sqlfluff.js +0 -174
- package/dist/clients/dispatch/runners/stylelint.js +0 -158
- package/dist/clients/dispatch/runners/swiftlint.js +0 -154
- package/dist/clients/dispatch/runners/taplo.js +0 -168
- package/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/dist/clients/dispatch/runners/tflint.js +0 -110
- package/dist/clients/dispatch/runners/tree-sitter.js +0 -620
- package/dist/clients/dispatch/runners/trivy-config.js +0 -247
- package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -85
- package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/dist/clients/dispatch/runners/utils.js +0 -15
- package/dist/clients/dispatch/runners/vale.js +0 -116
- package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/dist/clients/dispatch/runners/yamllint.js +0 -85
- package/dist/clients/dispatch/runners/zig-check.js +0 -91
- package/dist/clients/dispatch/suppress-writer.js +0 -69
- package/dist/clients/dispatch/tool-profile.js +0 -30
- package/dist/clients/dispatch/types.js +0 -21
- package/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/dist/clients/disposition-logger.js +0 -32
- package/dist/clients/disposition-publish.js +0 -124
- package/dist/clients/durable-store.js +0 -97
- package/dist/clients/effective-config.js +0 -413
- package/dist/clients/env-utils.js +0 -83
- package/dist/clients/error-class.js +0 -23
- package/dist/clients/eval-timestamp.js +0 -17
- package/dist/clients/event-loop-hold.js +0 -274
- package/dist/clients/event-loop-monitor.js +0 -250
- package/dist/clients/extension-log.js +0 -504
- package/dist/clients/extension-mode.js +0 -73
- package/dist/clients/feature-hints.js +0 -103
- package/dist/clients/file-kinds.js +0 -412
- package/dist/clients/file-role.js +0 -134
- package/dist/clients/file-time.js +0 -160
- package/dist/clients/file-utils.js +0 -1032
- package/dist/clients/finding-delivery-gate.js +0 -463
- package/dist/clients/finding-identity.js +0 -88
- package/dist/clients/fix-worklog.js +0 -103
- package/dist/clients/format-events-publish.js +0 -343
- package/dist/clients/format-service.js +0 -222
- package/dist/clients/formatters-lazy.js +0 -9
- package/dist/clients/formatters.js +0 -1994
- package/dist/clients/freshness-cadence.js +0 -17
- package/dist/clients/freshness.js +0 -38
- package/dist/clients/generated-artifacts.js +0 -394
- package/dist/clients/generation-guard.js +0 -215
- package/dist/clients/git-guard.js +0 -923
- package/dist/clients/git-tracked-ignore.js +0 -243
- package/dist/clients/gitleaks-client.js +0 -509
- package/dist/clients/go-client.js +0 -104
- package/dist/clients/govulncheck-client.js +0 -605
- package/dist/clients/gradle-ktfmt-style.js +0 -252
- package/dist/clients/grammar-source.js +0 -465
- package/dist/clients/gzip-stage-write.js +0 -135
- package/dist/clients/hashline-anchor.js +0 -424
- package/dist/clients/hook-budgets.js +0 -76
- package/dist/clients/host-edit-normalize.js +0 -140
- package/dist/clients/host-ports.js +0 -39
- package/dist/clients/indent-retarget.js +0 -154
- package/dist/clients/install-diagnostics.js +0 -143
- package/dist/clients/installer/index.js +0 -5167
- package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/dist/clients/instance-reaper-state.js +0 -7
- package/dist/clients/instance-reaper.js +0 -1137
- package/dist/clients/instance-registry-lock.js +0 -145
- package/dist/clients/instance-registry.js +0 -773
- package/dist/clients/jscpd-client.js +0 -370
- package/dist/clients/json-cache-read.js +0 -65
- package/dist/clients/knip-client.js +0 -788
- package/dist/clients/language-policy.js +0 -252
- package/dist/clients/language-profile.js +0 -361
- package/dist/clients/language-registry.js +0 -603
- package/dist/clients/latency-logger.js +0 -719
- package/dist/clients/lazy-import.js +0 -21
- package/dist/clients/ledger-bounds.js +0 -54
- package/dist/clients/lens-config.js +0 -346
- package/dist/clients/lens-engine.js +0 -358
- package/dist/clients/lens-events.js +0 -125
- package/dist/clients/lens-flag-registry.js +0 -467
- package/dist/clients/lens-map.js +0 -1156
- package/dist/clients/live-bus-emitter.js +0 -74
- package/dist/clients/log-cleanup.js +0 -222
- package/dist/clients/lsp/aggregation.js +0 -178
- package/dist/clients/lsp/cascade-tier.js +0 -421
- package/dist/clients/lsp/client.js +0 -4465
- package/dist/clients/lsp/config.js +0 -689
- package/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/dist/clients/lsp/document-drift.js +0 -467
- package/dist/clients/lsp/edits.js +0 -1219
- package/dist/clients/lsp/index.js +0 -8305
- package/dist/clients/lsp/inferred-project.js +0 -216
- package/dist/clients/lsp/jvm-runtime.js +0 -298
- package/dist/clients/lsp/language.js +0 -63
- package/dist/clients/lsp/launch.js +0 -725
- package/dist/clients/lsp/lombok.js +0 -158
- package/dist/clients/lsp/path-utils.js +0 -5
- package/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/dist/clients/lsp/position-encoding.js +0 -61
- package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/dist/clients/lsp/server.js +0 -3209
- package/dist/clients/lsp/session-roots.js +0 -192
- package/dist/clients/lsp/spawn-history.js +0 -17
- package/dist/clients/lsp/sync-kind.js +0 -42
- package/dist/clients/lsp/tsserver-sync.js +0 -332
- package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/dist/clients/lsp/wait-policy/index.js +0 -10
- package/dist/clients/lsp/wait-policy/strategies.js +0 -303
- package/dist/clients/lsp/watch-queue.js +0 -61
- package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/dist/clients/lsp-budget.js +0 -186
- package/dist/clients/lsp-document-symbols.js +0 -110
- package/dist/clients/lsp-lazy.js +0 -9
- package/dist/clients/lsp-mutation.js +0 -396
- package/dist/clients/lsp-status.js +0 -59
- package/dist/clients/map-with-concurrency.js +0 -40
- package/dist/clients/mcp/analyze.js +0 -420
- package/dist/clients/mcp/host-shim.js +0 -31
- package/dist/clients/mcp/ipc.js +0 -335
- package/dist/clients/mcp/review.js +0 -151
- package/dist/clients/mcp/session.js +0 -412
- package/dist/clients/memory-sampler.js +0 -208
- package/dist/clients/message-end-attribution.js +0 -30
- package/dist/clients/metrics-client.js +0 -107
- package/dist/clients/metrics-history.js +0 -327
- package/dist/clients/middle-man-analysis.js +0 -263
- package/dist/clients/model-provider.js +0 -53
- package/dist/clients/module-report-lsp.js +0 -189
- package/dist/clients/module-report.js +0 -2150
- package/dist/clients/mutating-tool.js +0 -651
- package/dist/clients/mutation-attribution.js +0 -368
- package/dist/clients/mutation-bridge.js +0 -240
- package/dist/clients/ndjson-logger.js +0 -734
- package/dist/clients/observed-mutation-sources.js +0 -101
- package/dist/clients/observed-mutation.js +0 -1253
- package/dist/clients/oldtext-autopatch.js +0 -128
- package/dist/clients/opaque-mutation-scan.js +0 -496
- package/dist/clients/opengrep-client.js +0 -328
- package/dist/clients/opengrep-config.js +0 -76
- package/dist/clients/package-manager.js +0 -607
- package/dist/clients/package-root.js +0 -38
- package/dist/clients/partial-edit-apply.js +0 -439
- package/dist/clients/path-attribution-telemetry.js +0 -43
- package/dist/clients/path-keyed-map.js +0 -108
- package/dist/clients/path-utils.js +0 -1244
- package/dist/clients/performance-report.js +0 -331
- package/dist/clients/persist-debounce.js +0 -70
- package/dist/clients/persistent-reverify.js +0 -271
- package/dist/clients/php-cs-fixer-config.js +0 -119
- package/dist/clients/pipeline.js +0 -1425
- package/dist/clients/post-autofix-notice.js +0 -37
- package/dist/clients/print-mode.js +0 -21
- package/dist/clients/probe-home-state.js +0 -228
- package/dist/clients/process-bridge.js +0 -66
- package/dist/clients/process-singletons.js +0 -210
- package/dist/clients/process-snapshot.js +0 -68
- package/dist/clients/project-changes.js +0 -181
- package/dist/clients/project-conventions.js +0 -171
- package/dist/clients/project-diagnostics/cache.js +0 -137
- package/dist/clients/project-diagnostics/extractors.js +0 -109
- package/dist/clients/project-diagnostics/fresh-fetch.js +0 -650
- package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/dist/clients/project-diagnostics/scanner.js +0 -520
- package/dist/clients/project-diagnostics/types.js +0 -1
- package/dist/clients/project-lens-config.js +0 -799
- package/dist/clients/project-report.js +0 -701
- package/dist/clients/project-scale.js +0 -237
- package/dist/clients/project-scan-policy.js +0 -11
- package/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/dist/clients/project-snapshot.js +0 -1653
- package/dist/clients/project-trust.js +0 -181
- package/dist/clients/python-environment.js +0 -217
- package/dist/clients/python-provenance.js +0 -639
- package/dist/clients/quiet-window-config.js +0 -47
- package/dist/clients/quiet-window.js +0 -236
- package/dist/clients/read-bridge.js +0 -139
- package/dist/clients/read-expansion.js +0 -266
- package/dist/clients/read-guard-logger.js +0 -251
- package/dist/clients/read-guard-tool-lines.js +0 -1306
- package/dist/clients/read-guard.js +0 -1561
- package/dist/clients/recent-touches.js +0 -240
- package/dist/clients/redact/secrets.js +0 -449
- package/dist/clients/resource-sampler.js +0 -628
- package/dist/clients/reverse-deps.js +0 -270
- package/dist/clients/review-graph/builder.js +0 -5118
- package/dist/clients/review-graph/format.js +0 -33
- package/dist/clients/review-graph/git-identity.js +0 -157
- package/dist/clients/review-graph/import-resolvers.js +0 -481
- package/dist/clients/review-graph/persist-worker.js +0 -10
- package/dist/clients/review-graph/query.js +0 -244
- package/dist/clients/review-graph/revision-drift.js +0 -21
- package/dist/clients/review-graph/service.js +0 -96
- package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/dist/clients/review-graph/symbol-id.js +0 -103
- package/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/dist/clients/review-graph/types.js +0 -1
- package/dist/clients/review-graph/workspace-modules.js +0 -449
- package/dist/clients/review-graph-logger.js +0 -81
- package/dist/clients/ruff-client.js +0 -152
- package/dist/clients/rules-scanner.js +0 -131
- package/dist/clients/run-duration.js +0 -55
- package/dist/clients/runtime-agent-end.js +0 -746
- package/dist/clients/runtime-config.js +0 -77
- package/dist/clients/runtime-context.js +0 -211
- package/dist/clients/runtime-coordinator.js +0 -1290
- package/dist/clients/runtime-session.js +0 -2485
- package/dist/clients/runtime-tool-call.js +0 -1284
- package/dist/clients/runtime-tool-result.js +0 -2034
- package/dist/clients/runtime-turn.js +0 -3600
- package/dist/clients/rust-client.js +0 -97
- package/dist/clients/safe-spawn.js +0 -2166
- package/dist/clients/sanitize.js +0 -286
- package/dist/clients/scan-utils.js +0 -25
- package/dist/clients/scratch-tree-policy.js +0 -165
- package/dist/clients/search-read-registration.js +0 -94
- package/dist/clients/secret-findings.js +0 -114
- package/dist/clients/security-scan-client.js +0 -352
- package/dist/clients/session-event-guard.js +0 -297
- package/dist/clients/session-lifecycle.js +0 -484
- package/dist/clients/session-start-observability.js +0 -94
- package/dist/clients/session-state-store.js +0 -101
- package/dist/clients/session-summary.js +0 -15
- package/dist/clients/sessionstart-logger.js +0 -27
- package/dist/clients/sg-runner.js +0 -876
- package/dist/clients/sgconfig.js +0 -347
- package/dist/clients/shared-checkout-guard.js +0 -338
- package/dist/clients/single-flight.js +0 -158
- package/dist/clients/situational-tool-telemetry.js +0 -108
- package/dist/clients/skills-resolver.js +0 -141
- package/dist/clients/slow-fs.js +0 -138
- package/dist/clients/smells-rollup.js +0 -231
- package/dist/clients/source-filter.js +0 -596
- package/dist/clients/source-walker.js +0 -211
- package/dist/clients/spawn-output-cap.js +0 -37
- package/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/dist/clients/stale-marker.js +0 -17
- package/dist/clients/startup-scan.js +0 -400
- package/dist/clients/startup-timing.js +0 -130
- package/dist/clients/string-utils.js +0 -33
- package/dist/clients/subagent-mode.js +0 -111
- package/dist/clients/symbol-containment.js +0 -24
- package/dist/clients/symbol-types.js +0 -5
- package/dist/clients/test-runner-client.js +0 -2507
- package/dist/clients/test-runner-delivery.js +0 -287
- package/dist/clients/todo-scanner.js +0 -229
- package/dist/clients/tool-agreement.js +0 -423
- package/dist/clients/tool-config.js +0 -249
- package/dist/clients/tool-cwd.js +0 -270
- package/dist/clients/tool-definition.js +0 -47
- package/dist/clients/tool-event.js +0 -105
- package/dist/clients/tool-policy.js +0 -2755
- package/dist/clients/tool-probe.js +0 -53
- package/dist/clients/tool-render.js +0 -156
- package/dist/clients/tool-set-policy.js +0 -118
- package/dist/clients/tree-sitter-cache.js +0 -364
- package/dist/clients/tree-sitter-client.js +0 -4134
- package/dist/clients/tree-sitter-logger.js +0 -100
- package/dist/clients/tree-sitter-navigator.js +0 -269
- package/dist/clients/tree-sitter-query-loader.js +0 -569
- package/dist/clients/tree-sitter-shared.js +0 -158
- package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/dist/clients/trivy-client.js +0 -467
- package/dist/clients/tui-fit.js +0 -50
- package/dist/clients/turn-context.js +0 -52
- package/dist/clients/turn-summary-render.js +0 -72
- package/dist/clients/turn-summary.js +0 -132
- package/dist/clients/typos-config.js +0 -29
- package/dist/clients/user-notify.js +0 -51
- package/dist/clients/vanished-instance-marker.js +0 -57
- package/dist/clients/warm-attach.js +0 -246
- package/dist/clients/widget-state.js +0 -1677
- package/dist/clients/word-index-logger.js +0 -49
- package/dist/clients/word-index-store.js +0 -459
- package/dist/clients/word-index.js +0 -2080
- package/dist/clients/workspace-topology.js +0 -389
- package/dist/clients/write-ordering-guard.js +0 -65
- package/dist/clients/zizmor-config.js +0 -327
- package/dist/i18n.js +0 -69
- package/dist/mcp/build-staleness.js +0 -124
- package/dist/scripts/lib/process-scan.mjs +0 -583
- package/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/dist/tools/activate-tools.js +0 -87
- package/dist/tools/ast-grep-outline.js +0 -137
- package/dist/tools/ast-grep-replace.js +0 -244
- package/dist/tools/ast-grep-search.js +0 -762
- package/dist/tools/effective-config.js +0 -90
- package/dist/tools/lens-diagnostic-mark.js +0 -375
- package/dist/tools/lens-diagnostics.js +0 -2544
- package/dist/tools/lsp-diagnostics.js +0 -1634
- package/dist/tools/lsp-navigation.js +0 -1367
- package/dist/tools/lsp-structured-output.js +0 -294
- package/dist/tools/module-report.js +0 -382
- package/dist/tools/project-report.js +0 -86
- package/dist/tools/render-compact.js +0 -374
- package/dist/tools/scan-progress.js +0 -53
- package/dist/tools/shared.js +0 -29
- package/dist/tools/symbol-search.js +0 -155
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Turn-summary collector (#484).
|
|
3
|
-
*
|
|
4
|
-
* Opt-in, transcript-persistent record of what pi-lens did: diagnostics
|
|
5
|
-
* found, autofixes applied, autoformats applied. Accumulated per-file across
|
|
6
|
-
* the RUN's write/edit pipeline runs + the agent_end deferred-format pass,
|
|
7
|
-
* then emitted as ONE `pi.sendMessage` custom entry at the `agent_settled`
|
|
8
|
-
* quiet window (never per-file, and per-RUN not per-turn — see the #484
|
|
9
|
-
* discussion + PR #500 review). The quiet-window emit point is load-bearing,
|
|
10
|
-
* not cosmetic (verified in the installed pi 0.80.6 SDK):
|
|
11
|
-
*
|
|
12
|
-
* 1. `sendCustomMessage` STEERS the live model conversation when the
|
|
13
|
-
* session `isStreaming` (dist/core/agent-session.js), and turn_end can
|
|
14
|
-
* fire mid-stream — a passive summary must never steer a working agent.
|
|
15
|
-
* At settle the session is idle, so sendMessage takes the safe append
|
|
16
|
-
* branch (persisted + rendered immediately, no steer).
|
|
17
|
-
* 2. A CustomMessageEntry DOES participate in LLM context: `display` only
|
|
18
|
-
* controls TUI rendering, and `buildSessionContext` converts every such
|
|
19
|
-
* entry into a `role: "user"` message on later context builds
|
|
20
|
-
* (dist/core/session-manager.js). Only `content` reaches the model —
|
|
21
|
-
* `details` never does — so the entry `content` must stay ONE short
|
|
22
|
-
* line; the model's exposure is that ~80-char collapsed line, an
|
|
23
|
-
* accepted residue (largely redundant with the #493 agent nudge).
|
|
24
|
-
*
|
|
25
|
-
* Collapsed rendering is tool-grouped; expanded rendering (from `details`,
|
|
26
|
-
* human-only) is file-major.
|
|
27
|
-
*
|
|
28
|
-
* All map keys go through `normalizeMapKey` — never a hand-rolled path
|
|
29
|
-
* comparison (see the two red CI rounds on PR #491 the raw-key trap cost).
|
|
30
|
-
*/
|
|
31
|
-
import { normalizeMapKey } from "./path-utils.js";
|
|
32
|
-
/**
|
|
33
|
-
* Per-RUN accumulator. One instance lives on the runtime coordinator; it
|
|
34
|
-
* survives turn boundaries (NOT cleared in beginTurn) and is cleared only by
|
|
35
|
-
* `consume()` at the quiet-window emit and by `resetForSession()`.
|
|
36
|
-
*/
|
|
37
|
-
export class TurnSummaryCollector {
|
|
38
|
-
filesByKey = new Map();
|
|
39
|
-
getOrCreate(filePath) {
|
|
40
|
-
const key = normalizeMapKey(filePath);
|
|
41
|
-
let entry = this.filesByKey.get(key);
|
|
42
|
-
if (!entry) {
|
|
43
|
-
// displayPath is resolved at consume() time (cwd known there); the
|
|
44
|
-
// accumulation phase only has the absolute path.
|
|
45
|
-
entry = { filePath, displayPath: filePath, events: [] };
|
|
46
|
-
this.filesByKey.set(key, entry);
|
|
47
|
-
}
|
|
48
|
-
return entry;
|
|
49
|
-
}
|
|
50
|
-
record(filePath, event) {
|
|
51
|
-
this.getOrCreate(filePath).events.push(event);
|
|
52
|
-
}
|
|
53
|
-
recordDiagnostic(filePath, args) {
|
|
54
|
-
this.record(filePath, { kind: "diagnostic", ...args });
|
|
55
|
-
}
|
|
56
|
-
recordAutofix(filePath, args) {
|
|
57
|
-
this.record(filePath, { kind: "autofix", ...args });
|
|
58
|
-
}
|
|
59
|
-
recordFormat(filePath, args) {
|
|
60
|
-
this.record(filePath, { kind: "format", ...args });
|
|
61
|
-
}
|
|
62
|
-
isEmpty() {
|
|
63
|
-
return this.filesByKey.size === 0;
|
|
64
|
-
}
|
|
65
|
-
/** Snapshot without clearing — used for tests/observability. */
|
|
66
|
-
peek() {
|
|
67
|
-
return [...this.filesByKey.values()];
|
|
68
|
-
}
|
|
69
|
-
clear() {
|
|
70
|
-
this.filesByKey.clear();
|
|
71
|
-
}
|
|
72
|
-
/** Consume (snapshot + clear) the run's collection, building the details payload. */
|
|
73
|
-
consume(turnIndex, toDisplayPath) {
|
|
74
|
-
const files = [...this.filesByKey.values()].map((entry) => ({
|
|
75
|
-
...entry,
|
|
76
|
-
displayPath: toDisplayPath
|
|
77
|
-
? toDisplayPath(entry.filePath)
|
|
78
|
-
: entry.filePath,
|
|
79
|
-
}));
|
|
80
|
-
this.filesByKey.clear();
|
|
81
|
-
const counts = {
|
|
82
|
-
diagnostics: 0,
|
|
83
|
-
autofixes: 0,
|
|
84
|
-
formats: 0,
|
|
85
|
-
byTool: { diagnostic: {}, autofix: {}, format: {} },
|
|
86
|
-
};
|
|
87
|
-
for (const file of files) {
|
|
88
|
-
for (const event of file.events) {
|
|
89
|
-
if (event.kind === "diagnostic")
|
|
90
|
-
counts.diagnostics++;
|
|
91
|
-
else if (event.kind === "autofix")
|
|
92
|
-
counts.autofixes++;
|
|
93
|
-
else
|
|
94
|
-
counts.formats++;
|
|
95
|
-
const bucket = counts.byTool[event.kind];
|
|
96
|
-
bucket[event.tool] = (bucket[event.tool] ?? 0) + 1;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return { version: 1, turnIndex, files, counts };
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
function formatToolCounts(byTool) {
|
|
103
|
-
return Object.entries(byTool)
|
|
104
|
-
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
105
|
-
.map(([tool, count]) => `${tool} ${count}`)
|
|
106
|
-
.join(", ");
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Build the collapsed, tool-grouped one-line fallback text (also used as the
|
|
110
|
-
* plain-text `content` for hosts without the custom renderer).
|
|
111
|
-
* Example: "pi-lens: 3 diagnostics (eslint 2, tsserver 1) · 2 autofixed (ruff) · 1 reformatted (prettier)"
|
|
112
|
-
*/
|
|
113
|
-
export function formatTurnSummaryLine(details) {
|
|
114
|
-
const parts = [];
|
|
115
|
-
const { counts } = details;
|
|
116
|
-
if (counts.diagnostics > 0) {
|
|
117
|
-
const byTool = formatToolCounts(counts.byTool.diagnostic);
|
|
118
|
-
parts.push(`${counts.diagnostics} diagnostic${counts.diagnostics === 1 ? "" : "s"}${byTool ? ` (${byTool})` : ""}`);
|
|
119
|
-
}
|
|
120
|
-
if (counts.autofixes > 0) {
|
|
121
|
-
const byTool = formatToolCounts(counts.byTool.autofix);
|
|
122
|
-
parts.push(`${counts.autofixes} autofixed${byTool ? ` (${byTool})` : ""}`);
|
|
123
|
-
}
|
|
124
|
-
if (counts.formats > 0) {
|
|
125
|
-
const byTool = formatToolCounts(counts.byTool.format);
|
|
126
|
-
parts.push(`${counts.formats} reformatted${byTool ? ` (${byTool})` : ""}`);
|
|
127
|
-
}
|
|
128
|
-
if (parts.length === 0)
|
|
129
|
-
return "pi-lens: turn summary (empty)";
|
|
130
|
-
return `pi-lens: ${parts.join(" · ")}`;
|
|
131
|
-
}
|
|
132
|
-
export const TURN_SUMMARY_CUSTOM_TYPE = "pilens:turn-summary";
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { findLocalToolConfig } from "./path-utils.js";
|
|
2
|
-
/**
|
|
3
|
-
* typos (source-code spell checker) configuration discovery. typos runs as a
|
|
4
|
-
* cross-cutting auxiliary LSP (#283); like Opengrep's local-rules gate and
|
|
5
|
-
* zizmor's `zizmor.yml` gate, the PRESENCE of a repo-local typos config is the
|
|
6
|
-
* project's deliberate opt-in to let spelling findings BLOCK (it carries the
|
|
7
|
-
* team's curated allow-list / `extend-words` / severity). Advisory otherwise.
|
|
8
|
-
*
|
|
9
|
-
* typos discovers its config as `typos.toml`, `_typos.toml`, or `.typos.toml`
|
|
10
|
-
* at the project root (see typos' configuration docs). We only need to know if
|
|
11
|
-
* one EXISTS for the blocking gate — the `typos-lsp` server reads it itself.
|
|
12
|
-
*
|
|
13
|
-
* Note: `files.*` ignore globs in the config have NO effect under the LSP
|
|
14
|
-
* (CLI-only), so a `.typos.toml` does not exclude paths from the LSP scan — it
|
|
15
|
-
* only tunes the dictionary/severity. The blocking gate keys purely on presence.
|
|
16
|
-
*/
|
|
17
|
-
export const LOCAL_TYPOS_CONFIG_NAMES = [
|
|
18
|
-
"typos.toml",
|
|
19
|
-
"_typos.toml",
|
|
20
|
-
".typos.toml",
|
|
21
|
-
];
|
|
22
|
-
// Deliberately UNCEILINGED at $HOME (refs #2472 review round 3, F1): typos
|
|
23
|
-
// discovers `~/typos.toml` as the user's legitimate global config, and
|
|
24
|
-
// `typos-lsp` merges an injected config with its own discovery (injected
|
|
25
|
-
// wins) — a ceilinged search here silently hid the user's config from that
|
|
26
|
-
// merge and let pi-lens's own shipped `_typos.toml` clobber it instead.
|
|
27
|
-
export function findLocalTyposConfig(startDir) {
|
|
28
|
-
return findLocalToolConfig(startDir, LOCAL_TYPOS_CONFIG_NAMES);
|
|
29
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The HUMAN channel for degradations discovered deep in `clients/` (#1333).
|
|
3
|
-
*
|
|
4
|
-
* Most of what the migrated `console.*` sites emitted is LOG-audience and
|
|
5
|
-
* belongs in an ndjson sink (`clients/extension-log.ts`). A small set is
|
|
6
|
-
* genuinely user-facing — "the config file you wrote is being ignored", "this
|
|
7
|
-
* language's grammar could not be fetched, so its structural features are
|
|
8
|
-
* degraded", "the WASM runtime aborted; restart to recover". Those must reach
|
|
9
|
-
* the human through the HOST's own render path, never a raw terminal write
|
|
10
|
-
* (pi owns the terminal — see the module doc in `extension-log.ts`).
|
|
11
|
-
*
|
|
12
|
-
* `index.ts` wires a getter at extension init; modules deep in the tree call
|
|
13
|
-
* `notifyUserDegradation` without knowing anything about `ctx`. Per the
|
|
14
|
-
* #338/#798 detached-callback rule the notifier is resolved through a GETTER
|
|
15
|
-
* at delivery time — never captured once, because a session replacement
|
|
16
|
-
* invalidates the previously captured `ctx.ui`.
|
|
17
|
-
*
|
|
18
|
-
* Fail-soft by construction: with no host wired (MCP server, CLI, tests) this
|
|
19
|
-
* is a no-op and the ndjson sink remains the sole destination — the message is
|
|
20
|
-
* never lost, only un-rendered.
|
|
21
|
-
*/
|
|
22
|
-
import { withConfigDiagnosticCode, } from "./config-diagnostic-codes.js";
|
|
23
|
-
let notifierGetter;
|
|
24
|
-
/** Called once from the extension entry with a getter over the live `ctx.ui.notify`. */
|
|
25
|
-
export function wireUserNotifier(portsOrGetter) {
|
|
26
|
-
notifierGetter =
|
|
27
|
-
typeof portsOrGetter === "function"
|
|
28
|
-
? portsOrGetter
|
|
29
|
-
: () => portsOrGetter.notify.user;
|
|
30
|
-
}
|
|
31
|
-
/** Test/teardown-only: drop the wired host. */
|
|
32
|
-
export function resetUserNotifier() {
|
|
33
|
-
notifierGetter = undefined;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Best-effort delivery of a user-facing degradation. Never throws — a stale
|
|
37
|
-
* `ctx` after a session replacement must degrade to a no-op, not break the
|
|
38
|
-
* diagnostic path that called it.
|
|
39
|
-
*/
|
|
40
|
-
export function notifyUserDegradation(message, level = "warning", options) {
|
|
41
|
-
try {
|
|
42
|
-
const notify = notifierGetter?.();
|
|
43
|
-
const coded = options?.code
|
|
44
|
-
? withConfigDiagnosticCode(message, options.code)
|
|
45
|
-
: message;
|
|
46
|
-
notify?.(coded, level);
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// The ndjson sink already holds this message; a dead host is not an error.
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vanished-instance markers (#1123 item 2, first slice — instance health).
|
|
3
|
-
*
|
|
4
|
-
* `deregisterInstance()` (clients/instance-registry.ts) SYNCHRONOUSLY removes
|
|
5
|
-
* a process's own entry from `instances.json` on a clean `session_shutdown`.
|
|
6
|
-
* That means the entry's mere PRESENCE in the registry, combined with a
|
|
7
|
-
* pid-confirmed-dead owner, is already proof the process never reached that
|
|
8
|
-
* shutdown path — no separate "clean shutdown" flag is needed on
|
|
9
|
-
* `InstanceEntry` (the registry already carries `heartbeatAt`/`rssBytes`,
|
|
10
|
-
* which is exactly the "lastSeen"/"rss" pair this marker needs; both are
|
|
11
|
-
* used AS-IS, per the instruction to add fields only if missing).
|
|
12
|
-
*
|
|
13
|
-
* `sweepOrphans()` (clients/instance-reaper.ts) already prunes these exact
|
|
14
|
-
* dead-pid entries out of the registry as part of #472's orphan-LSP reap —
|
|
15
|
-
* so this marker's read MUST happen against a snapshot taken before (or
|
|
16
|
-
* independently of) that prune, or the vanished set will already be empty by
|
|
17
|
-
* the time this runs. `logVanishedInstances` therefore takes the registry
|
|
18
|
-
* snapshot as an argument rather than reading it itself, so the caller
|
|
19
|
-
* controls ordering (see index.ts's session_start wiring, which reads once
|
|
20
|
-
* and passes the same snapshot to both this marker and `sweepOrphans`).
|
|
21
|
-
*/
|
|
22
|
-
import { logSessionStart } from "./sessionstart-logger.js";
|
|
23
|
-
import { realIsPidAlive } from "./instance-reaper.js";
|
|
24
|
-
/**
|
|
25
|
-
* PURE: registry entries whose owning pid is confirmed dead. Every such entry
|
|
26
|
-
* is, by construction (see module docstring), one that exited without
|
|
27
|
-
* reaching `deregisterInstance()`. Uses the SAME conservative liveness
|
|
28
|
-
* contract as the reaper (`isPidAlive`, defaulting to `realIsPidAlive`):
|
|
29
|
-
* ESRCH-only-means-dead, any ambiguous signal (EPERM, unknown) stays "alive"
|
|
30
|
-
* — never flag a live-but-unverifiable instance as vanished.
|
|
31
|
-
*/
|
|
32
|
-
export function detectVanishedInstances(registry, isPidAlive) {
|
|
33
|
-
return registry
|
|
34
|
-
.filter((entry) => !isPidAlive(entry.pid))
|
|
35
|
-
.map((entry) => ({
|
|
36
|
-
pid: entry.pid,
|
|
37
|
-
lastSeenAt: entry.heartbeatAt,
|
|
38
|
-
rssBytes: entry.rssBytes ?? 0,
|
|
39
|
-
}));
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Log one `sessionstart.log` line per vanished instance found in `registry`.
|
|
43
|
-
* Best-effort (never throws into `session_start`) and read-only — this
|
|
44
|
-
* function never mutates or prunes the registry; that stays the reaper's job.
|
|
45
|
-
*/
|
|
46
|
-
export function logVanishedInstances(registry, isPidAlive = realIsPidAlive) {
|
|
47
|
-
try {
|
|
48
|
-
const vanished = detectVanishedInstances(registry, isPidAlive);
|
|
49
|
-
for (const instance of vanished) {
|
|
50
|
-
const rssMb = Math.round(instance.rssBytes / (1024 * 1024));
|
|
51
|
-
logSessionStart(`previous instance pid ${instance.pid} last seen ${instance.lastSeenAt} (RSS ${rssMb}MB) exited without shutdown`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
// best-effort observability — never fail session_start over this
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import * as net from "node:net";
|
|
3
|
-
import * as path from "node:path";
|
|
4
|
-
import { readInstanceRegistry, selectLivePeerInstances, } from "./instance-registry.js";
|
|
5
|
-
import { realIsPidAlive } from "./instance-reaper.js";
|
|
6
|
-
import { logLatency } from "./latency-logger.js";
|
|
7
|
-
import { touchCoverageGap } from "./lsp/diagnostic-binding.js";
|
|
8
|
-
import { loadLspService } from "./lsp-lazy.js";
|
|
9
|
-
import { contentHash, createWarmIpcLineReader, diagnosticsIpcPathForCwd, requestWarmCodeActions, requestWarmDiagnostics, WARM_CODE_ACTION_LOOKUP_LIMIT, WARM_DIAGNOSTICS_SCHEMA_VERSION, } from "./mcp/ipc.js";
|
|
10
|
-
import { normalizeFilePath } from "./path-utils.js";
|
|
11
|
-
const state = { local: true, servedDiagnosticHashes: new Map() };
|
|
12
|
-
function record(event, cwd, reason, pid, source) {
|
|
13
|
-
logLatency({
|
|
14
|
-
type: "phase",
|
|
15
|
-
phase: "lsp_warm_attach",
|
|
16
|
-
filePath: cwd,
|
|
17
|
-
durationMs: 0,
|
|
18
|
-
metadata: { event, reason, incumbentPid: pid, source },
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* The oldest live peer on this root, if any. The liveness rule itself lives
|
|
23
|
-
* in `selectLivePeerInstances` (#2007) so warm-attach and the shared-checkout
|
|
24
|
-
* guard cannot drift apart about what "another session is here" means.
|
|
25
|
-
*/
|
|
26
|
-
export function selectWarmAttachIncumbent(entries, cwd, now = Date.now(), isPidAlive = realIsPidAlive) {
|
|
27
|
-
return selectLivePeerInstances(entries, cwd, now, isPidAlive)[0];
|
|
28
|
-
}
|
|
29
|
-
async function serveRequest(req) {
|
|
30
|
-
if (req.route === "code-actions") {
|
|
31
|
-
if (req.version !== WARM_DIAGNOSTICS_SCHEMA_VERSION ||
|
|
32
|
-
req.ranges.length > WARM_CODE_ACTION_LOOKUP_LIMIT ||
|
|
33
|
-
Date.now() > req.deadlineAt ||
|
|
34
|
-
state.servedDiagnosticHashes.get(normalizeFilePath(req.file)) !==
|
|
35
|
-
req.contentHash) {
|
|
36
|
-
return { error: "stale request" };
|
|
37
|
-
}
|
|
38
|
-
try {
|
|
39
|
-
const actions = await Promise.all(req.ranges.map(async (range) => {
|
|
40
|
-
if (Date.now() > req.deadlineAt) {
|
|
41
|
-
throw new Error("deadline exceeded");
|
|
42
|
-
}
|
|
43
|
-
return (await loadLspService())
|
|
44
|
-
.getLSPService()
|
|
45
|
-
.codeAction(req.file, range.start.line, range.start.character, range.end.line, range.end.character);
|
|
46
|
-
}));
|
|
47
|
-
const servedAt = Date.now();
|
|
48
|
-
if (servedAt > req.deadlineAt)
|
|
49
|
-
return { error: "deadline exceeded" };
|
|
50
|
-
return {
|
|
51
|
-
result: {
|
|
52
|
-
route: "code-actions",
|
|
53
|
-
version: WARM_DIAGNOSTICS_SCHEMA_VERSION,
|
|
54
|
-
contentHash: req.contentHash,
|
|
55
|
-
servedAt,
|
|
56
|
-
actions,
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
return { error: String(error) };
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (req.route !== "diagnostics" ||
|
|
65
|
-
req.version !== WARM_DIAGNOSTICS_SCHEMA_VERSION) {
|
|
66
|
-
return { error: "schema mismatch" };
|
|
67
|
-
}
|
|
68
|
-
if (Date.now() > req.deadlineAt ||
|
|
69
|
-
contentHash(req.content) !== req.contentHash) {
|
|
70
|
-
return { error: "stale request" };
|
|
71
|
-
}
|
|
72
|
-
const touched = await (await loadLspService())
|
|
73
|
-
.getLSPService()
|
|
74
|
-
.touchFile(req.file, req.content, {
|
|
75
|
-
diagnostics: "document",
|
|
76
|
-
collectDiagnostics: true,
|
|
77
|
-
clientScope: "with-auxiliary",
|
|
78
|
-
maxClientWaitMs: Math.max(1, req.deadlineAt - Date.now()),
|
|
79
|
-
maxDiagnosticsWaitMs: Math.max(1, req.deadlineAt - Date.now()),
|
|
80
|
-
source: "warm-attach-incumbent",
|
|
81
|
-
});
|
|
82
|
-
const servedAt = Date.now();
|
|
83
|
-
// #1470: the coverage gap is read through the shared helper, never re-derived
|
|
84
|
-
// from `confirmation === "partial"`. The two fields are set together today, so
|
|
85
|
-
// either test passes — which is exactly the coincidence `touchCoverageGap`'s
|
|
86
|
-
// own doc comment warns against. One reader, one rule.
|
|
87
|
-
const coverageGap = touchCoverageGap(touched);
|
|
88
|
-
if (servedAt <= req.deadlineAt &&
|
|
89
|
-
touched !== undefined &&
|
|
90
|
-
!touched.inconclusive) {
|
|
91
|
-
state.servedDiagnosticHashes.set(normalizeFilePath(req.file), req.contentHash);
|
|
92
|
-
}
|
|
93
|
-
return {
|
|
94
|
-
result: {
|
|
95
|
-
route: "diagnostics",
|
|
96
|
-
version: WARM_DIAGNOSTICS_SCHEMA_VERSION,
|
|
97
|
-
// #1179: `touchFile` now returns the `{ diags, inconclusive, binding }`
|
|
98
|
-
// wrapper — take the array off `.diags`. This is the canonical shape-5
|
|
99
|
-
// serialization boundary: the diagnostics array crosses the IPC socket
|
|
100
|
-
// and `inconclusive` is re-surfaced below as an EXPLICIT enumerable DTO
|
|
101
|
-
// field (no side-channel survives `JSON.stringify`).
|
|
102
|
-
diagnostics: touched?.diags ?? [],
|
|
103
|
-
contentHash: req.contentHash,
|
|
104
|
-
servedAt,
|
|
105
|
-
fresh: servedAt <= req.deadlineAt && touched !== undefined,
|
|
106
|
-
inconclusive: touched?.inconclusive === true,
|
|
107
|
-
// #1253: carry the touch's own confirmation verdict across the socket
|
|
108
|
-
// as an explicit enumerable field (same doctrine as `inconclusive`) —
|
|
109
|
-
// without it, an incumbent-served empty result from a silent-on-clean
|
|
110
|
-
// server is indistinguishable from "never answered" on the far side.
|
|
111
|
-
...(touched?.confirmation === "confirmed"
|
|
112
|
-
? { confirmation: "confirmed" }
|
|
113
|
-
: {}),
|
|
114
|
-
// #1470: a PARTIAL touch crosses the socket as itself rather than as a
|
|
115
|
-
// missing key. Omitting it would still fail closed on the far side, but it
|
|
116
|
-
// would be indistinguishable from an old incumbent that never sent the
|
|
117
|
-
// field — and the whole point of narrowing is that the reader can tell
|
|
118
|
-
// which coverage is real.
|
|
119
|
-
...(coverageGap.length > 0
|
|
120
|
-
? {
|
|
121
|
-
confirmation: "partial",
|
|
122
|
-
unconfirmedServerIds: [...coverageGap],
|
|
123
|
-
}
|
|
124
|
-
: {}),
|
|
125
|
-
},
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
function startServer(cwd) {
|
|
129
|
-
state.server?.close();
|
|
130
|
-
const endpoint = diagnosticsIpcPathForCwd(cwd, process.pid);
|
|
131
|
-
if (process.platform !== "win32") {
|
|
132
|
-
try {
|
|
133
|
-
fs.unlinkSync(endpoint);
|
|
134
|
-
}
|
|
135
|
-
catch {
|
|
136
|
-
// No stale socket.
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
const server = net.createServer((socket) => {
|
|
140
|
-
socket.setEncoding("utf8");
|
|
141
|
-
// One-shot per connection (#1219 family): the same defect shape as the
|
|
142
|
-
// MCP warm socket — clients write exactly one request and read one
|
|
143
|
-
// reply, so a handler that kept re-reading the same buffered line
|
|
144
|
-
// re-dispatched the request on stray bytes. The shared reader consumes
|
|
145
|
-
// the line and ignores anything after it.
|
|
146
|
-
socket.on("data", createWarmIpcLineReader((line) => {
|
|
147
|
-
void (async () => {
|
|
148
|
-
try {
|
|
149
|
-
const req = JSON.parse(line);
|
|
150
|
-
socket.end(`${JSON.stringify(await serveRequest(req))}\n`);
|
|
151
|
-
}
|
|
152
|
-
catch (error) {
|
|
153
|
-
socket.end(`${JSON.stringify({ error: String(error) })}\n`);
|
|
154
|
-
}
|
|
155
|
-
})();
|
|
156
|
-
}));
|
|
157
|
-
});
|
|
158
|
-
server.on("error", (error) => {
|
|
159
|
-
record("listener-error", cwd, String(error));
|
|
160
|
-
});
|
|
161
|
-
server.listen(endpoint);
|
|
162
|
-
server.unref();
|
|
163
|
-
state.server = server;
|
|
164
|
-
}
|
|
165
|
-
export async function configureWarmAttach(cwd) {
|
|
166
|
-
state.cwd = path.resolve(cwd);
|
|
167
|
-
state.incumbentPid = undefined;
|
|
168
|
-
state.local = true;
|
|
169
|
-
if (process.env.PI_LENS_WARM_ATTACH !== "1") {
|
|
170
|
-
record("disabled", state.cwd, "opt-in-not-enabled");
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
startServer(state.cwd);
|
|
174
|
-
const incumbent = selectWarmAttachIncumbent(await readInstanceRegistry(), state.cwd);
|
|
175
|
-
if (!incumbent) {
|
|
176
|
-
record("local", state.cwd, "no-live-incumbent");
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
state.incumbentPid = incumbent.pid;
|
|
180
|
-
state.local = false;
|
|
181
|
-
record("attached", state.cwd, undefined, incumbent.pid);
|
|
182
|
-
}
|
|
183
|
-
export async function tryWarmAttachedDiagnostics(file, content, timeoutMs, source = "per-edit") {
|
|
184
|
-
if (state.local || !state.cwd || !state.incumbentPid)
|
|
185
|
-
return undefined;
|
|
186
|
-
const entries = await readInstanceRegistry();
|
|
187
|
-
const incumbent = selectWarmAttachIncumbent(entries, state.cwd);
|
|
188
|
-
if (incumbent?.pid !== state.incumbentPid) {
|
|
189
|
-
promoteToLocal("incumbent-stale-or-exited");
|
|
190
|
-
return undefined;
|
|
191
|
-
}
|
|
192
|
-
const result = await requestWarmDiagnostics(state.cwd, state.incumbentPid, file, content, timeoutMs);
|
|
193
|
-
if (!result.available) {
|
|
194
|
-
promoteToLocal(result.reason);
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
record("diagnostics-served", file, undefined, state.incumbentPid, source);
|
|
198
|
-
}
|
|
199
|
-
return result;
|
|
200
|
-
}
|
|
201
|
-
export async function tryWarmAttachedCodeActions(file, expectedContentHash, ranges, timeoutMs) {
|
|
202
|
-
if (state.local || !state.cwd || !state.incumbentPid)
|
|
203
|
-
return undefined;
|
|
204
|
-
const result = await requestWarmCodeActions(state.cwd, state.incumbentPid, file, expectedContentHash, ranges, timeoutMs);
|
|
205
|
-
if (result.available) {
|
|
206
|
-
record("code-actions-served", file, undefined, state.incumbentPid);
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
// Quickfixes are optional enrichment. Diagnostics already succeeded, so a
|
|
210
|
-
// code-action failure is deliberately softer and must not trigger takeover.
|
|
211
|
-
record("code-actions-skipped", file, result.reason, state.incumbentPid);
|
|
212
|
-
}
|
|
213
|
-
return result;
|
|
214
|
-
}
|
|
215
|
-
export function isWarmAttached() {
|
|
216
|
-
return !state.local && state.incumbentPid !== undefined;
|
|
217
|
-
}
|
|
218
|
-
function promoteToLocal(reason) {
|
|
219
|
-
if (state.local)
|
|
220
|
-
return;
|
|
221
|
-
const pid = state.incumbentPid;
|
|
222
|
-
state.local = true;
|
|
223
|
-
state.incumbentPid = undefined;
|
|
224
|
-
record("takeover", state.cwd ?? process.cwd(), reason, pid);
|
|
225
|
-
}
|
|
226
|
-
export function _resetWarmAttachForTests() {
|
|
227
|
-
state.server?.close();
|
|
228
|
-
state.server = undefined;
|
|
229
|
-
state.cwd = undefined;
|
|
230
|
-
state.incumbentPid = undefined;
|
|
231
|
-
state.local = true;
|
|
232
|
-
state.servedDiagnosticHashes.clear();
|
|
233
|
-
}
|
|
234
|
-
export function _setWarmAttachForTests(cwd, incumbentPid) {
|
|
235
|
-
state.cwd = path.resolve(cwd);
|
|
236
|
-
state.incumbentPid = incumbentPid;
|
|
237
|
-
state.local = false;
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* The incumbent-side request handler, exposed for tests. The socket wiring
|
|
241
|
-
* around it (`startServer`) can only be exercised by a test that actually
|
|
242
|
-
* binds a unix socket, which is not available in every sandbox — this seam
|
|
243
|
-
* lets the DTO-composition half (notably the #1253 `confirmation` field, whose
|
|
244
|
-
* absence is what a consumer reads as unconfirmed) be pinned directly.
|
|
245
|
-
*/
|
|
246
|
-
export const _serveWarmRequestForTests = serveRequest;
|