pi-lens 4.4.2 → 4.4.4

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 (143) hide show
  1. package/CHANGELOG.md +306 -0
  2. package/README.md +13 -1
  3. package/dist/{chunk-VITUCP5A.js → chunk-24AKHFGP.js} +9 -7
  4. package/dist/{chunk-JSQFTSC6.js → chunk-2FN63LPV.js} +11 -11
  5. package/dist/{chunk-CF24OIYI.js → chunk-2KXTHF3M.js} +20 -20
  6. package/dist/{chunk-ESBQHFMJ.js → chunk-3DA2JDOL.js} +543 -349
  7. package/dist/{chunk-RWWYJ623.js → chunk-3KAZU3VR.js} +1 -1
  8. package/dist/chunk-3PTHXJXR.js +28 -0
  9. package/dist/chunk-3QED2P4V.js +31 -0
  10. package/dist/{chunk-N2H3ZPZY.js → chunk-3RKP3FMS.js} +1 -0
  11. package/dist/{chunk-XVF2VVXP.js → chunk-5HSRT26B.js} +2 -2
  12. package/dist/{chunk-XKIZ2HNN.js → chunk-5IUSNGOC.js} +18 -16
  13. package/dist/{chunk-EJIUXPBX.js → chunk-5OFV52AM.js} +1 -1
  14. package/dist/{chunk-AW7R2GWG.js → chunk-5VSF4UUQ.js} +12 -7
  15. package/dist/{chunk-NW7BOILN.js → chunk-5WRPDP2A.js} +18 -18
  16. package/dist/{chunk-7ULNCDCO.js → chunk-6DLWKFEX.js} +35 -34
  17. package/dist/{chunk-WOA4LN2R.js → chunk-7D6L4MTX.js} +2 -2
  18. package/dist/{chunk-GAEGEPOC.js → chunk-7HXE67BN.js} +2 -2
  19. package/dist/chunk-AGSS7277.js +84 -0
  20. package/dist/{chunk-R3PCY3YS.js → chunk-AMERCH6V.js} +13 -13
  21. package/dist/{chunk-WU567RSC.js → chunk-ATKJFDQN.js} +14 -10
  22. package/dist/{chunk-VSSBEUFT.js → chunk-AWSCPCN2.js} +16 -16
  23. package/dist/{chunk-VCHXCQFG.js → chunk-BWD5EPKO.js} +3 -3
  24. package/dist/{chunk-ODBNXWT4.js → chunk-CT4MN5IU.js} +1271 -262
  25. package/dist/{chunk-34WSVGEM.js → chunk-CUHSHSB6.js} +83 -5
  26. package/dist/{chunk-CHOW74WE.js → chunk-CYRKQRPM.js} +7 -10
  27. package/dist/{chunk-Q7DUK4LX.js → chunk-DEL2U6CM.js} +5 -5
  28. package/dist/{chunk-6C7JWPCP.js → chunk-DGUKIYSI.js} +26 -23
  29. package/dist/{chunk-PHDMFAKM.js → chunk-DUO2TU77.js} +2 -2
  30. package/dist/{chunk-MRXKYPCS.js → chunk-EBC36LNN.js} +2 -2
  31. package/dist/chunk-ED36RF6Y.js +17 -0
  32. package/dist/{chunk-76MWC2K6.js → chunk-EUXZEFTV.js} +90 -97
  33. package/dist/{chunk-QOZXJ4NA.js → chunk-FM4RDMKT.js} +11 -8
  34. package/dist/{chunk-66VMUL7Q.js → chunk-GAQ7OQG6.js} +31 -28
  35. package/dist/{chunk-Q6ZWTCLY.js → chunk-GL5LUMZE.js} +23 -24
  36. package/dist/{chunk-BKE7E7TC.js → chunk-GMX5OS7B.js} +9 -9
  37. package/dist/{chunk-ZHFZWTZV.js → chunk-GSLNCYGG.js} +11 -11
  38. package/dist/{chunk-ARJ6PLFH.js → chunk-GSM5UU7A.js} +26 -34
  39. package/dist/{chunk-724UL2TJ.js → chunk-GXFV6MYU.js} +3 -3
  40. package/dist/chunk-HAD7QRQI.js +30 -0
  41. package/dist/{chunk-QOBUHWHX.js → chunk-HRNHZA3N.js} +6 -6
  42. package/dist/{chunk-VWCXW2E7.js → chunk-HWCCCQNX.js} +1 -1
  43. package/dist/{chunk-7DYBLXYA.js → chunk-HYGZEMX6.js} +3 -3
  44. package/dist/chunk-IJYGIDF4.js +186 -0
  45. package/dist/{chunk-4W4VLAPJ.js → chunk-IQWN5JCP.js} +11 -11
  46. package/dist/{chunk-GZYBXISR.js → chunk-IUE7SSKV.js} +9 -9
  47. package/dist/{chunk-IBGIOBEE.js → chunk-IWDLU6K3.js} +68 -5
  48. package/dist/{chunk-XCJN5IJU.js → chunk-IYNJ6YPZ.js} +4 -4
  49. package/dist/{chunk-JAU72XNY.js → chunk-J64T55EI.js} +3 -3
  50. package/dist/{chunk-2BBLFX75.js → chunk-J6MPGQTS.js} +5 -5
  51. package/dist/chunk-JORED7EX.js +44 -0
  52. package/dist/{chunk-6SDEP3AJ.js → chunk-JUKMK5Y4.js} +8 -8
  53. package/dist/{chunk-IBRALRBR.js → chunk-JW3YWBVB.js} +15 -14
  54. package/dist/{chunk-L3BLXZG7.js → chunk-KAPJINKN.js} +30 -69
  55. package/dist/{chunk-2B73ZPOK.js → chunk-KN35K52N.js} +3 -3
  56. package/dist/{chunk-C34ZXZ7O.js → chunk-KUA4OJ5Y.js} +24 -11
  57. package/dist/chunk-KYUB6QDC.js +72 -0
  58. package/dist/{chunk-67WMNWEE.js → chunk-LLJNQKQW.js} +12 -10
  59. package/dist/chunk-LZSEQW6A.js +57 -0
  60. package/dist/{chunk-ZANLILYD.js → chunk-M2IFVFWU.js} +2 -2
  61. package/dist/chunk-M2UD3LPU.js +88 -0
  62. package/dist/{chunk-WOKKRCJ5.js → chunk-MBKQHGA7.js} +15 -14
  63. package/dist/{chunk-P7266HLM.js → chunk-MPNJLASA.js} +2 -2
  64. package/dist/{chunk-6GFRNVYR.js → chunk-MZGQNL3Y.js} +10 -10
  65. package/dist/{chunk-QZVW3AAK.js → chunk-N5FLEO7W.js} +33 -31
  66. package/dist/{chunk-3JNKMP3B.js → chunk-O4NWQT6I.js} +4 -4
  67. package/dist/{chunk-PFNSLWU5.js → chunk-OHKJ7PQF.js} +33 -31
  68. package/dist/{chunk-VRZP76YM.js → chunk-P63GXC37.js} +4 -1
  69. package/dist/{chunk-XTMJ7XDT.js → chunk-POMLXPMY.js} +1 -1
  70. package/dist/{chunk-QQNQ7SJW.js → chunk-QBFBRV2B.js} +10 -4
  71. package/dist/{chunk-3UUPUE3O.js → chunk-R3T7CLQ2.js} +84 -60
  72. package/dist/{chunk-23WOO7TX.js → chunk-R7YOCSNV.js} +10 -10
  73. package/dist/{chunk-2CD5RS6M.js → chunk-RKBXZN3A.js} +23 -2
  74. package/dist/{chunk-OG5UUPN7.js → chunk-RKKOYPRA.js} +14 -14
  75. package/dist/{chunk-52FUZI6K.js → chunk-RMLC67LF.js} +1 -1
  76. package/dist/{chunk-XMSXXAHW.js → chunk-ROYSX2S5.js} +2 -2
  77. package/dist/{chunk-PV6LR5P5.js → chunk-RVK72CZX.js} +9605 -14776
  78. package/dist/{chunk-FLKWCIZH.js → chunk-S2HEXIWI.js} +5 -5
  79. package/dist/{chunk-UZ3TUTRV.js → chunk-S67KYG37.js} +1 -1
  80. package/dist/{chunk-JWA5I3SR.js → chunk-SD4I7ZO4.js} +16 -18
  81. package/dist/{chunk-Z527N6YQ.js → chunk-SKAMFC7A.js} +12 -12
  82. package/dist/{chunk-MQLUAEOC.js → chunk-SRYEJNES.js} +2 -2
  83. package/dist/{chunk-BRGDSBJE.js → chunk-SYE6T2EB.js} +12 -12
  84. package/dist/{chunk-GXW6K4YJ.js → chunk-T57LYLZT.js} +1 -1
  85. package/dist/{chunk-ZXYDQ3TZ.js → chunk-T7FEBKXN.js} +48 -15
  86. package/dist/{chunk-IXXDFY73.js → chunk-TIQ2PKDW.js} +3 -3
  87. package/dist/{chunk-QILIYSJF.js → chunk-TLX72JTG.js} +1 -1
  88. package/dist/{chunk-TYM6OUIT.js → chunk-TOY6QKOH.js} +12 -12
  89. package/dist/{chunk-IZSHAIJ7.js → chunk-TRETHTQO.js} +12 -12
  90. package/dist/{chunk-3VPVG5SU.js → chunk-U44DJXQP.js} +10 -6
  91. package/dist/{chunk-PNQDPDRC.js → chunk-UA7ZXYDR.js} +1 -1
  92. package/dist/{chunk-OXXKQCSV.js → chunk-UBOQLVT2.js} +4 -4
  93. package/dist/{chunk-QGQ5CCCG.js → chunk-UMS2MFPZ.js} +2 -2
  94. package/dist/{chunk-QHJ6DQ2R.js → chunk-US7ECLD7.js} +55 -13
  95. package/dist/{chunk-EETY4LF7.js → chunk-UZ2XCLYS.js} +8 -8
  96. package/dist/chunk-V35JG4JB.js +2667 -0
  97. package/dist/{chunk-N3X6Q4YT.js → chunk-VOOAPROD.js} +3 -3
  98. package/dist/{chunk-SAEFPSB6.js → chunk-W66O5E25.js} +21 -11
  99. package/dist/{chunk-KBG47GHP.js → chunk-WMYE35PX.js} +15 -11
  100. package/dist/{chunk-5NGR67U5.js → chunk-XBJVAEEO.js} +32 -5
  101. package/dist/chunk-XHJBS436.js +4217 -0
  102. package/dist/{chunk-GBPP5P7X.js → chunk-XTBDCR27.js} +4 -4
  103. package/dist/{chunk-4UNXBNE2.js → chunk-XTFDJI3T.js} +11 -11
  104. package/dist/{chunk-UXGETRP4.js → chunk-XYURS6EN.js} +13 -12
  105. package/dist/{chunk-RPLINGVB.js → chunk-Y6GZHWSJ.js} +6 -6
  106. package/dist/{chunk-2ZGIZPDG.js → chunk-YCWYO6TQ.js} +41 -38
  107. package/dist/{chunk-66SXUJCA.js → chunk-YH5MVY2U.js} +10 -8
  108. package/dist/{chunk-AOHZU2BM.js → chunk-YNE3RP52.js} +1 -1
  109. package/dist/{chunk-GOYRYZ2R.js → chunk-ZHH37KZL.js} +72 -20
  110. package/dist/{chunk-ZGDGW2V3.js → chunk-ZIVJBOO3.js} +2 -2
  111. package/dist/{chunk-GHB6AYCP.js → chunk-ZVUL7QYY.js} +29 -28
  112. package/dist/index.js +11559 -6213
  113. package/dist/mcp/analyze-cli.js +10 -9
  114. package/dist/mcp/cli.js +41 -38
  115. package/dist/mcp/server.js +1142 -495
  116. package/dist/mcp/worker.js +61 -57
  117. package/dist/probes/installer.js +19 -19
  118. package/dist/workers/project-snapshot-persist-worker.js +28 -9
  119. package/dist/workers/review-graph-persist-worker.js +1 -1
  120. package/docs/configuration.md +11 -0
  121. package/docs/engineering-principles.md +32 -0
  122. package/docs/lsp-capability-matrix.md +1 -1
  123. package/docs/lsp-idle-eviction.md +15 -26
  124. package/docs/pi-lens-fixer.md +117 -13
  125. package/docs/pi-lens-merge-policy.md +109 -11
  126. package/docs/pi-lens-monitor.md +8 -2
  127. package/docs/pi-lens-retro.md +4 -1
  128. package/docs/pi-lens-reviewer.md +114 -3
  129. package/docs/pi-lens-subagent.md +27 -14
  130. package/docs/release-qa-baseline.md +3 -1
  131. package/docs/servercapabilities.md +9 -19
  132. package/package.json +7 -5
  133. package/scripts/download-grammars.js +40 -7
  134. package/scripts/lib/latency-log-phases.mjs +95 -0
  135. package/scripts/rpc-load-check.mjs +570 -81
  136. package/dist/chunk-3WA4HP4I.js +0 -55
  137. package/dist/chunk-466Z26MG.js +0 -30
  138. package/dist/chunk-5JM2524W.js +0 -84
  139. package/dist/chunk-CO2G5PHH.js +0 -84
  140. package/dist/chunk-LOP6GRPH.js +0 -31
  141. package/dist/chunk-UOPVJQ4N.js +0 -103
  142. package/dist/chunk-XPZPXCBV.js +0 -28
  143. /package/dist/{chunk-FC4RP4I2.js → chunk-6HWVI6MI.js} +0 -0
