pi-lens 4.3.0 → 4.4.1

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 (659) hide show
  1. package/CHANGELOG.md +1159 -0
  2. package/README.md +116 -25
  3. package/config/dependency-cruiser-eager-allowlist.json +6 -2
  4. package/dist/chunk-2BEMIWEW.js +51 -0
  5. package/dist/chunk-2EECBNC5.js +89 -0
  6. package/dist/chunk-2FQ62SPM.js +83 -0
  7. package/dist/chunk-2UMYMRI3.js +118 -0
  8. package/dist/chunk-34OCDWOS.js +48 -0
  9. package/dist/chunk-3FERWMCH.js +144 -0
  10. package/dist/chunk-3JL6IFD7.js +97 -0
  11. package/dist/chunk-3JSEWUWI.js +327 -0
  12. package/dist/chunk-3MED75HT.js +37 -0
  13. package/dist/chunk-3MRXIJ6I.js +79 -0
  14. package/dist/chunk-3P4PF2BX.js +2250 -0
  15. package/dist/chunk-3PNFWVHT.js +201 -0
  16. package/dist/chunk-3TTPKMEF.js +162 -0
  17. package/dist/chunk-5JHXUETW.js +326 -0
  18. package/dist/chunk-5W3R6LFT.js +24 -0
  19. package/dist/chunk-64LU2OVH.js +341 -0
  20. package/dist/chunk-6B5I6ICN.js +44 -0
  21. package/dist/chunk-6P54TMWL.js +274 -0
  22. package/dist/chunk-6UYA642J.js +145 -0
  23. package/dist/chunk-6XX5HCLK.js +398 -0
  24. package/dist/chunk-7AXO3ZDF.js +30 -0
  25. package/dist/chunk-7BX5DWSA.js +1907 -0
  26. package/dist/chunk-7ELY2CSM.js +902 -0
  27. package/dist/chunk-7M4T5N3V.js +38 -0
  28. package/dist/chunk-7U2IDNXN.js +37 -0
  29. package/dist/chunk-ABBOA7UD.js +157 -0
  30. package/dist/chunk-AFZYMAIV.js +756 -0
  31. package/dist/chunk-ALQRYH6O.js +112 -0
  32. package/dist/chunk-AXKPQ6ZI.js +1610 -0
  33. package/dist/chunk-BHWHXMQ2.js +62 -0
  34. package/dist/chunk-BJF25SUG.js +22 -0
  35. package/dist/chunk-BNKLYOOO.js +18 -0
  36. package/dist/chunk-BW5KFIQC.js +59 -0
  37. package/dist/chunk-CBD2B5CP.js +599 -0
  38. package/dist/chunk-CFYISHUW.js +42 -0
  39. package/dist/chunk-CMU4RMJB.js +30 -0
  40. package/dist/chunk-CULQYFLU.js +14 -0
  41. package/dist/chunk-D65GOCJB.js +289 -0
  42. package/dist/chunk-D6YF5HKX.js +59 -0
  43. package/dist/chunk-DMS52BEP.js +342 -0
  44. package/dist/chunk-ELVWJYRV.js +211 -0
  45. package/dist/chunk-EUT3B22Y.js +27 -0
  46. package/dist/chunk-F5VLZHUW.js +146 -0
  47. package/dist/chunk-FC4RP4I2.js +12 -0
  48. package/dist/chunk-FGALODG3.js +55 -0
  49. package/dist/chunk-G3RLJYA2.js +2358 -0
  50. package/dist/chunk-GAYGGICG.js +32 -0
  51. package/dist/chunk-H2W2AXD3.js +419 -0
  52. package/dist/chunk-H5EV3VMF.js +114 -0
  53. package/dist/chunk-HREZQCT3.js +106 -0
  54. package/dist/chunk-HSIRMK2D.js +517 -0
  55. package/dist/chunk-IMSQR4WO.js +184 -0
  56. package/dist/chunk-IQZXOZ7S.js +4816 -0
  57. package/dist/chunk-IR6XFA5P.js +37 -0
  58. package/dist/chunk-IUKPRZER.js +78 -0
  59. package/dist/chunk-IUR76K6A.js +262 -0
  60. package/dist/chunk-J3FZR3YY.js +98 -0
  61. package/dist/chunk-J6DFZDFA.js +562 -0
  62. package/dist/chunk-J7WJZ6W7.js +50 -0
  63. package/dist/chunk-JONGANYH.js +202 -0
  64. package/dist/chunk-KJCWXUUS.js +425 -0
  65. package/dist/chunk-KJN4IOEJ.js +17 -0
  66. package/dist/chunk-KMGPUKFD.js +25 -0
  67. package/dist/chunk-LD7WFTRX.js +4533 -0
  68. package/dist/chunk-LJDODBBZ.js +78 -0
  69. package/dist/chunk-LNOMA3MP.js +169 -0
  70. package/dist/chunk-MGIWSROG.js +2334 -0
  71. package/dist/chunk-MQA2YBAH.js +308 -0
  72. package/dist/chunk-MTDRLSI7.js +21720 -0
  73. package/dist/chunk-N2IRDBZI.js +2355 -0
  74. package/dist/chunk-N77WFUL7.js +50 -0
  75. package/dist/chunk-N7YNJE5R.js +466 -0
  76. package/dist/chunk-NABLC7W3.js +148 -0
  77. package/dist/chunk-NFXP47RV.js +999 -0
  78. package/dist/chunk-NJF2X5XF.js +45 -0
  79. package/dist/chunk-NXL4FFQQ.js +47 -0
  80. package/dist/chunk-O7HZX7CA.js +309 -0
  81. package/dist/chunk-OC7LYAU5.js +708 -0
  82. package/dist/chunk-OEX24ECI.js +348 -0
  83. package/dist/chunk-OYOB3ZFG.js +78 -0
  84. package/dist/chunk-OYTMZXRF.js +41 -0
  85. package/dist/chunk-OZJINN4O.js +84 -0
  86. package/dist/chunk-PCHDGUKT.js +23 -0
  87. package/dist/chunk-QOZXJ4NA.js +3364 -0
  88. package/dist/chunk-QYF5S6P6.js +45 -0
  89. package/dist/chunk-RJFED73B.js +79 -0
  90. package/dist/chunk-RTQNRM5X.js +27 -0
  91. package/dist/chunk-S6AMWKPC.js +189 -0
  92. package/dist/chunk-T4QZ6FEH.js +308 -0
  93. package/dist/chunk-T54VJRAD.js +5456 -0
  94. package/dist/chunk-TA5L5KWQ.js +167 -0
  95. package/dist/chunk-TQFBZVCG.js +27 -0
  96. package/dist/chunk-U52SAGRM.js +62 -0
  97. package/dist/chunk-UEAHAMEI.js +5814 -0
  98. package/dist/chunk-UGSMCQ4D.js +327 -0
  99. package/dist/chunk-UOPVJQ4N.js +103 -0
  100. package/dist/chunk-USHG4DLH.js +459 -0
  101. package/dist/chunk-UXVNL3D7.js +23 -0
  102. package/dist/chunk-V5MEBST3.js +4139 -0
  103. package/dist/chunk-VGEVL5EQ.js +29 -0
  104. package/dist/chunk-VPWKF3GN.js +87 -0
  105. package/dist/chunk-VSMJK3ZJ.js +1250 -0
  106. package/dist/chunk-VYKKMYVT.js +560 -0
  107. package/dist/chunk-VZHJS6DR.js +442 -0
  108. package/dist/chunk-WATC3IQR.js +213 -0
  109. package/dist/chunk-WPE5FPGR.js +54 -0
  110. package/dist/chunk-WSEWKCXU.js +188 -0
  111. package/dist/chunk-WW5BLB74.js +659 -0
  112. package/dist/chunk-XGUL4SLQ.js +406 -0
  113. package/dist/chunk-XHSCVSOL.js +170 -0
  114. package/dist/chunk-XIMYZ3JA.js +27 -0
  115. package/dist/chunk-YLN4K6WD.js +385 -0
  116. package/dist/chunk-Z3CCVDUB.js +76 -0
  117. package/dist/chunk-Z54ZSOBZ.js +61 -0
  118. package/dist/chunk-Z6BB4JLQ.js +478 -0
  119. package/dist/chunk-Z7QQA2KT.js +27 -0
  120. package/dist/chunk-ZETYB3XG.js +2626 -0
  121. package/dist/chunk-ZMOMPX2Z.js +87 -0
  122. package/dist/chunk-ZOEYVXSV.js +149 -0
  123. package/dist/chunk-ZZUFZUQZ.js +12120 -0
  124. package/dist/index.js +39712 -29876
  125. package/dist/mcp/analyze-cli.js +186 -232
  126. package/dist/mcp/cli.js +137 -98
  127. package/dist/mcp/server.js +22688 -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 +5 -4
  135. package/docs/configuration.md +28 -2
  136. package/docs/custom-rules.md +25 -2
  137. package/docs/environment-variables.md +86 -8
  138. package/docs/features.md +45 -5
  139. package/docs/globalconfig.md +2 -1
  140. package/docs/io-bridge-v2-migration.md +94 -0
  141. package/docs/lsp-capability-matrix.md +37 -4
  142. package/docs/lsp-idle-eviction.md +124 -0
  143. package/docs/mcp.md +21 -5
  144. package/docs/merge-queue-rollout.md +77 -0
  145. package/docs/pi-lens-fixer.md +160 -88
  146. package/docs/pi-lens-investigator.md +74 -26
  147. package/docs/pi-lens-merge-policy.md +736 -0
  148. package/docs/pi-lens-monitor.md +75 -7
  149. package/docs/pi-lens-retro.md +6 -4
  150. package/docs/pi-lens-reviewer.md +189 -48
  151. package/docs/pi-lens-subagent.md +246 -45
  152. package/docs/pi-lens-warden.md +18 -7
  153. package/docs/public-api-stability.md +55 -0
  154. package/docs/release-qa-baseline.md +84 -17
  155. package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  156. package/docs/schema/pi-lens-config-v1.json +530 -0
  157. package/docs/servercapabilities.md +56 -49
  158. package/docs/settings.md +1 -0
  159. package/docs/usage.md +5 -1
  160. package/docs/word-index.md +6 -0
  161. package/grammars/tree-sitter-bash.wasm +0 -0
  162. package/grammars/tree-sitter-bash.wasm.json +3 -3
  163. package/package.json +19 -7
  164. package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  165. package/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  166. package/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  167. package/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  168. package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  169. package/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  170. package/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  171. package/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  172. package/scripts/analyze-pi-lens-logs.mjs +1275 -62
  173. package/scripts/download-grammars.js +5 -0
  174. package/scripts/grammars.lock.json +6 -1
  175. package/scripts/install-selftest.mjs +33 -34
  176. package/scripts/lib/host-provided-deps.mjs +13 -4
  177. package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  178. package/dist/clients/actionable-warnings-logger.js +0 -35
  179. package/dist/clients/actionable-warnings.js +0 -1610
  180. package/dist/clients/advisory-provenance.js +0 -593
  181. package/dist/clients/agent-behavior-client.js +0 -147
  182. package/dist/clients/agent-nudge.js +0 -325
  183. package/dist/clients/analysed-root.js +0 -1
  184. package/dist/clients/ast-grep-client.js +0 -731
  185. package/dist/clients/ast-grep-rule-manager.js +0 -146
  186. package/dist/clients/ast-grep-tool-logger.js +0 -118
  187. package/dist/clients/ast-grep-types.js +0 -10
  188. package/dist/clients/ast-grep-yaml-synth.js +0 -154
  189. package/dist/clients/atomic-write-staging.js +0 -75
  190. package/dist/clients/atomic-write.js +0 -189
  191. package/dist/clients/availability-probe-flight.js +0 -12
  192. package/dist/clients/bash-file-access.js +0 -1056
  193. package/dist/clients/biome-client.js +0 -357
  194. package/dist/clients/blocker-freshness.js +0 -837
  195. package/dist/clients/blocker-past-eof.js +0 -129
  196. package/dist/clients/bootstrap.js +0 -569
  197. package/dist/clients/bounded-cache.js +0 -190
  198. package/dist/clients/bounded-pid-file-lock.js +0 -202
  199. package/dist/clients/bounded-telemetry.js +0 -295
  200. package/dist/clients/build-identity.js +0 -95
  201. package/dist/clients/bundled-resource-health.js +0 -113
  202. package/dist/clients/bus-events-logger.js +0 -105
  203. package/dist/clients/bus-publish.js +0 -171
  204. package/dist/clients/cache/rule-cache.js +0 -190
  205. package/dist/clients/cache-manager.js +0 -524
  206. package/dist/clients/cache-observability.js +0 -1313
  207. package/dist/clients/call-graph.js +0 -852
  208. package/dist/clients/cargo-manifest.js +0 -422
  209. package/dist/clients/cascade-budget.js +0 -196
  210. package/dist/clients/cascade-format.js +0 -315
  211. package/dist/clients/cascade-logger.js +0 -31
  212. package/dist/clients/cascade-types.js +0 -9
  213. package/dist/clients/child-unref.js +0 -124
  214. package/dist/clients/code-quality-warnings.js +0 -286
  215. package/dist/clients/codebase-model.js +0 -173
  216. package/dist/clients/collateral-test-role.js +0 -40
  217. package/dist/clients/complexity-client.js +0 -462
  218. package/dist/clients/config-core/deny.js +0 -221
  219. package/dist/clients/config-core/index.js +0 -50
  220. package/dist/clients/config-core/merge.js +0 -357
  221. package/dist/clients/config-core/normalize.js +0 -340
  222. package/dist/clients/config-core/process-spec.js +0 -248
  223. package/dist/clients/config-core/provenance.js +0 -164
  224. package/dist/clients/config-core/records.js +0 -218
  225. package/dist/clients/config-core/resolve.js +0 -125
  226. package/dist/clients/config-core/safe-object.js +0 -78
  227. package/dist/clients/config-core/schema.js +0 -165
  228. package/dist/clients/config-diagnostic-codes.js +0 -285
  229. package/dist/clients/config-locations.js +0 -388
  230. package/dist/clients/config-resolve.js +0 -798
  231. package/dist/clients/config-schema.js +0 -251
  232. package/dist/clients/config-warn.js +0 -407
  233. package/dist/clients/console-guard-install.js +0 -26
  234. package/dist/clients/cooperative-budget.js +0 -42
  235. package/dist/clients/dead-code-client.js +0 -510
  236. package/dist/clients/dead-code-logger.js +0 -30
  237. package/dist/clients/deadline-utils.js +0 -280
  238. package/dist/clients/debug-handles.js +0 -211
  239. package/dist/clients/debug-heap.js +0 -174
  240. package/dist/clients/deferred-lsp-work.js +0 -106
  241. package/dist/clients/degradation-ledger.js +0 -426
  242. package/dist/clients/demoted-finding-render.js +0 -169
  243. package/dist/clients/dependency-checker.js +0 -885
  244. package/dist/clients/deps/ast-grep-napi.js +0 -22
  245. package/dist/clients/deps/js-yaml.js +0 -9
  246. package/dist/clients/deps/minimatch.js +0 -4
  247. package/dist/clients/deps/pi-tui.js +0 -14
  248. package/dist/clients/deps/typebox.js +0 -14
  249. package/dist/clients/deps/vscode-jsonrpc.js +0 -1
  250. package/dist/clients/deps/web-tree-sitter.js +0 -24
  251. package/dist/clients/diagnostic-dispositions.js +0 -630
  252. package/dist/clients/diagnostic-line-freshness.js +0 -305
  253. package/dist/clients/diagnostic-logger.js +0 -73
  254. package/dist/clients/diagnostic-tracker.js +0 -105
  255. package/dist/clients/diagnostics-publish.js +0 -230
  256. package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  257. package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  258. package/dist/clients/dispatch/collect-later-tier.js +0 -35
  259. package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  260. package/dist/clients/dispatch/dispatcher.js +0 -1269
  261. package/dist/clients/dispatch/fact-provider-types.js +0 -1
  262. package/dist/clients/dispatch/fact-rule-runner.js +0 -17
  263. package/dist/clients/dispatch/fact-runner.js +0 -30
  264. package/dist/clients/dispatch/fact-scheduler.js +0 -68
  265. package/dist/clients/dispatch/fact-store.js +0 -377
  266. package/dist/clients/dispatch/facts/comment-facts.js +0 -22
  267. package/dist/clients/dispatch/facts/file-content.js +0 -19
  268. package/dist/clients/dispatch/facts/function-facts.js +0 -348
  269. package/dist/clients/dispatch/facts/import-facts.js +0 -204
  270. package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  271. package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  272. package/dist/clients/dispatch/finding-policy.js +0 -339
  273. package/dist/clients/dispatch/indent-detect.js +0 -417
  274. package/dist/clients/dispatch/inline-suppressions.js +0 -89
  275. package/dist/clients/dispatch/integration.js +0 -2377
  276. package/dist/clients/dispatch/lazy.js +0 -11
  277. package/dist/clients/dispatch/pending-runner-findings.js +0 -87
  278. package/dist/clients/dispatch/plan.js +0 -278
  279. package/dist/clients/dispatch/priorities.js +0 -20
  280. package/dist/clients/dispatch/rule-id-normalize.js +0 -50
  281. package/dist/clients/dispatch/rule-ignores.js +0 -69
  282. package/dist/clients/dispatch/rule-policy.js +0 -135
  283. package/dist/clients/dispatch/rules/async-noise.js +0 -40
  284. package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  285. package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  286. package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  287. package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  288. package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  289. package/dist/clients/dispatch/rules/high-complexity.js +0 -72
  290. package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  291. package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  292. package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  293. package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  294. package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  295. package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  296. package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  297. package/dist/clients/dispatch/runner-context.js +0 -52
  298. package/dist/clients/dispatch/runners/actionlint.js +0 -111
  299. package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  300. package/dist/clients/dispatch/runners/biome-check.js +0 -296
  301. package/dist/clients/dispatch/runners/cpp-check.js +0 -219
  302. package/dist/clients/dispatch/runners/credo.js +0 -82
  303. package/dist/clients/dispatch/runners/cue-vet.js +0 -416
  304. package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  305. package/dist/clients/dispatch/runners/detekt.js +0 -176
  306. package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  307. package/dist/clients/dispatch/runners/elixir-check.js +0 -195
  308. package/dist/clients/dispatch/runners/eslint.js +0 -137
  309. package/dist/clients/dispatch/runners/fact-rules.js +0 -29
  310. package/dist/clients/dispatch/runners/fish-indent.js +0 -69
  311. package/dist/clients/dispatch/runners/gleam-check.js +0 -167
  312. package/dist/clients/dispatch/runners/go-vet.js +0 -104
  313. package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  314. package/dist/clients/dispatch/runners/hadolint.js +0 -91
  315. package/dist/clients/dispatch/runners/helm-lint.js +0 -171
  316. package/dist/clients/dispatch/runners/helm-render.js +0 -940
  317. package/dist/clients/dispatch/runners/htmlhint.js +0 -117
  318. package/dist/clients/dispatch/runners/index.js +0 -108
  319. package/dist/clients/dispatch/runners/javac.js +0 -99
  320. package/dist/clients/dispatch/runners/ktlint.js +0 -110
  321. package/dist/clients/dispatch/runners/lsp.js +0 -379
  322. package/dist/clients/dispatch/runners/markdownlint.js +0 -167
  323. package/dist/clients/dispatch/runners/mypy.js +0 -102
  324. package/dist/clients/dispatch/runners/oxlint.js +0 -414
  325. package/dist/clients/dispatch/runners/php-lint.js +0 -85
  326. package/dist/clients/dispatch/runners/phpstan.js +0 -120
  327. package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  328. package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  329. package/dist/clients/dispatch/runners/pyright.js +0 -169
  330. package/dist/clients/dispatch/runners/rubocop.js +0 -99
  331. package/dist/clients/dispatch/runners/ruff.js +0 -88
  332. package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  333. package/dist/clients/dispatch/runners/shellcheck.js +0 -173
  334. package/dist/clients/dispatch/runners/shfmt.js +0 -102
  335. package/dist/clients/dispatch/runners/spellcheck.js +0 -128
  336. package/dist/clients/dispatch/runners/spotbugs.js +0 -259
  337. package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  338. package/dist/clients/dispatch/runners/stylelint.js +0 -166
  339. package/dist/clients/dispatch/runners/swiftlint.js +0 -163
  340. package/dist/clients/dispatch/runners/taplo.js +0 -174
  341. package/dist/clients/dispatch/runners/terragrunt.js +0 -168
  342. package/dist/clients/dispatch/runners/tflint.js +0 -125
  343. package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  344. package/dist/clients/dispatch/runners/trivy-config.js +0 -253
  345. package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  346. package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  347. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  348. package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  349. package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  350. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  351. package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  352. package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  353. package/dist/clients/dispatch/runners/utils.js +0 -15
  354. package/dist/clients/dispatch/runners/vale.js +0 -128
  355. package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  356. package/dist/clients/dispatch/runners/yamllint.js +0 -95
  357. package/dist/clients/dispatch/runners/zig-check.js +0 -79
  358. package/dist/clients/dispatch/suppress-writer.js +0 -79
  359. package/dist/clients/dispatch/tool-profile.js +0 -30
  360. package/dist/clients/dispatch/types.js +0 -21
  361. package/dist/clients/dispatch/utils/format-utils.js +0 -45
  362. package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  363. package/dist/clients/disposition-logger.js +0 -32
  364. package/dist/clients/disposition-publish.js +0 -124
  365. package/dist/clients/durable-store.js +0 -97
  366. package/dist/clients/effective-config.js +0 -415
  367. package/dist/clients/env-utils.js +0 -83
  368. package/dist/clients/error-class.js +0 -23
  369. package/dist/clients/eval-timestamp.js +0 -17
  370. package/dist/clients/event-loop-hold.js +0 -274
  371. package/dist/clients/event-loop-monitor.js +0 -250
  372. package/dist/clients/extension-log.js +0 -504
  373. package/dist/clients/extension-mode.js +0 -73
  374. package/dist/clients/feature-hints.js +0 -103
  375. package/dist/clients/file-kinds.js +0 -412
  376. package/dist/clients/file-role.js +0 -134
  377. package/dist/clients/file-time.js +0 -160
  378. package/dist/clients/file-utils.js +0 -1032
  379. package/dist/clients/finding-delivery-gate.js +0 -494
  380. package/dist/clients/finding-identity.js +0 -88
  381. package/dist/clients/fix-worklog.js +0 -103
  382. package/dist/clients/format-events-publish.js +0 -343
  383. package/dist/clients/format-service.js +0 -222
  384. package/dist/clients/formatters-lazy.js +0 -9
  385. package/dist/clients/formatters.js +0 -2032
  386. package/dist/clients/freshness-cadence.js +0 -17
  387. package/dist/clients/freshness.js +0 -38
  388. package/dist/clients/generated-artifacts.js +0 -394
  389. package/dist/clients/generation-guard.js +0 -215
  390. package/dist/clients/git-guard.js +0 -1136
  391. package/dist/clients/git-tracked-ignore.js +0 -243
  392. package/dist/clients/gitleaks-client.js +0 -509
  393. package/dist/clients/go-client.js +0 -104
  394. package/dist/clients/govulncheck-client.js +0 -605
  395. package/dist/clients/gradle-ktfmt-style.js +0 -348
  396. package/dist/clients/grammar-source.js +0 -465
  397. package/dist/clients/gzip-stage-write.js +0 -135
  398. package/dist/clients/hashline-anchor.js +0 -424
  399. package/dist/clients/hook-budgets.js +0 -76
  400. package/dist/clients/host-edit-normalize.js +0 -140
  401. package/dist/clients/host-ports.js +0 -39
  402. package/dist/clients/indent-retarget.js +0 -154
  403. package/dist/clients/inline-blocker-dispositions.js +0 -186
  404. package/dist/clients/install-diagnostics.js +0 -156
  405. package/dist/clients/installer/index.js +0 -5416
  406. package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  407. package/dist/clients/installer/managed-tool-refresh.js +0 -783
  408. package/dist/clients/instance-reaper-state.js +0 -7
  409. package/dist/clients/instance-reaper.js +0 -1137
  410. package/dist/clients/instance-registry-lock.js +0 -145
  411. package/dist/clients/instance-registry.js +0 -773
  412. package/dist/clients/jscpd-client.js +0 -378
  413. package/dist/clients/json-cache-read.js +0 -65
  414. package/dist/clients/knip-client.js +0 -788
  415. package/dist/clients/language-policy.js +0 -252
  416. package/dist/clients/language-profile.js +0 -361
  417. package/dist/clients/language-registry.js +0 -603
  418. package/dist/clients/latency-logger.js +0 -727
  419. package/dist/clients/lazy-import.js +0 -21
  420. package/dist/clients/ledger-bounds.js +0 -54
  421. package/dist/clients/lens-config.js +0 -404
  422. package/dist/clients/lens-engine.js +0 -358
  423. package/dist/clients/lens-events.js +0 -125
  424. package/dist/clients/lens-flag-registry.js +0 -467
  425. package/dist/clients/lens-map.js +0 -1156
  426. package/dist/clients/live-bus-emitter.js +0 -74
  427. package/dist/clients/log-cleanup.js +0 -222
  428. package/dist/clients/lsp/aggregation.js +0 -178
  429. package/dist/clients/lsp/cascade-tier.js +0 -421
  430. package/dist/clients/lsp/client.js +0 -4593
  431. package/dist/clients/lsp/config.js +0 -691
  432. package/dist/clients/lsp/content-limits.js +0 -41
  433. package/dist/clients/lsp/diagnostic-binding.js +0 -225
  434. package/dist/clients/lsp/document-drift.js +0 -467
  435. package/dist/clients/lsp/edits.js +0 -1219
  436. package/dist/clients/lsp/index.js +0 -8305
  437. package/dist/clients/lsp/inferred-project.js +0 -216
  438. package/dist/clients/lsp/jvm-runtime.js +0 -298
  439. package/dist/clients/lsp/language.js +0 -63
  440. package/dist/clients/lsp/launch.js +0 -746
  441. package/dist/clients/lsp/lombok.js +0 -158
  442. package/dist/clients/lsp/path-utils.js +0 -5
  443. package/dist/clients/lsp/pending-aux-coverage.js +0 -251
  444. package/dist/clients/lsp/position-encoding.js +0 -61
  445. package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  446. package/dist/clients/lsp/server.js +0 -3290
  447. package/dist/clients/lsp/session-roots.js +0 -192
  448. package/dist/clients/lsp/spawn-history.js +0 -17
  449. package/dist/clients/lsp/sync-kind.js +0 -56
  450. package/dist/clients/lsp/tsserver-sync.js +0 -332
  451. package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  452. package/dist/clients/lsp/wait-policy/classification.js +0 -85
  453. package/dist/clients/lsp/wait-policy/index.js +0 -10
  454. package/dist/clients/lsp/wait-policy/strategies.js +0 -392
  455. package/dist/clients/lsp/watch-queue.js +0 -61
  456. package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  457. package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  458. package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  459. package/dist/clients/lsp-budget.js +0 -186
  460. package/dist/clients/lsp-document-symbols.js +0 -110
  461. package/dist/clients/lsp-lazy.js +0 -9
  462. package/dist/clients/lsp-mutation.js +0 -396
  463. package/dist/clients/lsp-status.js +0 -59
  464. package/dist/clients/map-with-concurrency.js +0 -40
  465. package/dist/clients/mcp/analyze.js +0 -420
  466. package/dist/clients/mcp/host-shim.js +0 -31
  467. package/dist/clients/mcp/ipc.js +0 -523
  468. package/dist/clients/mcp/review.js +0 -197
  469. package/dist/clients/mcp/session.js +0 -412
  470. package/dist/clients/memory-sampler.js +0 -208
  471. package/dist/clients/message-end-attribution.js +0 -30
  472. package/dist/clients/metrics-client.js +0 -107
  473. package/dist/clients/metrics-history.js +0 -327
  474. package/dist/clients/middle-man-analysis.js +0 -263
  475. package/dist/clients/model-provider.js +0 -53
  476. package/dist/clients/module-report-lsp.js +0 -189
  477. package/dist/clients/module-report.js +0 -2150
  478. package/dist/clients/mutating-tool.js +0 -651
  479. package/dist/clients/mutation-attribution.js +0 -368
  480. package/dist/clients/mutation-bridge.js +0 -240
  481. package/dist/clients/ndjson-logger.js +0 -734
  482. package/dist/clients/observed-mutation-sources.js +0 -101
  483. package/dist/clients/observed-mutation.js +0 -1253
  484. package/dist/clients/oldtext-autopatch.js +0 -128
  485. package/dist/clients/opaque-mutation-scan.js +0 -496
  486. package/dist/clients/opengrep-client.js +0 -333
  487. package/dist/clients/opengrep-config.js +0 -76
  488. package/dist/clients/package-manager.js +0 -607
  489. package/dist/clients/package-root.js +0 -38
  490. package/dist/clients/partial-edit-apply.js +0 -439
  491. package/dist/clients/path-attribution-telemetry.js +0 -43
  492. package/dist/clients/path-keyed-map.js +0 -108
  493. package/dist/clients/path-utils.js +0 -1244
  494. package/dist/clients/performance-report.js +0 -331
  495. package/dist/clients/persist-debounce.js +0 -70
  496. package/dist/clients/persistent-reverify.js +0 -271
  497. package/dist/clients/php-cs-fixer-config.js +0 -119
  498. package/dist/clients/pipeline.js +0 -1480
  499. package/dist/clients/post-autofix-notice.js +0 -37
  500. package/dist/clients/print-mode.js +0 -21
  501. package/dist/clients/probe-home-state.js +0 -228
  502. package/dist/clients/process-bridge.js +0 -66
  503. package/dist/clients/process-singletons.js +0 -210
  504. package/dist/clients/process-snapshot.js +0 -68
  505. package/dist/clients/project-changes.js +0 -181
  506. package/dist/clients/project-conventions.js +0 -171
  507. package/dist/clients/project-diagnostics/cache.js +0 -137
  508. package/dist/clients/project-diagnostics/extractors.js +0 -109
  509. package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  510. package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  511. package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  512. package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  513. package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  514. package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  515. package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  516. package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  517. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  518. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  519. package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  520. package/dist/clients/project-diagnostics/scanner.js +0 -520
  521. package/dist/clients/project-diagnostics/types.js +0 -1
  522. package/dist/clients/project-lens-config.js +0 -807
  523. package/dist/clients/project-report.js +0 -701
  524. package/dist/clients/project-scale.js +0 -237
  525. package/dist/clients/project-scan-policy.js +0 -11
  526. package/dist/clients/project-snapshot-fingerprint.js +0 -48
  527. package/dist/clients/project-snapshot-persist-worker.js +0 -20
  528. package/dist/clients/project-snapshot.js +0 -1653
  529. package/dist/clients/project-trust.js +0 -181
  530. package/dist/clients/python-environment.js +0 -217
  531. package/dist/clients/python-provenance.js +0 -639
  532. package/dist/clients/quiet-window-config.js +0 -47
  533. package/dist/clients/quiet-window.js +0 -236
  534. package/dist/clients/read-bridge.js +0 -139
  535. package/dist/clients/read-expansion.js +0 -266
  536. package/dist/clients/read-guard-logger.js +0 -251
  537. package/dist/clients/read-guard-tool-lines.js +0 -1306
  538. package/dist/clients/read-guard.js +0 -1561
  539. package/dist/clients/recent-touches.js +0 -240
  540. package/dist/clients/redact/secrets.js +0 -449
  541. package/dist/clients/resource-sampler.js +0 -628
  542. package/dist/clients/reverse-deps.js +0 -270
  543. package/dist/clients/review-graph/builder.js +0 -5126
  544. package/dist/clients/review-graph/format.js +0 -33
  545. package/dist/clients/review-graph/git-identity.js +0 -163
  546. package/dist/clients/review-graph/import-resolvers.js +0 -481
  547. package/dist/clients/review-graph/persist-worker.js +0 -10
  548. package/dist/clients/review-graph/query.js +0 -244
  549. package/dist/clients/review-graph/revision-drift.js +0 -21
  550. package/dist/clients/review-graph/service.js +0 -96
  551. package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  552. package/dist/clients/review-graph/symbol-id.js +0 -103
  553. package/dist/clients/review-graph/tsconfig-paths.js +0 -299
  554. package/dist/clients/review-graph/types.js +0 -1
  555. package/dist/clients/review-graph/workspace-modules.js +0 -449
  556. package/dist/clients/review-graph-logger.js +0 -81
  557. package/dist/clients/ruff-client.js +0 -179
  558. package/dist/clients/rules-scanner.js +0 -131
  559. package/dist/clients/run-duration.js +0 -55
  560. package/dist/clients/runtime-agent-end.js +0 -746
  561. package/dist/clients/runtime-config.js +0 -77
  562. package/dist/clients/runtime-context.js +0 -211
  563. package/dist/clients/runtime-coordinator.js +0 -1324
  564. package/dist/clients/runtime-session.js +0 -2485
  565. package/dist/clients/runtime-tool-call.js +0 -1295
  566. package/dist/clients/runtime-tool-result.js +0 -2049
  567. package/dist/clients/runtime-turn.js +0 -3767
  568. package/dist/clients/rust-client.js +0 -97
  569. package/dist/clients/safe-spawn.js +0 -2357
  570. package/dist/clients/sanitize.js +0 -286
  571. package/dist/clients/scan-utils.js +0 -25
  572. package/dist/clients/scratch-tree-policy.js +0 -165
  573. package/dist/clients/search-read-registration.js +0 -94
  574. package/dist/clients/secret-findings.js +0 -114
  575. package/dist/clients/security-scan-client.js +0 -352
  576. package/dist/clients/session-event-guard.js +0 -297
  577. package/dist/clients/session-lifecycle.js +0 -484
  578. package/dist/clients/session-start-observability.js +0 -94
  579. package/dist/clients/session-state-store.js +0 -101
  580. package/dist/clients/session-summary.js +0 -15
  581. package/dist/clients/sessionstart-logger.js +0 -27
  582. package/dist/clients/sg-runner.js +0 -876
  583. package/dist/clients/sgconfig.js +0 -347
  584. package/dist/clients/shared-checkout-guard.js +0 -338
  585. package/dist/clients/single-flight.js +0 -158
  586. package/dist/clients/situational-tool-telemetry.js +0 -108
  587. package/dist/clients/skills-resolver.js +0 -141
  588. package/dist/clients/slow-fs.js +0 -138
  589. package/dist/clients/smells-rollup.js +0 -231
  590. package/dist/clients/source-filter.js +0 -596
  591. package/dist/clients/source-walker.js +0 -211
  592. package/dist/clients/spawn-output-cap.js +0 -120
  593. package/dist/clients/spawn-timeout-cooldown.js +0 -110
  594. package/dist/clients/stale-marker.js +0 -17
  595. package/dist/clients/startup-scan.js +0 -400
  596. package/dist/clients/startup-timing.js +0 -130
  597. package/dist/clients/string-utils.js +0 -33
  598. package/dist/clients/subagent-mode.js +0 -111
  599. package/dist/clients/symbol-containment.js +0 -24
  600. package/dist/clients/symbol-types.js +0 -5
  601. package/dist/clients/test-runner-client.js +0 -2507
  602. package/dist/clients/test-runner-delivery.js +0 -287
  603. package/dist/clients/todo-scanner.js +0 -229
  604. package/dist/clients/tool-agreement.js +0 -423
  605. package/dist/clients/tool-config.js +0 -249
  606. package/dist/clients/tool-cwd.js +0 -270
  607. package/dist/clients/tool-definition.js +0 -47
  608. package/dist/clients/tool-event.js +0 -105
  609. package/dist/clients/tool-policy.js +0 -2755
  610. package/dist/clients/tool-probe.js +0 -53
  611. package/dist/clients/tool-render.js +0 -156
  612. package/dist/clients/tool-set-policy.js +0 -118
  613. package/dist/clients/tree-sitter-cache.js +0 -364
  614. package/dist/clients/tree-sitter-client.js +0 -4195
  615. package/dist/clients/tree-sitter-logger.js +0 -100
  616. package/dist/clients/tree-sitter-navigator.js +0 -269
  617. package/dist/clients/tree-sitter-query-loader.js +0 -569
  618. package/dist/clients/tree-sitter-shared.js +0 -158
  619. package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  620. package/dist/clients/trivy-client.js +0 -467
  621. package/dist/clients/tui-fit.js +0 -50
  622. package/dist/clients/turn-context.js +0 -52
  623. package/dist/clients/turn-end/lane.js +0 -51
  624. package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  625. package/dist/clients/turn-end/lanes/secrets.js +0 -204
  626. package/dist/clients/turn-summary-render.js +0 -72
  627. package/dist/clients/turn-summary.js +0 -132
  628. package/dist/clients/typos-config.js +0 -29
  629. package/dist/clients/user-notify.js +0 -51
  630. package/dist/clients/vanished-instance-marker.js +0 -57
  631. package/dist/clients/warm-attach.js +0 -305
  632. package/dist/clients/widget-state.js +0 -1808
  633. package/dist/clients/word-index-logger.js +0 -49
  634. package/dist/clients/word-index-store.js +0 -459
  635. package/dist/clients/word-index.js +0 -2080
  636. package/dist/clients/workspace-topology.js +0 -443
  637. package/dist/clients/write-ordering-guard.js +0 -65
  638. package/dist/clients/zizmor-config.js +0 -340
  639. package/dist/i18n.js +0 -69
  640. package/dist/mcp/build-staleness.js +0 -124
  641. package/dist/scripts/lib/process-scan.mjs +0 -583
  642. package/dist/scripts/lib/skills-predicate.mjs +0 -129
  643. package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  644. package/dist/tools/activate-tools.js +0 -87
  645. package/dist/tools/ast-grep-outline.js +0 -137
  646. package/dist/tools/ast-grep-replace.js +0 -244
  647. package/dist/tools/ast-grep-search.js +0 -762
  648. package/dist/tools/effective-config.js +0 -90
  649. package/dist/tools/lens-diagnostic-mark.js +0 -375
  650. package/dist/tools/lens-diagnostics.js +0 -2571
  651. package/dist/tools/lsp-diagnostics.js +0 -1745
  652. package/dist/tools/lsp-navigation.js +0 -1367
  653. package/dist/tools/lsp-structured-output.js +0 -294
  654. package/dist/tools/module-report.js +0 -382
  655. package/dist/tools/project-report.js +0 -86
  656. package/dist/tools/render-compact.js +0 -374
  657. package/dist/tools/scan-progress.js +0 -53
  658. package/dist/tools/shared.js +0 -29
  659. 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
- }