@herbertgao/pi-extensions 2026.10.1 → 2026.10.2

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 (707) hide show
  1. package/README.md +13 -9
  2. package/THIRD_PARTY_NOTICES.md +2 -2
  3. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +2 -2
  4. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +2 -2
  5. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +1 -1
  6. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-help.md +1 -1
  7. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +2 -2
  8. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +1 -1
  9. package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +21 -21
  10. package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +1 -1
  11. package/node_modules/@dietrichgebert/ponytail/AGENTS.md +21 -21
  12. package/node_modules/@dietrichgebert/ponytail/README.md +68 -72
  13. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +7 -0
  14. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +30 -30
  15. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-map.js +103 -0
  16. package/node_modules/@dietrichgebert/ponytail/package.json +2 -2
  17. package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +33 -101
  18. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +89 -32
  19. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +13 -12
  20. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +17 -16
  21. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +9 -10
  22. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +96 -57
  23. package/node_modules/@herbertgao/pi-agency/LICENSE +21 -0
  24. package/node_modules/@herbertgao/pi-agency/README.md +40 -0
  25. package/node_modules/@herbertgao/pi-agency/package.json +53 -0
  26. package/node_modules/@herbertgao/pi-agency/src/index.ts +441 -0
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +12 -12
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +30 -6
  29. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +15 -9
  30. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +27 -9
  31. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +4 -1
  32. package/node_modules/@herbertgao/pi-cc-extensions/package.json +2 -2
  33. package/node_modules/@narumitw/pi-caffeinate/package.json +3 -3
  34. package/node_modules/@tifan/pi-mermaid-open/package.json +5 -1
  35. package/node_modules/@tifan/pi-mermaid-open/src/index.ts +26 -9
  36. package/node_modules/@tifan/pi-recap/package.json +1 -1
  37. package/node_modules/@tifan/pi-recap/src/index.ts +104 -20
  38. package/node_modules/@tifan/pi-recap/src/models.ts +46 -4
  39. package/node_modules/pi-antigravity/README.md +23 -2
  40. package/node_modules/pi-antigravity/package.json +5 -3
  41. package/node_modules/pi-antigravity/src/diagnostics/diagnostics.ts +3 -2
  42. package/node_modules/pi-antigravity/src/features/generate-image.ts +72 -0
  43. package/node_modules/pi-antigravity/src/features/google-search.ts +71 -0
  44. package/node_modules/pi-antigravity/src/image/image.ts +86 -47
  45. package/node_modules/pi-antigravity/src/image/native.ts +69 -0
  46. package/node_modules/pi-antigravity/src/index.ts +52 -137
  47. package/node_modules/pi-antigravity/src/search/search.ts +130 -31
  48. package/node_modules/pi-antigravity/src/stream/stream.ts +162 -113
  49. package/node_modules/pi-antigravity/src/types/enums.ts +1 -0
  50. package/node_modules/pi-antigravity/src/types/types.ts +1 -1
  51. package/node_modules/pi-antigravity/src/utils/security.ts +47 -1
  52. package/node_modules/pi-antigravity/src/utils/util.ts +38 -6
  53. package/node_modules/pi-lens/CHANGELOG.md +1064 -0
  54. package/node_modules/pi-lens/README.md +115 -25
  55. package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +6 -2
  56. package/node_modules/pi-lens/dist/chunk-22AVIGXS.js +560 -0
  57. package/node_modules/pi-lens/dist/chunk-27BBHSZC.js +106 -0
  58. package/node_modules/pi-lens/dist/chunk-2BEMIWEW.js +51 -0
  59. package/node_modules/pi-lens/dist/chunk-2EECBNC5.js +89 -0
  60. package/node_modules/pi-lens/dist/chunk-34U7PLGE.js +23 -0
  61. package/node_modules/pi-lens/dist/chunk-3I5QFT3N.js +181 -0
  62. package/node_modules/pi-lens/dist/chunk-3MED75HT.js +37 -0
  63. package/node_modules/pi-lens/dist/chunk-47D2BO4S.js +87 -0
  64. package/node_modules/pi-lens/dist/chunk-4RERDEXR.js +348 -0
  65. package/node_modules/pi-lens/dist/chunk-4W2PLC4J.js +27 -0
  66. package/node_modules/pi-lens/dist/chunk-52H5B5TC.js +202 -0
  67. package/node_modules/pi-lens/dist/chunk-54B42YRX.js +27 -0
  68. package/node_modules/pi-lens/dist/chunk-5RXBNSW2.js +266 -0
  69. package/node_modules/pi-lens/dist/chunk-5THXD6X5.js +201 -0
  70. package/node_modules/pi-lens/dist/chunk-5W3R6LFT.js +24 -0
  71. package/node_modules/pi-lens/dist/chunk-5ZEJHV35.js +341 -0
  72. package/node_modules/pi-lens/dist/chunk-6P62QVEA.js +118 -0
  73. package/node_modules/pi-lens/dist/chunk-6QIUX4EP.js +459 -0
  74. package/node_modules/pi-lens/dist/chunk-6VCD4VKZ.js +78 -0
  75. package/node_modules/pi-lens/dist/chunk-7F72PXY2.js +326 -0
  76. package/node_modules/pi-lens/dist/chunk-7FBF7NPR.js +998 -0
  77. package/node_modules/pi-lens/dist/chunk-7U2IDNXN.js +37 -0
  78. package/node_modules/pi-lens/dist/chunk-ABBOA7UD.js +157 -0
  79. package/node_modules/pi-lens/dist/chunk-AHDW3GPE.js +50 -0
  80. package/node_modules/pi-lens/dist/chunk-AJ3QXTRQ.js +756 -0
  81. package/node_modules/pi-lens/dist/chunk-AJVLWNFN.js +1610 -0
  82. package/node_modules/pi-lens/dist/chunk-AJXODZY6.js +112 -0
  83. package/node_modules/pi-lens/dist/chunk-ARFCXG7S.js +84 -0
  84. package/node_modules/pi-lens/dist/chunk-AS44CFQ4.js +708 -0
  85. package/node_modules/pi-lens/dist/chunk-AWE5TMPO.js +38 -0
  86. package/node_modules/pi-lens/dist/chunk-B3I2UUT4.js +4692 -0
  87. package/node_modules/pi-lens/dist/chunk-BRJKOBZP.js +331 -0
  88. package/node_modules/pi-lens/dist/chunk-BW5KFIQC.js +59 -0
  89. package/node_modules/pi-lens/dist/chunk-C2AUYXQH.js +149 -0
  90. package/node_modules/pi-lens/dist/chunk-CGGAIP7J.js +29 -0
  91. package/node_modules/pi-lens/dist/chunk-D6QS3U6M.js +30 -0
  92. package/node_modules/pi-lens/dist/chunk-DFVMIKMQ.js +349 -0
  93. package/node_modules/pi-lens/dist/chunk-DIULIWKU.js +169 -0
  94. package/node_modules/pi-lens/dist/chunk-DQ2NZ7C4.js +2317 -0
  95. package/node_modules/pi-lens/dist/chunk-E2WFBRHM.js +213 -0
  96. package/node_modules/pi-lens/dist/chunk-E4MAEDPM.js +50 -0
  97. package/node_modules/pi-lens/dist/chunk-EOKRQ3SA.js +30 -0
  98. package/node_modules/pi-lens/dist/chunk-F3AU2TMM.js +2626 -0
  99. package/node_modules/pi-lens/dist/chunk-F3P7VQ7H.js +170 -0
  100. package/node_modules/pi-lens/dist/chunk-FC4RP4I2.js +12 -0
  101. package/node_modules/pi-lens/dist/chunk-FJNKANOS.js +32 -0
  102. package/node_modules/pi-lens/dist/chunk-GUOGVTCQ.js +146 -0
  103. package/node_modules/pi-lens/dist/chunk-GVXA6CCE.js +18 -0
  104. package/node_modules/pi-lens/dist/chunk-HHYAELLJ.js +2334 -0
  105. package/node_modules/pi-lens/dist/chunk-HMFXILPV.js +83 -0
  106. package/node_modules/pi-lens/dist/chunk-HVUZXSWK.js +421 -0
  107. package/node_modules/pi-lens/dist/chunk-HWBZIGMJ.js +62 -0
  108. package/node_modules/pi-lens/dist/chunk-I3R7GKDR.js +17 -0
  109. package/node_modules/pi-lens/dist/chunk-I7SPGOWI.js +55 -0
  110. package/node_modules/pi-lens/dist/chunk-IIXOAGHR.js +38 -0
  111. package/node_modules/pi-lens/dist/chunk-IVP5KAB7.js +2250 -0
  112. package/node_modules/pi-lens/dist/chunk-IXEBJSUE.js +22 -0
  113. package/node_modules/pi-lens/dist/chunk-JOLITGCC.js +27 -0
  114. package/node_modules/pi-lens/dist/chunk-K6VYLB2U.js +145 -0
  115. package/node_modules/pi-lens/dist/chunk-LJDODBBZ.js +78 -0
  116. package/node_modules/pi-lens/dist/chunk-LNAKEO63.js +78 -0
  117. package/node_modules/pi-lens/dist/chunk-LSMJ6KBE.js +4139 -0
  118. package/node_modules/pi-lens/dist/chunk-LW6XKDZQ.js +5565 -0
  119. package/node_modules/pi-lens/dist/chunk-N3YQJI6O.js +899 -0
  120. package/node_modules/pi-lens/dist/chunk-NABLC7W3.js +148 -0
  121. package/node_modules/pi-lens/dist/chunk-NKOUFPQF.js +659 -0
  122. package/node_modules/pi-lens/dist/chunk-NL5GLMFI.js +211 -0
  123. package/node_modules/pi-lens/dist/chunk-NMABWBZN.js +327 -0
  124. package/node_modules/pi-lens/dist/chunk-NTHH2J74.js +27 -0
  125. package/node_modules/pi-lens/dist/chunk-NTUJEGDZ.js +59 -0
  126. package/node_modules/pi-lens/dist/chunk-NXL4FFQQ.js +47 -0
  127. package/node_modules/pi-lens/dist/chunk-NXPS2L6U.js +466 -0
  128. package/node_modules/pi-lens/dist/chunk-O5WILGMI.js +42 -0
  129. package/node_modules/pi-lens/dist/chunk-O6TQT6RI.js +48 -0
  130. package/node_modules/pi-lens/dist/chunk-OAXNDZJ7.js +323 -0
  131. package/node_modules/pi-lens/dist/chunk-ODEEOXPH.js +44 -0
  132. package/node_modules/pi-lens/dist/chunk-OQGFCZJ4.js +4533 -0
  133. package/node_modules/pi-lens/dist/chunk-ORTMY4Q4.js +282 -0
  134. package/node_modules/pi-lens/dist/chunk-OS32RNR2.js +442 -0
  135. package/node_modules/pi-lens/dist/chunk-PAK6IDME.js +189 -0
  136. package/node_modules/pi-lens/dist/chunk-PWFHBTSF.js +406 -0
  137. package/node_modules/pi-lens/dist/chunk-Q5U6FMDI.js +2352 -0
  138. package/node_modules/pi-lens/dist/chunk-QOZXJ4NA.js +3364 -0
  139. package/node_modules/pi-lens/dist/chunk-QYF5S6P6.js +45 -0
  140. package/node_modules/pi-lens/dist/chunk-RIISMHKN.js +36 -0
  141. package/node_modules/pi-lens/dist/chunk-RPD4ZSB7.js +25 -0
  142. package/node_modules/pi-lens/dist/chunk-RPD5K5NC.js +79 -0
  143. package/node_modules/pi-lens/dist/chunk-RUOG5D2C.js +262 -0
  144. package/node_modules/pi-lens/dist/chunk-T4ERT73Y.js +599 -0
  145. package/node_modules/pi-lens/dist/chunk-T6D4Q4AQ.js +54 -0
  146. package/node_modules/pi-lens/dist/chunk-TGPXLY2J.js +391 -0
  147. package/node_modules/pi-lens/dist/chunk-TLGFBM3F.js +12116 -0
  148. package/node_modules/pi-lens/dist/chunk-TO6WL3GM.js +88 -0
  149. package/node_modules/pi-lens/dist/chunk-TT22N74J.js +517 -0
  150. package/node_modules/pi-lens/dist/chunk-TVN5N6GY.js +21216 -0
  151. package/node_modules/pi-lens/dist/chunk-U3VGR4VU.js +308 -0
  152. package/node_modules/pi-lens/dist/chunk-UK3CMEAL.js +1250 -0
  153. package/node_modules/pi-lens/dist/chunk-UOPVJQ4N.js +103 -0
  154. package/node_modules/pi-lens/dist/chunk-UXVNL3D7.js +23 -0
  155. package/node_modules/pi-lens/dist/chunk-UY752QSN.js +45 -0
  156. package/node_modules/pi-lens/dist/chunk-V5PXFSZK.js +188 -0
  157. package/node_modules/pi-lens/dist/chunk-V7R425XG.js +398 -0
  158. package/node_modules/pi-lens/dist/chunk-VCSRSYLF.js +81 -0
  159. package/node_modules/pi-lens/dist/chunk-VD4JQCQC.js +162 -0
  160. package/node_modules/pi-lens/dist/chunk-VDBPVIKD.js +62 -0
  161. package/node_modules/pi-lens/dist/chunk-VHQLPIRJ.js +114 -0
  162. package/node_modules/pi-lens/dist/chunk-VN2AXLEX.js +5414 -0
  163. package/node_modules/pi-lens/dist/chunk-VNMT7C64.js +478 -0
  164. package/node_modules/pi-lens/dist/chunk-WONERJTP.js +309 -0
  165. package/node_modules/pi-lens/dist/chunk-XECLWQZN.js +85 -0
  166. package/node_modules/pi-lens/dist/chunk-XIMYZ3JA.js +27 -0
  167. package/node_modules/pi-lens/dist/chunk-XK4CIILI.js +144 -0
  168. package/node_modules/pi-lens/dist/chunk-Y4T27COV.js +562 -0
  169. package/node_modules/pi-lens/dist/chunk-YGVYKNSN.js +1860 -0
  170. package/node_modules/pi-lens/dist/chunk-YLF3PPT5.js +308 -0
  171. package/node_modules/pi-lens/dist/chunk-YSNFMJKN.js +14 -0
  172. package/node_modules/pi-lens/dist/chunk-Z3CCVDUB.js +76 -0
  173. package/node_modules/pi-lens/dist/chunk-Z54ZSOBZ.js +61 -0
  174. package/node_modules/pi-lens/dist/chunk-ZAWW3AF6.js +97 -0
  175. package/node_modules/pi-lens/dist/chunk-ZMOL6RQC.js +167 -0
  176. package/node_modules/pi-lens/dist/index.js +16456 -8335
  177. package/node_modules/pi-lens/dist/mcp/analyze-cli.js +186 -232
  178. package/node_modules/pi-lens/dist/mcp/cli.js +137 -98
  179. package/node_modules/pi-lens/dist/mcp/server.js +22589 -1573
  180. package/node_modules/pi-lens/dist/mcp/worker.js +97 -38
  181. package/node_modules/pi-lens/dist/probes/installer.js +135 -0
  182. package/node_modules/pi-lens/dist/workers/project-snapshot-persist-worker.js +22 -0
  183. package/node_modules/pi-lens/dist/workers/review-graph-persist-worker.js +15 -0
  184. package/node_modules/pi-lens/docs/agent-guide.md +13 -4
  185. package/node_modules/pi-lens/docs/agent-tools.md +42 -0
  186. package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +3 -2
  187. package/node_modules/pi-lens/docs/configuration.md +20 -1
  188. package/node_modules/pi-lens/docs/environment-variables.md +52 -2
  189. package/node_modules/pi-lens/docs/features.md +8 -4
  190. package/node_modules/pi-lens/docs/globalconfig.md +1 -0
  191. package/node_modules/pi-lens/docs/io-bridge-v2-migration.md +94 -0
  192. package/node_modules/pi-lens/docs/lsp-capability-matrix.md +36 -4
  193. package/node_modules/pi-lens/docs/lsp-idle-eviction.md +124 -0
  194. package/node_modules/pi-lens/docs/mcp.md +21 -5
  195. package/node_modules/pi-lens/docs/merge-queue-rollout.md +77 -0
  196. package/node_modules/pi-lens/docs/pi-lens-fixer.md +156 -88
  197. package/node_modules/pi-lens/docs/pi-lens-investigator.md +74 -26
  198. package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +694 -0
  199. package/node_modules/pi-lens/docs/pi-lens-monitor.md +73 -7
  200. package/node_modules/pi-lens/docs/pi-lens-retro.md +6 -4
  201. package/node_modules/pi-lens/docs/pi-lens-reviewer.md +188 -48
  202. package/node_modules/pi-lens/docs/pi-lens-subagent.md +246 -45
  203. package/node_modules/pi-lens/docs/pi-lens-warden.md +18 -7
  204. package/node_modules/pi-lens/docs/public-api-stability.md +55 -0
  205. package/node_modules/pi-lens/docs/release-qa-baseline.md +84 -17
  206. package/node_modules/pi-lens/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  207. package/node_modules/pi-lens/docs/servercapabilities.md +53 -49
  208. package/node_modules/pi-lens/docs/settings.md +1 -0
  209. package/node_modules/pi-lens/docs/usage.md +5 -1
  210. package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm +0 -0
  211. package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm.json +3 -3
  212. package/node_modules/pi-lens/package.json +18 -6
  213. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  214. package/node_modules/pi-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  215. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +1275 -62
  216. package/node_modules/pi-lens/scripts/download-grammars.js +5 -0
  217. package/node_modules/pi-lens/scripts/grammars.lock.json +6 -1
  218. package/node_modules/pi-lens/scripts/install-selftest.mjs +33 -34
  219. package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +13 -4
  220. package/node_modules/pi-lens/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  221. package/package.json +15 -10
  222. package/node_modules/@dietrichgebert/ponytail/README.es.md +0 -212
  223. package/node_modules/@dietrichgebert/ponytail/README.ja.md +0 -212
  224. package/node_modules/@dietrichgebert/ponytail/README.ko.md +0 -212
  225. package/node_modules/@dietrichgebert/ponytail/README.zh-CN.md +0 -212
  226. package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +0 -35
  227. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +0 -1610
  228. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +0 -593
  229. package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +0 -147
  230. package/node_modules/pi-lens/dist/clients/agent-nudge.js +0 -325
  231. package/node_modules/pi-lens/dist/clients/analysed-root.js +0 -1
  232. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +0 -731
  233. package/node_modules/pi-lens/dist/clients/ast-grep-rule-manager.js +0 -146
  234. package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +0 -118
  235. package/node_modules/pi-lens/dist/clients/ast-grep-types.js +0 -10
  236. package/node_modules/pi-lens/dist/clients/ast-grep-yaml-synth.js +0 -154
  237. package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +0 -75
  238. package/node_modules/pi-lens/dist/clients/atomic-write.js +0 -189
  239. package/node_modules/pi-lens/dist/clients/availability-probe-flight.js +0 -12
  240. package/node_modules/pi-lens/dist/clients/bash-file-access.js +0 -1056
  241. package/node_modules/pi-lens/dist/clients/biome-client.js +0 -357
  242. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +0 -837
  243. package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +0 -129
  244. package/node_modules/pi-lens/dist/clients/bootstrap.js +0 -569
  245. package/node_modules/pi-lens/dist/clients/bounded-cache.js +0 -190
  246. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +0 -202
  247. package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +0 -295
  248. package/node_modules/pi-lens/dist/clients/build-identity.js +0 -95
  249. package/node_modules/pi-lens/dist/clients/bundled-resource-health.js +0 -113
  250. package/node_modules/pi-lens/dist/clients/bus-events-logger.js +0 -105
  251. package/node_modules/pi-lens/dist/clients/bus-publish.js +0 -171
  252. package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +0 -190
  253. package/node_modules/pi-lens/dist/clients/cache-manager.js +0 -524
  254. package/node_modules/pi-lens/dist/clients/cache-observability.js +0 -1313
  255. package/node_modules/pi-lens/dist/clients/call-graph.js +0 -852
  256. package/node_modules/pi-lens/dist/clients/cargo-manifest.js +0 -422
  257. package/node_modules/pi-lens/dist/clients/cascade-budget.js +0 -196
  258. package/node_modules/pi-lens/dist/clients/cascade-format.js +0 -315
  259. package/node_modules/pi-lens/dist/clients/cascade-logger.js +0 -31
  260. package/node_modules/pi-lens/dist/clients/cascade-types.js +0 -9
  261. package/node_modules/pi-lens/dist/clients/child-unref.js +0 -124
  262. package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +0 -286
  263. package/node_modules/pi-lens/dist/clients/codebase-model.js +0 -173
  264. package/node_modules/pi-lens/dist/clients/collateral-test-role.js +0 -40
  265. package/node_modules/pi-lens/dist/clients/complexity-client.js +0 -462
  266. package/node_modules/pi-lens/dist/clients/config-core/deny.js +0 -221
  267. package/node_modules/pi-lens/dist/clients/config-core/index.js +0 -50
  268. package/node_modules/pi-lens/dist/clients/config-core/merge.js +0 -357
  269. package/node_modules/pi-lens/dist/clients/config-core/normalize.js +0 -340
  270. package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +0 -248
  271. package/node_modules/pi-lens/dist/clients/config-core/provenance.js +0 -164
  272. package/node_modules/pi-lens/dist/clients/config-core/records.js +0 -218
  273. package/node_modules/pi-lens/dist/clients/config-core/resolve.js +0 -125
  274. package/node_modules/pi-lens/dist/clients/config-core/safe-object.js +0 -78
  275. package/node_modules/pi-lens/dist/clients/config-core/schema.js +0 -165
  276. package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +0 -285
  277. package/node_modules/pi-lens/dist/clients/config-locations.js +0 -388
  278. package/node_modules/pi-lens/dist/clients/config-resolve.js +0 -798
  279. package/node_modules/pi-lens/dist/clients/config-schema.js +0 -251
  280. package/node_modules/pi-lens/dist/clients/config-warn.js +0 -407
  281. package/node_modules/pi-lens/dist/clients/console-guard-install.js +0 -26
  282. package/node_modules/pi-lens/dist/clients/cooperative-budget.js +0 -42
  283. package/node_modules/pi-lens/dist/clients/dead-code-client.js +0 -510
  284. package/node_modules/pi-lens/dist/clients/dead-code-logger.js +0 -30
  285. package/node_modules/pi-lens/dist/clients/deadline-utils.js +0 -280
  286. package/node_modules/pi-lens/dist/clients/debug-handles.js +0 -211
  287. package/node_modules/pi-lens/dist/clients/debug-heap.js +0 -174
  288. package/node_modules/pi-lens/dist/clients/deferred-lsp-work.js +0 -106
  289. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +0 -426
  290. package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +0 -169
  291. package/node_modules/pi-lens/dist/clients/dependency-checker.js +0 -885
  292. package/node_modules/pi-lens/dist/clients/deps/ast-grep-napi.js +0 -22
  293. package/node_modules/pi-lens/dist/clients/deps/js-yaml.js +0 -9
  294. package/node_modules/pi-lens/dist/clients/deps/minimatch.js +0 -4
  295. package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +0 -14
  296. package/node_modules/pi-lens/dist/clients/deps/typebox.js +0 -14
  297. package/node_modules/pi-lens/dist/clients/deps/vscode-jsonrpc.js +0 -1
  298. package/node_modules/pi-lens/dist/clients/deps/web-tree-sitter.js +0 -24
  299. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +0 -630
  300. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +0 -305
  301. package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +0 -73
  302. package/node_modules/pi-lens/dist/clients/diagnostic-tracker.js +0 -105
  303. package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +0 -230
  304. package/node_modules/pi-lens/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  305. package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  306. package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -35
  307. package/node_modules/pi-lens/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  308. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +0 -1269
  309. package/node_modules/pi-lens/dist/clients/dispatch/fact-provider-types.js +0 -1
  310. package/node_modules/pi-lens/dist/clients/dispatch/fact-rule-runner.js +0 -17
  311. package/node_modules/pi-lens/dist/clients/dispatch/fact-runner.js +0 -30
  312. package/node_modules/pi-lens/dist/clients/dispatch/fact-scheduler.js +0 -68
  313. package/node_modules/pi-lens/dist/clients/dispatch/fact-store.js +0 -377
  314. package/node_modules/pi-lens/dist/clients/dispatch/facts/comment-facts.js +0 -22
  315. package/node_modules/pi-lens/dist/clients/dispatch/facts/file-content.js +0 -19
  316. package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +0 -348
  317. package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +0 -204
  318. package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  319. package/node_modules/pi-lens/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  320. package/node_modules/pi-lens/dist/clients/dispatch/finding-policy.js +0 -339
  321. package/node_modules/pi-lens/dist/clients/dispatch/indent-detect.js +0 -417
  322. package/node_modules/pi-lens/dist/clients/dispatch/inline-suppressions.js +0 -89
  323. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +0 -2377
  324. package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +0 -11
  325. package/node_modules/pi-lens/dist/clients/dispatch/pending-runner-findings.js +0 -87
  326. package/node_modules/pi-lens/dist/clients/dispatch/plan.js +0 -278
  327. package/node_modules/pi-lens/dist/clients/dispatch/priorities.js +0 -20
  328. package/node_modules/pi-lens/dist/clients/dispatch/rule-id-normalize.js +0 -50
  329. package/node_modules/pi-lens/dist/clients/dispatch/rule-ignores.js +0 -69
  330. package/node_modules/pi-lens/dist/clients/dispatch/rule-policy.js +0 -135
  331. package/node_modules/pi-lens/dist/clients/dispatch/rules/async-noise.js +0 -40
  332. package/node_modules/pi-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  333. package/node_modules/pi-lens/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  334. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  335. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  336. package/node_modules/pi-lens/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  337. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-complexity.js +0 -72
  338. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  339. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  340. package/node_modules/pi-lens/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  341. package/node_modules/pi-lens/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  342. package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  343. package/node_modules/pi-lens/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  344. package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  345. package/node_modules/pi-lens/dist/clients/dispatch/runner-context.js +0 -52
  346. package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +0 -111
  347. package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  348. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +0 -296
  349. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +0 -219
  350. package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +0 -82
  351. package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +0 -416
  352. package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  353. package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +0 -176
  354. package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  355. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +0 -195
  356. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +0 -137
  357. package/node_modules/pi-lens/dist/clients/dispatch/runners/fact-rules.js +0 -29
  358. package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +0 -69
  359. package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +0 -167
  360. package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +0 -104
  361. package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  362. package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +0 -91
  363. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +0 -171
  364. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +0 -940
  365. package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +0 -117
  366. package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +0 -108
  367. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +0 -99
  368. package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +0 -110
  369. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +0 -379
  370. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +0 -167
  371. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +0 -102
  372. package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +0 -414
  373. package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +0 -85
  374. package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +0 -120
  375. package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  376. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  377. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +0 -169
  378. package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +0 -99
  379. package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +0 -88
  380. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  381. package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +0 -173
  382. package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +0 -102
  383. package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +0 -128
  384. package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +0 -259
  385. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  386. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +0 -166
  387. package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +0 -163
  388. package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +0 -174
  389. package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +0 -168
  390. package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +0 -125
  391. package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  392. package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +0 -253
  393. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  394. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  395. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  396. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  397. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  398. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  399. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  400. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  401. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -15
  402. package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +0 -128
  403. package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  404. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +0 -95
  405. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +0 -79
  406. package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +0 -79
  407. package/node_modules/pi-lens/dist/clients/dispatch/tool-profile.js +0 -30
  408. package/node_modules/pi-lens/dist/clients/dispatch/types.js +0 -21
  409. package/node_modules/pi-lens/dist/clients/dispatch/utils/format-utils.js +0 -45
  410. package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  411. package/node_modules/pi-lens/dist/clients/disposition-logger.js +0 -32
  412. package/node_modules/pi-lens/dist/clients/disposition-publish.js +0 -124
  413. package/node_modules/pi-lens/dist/clients/durable-store.js +0 -97
  414. package/node_modules/pi-lens/dist/clients/effective-config.js +0 -415
  415. package/node_modules/pi-lens/dist/clients/env-utils.js +0 -83
  416. package/node_modules/pi-lens/dist/clients/error-class.js +0 -23
  417. package/node_modules/pi-lens/dist/clients/eval-timestamp.js +0 -17
  418. package/node_modules/pi-lens/dist/clients/event-loop-hold.js +0 -274
  419. package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +0 -250
  420. package/node_modules/pi-lens/dist/clients/extension-log.js +0 -504
  421. package/node_modules/pi-lens/dist/clients/extension-mode.js +0 -73
  422. package/node_modules/pi-lens/dist/clients/feature-hints.js +0 -103
  423. package/node_modules/pi-lens/dist/clients/file-kinds.js +0 -412
  424. package/node_modules/pi-lens/dist/clients/file-role.js +0 -134
  425. package/node_modules/pi-lens/dist/clients/file-time.js +0 -160
  426. package/node_modules/pi-lens/dist/clients/file-utils.js +0 -1032
  427. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +0 -494
  428. package/node_modules/pi-lens/dist/clients/finding-identity.js +0 -88
  429. package/node_modules/pi-lens/dist/clients/fix-worklog.js +0 -103
  430. package/node_modules/pi-lens/dist/clients/format-events-publish.js +0 -343
  431. package/node_modules/pi-lens/dist/clients/format-service.js +0 -222
  432. package/node_modules/pi-lens/dist/clients/formatters-lazy.js +0 -9
  433. package/node_modules/pi-lens/dist/clients/formatters.js +0 -2032
  434. package/node_modules/pi-lens/dist/clients/freshness-cadence.js +0 -17
  435. package/node_modules/pi-lens/dist/clients/freshness.js +0 -38
  436. package/node_modules/pi-lens/dist/clients/generated-artifacts.js +0 -394
  437. package/node_modules/pi-lens/dist/clients/generation-guard.js +0 -215
  438. package/node_modules/pi-lens/dist/clients/git-guard.js +0 -1136
  439. package/node_modules/pi-lens/dist/clients/git-tracked-ignore.js +0 -243
  440. package/node_modules/pi-lens/dist/clients/gitleaks-client.js +0 -509
  441. package/node_modules/pi-lens/dist/clients/go-client.js +0 -104
  442. package/node_modules/pi-lens/dist/clients/govulncheck-client.js +0 -605
  443. package/node_modules/pi-lens/dist/clients/gradle-ktfmt-style.js +0 -348
  444. package/node_modules/pi-lens/dist/clients/grammar-source.js +0 -465
  445. package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +0 -135
  446. package/node_modules/pi-lens/dist/clients/hashline-anchor.js +0 -424
  447. package/node_modules/pi-lens/dist/clients/hook-budgets.js +0 -76
  448. package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +0 -140
  449. package/node_modules/pi-lens/dist/clients/host-ports.js +0 -39
  450. package/node_modules/pi-lens/dist/clients/indent-retarget.js +0 -154
  451. package/node_modules/pi-lens/dist/clients/inline-blocker-dispositions.js +0 -186
  452. package/node_modules/pi-lens/dist/clients/install-diagnostics.js +0 -156
  453. package/node_modules/pi-lens/dist/clients/installer/index.js +0 -5416
  454. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  455. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +0 -783
  456. package/node_modules/pi-lens/dist/clients/instance-reaper-state.js +0 -7
  457. package/node_modules/pi-lens/dist/clients/instance-reaper.js +0 -1137
  458. package/node_modules/pi-lens/dist/clients/instance-registry-lock.js +0 -145
  459. package/node_modules/pi-lens/dist/clients/instance-registry.js +0 -773
  460. package/node_modules/pi-lens/dist/clients/jscpd-client.js +0 -378
  461. package/node_modules/pi-lens/dist/clients/json-cache-read.js +0 -65
  462. package/node_modules/pi-lens/dist/clients/knip-client.js +0 -788
  463. package/node_modules/pi-lens/dist/clients/language-policy.js +0 -252
  464. package/node_modules/pi-lens/dist/clients/language-profile.js +0 -361
  465. package/node_modules/pi-lens/dist/clients/language-registry.js +0 -603
  466. package/node_modules/pi-lens/dist/clients/latency-logger.js +0 -727
  467. package/node_modules/pi-lens/dist/clients/lazy-import.js +0 -21
  468. package/node_modules/pi-lens/dist/clients/ledger-bounds.js +0 -54
  469. package/node_modules/pi-lens/dist/clients/lens-config.js +0 -404
  470. package/node_modules/pi-lens/dist/clients/lens-engine.js +0 -358
  471. package/node_modules/pi-lens/dist/clients/lens-events.js +0 -125
  472. package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +0 -467
  473. package/node_modules/pi-lens/dist/clients/lens-map.js +0 -1156
  474. package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +0 -74
  475. package/node_modules/pi-lens/dist/clients/log-cleanup.js +0 -222
  476. package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +0 -178
  477. package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +0 -421
  478. package/node_modules/pi-lens/dist/clients/lsp/client.js +0 -4593
  479. package/node_modules/pi-lens/dist/clients/lsp/config.js +0 -691
  480. package/node_modules/pi-lens/dist/clients/lsp/content-limits.js +0 -41
  481. package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +0 -225
  482. package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +0 -467
  483. package/node_modules/pi-lens/dist/clients/lsp/edits.js +0 -1219
  484. package/node_modules/pi-lens/dist/clients/lsp/index.js +0 -8305
  485. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +0 -216
  486. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +0 -298
  487. package/node_modules/pi-lens/dist/clients/lsp/language.js +0 -63
  488. package/node_modules/pi-lens/dist/clients/lsp/launch.js +0 -746
  489. package/node_modules/pi-lens/dist/clients/lsp/lombok.js +0 -158
  490. package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +0 -5
  491. package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +0 -251
  492. package/node_modules/pi-lens/dist/clients/lsp/position-encoding.js +0 -61
  493. package/node_modules/pi-lens/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  494. package/node_modules/pi-lens/dist/clients/lsp/server.js +0 -3290
  495. package/node_modules/pi-lens/dist/clients/lsp/session-roots.js +0 -192
  496. package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +0 -17
  497. package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -56
  498. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +0 -332
  499. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  500. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +0 -85
  501. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/index.js +0 -10
  502. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +0 -392
  503. package/node_modules/pi-lens/dist/clients/lsp/watch-queue.js +0 -61
  504. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  505. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  506. package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  507. package/node_modules/pi-lens/dist/clients/lsp-budget.js +0 -186
  508. package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +0 -110
  509. package/node_modules/pi-lens/dist/clients/lsp-lazy.js +0 -9
  510. package/node_modules/pi-lens/dist/clients/lsp-mutation.js +0 -396
  511. package/node_modules/pi-lens/dist/clients/lsp-status.js +0 -59
  512. package/node_modules/pi-lens/dist/clients/map-with-concurrency.js +0 -40
  513. package/node_modules/pi-lens/dist/clients/mcp/analyze.js +0 -420
  514. package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +0 -31
  515. package/node_modules/pi-lens/dist/clients/mcp/ipc.js +0 -523
  516. package/node_modules/pi-lens/dist/clients/mcp/review.js +0 -197
  517. package/node_modules/pi-lens/dist/clients/mcp/session.js +0 -412
  518. package/node_modules/pi-lens/dist/clients/memory-sampler.js +0 -208
  519. package/node_modules/pi-lens/dist/clients/message-end-attribution.js +0 -30
  520. package/node_modules/pi-lens/dist/clients/metrics-client.js +0 -107
  521. package/node_modules/pi-lens/dist/clients/metrics-history.js +0 -327
  522. package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +0 -263
  523. package/node_modules/pi-lens/dist/clients/model-provider.js +0 -53
  524. package/node_modules/pi-lens/dist/clients/module-report-lsp.js +0 -189
  525. package/node_modules/pi-lens/dist/clients/module-report.js +0 -2150
  526. package/node_modules/pi-lens/dist/clients/mutating-tool.js +0 -651
  527. package/node_modules/pi-lens/dist/clients/mutation-attribution.js +0 -368
  528. package/node_modules/pi-lens/dist/clients/mutation-bridge.js +0 -240
  529. package/node_modules/pi-lens/dist/clients/ndjson-logger.js +0 -734
  530. package/node_modules/pi-lens/dist/clients/observed-mutation-sources.js +0 -101
  531. package/node_modules/pi-lens/dist/clients/observed-mutation.js +0 -1253
  532. package/node_modules/pi-lens/dist/clients/oldtext-autopatch.js +0 -128
  533. package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +0 -496
  534. package/node_modules/pi-lens/dist/clients/opengrep-client.js +0 -333
  535. package/node_modules/pi-lens/dist/clients/opengrep-config.js +0 -76
  536. package/node_modules/pi-lens/dist/clients/package-manager.js +0 -607
  537. package/node_modules/pi-lens/dist/clients/package-root.js +0 -38
  538. package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +0 -439
  539. package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +0 -43
  540. package/node_modules/pi-lens/dist/clients/path-keyed-map.js +0 -108
  541. package/node_modules/pi-lens/dist/clients/path-utils.js +0 -1244
  542. package/node_modules/pi-lens/dist/clients/performance-report.js +0 -331
  543. package/node_modules/pi-lens/dist/clients/persist-debounce.js +0 -70
  544. package/node_modules/pi-lens/dist/clients/persistent-reverify.js +0 -271
  545. package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +0 -119
  546. package/node_modules/pi-lens/dist/clients/pipeline.js +0 -1480
  547. package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +0 -37
  548. package/node_modules/pi-lens/dist/clients/print-mode.js +0 -21
  549. package/node_modules/pi-lens/dist/clients/probe-home-state.js +0 -228
  550. package/node_modules/pi-lens/dist/clients/process-bridge.js +0 -66
  551. package/node_modules/pi-lens/dist/clients/process-singletons.js +0 -210
  552. package/node_modules/pi-lens/dist/clients/process-snapshot.js +0 -68
  553. package/node_modules/pi-lens/dist/clients/project-changes.js +0 -181
  554. package/node_modules/pi-lens/dist/clients/project-conventions.js +0 -171
  555. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +0 -137
  556. package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +0 -109
  557. package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  558. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  559. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  560. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  561. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  562. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  563. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  564. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  565. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  566. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  567. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  568. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +0 -520
  569. package/node_modules/pi-lens/dist/clients/project-diagnostics/types.js +0 -1
  570. package/node_modules/pi-lens/dist/clients/project-lens-config.js +0 -807
  571. package/node_modules/pi-lens/dist/clients/project-report.js +0 -701
  572. package/node_modules/pi-lens/dist/clients/project-scale.js +0 -237
  573. package/node_modules/pi-lens/dist/clients/project-scan-policy.js +0 -11
  574. package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +0 -48
  575. package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +0 -20
  576. package/node_modules/pi-lens/dist/clients/project-snapshot.js +0 -1653
  577. package/node_modules/pi-lens/dist/clients/project-trust.js +0 -181
  578. package/node_modules/pi-lens/dist/clients/python-environment.js +0 -217
  579. package/node_modules/pi-lens/dist/clients/python-provenance.js +0 -639
  580. package/node_modules/pi-lens/dist/clients/quiet-window-config.js +0 -47
  581. package/node_modules/pi-lens/dist/clients/quiet-window.js +0 -236
  582. package/node_modules/pi-lens/dist/clients/read-bridge.js +0 -139
  583. package/node_modules/pi-lens/dist/clients/read-expansion.js +0 -266
  584. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +0 -251
  585. package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +0 -1306
  586. package/node_modules/pi-lens/dist/clients/read-guard.js +0 -1561
  587. package/node_modules/pi-lens/dist/clients/recent-touches.js +0 -240
  588. package/node_modules/pi-lens/dist/clients/redact/secrets.js +0 -449
  589. package/node_modules/pi-lens/dist/clients/resource-sampler.js +0 -628
  590. package/node_modules/pi-lens/dist/clients/reverse-deps.js +0 -270
  591. package/node_modules/pi-lens/dist/clients/review-graph/builder.js +0 -5126
  592. package/node_modules/pi-lens/dist/clients/review-graph/format.js +0 -33
  593. package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +0 -163
  594. package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +0 -481
  595. package/node_modules/pi-lens/dist/clients/review-graph/persist-worker.js +0 -10
  596. package/node_modules/pi-lens/dist/clients/review-graph/query.js +0 -244
  597. package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +0 -21
  598. package/node_modules/pi-lens/dist/clients/review-graph/service.js +0 -96
  599. package/node_modules/pi-lens/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  600. package/node_modules/pi-lens/dist/clients/review-graph/symbol-id.js +0 -103
  601. package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +0 -299
  602. package/node_modules/pi-lens/dist/clients/review-graph/types.js +0 -1
  603. package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +0 -449
  604. package/node_modules/pi-lens/dist/clients/review-graph-logger.js +0 -81
  605. package/node_modules/pi-lens/dist/clients/ruff-client.js +0 -179
  606. package/node_modules/pi-lens/dist/clients/rules-scanner.js +0 -131
  607. package/node_modules/pi-lens/dist/clients/run-duration.js +0 -55
  608. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +0 -746
  609. package/node_modules/pi-lens/dist/clients/runtime-config.js +0 -77
  610. package/node_modules/pi-lens/dist/clients/runtime-context.js +0 -211
  611. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +0 -1324
  612. package/node_modules/pi-lens/dist/clients/runtime-session.js +0 -2485
  613. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +0 -1295
  614. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +0 -2049
  615. package/node_modules/pi-lens/dist/clients/runtime-turn.js +0 -3767
  616. package/node_modules/pi-lens/dist/clients/rust-client.js +0 -97
  617. package/node_modules/pi-lens/dist/clients/safe-spawn.js +0 -2357
  618. package/node_modules/pi-lens/dist/clients/sanitize.js +0 -286
  619. package/node_modules/pi-lens/dist/clients/scan-utils.js +0 -25
  620. package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +0 -165
  621. package/node_modules/pi-lens/dist/clients/search-read-registration.js +0 -94
  622. package/node_modules/pi-lens/dist/clients/secret-findings.js +0 -114
  623. package/node_modules/pi-lens/dist/clients/security-scan-client.js +0 -352
  624. package/node_modules/pi-lens/dist/clients/session-event-guard.js +0 -297
  625. package/node_modules/pi-lens/dist/clients/session-lifecycle.js +0 -484
  626. package/node_modules/pi-lens/dist/clients/session-start-observability.js +0 -94
  627. package/node_modules/pi-lens/dist/clients/session-state-store.js +0 -101
  628. package/node_modules/pi-lens/dist/clients/session-summary.js +0 -15
  629. package/node_modules/pi-lens/dist/clients/sessionstart-logger.js +0 -27
  630. package/node_modules/pi-lens/dist/clients/sg-runner.js +0 -876
  631. package/node_modules/pi-lens/dist/clients/sgconfig.js +0 -347
  632. package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +0 -338
  633. package/node_modules/pi-lens/dist/clients/single-flight.js +0 -158
  634. package/node_modules/pi-lens/dist/clients/situational-tool-telemetry.js +0 -108
  635. package/node_modules/pi-lens/dist/clients/skills-resolver.js +0 -141
  636. package/node_modules/pi-lens/dist/clients/slow-fs.js +0 -138
  637. package/node_modules/pi-lens/dist/clients/smells-rollup.js +0 -231
  638. package/node_modules/pi-lens/dist/clients/source-filter.js +0 -596
  639. package/node_modules/pi-lens/dist/clients/source-walker.js +0 -211
  640. package/node_modules/pi-lens/dist/clients/spawn-output-cap.js +0 -120
  641. package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +0 -110
  642. package/node_modules/pi-lens/dist/clients/stale-marker.js +0 -17
  643. package/node_modules/pi-lens/dist/clients/startup-scan.js +0 -400
  644. package/node_modules/pi-lens/dist/clients/startup-timing.js +0 -130
  645. package/node_modules/pi-lens/dist/clients/string-utils.js +0 -33
  646. package/node_modules/pi-lens/dist/clients/subagent-mode.js +0 -111
  647. package/node_modules/pi-lens/dist/clients/symbol-containment.js +0 -24
  648. package/node_modules/pi-lens/dist/clients/symbol-types.js +0 -5
  649. package/node_modules/pi-lens/dist/clients/test-runner-client.js +0 -2507
  650. package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +0 -287
  651. package/node_modules/pi-lens/dist/clients/todo-scanner.js +0 -229
  652. package/node_modules/pi-lens/dist/clients/tool-agreement.js +0 -423
  653. package/node_modules/pi-lens/dist/clients/tool-config.js +0 -249
  654. package/node_modules/pi-lens/dist/clients/tool-cwd.js +0 -270
  655. package/node_modules/pi-lens/dist/clients/tool-definition.js +0 -47
  656. package/node_modules/pi-lens/dist/clients/tool-event.js +0 -105
  657. package/node_modules/pi-lens/dist/clients/tool-policy.js +0 -2755
  658. package/node_modules/pi-lens/dist/clients/tool-probe.js +0 -53
  659. package/node_modules/pi-lens/dist/clients/tool-render.js +0 -156
  660. package/node_modules/pi-lens/dist/clients/tool-set-policy.js +0 -118
  661. package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +0 -364
  662. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +0 -4195
  663. package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +0 -100
  664. package/node_modules/pi-lens/dist/clients/tree-sitter-navigator.js +0 -269
  665. package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +0 -569
  666. package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +0 -158
  667. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  668. package/node_modules/pi-lens/dist/clients/trivy-client.js +0 -467
  669. package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -50
  670. package/node_modules/pi-lens/dist/clients/turn-context.js +0 -52
  671. package/node_modules/pi-lens/dist/clients/turn-end/lane.js +0 -51
  672. package/node_modules/pi-lens/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  673. package/node_modules/pi-lens/dist/clients/turn-end/lanes/secrets.js +0 -204
  674. package/node_modules/pi-lens/dist/clients/turn-summary-render.js +0 -72
  675. package/node_modules/pi-lens/dist/clients/turn-summary.js +0 -132
  676. package/node_modules/pi-lens/dist/clients/typos-config.js +0 -29
  677. package/node_modules/pi-lens/dist/clients/user-notify.js +0 -51
  678. package/node_modules/pi-lens/dist/clients/vanished-instance-marker.js +0 -57
  679. package/node_modules/pi-lens/dist/clients/warm-attach.js +0 -305
  680. package/node_modules/pi-lens/dist/clients/widget-state.js +0 -1808
  681. package/node_modules/pi-lens/dist/clients/word-index-logger.js +0 -49
  682. package/node_modules/pi-lens/dist/clients/word-index-store.js +0 -459
  683. package/node_modules/pi-lens/dist/clients/word-index.js +0 -2080
  684. package/node_modules/pi-lens/dist/clients/workspace-topology.js +0 -443
  685. package/node_modules/pi-lens/dist/clients/write-ordering-guard.js +0 -65
  686. package/node_modules/pi-lens/dist/clients/zizmor-config.js +0 -340
  687. package/node_modules/pi-lens/dist/i18n.js +0 -69
  688. package/node_modules/pi-lens/dist/mcp/build-staleness.js +0 -124
  689. package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +0 -583
  690. package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +0 -129
  691. package/node_modules/pi-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  692. package/node_modules/pi-lens/dist/tools/activate-tools.js +0 -87
  693. package/node_modules/pi-lens/dist/tools/ast-grep-outline.js +0 -137
  694. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +0 -244
  695. package/node_modules/pi-lens/dist/tools/ast-grep-search.js +0 -762
  696. package/node_modules/pi-lens/dist/tools/effective-config.js +0 -90
  697. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +0 -375
  698. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +0 -2571
  699. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +0 -1745
  700. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +0 -1367
  701. package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +0 -294
  702. package/node_modules/pi-lens/dist/tools/module-report.js +0 -382
  703. package/node_modules/pi-lens/dist/tools/project-report.js +0 -86
  704. package/node_modules/pi-lens/dist/tools/render-compact.js +0 -374
  705. package/node_modules/pi-lens/dist/tools/scan-progress.js +0 -53
  706. package/node_modules/pi-lens/dist/tools/shared.js +0 -29
  707. package/node_modules/pi-lens/dist/tools/symbol-search.js +0 -155