@@ -6,26 +6,26 @@ import {
6
6
  EXTENSION_TO_GRAMMAR,
7
7
  getUserRuleRoot,
8
8
  ruleCorpusFingerprintForCycle
9
- } from "./chunk-724UL2TJ.js";
9
+ } from "./chunk-GXFV6MYU.js";
10
10
  import {
11
11
  getPackageRoot,
12
12
  js_yaml_default,
13
13
  resolvePackagePath
14
- } from "./chunk-QOZXJ4NA.js";
14
+ } from "./chunk-FM4RDMKT.js";
15
15
  import {
16
16
  transientRetryDelayMs
17
- } from "./chunk-VRZP76YM.js";
17
+ } from "./chunk-P63GXC37.js";
18
18
  import {
19
19
  getProjectIgnoreMatcher,
20
20
  isExcludedDirName
21
- } from "./chunk-C34ZXZ7O.js";
21
+ } from "./chunk-KUA4OJ5Y.js";
22
22
  import {
23
23
  notifyUserDegradation
24
- } from "./chunk-2BBLFX75.js";
24
+ } from "./chunk-J6MPGQTS.js";
25
25
  import {
26
26
  assertInstallAllowed,
27
27
  getProjectTrustGeneration
28
- } from "./chunk-ZANLILYD.js";
28
+ } from "./chunk-M2IFVFWU.js";
29
29
  import {
30
30
  writeFileAtomic
31
31
  } from "./chunk-2EECBNC5.js";
