@herbertgao/pi-extensions 2026.10.0 → 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 (769) hide show
  1. package/README.md +16 -12
  2. package/THIRD_PARTY_NOTICES.md +3 -3
  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/.opencode/plugins/index.js +4 -0
  10. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail-frontmatter.cjs +43 -3
  11. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail.mjs +142 -59
  12. package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +21 -21
  13. package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +1 -1
  14. package/node_modules/@dietrichgebert/ponytail/AGENTS.md +21 -21
  15. package/node_modules/@dietrichgebert/ponytail/README.md +52 -242
  16. package/node_modules/@dietrichgebert/ponytail/hooks/claude-codex-hooks.json +3 -3
  17. package/node_modules/@dietrichgebert/ponytail/hooks/copilot-hooks.json +4 -4
  18. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +70 -16
  19. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-config.js +8 -7
  20. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +30 -30
  21. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-map.js +103 -0
  22. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-mode-tracker.js +46 -23
  23. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-runtime.js +39 -7
  24. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-subagent.js +20 -3
  25. package/node_modules/@dietrichgebert/ponytail/hooks/qoder-hooks.json +3 -3
  26. package/node_modules/@dietrichgebert/ponytail/package.json +3 -3
  27. package/node_modules/@dietrichgebert/ponytail/pi-extension/index.js +47 -17
  28. package/node_modules/@dietrichgebert/ponytail/scripts/uninstall.js +21 -7
  29. package/node_modules/@dietrichgebert/ponytail/skills/plugin.json +5 -0
  30. package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +33 -101
  31. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +89 -27
  32. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +13 -12
  33. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +21 -18
  34. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +12 -13
  35. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +96 -52
  36. package/node_modules/@herbertgao/pi-agency/LICENSE +21 -0
  37. package/node_modules/@herbertgao/pi-agency/README.md +40 -0
  38. package/node_modules/@herbertgao/pi-agency/package.json +53 -0
  39. package/node_modules/@herbertgao/pi-agency/src/index.ts +441 -0
  40. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +12 -12
  41. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +30 -6
  42. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +15 -9
  43. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +27 -9
  44. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +4 -1
  45. package/node_modules/@herbertgao/pi-cc-extensions/package.json +2 -2
  46. package/node_modules/@narumitw/pi-caffeinate/package.json +4 -4
  47. package/node_modules/@tifan/pi-mermaid-open/package.json +5 -1
  48. package/node_modules/@tifan/pi-mermaid-open/src/index.ts +26 -9
  49. package/node_modules/@tifan/pi-recap/package.json +1 -1
  50. package/node_modules/@tifan/pi-recap/src/index.ts +104 -20
  51. package/node_modules/@tifan/pi-recap/src/models.ts +46 -4
  52. package/node_modules/pi-antigravity/README.md +23 -2
  53. package/node_modules/pi-antigravity/package.json +5 -3
  54. package/node_modules/pi-antigravity/src/diagnostics/diagnostics.ts +3 -2
  55. package/node_modules/pi-antigravity/src/features/generate-image.ts +72 -0
  56. package/node_modules/pi-antigravity/src/features/google-search.ts +71 -0
  57. package/node_modules/pi-antigravity/src/image/image.ts +86 -47
  58. package/node_modules/pi-antigravity/src/image/native.ts +69 -0
  59. package/node_modules/pi-antigravity/src/index.ts +52 -137
  60. package/node_modules/pi-antigravity/src/search/search.ts +130 -31
  61. package/node_modules/pi-antigravity/src/stream/stream.ts +162 -113
  62. package/node_modules/pi-antigravity/src/types/enums.ts +1 -0
  63. package/node_modules/pi-antigravity/src/types/types.ts +1 -1
  64. package/node_modules/pi-antigravity/src/utils/security.ts +47 -1
  65. package/node_modules/pi-antigravity/src/utils/util.ts +38 -6
  66. package/node_modules/pi-lens/CHANGELOG.md +1064 -0
  67. package/node_modules/pi-lens/README.md +115 -25
  68. package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +6 -2
  69. package/node_modules/pi-lens/dist/chunk-22AVIGXS.js +560 -0
  70. package/node_modules/pi-lens/dist/chunk-27BBHSZC.js +106 -0
  71. package/node_modules/pi-lens/dist/chunk-2BEMIWEW.js +51 -0
  72. package/node_modules/pi-lens/dist/chunk-2EECBNC5.js +89 -0
  73. package/node_modules/pi-lens/dist/chunk-34U7PLGE.js +23 -0
  74. package/node_modules/pi-lens/dist/chunk-3I5QFT3N.js +181 -0
  75. package/node_modules/pi-lens/dist/chunk-3MED75HT.js +37 -0
  76. package/node_modules/pi-lens/dist/chunk-47D2BO4S.js +87 -0
  77. package/node_modules/pi-lens/dist/chunk-4RERDEXR.js +348 -0
  78. package/node_modules/pi-lens/dist/chunk-4W2PLC4J.js +27 -0
  79. package/node_modules/pi-lens/dist/chunk-52H5B5TC.js +202 -0
  80. package/node_modules/pi-lens/dist/chunk-54B42YRX.js +27 -0
  81. package/node_modules/pi-lens/dist/chunk-5RXBNSW2.js +266 -0
  82. package/node_modules/pi-lens/dist/chunk-5THXD6X5.js +201 -0
  83. package/node_modules/pi-lens/dist/chunk-5W3R6LFT.js +24 -0
  84. package/node_modules/pi-lens/dist/chunk-5ZEJHV35.js +341 -0
  85. package/node_modules/pi-lens/dist/chunk-6P62QVEA.js +118 -0
  86. package/node_modules/pi-lens/dist/chunk-6QIUX4EP.js +459 -0
  87. package/node_modules/pi-lens/dist/chunk-6VCD4VKZ.js +78 -0
  88. package/node_modules/pi-lens/dist/chunk-7F72PXY2.js +326 -0
  89. package/node_modules/pi-lens/dist/chunk-7FBF7NPR.js +998 -0
  90. package/node_modules/pi-lens/dist/chunk-7U2IDNXN.js +37 -0
  91. package/node_modules/pi-lens/dist/chunk-ABBOA7UD.js +157 -0
  92. package/node_modules/pi-lens/dist/chunk-AHDW3GPE.js +50 -0
  93. package/node_modules/pi-lens/dist/chunk-AJ3QXTRQ.js +756 -0
  94. package/node_modules/pi-lens/dist/chunk-AJVLWNFN.js +1610 -0
  95. package/node_modules/pi-lens/dist/chunk-AJXODZY6.js +112 -0
  96. package/node_modules/pi-lens/dist/chunk-ARFCXG7S.js +84 -0
  97. package/node_modules/pi-lens/dist/chunk-AS44CFQ4.js +708 -0
  98. package/node_modules/pi-lens/dist/chunk-AWE5TMPO.js +38 -0
  99. package/node_modules/pi-lens/dist/chunk-B3I2UUT4.js +4692 -0
  100. package/node_modules/pi-lens/dist/chunk-BRJKOBZP.js +331 -0
  101. package/node_modules/pi-lens/dist/chunk-BW5KFIQC.js +59 -0
  102. package/node_modules/pi-lens/dist/chunk-C2AUYXQH.js +149 -0
  103. package/node_modules/pi-lens/dist/chunk-CGGAIP7J.js +29 -0
  104. package/node_modules/pi-lens/dist/chunk-D6QS3U6M.js +30 -0
  105. package/node_modules/pi-lens/dist/chunk-DFVMIKMQ.js +349 -0
  106. package/node_modules/pi-lens/dist/chunk-DIULIWKU.js +169 -0
  107. package/node_modules/pi-lens/dist/chunk-DQ2NZ7C4.js +2317 -0
  108. package/node_modules/pi-lens/dist/chunk-E2WFBRHM.js +213 -0
  109. package/node_modules/pi-lens/dist/chunk-E4MAEDPM.js +50 -0
  110. package/node_modules/pi-lens/dist/chunk-EOKRQ3SA.js +30 -0
  111. package/node_modules/pi-lens/dist/chunk-F3AU2TMM.js +2626 -0
  112. package/node_modules/pi-lens/dist/chunk-F3P7VQ7H.js +170 -0
  113. package/node_modules/pi-lens/dist/chunk-FC4RP4I2.js +12 -0
  114. package/node_modules/pi-lens/dist/chunk-FJNKANOS.js +32 -0
  115. package/node_modules/pi-lens/dist/chunk-GUOGVTCQ.js +146 -0
  116. package/node_modules/pi-lens/dist/chunk-GVXA6CCE.js +18 -0
  117. package/node_modules/pi-lens/dist/chunk-HHYAELLJ.js +2334 -0
  118. package/node_modules/pi-lens/dist/chunk-HMFXILPV.js +83 -0
  119. package/node_modules/pi-lens/dist/chunk-HVUZXSWK.js +421 -0
  120. package/node_modules/pi-lens/dist/chunk-HWBZIGMJ.js +62 -0
  121. package/node_modules/pi-lens/dist/chunk-I3R7GKDR.js +17 -0
  122. package/node_modules/pi-lens/dist/chunk-I7SPGOWI.js +55 -0
  123. package/node_modules/pi-lens/dist/chunk-IIXOAGHR.js +38 -0
  124. package/node_modules/pi-lens/dist/chunk-IVP5KAB7.js +2250 -0
  125. package/node_modules/pi-lens/dist/chunk-IXEBJSUE.js +22 -0
  126. package/node_modules/pi-lens/dist/chunk-JOLITGCC.js +27 -0
  127. package/node_modules/pi-lens/dist/chunk-K6VYLB2U.js +145 -0
  128. package/node_modules/pi-lens/dist/chunk-LJDODBBZ.js +78 -0
  129. package/node_modules/pi-lens/dist/chunk-LNAKEO63.js +78 -0
  130. package/node_modules/pi-lens/dist/chunk-LSMJ6KBE.js +4139 -0
  131. package/node_modules/pi-lens/dist/chunk-LW6XKDZQ.js +5565 -0
  132. package/node_modules/pi-lens/dist/chunk-N3YQJI6O.js +899 -0
  133. package/node_modules/pi-lens/dist/chunk-NABLC7W3.js +148 -0
  134. package/node_modules/pi-lens/dist/chunk-NKOUFPQF.js +659 -0
  135. package/node_modules/pi-lens/dist/chunk-NL5GLMFI.js +211 -0
  136. package/node_modules/pi-lens/dist/chunk-NMABWBZN.js +327 -0
  137. package/node_modules/pi-lens/dist/chunk-NTHH2J74.js +27 -0
  138. package/node_modules/pi-lens/dist/chunk-NTUJEGDZ.js +59 -0
  139. package/node_modules/pi-lens/dist/chunk-NXL4FFQQ.js +47 -0
  140. package/node_modules/pi-lens/dist/chunk-NXPS2L6U.js +466 -0
  141. package/node_modules/pi-lens/dist/chunk-O5WILGMI.js +42 -0
  142. package/node_modules/pi-lens/dist/chunk-O6TQT6RI.js +48 -0
  143. package/node_modules/pi-lens/dist/chunk-OAXNDZJ7.js +323 -0
  144. package/node_modules/pi-lens/dist/chunk-ODEEOXPH.js +44 -0
  145. package/node_modules/pi-lens/dist/chunk-OQGFCZJ4.js +4533 -0
  146. package/node_modules/pi-lens/dist/chunk-ORTMY4Q4.js +282 -0
  147. package/node_modules/pi-lens/dist/chunk-OS32RNR2.js +442 -0
  148. package/node_modules/pi-lens/dist/chunk-PAK6IDME.js +189 -0
  149. package/node_modules/pi-lens/dist/chunk-PWFHBTSF.js +406 -0
  150. package/node_modules/pi-lens/dist/chunk-Q5U6FMDI.js +2352 -0
  151. package/node_modules/pi-lens/dist/chunk-QOZXJ4NA.js +3364 -0
  152. package/node_modules/pi-lens/dist/chunk-QYF5S6P6.js +45 -0
  153. package/node_modules/pi-lens/dist/chunk-RIISMHKN.js +36 -0
  154. package/node_modules/pi-lens/dist/chunk-RPD4ZSB7.js +25 -0
  155. package/node_modules/pi-lens/dist/chunk-RPD5K5NC.js +79 -0
  156. package/node_modules/pi-lens/dist/chunk-RUOG5D2C.js +262 -0
  157. package/node_modules/pi-lens/dist/chunk-T4ERT73Y.js +599 -0
  158. package/node_modules/pi-lens/dist/chunk-T6D4Q4AQ.js +54 -0
  159. package/node_modules/pi-lens/dist/chunk-TGPXLY2J.js +391 -0
  160. package/node_modules/pi-lens/dist/chunk-TLGFBM3F.js +12116 -0
  161. package/node_modules/pi-lens/dist/chunk-TO6WL3GM.js +88 -0
  162. package/node_modules/pi-lens/dist/chunk-TT22N74J.js +517 -0
  163. package/node_modules/pi-lens/dist/chunk-TVN5N6GY.js +21216 -0
  164. package/node_modules/pi-lens/dist/chunk-U3VGR4VU.js +308 -0
  165. package/node_modules/pi-lens/dist/chunk-UK3CMEAL.js +1250 -0
  166. package/node_modules/pi-lens/dist/chunk-UOPVJQ4N.js +103 -0
  167. package/node_modules/pi-lens/dist/chunk-UXVNL3D7.js +23 -0
  168. package/node_modules/pi-lens/dist/chunk-UY752QSN.js +45 -0
  169. package/node_modules/pi-lens/dist/chunk-V5PXFSZK.js +188 -0
  170. package/node_modules/pi-lens/dist/chunk-V7R425XG.js +398 -0
  171. package/node_modules/pi-lens/dist/chunk-VCSRSYLF.js +81 -0
  172. package/node_modules/pi-lens/dist/chunk-VD4JQCQC.js +162 -0
  173. package/node_modules/pi-lens/dist/chunk-VDBPVIKD.js +62 -0
  174. package/node_modules/pi-lens/dist/chunk-VHQLPIRJ.js +114 -0
  175. package/node_modules/pi-lens/dist/chunk-VN2AXLEX.js +5414 -0
  176. package/node_modules/pi-lens/dist/chunk-VNMT7C64.js +478 -0
  177. package/node_modules/pi-lens/dist/chunk-WONERJTP.js +309 -0
  178. package/node_modules/pi-lens/dist/chunk-XECLWQZN.js +85 -0
  179. package/node_modules/pi-lens/dist/chunk-XIMYZ3JA.js +27 -0
  180. package/node_modules/pi-lens/dist/chunk-XK4CIILI.js +144 -0
  181. package/node_modules/pi-lens/dist/chunk-Y4T27COV.js +562 -0
  182. package/node_modules/pi-lens/dist/chunk-YGVYKNSN.js +1860 -0
  183. package/node_modules/pi-lens/dist/chunk-YLF3PPT5.js +308 -0
  184. package/node_modules/pi-lens/dist/chunk-YSNFMJKN.js +14 -0
  185. package/node_modules/pi-lens/dist/chunk-Z3CCVDUB.js +76 -0
  186. package/node_modules/pi-lens/dist/chunk-Z54ZSOBZ.js +61 -0
  187. package/node_modules/pi-lens/dist/chunk-ZAWW3AF6.js +97 -0
  188. package/node_modules/pi-lens/dist/chunk-ZMOL6RQC.js +167 -0
  189. package/node_modules/pi-lens/dist/index.js +16456 -8335
  190. package/node_modules/pi-lens/dist/mcp/analyze-cli.js +186 -232
  191. package/node_modules/pi-lens/dist/mcp/cli.js +137 -98
  192. package/node_modules/pi-lens/dist/mcp/server.js +22589 -1573
  193. package/node_modules/pi-lens/dist/mcp/worker.js +97 -38
  194. package/node_modules/pi-lens/dist/probes/installer.js +135 -0
  195. package/node_modules/pi-lens/dist/workers/project-snapshot-persist-worker.js +22 -0
  196. package/node_modules/pi-lens/dist/workers/review-graph-persist-worker.js +15 -0
  197. package/node_modules/pi-lens/docs/agent-guide.md +13 -4
  198. package/node_modules/pi-lens/docs/agent-tools.md +42 -0
  199. package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +3 -2
  200. package/node_modules/pi-lens/docs/configuration.md +20 -1
  201. package/node_modules/pi-lens/docs/environment-variables.md +52 -2
  202. package/node_modules/pi-lens/docs/features.md +8 -4
  203. package/node_modules/pi-lens/docs/globalconfig.md +1 -0
  204. package/node_modules/pi-lens/docs/io-bridge-v2-migration.md +94 -0
  205. package/node_modules/pi-lens/docs/lsp-capability-matrix.md +36 -4
  206. package/node_modules/pi-lens/docs/lsp-idle-eviction.md +124 -0
  207. package/node_modules/pi-lens/docs/mcp.md +21 -5
  208. package/node_modules/pi-lens/docs/merge-queue-rollout.md +77 -0
  209. package/node_modules/pi-lens/docs/pi-lens-fixer.md +156 -88
  210. package/node_modules/pi-lens/docs/pi-lens-investigator.md +74 -26
  211. package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +694 -0
  212. package/node_modules/pi-lens/docs/pi-lens-monitor.md +73 -7
  213. package/node_modules/pi-lens/docs/pi-lens-retro.md +6 -4
  214. package/node_modules/pi-lens/docs/pi-lens-reviewer.md +188 -48
  215. package/node_modules/pi-lens/docs/pi-lens-subagent.md +246 -45
  216. package/node_modules/pi-lens/docs/pi-lens-warden.md +18 -7
  217. package/node_modules/pi-lens/docs/public-api-stability.md +55 -0
  218. package/node_modules/pi-lens/docs/release-qa-baseline.md +84 -17
  219. package/node_modules/pi-lens/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  220. package/node_modules/pi-lens/docs/servercapabilities.md +53 -49
  221. package/node_modules/pi-lens/docs/settings.md +1 -0
  222. package/node_modules/pi-lens/docs/usage.md +5 -1
  223. package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm +0 -0
  224. package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm.json +3 -3
  225. package/node_modules/pi-lens/package.json +18 -6
  226. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  227. package/node_modules/pi-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  228. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +1275 -62
  229. package/node_modules/pi-lens/scripts/download-grammars.js +5 -0
  230. package/node_modules/pi-lens/scripts/grammars.lock.json +6 -1
  231. package/node_modules/pi-lens/scripts/install-selftest.mjs +33 -34
  232. package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +13 -4
  233. package/node_modules/pi-lens/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  234. package/node_modules/pi-typesafe/README.md +1 -1
  235. package/node_modules/pi-typesafe/dist/backends.d.ts +15 -5
  236. package/node_modules/pi-typesafe/dist/backends.js +18 -0
  237. package/node_modules/pi-typesafe/dist/client.d.ts +4 -3
  238. package/node_modules/pi-typesafe/dist/client.js +22 -7
  239. package/node_modules/pi-typesafe/dist/index.d.ts +2 -2
  240. package/node_modules/pi-typesafe/dist/index.js +1 -1
  241. package/node_modules/pi-typesafe/dist/usage.d.ts +14 -4
  242. package/node_modules/pi-typesafe/dist/usage.js +147 -42
  243. package/node_modules/pi-typesafe/package.json +1 -1
  244. package/node_modules/pi-web-access/CHANGELOG.md +48 -0
  245. package/node_modules/pi-web-access/README.md +57 -11
  246. package/node_modules/pi-web-access/brave-rate-limit.ts +8 -2
  247. package/node_modules/pi-web-access/curator-page.ts +5 -1
  248. package/node_modules/pi-web-access/curator-server.ts +2 -0
  249. package/node_modules/pi-web-access/declared-web-links.ts +2 -2
  250. package/node_modules/pi-web-access/degoog.ts +323 -0
  251. package/node_modules/pi-web-access/dist/index.js +3483 -2745
  252. package/node_modules/pi-web-access/dist/mcp-cli.js +27443 -0
  253. package/node_modules/pi-web-access/exa.ts +5 -1
  254. package/node_modules/pi-web-access/extract.ts +41 -3
  255. package/node_modules/pi-web-access/firecrawl.ts +35 -4
  256. package/node_modules/pi-web-access/gemini-search.ts +34 -11
  257. package/node_modules/pi-web-access/gemini-web.ts +14 -9
  258. package/node_modules/pi-web-access/index.ts +153 -1202
  259. package/node_modules/pi-web-access/keenable.ts +221 -0
  260. package/node_modules/pi-web-access/mcp-cli.ts +40 -0
  261. package/node_modules/pi-web-access/mcp-server.ts +81 -0
  262. package/node_modules/pi-web-access/mcp-tool-definitions.ts +117 -0
  263. package/node_modules/pi-web-access/openai-search.ts +34 -1
  264. package/node_modules/pi-web-access/package.json +23 -5
  265. package/node_modules/pi-web-access/perplexity.ts +64 -56
  266. package/node_modules/pi-web-access/tool-arguments.ts +20 -0
  267. package/node_modules/pi-web-access/video-extract.ts +1 -1
  268. package/node_modules/pi-web-access/web-tool-contract.ts +86 -0
  269. package/node_modules/pi-web-access/web-tool-core.ts +1502 -0
  270. package/node_modules/pi-web-access/youtube-extract.ts +2 -5
  271. package/package.json +17 -12
  272. package/node_modules/@dietrichgebert/ponytail/README.es.md +0 -329
  273. package/node_modules/@dietrichgebert/ponytail/README.ko.md +0 -346
  274. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-3model.svg +0 -21
  275. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-agentic.svg +0 -62
  276. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.png +0 -0
  277. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.svg +0 -115
  278. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt-dark.svg +0 -27
  279. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt.svg +0 -27
  280. package/node_modules/@dietrichgebert/ponytail/assets/logo.png +0 -0
  281. package/node_modules/@dietrichgebert/ponytail/assets/retriever-icon.png +0 -0
  282. package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-dark.svg +0 -4
  283. package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-light.svg +0 -4
  284. package/node_modules/@dietrichgebert/ponytail/assets/social-preview.png +0 -0
  285. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-es.png +0 -0
  286. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-ko.png +0 -0
  287. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner.png +0 -0
  288. package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +0 -35
  289. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +0 -1610
  290. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +0 -593
  291. package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +0 -147
  292. package/node_modules/pi-lens/dist/clients/agent-nudge.js +0 -325
  293. package/node_modules/pi-lens/dist/clients/analysed-root.js +0 -1
  294. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +0 -731
  295. package/node_modules/pi-lens/dist/clients/ast-grep-rule-manager.js +0 -146
  296. package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +0 -118
  297. package/node_modules/pi-lens/dist/clients/ast-grep-types.js +0 -10
  298. package/node_modules/pi-lens/dist/clients/ast-grep-yaml-synth.js +0 -154
  299. package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +0 -75
  300. package/node_modules/pi-lens/dist/clients/atomic-write.js +0 -189
  301. package/node_modules/pi-lens/dist/clients/availability-probe-flight.js +0 -12
  302. package/node_modules/pi-lens/dist/clients/bash-file-access.js +0 -1056
  303. package/node_modules/pi-lens/dist/clients/biome-client.js +0 -357
  304. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +0 -837
  305. package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +0 -129
  306. package/node_modules/pi-lens/dist/clients/bootstrap.js +0 -569
  307. package/node_modules/pi-lens/dist/clients/bounded-cache.js +0 -190
  308. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +0 -202
  309. package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +0 -295
  310. package/node_modules/pi-lens/dist/clients/build-identity.js +0 -95
  311. package/node_modules/pi-lens/dist/clients/bundled-resource-health.js +0 -113
  312. package/node_modules/pi-lens/dist/clients/bus-events-logger.js +0 -105
  313. package/node_modules/pi-lens/dist/clients/bus-publish.js +0 -171
  314. package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +0 -190
  315. package/node_modules/pi-lens/dist/clients/cache-manager.js +0 -524
  316. package/node_modules/pi-lens/dist/clients/cache-observability.js +0 -1313
  317. package/node_modules/pi-lens/dist/clients/call-graph.js +0 -852
  318. package/node_modules/pi-lens/dist/clients/cargo-manifest.js +0 -422
  319. package/node_modules/pi-lens/dist/clients/cascade-budget.js +0 -196
  320. package/node_modules/pi-lens/dist/clients/cascade-format.js +0 -315
  321. package/node_modules/pi-lens/dist/clients/cascade-logger.js +0 -31
  322. package/node_modules/pi-lens/dist/clients/cascade-types.js +0 -9
  323. package/node_modules/pi-lens/dist/clients/child-unref.js +0 -124
  324. package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +0 -286
  325. package/node_modules/pi-lens/dist/clients/codebase-model.js +0 -173
  326. package/node_modules/pi-lens/dist/clients/collateral-test-role.js +0 -40
  327. package/node_modules/pi-lens/dist/clients/complexity-client.js +0 -462
  328. package/node_modules/pi-lens/dist/clients/config-core/deny.js +0 -221
  329. package/node_modules/pi-lens/dist/clients/config-core/index.js +0 -50
  330. package/node_modules/pi-lens/dist/clients/config-core/merge.js +0 -357
  331. package/node_modules/pi-lens/dist/clients/config-core/normalize.js +0 -340
  332. package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +0 -248
  333. package/node_modules/pi-lens/dist/clients/config-core/provenance.js +0 -164
  334. package/node_modules/pi-lens/dist/clients/config-core/records.js +0 -218
  335. package/node_modules/pi-lens/dist/clients/config-core/resolve.js +0 -125
  336. package/node_modules/pi-lens/dist/clients/config-core/safe-object.js +0 -78
  337. package/node_modules/pi-lens/dist/clients/config-core/schema.js +0 -165
  338. package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +0 -285
  339. package/node_modules/pi-lens/dist/clients/config-locations.js +0 -388
  340. package/node_modules/pi-lens/dist/clients/config-resolve.js +0 -798
  341. package/node_modules/pi-lens/dist/clients/config-schema.js +0 -251
  342. package/node_modules/pi-lens/dist/clients/config-warn.js +0 -407
  343. package/node_modules/pi-lens/dist/clients/console-guard-install.js +0 -26
  344. package/node_modules/pi-lens/dist/clients/cooperative-budget.js +0 -42
  345. package/node_modules/pi-lens/dist/clients/dead-code-client.js +0 -510
  346. package/node_modules/pi-lens/dist/clients/dead-code-logger.js +0 -30
  347. package/node_modules/pi-lens/dist/clients/deadline-utils.js +0 -280
  348. package/node_modules/pi-lens/dist/clients/debug-handles.js +0 -211
  349. package/node_modules/pi-lens/dist/clients/debug-heap.js +0 -174
  350. package/node_modules/pi-lens/dist/clients/deferred-lsp-work.js +0 -106
  351. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +0 -426
  352. package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +0 -169
  353. package/node_modules/pi-lens/dist/clients/dependency-checker.js +0 -885
  354. package/node_modules/pi-lens/dist/clients/deps/ast-grep-napi.js +0 -22
  355. package/node_modules/pi-lens/dist/clients/deps/js-yaml.js +0 -9
  356. package/node_modules/pi-lens/dist/clients/deps/minimatch.js +0 -4
  357. package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +0 -14
  358. package/node_modules/pi-lens/dist/clients/deps/typebox.js +0 -14
  359. package/node_modules/pi-lens/dist/clients/deps/vscode-jsonrpc.js +0 -1
  360. package/node_modules/pi-lens/dist/clients/deps/web-tree-sitter.js +0 -24
  361. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +0 -630
  362. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +0 -305
  363. package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +0 -73
  364. package/node_modules/pi-lens/dist/clients/diagnostic-tracker.js +0 -105
  365. package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +0 -230
  366. package/node_modules/pi-lens/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  367. package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  368. package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -35
  369. package/node_modules/pi-lens/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  370. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +0 -1269
  371. package/node_modules/pi-lens/dist/clients/dispatch/fact-provider-types.js +0 -1
  372. package/node_modules/pi-lens/dist/clients/dispatch/fact-rule-runner.js +0 -17
  373. package/node_modules/pi-lens/dist/clients/dispatch/fact-runner.js +0 -30
  374. package/node_modules/pi-lens/dist/clients/dispatch/fact-scheduler.js +0 -68
  375. package/node_modules/pi-lens/dist/clients/dispatch/fact-store.js +0 -377
  376. package/node_modules/pi-lens/dist/clients/dispatch/facts/comment-facts.js +0 -22
  377. package/node_modules/pi-lens/dist/clients/dispatch/facts/file-content.js +0 -19
  378. package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +0 -348
  379. package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +0 -204
  380. package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  381. package/node_modules/pi-lens/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  382. package/node_modules/pi-lens/dist/clients/dispatch/finding-policy.js +0 -339
  383. package/node_modules/pi-lens/dist/clients/dispatch/indent-detect.js +0 -417
  384. package/node_modules/pi-lens/dist/clients/dispatch/inline-suppressions.js +0 -89
  385. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +0 -2377
  386. package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +0 -11
  387. package/node_modules/pi-lens/dist/clients/dispatch/pending-runner-findings.js +0 -87
  388. package/node_modules/pi-lens/dist/clients/dispatch/plan.js +0 -278
  389. package/node_modules/pi-lens/dist/clients/dispatch/priorities.js +0 -20
  390. package/node_modules/pi-lens/dist/clients/dispatch/rule-id-normalize.js +0 -50
  391. package/node_modules/pi-lens/dist/clients/dispatch/rule-ignores.js +0 -69
  392. package/node_modules/pi-lens/dist/clients/dispatch/rule-policy.js +0 -135
  393. package/node_modules/pi-lens/dist/clients/dispatch/rules/async-noise.js +0 -40
  394. package/node_modules/pi-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  395. package/node_modules/pi-lens/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  396. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  397. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  398. package/node_modules/pi-lens/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  399. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-complexity.js +0 -72
  400. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  401. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  402. package/node_modules/pi-lens/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  403. package/node_modules/pi-lens/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  404. package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  405. package/node_modules/pi-lens/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  406. package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  407. package/node_modules/pi-lens/dist/clients/dispatch/runner-context.js +0 -52
  408. package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +0 -111
  409. package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  410. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +0 -296
  411. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +0 -219
  412. package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +0 -82
  413. package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +0 -416
  414. package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  415. package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +0 -176
  416. package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  417. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +0 -195
  418. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +0 -137
  419. package/node_modules/pi-lens/dist/clients/dispatch/runners/fact-rules.js +0 -29
  420. package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +0 -69
  421. package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +0 -167
  422. package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +0 -104
  423. package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  424. package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +0 -91
  425. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +0 -171
  426. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +0 -940
  427. package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +0 -117
  428. package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +0 -108
  429. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +0 -99
  430. package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +0 -110
  431. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +0 -379
  432. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +0 -167
  433. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +0 -102
  434. package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +0 -414
  435. package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +0 -85
  436. package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +0 -120
  437. package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  438. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  439. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +0 -169
  440. package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +0 -99
  441. package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +0 -88
  442. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  443. package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +0 -173
  444. package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +0 -102
  445. package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +0 -128
  446. package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +0 -259
  447. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  448. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +0 -166
  449. package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +0 -163
  450. package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +0 -174
  451. package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +0 -168
  452. package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +0 -125
  453. package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  454. package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +0 -253
  455. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  456. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  457. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  458. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  459. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  460. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  461. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  462. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  463. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -15
  464. package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +0 -128
  465. package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  466. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +0 -95
  467. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +0 -79
  468. package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +0 -79
  469. package/node_modules/pi-lens/dist/clients/dispatch/tool-profile.js +0 -30
  470. package/node_modules/pi-lens/dist/clients/dispatch/types.js +0 -21
  471. package/node_modules/pi-lens/dist/clients/dispatch/utils/format-utils.js +0 -45
  472. package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  473. package/node_modules/pi-lens/dist/clients/disposition-logger.js +0 -32
  474. package/node_modules/pi-lens/dist/clients/disposition-publish.js +0 -124
  475. package/node_modules/pi-lens/dist/clients/durable-store.js +0 -97
  476. package/node_modules/pi-lens/dist/clients/effective-config.js +0 -415
  477. package/node_modules/pi-lens/dist/clients/env-utils.js +0 -83
  478. package/node_modules/pi-lens/dist/clients/error-class.js +0 -23
  479. package/node_modules/pi-lens/dist/clients/eval-timestamp.js +0 -17
  480. package/node_modules/pi-lens/dist/clients/event-loop-hold.js +0 -274
  481. package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +0 -250
  482. package/node_modules/pi-lens/dist/clients/extension-log.js +0 -504
  483. package/node_modules/pi-lens/dist/clients/extension-mode.js +0 -73
  484. package/node_modules/pi-lens/dist/clients/feature-hints.js +0 -103
  485. package/node_modules/pi-lens/dist/clients/file-kinds.js +0 -412
  486. package/node_modules/pi-lens/dist/clients/file-role.js +0 -134
  487. package/node_modules/pi-lens/dist/clients/file-time.js +0 -160
  488. package/node_modules/pi-lens/dist/clients/file-utils.js +0 -1032
  489. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +0 -494
  490. package/node_modules/pi-lens/dist/clients/finding-identity.js +0 -88
  491. package/node_modules/pi-lens/dist/clients/fix-worklog.js +0 -103
  492. package/node_modules/pi-lens/dist/clients/format-events-publish.js +0 -343
  493. package/node_modules/pi-lens/dist/clients/format-service.js +0 -222
  494. package/node_modules/pi-lens/dist/clients/formatters-lazy.js +0 -9
  495. package/node_modules/pi-lens/dist/clients/formatters.js +0 -2032
  496. package/node_modules/pi-lens/dist/clients/freshness-cadence.js +0 -17
  497. package/node_modules/pi-lens/dist/clients/freshness.js +0 -38
  498. package/node_modules/pi-lens/dist/clients/generated-artifacts.js +0 -394
  499. package/node_modules/pi-lens/dist/clients/generation-guard.js +0 -215
  500. package/node_modules/pi-lens/dist/clients/git-guard.js +0 -1136
  501. package/node_modules/pi-lens/dist/clients/git-tracked-ignore.js +0 -243
  502. package/node_modules/pi-lens/dist/clients/gitleaks-client.js +0 -509
  503. package/node_modules/pi-lens/dist/clients/go-client.js +0 -104
  504. package/node_modules/pi-lens/dist/clients/govulncheck-client.js +0 -605
  505. package/node_modules/pi-lens/dist/clients/gradle-ktfmt-style.js +0 -348
  506. package/node_modules/pi-lens/dist/clients/grammar-source.js +0 -465
  507. package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +0 -135
  508. package/node_modules/pi-lens/dist/clients/hashline-anchor.js +0 -424
  509. package/node_modules/pi-lens/dist/clients/hook-budgets.js +0 -76
  510. package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +0 -140
  511. package/node_modules/pi-lens/dist/clients/host-ports.js +0 -39
  512. package/node_modules/pi-lens/dist/clients/indent-retarget.js +0 -154
  513. package/node_modules/pi-lens/dist/clients/inline-blocker-dispositions.js +0 -186
  514. package/node_modules/pi-lens/dist/clients/install-diagnostics.js +0 -156
  515. package/node_modules/pi-lens/dist/clients/installer/index.js +0 -5416
  516. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  517. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +0 -783
  518. package/node_modules/pi-lens/dist/clients/instance-reaper-state.js +0 -7
  519. package/node_modules/pi-lens/dist/clients/instance-reaper.js +0 -1137
  520. package/node_modules/pi-lens/dist/clients/instance-registry-lock.js +0 -145
  521. package/node_modules/pi-lens/dist/clients/instance-registry.js +0 -773
  522. package/node_modules/pi-lens/dist/clients/jscpd-client.js +0 -378
  523. package/node_modules/pi-lens/dist/clients/json-cache-read.js +0 -65
  524. package/node_modules/pi-lens/dist/clients/knip-client.js +0 -788
  525. package/node_modules/pi-lens/dist/clients/language-policy.js +0 -252
  526. package/node_modules/pi-lens/dist/clients/language-profile.js +0 -361
  527. package/node_modules/pi-lens/dist/clients/language-registry.js +0 -603
  528. package/node_modules/pi-lens/dist/clients/latency-logger.js +0 -727
  529. package/node_modules/pi-lens/dist/clients/lazy-import.js +0 -21
  530. package/node_modules/pi-lens/dist/clients/ledger-bounds.js +0 -54
  531. package/node_modules/pi-lens/dist/clients/lens-config.js +0 -404
  532. package/node_modules/pi-lens/dist/clients/lens-engine.js +0 -358
  533. package/node_modules/pi-lens/dist/clients/lens-events.js +0 -125
  534. package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +0 -467
  535. package/node_modules/pi-lens/dist/clients/lens-map.js +0 -1156
  536. package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +0 -74
  537. package/node_modules/pi-lens/dist/clients/log-cleanup.js +0 -222
  538. package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +0 -178
  539. package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +0 -421
  540. package/node_modules/pi-lens/dist/clients/lsp/client.js +0 -4593
  541. package/node_modules/pi-lens/dist/clients/lsp/config.js +0 -691
  542. package/node_modules/pi-lens/dist/clients/lsp/content-limits.js +0 -41
  543. package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +0 -225
  544. package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +0 -467
  545. package/node_modules/pi-lens/dist/clients/lsp/edits.js +0 -1219
  546. package/node_modules/pi-lens/dist/clients/lsp/index.js +0 -8305
  547. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +0 -216
  548. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +0 -298
  549. package/node_modules/pi-lens/dist/clients/lsp/language.js +0 -63
  550. package/node_modules/pi-lens/dist/clients/lsp/launch.js +0 -746
  551. package/node_modules/pi-lens/dist/clients/lsp/lombok.js +0 -158
  552. package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +0 -5
  553. package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +0 -251
  554. package/node_modules/pi-lens/dist/clients/lsp/position-encoding.js +0 -61
  555. package/node_modules/pi-lens/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  556. package/node_modules/pi-lens/dist/clients/lsp/server.js +0 -3290
  557. package/node_modules/pi-lens/dist/clients/lsp/session-roots.js +0 -192
  558. package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +0 -17
  559. package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -56
  560. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +0 -332
  561. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  562. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +0 -85
  563. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/index.js +0 -10
  564. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +0 -392
  565. package/node_modules/pi-lens/dist/clients/lsp/watch-queue.js +0 -61
  566. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  567. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  568. package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  569. package/node_modules/pi-lens/dist/clients/lsp-budget.js +0 -186
  570. package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +0 -110
  571. package/node_modules/pi-lens/dist/clients/lsp-lazy.js +0 -9
  572. package/node_modules/pi-lens/dist/clients/lsp-mutation.js +0 -396
  573. package/node_modules/pi-lens/dist/clients/lsp-status.js +0 -59
  574. package/node_modules/pi-lens/dist/clients/map-with-concurrency.js +0 -40
  575. package/node_modules/pi-lens/dist/clients/mcp/analyze.js +0 -420
  576. package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +0 -31
  577. package/node_modules/pi-lens/dist/clients/mcp/ipc.js +0 -523
  578. package/node_modules/pi-lens/dist/clients/mcp/review.js +0 -197
  579. package/node_modules/pi-lens/dist/clients/mcp/session.js +0 -412
  580. package/node_modules/pi-lens/dist/clients/memory-sampler.js +0 -208
  581. package/node_modules/pi-lens/dist/clients/message-end-attribution.js +0 -30
  582. package/node_modules/pi-lens/dist/clients/metrics-client.js +0 -107
  583. package/node_modules/pi-lens/dist/clients/metrics-history.js +0 -327
  584. package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +0 -263
  585. package/node_modules/pi-lens/dist/clients/model-provider.js +0 -53
  586. package/node_modules/pi-lens/dist/clients/module-report-lsp.js +0 -189
  587. package/node_modules/pi-lens/dist/clients/module-report.js +0 -2150
  588. package/node_modules/pi-lens/dist/clients/mutating-tool.js +0 -651
  589. package/node_modules/pi-lens/dist/clients/mutation-attribution.js +0 -368
  590. package/node_modules/pi-lens/dist/clients/mutation-bridge.js +0 -240
  591. package/node_modules/pi-lens/dist/clients/ndjson-logger.js +0 -734
  592. package/node_modules/pi-lens/dist/clients/observed-mutation-sources.js +0 -101
  593. package/node_modules/pi-lens/dist/clients/observed-mutation.js +0 -1253
  594. package/node_modules/pi-lens/dist/clients/oldtext-autopatch.js +0 -128
  595. package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +0 -496
  596. package/node_modules/pi-lens/dist/clients/opengrep-client.js +0 -333
  597. package/node_modules/pi-lens/dist/clients/opengrep-config.js +0 -76
  598. package/node_modules/pi-lens/dist/clients/package-manager.js +0 -607
  599. package/node_modules/pi-lens/dist/clients/package-root.js +0 -38
  600. package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +0 -439
  601. package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +0 -43
  602. package/node_modules/pi-lens/dist/clients/path-keyed-map.js +0 -108
  603. package/node_modules/pi-lens/dist/clients/path-utils.js +0 -1244
  604. package/node_modules/pi-lens/dist/clients/performance-report.js +0 -331
  605. package/node_modules/pi-lens/dist/clients/persist-debounce.js +0 -70
  606. package/node_modules/pi-lens/dist/clients/persistent-reverify.js +0 -271
  607. package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +0 -119
  608. package/node_modules/pi-lens/dist/clients/pipeline.js +0 -1480
  609. package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +0 -37
  610. package/node_modules/pi-lens/dist/clients/print-mode.js +0 -21
  611. package/node_modules/pi-lens/dist/clients/probe-home-state.js +0 -228
  612. package/node_modules/pi-lens/dist/clients/process-bridge.js +0 -66
  613. package/node_modules/pi-lens/dist/clients/process-singletons.js +0 -210
  614. package/node_modules/pi-lens/dist/clients/process-snapshot.js +0 -68
  615. package/node_modules/pi-lens/dist/clients/project-changes.js +0 -181
  616. package/node_modules/pi-lens/dist/clients/project-conventions.js +0 -171
  617. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +0 -137
  618. package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +0 -109
  619. package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  620. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  621. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  622. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  623. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  624. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  625. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  626. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  627. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  628. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  629. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  630. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +0 -520
  631. package/node_modules/pi-lens/dist/clients/project-diagnostics/types.js +0 -1
  632. package/node_modules/pi-lens/dist/clients/project-lens-config.js +0 -807
  633. package/node_modules/pi-lens/dist/clients/project-report.js +0 -701
  634. package/node_modules/pi-lens/dist/clients/project-scale.js +0 -237
  635. package/node_modules/pi-lens/dist/clients/project-scan-policy.js +0 -11
  636. package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +0 -48
  637. package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +0 -20
  638. package/node_modules/pi-lens/dist/clients/project-snapshot.js +0 -1653
  639. package/node_modules/pi-lens/dist/clients/project-trust.js +0 -181
  640. package/node_modules/pi-lens/dist/clients/python-environment.js +0 -217
  641. package/node_modules/pi-lens/dist/clients/python-provenance.js +0 -639
  642. package/node_modules/pi-lens/dist/clients/quiet-window-config.js +0 -47
  643. package/node_modules/pi-lens/dist/clients/quiet-window.js +0 -236
  644. package/node_modules/pi-lens/dist/clients/read-bridge.js +0 -139
  645. package/node_modules/pi-lens/dist/clients/read-expansion.js +0 -266
  646. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +0 -251
  647. package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +0 -1306
  648. package/node_modules/pi-lens/dist/clients/read-guard.js +0 -1561
  649. package/node_modules/pi-lens/dist/clients/recent-touches.js +0 -240
  650. package/node_modules/pi-lens/dist/clients/redact/secrets.js +0 -449
  651. package/node_modules/pi-lens/dist/clients/resource-sampler.js +0 -628
  652. package/node_modules/pi-lens/dist/clients/reverse-deps.js +0 -270
  653. package/node_modules/pi-lens/dist/clients/review-graph/builder.js +0 -5126
  654. package/node_modules/pi-lens/dist/clients/review-graph/format.js +0 -33
  655. package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +0 -163
  656. package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +0 -481
  657. package/node_modules/pi-lens/dist/clients/review-graph/persist-worker.js +0 -10
  658. package/node_modules/pi-lens/dist/clients/review-graph/query.js +0 -244
  659. package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +0 -21
  660. package/node_modules/pi-lens/dist/clients/review-graph/service.js +0 -96
  661. package/node_modules/pi-lens/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  662. package/node_modules/pi-lens/dist/clients/review-graph/symbol-id.js +0 -103
  663. package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +0 -299
  664. package/node_modules/pi-lens/dist/clients/review-graph/types.js +0 -1
  665. package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +0 -449
  666. package/node_modules/pi-lens/dist/clients/review-graph-logger.js +0 -81
  667. package/node_modules/pi-lens/dist/clients/ruff-client.js +0 -179
  668. package/node_modules/pi-lens/dist/clients/rules-scanner.js +0 -131
  669. package/node_modules/pi-lens/dist/clients/run-duration.js +0 -55
  670. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +0 -746
  671. package/node_modules/pi-lens/dist/clients/runtime-config.js +0 -77
  672. package/node_modules/pi-lens/dist/clients/runtime-context.js +0 -211
  673. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +0 -1324
  674. package/node_modules/pi-lens/dist/clients/runtime-session.js +0 -2485
  675. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +0 -1295
  676. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +0 -2049
  677. package/node_modules/pi-lens/dist/clients/runtime-turn.js +0 -3767
  678. package/node_modules/pi-lens/dist/clients/rust-client.js +0 -97
  679. package/node_modules/pi-lens/dist/clients/safe-spawn.js +0 -2357
  680. package/node_modules/pi-lens/dist/clients/sanitize.js +0 -286
  681. package/node_modules/pi-lens/dist/clients/scan-utils.js +0 -25
  682. package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +0 -165
  683. package/node_modules/pi-lens/dist/clients/search-read-registration.js +0 -94
  684. package/node_modules/pi-lens/dist/clients/secret-findings.js +0 -114
  685. package/node_modules/pi-lens/dist/clients/security-scan-client.js +0 -352
  686. package/node_modules/pi-lens/dist/clients/session-event-guard.js +0 -297
  687. package/node_modules/pi-lens/dist/clients/session-lifecycle.js +0 -484
  688. package/node_modules/pi-lens/dist/clients/session-start-observability.js +0 -94
  689. package/node_modules/pi-lens/dist/clients/session-state-store.js +0 -101
  690. package/node_modules/pi-lens/dist/clients/session-summary.js +0 -15
  691. package/node_modules/pi-lens/dist/clients/sessionstart-logger.js +0 -27
  692. package/node_modules/pi-lens/dist/clients/sg-runner.js +0 -876
  693. package/node_modules/pi-lens/dist/clients/sgconfig.js +0 -347
  694. package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +0 -338
  695. package/node_modules/pi-lens/dist/clients/single-flight.js +0 -158
  696. package/node_modules/pi-lens/dist/clients/situational-tool-telemetry.js +0 -108
  697. package/node_modules/pi-lens/dist/clients/skills-resolver.js +0 -141
  698. package/node_modules/pi-lens/dist/clients/slow-fs.js +0 -138
  699. package/node_modules/pi-lens/dist/clients/smells-rollup.js +0 -231
  700. package/node_modules/pi-lens/dist/clients/source-filter.js +0 -596
  701. package/node_modules/pi-lens/dist/clients/source-walker.js +0 -211
  702. package/node_modules/pi-lens/dist/clients/spawn-output-cap.js +0 -120
  703. package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +0 -110
  704. package/node_modules/pi-lens/dist/clients/stale-marker.js +0 -17
  705. package/node_modules/pi-lens/dist/clients/startup-scan.js +0 -400
  706. package/node_modules/pi-lens/dist/clients/startup-timing.js +0 -130
  707. package/node_modules/pi-lens/dist/clients/string-utils.js +0 -33
  708. package/node_modules/pi-lens/dist/clients/subagent-mode.js +0 -111
  709. package/node_modules/pi-lens/dist/clients/symbol-containment.js +0 -24
  710. package/node_modules/pi-lens/dist/clients/symbol-types.js +0 -5
  711. package/node_modules/pi-lens/dist/clients/test-runner-client.js +0 -2507
  712. package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +0 -287
  713. package/node_modules/pi-lens/dist/clients/todo-scanner.js +0 -229
  714. package/node_modules/pi-lens/dist/clients/tool-agreement.js +0 -423
  715. package/node_modules/pi-lens/dist/clients/tool-config.js +0 -249
  716. package/node_modules/pi-lens/dist/clients/tool-cwd.js +0 -270
  717. package/node_modules/pi-lens/dist/clients/tool-definition.js +0 -47
  718. package/node_modules/pi-lens/dist/clients/tool-event.js +0 -105
  719. package/node_modules/pi-lens/dist/clients/tool-policy.js +0 -2755
  720. package/node_modules/pi-lens/dist/clients/tool-probe.js +0 -53
  721. package/node_modules/pi-lens/dist/clients/tool-render.js +0 -156
  722. package/node_modules/pi-lens/dist/clients/tool-set-policy.js +0 -118
  723. package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +0 -364
  724. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +0 -4195
  725. package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +0 -100
  726. package/node_modules/pi-lens/dist/clients/tree-sitter-navigator.js +0 -269
  727. package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +0 -569
  728. package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +0 -158
  729. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  730. package/node_modules/pi-lens/dist/clients/trivy-client.js +0 -467
  731. package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -50
  732. package/node_modules/pi-lens/dist/clients/turn-context.js +0 -52
  733. package/node_modules/pi-lens/dist/clients/turn-end/lane.js +0 -51
  734. package/node_modules/pi-lens/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  735. package/node_modules/pi-lens/dist/clients/turn-end/lanes/secrets.js +0 -204
  736. package/node_modules/pi-lens/dist/clients/turn-summary-render.js +0 -72
  737. package/node_modules/pi-lens/dist/clients/turn-summary.js +0 -132
  738. package/node_modules/pi-lens/dist/clients/typos-config.js +0 -29
  739. package/node_modules/pi-lens/dist/clients/user-notify.js +0 -51
  740. package/node_modules/pi-lens/dist/clients/vanished-instance-marker.js +0 -57
  741. package/node_modules/pi-lens/dist/clients/warm-attach.js +0 -305
  742. package/node_modules/pi-lens/dist/clients/widget-state.js +0 -1808
  743. package/node_modules/pi-lens/dist/clients/word-index-logger.js +0 -49
  744. package/node_modules/pi-lens/dist/clients/word-index-store.js +0 -459
  745. package/node_modules/pi-lens/dist/clients/word-index.js +0 -2080
  746. package/node_modules/pi-lens/dist/clients/workspace-topology.js +0 -443
  747. package/node_modules/pi-lens/dist/clients/write-ordering-guard.js +0 -65
  748. package/node_modules/pi-lens/dist/clients/zizmor-config.js +0 -340
  749. package/node_modules/pi-lens/dist/i18n.js +0 -69
  750. package/node_modules/pi-lens/dist/mcp/build-staleness.js +0 -124
  751. package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +0 -583
  752. package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +0 -129
  753. package/node_modules/pi-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  754. package/node_modules/pi-lens/dist/tools/activate-tools.js +0 -87
  755. package/node_modules/pi-lens/dist/tools/ast-grep-outline.js +0 -137
  756. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +0 -244
  757. package/node_modules/pi-lens/dist/tools/ast-grep-search.js +0 -762
  758. package/node_modules/pi-lens/dist/tools/effective-config.js +0 -90
  759. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +0 -375
  760. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +0 -2571
  761. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +0 -1745
  762. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +0 -1367
  763. package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +0 -294
  764. package/node_modules/pi-lens/dist/tools/module-report.js +0 -382
  765. package/node_modules/pi-lens/dist/tools/project-report.js +0 -86
  766. package/node_modules/pi-lens/dist/tools/render-compact.js +0 -374
  767. package/node_modules/pi-lens/dist/tools/scan-progress.js +0 -53
  768. package/node_modules/pi-lens/dist/tools/shared.js +0 -29
  769. 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
- }