@@ -1,83 +0,0 @@
1
- /**
2
- * Environment / config input helpers.
3
- *
4
- * Small, dependency-free utilities used by logger modules and runtime tuning
5
- * knobs to keep duplicated env-handling expressions in a single place.
6
- */
7
- /**
8
- * True when pi-lens should suppress side-effecting log writes — e.g. inside
9
- * the vitest test runner, or when callers explicitly set `PI_LENS_TEST_MODE=1`.
10
- *
11
- * Resolution:
12
- * - `PI_LENS_TEST_MODE === "1"` → true (explicit opt-in)
13
- * - `VITEST` set and `PI_LENS_TEST_MODE !== "0"` → true (vitest default, with explicit opt-out)
14
- * - otherwise false
15
- *
16
- * Replaces the boolean previously duplicated verbatim in ~10 logger modules.
17
- */
18
- export function isTestMode() {
19
- if (process.env.PI_LENS_TEST_MODE === "1")
20
- return true;
21
- if (process.env.VITEST && process.env.PI_LENS_TEST_MODE !== "0")
22
- return true;
23
- return false;
24
- }
25
- /**
26
- * Coerce an arbitrary input to a non-negative finite number, or 0 otherwise.
27
- *
28
- * Use this to gate config / env values before they flow into `Math.max` /
29
- * `Math.min` / `setTimeout`. `Number(undefined)` is `NaN`, and a single NaN
30
- * argument makes `Math.max` return NaN, which `setTimeout` silently treats
31
- * as 0 — see the runner-timeout-floor regression caught in PR #109.
32
- *
33
- * @example
34
- * ```ts
35
- * const floor = Math.max(
36
- * toPositiveFinite(process.env.PI_LENS_KNOB_MS),
37
- * toPositiveFinite(loadedConfig?.knobMs),
38
- * 0,
39
- * );
40
- * ```
41
- */
42
- export function toPositiveFinite(value) {
43
- const num = typeof value === "number" ? value : Number(value);
44
- return Number.isFinite(num) && num > 0 ? num : 0;
45
- }
46
- /**
47
- * Factory for the lazy-memoized "positive-finite-number env override, else a
48
- * default" getter pattern repeated across `startup-scan.ts` (#699, #758) and
49
- * originally documented as house style in `runtime-config.ts` / `slow-fs.ts` /
50
- * `subagent-mode.ts` (#763).
51
- *
52
- * `get()` reads `process.env[envName]` through {@link toPositiveFinite} the
53
- * first time it's called, memoizes the result (or `fallback` when the env var
54
- * is unset/non-finite/non-positive), and returns the memo on every subsequent
55
- * call. `_resetForTests()` clears the memo so a test can flip the env var and
56
- * observe a fresh read (matching the existing `_resetForTests` convention).
57
- *
58
- * Deliberately does NOT touch `process.env` until `get()` is first called —
59
- * that's the entire point of the lazy pattern: importing a module must never
60
- * have a side effect on process env at load time.
61
- *
62
- * @example
63
- * ```ts
64
- * const _ttl = lazyEnvNumber("PI_LENS_STARTUP_SCAN_VERDICT_TTL_MS", DEFAULT_TTL_MS);
65
- * export const getStartupScanVerdictTtlMs = _ttl.get;
66
- * export const _resetStartupScanVerdictTtlForTests = _ttl._resetForTests;
67
- * ```
68
- */
69
- export function lazyEnvNumber(envName, fallback) {
70
- let memo;
71
- return {
72
- get() {
73
- if (memo !== undefined)
74
- return memo;
75
- const envValue = toPositiveFinite(process.env[envName]);
76
- memo = envValue > 0 ? envValue : fallback;
77
- return memo;
78
- },
79
- _resetForTests() {
80
- memo = undefined;
81
- },
82
- };
83
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * The class name of a caught error, and NOTHING else — never the message,
3
- * which for some callers could quote content they do not want to risk
4
- * surfacing (a config-core bug thrown while walking the raw, untrusted
5
- * parsed document; a whole-resolution catch wrapping several stages at
6
- * once). One leaf so that guarantee does not grow a third, fourth, and
7
- * fifth hand-rolled `error instanceof Error ? error.name : "unknown error"`
8
- * (#2451 — `clients/config-warn.ts`'s `normalizeParseErrorReason` (the
9
- * `classOnly` option), `clients/config-core/normalize.ts`,
10
- * `clients/config-core/resolve.ts`, and `clients/lens-config.ts` all call
11
- * this instead of inlining their own copy).
12
- *
13
- * Zero imports of its own, deliberately: `config-core/` must never import a
14
- * sink (`clients/config-warn.ts` -> the degradation ledger) — that exact
15
- * import closed seven cycles when #2426 removed it, and importing
16
- * `normalizeParseErrorReason` from inside `config-core/` to get this one
17
- * value back would reopen them. This leaf is how `config-warn.ts` and
18
- * `config-core/*.ts` share ONE implementation without either importing the
19
- * other.
20
- */
21
- export function errorClassName(error) {
22
- return error instanceof Error ? error.name : "unknown error";
23
- }
@@ -1,17 +0,0 @@
1
- import { performance } from "node:perf_hooks";
2
- /**
3
- * The moment pi-lens's module graph started evaluating, captured as this
4
- * module's first statement (#1374 host-boot vs extension-eval split).
5
- *
6
- * This module is otherwise side-effect-free by design (#1434 S3d review): it
7
- * does nothing but capture a timestamp. `clients/console-guard-install.ts`
8
- * imports it as its FIRST import so the capture happens before the guard's
9
- * own install work, and `clients/startup-timing.ts` imports it too, for the
10
- * constant alone. Before this split, `startup-timing.ts` imported the
11
- * constant FROM `console-guard-install.ts` — which meant importing
12
- * startup-timing anywhere (e.g. a test measuring load time) silently
13
- * installed the console guard as a side effect. Splitting the constant out
14
- * means importing this module, or `startup-timing.ts`, never installs
15
- * anything.
16
- */
17
- export const PI_LENS_EVAL_STARTED_MS = performance.now();
@@ -1,274 +0,0 @@
1
- /**
2
- * #2507: hold the event loop for the lifetime of in-flight work that would
3
- * otherwise be kept alive by NOTHING.
4
- *
5
- * Every handle pi-lens owns on the way to an LSP answer is deliberately
6
- * unref'd. `clients/lsp/launch.ts#unrefLspProcessHandles` unrefs the language
7
- * server child AND its three stdio pipes so a settled one-shot `pi --print`
8
- * can exit without waiting for a lingering server (the #1097/#1110 class);
9
- * `clients/child-unref.ts` does the same for every fire-and-forget probe
10
- * spawn; `bounded()` and several LSP waits unref their timers for the same
11
- * reason. That is correct for an IDLE process and wrong for a BUSY one: in a
12
- * headless child (`pi --mode json -p --no-extensions`, stdin ignored, no TUI,
13
- * no other extension holding a socket or timer) an in-flight `lsp_diagnostics`
14
- * call reaches a point where the only thing it is waiting on is an unref'd
15
- * timer or an unref'd pipe, libuv finds no referenced handle, and Node exits 0
16
- * IN THE MIDDLE of the tool call — no error, no result, no `turn_end`. The
17
- * reporter measured it against pyright; the drain site the repro lands on is
18
- * `LSPService.ensureWarmForSweep`'s warm-up retry backoff (an explicitly
19
- * `.unref()`'d `setTimeout`), but it is one of many: any await whose only
20
- * pending handle is unref'd has the same shape.
21
- *
22
- * The fix is NOT to stop unref'ing — that would leak a lingering server into
23
- * every settled one-shot process, which is the reason the unref exists. It is
24
- * to hold ONE referenced handle for exactly as long as something is in
25
- * flight: a counted keep-alive, armed while at least one hold is taken and
26
- * disarmed the moment the last one is released. Idle behaviour is therefore
27
- * byte-identical to before — no hold, no timer, nothing referenced.
28
- *
29
- * Shape 15's screen (AGENTS.md), which this follows deliberately:
30
- * - a COUNTER of tokens, not a boolean, so overlapping tool calls each
31
- * release independently and a throwing/aborted caller still releases
32
- * (callers release from `finally`);
33
- * - a bounded lifetime PER HOLD, because a leaked hold is the INVERSE defect
34
- * (a process that can never exit). Each token gets {@link
35
- * getEventLoopHoldMaxMs} measured from its OWN acquire — derived from the
36
- * longest legitimate operation's ceiling (`getWorkspaceSweepMaxHoldAgeMs`,
37
- * the full-scan wall clock plus its safety margin) rather than a second,
38
- * independently-drifting literal. The keep-alive is armed for the SOONEST
39
- * outstanding deadline; when it fires, only tokens that are actually stale
40
- * are released (with a log record naming them), and it re-arms for
41
- * whatever remains. An epoch-anchored version of this — one timer from the
42
- * first hold, clearing every token when it fired — was #2649 review F1: a
43
- * call issued late in a legitimate 300s `lens_diagnostics mode=full` was
44
- * force-released seconds after starting, i.e. #2507's drain reproduced BY
45
- * the fix.
46
- *
47
- * There is deliberately NO session-boundary clear here, unlike
48
- * `clients/lsp/workspace-sweep-hold.ts`. A `session_start` can land mid-turn
49
- * (see `clients/bootstrap.ts`), so clearing holds on a session boundary would
50
- * un-hold a tool call that is still running and reintroduce this exact defect
51
- * for it. The hold is scoped to one call's try/finally, not to a session.
52
- */
53
- import { claimPhaseOncePerSession, logLatency, releaseOncePerSessionPhase, } from "./latency-logger.js";
54
- import { getWorkspaceSweepMaxHoldAgeMs } from "./lsp/workspace-sweep-hold.js";
55
- import { getProcessSingleton } from "./process-singletons.js";
56
- /** The one row per session proving the keep-alive was taken (#2649 F2). */
57
- const EVENT_LOOP_HOLD_ARMED_PHASE = "event_loop_hold_armed";
58
- const EVENT_LOOP_HOLD_FAMILY = "event-loop-hold";
59
- const EVENT_LOOP_HOLD_VERSION = 1;
60
- /**
61
- * Process-scoped on purpose: pi evaluates the pi-lens module graph more than
62
- * once in one process (see `clients/process-singletons.ts`), and what is being
63
- * counted here is a property of the PROCESS's event loop, not of one module
64
- * evaluation. Two copies would arm two timers for one loop.
65
- */
66
- function state() {
67
- return getProcessSingleton(EVENT_LOOP_HOLD_FAMILY, EVENT_LOOP_HOLD_VERSION, () => ({ holds: new Map(), nextHoldId: 1, timer: undefined }));
68
- }
69
- /**
70
- * Upper bound on how long ONE hold — each hold, measured from its OWN
71
- * acquire — may keep this process alive. Derived from `lens_diagnostics
72
- * mode=full`'s own wall-clock ceiling plus the shared
73
- * `SWEEP_IDLE_SAFETY_MARGIN_MS` — the same derivation the workspace-sweep
74
- * hold's max-hold-age failsafe uses, so the two cannot drift apart into a
75
- * relationship where the longest legitimate tool call outlives the bound that
76
- * is supposed to only catch bugs.
77
- */
78
- export function getEventLoopHoldMaxMs() {
79
- return getWorkspaceSweepMaxHoldAgeMs();
80
- }
81
- /**
82
- * Arm the keep-alive for the SOONEST deadline any outstanding hold has — the
83
- * earliest moment a token can become stale — never for a fixed epoch from the
84
- * first hold (#2649 review F1).
85
- *
86
- * Round 1 armed once on 0→1 and cleared every token when it fired, so a call
87
- * that started while an older one was still running inherited whatever was
88
- * left of the FIRST call's bound: a `lens_diagnostics mode=full` legitimately
89
- * running to its 300s ceiling force-released a healthy `lsp_diagnostics`
90
- * issued at t=305s, which is #2507's own drain produced by the fix. The
91
- * reviewer reproduced it in a real child with the bound shortened: both calls
92
- * unsettled, `active=[]`, `EXIT code=0`.
93
- *
94
- * Soonest-deadline, not the youngest survivor's: the youngest would let an
95
- * older survivor overstay its own max age by the whole age gap. Each token is
96
- * released when IT is stale and never before.
97
- */
98
- function armForNextDeadline(current) {
99
- if (current.timer !== undefined)
100
- return;
101
- if (current.holds.size === 0)
102
- return;
103
- const maxMs = getEventLoopHoldMaxMs();
104
- let soonest = Number.POSITIVE_INFINITY;
105
- for (const entry of current.holds.values()) {
106
- soonest = Math.min(soonest, entry.acquiredAt + maxMs);
107
- }
108
- // A past-due deadline is left negative on purpose: Node clamps any delay
109
- // below 1ms to 1ms, so it fires on a later turn of the loop either way, and
110
- // a hand-written floor here would be a guard naming a recurrence that
111
- // cannot happen (#2649 verify F4 — probed: 5 re-arms at delay -5000
112
- // completed in 5ms, and no test reds without the floor).
113
- const delayMs = soonest - Date.now();
114
- // NOT `unref()`'d — referencing the loop is this timer's entire job. It is
115
- // also the failsafe: when it fires, whatever is stale is over either way.
116
- current.timer = setTimeout(() => reapStaleHolds(), delayMs);
117
- }
118
- function disarmIfIdle(current) {
119
- if (current.holds.size > 0)
120
- return;
121
- if (current.timer === undefined)
122
- return;
123
- clearTimeout(current.timer);
124
- current.timer = undefined;
125
- }
126
- /**
127
- * Release every hold that has outlived {@link getEventLoopHoldMaxMs} ON ITS
128
- * OWN CLOCK, log what was released, and re-arm for whatever is still
129
- * outstanding. Same shape as `clients/lsp/workspace-sweep-hold.ts`'s
130
- * `reapStaleHolds` — deliberately a second, independent implementation rather
131
- * than a shared ledger (that consolidation is tracked separately).
132
- */
133
- function reapStaleHolds() {
134
- const current = state();
135
- current.timer = undefined;
136
- try {
137
- const maxMs = getEventLoopHoldMaxMs();
138
- const now = Date.now();
139
- const released = [];
140
- for (const [holdId, entry] of current.holds) {
141
- if (now - entry.acquiredAt <= maxMs)
142
- continue;
143
- current.holds.delete(holdId);
144
- released.push(entry);
145
- }
146
- if (released.length > 0) {
147
- recordForceReleased(released, current.holds.size, maxMs, now);
148
- }
149
- }
150
- finally {
151
- // A survivor is held by nothing until this re-arms — the drain — and
152
- // forever if it never does — the leak. In a `finally` because this runs
153
- // inside a timer callback, where anything that escapes is an uncaught
154
- // exception, and because the round-2 code put the log between the reap
155
- // and the re-arm: a throwing sink stranded the survivor (#2649 verify
156
- // F3). The map is already consistent by here — entries are deleted
157
- // before anything is logged.
158
- armForNextDeadline(current);
159
- }
160
- }
161
- /**
162
- * The force-release record, and its own absorption. Telemetry may not break
163
- * the guard it observes — the house rule spelled at
164
- * `clients/runtime-tool-call.ts`'s blocked-attribution cleanup: a guard that
165
- * fails because its telemetry broke is worse than no guard. Nothing here has
166
- * a fallback sink to escalate to; the keep-alive's correctness does not
167
- * depend on the row being written.
168
- */
169
- function recordForceReleased(released, stillHeld, maxMs, now) {
170
- try {
171
- const oldestAcquiredAt = Math.min(...released.map((entry) => entry.acquiredAt));
172
- logLatency({
173
- type: "phase",
174
- phase: "event_loop_hold_force_released",
175
- filePath: "",
176
- durationMs: now - oldestAcquiredAt,
177
- metadata: {
178
- maxHoldMs: maxMs,
179
- releasedHolds: released.length,
180
- stillHeld,
181
- labels: [...new Set(released.map((entry) => entry.label))].slice(0, 8),
182
- },
183
- });
184
- }
185
- catch {
186
- // see the doc comment — a broken sink must not reach the reap path
187
- }
188
- }
189
- /**
190
- * ONE row per session saying the keep-alive was actually taken (#2649 review
191
- * F2). Without it the only record this module ever writes is the failsafe, so
192
- * a silent log cannot distinguish "working as designed" from "never wired at
193
- * all" — the #2526 gap shape. Claimed through the logger's own
194
- * once-per-session mechanism rather than a private latch, so the "one row per
195
- * session" a reader counts against is the same property `config_resolved`
196
- * has.
197
- */
198
- function recordFirstArm(entry, maxMs) {
199
- try {
200
- if (!claimPhaseOncePerSession(EVENT_LOOP_HOLD_ARMED_PHASE, "process")) {
201
- return;
202
- }
203
- logLatency({
204
- type: "phase",
205
- phase: EVENT_LOOP_HOLD_ARMED_PHASE,
206
- filePath: "",
207
- durationMs: 0,
208
- metadata: { label: entry.label, maxHoldMs: maxMs },
209
- });
210
- }
211
- catch {
212
- // This runs on the ACQUIRE path, and `normalizeToolDefinition` takes the
213
- // hold outside its own try — so a throw here rejected the tool call with
214
- // the sink's error instead of returning the tool's result (#2649 verify
215
- // F3). Same house rule as `recordForceReleased` above: the hold is
216
- // already taken and armed by this point, so absorbing the throw loses a
217
- // log row and nothing else.
218
- }
219
- }
220
- /**
221
- * Take one hold for the lifetime of a piece of in-flight work, and return its
222
- * release. Callers MUST release from a `finally` block: a throw, a rejection
223
- * or an abort has to release exactly like a normal return, or the hold leaks
224
- * and the process stops being able to exit.
225
- *
226
- * The release is identity-guarded and idempotent — calling it twice, or after
227
- * the max-age failsafe already force-released it, is a no-op and never
228
- * disarms another caller's hold.
229
- */
230
- export function acquireEventLoopHold(label) {
231
- const current = state();
232
- const holdId = current.nextHoldId++;
233
- const entry = { acquiredAt: Date.now(), label };
234
- current.holds.set(holdId, entry);
235
- const wasArmed = current.timer !== undefined;
236
- armForNextDeadline(current);
237
- if (!wasArmed)
238
- recordFirstArm(entry, getEventLoopHoldMaxMs());
239
- return () => {
240
- const now = state();
241
- if (!now.holds.delete(holdId))
242
- return;
243
- disarmIfIdle(now);
244
- };
245
- }
246
- /** Test-only: how many holds are outstanding right now. */
247
- export function _eventLoopHoldCountForTests() {
248
- return state().holds.size;
249
- }
250
- /**
251
- * Test-only: the keep-alive handle's own state. `hasRef` is the property the
252
- * whole fix rests on — a handle that is armed but unref'd holds nothing — so
253
- * it is read from the live `Timeout` (`hasRef()`), not asserted from the
254
- * source text.
255
- */
256
- export function _eventLoopKeepAliveForTests() {
257
- const timer = state().timer;
258
- return {
259
- armed: timer !== undefined,
260
- hasRef: timer?.hasRef?.() === true,
261
- };
262
- }
263
- /** Test-only: drop every hold and disarm, between tests. */
264
- export function _resetEventLoopHoldForTests() {
265
- // This module's own phase only — never a blanket clear of a structure other
266
- // producers claim in (`releaseOncePerSessionPhase`'s doc comment).
267
- releaseOncePerSessionPhase(EVENT_LOOP_HOLD_ARMED_PHASE);
268
- const current = state();
269
- current.holds.clear();
270
- if (current.timer !== undefined)
271
- clearTimeout(current.timer);
272
- current.timer = undefined;
273
- current.nextHoldId = 1;
274
- }
@@ -1,250 +0,0 @@
1
- /**
2
- * Production event-loop occupancy monitor (#192 Phase 2).
3
- *
4
- * pi-lens runs on pi's TUI event loop; a long synchronous block freezes
5
- * keystrokes. Our telemetry historically logged phase *durations*, which can't
6
- * distinguish a TUI-freezing synchronous burst from harmless async/subprocess
7
- * time — that blind spot let a ~1.5s enumeration freeze through (#188/#191).
8
- *
9
- * This wraps Node's native `perf_hooks.monitorEventLoopDelay()` — a histogram
10
- * of how late the loop services its own timer, i.e. how long it was blocked —
11
- * with **no per-event JS overhead**. `max` ≈ the worst synchronous block since
12
- * the last reset.
13
- *
14
- * ## System-stall contamination (#1122 / #1123)
15
- *
16
- * `monitorEventLoopDelay` measures timer lag with the monotonic clock
17
- * (`uv_hrtime`, backed by `QueryPerformanceCounter` on Windows). When the whole
18
- * process is frozen or descheduled — machine sleep / Modern Standby, or paging
19
- * thrash under commit-charge exhaustion — its next timer fires late by the
20
- * *entire* wall-clock gap, and the histogram records that gap as a "block".
21
- * Two distinct system stalls were confirmed against the Windows System event
22
- * log: (1) a 290,179 ms block that lined up exactly with a 14:33:05Z→14:37:55Z
23
- * Modern Standby window (Kernel-Power 506/507), reported byte-identical by two
24
- * independent pids because the HDR histogram quantizes ~290 s into one bucket;
25
- * (2) a later silent host exit with zero sleep events but twelve
26
- * Resource-Exhaustion-Detector (id 2004) events at 97% commit charge — the
27
- * process was paging, not sleeping. Both are machine artifacts, not pi-lens
28
- * work; latency.log also held multi-*hour* "blocks" that can only be overnight
29
- * sleep.
30
- *
31
- * Comparing a wall clock to a monotonic clock does NOT catch these: on Windows
32
- * both advance across Modern Standby (the histogram's monotonic delta already
33
- * equalled the wall gap). The reliable discriminator is **CPU consumption**: a
34
- * genuine synchronous block of D ms burns ≈ D ms of main-thread CPU, so the
35
- * window that contains it must have consumed at least ~D ms of CPU. A frozen or
36
- * thrashing process consumes ~0 CPU across the gap, so when the worst block
37
- * exceeds all the CPU the window could account for, it was a stall, not work.
38
- * We window per turn (so the CPU accounting is bounded and each block is
39
- * attributable to its turn) and tag system-stall-suspected samples instead of
40
- * letting them poison the "worst real block" high-water.
41
- */
42
- import { logExtension } from "./extension-log.js";
43
- import { monitorEventLoopDelay } from "node:perf_hooks";
44
- const NS_PER_MS = 1e6;
45
- const US_PER_MS = 1e3;
46
- let histogram;
47
- let monitorUnavailable = false;
48
- // Per-window (per-turn) baselines for CPU-vs-wall accounting. Captured when the
49
- // monitor starts and re-captured on every reset, so each window's CPU budget is
50
- // measured against exactly the histogram window it will be compared to.
51
- let windowStartWallMs = 0;
52
- let windowStartCpuMs = 0;
53
- const cpuTotalMs = () => {
54
- const c = process.cpuUsage();
55
- return (c.user + c.system) / US_PER_MS;
56
- };
57
- /**
58
- * Start the monitor (idempotent). Call once, as early as possible, so startup
59
- * blocks are captured. Cheap — the sampling is native; nothing runs per event.
60
- *
61
- * Purely observational: if the runtime doesn't implement
62
- * `perf_hooks.monitorEventLoopDelay` (e.g. Bun < 1.3, which throws
63
- * `ERR_NOT_IMPLEMENTED` on the call), we degrade to "no stats" rather than let
64
- * the throw abort extension load. `getEventLoopStats()` already tolerates an
65
- * absent histogram, so every caller keeps working without telemetry.
66
- */
67
- export function startEventLoopMonitor(resolutionMs = 20) {
68
- if (histogram || monitorUnavailable)
69
- return;
70
- try {
71
- const h = monitorEventLoopDelay({ resolution: resolutionMs });
72
- h.enable();
73
- histogram = h;
74
- windowStartWallMs = Date.now();
75
- windowStartCpuMs = cpuTotalMs();
76
- }
77
- catch (err) {
78
- monitorUnavailable = true;
79
- logExtension({
80
- subsystem: "event-loop-monitor",
81
- message: `event-loop occupancy telemetry disabled (runtime lacks monitorEventLoopDelay): ${err?.message ?? String(err)}`,
82
- });
83
- }
84
- }
85
- /**
86
- * Below this, a block is not classified at all (`below-floor`). #1980 mined
87
- * the 5 s+ tier; 1 s is a deliberately conservative floor that still covers
88
- * every block that tier cares about while keeping sub-second jitter — where
89
- * measurement slop rivals the signal — out of the verdict.
90
- */
91
- const STALL_CLASSIFY_FLOOR_MS = 1000;
92
- /**
93
- * Slack allowed to the CPU budget before a block counts as unaccounted.
94
- * `process.cpuUsage()` and the histogram are sampled at slightly different
95
- * instants and the histogram quantizes, so a block whose CPU coverage is
96
- * within this much of exact is called `cpu-accounted`, not a stall.
97
- */
98
- const STALL_CLASSIFY_SLOP_MS = 250;
99
- /**
100
- * Split a block into compute-vs-stall from the CPU it could possibly have
101
- * burned (#1980). Pure, so the discrimination is testable without the native
102
- * histogram or a real machine stall — the same reason
103
- * {@link isSuspendSuspectedBlock} is pure.
104
- *
105
- * ## Why this is sound in exactly one direction
106
- *
107
- * `windowCpuMs` is the CPU the WHOLE process consumed across the WHOLE window
108
- * — every thread, every phase, not just this block. So it is an UPPER BOUND on
109
- * the CPU this one block could have burned. A synchronous compute block of D ms
110
- * needs ≈ D ms of main-thread CPU. Therefore:
111
- *
112
- * - `windowCpuMs + slop < maxMs` PROVES the block was not compute. Even if the
113
- * block had been the only thing running, there was not enough CPU in the
114
- * whole window to cover it. This is the `non-cpu-stall` verdict and it is a
115
- * real inference, not a heuristic.
116
- * - The converse proves nothing. A window can burn 30 s of CPU in other phases
117
- * and still contain a 5 s I/O park. That is why the label is
118
- * `cpu-accounted` ("the budget covers it") rather than "compute": it reports
119
- * the absence of proof, not the presence of compute.
120
- *
121
- * The existing 20 s suspend verdict is not re-derived here; this delegates to
122
- * {@link isSuspendSuspectedBlock} so there is one definition of a suspend, and
123
- * `system-stall` is checked BEFORE `non-cpu-stall` because a suspend is the
124
- * strictly more specific case of the same evidence.
125
- *
126
- * ## Known ambiguity, carried forward not silenced
127
- *
128
- * `isSuspendSuspectedBlock`'s own doc records that a >20 s synchronous syscall
129
- * stall is CPU-indistinguishable from a suspend. Nothing here fixes that. What
130
- * this adds is the tier BELOW that floor: a 5-20 s non-CPU block, which used
131
- * to read as ordinary compute and now reads as `non-cpu-stall` with the
132
- * `inFlightPhase` attribution beside it.
133
- */
134
- export function classifyLoopBlock(maxMs, windowCpuMs, options = {}) {
135
- const { floorMs = STALL_CLASSIFY_FLOOR_MS, slopMs = STALL_CLASSIFY_SLOP_MS, suspendFloorMs, suspendSlopMs, } = options;
136
- const cpuCoverageRatio = maxMs > 0 ? Math.round((windowCpuMs / maxMs) * 100) / 100 : undefined;
137
- if (maxMs < floorMs)
138
- return { stallClass: "below-floor", cpuCoverageRatio };
139
- if (isSuspendSuspectedBlock(maxMs, windowCpuMs, suspendFloorMs, suspendSlopMs))
140
- return { stallClass: "system-stall", cpuCoverageRatio };
141
- if (windowCpuMs + slopMs < maxMs)
142
- return { stallClass: "non-cpu-stall", cpuCoverageRatio };
143
- return { stallClass: "cpu-accounted", cpuCoverageRatio };
144
- }
145
- const safeMs = (ns) => Number.isFinite(ns) ? Math.round((ns / NS_PER_MS) * 10) / 10 : 0;
146
- /**
147
- * Classify a worst-block sample as genuine CPU work or a suspend/freeze
148
- * artifact. Pure so the discrimination is testable without the (vitest-flaky)
149
- * native histogram or a real machine sleep.
150
- *
151
- * A block is system-stall-suspected only when it is both (a) larger than any
152
- * plausible synchronous pi-lens stall (`floorMs`, default 20 s — the real tier
153
- * observed in latency.log tops out ~15 s) and (b) unaccounted for by the
154
- * window's CPU budget (`windowCpuMs + slopMs < maxMs`). The floor keeps a real
155
- * multi-second I/O-bound block (low CPU, but genuine) from being mislabeled,
156
- * while a frozen or paging process — ~0 CPU across a minutes-to-hours gap —
157
- * always trips. Sub-floor blocks are never auto-tagged, but the logged
158
- * `windowCpuMs`/`windowWallMs` still expose the CPU-vs-wall ratio so a reviewer
159
- * can spot a shorter paging stall by hand.
160
- *
161
- * KNOWN AMBIGUITY (honest, not fully resolvable from CPU alone): a genuine
162
- * pi-lens block that is BLOCKED IN A SYSCALL for >20 s — e.g. a `readdirSync` /
163
- * `statSync` stalled on a OneDrive/cloud-backed path fetching a dehydrated file,
164
- * or an antivirus-throttled read — also consumes ~0 CPU while wall time
165
- * advances, so it is CPU-indistinguishable from a suspend and WILL be tagged
166
- * `suspectSystemStall` and excluded from the health high-waters. That is the
167
- * conservative choice (a >20 s synchronous FS stall is itself a P0-worthy bug we
168
- * do NOT want silently counted as normal), and it is not silenced: such a sample
169
- * still re-logs every turn with its `lastPhase` attribution, which is the
170
- * forensic breadcrumb for exactly this class. Sharper corroboration (a magnitude
171
- * ceiling, a `maxMs`-vs-`windowWallMs` ratio) is tracked as a follow-up note on
172
- * #1123, not decided here.
173
- */
174
- export function isSuspendSuspectedBlock(maxMs, windowCpuMs, floorMs = 20000, slopMs = 1000) {
175
- if (maxMs < floorMs)
176
- return false;
177
- return windowCpuMs + slopMs < maxMs;
178
- }
179
- /** Current occupancy stats, or undefined if the monitor was never started. */
180
- export function getEventLoopStats() {
181
- if (!histogram)
182
- return undefined;
183
- const maxMs = safeMs(histogram.max);
184
- const windowWallMs = Math.max(0, Date.now() - windowStartWallMs);
185
- const windowCpuMs = Math.max(0, cpuTotalMs() - windowStartCpuMs);
186
- // One classification pass feeds both fields, so `suspectSystemStall` and
187
- // `stallClass` can never disagree about the same sample (#1980).
188
- const classification = classifyLoopBlock(maxMs, windowCpuMs);
189
- return {
190
- maxMs,
191
- p99Ms: safeMs(histogram.percentile(99)),
192
- meanMs: safeMs(histogram.mean),
193
- windowWallMs: Math.round(windowWallMs),
194
- windowCpuMs: Math.round(windowCpuMs),
195
- suspectSystemStall: classification.stallClass === "system-stall",
196
- stallClass: classification.stallClass,
197
- cpuCoverageRatio: classification.cpuCoverageRatio,
198
- };
199
- }
200
- /**
201
- * Reset the histogram and re-baseline the CPU/wall window — called at turn
202
- * boundaries so each window's worst block is attributable to that turn and its
203
- * CPU budget is measured over the same span (#192 intent, wired in #1122).
204
- */
205
- export function resetEventLoopMonitor() {
206
- histogram?.reset();
207
- windowStartWallMs = Date.now();
208
- windowStartCpuMs = cpuTotalMs();
209
- }
210
- /**
211
- * Decide whether THIS block beats the session's running high-water. Pure so
212
- * the threshold logic is testable without the (vitest-flaky) native
213
- * histogram. Requires `maxMs > lastLoggedMs + deltaMs` above a floor
214
- * (`minMs`) so noise near the current max doesn't keep re-triggering the
215
- * high-water bookkeeping.
216
- *
217
- * NOTE (#1723): this is no longer the logging gate — see
218
- * `shouldLogLoopBlock` for that. This function now answers a narrower
219
- * question ("is this a new session worst?", used for the `worstSoFar`
220
- * metadata flag and for deciding whether to advance the high-water), because
221
- * gating the LOG on it hid every sub-maximum block after a session's first
222
- * large one, which made loop_block-vs-pull-timeout correlation undecidable.
223
- */
224
- export function shouldLogWorstBlock(maxMs, lastLoggedMs, minMs = 60, deltaMs = 25) {
225
- return maxMs >= minMs && maxMs > lastLoggedMs + deltaMs;
226
- }
227
- /**
228
- * Decide whether a block is worth persisting to `latency.log` AT ALL (#1723).
229
- * Every block at or above the floor (`minMs`) qualifies — not only a new
230
- * session worst — because a session's later blocks can be smaller than an
231
- * early spike yet still be exactly the ones that starved an LSP pull
232
- * (#1549/#1713) and are otherwise invisible to the correlation.
233
- *
234
- * Volume is bounded by CALL CADENCE, not by this gate: the `turn_end` caller
235
- * invokes this at most once per turn (the histogram window is reset every
236
- * turn), so the natural cap is one `loop_block` record per turn — a jittery
237
- * session cannot flood the log because there is nowhere for a second sample
238
- * to come from within the same turn.
239
- */
240
- export function shouldLogLoopBlock(maxMs, minMs = 60) {
241
- return maxMs >= minMs;
242
- }
243
- /** Test-only: stop and clear the monitor so cases don't leak into each other. */
244
- export function _stopEventLoopMonitorForTest() {
245
- histogram?.disable();
246
- histogram = undefined;
247
- monitorUnavailable = false;
248
- windowStartWallMs = 0;
249
- windowStartCpuMs = 0;
250
- }