pi-lens 4.3.0 → 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.
Files changed (650) hide show
  1. package/CHANGELOG.md +1064 -0
  2. package/README.md +115 -25
  3. package/config/dependency-cruiser-eager-allowlist.json +6 -2
  4. package/dist/chunk-22AVIGXS.js +560 -0
  5. package/dist/chunk-27BBHSZC.js +106 -0
  6. package/dist/chunk-2BEMIWEW.js +51 -0
  7. package/dist/chunk-2EECBNC5.js +89 -0
  8. package/dist/chunk-34U7PLGE.js +23 -0
  9. package/dist/chunk-3I5QFT3N.js +181 -0
  10. package/dist/chunk-3MED75HT.js +37 -0
  11. package/dist/chunk-47D2BO4S.js +87 -0
  12. package/dist/chunk-4RERDEXR.js +348 -0
  13. package/dist/chunk-4W2PLC4J.js +27 -0
  14. package/dist/chunk-52H5B5TC.js +202 -0
  15. package/dist/chunk-54B42YRX.js +27 -0
  16. package/dist/chunk-5RXBNSW2.js +266 -0
  17. package/dist/chunk-5THXD6X5.js +201 -0
  18. package/dist/chunk-5W3R6LFT.js +24 -0
  19. package/dist/chunk-5ZEJHV35.js +341 -0
  20. package/dist/chunk-6P62QVEA.js +118 -0
  21. package/dist/chunk-6QIUX4EP.js +459 -0
  22. package/dist/chunk-6VCD4VKZ.js +78 -0
  23. package/dist/chunk-7F72PXY2.js +326 -0
  24. package/dist/chunk-7FBF7NPR.js +998 -0
  25. package/dist/chunk-7U2IDNXN.js +37 -0
  26. package/dist/chunk-ABBOA7UD.js +157 -0
  27. package/dist/chunk-AHDW3GPE.js +50 -0
  28. package/dist/chunk-AJ3QXTRQ.js +756 -0
  29. package/dist/chunk-AJVLWNFN.js +1610 -0
  30. package/dist/chunk-AJXODZY6.js +112 -0
  31. package/dist/chunk-ARFCXG7S.js +84 -0
  32. package/dist/chunk-AS44CFQ4.js +708 -0
  33. package/dist/chunk-AWE5TMPO.js +38 -0
  34. package/dist/chunk-B3I2UUT4.js +4692 -0
  35. package/dist/chunk-BRJKOBZP.js +331 -0
  36. package/dist/chunk-BW5KFIQC.js +59 -0
  37. package/dist/chunk-C2AUYXQH.js +149 -0
  38. package/dist/chunk-CGGAIP7J.js +29 -0
  39. package/dist/chunk-D6QS3U6M.js +30 -0
  40. package/dist/chunk-DFVMIKMQ.js +349 -0
  41. package/dist/chunk-DIULIWKU.js +169 -0
  42. package/dist/chunk-DQ2NZ7C4.js +2317 -0
  43. package/dist/chunk-E2WFBRHM.js +213 -0
  44. package/dist/chunk-E4MAEDPM.js +50 -0
  45. package/dist/chunk-EOKRQ3SA.js +30 -0
  46. package/dist/chunk-F3AU2TMM.js +2626 -0
  47. package/dist/chunk-F3P7VQ7H.js +170 -0
  48. package/dist/chunk-FC4RP4I2.js +12 -0
  49. package/dist/chunk-FJNKANOS.js +32 -0
  50. package/dist/chunk-GUOGVTCQ.js +146 -0
  51. package/dist/chunk-GVXA6CCE.js +18 -0
  52. package/dist/chunk-HHYAELLJ.js +2334 -0
  53. package/dist/chunk-HMFXILPV.js +83 -0
  54. package/dist/chunk-HVUZXSWK.js +421 -0
  55. package/dist/chunk-HWBZIGMJ.js +62 -0
  56. package/dist/chunk-I3R7GKDR.js +17 -0
  57. package/dist/chunk-I7SPGOWI.js +55 -0
  58. package/dist/chunk-IIXOAGHR.js +38 -0
  59. package/dist/chunk-IVP5KAB7.js +2250 -0
  60. package/dist/chunk-IXEBJSUE.js +22 -0
  61. package/dist/chunk-JOLITGCC.js +27 -0
  62. package/dist/chunk-K6VYLB2U.js +145 -0
  63. package/dist/chunk-LJDODBBZ.js +78 -0
  64. package/dist/chunk-LNAKEO63.js +78 -0
  65. package/dist/chunk-LSMJ6KBE.js +4139 -0
  66. package/dist/chunk-LW6XKDZQ.js +5565 -0
  67. package/dist/chunk-N3YQJI6O.js +899 -0
  68. package/dist/chunk-NABLC7W3.js +148 -0
  69. package/dist/chunk-NKOUFPQF.js +659 -0
  70. package/dist/chunk-NL5GLMFI.js +211 -0
  71. package/dist/chunk-NMABWBZN.js +327 -0
  72. package/dist/chunk-NTHH2J74.js +27 -0
  73. package/dist/chunk-NTUJEGDZ.js +59 -0
  74. package/dist/chunk-NXL4FFQQ.js +47 -0
  75. package/dist/chunk-NXPS2L6U.js +466 -0
  76. package/dist/chunk-O5WILGMI.js +42 -0
  77. package/dist/chunk-O6TQT6RI.js +48 -0
  78. package/dist/chunk-OAXNDZJ7.js +323 -0
  79. package/dist/chunk-ODEEOXPH.js +44 -0
  80. package/dist/chunk-OQGFCZJ4.js +4533 -0
  81. package/dist/chunk-ORTMY4Q4.js +282 -0
  82. package/dist/chunk-OS32RNR2.js +442 -0
  83. package/dist/chunk-PAK6IDME.js +189 -0
  84. package/dist/chunk-PWFHBTSF.js +406 -0
  85. package/dist/chunk-Q5U6FMDI.js +2352 -0
  86. package/dist/chunk-QOZXJ4NA.js +3364 -0
  87. package/dist/chunk-QYF5S6P6.js +45 -0
  88. package/dist/chunk-RIISMHKN.js +36 -0
  89. package/dist/chunk-RPD4ZSB7.js +25 -0
  90. package/dist/chunk-RPD5K5NC.js +79 -0
  91. package/dist/chunk-RUOG5D2C.js +262 -0
  92. package/dist/chunk-T4ERT73Y.js +599 -0
  93. package/dist/chunk-T6D4Q4AQ.js +54 -0
  94. package/dist/chunk-TGPXLY2J.js +391 -0
  95. package/dist/chunk-TLGFBM3F.js +12116 -0
  96. package/dist/chunk-TO6WL3GM.js +88 -0
  97. package/dist/chunk-TT22N74J.js +517 -0
  98. package/dist/chunk-TVN5N6GY.js +21216 -0
  99. package/dist/chunk-U3VGR4VU.js +308 -0
  100. package/dist/chunk-UK3CMEAL.js +1250 -0
  101. package/dist/chunk-UOPVJQ4N.js +103 -0
  102. package/dist/chunk-UXVNL3D7.js +23 -0
  103. package/dist/chunk-UY752QSN.js +45 -0
  104. package/dist/chunk-V5PXFSZK.js +188 -0
  105. package/dist/chunk-V7R425XG.js +398 -0
  106. package/dist/chunk-VCSRSYLF.js +81 -0
  107. package/dist/chunk-VD4JQCQC.js +162 -0
  108. package/dist/chunk-VDBPVIKD.js +62 -0
  109. package/dist/chunk-VHQLPIRJ.js +114 -0
  110. package/dist/chunk-VN2AXLEX.js +5414 -0
  111. package/dist/chunk-VNMT7C64.js +478 -0
  112. package/dist/chunk-WONERJTP.js +309 -0
  113. package/dist/chunk-XECLWQZN.js +85 -0
  114. package/dist/chunk-XIMYZ3JA.js +27 -0
  115. package/dist/chunk-XK4CIILI.js +144 -0
  116. package/dist/chunk-Y4T27COV.js +562 -0
  117. package/dist/chunk-YGVYKNSN.js +1860 -0
  118. package/dist/chunk-YLF3PPT5.js +308 -0
  119. package/dist/chunk-YSNFMJKN.js +14 -0
  120. package/dist/chunk-Z3CCVDUB.js +76 -0
  121. package/dist/chunk-Z54ZSOBZ.js +61 -0
  122. package/dist/chunk-ZAWW3AF6.js +97 -0
  123. package/dist/chunk-ZMOL6RQC.js +167 -0
  124. package/dist/index.js +16456 -8335
  125. package/dist/mcp/analyze-cli.js +186 -232
  126. package/dist/mcp/cli.js +137 -98
  127. package/dist/mcp/server.js +22589 -1573
  128. package/dist/mcp/worker.js +97 -38
  129. package/dist/probes/installer.js +135 -0
  130. package/dist/workers/project-snapshot-persist-worker.js +22 -0
  131. package/dist/workers/review-graph-persist-worker.js +15 -0
  132. package/docs/agent-guide.md +13 -4
  133. package/docs/agent-tools.md +42 -0
  134. package/docs/ast-grep_rules_catalog.md +3 -2
  135. package/docs/configuration.md +20 -1
  136. package/docs/environment-variables.md +52 -2
  137. package/docs/features.md +8 -4
  138. package/docs/globalconfig.md +1 -0
  139. package/docs/io-bridge-v2-migration.md +94 -0
  140. package/docs/lsp-capability-matrix.md +36 -4
  141. package/docs/lsp-idle-eviction.md +124 -0
  142. package/docs/mcp.md +21 -5
  143. package/docs/merge-queue-rollout.md +77 -0
  144. package/docs/pi-lens-fixer.md +156 -88
  145. package/docs/pi-lens-investigator.md +74 -26
  146. package/docs/pi-lens-merge-policy.md +694 -0
  147. package/docs/pi-lens-monitor.md +73 -7
  148. package/docs/pi-lens-retro.md +6 -4
  149. package/docs/pi-lens-reviewer.md +188 -48
  150. package/docs/pi-lens-subagent.md +246 -45
  151. package/docs/pi-lens-warden.md +18 -7
  152. package/docs/public-api-stability.md +55 -0
  153. package/docs/release-qa-baseline.md +84 -17
  154. package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  155. package/docs/servercapabilities.md +53 -49
  156. package/docs/settings.md +1 -0
  157. package/docs/usage.md +5 -1
  158. package/grammars/tree-sitter-bash.wasm +0 -0
  159. package/grammars/tree-sitter-bash.wasm.json +3 -3
  160. package/package.json +19 -7
  161. package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  162. package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  163. package/scripts/analyze-pi-lens-logs.mjs +1275 -62
  164. package/scripts/download-grammars.js +5 -0
  165. package/scripts/grammars.lock.json +6 -1
  166. package/scripts/install-selftest.mjs +33 -34
  167. package/scripts/lib/host-provided-deps.mjs +13 -4
  168. package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  169. package/dist/clients/actionable-warnings-logger.js +0 -35
  170. package/dist/clients/actionable-warnings.js +0 -1610
  171. package/dist/clients/advisory-provenance.js +0 -593
  172. package/dist/clients/agent-behavior-client.js +0 -147
  173. package/dist/clients/agent-nudge.js +0 -325
  174. package/dist/clients/analysed-root.js +0 -1
  175. package/dist/clients/ast-grep-client.js +0 -731
  176. package/dist/clients/ast-grep-rule-manager.js +0 -146
  177. package/dist/clients/ast-grep-tool-logger.js +0 -118
  178. package/dist/clients/ast-grep-types.js +0 -10
  179. package/dist/clients/ast-grep-yaml-synth.js +0 -154
  180. package/dist/clients/atomic-write-staging.js +0 -75
  181. package/dist/clients/atomic-write.js +0 -189
  182. package/dist/clients/availability-probe-flight.js +0 -12
  183. package/dist/clients/bash-file-access.js +0 -1056
  184. package/dist/clients/biome-client.js +0 -357
  185. package/dist/clients/blocker-freshness.js +0 -837
  186. package/dist/clients/blocker-past-eof.js +0 -129
  187. package/dist/clients/bootstrap.js +0 -569
  188. package/dist/clients/bounded-cache.js +0 -190
  189. package/dist/clients/bounded-pid-file-lock.js +0 -202
  190. package/dist/clients/bounded-telemetry.js +0 -295
  191. package/dist/clients/build-identity.js +0 -95
  192. package/dist/clients/bundled-resource-health.js +0 -113
  193. package/dist/clients/bus-events-logger.js +0 -105
  194. package/dist/clients/bus-publish.js +0 -171
  195. package/dist/clients/cache/rule-cache.js +0 -190
  196. package/dist/clients/cache-manager.js +0 -524
  197. package/dist/clients/cache-observability.js +0 -1313
  198. package/dist/clients/call-graph.js +0 -852
  199. package/dist/clients/cargo-manifest.js +0 -422
  200. package/dist/clients/cascade-budget.js +0 -196
  201. package/dist/clients/cascade-format.js +0 -315
  202. package/dist/clients/cascade-logger.js +0 -31
  203. package/dist/clients/cascade-types.js +0 -9
  204. package/dist/clients/child-unref.js +0 -124
  205. package/dist/clients/code-quality-warnings.js +0 -286
  206. package/dist/clients/codebase-model.js +0 -173
  207. package/dist/clients/collateral-test-role.js +0 -40
  208. package/dist/clients/complexity-client.js +0 -462
  209. package/dist/clients/config-core/deny.js +0 -221
  210. package/dist/clients/config-core/index.js +0 -50
  211. package/dist/clients/config-core/merge.js +0 -357
  212. package/dist/clients/config-core/normalize.js +0 -340
  213. package/dist/clients/config-core/process-spec.js +0 -248
  214. package/dist/clients/config-core/provenance.js +0 -164
  215. package/dist/clients/config-core/records.js +0 -218
  216. package/dist/clients/config-core/resolve.js +0 -125
  217. package/dist/clients/config-core/safe-object.js +0 -78
  218. package/dist/clients/config-core/schema.js +0 -165
  219. package/dist/clients/config-diagnostic-codes.js +0 -285
  220. package/dist/clients/config-locations.js +0 -388
  221. package/dist/clients/config-resolve.js +0 -798
  222. package/dist/clients/config-schema.js +0 -251
  223. package/dist/clients/config-warn.js +0 -407
  224. package/dist/clients/console-guard-install.js +0 -26
  225. package/dist/clients/cooperative-budget.js +0 -42
  226. package/dist/clients/dead-code-client.js +0 -510
  227. package/dist/clients/dead-code-logger.js +0 -30
  228. package/dist/clients/deadline-utils.js +0 -280
  229. package/dist/clients/debug-handles.js +0 -211
  230. package/dist/clients/debug-heap.js +0 -174
  231. package/dist/clients/deferred-lsp-work.js +0 -106
  232. package/dist/clients/degradation-ledger.js +0 -426
  233. package/dist/clients/demoted-finding-render.js +0 -169
  234. package/dist/clients/dependency-checker.js +0 -885
  235. package/dist/clients/deps/ast-grep-napi.js +0 -22
  236. package/dist/clients/deps/js-yaml.js +0 -9
  237. package/dist/clients/deps/minimatch.js +0 -4
  238. package/dist/clients/deps/pi-tui.js +0 -14
  239. package/dist/clients/deps/typebox.js +0 -14
  240. package/dist/clients/deps/vscode-jsonrpc.js +0 -1
  241. package/dist/clients/deps/web-tree-sitter.js +0 -24
  242. package/dist/clients/diagnostic-dispositions.js +0 -630
  243. package/dist/clients/diagnostic-line-freshness.js +0 -305
  244. package/dist/clients/diagnostic-logger.js +0 -73
  245. package/dist/clients/diagnostic-tracker.js +0 -105
  246. package/dist/clients/diagnostics-publish.js +0 -230
  247. package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  248. package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  249. package/dist/clients/dispatch/collect-later-tier.js +0 -35
  250. package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  251. package/dist/clients/dispatch/dispatcher.js +0 -1269
  252. package/dist/clients/dispatch/fact-provider-types.js +0 -1
  253. package/dist/clients/dispatch/fact-rule-runner.js +0 -17
  254. package/dist/clients/dispatch/fact-runner.js +0 -30
  255. package/dist/clients/dispatch/fact-scheduler.js +0 -68
  256. package/dist/clients/dispatch/fact-store.js +0 -377
  257. package/dist/clients/dispatch/facts/comment-facts.js +0 -22
  258. package/dist/clients/dispatch/facts/file-content.js +0 -19
  259. package/dist/clients/dispatch/facts/function-facts.js +0 -348
  260. package/dist/clients/dispatch/facts/import-facts.js +0 -204
  261. package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  262. package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  263. package/dist/clients/dispatch/finding-policy.js +0 -339
  264. package/dist/clients/dispatch/indent-detect.js +0 -417
  265. package/dist/clients/dispatch/inline-suppressions.js +0 -89
  266. package/dist/clients/dispatch/integration.js +0 -2377
  267. package/dist/clients/dispatch/lazy.js +0 -11
  268. package/dist/clients/dispatch/pending-runner-findings.js +0 -87
  269. package/dist/clients/dispatch/plan.js +0 -278
  270. package/dist/clients/dispatch/priorities.js +0 -20
  271. package/dist/clients/dispatch/rule-id-normalize.js +0 -50
  272. package/dist/clients/dispatch/rule-ignores.js +0 -69
  273. package/dist/clients/dispatch/rule-policy.js +0 -135
  274. package/dist/clients/dispatch/rules/async-noise.js +0 -40
  275. package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  276. package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  277. package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  278. package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  279. package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  280. package/dist/clients/dispatch/rules/high-complexity.js +0 -72
  281. package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  282. package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  283. package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  284. package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  285. package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  286. package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  287. package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  288. package/dist/clients/dispatch/runner-context.js +0 -52
  289. package/dist/clients/dispatch/runners/actionlint.js +0 -111
  290. package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  291. package/dist/clients/dispatch/runners/biome-check.js +0 -296
  292. package/dist/clients/dispatch/runners/cpp-check.js +0 -219
  293. package/dist/clients/dispatch/runners/credo.js +0 -82
  294. package/dist/clients/dispatch/runners/cue-vet.js +0 -416
  295. package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  296. package/dist/clients/dispatch/runners/detekt.js +0 -176
  297. package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  298. package/dist/clients/dispatch/runners/elixir-check.js +0 -195
  299. package/dist/clients/dispatch/runners/eslint.js +0 -137
  300. package/dist/clients/dispatch/runners/fact-rules.js +0 -29
  301. package/dist/clients/dispatch/runners/fish-indent.js +0 -69
  302. package/dist/clients/dispatch/runners/gleam-check.js +0 -167
  303. package/dist/clients/dispatch/runners/go-vet.js +0 -104
  304. package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  305. package/dist/clients/dispatch/runners/hadolint.js +0 -91
  306. package/dist/clients/dispatch/runners/helm-lint.js +0 -171
  307. package/dist/clients/dispatch/runners/helm-render.js +0 -940
  308. package/dist/clients/dispatch/runners/htmlhint.js +0 -117
  309. package/dist/clients/dispatch/runners/index.js +0 -108
  310. package/dist/clients/dispatch/runners/javac.js +0 -99
  311. package/dist/clients/dispatch/runners/ktlint.js +0 -110
  312. package/dist/clients/dispatch/runners/lsp.js +0 -379
  313. package/dist/clients/dispatch/runners/markdownlint.js +0 -167
  314. package/dist/clients/dispatch/runners/mypy.js +0 -102
  315. package/dist/clients/dispatch/runners/oxlint.js +0 -414
  316. package/dist/clients/dispatch/runners/php-lint.js +0 -85
  317. package/dist/clients/dispatch/runners/phpstan.js +0 -120
  318. package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  319. package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  320. package/dist/clients/dispatch/runners/pyright.js +0 -169
  321. package/dist/clients/dispatch/runners/rubocop.js +0 -99
  322. package/dist/clients/dispatch/runners/ruff.js +0 -88
  323. package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  324. package/dist/clients/dispatch/runners/shellcheck.js +0 -173
  325. package/dist/clients/dispatch/runners/shfmt.js +0 -102
  326. package/dist/clients/dispatch/runners/spellcheck.js +0 -128
  327. package/dist/clients/dispatch/runners/spotbugs.js +0 -259
  328. package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  329. package/dist/clients/dispatch/runners/stylelint.js +0 -166
  330. package/dist/clients/dispatch/runners/swiftlint.js +0 -163
  331. package/dist/clients/dispatch/runners/taplo.js +0 -174
  332. package/dist/clients/dispatch/runners/terragrunt.js +0 -168
  333. package/dist/clients/dispatch/runners/tflint.js +0 -125
  334. package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  335. package/dist/clients/dispatch/runners/trivy-config.js +0 -253
  336. package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  337. package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  338. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  339. package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  340. package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  341. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  342. package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  343. package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  344. package/dist/clients/dispatch/runners/utils.js +0 -15
  345. package/dist/clients/dispatch/runners/vale.js +0 -128
  346. package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  347. package/dist/clients/dispatch/runners/yamllint.js +0 -95
  348. package/dist/clients/dispatch/runners/zig-check.js +0 -79
  349. package/dist/clients/dispatch/suppress-writer.js +0 -79
  350. package/dist/clients/dispatch/tool-profile.js +0 -30
  351. package/dist/clients/dispatch/types.js +0 -21
  352. package/dist/clients/dispatch/utils/format-utils.js +0 -45
  353. package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  354. package/dist/clients/disposition-logger.js +0 -32
  355. package/dist/clients/disposition-publish.js +0 -124
  356. package/dist/clients/durable-store.js +0 -97
  357. package/dist/clients/effective-config.js +0 -415
  358. package/dist/clients/env-utils.js +0 -83
  359. package/dist/clients/error-class.js +0 -23
  360. package/dist/clients/eval-timestamp.js +0 -17
  361. package/dist/clients/event-loop-hold.js +0 -274
  362. package/dist/clients/event-loop-monitor.js +0 -250
  363. package/dist/clients/extension-log.js +0 -504
  364. package/dist/clients/extension-mode.js +0 -73
  365. package/dist/clients/feature-hints.js +0 -103
  366. package/dist/clients/file-kinds.js +0 -412
  367. package/dist/clients/file-role.js +0 -134
  368. package/dist/clients/file-time.js +0 -160
  369. package/dist/clients/file-utils.js +0 -1032
  370. package/dist/clients/finding-delivery-gate.js +0 -494
  371. package/dist/clients/finding-identity.js +0 -88
  372. package/dist/clients/fix-worklog.js +0 -103
  373. package/dist/clients/format-events-publish.js +0 -343
  374. package/dist/clients/format-service.js +0 -222
  375. package/dist/clients/formatters-lazy.js +0 -9
  376. package/dist/clients/formatters.js +0 -2032
  377. package/dist/clients/freshness-cadence.js +0 -17
  378. package/dist/clients/freshness.js +0 -38
  379. package/dist/clients/generated-artifacts.js +0 -394
  380. package/dist/clients/generation-guard.js +0 -215
  381. package/dist/clients/git-guard.js +0 -1136
  382. package/dist/clients/git-tracked-ignore.js +0 -243
  383. package/dist/clients/gitleaks-client.js +0 -509
  384. package/dist/clients/go-client.js +0 -104
  385. package/dist/clients/govulncheck-client.js +0 -605
  386. package/dist/clients/gradle-ktfmt-style.js +0 -348
  387. package/dist/clients/grammar-source.js +0 -465
  388. package/dist/clients/gzip-stage-write.js +0 -135
  389. package/dist/clients/hashline-anchor.js +0 -424
  390. package/dist/clients/hook-budgets.js +0 -76
  391. package/dist/clients/host-edit-normalize.js +0 -140
  392. package/dist/clients/host-ports.js +0 -39
  393. package/dist/clients/indent-retarget.js +0 -154
  394. package/dist/clients/inline-blocker-dispositions.js +0 -186
  395. package/dist/clients/install-diagnostics.js +0 -156
  396. package/dist/clients/installer/index.js +0 -5416
  397. package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  398. package/dist/clients/installer/managed-tool-refresh.js +0 -783
  399. package/dist/clients/instance-reaper-state.js +0 -7
  400. package/dist/clients/instance-reaper.js +0 -1137
  401. package/dist/clients/instance-registry-lock.js +0 -145
  402. package/dist/clients/instance-registry.js +0 -773
  403. package/dist/clients/jscpd-client.js +0 -378
  404. package/dist/clients/json-cache-read.js +0 -65
  405. package/dist/clients/knip-client.js +0 -788
  406. package/dist/clients/language-policy.js +0 -252
  407. package/dist/clients/language-profile.js +0 -361
  408. package/dist/clients/language-registry.js +0 -603
  409. package/dist/clients/latency-logger.js +0 -727
  410. package/dist/clients/lazy-import.js +0 -21
  411. package/dist/clients/ledger-bounds.js +0 -54
  412. package/dist/clients/lens-config.js +0 -404
  413. package/dist/clients/lens-engine.js +0 -358
  414. package/dist/clients/lens-events.js +0 -125
  415. package/dist/clients/lens-flag-registry.js +0 -467
  416. package/dist/clients/lens-map.js +0 -1156
  417. package/dist/clients/live-bus-emitter.js +0 -74
  418. package/dist/clients/log-cleanup.js +0 -222
  419. package/dist/clients/lsp/aggregation.js +0 -178
  420. package/dist/clients/lsp/cascade-tier.js +0 -421
  421. package/dist/clients/lsp/client.js +0 -4593
  422. package/dist/clients/lsp/config.js +0 -691
  423. package/dist/clients/lsp/content-limits.js +0 -41
  424. package/dist/clients/lsp/diagnostic-binding.js +0 -225
  425. package/dist/clients/lsp/document-drift.js +0 -467
  426. package/dist/clients/lsp/edits.js +0 -1219
  427. package/dist/clients/lsp/index.js +0 -8305
  428. package/dist/clients/lsp/inferred-project.js +0 -216
  429. package/dist/clients/lsp/jvm-runtime.js +0 -298
  430. package/dist/clients/lsp/language.js +0 -63
  431. package/dist/clients/lsp/launch.js +0 -746
  432. package/dist/clients/lsp/lombok.js +0 -158
  433. package/dist/clients/lsp/path-utils.js +0 -5
  434. package/dist/clients/lsp/pending-aux-coverage.js +0 -251
  435. package/dist/clients/lsp/position-encoding.js +0 -61
  436. package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  437. package/dist/clients/lsp/server.js +0 -3290
  438. package/dist/clients/lsp/session-roots.js +0 -192
  439. package/dist/clients/lsp/spawn-history.js +0 -17
  440. package/dist/clients/lsp/sync-kind.js +0 -56
  441. package/dist/clients/lsp/tsserver-sync.js +0 -332
  442. package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  443. package/dist/clients/lsp/wait-policy/classification.js +0 -85
  444. package/dist/clients/lsp/wait-policy/index.js +0 -10
  445. package/dist/clients/lsp/wait-policy/strategies.js +0 -392
  446. package/dist/clients/lsp/watch-queue.js +0 -61
  447. package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  448. package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  449. package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  450. package/dist/clients/lsp-budget.js +0 -186
  451. package/dist/clients/lsp-document-symbols.js +0 -110
  452. package/dist/clients/lsp-lazy.js +0 -9
  453. package/dist/clients/lsp-mutation.js +0 -396
  454. package/dist/clients/lsp-status.js +0 -59
  455. package/dist/clients/map-with-concurrency.js +0 -40
  456. package/dist/clients/mcp/analyze.js +0 -420
  457. package/dist/clients/mcp/host-shim.js +0 -31
  458. package/dist/clients/mcp/ipc.js +0 -523
  459. package/dist/clients/mcp/review.js +0 -197
  460. package/dist/clients/mcp/session.js +0 -412
  461. package/dist/clients/memory-sampler.js +0 -208
  462. package/dist/clients/message-end-attribution.js +0 -30
  463. package/dist/clients/metrics-client.js +0 -107
  464. package/dist/clients/metrics-history.js +0 -327
  465. package/dist/clients/middle-man-analysis.js +0 -263
  466. package/dist/clients/model-provider.js +0 -53
  467. package/dist/clients/module-report-lsp.js +0 -189
  468. package/dist/clients/module-report.js +0 -2150
  469. package/dist/clients/mutating-tool.js +0 -651
  470. package/dist/clients/mutation-attribution.js +0 -368
  471. package/dist/clients/mutation-bridge.js +0 -240
  472. package/dist/clients/ndjson-logger.js +0 -734
  473. package/dist/clients/observed-mutation-sources.js +0 -101
  474. package/dist/clients/observed-mutation.js +0 -1253
  475. package/dist/clients/oldtext-autopatch.js +0 -128
  476. package/dist/clients/opaque-mutation-scan.js +0 -496
  477. package/dist/clients/opengrep-client.js +0 -333
  478. package/dist/clients/opengrep-config.js +0 -76
  479. package/dist/clients/package-manager.js +0 -607
  480. package/dist/clients/package-root.js +0 -38
  481. package/dist/clients/partial-edit-apply.js +0 -439
  482. package/dist/clients/path-attribution-telemetry.js +0 -43
  483. package/dist/clients/path-keyed-map.js +0 -108
  484. package/dist/clients/path-utils.js +0 -1244
  485. package/dist/clients/performance-report.js +0 -331
  486. package/dist/clients/persist-debounce.js +0 -70
  487. package/dist/clients/persistent-reverify.js +0 -271
  488. package/dist/clients/php-cs-fixer-config.js +0 -119
  489. package/dist/clients/pipeline.js +0 -1480
  490. package/dist/clients/post-autofix-notice.js +0 -37
  491. package/dist/clients/print-mode.js +0 -21
  492. package/dist/clients/probe-home-state.js +0 -228
  493. package/dist/clients/process-bridge.js +0 -66
  494. package/dist/clients/process-singletons.js +0 -210
  495. package/dist/clients/process-snapshot.js +0 -68
  496. package/dist/clients/project-changes.js +0 -181
  497. package/dist/clients/project-conventions.js +0 -171
  498. package/dist/clients/project-diagnostics/cache.js +0 -137
  499. package/dist/clients/project-diagnostics/extractors.js +0 -109
  500. package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  501. package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  502. package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  503. package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  504. package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  505. package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  506. package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  507. package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  508. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  509. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  510. package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  511. package/dist/clients/project-diagnostics/scanner.js +0 -520
  512. package/dist/clients/project-diagnostics/types.js +0 -1
  513. package/dist/clients/project-lens-config.js +0 -807
  514. package/dist/clients/project-report.js +0 -701
  515. package/dist/clients/project-scale.js +0 -237
  516. package/dist/clients/project-scan-policy.js +0 -11
  517. package/dist/clients/project-snapshot-fingerprint.js +0 -48
  518. package/dist/clients/project-snapshot-persist-worker.js +0 -20
  519. package/dist/clients/project-snapshot.js +0 -1653
  520. package/dist/clients/project-trust.js +0 -181
  521. package/dist/clients/python-environment.js +0 -217
  522. package/dist/clients/python-provenance.js +0 -639
  523. package/dist/clients/quiet-window-config.js +0 -47
  524. package/dist/clients/quiet-window.js +0 -236
  525. package/dist/clients/read-bridge.js +0 -139
  526. package/dist/clients/read-expansion.js +0 -266
  527. package/dist/clients/read-guard-logger.js +0 -251
  528. package/dist/clients/read-guard-tool-lines.js +0 -1306
  529. package/dist/clients/read-guard.js +0 -1561
  530. package/dist/clients/recent-touches.js +0 -240
  531. package/dist/clients/redact/secrets.js +0 -449
  532. package/dist/clients/resource-sampler.js +0 -628
  533. package/dist/clients/reverse-deps.js +0 -270
  534. package/dist/clients/review-graph/builder.js +0 -5126
  535. package/dist/clients/review-graph/format.js +0 -33
  536. package/dist/clients/review-graph/git-identity.js +0 -163
  537. package/dist/clients/review-graph/import-resolvers.js +0 -481
  538. package/dist/clients/review-graph/persist-worker.js +0 -10
  539. package/dist/clients/review-graph/query.js +0 -244
  540. package/dist/clients/review-graph/revision-drift.js +0 -21
  541. package/dist/clients/review-graph/service.js +0 -96
  542. package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  543. package/dist/clients/review-graph/symbol-id.js +0 -103
  544. package/dist/clients/review-graph/tsconfig-paths.js +0 -299
  545. package/dist/clients/review-graph/types.js +0 -1
  546. package/dist/clients/review-graph/workspace-modules.js +0 -449
  547. package/dist/clients/review-graph-logger.js +0 -81
  548. package/dist/clients/ruff-client.js +0 -179
  549. package/dist/clients/rules-scanner.js +0 -131
  550. package/dist/clients/run-duration.js +0 -55
  551. package/dist/clients/runtime-agent-end.js +0 -746
  552. package/dist/clients/runtime-config.js +0 -77
  553. package/dist/clients/runtime-context.js +0 -211
  554. package/dist/clients/runtime-coordinator.js +0 -1324
  555. package/dist/clients/runtime-session.js +0 -2485
  556. package/dist/clients/runtime-tool-call.js +0 -1295
  557. package/dist/clients/runtime-tool-result.js +0 -2049
  558. package/dist/clients/runtime-turn.js +0 -3767
  559. package/dist/clients/rust-client.js +0 -97
  560. package/dist/clients/safe-spawn.js +0 -2357
  561. package/dist/clients/sanitize.js +0 -286
  562. package/dist/clients/scan-utils.js +0 -25
  563. package/dist/clients/scratch-tree-policy.js +0 -165
  564. package/dist/clients/search-read-registration.js +0 -94
  565. package/dist/clients/secret-findings.js +0 -114
  566. package/dist/clients/security-scan-client.js +0 -352
  567. package/dist/clients/session-event-guard.js +0 -297
  568. package/dist/clients/session-lifecycle.js +0 -484
  569. package/dist/clients/session-start-observability.js +0 -94
  570. package/dist/clients/session-state-store.js +0 -101
  571. package/dist/clients/session-summary.js +0 -15
  572. package/dist/clients/sessionstart-logger.js +0 -27
  573. package/dist/clients/sg-runner.js +0 -876
  574. package/dist/clients/sgconfig.js +0 -347
  575. package/dist/clients/shared-checkout-guard.js +0 -338
  576. package/dist/clients/single-flight.js +0 -158
  577. package/dist/clients/situational-tool-telemetry.js +0 -108
  578. package/dist/clients/skills-resolver.js +0 -141
  579. package/dist/clients/slow-fs.js +0 -138
  580. package/dist/clients/smells-rollup.js +0 -231
  581. package/dist/clients/source-filter.js +0 -596
  582. package/dist/clients/source-walker.js +0 -211
  583. package/dist/clients/spawn-output-cap.js +0 -120
  584. package/dist/clients/spawn-timeout-cooldown.js +0 -110
  585. package/dist/clients/stale-marker.js +0 -17
  586. package/dist/clients/startup-scan.js +0 -400
  587. package/dist/clients/startup-timing.js +0 -130
  588. package/dist/clients/string-utils.js +0 -33
  589. package/dist/clients/subagent-mode.js +0 -111
  590. package/dist/clients/symbol-containment.js +0 -24
  591. package/dist/clients/symbol-types.js +0 -5
  592. package/dist/clients/test-runner-client.js +0 -2507
  593. package/dist/clients/test-runner-delivery.js +0 -287
  594. package/dist/clients/todo-scanner.js +0 -229
  595. package/dist/clients/tool-agreement.js +0 -423
  596. package/dist/clients/tool-config.js +0 -249
  597. package/dist/clients/tool-cwd.js +0 -270
  598. package/dist/clients/tool-definition.js +0 -47
  599. package/dist/clients/tool-event.js +0 -105
  600. package/dist/clients/tool-policy.js +0 -2755
  601. package/dist/clients/tool-probe.js +0 -53
  602. package/dist/clients/tool-render.js +0 -156
  603. package/dist/clients/tool-set-policy.js +0 -118
  604. package/dist/clients/tree-sitter-cache.js +0 -364
  605. package/dist/clients/tree-sitter-client.js +0 -4195
  606. package/dist/clients/tree-sitter-logger.js +0 -100
  607. package/dist/clients/tree-sitter-navigator.js +0 -269
  608. package/dist/clients/tree-sitter-query-loader.js +0 -569
  609. package/dist/clients/tree-sitter-shared.js +0 -158
  610. package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  611. package/dist/clients/trivy-client.js +0 -467
  612. package/dist/clients/tui-fit.js +0 -50
  613. package/dist/clients/turn-context.js +0 -52
  614. package/dist/clients/turn-end/lane.js +0 -51
  615. package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  616. package/dist/clients/turn-end/lanes/secrets.js +0 -204
  617. package/dist/clients/turn-summary-render.js +0 -72
  618. package/dist/clients/turn-summary.js +0 -132
  619. package/dist/clients/typos-config.js +0 -29
  620. package/dist/clients/user-notify.js +0 -51
  621. package/dist/clients/vanished-instance-marker.js +0 -57
  622. package/dist/clients/warm-attach.js +0 -305
  623. package/dist/clients/widget-state.js +0 -1808
  624. package/dist/clients/word-index-logger.js +0 -49
  625. package/dist/clients/word-index-store.js +0 -459
  626. package/dist/clients/word-index.js +0 -2080
  627. package/dist/clients/workspace-topology.js +0 -443
  628. package/dist/clients/write-ordering-guard.js +0 -65
  629. package/dist/clients/zizmor-config.js +0 -340
  630. package/dist/i18n.js +0 -69
  631. package/dist/mcp/build-staleness.js +0 -124
  632. package/dist/scripts/lib/process-scan.mjs +0 -583
  633. package/dist/scripts/lib/skills-predicate.mjs +0 -129
  634. package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  635. package/dist/tools/activate-tools.js +0 -87
  636. package/dist/tools/ast-grep-outline.js +0 -137
  637. package/dist/tools/ast-grep-replace.js +0 -244
  638. package/dist/tools/ast-grep-search.js +0 -762
  639. package/dist/tools/effective-config.js +0 -90
  640. package/dist/tools/lens-diagnostic-mark.js +0 -375
  641. package/dist/tools/lens-diagnostics.js +0 -2571
  642. package/dist/tools/lsp-diagnostics.js +0 -1745
  643. package/dist/tools/lsp-navigation.js +0 -1367
  644. package/dist/tools/lsp-structured-output.js +0 -294
  645. package/dist/tools/module-report.js +0 -382
  646. package/dist/tools/project-report.js +0 -86
  647. package/dist/tools/render-compact.js +0 -374
  648. package/dist/tools/scan-progress.js +0 -53
  649. package/dist/tools/shared.js +0 -29
  650. package/dist/tools/symbol-search.js +0 -155
