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,158 +0,0 @@
1
- /**
2
- * `singleFlight` — at most one execution per key, clear owned by the primitive.
3
- *
4
- * Ten sites hand-roll the same five lines: look up a key in a promise map,
5
- * return the existing promise if there is one, otherwise start the work and
6
- * delete the key in a `finally`. The class has a measured bug yield, and every
7
- * bug is in the part the call site wrote rather than the part it meant:
8
- *
9
- * - #1690: the `finally`-clear was never exercised, so its regression test
10
- * passed with the clear deleted. A memo short-circuit above the in-flight
11
- * check meant the second call never reached it.
12
- * - #1674: the `finally` deleted the key unconditionally, so a probe settling
13
- * after a session reset evicted the REPLACEMENT probe a new session had
14
- * already started for the same key.
15
- * - #1687: the trailing-rerun bit shipped unpinned — the test asserted "at most
16
- * two passes" one-sidedly, which a coalescer that dropped the rerun entirely
17
- * also satisfies.
18
- * - #1722: an inner latch was vacuous and its own mutation matrix deleted it.
19
- *
20
- * This module owns those four guards once. The API is the INTERSECTION of the
21
- * ten sites, not a superset: share, clear-in-finally, optional trailing-rerun
22
- * coalescing, optional generation check. Anything a single site needs stays at
23
- * that site.
24
- *
25
- * LIFECYCLE: the primitive owns no module state. `createSingleFlight` returns
26
- * a closure, so each registry's lifetime is its OWNER's — an instance field
27
- * lives as long as the instance, a module-level const as long as the process.
28
- * That keeps the session-state question where it belongs, at the owner, and
29
- * `clear()` is the seam an owner's reset calls. The two converted sites hold
30
- * instance fields, exactly as their `ensureInFlight` fields did, so neither
31
- * one's session-state answer changes.
32
- *
33
- * Teardown of a flight that never settles is the owner's question, and neither
34
- * converted site answers it today: a wedged probe holds its key until the
35
- * process ends, exactly as its `ensureInFlight` field did on master. This
36
- * primitive does not make that worse and does not fix it; an owner that needs a
37
- * deadline wraps `fn` in one before handing it over.
38
- *
39
- * The generation hook is deliberately thin — a `() => number` the primitive
40
- * reads at start and again at completion. The standalone generation-guard
41
- * primitive is #1754's; when it lands, this stays a callback and composes with
42
- * it rather than absorbing it.
43
- */
44
- /**
45
- * Create a keyed single-flight registry.
46
- *
47
- * Sites with only one thing to dedupe pass a constant key; the map costs one
48
- * entry and buys the same four guards a single slot would have to re-derive.
49
- */
50
- export function createSingleFlight(options = {}) {
51
- const { generation: readGeneration, coalesceTrailing = false } = options;
52
- const flights = new Map();
53
- const currentGeneration = () => readGeneration?.() ?? 0;
54
- /**
55
- * Release `key`, but ONLY if this exact flight still owns it.
56
- *
57
- * This is the #1674 eviction direction: a flight that settles late must not
58
- * delete the entry a SUCCESSOR already installed under the same key. The
59
- * successor may exist because a reset cleared the map and a new caller
60
- * arrived, or because the generation moved and `run` superseded the stale
61
- * flight. Identity answers both, so identity is the only check here.
62
- *
63
- * `runner-helpers.ts:1058` writes this as a generation check AND an identity
64
- * check. The mutation matrix says the generation half of that pair kills no
65
- * test: whenever it would fire, identity has already returned. The pair is
66
- * harmless there and not worth churning; it is not worth copying either.
67
- */
68
- const release = (key, flight) => {
69
- if (flights.get(key) !== flight)
70
- return;
71
- flights.delete(key);
72
- };
73
- const run = (key, fn) => {
74
- const existing = flights.get(key);
75
- // Sharing requires BOTH a running flight and a matching generation. A
76
- // flight from an earlier generation answers a question a session reset
77
- // already invalidated, so this caller falls through and starts a fresh
78
- // one; the `flights.set` below replaces the stale entry outright, and the
79
- // stale flight's own `release` then finds a foreign entry and leaves it
80
- // alone. There is deliberately no explicit delete for the superseded
81
- // entry: nothing reads the map between here and that `set`, so a delete
82
- // would be a dead statement dressed as a guard.
83
- if (existing && existing.generation === currentGeneration()) {
84
- // A mid-flight request in the SAME generation. With coalescing it earns
85
- // exactly one trailing pass no matter how many such requests arrive;
86
- // without it, it shares the running pass. Either way it never starts a
87
- // second flight.
88
- if (coalesceTrailing)
89
- existing.rerunRequested = true;
90
- return existing.promise;
91
- }
92
- // The shared handle is built BEFORE `fn` runs and BEFORE the map entry is
93
- // published, so the entry a reentrant caller finds always carries a real
94
- // pending promise. The hand-rolled sites all publish the entry after
95
- // starting the work, which leaves a synchronous window where a reentrant
96
- // call starts a second flight for the same key.
97
- let settle;
98
- let fail;
99
- const promise = new Promise((resolve, reject) => {
100
- settle = resolve;
101
- fail = reject;
102
- });
103
- const flight = {
104
- promise,
105
- generation: currentGeneration(),
106
- rerunRequested: false,
107
- };
108
- const chain = async () => {
109
- let result = await fn();
110
- // KNOWN INTERACTION, `coalesceTrailing` + `generation`: a flight that
111
- // gets superseded mid-pass with its rerun bit already set still runs
112
- // that one trailing pass, because the bit lives on the flight and no
113
- // caller can reach in to clear it. So a reset can cost ONE extra pass
114
- // of pre-reset work, whose result nothing reads — the superseded
115
- // promise has no callers left that a live caller depends on.
116
- //
117
- // Left as-is rather than fixed blind: no site uses both options today,
118
- // so any fix would be untested guesswork about which behavior a real
119
- // caller wants. A reset arguably SHOULD abandon the pending rerun; it
120
- // arguably should also let a pass that is already half-done finish.
121
- // The third site to turn this combination on decides, and adds the
122
- // test that pins whichever answer it picks.
123
- //
124
- // Only reruns requested WHILE a pass was running count. Clearing the bit
125
- // before each pass — never after — is what pins the coalescing to "at
126
- // most one trailing rerun": a request that arrives during pass 2 sets
127
- // the bit again and gets pass 3, which is still one trailing pass per
128
- // burst-that-overlaps-a-pass, not one per request.
129
- while (flight.rerunRequested) {
130
- flight.rerunRequested = false;
131
- result = await fn();
132
- }
133
- return result;
134
- };
135
- flights.set(key, flight);
136
- // Release runs on BOTH settlements — a rejected `fn` must not wedge the
137
- // key, which is #1690's leak. Release and settle happen in the same
138
- // synchronous step, so their order relative to each other is not
139
- // observable; what matters is that both run before any awaiting caller's
140
- // continuation. A rejection also abandons a pending rerun: re-running
141
- // work that just threw is a retry policy, and a retry policy belongs to
142
- // the caller that knows what the work was.
143
- chain().then((value) => {
144
- release(key, flight);
145
- settle(value);
146
- }, (error) => {
147
- release(key, flight);
148
- fail(error);
149
- });
150
- return flight.promise;
151
- };
152
- return {
153
- run,
154
- has: (key) => flights.has(key),
155
- size: () => flights.size,
156
- clear: () => flights.clear(),
157
- };
158
- }
@@ -1,108 +0,0 @@
1
- import { logExtension } from "./extension-log.js";
2
- import { TOOL_REGISTRY } from "./tool-config.js";
3
- const situationalTools = TOOL_REGISTRY.filter((tool) => "situational" in tool && tool.situational === true).map((tool) => tool.name);
4
- const situationalToolSet = new Set(situationalTools);
5
- const activated = new Set();
6
- const called = new Set();
7
- let sessionStarted = false;
8
- let emitted = false;
9
- // MCP-only connection-terminal latch: once the connection's row is recorded,
10
- // repeated initialize/tool-call starts must not reopen the session.
11
- let connectionEnded = false;
12
- // Which host owns the open session; only MCP may arm connectionEnded. Pi state
13
- // belongs to the conversation and survives in-process session rebuilds.
14
- let sessionHost = "mcp";
15
- function observe(set, name) {
16
- if (situationalToolSet.has(name)) {
17
- set.add(name);
18
- }
19
- }
20
- function clearObservations() {
21
- activated.clear();
22
- called.clear();
23
- }
24
- export function observeSituationalToolActivation(names) {
25
- for (const name of names)
26
- observe(activated, name);
27
- }
28
- export function observeSituationalToolCall(name) {
29
- observe(called, name);
30
- }
31
- export function resetSituationalToolTelemetry() {
32
- // A live telemetry session owns its observation sets: both hosts open the
33
- // session (which resets the sets) BEFORE handleSessionStart runs, and a
34
- // repeated MCP session_start refresh legitimately re-runs that handler —
35
- // clearing here would wipe the calls recorded before the refresh. This
36
- // registered reset therefore only acts when no session is open.
37
- if (sessionStarted)
38
- return;
39
- clearObservations();
40
- emitted = false;
41
- }
42
- /**
43
- * Open the telemetry session for one host.
44
- *
45
- * Pi owns one observation set per session file. A shutdown with a
46
- * `targetSessionFile` emits the conversation that is ending before the host
47
- * opens the replacement. Reload keeps the same file, so its factory rebuild
48
- * does not split the row. A process restart opens an empty set and recovers nothing:
49
- * pi-lens's own activation memory (`rememberedLazyTools` in `index.ts`) is
50
- * empty in a new process, so the restore deactivates every situational tool,
51
- * and the host's restored active set is evidence of REGISTRATION, not of
52
- * model activation (#2866 review F1). MCP remains connection-scoped.
53
- */
54
- export function startSituationalToolTelemetrySession(host) {
55
- if (host === "mcp") {
56
- if (connectionEnded)
57
- return;
58
- if (sessionStarted)
59
- return;
60
- sessionHost = "mcp";
61
- clearObservations();
62
- emitted = false;
63
- sessionStarted = true;
64
- return;
65
- }
66
- if (sessionStarted) {
67
- sessionHost = "pi";
68
- return;
69
- }
70
- sessionHost = "pi";
71
- clearObservations();
72
- emitted = false;
73
- sessionStarted = true;
74
- }
75
- /** Emit the one session-end row and make repeated shutdown calls harmless. */
76
- export function endSituationalToolTelemetry() {
77
- if (!sessionStarted)
78
- return;
79
- emitSituationalDeadWeight();
80
- if (sessionHost === "mcp")
81
- connectionEnded = true;
82
- clearObservations();
83
- emitted = false;
84
- sessionStarted = false;
85
- }
86
- export function emitSituationalDeadWeight() {
87
- if (emitted)
88
- return;
89
- emitted = true;
90
- const used = new Set([...activated, ...called]);
91
- logExtension({
92
- subsystem: "tools",
93
- level: "debug",
94
- message: "situational tool dead weight",
95
- metadata: {
96
- tools: situationalTools.filter((name) => !used.has(name)),
97
- },
98
- });
99
- }
100
- /** Test-only view of the module's state, for the #1635 session-state registry probe. */
101
- export function _getSituationalToolTelemetryStateForTests() {
102
- return {
103
- activated: activated.size,
104
- called: called.size,
105
- emitted,
106
- sessionStarted,
107
- };
108
- }
@@ -1,141 +0,0 @@
1
- /**
2
- * Resolves the skills directory the `resources_discover` handler (#205)
3
- * registers, and reports the one condition that pi previously loaded with NO
4
- * visible signal: `<packageRoot>/skills` is absent, unreadable, or holds no
5
- * skill pi's own loader would find (#2626).
6
- *
7
- * `resolvePackagePath(import.meta.url, "skills")`-equivalent resolution
8
- * (`clients/package-root.ts`'s `getPackageRoot`) is correct for both the
9
- * source and compiled `dist/` layouts — it walks up from the loaded entry
10
- * file to the nearest `package.json`. It goes wrong silently, not loudly,
11
- * when that walk lands somewhere with no `skills/` beside it: `skills/`
12
- * missing from an installed package, or the entry file copied out of the
13
- * package tree by a managed extension cache so the nearest `package.json`
14
- * is the cache's own. Either way `resources_discover` used to hand pi a
15
- * path that does not exist, `pi` registered zero skills, and nothing — no
16
- * extension error, no stderr line — said so (investigated on #2587).
17
- *
18
- * #2626 review round 2, F1: the FIRST version of this fix inverted the
19
- * acceptance criterion — it returned `[]` (no skills registered) whenever
20
- * its own predicate disagreed with pi's real loader, which is worse than
21
- * the bug it fixed on every layout the predicate got wrong (dropping skills
22
- * pi WOULD have loaded, a regression vs. pre-fix `master`). The acceptance
23
- * criteria ask for a RECORD, never a changed return value: this module
24
- * returns `[skillsDir]` UNCONDITIONALLY, exactly like the pre-fix handler —
25
- * pi's own `loadSkills`/`collectSkillEntries` already treat a nonexistent
26
- * path as zero skills from that entry, gracefully, so handing it a path
27
- * that turns out to be empty is exactly as safe as `master`'s behavior
28
- * always was. The health check below is PURELY observational.
29
- *
30
- * #2636 review F4: the ENOENT/EACCES classification shell below used to be
31
- * hand-rolled here, character-identical to the ast-grep/tree-sitter sites
32
- * #2636 fixed for the same silent-zero shape — now shared via
33
- * `bundled-resource-health.ts`, with `scanEntriesForSkills` supplied as this
34
- * module's own "what counts as found" predicate.
35
- */
36
- import * as path from "node:path";
37
- import { fileURLToPath } from "node:url";
38
- import * as fs from "node:fs";
39
- import { scanEntriesForSkills } from "../scripts/lib/skills-predicate.mjs";
40
- import { classifyBundledResourceDir, describeBundledResourceHealth, reportBundledResourceDirHealth, } from "./bundled-resource-health.js";
41
- import { logLatency } from "./latency-logger.js";
42
- import { getPackageRoot } from "./package-root.js";
43
- /** The ledger kind this module records under (`clients/degradation-ledger.ts`). */
44
- const SKILLS_DIR_MISSING_KIND = "skills-dir-missing";
45
- /**
46
- * Read `skillsDir` and classify it, sharing `classifyBundledResourceDir`'s
47
- * ENOENT/EACCES/empty shell but counting pi-LOADABLE skill entry points
48
- * (`scanEntriesForSkills`), not a bare directory listing — a `skills/`
49
- * holding only a stray `.gitkeep` must read "empty", not "healthy".
50
- */
51
- function checkSkillsHealth(skillsDir) {
52
- return classifyBundledResourceDir(skillsDir, (dir) => {
53
- const entries = fs.readdirSync(dir, { withFileTypes: true });
54
- return scanEntriesForSkills(dir, entries, true).length;
55
- });
56
- }
57
- /**
58
- * Resolve the skill path for `resources_discover`. ALWAYS returns
59
- * `[skillsDir]` (see the module doc for why — F1). When `skillsDir` is
60
- * absent, unreadable, or holds no skill pi's loader would find, records ONE
61
- * bounded `skills-dir-missing` degradation and a single `notifyUserDegradation`
62
- * warning, both naming the resolved path and the entry file's directory.
63
- *
64
- * Either way, one `skills_resolved` phase/latency record is written so an
65
- * empty ledger (no `skills-dir-missing` row) is distinguishable from
66
- * "`resources_discover` never ran at all" (#2626 review F5) — the SAME
67
- * silent-zero shape one level up the call stack.
68
- */
69
- export function resolveSkillPaths(importMetaUrl) {
70
- const packageRoot = getPackageRoot(importMetaUrl);
71
- const skillsDir = path.join(packageRoot, "skills");
72
- const health = checkSkillsHealth(skillsDir);
73
- logLatency({
74
- type: "phase",
75
- phase: "skills_resolved",
76
- filePath: skillsDir,
77
- durationMs: 0,
78
- metadata: {
79
- status: health.status,
80
- entryCount: health.status === "healthy" ? health.entryCount : 0,
81
- },
82
- });
83
- if (health.status !== "healthy") {
84
- const entryDir = path.dirname(fileURLToPath(importMetaUrl));
85
- const healthDescription = describeBundledResourceHealth(health, skillsDir, `no SKILL.md (or loadable .md) found under ${skillsDir}`);
86
- // #3175: two DIFFERENT strings, not one `reason` reused for both sinks
87
- // as this used to be.
88
- //
89
- // `notifyReason` (uncapped — `notifyUserDegradation` never truncates)
90
- // keeps the full, natural description: classification first, then
91
- // where the entry file that triggered this lookup was loaded from.
92
- const notifyReason = `${healthDescription} (entry loaded from ${entryDir})`;
93
- // `ledgerReason` is built from a SHORT, path-free classification tag
94
- // instead of `healthDescription`, because the LEDGER's `reason` field
95
- // IS capped (`truncateForLedger`, `LEDGER_FIELD_MAX` = 200 chars,
96
- // head-preserving — see `ledger-bounds.ts`) and `healthDescription`
97
- // repeats `skillsDir` in full — already recorded, untruncated, in
98
- // `subject` below whenever it's under the cap on its own. A
99
- // managed-cache `skillsDir` plus this entry's `entryDir` sharing one
100
- // long root routinely sums past 200 chars (#3175: TMPDIR ~60+ chars is
101
- // a real dry-roll and CI-lane shape, not a pathological one); a
102
- // head-preserving cap over the OLD concatenation (dir-bearing text
103
- // first, `entryDir` last) then kept the redundant path and dropped the
104
- // one fact nothing else records — which entry file's directory
105
- // triggered this lookup (#2587's "entry file copied out of the
106
- // package tree" case is exactly this). Simply swapping that order is
107
- // NOT enough: `healthDescription`'s own `unreadable` branch reads
108
- // `cannot read ${dir} (${fsErrorCode})`, so `dir` sitting in the
109
- // MIDDLE of the classification text can still push `fsErrorCode`
110
- // itself off the cap once `entryDir` leads. Dropping the redundant
111
- // path from the ledger's copy entirely — keeping only the
112
- // classification word/code — removes that squeeze instead of moving
113
- // it, and leaves comfortable room (entry directories under roughly
114
- // 150 chars fit whole) for every managed-cache/npm-install layout
115
- // observed so far.
116
- const classification = health.status === "unreadable"
117
- ? `cannot read (${health.fsErrorCode})`
118
- : health.status === "empty"
119
- ? "no SKILL.md found"
120
- : "no such directory";
121
- const ledgerReason = `${classification} (entry loaded from ${entryDir})`;
122
- // #2626 review F3: the notify-once gate previously re-derived "have we
123
- // already recorded this" by scanning `getDegradationSummary()` and
124
- // comparing the RAW `skillsDir` against subjects the ledger stores
125
- // `truncateForLedger`-ed — a mismatch on any subject over
126
- // `LEDGER_FIELD_MAX` (200 chars, an ordinary length for a managed-cache
127
- // path) renotified on every call. `reportBundledResourceDirHealth`
128
- // reads `incrementDegradationCount`'s own return value for the rising
129
- // edge, computed after the SAME truncation the ledger stores by, so
130
- // there is no separate key to keep in sync.
131
- // #2636 review round 2, F1: the shipped notify sentence ("registers
132
- // zero skills") is user-visible product text #2626 chose deliberately
133
- // — it names the exact SYMPTOM this whole issue exists to surface, so
134
- // the shared helper's generic "<label> unavailable" template must
135
- // never silently replace it. Passed explicitly rather than inferred
136
- // from `label` so this stays a per-caller decision, not a convention
137
- // the next caller has to remember.
138
- reportBundledResourceDirHealth(SKILLS_DIR_MISSING_KIND, skillsDir, health, "skills", ledgerReason, `pi-lens: registers zero skills — ${notifyReason}.`);
139
- }
140
- return [skillsDir];
141
- }
@@ -1,138 +0,0 @@
1
- /**
2
- * Slow-filesystem detection (#462).
3
- *
4
- * On WSL 9p mounts (`/mnt/c/...`), synchronous file-tree walks freeze the pi
5
- * TUI: each `stat`/`readdir` costs ~1.3ms over 9p vs ~17µs native (measured
6
- * anchor on a Windows host running WSL2 — a 75x slowdown). A 5,000-file sync
7
- * walk on 9p costs ~6.5s of stat time alone, all on the event loop.
8
- *
9
- * This module classifies the workspace by MEASUREMENT, not path shape (no
10
- * `/mnt/` string-sniffing — that misses drvfs/NFS/SMB and false-positives on
11
- * fast 9p configurations). A cheap latency probe times a handful of
12
- * `fs.statSync` calls under the project root at session start; if the median
13
- * exceeds a threshold, the workspace is flagged "slow FS" for the rest of the
14
- * process, and callers route sync tree walks to reduced caps / async
15
- * collectors instead.
16
- *
17
- * Escape hatches:
18
- * - `PI_LENS_ALLOW_SLOW_FS_SCAN=1` — disable slow-FS mode entirely (full
19
- * normal behavior even when the probe would flag the FS as slow).
20
- * - `PI_LENS_FORCE_SLOW_FS=1` — force slow-FS mode on regardless of the
21
- * probe (testing/CI, or a user who knows their FS is slow but the probe
22
- * under-fires).
23
- * - `PI_LENS_SLOW_FS_THRESHOLD_US` — override the median-microseconds
24
- * threshold (default 500).
25
- *
26
- * Follows the lazy-memoized-config house style (see `runtime-config.ts`): env
27
- * values are read lazily at call time, not module load, and `Number(...)` is
28
- * gated through `Number.isFinite` before use.
29
- */
30
- import { BoundedLruCache } from "./bounded-cache.js";
31
- import * as fs from "node:fs";
32
- import * as path from "node:path";
33
- import { toPositiveFinite } from "./env-utils.js";
34
- import { normalizeFilePath } from "./path-utils.js";
35
- /** Default median-stat threshold (microseconds) above which a workspace is
36
- * classified as slow FS. Measured anchor: 9p ≈ 1300µs/stat, native NTFS/ext4
37
- * < 200µs/stat — 500µs sits well between the two. */
38
- export const DEFAULT_SLOW_FS_THRESHOLD_US = 500;
39
- /** Cap on how many entries the probe stats — keeps the probe itself cheap
40
- * (15 stats x ~1.3ms worst case is still well under 50ms). */
41
- const PROBE_SAMPLE_CAP = 15;
42
- function resolveThresholdMicros() {
43
- const envValue = toPositiveFinite(process.env.PI_LENS_SLOW_FS_THRESHOLD_US);
44
- return envValue > 0 ? envValue : DEFAULT_SLOW_FS_THRESHOLD_US;
45
- }
46
- function median(values) {
47
- if (values.length === 0)
48
- return 0;
49
- const sorted = [...values].sort((a, b) => a - b);
50
- const mid = Math.floor(sorted.length / 2);
51
- return sorted.length % 2 === 0
52
- ? (sorted[mid - 1] + sorted[mid]) / 2
53
- : sorted[mid];
54
- }
55
- /**
56
- * Time up to `PROBE_SAMPLE_CAP` `fs.statSync` calls on entries directly under
57
- * `rootDir` and return the median per-stat cost in microseconds. Wrapped
58
- * entirely in try/catch: any failure (missing dir, permission error, empty
59
- * dir) yields `slow: false` — a probe failure must never itself degrade
60
- * behavior.
61
- */
62
- export function probeSlowFs(rootDir) {
63
- try {
64
- const resolvedRoot = path.resolve(rootDir);
65
- const entries = fs.readdirSync(resolvedRoot).slice(0, PROBE_SAMPLE_CAP);
66
- if (entries.length === 0) {
67
- return { slow: false, medianStatMicros: 0, samples: 0 };
68
- }
69
- const samplesMicros = [];
70
- for (const entry of entries) {
71
- const fullPath = path.join(resolvedRoot, entry);
72
- const startedAt = process.hrtime.bigint();
73
- try {
74
- fs.statSync(fullPath);
75
- }
76
- catch {
77
- continue; // vanished / permission-denied entry — skip, don't count
78
- }
79
- const elapsedNs = process.hrtime.bigint() - startedAt;
80
- samplesMicros.push(Number(elapsedNs) / 1000);
81
- }
82
- if (samplesMicros.length === 0) {
83
- return { slow: false, medianStatMicros: 0, samples: 0 };
84
- }
85
- const medianStatMicros = median(samplesMicros);
86
- const threshold = resolveThresholdMicros();
87
- return {
88
- slow: medianStatMicros > threshold,
89
- medianStatMicros,
90
- samples: samplesMicros.length,
91
- };
92
- }
93
- catch {
94
- return { slow: false, medianStatMicros: 0, samples: 0 };
95
- }
96
- }
97
- /** Process-lifetime memo of the slow-FS verdict, keyed by normalized cwd so
98
- * `/` vs `\` inputs share one entry (see path-key invariant tests). */
99
- const slowFsVerdictCache = new BoundedLruCache(32);
100
- /**
101
- * Resolve (and memoize) the slow-FS verdict for `cwd`. Resolution order:
102
- * 1. `PI_LENS_ALLOW_SLOW_FS_SCAN=1` — kill switch, always false.
103
- * 2. `PI_LENS_FORCE_SLOW_FS=1` — always true, probe skipped entirely.
104
- * 3. Measured probe (memoized per cwd for the process lifetime).
105
- */
106
- export function getSlowFsVerdict(cwd) {
107
- if (process.env.PI_LENS_ALLOW_SLOW_FS_SCAN === "1") {
108
- return { slow: false, medianStatMicros: 0, samples: 0 };
109
- }
110
- if (process.env.PI_LENS_FORCE_SLOW_FS === "1") {
111
- return { slow: true, medianStatMicros: 0, samples: 0 };
112
- }
113
- const key = normalizeFilePath(path.resolve(cwd));
114
- const cached = slowFsVerdictCache.get(key);
115
- if (cached)
116
- return cached;
117
- const result = probeSlowFs(cwd);
118
- slowFsVerdictCache.set(key, result);
119
- return result;
120
- }
121
- /** Convenience predicate for call sites that only need the boolean verdict. */
122
- export function isSlowFs(cwd) {
123
- return getSlowFsVerdict(cwd).slow;
124
- }
125
- /** Test-only: clear the memoized verdict cache so a subsequent call re-probes
126
- * (or re-reads the env kill switches). */
127
- export function _resetSlowFsForTests() {
128
- slowFsVerdictCache.clear();
129
- }
130
- /** Reduced sync `maxFiles` cap applied in slow-FS mode (env override is
131
- * deliberately NOT supported per #462's design — this is a safety clamp, not
132
- * a tuning knob). */
133
- export const SLOW_FS_REDUCED_MAX_FILES = 500;
134
- /** Human-readable degradation notice surfaced once per session when slow-FS
135
- * mode engages, so a user never sees a silently-empty scan result. */
136
- export function slowFsDegradationNotice() {
137
- return "slow filesystem detected (set PI_LENS_ALLOW_SLOW_FS_SCAN=1 to override)";
138
- }