@@ -36,20 +36,20 @@ import {
36
36
  incrementDegradationCount,
37
37
  recordDegradation,
38
38
  recordDegradationOnce
39
- } from "./chunk-JAU72XNY.js";
39
+ } from "./chunk-J64T55EI.js";
40
40
  import {
41
41
  createNdjsonLogger,
42
42
  getGlobalPiLensLogDir,
43
43
  getMaxLogSizeMB,
44
44
  isTestMode
45
- } from "./chunk-AOHZU2BM.js";
45
+ } from "./chunk-YNE3RP52.js";
46
46
  import {
47
47
  BoundedFifoMap
48
48
  } from "./chunk-ABBOA7UD.js";
49
49
  import {
50
50
  normalizeFilePath,
51
51
  normalizeLoggedPath
52
- } from "./chunk-N2H3ZPZY.js";
52
+ } from "./chunk-3RKP3FMS.js";
53
53
 
54
54
  // dist/clients/tree-sitter-logger.js
55
55
  import * as path from "node:path";
@@ -319,17 +319,18 @@ function shortHash(hash) {
319
319
  const hex = hash.startsWith("sha256:") ? hash.slice("sha256:".length) : hash;
320
320
  return `sha256:${hex.slice(0, 12)}\u2026`;
321
321
  }