@@ -1,21 +0,0 @@
1
- export function createLazyImport(load) {
2
- let cached;
3
- return {
4
- get() {
5
- // `Promise.resolve().then(load)` (not a bare `load()`) so a loader
6
- // that throws SYNCHRONOUSLY — rather than returning a rejected
7
- // promise — still yields a rejected promise instead of throwing out
8
- // of `get()` itself. `import(...)` never throws synchronously, but a
9
- // caller-supplied `load` is not guaranteed to keep that contract.
10
- return (cached ??= Promise.resolve()
11
- .then(() => load())
12
- .catch((err) => {
13
- cached = undefined;
14
- throw err;
15
- }));
16
- },
17
- resetForTests() {
18
- cached = undefined;
19
- },
20
- };
21
- }
@@ -1,54 +0,0 @@
1
- /**
2
- * The degradation ledger's field-truncation policy, as a leaf module (#1816).
3
- *
4
- * It lives here rather than in `degradation-ledger.ts` because reason BUILDERS
5
- * (`formatToolFailure`, `firstOutputLine`) need the bound without importing the
6
- * ledger itself. Test files routinely `vi.mock` the ledger to observe recorded
7
- * degradations; a builder that reached through that mock for a constant would
8
- * break every one of them.
9
- */
10
- /** The single truncation bound for every ledger field, and for the reasons callers build. */
11
- export const LEDGER_FIELD_MAX = 200;
12
- /**
13
- * How many retained entries the ledger keeps per kind — and therefore the bound
14
- * any producer of ledger-bound records sizes itself to.
15
- *
16
- * Moved here from `degradation-ledger.ts` (#2426) for the reason this module's
17
- * doc comment already gives: `config-core/records.ts` bounds its collector to
18
- * this number, and reading it off the LEDGER made the config core import a sink
19
- * it is documented not to touch ("Pure: no state, no I/O, no ledger writes").
20
- * That import also broke three suites that `vi.mock` the ledger wholesale — the
21
- * exact failure mode this leaf exists to prevent — and closed seven import
22
- * cycles once the config loaders started resolving through the core.
23
- */
24
- export const DEGRADATION_ENTRIES_PER_KIND = 20;
25
- export function normalizeForLedger(value) {
26
- if (value === null || value === undefined)
27
- return "unknown";
28
- // A plain object or array has no `toString` of its own, so `String()`
29
- // writes "[object Object]" — a ledger row that names nothing. Serialise
30
- // those; everything else (Error, Date, URL, primitives, class instances)
31
- // keeps its `String()` form. An object carrying its OWN `toString` goes
32
- // through `String()` too, so a throwing one still raises into the
33
- // ledger's corrupted-input failsafe (#2703 r1 F1) instead of being
34
- // admitted as "{}". Circular input degrades to a fixed marker.
35
- if (typeof value === "object" && !Object.hasOwn(value, "toString")) {
36
- const proto = Object.getPrototypeOf(value);
37
- if (proto === Object.prototype || proto === null || Array.isArray(value)) {
38
- try {
39
- return JSON.stringify(value) ?? "unknown";
40
- }
41
- catch {
42
- return "[unserializable object]";
43
- }
44
- }
45
- }
46
- return String(value);
47
- }
48
- /** Bound a value to `LEDGER_FIELD_MAX`, marking the elision. */
49
- export function truncateForLedger(value) {
50
- const text = normalizeForLedger(value);
51
- return text.length > LEDGER_FIELD_MAX
52
- ? `${text.slice(0, LEDGER_FIELD_MAX)}…`
53
- : text;
54
- }
@@ -1,404 +0,0 @@
1
- import { resetIgnoredConfigWarnCache, warnIgnoredConfigOnce, } from "./config-warn.js";
2
- import { recordDegradationOnce } from "./degradation-ledger.js";
3
- import { errorClassName } from "./error-class.js";
4
- import * as path from "node:path";
5
- import { assignFlagConfigSection, flagConfigSectionKeys, flagValueFromConfig, getLensFlagSpec, GLOBAL_NON_FLAG_CONFIG_SECTIONS, LENS_FLAGS, readFlagConfigValue, } from "./lens-flag-registry.js";
6
- import { CANONICAL_GLOBAL_CONFIG_FILE, canonicalPathIdentity, getPiLensGlobalConfigPath, getProductionGlobalConfigResolution, GLOBAL_CONFIG_LOCATIONS, LEGACY_ROOT_LSP_KEYS, } from "./config-locations.js";
7
- // Re-exported so this module's own, pre-existing import sites (`./lens-config.js`
8
- // / `../lens-config.js`) keep working. The function itself now lives in
9
- // `config-locations.ts` (#2426 review round 3, S1) — see the doc comment there.
10
- export { getPiLensGlobalConfigPath, getProductionGlobalConfigResolution, isResolvedGlobalConfigPath, resolveGlobalConfigLocation, resetGlobalConfigLocationCache, } from "./config-locations.js";
11
- import { ignoredRecordCollector, readConfigDocument, reportConfigReadFailure, reportPiLensConfigRecords, resolveOnePiLensConfigDocument, } from "./config-resolve.js";
12
- import { findNestedProjectMutationValue, } from "./project-lens-config.js";
13
- import { readToolConfig } from "./tool-config.js";
14
- /**
15
- * The canonical global location, looked up rather than constructed, so a change
16
- * to the shared table cannot leave this loader describing a file that is no
17
- * longer canonical.
18
- */
19
- function globalCanonicalLocation() {
20
- const location = GLOBAL_CONFIG_LOCATIONS.find((candidate) => candidate.relativePath === CANONICAL_GLOBAL_CONFIG_FILE);
21
- if (!location) {
22
- throw new Error(`no canonical global config location named ${CANONICAL_GLOBAL_CONFIG_FILE}`);
23
- }
24
- return location;
25
- }
26
- /**
27
- * Same warn-once-per-(path, reason) contract as project-lens-config.ts's
28
- * `warnInvalidConfigOnce` — a malformed global config value is logged once
29
- * and then treated as absent, rather than silently dropped (#792). Since #2418
30
- * the latch, the log line, the durable ledger row, and the stable-coded
31
- * notification all live in the one shared seam.
32
- */
33
- function warnInvalidGlobalConfigOnce(configPath, reason, code) {
34
- warnIgnoredConfigOnce({
35
- subsystem: "lens-config",
36
- file: configPath,
37
- reason,
38
- ...(code === undefined ? {} : { code }),
39
- });
40
- }
41
- /** For tests that need to force the warn-once cache to reset between cases. */
42
- export function resetGlobalConfigWarnCache() {
43
- resetIgnoredConfigWarnCache("lens-config");
44
- }
45
- function asConfigObject(value) {
46
- return value && typeof value === "object" && !Array.isArray(value)
47
- ? value
48
- : undefined;
49
- }
50
- /**
51
- * Report a probe-error RETENTION decision once (global-config-location PR,
52
- * refs #2457; review H2 remedy B).
53
- *
54
- * Fired by `loadPiLensGlobalConfig` when it derived the path itself and the
55
- * resolution retained a location whose existence probe THREW. The record
56
- * names the retained path (subject) and the failed probe's error class;
57
- * once per session via `recordDegradationOnce`. A successful
58
- * non-canonical selection fires nothing (opt-in by file creation, visible
59
- * via `pilens_effective_config`).
60
- */
61
- function reportGlobalConfigProbeRetention() {
62
- const resolution = getProductionGlobalConfigResolution();
63
- if (resolution.source !== "legacy-default-unprobed" &&
64
- resolution.source !== "pi-coding-agent-dir-unprobed") {
65
- return;
66
- }
67
- recordDegradationOnce({
68
- kind: "config-location-probe-failed",
69
- subject: resolution.path,
70
- reason: `existence probe for ${resolution.existsProbeFailed?.path} failed (${resolution.existsProbeFailed?.errorClassName}); the location is retained as the config source and its read failures report through PILENS_CFG_0001`,
71
- metadata: { subsystem: "lens-config", configPath: resolution.path },
72
- });
73
- }
74
- /** Report a lower-precedence global config that exists beside the winner. */
75
- function reportGlobalConfigShadowing() {
76
- const resolution = getProductionGlobalConfigResolution();
77
- if (resolution.shadowedPath === undefined)
78
- return;
79
- const winningPath = canonicalPathIdentity(resolution.path);
80
- const shadowedPath = canonicalPathIdentity(resolution.shadowedPath);
81
- recordDegradationOnce({
82
- kind: "config-location-shadowed",
83
- subject: winningPath,
84
- reason: `shadowed global config ${shadowedPath}; winning path is the record subject`,
85
- metadata: {
86
- subsystem: "lens-config",
87
- configPath: winningPath,
88
- shadowedPath,
89
- },
90
- code: "PILENS_CFG_0010",
91
- });
92
- }
93
- export function loadPiLensGlobalConfig(configPath) {
94
- // An unresolvable existence probe on the derived path is the one decision
95
- // that must carry its own bounded record (#3251 review H2 remedy B): the
96
- // resolution RETAINED the location it could not evaluate, the read below
97
- // reports its own `config-ignored` row when it fails, and this record
98
- // names the retention decision itself - the failed probe's path and error
99
- // class - so "different settings silently applying" is impossible.
100
- // Explicit-path callers stay silent (#2427 quiet contract); the default
101
- // parameter is evaluated FIRST so the body can tell derived from explicit.
102
- const derivedPath = configPath === undefined;
103
- if (derivedPath) {
104
- reportGlobalConfigProbeRetention();
105
- reportGlobalConfigShadowing();
106
- }
107
- const resolvedPath = configPath ?? getPiLensGlobalConfigPath();
108
- const location = globalCanonicalLocation();
109
- // #2445: this used to be `JSON.parse(fs.readFileSync(...))` inside a bare
110
- // `catch { return undefined; }`, so a malformed `~/.pi-lens/config.json`
111
- // produced ZERO signal of its own — no log line, no ledger row, no
112
- // notification. The only thing a user saw was the LSP loader's report of the
113
- // SAME file, mislabelled "ignoring invalid LSP config", because that loader
114
- // resolves the canonical global too. Both halves are fixed together: the
115
- // read/parse failure is reported here, under `lens-config`, and
116
- // `reportConfigReadFailure` derives the subsystem from the DOCUMENT so the
117
- // LSP loader's report of this file lands under `lens-config` as well and the
118
- // warn-once latch collapses the two into one honest notice.
119
- const outcome = readConfigDocument(resolvedPath);
120
- if (outcome.status === "missing")
121
- return undefined;
122
- if (outcome.status === "error") {
123
- reportConfigReadFailure({
124
- file: resolvedPath,
125
- location,
126
- tier: "global",
127
- error: outcome.error,
128
- sourceText: outcome.sourceText,
129
- });
130
- return undefined;
131
- }
132
- // Every notice this projection composes is BUFFERED and bounded once, at the
133
- // end, through the SAME `ignoredRecordCollector` the project loader uses
134
- // (#2426 review round 6, F3; round 7, F2). It used to report each one the
135
- // moment it was composed, with no collector anywhere in this function, so
136
- // the unknown-top-level-key scan below — whose count is the number of keys
137
- // the user typed — put 100 notifications on screen for a 100-key
138
- // `~/.pi-lens/config.json` while the project loader's identical scan of an
139
- // identical file produced 19 and a count. Two changelog fragments already
140
- // claimed one bound for every producer; this is the producer that did not
141
- // have one.
142
- //
143
- // Round 6 gave it that bound by COPYING the project loader's, which left two
144
- // spellings of one record literal differing only in a tier. Round 7 moved
145
- // the seam into `config-resolve.ts`, which both loaders already import, and
146
- // made the tier an argument. This loader never passes a `{ parseError }`:
147
- // its read/parse failure is reported above by `reportConfigReadFailure`,
148
- // before the projection starts.
149
- //
150
- // The flush is in a `finally` so a throw in the projection still delivers
151
- // what was composed before it, on top of the whole-config record the catch
152
- // adds.
153
- const { note, records: notedRecords } = ignoredRecordCollector(resolvedPath, "global");
154
- try {
155
- const parsed = outcome.value;
156
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
157
- // The other half of the same silence: a file that PARSES but is a list
158
- // or a scalar is not a config either, and was dropped without a word.
159
- note("top-level value must be an object");
160
- return undefined;
161
- }
162
- // Through the #2425 core (#2426). The canonical global file is resolved as
163
- // a single `global`-tier source against the canonical schema, so the depth
164
- // bound, the prototype-key policy and the declared `lsp.*` types apply to
165
- // `~/.pi-lens/config.json` exactly as they do to `.pi-lens.json`. The
166
- // field-by-field projection below is unchanged and keeps owning the
167
- // per-key prose its tests assert on — the core validates the SHAPE, this
168
- // function still decides what a bad value is called.
169
- const document = {
170
- tier: "global",
171
- file: resolvedPath,
172
- location,
173
- value: parsed,
174
- };
175
- const resolved = resolveOnePiLensConfigDocument(document);
176
- // EVERY record this document produced (#2426 review round 3, F1) — not
177
- // filtered to what this loader "owns". `reportPiLensConfigRecords` derives
178
- // the reporting subsystem per record; the warn-once latch collapses a
179
- // duplicate report of the SAME record from the LSP loader's resolution of
180
- // this same file (it resolves the canonical global too) into one notice.
181
- reportPiLensConfigRecords(resolved.records);
182
- const raw = resolved.value;
183
- const warnInvalid = note;
184
- const config = {};
185
- const toolConfig = readToolConfig(raw, warnInvalid);
186
- if (toolConfig)
187
- config.tools = toolConfig;
188
- for (const spec of LENS_FLAGS) {
189
- if (spec.readGlobal)
190
- continue;
191
- assignFlagConfigSection(raw, config, spec.configKey, warnInvalid);
192
- }
193
- const ignore = Array.isArray(raw.ignore)
194
- ? raw.ignore.filter((p) => typeof p === "string")
195
- : undefined;
196
- if (ignore && ignore.length > 0)
197
- config.ignore = ignore;
198
- const startup = asConfigObject(raw.startup);
199
- if (startup) {
200
- const startupConfig = {};
201
- const mode = startup.mode;
202
- const scans = asConfigObject(startup.scans);
203
- if (mode === "quick" || mode === "full" || mode === "minimal")
204
- startupConfig.mode = mode;
205
- else if ("mode" in startup)
206
- warnInvalid('startup.mode must be "quick", "full", or "minimal"');
207
- if (scans) {
208
- if (typeof scans.enabled === "boolean") {
209
- startupConfig.scans = { enabled: scans.enabled };
210
- }
211
- else if ("enabled" in scans)
212
- warnInvalid("startup.scans.enabled must be a boolean");
213
- }
214
- if (startupConfig.mode !== undefined || startupConfig.scans !== undefined)
215
- config.startup = startupConfig;
216
- }
217
- const dispatch = asConfigObject(raw.dispatch);
218
- if (dispatch) {
219
- const floor = dispatch.runnerTimeoutFloorMs;
220
- if (typeof floor === "number" && Number.isFinite(floor) && floor > 0) {
221
- config.dispatch = { runnerTimeoutFloorMs: floor };
222
- }
223
- else {
224
- // #533: warn only when the key is PRESENT but malformed — an absent
225
- // key stays silent so a config that never mentions it is not falsely
226
- // flagged. Same warn-once path as the maxFixes case below.
227
- if ("runnerTimeoutFloorMs" in dispatch) {
228
- warnInvalid("dispatch.runnerTimeoutFloorMs must be a positive finite number");
229
- }
230
- config.dispatch = { runnerTimeoutFloorMs: undefined };
231
- }
232
- }
233
- const autoFix = asConfigObject(asConfigObject(raw.actionableWarnings)?.autoFix);
234
- if (autoFix && "maxFixes" in autoFix) {
235
- if (typeof autoFix.maxFixes === "number" &&
236
- Number.isFinite(autoFix.maxFixes) &&
237
- autoFix.maxFixes >= 0) {
238
- config.actionableWarnings ??= {};
239
- const warnings = config.actionableWarnings;
240
- warnings.autoFix ??= {};
241
- warnings.autoFix.maxFixes = Math.floor(autoFix.maxFixes);
242
- }
243
- else {
244
- warnInvalid("actionableWarnings.autoFix.maxFixes must be a non-negative finite number");
245
- }
246
- }
247
- const widget = asConfigObject(raw.widget);
248
- if (widget) {
249
- if (typeof widget.visible === "boolean") {
250
- config.widget = { visible: widget.visible };
251
- }
252
- else {
253
- // #533: present-but-wrong-type warns; absent stays silent.
254
- if ("visible" in widget) {
255
- warnInvalid("widget.visible must be a boolean");
256
- }
257
- config.widget = { visible: undefined };
258
- }
259
- }
260
- const format = asConfigObject(raw.format);
261
- if (format) {
262
- config.format ??= {};
263
- const formatSection = config.format;
264
- if (format.mode === "immediate" || format.mode === "deferred") {
265
- formatSection.mode = format.mode;
266
- }
267
- else {
268
- // #533: a present-but-invalid mode (e.g. "immedaite") warns and // spellchecker:disable-line
269
- // falls back; an absent mode stays silent.
270
- if ("mode" in format) {
271
- warnInvalid('format.mode must be "immediate" or "deferred"');
272
- }
273
- formatSection.mode = undefined;
274
- }
275
- }
276
- // #533 hygiene: a completely unknown top-level key (e.g. a typo like
277
- // `lps` for `lsp`) is otherwise dropped silently, so a setting the user
278
- // thought they made does nothing with no signal. Warn once per key. The
279
- // recognized set is single-sourced (#883): the flag sections derived
280
- // from the registry plus the declared non-flag global sections
281
- // (`GLOBAL_NON_FLAG_CONFIG_SECTIONS`, which co-locates `$schema` and the
282
- // hand-parsed namespaces beside the registry). Adding a flag needs no
283
- // edit here; adding a namespace is a one-line edit in that one constant.
284
- //
285
- // `LEGACY_ROOT_LSP_KEYS` joins them for #2426 review round 4, F1. The four
286
- // legacy root LSP keys are read out of THIS file by the LSP loader and
287
- // their values are applied, exactly as they are in a project
288
- // `.pi-lens.json` — where `PROJECT_FOREIGN_CONFIG_NAMESPACES` has
289
- // tolerated them since #2426. The global scan never got the same
290
- // treatment, so `~/.pi-lens/config.json` with a root `warmFiles` both
291
- // honored the setting and called it a typo in the same session. Spread
292
- // from the registry-derived list rather than restated: `lens-config.ts`
293
- // already imports `config-locations.ts`, which derives it from
294
- // `DEPRECATED_CONFIG_SURFACES`, so the accepted set and the removal
295
- // schedule cannot drift apart and there is no second copy of the names.
296
- const knownGlobalConfigKeys = new Set([
297
- ...flagConfigSectionKeys(LENS_FLAGS),
298
- ...GLOBAL_NON_FLAG_CONFIG_SECTIONS,
299
- ...LEGACY_ROOT_LSP_KEYS,
300
- ]);
301
- for (const key of Object.keys(raw)) {
302
- if (!knownGlobalConfigKeys.has(key)) {
303
- warnInvalid(`unknown key "${key}" is not a recognized pi-lens setting (check for a typo); ignored`);
304
- }
305
- }
306
- return config;
307
- }
308
- catch (error) {
309
- // #2426 review round 5, S-C. The other half of #2445's silence. The
310
- // read/parse failure above now reports, but everything AFTER the parse —
311
- // the resolution through the core and the field-by-field projection —
312
- // still sat under a bare `catch { return undefined }`, so a throw in any
313
- // of it dropped the WHOLE global config with no log line, no ledger row
314
- // and no notification: pi-lens ran on defaults and said nothing, which is
315
- // the exact defect #2445 was filed for.
316
- //
317
- // `PILENS_CFG_0008` ("config resolution failed; whole configuration
318
- // ignored") rather than `0001`, and the ERROR CLASS only, never its
319
- // message, which could quote the file — the same rule `resolveConfig`'s
320
- // own guard follows for the same reason. Round 5 used `0005` here, which
321
- // is registered as a per-FIELD rejection: a user matching on it would
322
- // have expected one setting to be missing rather than the whole file
323
- // (#2426 review round 6, S1). `errorClassName` (#2451) is the ONE
324
- // implementation of "class name, never the message" — this loader
325
- // already imports `config-warn.js` for the rest of the seam, so it could
326
- // call `normalizeParseErrorReason({ classOnly: true })` directly, but
327
- // calling the same leaf `config-warn.ts` itself delegates to keeps every
328
- // caller of this guarantee, `config-core/` included, on ONE
329
- // implementation rather than two that happen to agree today.
330
- warnInvalidGlobalConfigOnce(resolvedPath, `global config could not be interpreted (${errorClassName(error)}); configuration ignored`, "PILENS_CFG_0008");
331
- return undefined;
332
- }
333
- finally {
334
- reportPiLensConfigRecords(notedRecords());
335
- }
336
- }
337
- export function getGlobalIgnorePatterns(configPath) {
338
- return loadPiLensGlobalConfig(configPath)?.ignore ?? [];
339
- }
340
- export function getGlobalWidgetDefaultVisible(configPath) {
341
- return loadPiLensGlobalConfig(configPath)?.widget?.visible !== false;
342
- }
343
- /** Per-turn quickfix cap; undefined means "use the built-in default of 5". */
344
- export function getGlobalActionableWarningMaxFixes(configPath) {
345
- return loadPiLensGlobalConfig(configPath)?.actionableWarnings?.autoFix
346
- ?.maxFixes;
347
- }
348
- /**
349
- * Resolve a flag AND report which config tier decided it — same precedence
350
- * as {@link resolvePiLensFlag} (which now delegates here), just also
351
- * returning the `source` so callers can log e.g.
352
- * "(--no-autofix, source=project)" instead of a bare boolean (#792).
353
- *
354
- * Every tier is driven by `clients/lens-flag-registry.ts` (#166): the spec's
355
- * `configKey` is read out of each config object rather than matched by a
356
- * per-flag branch, so a new toggle needs no change here at all.
357
- *
358
- * Precedence: env → cli → nested-project → project → global → default.
359
- * Project tiers apply to `scope: "project"` flags only (maintainer decision —
360
- * project wins over global, including re-enabling; only an explicit CLI
361
- * disabling flag outranks project config). A name with no registry entry
362
- * passes its CLI value straight through, which is how untyped string flags
363
- * like `--lens-opengrep-config` keep working.
364
- */
365
- export function resolvePiLensFlagWithSource(name, value, config, projectConfig, editedFilePath, projectRoot) {
366
- const spec = getLensFlagSpec(name);
367
- if (spec?.env && process.env[spec.env] === "1") {
368
- return { value: true, source: "env" };
369
- }
370
- if (value)
371
- return { value, source: "cli" };
372
- if (!spec)
373
- return { value, source: "default" };
374
- if (spec.scope === "project") {
375
- const nested = editedFilePath && projectRoot
376
- ? findNestedProjectMutationValue(spec, editedFilePath, projectRoot)
377
- : undefined;
378
- if (nested) {
379
- return {
380
- value: flagValueFromConfig(spec, nested.value),
381
- source: path.resolve(nested.dir) === path.resolve(projectRoot)
382
- ? "project"
383
- : `nested-project:${nested.dir}`,
384
- };
385
- }
386
- const projectValue = readFlagConfigValue(projectConfig, spec.configKey);
387
- if (projectValue !== undefined) {
388
- return {
389
- value: flagValueFromConfig(spec, projectValue),
390
- source: "project",
391
- };
392
- }
393
- }
394
- const globalValue = spec.readGlobal
395
- ? spec.readGlobal((config ?? {}))
396
- : readFlagConfigValue(config, spec.configKey);
397
- if (globalValue !== undefined) {
398
- return { value: flagValueFromConfig(spec, globalValue), source: "global" };
399
- }
400
- return { value: spec.default, source: "default" };
401
- }
402
- export function resolvePiLensFlag(name, value, config, projectConfig, editedFilePath, projectRoot) {
403
- return resolvePiLensFlagWithSource(name, value, config, projectConfig, editedFilePath, projectRoot).value;
404
- }