322
- async function downloadGrammarDetailed(destDir, filename) {
322
+ async function downloadGrammarDetailed(destDir, filename, options = {}) {
323
323
  if (isVendoredGrammar(filename))
324
324
  return vendoredGrammarRefusal(filename);
325
+ const stall = options.stallMs === void 0 ? void 0 : armStallBound(options.stallMs);
325
326
  try {
326
327
  fs.mkdirSync(destDir, { recursive: true });
327
- const res = await fetch(grammarSourceUrl(filename));
328
+ const res = await fetch(grammarSourceUrl(filename), stall ? { signal: stall.signal } : void 0);
328
329
  if (!res.ok) {
329
330
  const retryable = res.status !== 404 && res.status !== 410;
330
331
  return { ok: false, retryable };
331
332
  }
332
- const data = Buffer.from(await res.arrayBuffer());
333
+ const data = await readResponseBody(res, stall);
333
334
  if (!hasWasmMagic(data)) {
334
335
  return { ok: false, retryable: true, reason: describeNonWasmBody(data) };
335
336
  }
@@ -358,7 +359,42 @@ async function downloadGrammarDetailed(destDir, filename) {
358
359
  writeFileAtomic(path2.join(destDir, filename), data, { bestEffort: false });
359
360
  return { ok: true, retryable: true };
360
361
  } catch {
362
+ if (stall?.signal.aborted) {
363
+ return {
364
+ ok: false,
365
+ retryable: true,
366
+ reason: `No bytes arrived for ${options.stallMs} ms \u2014 a stalled transfer.`
367
+ };
368
+ }
361
369
  return { ok: false, retryable: true };
370
+ } finally {
371
+ stall?.dispose();
372
+ }
373
+ }
374
+ var GRAMMAR_STALL_MS = 15e3;
375
+ function armStallBound(ms) {
376
+ const controller = new AbortController();
377
+ const timer = setTimeout(() => controller.abort(), ms);
378
+ timer.unref();
379
+ return {
380
+ signal: controller.signal,
381
+ touch: () => {
382
+ timer.refresh();
383
+ },
384
+ dispose: () => clearTimeout(timer)
385
+ };
386
+ }
387
+ async function readResponseBody(res, stall) {
388
+ if (!stall || !res.body)
389
+ return Buffer.from(await res.arrayBuffer());
390
+ const reader = res.body.getReader();
391
+ const chunks = [];
392
+ for (; ; ) {
393
+ const { done, value } = await reader.read();
394
+ if (done)
395
+ return Buffer.concat(chunks);
396
+ stall.touch();
397
+ chunks.push(value);
362
398
  }
363
399
  }
364
400
 
@@ -2110,6 +2146,8 @@ var TreeSitterClient = class _TreeSitterClient {
2110
2146
  * (the `transientRetryDelayMs` shape from availability-policy.ts) instead
2111
2147
  * of latching for the process lifetime. */
2112
2148
  grammarRetryAtMs = /* @__PURE__ */ new Map();
2149
+ /** Instance field so a test can shorten it without waiting out the real bound. */
2150
+ grammarStallMs = GRAMMAR_STALL_MS;
2113
2151
  /**
2114
2152
  * Grammar path → the `size:mtimeMs` stamp at which its wasm preamble was
2115
2153
  * verified (#1548). A POSITIVE-only memo, so the steady-state resolve costs
@@ -2634,6 +2672,10 @@ var TreeSitterClient = class _TreeSitterClient {
2634
2672
  * `vendor/grammars` comes first because it is the ONLY source for a grammar
2635
2673
  * we build ourselves (`VENDORED_GRAMMARS`) — nothing downloads into the
2636
2674
  * later dirs for it, so a miss here is a miss everywhere.
2675
+ *
2676
+ * Public so the Vitest grammar prefetch (`tests/support/prewarm-grammars.ts`)
2677
+ * counts a grammar as present exactly where this resolver would find it
2678
+ * (#4342), instead of keeping its own copy of the list.
2637
2679
  */
2638
2680
  grammarSourceDirs() {
2639
2681
  const dirs = [];
@@ -2944,7 +2986,7 @@ var TreeSitterClient = class _TreeSitterClient {
2944
2986
  );
2945
2987
  return false;
2946
2988
  }
2947
- const { ok, retryable, reason } = await downloadGrammarDetailed(dir, grammarFile);
2989
+ const { ok, retryable, reason } = await downloadGrammarDetailed(dir, grammarFile, { stallMs: this.grammarStallMs });
2948
2990
  if (ok) {
2949
2991
  if (!this.grammarsDir)
2950
2992
  this.grammarsDir = dir;
@@ -4,32 +4,32 @@ import {
4
4
  discoverManagedTool,
5
5
  getManagedToolEnvironment,
6
6
  resolveAvailableOrInstall
7
- } from "./chunk-GOYRYZ2R.js";
7
+ } from "./chunk-ZHH37KZL.js";
8
8
  import {
9
9
  mapWithConcurrency
10
10
  } from "./chunk-XIMYZ3JA.js";
11
11
  import {
12
12
  findNodeToolBinary
13
- } from "./chunk-AW7R2GWG.js";
13
+ } from "./chunk-5VSF4UUQ.js";
14
14
  import {
15
15
  getIsolatedNpxSpawnOptions
16
- } from "./chunk-RWWYJ623.js";
16
+ } from "./chunk-3KAZU3VR.js";
17
17
  import {
18
18
  createAvailabilityLatch
19
- } from "./chunk-VRZP76YM.js";
19
+ } from "./chunk-P63GXC37.js";
20
20
  import {
21
21
  safeSpawnAsync
22
- } from "./chunk-C34ZXZ7O.js";
22
+ } from "./chunk-KUA4OJ5Y.js";
23
23
  import {
24
24
  compareOrdinal,
25
25
  recordDegradationOnce
26
- } from "./chunk-JAU72XNY.js";
26
+ } from "./chunk-J64T55EI.js";
27
27
  import {
28
28
  createSubsystemLogger
29
- } from "./chunk-XTMJ7XDT.js";
29
+ } from "./chunk-POMLXPMY.js";
30
30
  import {
31
31
  isFullyQualified
32
- } from "./chunk-N2H3ZPZY.js";
32
+ } from "./chunk-3RKP3FMS.js";
33
33
 
34
34
  // dist/clients/dependency-checker.js
35
35
  import * as fs from "node:fs";