pi-lens 4.4.0 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +1 -0
  3. package/dist/chunk-2FQ62SPM.js +83 -0
  4. package/dist/{chunk-6P62QVEA.js → chunk-2UMYMRI3.js} +2 -2
  5. package/dist/{chunk-O6TQT6RI.js → chunk-34OCDWOS.js} +1 -1
  6. package/dist/{chunk-XK4CIILI.js → chunk-3FERWMCH.js} +26 -26
  7. package/dist/{chunk-ZAWW3AF6.js → chunk-3JL6IFD7.js} +8 -8
  8. package/dist/{chunk-OAXNDZJ7.js → chunk-3JSEWUWI.js} +8 -4
  9. package/dist/{chunk-RPD5K5NC.js → chunk-3MRXIJ6I.js} +2 -2
  10. package/dist/{chunk-IVP5KAB7.js → chunk-3P4PF2BX.js} +14 -14
  11. package/dist/{chunk-5THXD6X5.js → chunk-3PNFWVHT.js} +2 -2
  12. package/dist/{chunk-VD4JQCQC.js → chunk-3TTPKMEF.js} +37 -37
  13. package/dist/{chunk-7F72PXY2.js → chunk-5JHXUETW.js} +3 -3
  14. package/dist/{chunk-5ZEJHV35.js → chunk-64LU2OVH.js} +2 -2
  15. package/dist/{chunk-ODEEOXPH.js → chunk-6B5I6ICN.js} +11 -11
  16. package/dist/{chunk-5RXBNSW2.js → chunk-6P54TMWL.js} +16 -8
  17. package/dist/{chunk-K6VYLB2U.js → chunk-6UYA642J.js} +12 -12
  18. package/dist/{chunk-V7R425XG.js → chunk-6XX5HCLK.js} +4 -4
  19. package/dist/{chunk-D6QS3U6M.js → chunk-7AXO3ZDF.js} +15 -15
  20. package/dist/{chunk-YGVYKNSN.js → chunk-7BX5DWSA.js} +59 -12
  21. package/dist/{chunk-N3YQJI6O.js → chunk-7ELY2CSM.js} +7 -4
  22. package/dist/{chunk-AWE5TMPO.js → chunk-7M4T5N3V.js} +13 -13
  23. package/dist/{chunk-AJ3QXTRQ.js → chunk-AFZYMAIV.js} +33 -33
  24. package/dist/{chunk-AJXODZY6.js → chunk-ALQRYH6O.js} +12 -12
  25. package/dist/{chunk-AJVLWNFN.js → chunk-AXKPQ6ZI.js} +5 -5
  26. package/dist/{chunk-HWBZIGMJ.js → chunk-BHWHXMQ2.js} +8 -8
  27. package/dist/{chunk-IXEBJSUE.js → chunk-BJF25SUG.js} +10 -10
  28. package/dist/{chunk-GVXA6CCE.js → chunk-BNKLYOOO.js} +1 -1
  29. package/dist/{chunk-T4ERT73Y.js → chunk-CBD2B5CP.js} +20 -20
  30. package/dist/{chunk-O5WILGMI.js → chunk-CFYISHUW.js} +5 -5
  31. package/dist/{chunk-EOKRQ3SA.js → chunk-CMU4RMJB.js} +1 -1
  32. package/dist/{chunk-YSNFMJKN.js → chunk-CULQYFLU.js} +2 -2
  33. package/dist/{chunk-ORTMY4Q4.js → chunk-D65GOCJB.js} +21 -14
  34. package/dist/{chunk-NTUJEGDZ.js → chunk-D6YF5HKX.js} +2 -2
  35. package/dist/{chunk-BRJKOBZP.js → chunk-DMS52BEP.js} +17 -6
  36. package/dist/{chunk-NL5GLMFI.js → chunk-ELVWJYRV.js} +11 -11
  37. package/dist/{chunk-4W2PLC4J.js → chunk-EUT3B22Y.js} +12 -12
  38. package/dist/{chunk-GUOGVTCQ.js → chunk-F5VLZHUW.js} +1 -1
  39. package/dist/{chunk-I7SPGOWI.js → chunk-FGALODG3.js} +1 -1
  40. package/dist/{chunk-Q5U6FMDI.js → chunk-G3RLJYA2.js} +12 -6
  41. package/dist/{chunk-FJNKANOS.js → chunk-GAYGGICG.js} +9 -9
  42. package/dist/{chunk-HVUZXSWK.js → chunk-H2W2AXD3.js} +38 -40
  43. package/dist/{chunk-VHQLPIRJ.js → chunk-H5EV3VMF.js} +2 -2
  44. package/dist/{chunk-27BBHSZC.js → chunk-HREZQCT3.js} +3 -3
  45. package/dist/{chunk-TT22N74J.js → chunk-HSIRMK2D.js} +12 -12
  46. package/dist/{chunk-3I5QFT3N.js → chunk-IMSQR4WO.js} +6 -3
  47. package/dist/{chunk-B3I2UUT4.js → chunk-IQZXOZ7S.js} +156 -32
  48. package/dist/{chunk-RIISMHKN.js → chunk-IR6XFA5P.js} +14 -13
  49. package/dist/{chunk-LNAKEO63.js → chunk-IUKPRZER.js} +4 -4
  50. package/dist/{chunk-RUOG5D2C.js → chunk-IUR76K6A.js} +5 -5
  51. package/dist/{chunk-TO6WL3GM.js → chunk-J3FZR3YY.js} +12 -2
  52. package/dist/{chunk-Y4T27COV.js → chunk-J6DFZDFA.js} +4 -4
  53. package/dist/{chunk-E4MAEDPM.js → chunk-J7WJZ6W7.js} +11 -11
  54. package/dist/{chunk-52H5B5TC.js → chunk-JONGANYH.js} +30 -30
  55. package/dist/{chunk-TGPXLY2J.js → chunk-KJCWXUUS.js} +35 -1
  56. package/dist/{chunk-I3R7GKDR.js → chunk-KJN4IOEJ.js} +1 -1
  57. package/dist/{chunk-RPD4ZSB7.js → chunk-KMGPUKFD.js} +12 -12
  58. package/dist/{chunk-OQGFCZJ4.js → chunk-LD7WFTRX.js} +13 -13
  59. package/dist/{chunk-DIULIWKU.js → chunk-LNOMA3MP.js} +3 -3
  60. package/dist/{chunk-HHYAELLJ.js → chunk-MGIWSROG.js} +5 -5
  61. package/dist/{chunk-YLF3PPT5.js → chunk-MQA2YBAH.js} +3 -3
  62. package/dist/{chunk-TVN5N6GY.js → chunk-MTDRLSI7.js} +690 -186
  63. package/dist/{chunk-DQ2NZ7C4.js → chunk-N2IRDBZI.js} +44 -6
  64. package/dist/{chunk-AHDW3GPE.js → chunk-N77WFUL7.js} +22 -22
  65. package/dist/{chunk-NXPS2L6U.js → chunk-N7YNJE5R.js} +7 -7
  66. package/dist/{chunk-7FBF7NPR.js → chunk-NFXP47RV.js} +13 -12
  67. package/dist/{chunk-UY752QSN.js → chunk-NJF2X5XF.js} +17 -17
  68. package/dist/{chunk-WONERJTP.js → chunk-O7HZX7CA.js} +1 -1
  69. package/dist/{chunk-AS44CFQ4.js → chunk-OC7LYAU5.js} +7 -7
  70. package/dist/{chunk-4RERDEXR.js → chunk-OEX24ECI.js} +30 -30
  71. package/dist/{chunk-6VCD4VKZ.js → chunk-OYOB3ZFG.js} +2 -2
  72. package/dist/{chunk-IIXOAGHR.js → chunk-OYTMZXRF.js} +18 -15
  73. package/dist/{chunk-ARFCXG7S.js → chunk-OZJINN4O.js} +2 -2
  74. package/dist/{chunk-34U7PLGE.js → chunk-PCHDGUKT.js} +11 -11
  75. package/dist/{chunk-VCSRSYLF.js → chunk-RJFED73B.js} +34 -36
  76. package/dist/chunk-RTQNRM5X.js +27 -0
  77. package/dist/{chunk-PAK6IDME.js → chunk-S6AMWKPC.js} +2 -2
  78. package/dist/{chunk-U3VGR4VU.js → chunk-T4QZ6FEH.js} +4 -4
  79. package/dist/{chunk-VN2AXLEX.js → chunk-T54VJRAD.js} +54 -12
  80. package/dist/{chunk-ZMOL6RQC.js → chunk-TA5L5KWQ.js} +2 -2
  81. package/dist/{chunk-JOLITGCC.js → chunk-TQFBZVCG.js} +1 -1
  82. package/dist/{chunk-VDBPVIKD.js → chunk-U52SAGRM.js} +1 -1
  83. package/dist/{chunk-LW6XKDZQ.js → chunk-UEAHAMEI.js} +284 -35
  84. package/dist/{chunk-NMABWBZN.js → chunk-UGSMCQ4D.js} +1 -1
  85. package/dist/{chunk-6QIUX4EP.js → chunk-USHG4DLH.js} +7 -7
  86. package/dist/{chunk-LSMJ6KBE.js → chunk-V5MEBST3.js} +16 -16
  87. package/dist/chunk-VGEVL5EQ.js +29 -0
  88. package/dist/{chunk-47D2BO4S.js → chunk-VPWKF3GN.js} +10 -10
  89. package/dist/{chunk-UK3CMEAL.js → chunk-VSMJK3ZJ.js} +1 -1
  90. package/dist/{chunk-22AVIGXS.js → chunk-VYKKMYVT.js} +7 -7
  91. package/dist/{chunk-OS32RNR2.js → chunk-VZHJS6DR.js} +15 -15
  92. package/dist/{chunk-E2WFBRHM.js → chunk-WATC3IQR.js} +3 -3
  93. package/dist/chunk-WPE5FPGR.js +54 -0
  94. package/dist/{chunk-V5PXFSZK.js → chunk-WSEWKCXU.js} +4 -4
  95. package/dist/{chunk-NKOUFPQF.js → chunk-WW5BLB74.js} +2 -2
  96. package/dist/{chunk-PWFHBTSF.js → chunk-XGUL4SLQ.js} +2 -2
  97. package/dist/{chunk-F3P7VQ7H.js → chunk-XHSCVSOL.js} +3 -3
  98. package/dist/{chunk-DFVMIKMQ.js → chunk-YLN4K6WD.js} +45 -9
  99. package/dist/{chunk-VNMT7C64.js → chunk-Z6BB4JLQ.js} +2 -2
  100. package/dist/{chunk-NTHH2J74.js → chunk-Z7QQA2KT.js} +12 -12
  101. package/dist/{chunk-F3AU2TMM.js → chunk-ZETYB3XG.js} +15 -15
  102. package/dist/{chunk-XECLWQZN.js → chunk-ZMOMPX2Z.js} +12 -10
  103. package/dist/{chunk-C2AUYXQH.js → chunk-ZOEYVXSV.js} +4 -4
  104. package/dist/{chunk-TLGFBM3F.js → chunk-ZZUFZUQZ.js} +68 -64
  105. package/dist/index.js +30113 -28398
  106. package/dist/mcp/analyze-cli.js +8 -8
  107. package/dist/mcp/cli.js +37 -37
  108. package/dist/mcp/server.js +257 -158
  109. package/dist/mcp/worker.js +55 -55
  110. package/dist/probes/installer.js +19 -19
  111. package/docs/ast-grep_rules_catalog.md +2 -2
  112. package/docs/configuration.md +9 -2
  113. package/docs/custom-rules.md +25 -2
  114. package/docs/environment-variables.md +34 -6
  115. package/docs/features.md +37 -1
  116. package/docs/globalconfig.md +1 -1
  117. package/docs/lsp-capability-matrix.md +2 -1
  118. package/docs/lsp-idle-eviction.md +1 -1
  119. package/docs/pi-lens-fixer.md +9 -5
  120. package/docs/pi-lens-merge-policy.md +43 -1
  121. package/docs/pi-lens-monitor.md +3 -1
  122. package/docs/pi-lens-reviewer.md +4 -3
  123. package/docs/schema/pi-lens-config-v1.json +530 -0
  124. package/docs/servercapabilities.md +4 -1
  125. package/docs/word-index.md +6 -0
  126. package/package.json +1 -1
  127. package/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  128. package/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  129. package/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  130. package/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  131. package/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  132. package/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  133. package/dist/chunk-54B42YRX.js +0 -27
  134. package/dist/chunk-CGGAIP7J.js +0 -29
  135. package/dist/chunk-HMFXILPV.js +0 -83
  136. package/dist/chunk-T6D4Q4AQ.js +0 -54
@@ -1,29 +1,29 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  getStartupScanMaxSourceFilesDerived
4
- } from "./chunk-LNAKEO63.js";
4
+ } from "./chunk-IUKPRZER.js";
5
5
  import {
6
6
  shouldRecurseIntoDir,
7
7
  walkTreeStackAsync,
8
8
  walkTreeStackSync
9
- } from "./chunk-VHQLPIRJ.js";
9
+ } from "./chunk-H5EV3VMF.js";
10
10
  import {
11
11
  getProjectIgnoreMatcher
12
- } from "./chunk-VN2AXLEX.js";
12
+ } from "./chunk-T54VJRAD.js";
13
13
  import {
14
14
  getDirectoryMarkers,
15
15
  registerWorkspaceTopologyReset
16
- } from "./chunk-VNMT7C64.js";
16
+ } from "./chunk-Z6BB4JLQ.js";
17
17
  import {
18
18
  lazyEnvNumber
19
- } from "./chunk-UK3CMEAL.js";
19
+ } from "./chunk-VSMJK3ZJ.js";
20
20
  import {
21
21
  BoundedLruCache
22
22
  } from "./chunk-ABBOA7UD.js";
23
23
  import {
24
24
  isAtOrAboveHomeDir,
25
25
  normalizeMapKey
26
- } from "./chunk-Q5U6FMDI.js";
26
+ } from "./chunk-G3RLJYA2.js";
27
27
 
28
28
  // dist/clients/startup-scan.js
29
29
  import * as os from "node:os";
@@ -50,6 +50,10 @@ function isStartupScanVerdictFresh(verdict, now = Date.now()) {
50
50
  return true;
51
51
  if (typeof verdict.computedAt !== "number")
52
52
  return false;
53
+ if (verdict.maxProjectFiles !== getStartupScanMaxSourceFilesDerived(verdict.cwd))
54
+ return false;
55
+ if (verdict.maxScanEntries !== getStartupScanMaxEntries())
56
+ return false;
53
57
  return now - verdict.computedAt < getStartupScanVerdictTtlMs();
54
58
  }
55
59
  function findNearestProjectRoot(startDir) {
@@ -160,7 +164,9 @@ function computeStartupScanContext(cwd, options = {}) {
160
164
  projectRoot,
161
165
  canWarmCaches: false,
162
166
  reason: entryBudgetExceeded ? "too-many-entries" : "too-many-source-files",
163
- sourceFileCount
167
+ sourceFileCount,
168
+ maxProjectFiles: maxSourceFiles,
169
+ maxScanEntries
164
170
  };
165
171
  }
166
172
  return {
@@ -233,7 +239,9 @@ async function resolveStartupScanContextAsync(cwd, options = {}) {
233
239
  projectRoot,
234
240
  canWarmCaches: false,
235
241
  reason: entryBudgetExceeded ? "too-many-entries" : "too-many-source-files",
236
- sourceFileCount
242
+ sourceFileCount,
243
+ maxProjectFiles: maxSourceFiles,
244
+ maxScanEntries
237
245
  };
238
246
  } else {
239
247
  result = {
@@ -1,33 +1,33 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  parseSymbolKey
4
- } from "./chunk-NKOUFPQF.js";
4
+ } from "./chunk-WW5BLB74.js";
5
5
  import "./chunk-3MED75HT.js";
6
6
  import {
7
7
  isBuildArtifact
8
- } from "./chunk-6QIUX4EP.js";
9
- import "./chunk-VHQLPIRJ.js";
8
+ } from "./chunk-USHG4DLH.js";
9
+ import "./chunk-H5EV3VMF.js";
10
10
  import {
11
11
  getProjectDataDir
12
- } from "./chunk-VN2AXLEX.js";
12
+ } from "./chunk-T54VJRAD.js";
13
13
  import "./chunk-QYF5S6P6.js";
14
- import "./chunk-5ZEJHV35.js";
14
+ import "./chunk-64LU2OVH.js";
15
15
  import {
16
16
  detectFileRole
17
- } from "./chunk-DQ2NZ7C4.js";
18
- import "./chunk-VNMT7C64.js";
17
+ } from "./chunk-N2IRDBZI.js";
18
+ import "./chunk-Z6BB4JLQ.js";
19
19
  import {
20
20
  writeFileAtomic
21
21
  } from "./chunk-2EECBNC5.js";
22
- import "./chunk-N3YQJI6O.js";
23
- import "./chunk-O6TQT6RI.js";
24
- import "./chunk-5THXD6X5.js";
25
- import "./chunk-UK3CMEAL.js";
22
+ import "./chunk-7ELY2CSM.js";
23
+ import "./chunk-34OCDWOS.js";
24
+ import "./chunk-3PNFWVHT.js";
25
+ import "./chunk-VSMJK3ZJ.js";
26
26
  import "./chunk-LJDODBBZ.js";
27
27
  import "./chunk-ABBOA7UD.js";
28
28
  import {
29
29
  isExternalOrVendorFile
30
- } from "./chunk-Q5U6FMDI.js";
30
+ } from "./chunk-G3RLJYA2.js";
31
31
  import "./chunk-NXL4FFQQ.js";
32
32
 
33
33
  // dist/clients/codebase-model.js
@@ -4,17 +4,17 @@ import {
4
4
  readCargoDependencyNames,
5
5
  readCargoPackageName,
6
6
  readCargoWorkspaceMembers
7
- } from "./chunk-PAK6IDME.js";
7
+ } from "./chunk-S6AMWKPC.js";
8
8
  import {
9
9
  getProjectIgnoreMatcher,
10
10
  isExcludedDirName
11
- } from "./chunk-VN2AXLEX.js";
11
+ } from "./chunk-T54VJRAD.js";
12
12
  import {
13
13
  getWorkspaceManifestMarkers
14
- } from "./chunk-VNMT7C64.js";
14
+ } from "./chunk-Z6BB4JLQ.js";
15
15
  import {
16
16
  normalizeMapKey
17
- } from "./chunk-Q5U6FMDI.js";
17
+ } from "./chunk-G3RLJYA2.js";
18
18
 
19
19
  // dist/clients/review-graph/workspace-modules.js
20
20
  import * as fs from "node:fs";
@@ -2,27 +2,27 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
2
2
  import {
3
3
  calcCyclomaticComplexity,
4
4
  functionFactProvider
5
- } from "./chunk-YLF3PPT5.js";
6
- import "./chunk-JOLITGCC.js";
5
+ } from "./chunk-MQA2YBAH.js";
6
+ import "./chunk-TQFBZVCG.js";
7
7
  import "./chunk-5W3R6LFT.js";
8
- import "./chunk-LW6XKDZQ.js";
8
+ import "./chunk-UEAHAMEI.js";
9
9
  import "./chunk-Z54ZSOBZ.js";
10
- import "./chunk-TGPXLY2J.js";
10
+ import "./chunk-KJCWXUUS.js";
11
11
  import "./chunk-QOZXJ4NA.js";
12
- import "./chunk-NTUJEGDZ.js";
13
- import "./chunk-WONERJTP.js";
14
- import "./chunk-VN2AXLEX.js";
15
- import "./chunk-5ZEJHV35.js";
16
- import "./chunk-DQ2NZ7C4.js";
17
- import "./chunk-VNMT7C64.js";
12
+ import "./chunk-D6YF5HKX.js";
13
+ import "./chunk-O7HZX7CA.js";
14
+ import "./chunk-T54VJRAD.js";
15
+ import "./chunk-64LU2OVH.js";
16
+ import "./chunk-N2IRDBZI.js";
17
+ import "./chunk-Z6BB4JLQ.js";
18
18
  import "./chunk-2EECBNC5.js";
19
- import "./chunk-N3YQJI6O.js";
20
- import "./chunk-O6TQT6RI.js";
21
- import "./chunk-5THXD6X5.js";
22
- import "./chunk-UK3CMEAL.js";
19
+ import "./chunk-7ELY2CSM.js";
20
+ import "./chunk-34OCDWOS.js";
21
+ import "./chunk-3PNFWVHT.js";
22
+ import "./chunk-VSMJK3ZJ.js";
23
23
  import "./chunk-LJDODBBZ.js";
24
24
  import "./chunk-ABBOA7UD.js";
25
- import "./chunk-Q5U6FMDI.js";
25
+ import "./chunk-G3RLJYA2.js";
26
26
  import "./chunk-NXL4FFQQ.js";
27
27
  export {
28
28
  calcCyclomaticComplexity,
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  getWordIndexMaxFilesDerived
4
- } from "./chunk-LNAKEO63.js";
4
+ } from "./chunk-IUKPRZER.js";
5
5
  import {
6
6
  PathKeyedMap
7
7
  } from "./chunk-Z3CCVDUB.js";
@@ -15,24 +15,27 @@ import {
15
15
  } from "./chunk-QYF5S6P6.js";
16
16
  import {
17
17
  KIND_EXTENSIONS
18
- } from "./chunk-5ZEJHV35.js";
18
+ } from "./chunk-64LU2OVH.js";
19
19
  import {
20
20
  isTestFileName
21
- } from "./chunk-DQ2NZ7C4.js";
21
+ } from "./chunk-N2IRDBZI.js";
22
22
  import {
23
23
  incrementDegradationCount
24
- } from "./chunk-N3YQJI6O.js";
24
+ } from "./chunk-7ELY2CSM.js";
25
+ import {
26
+ logLatency
27
+ } from "./chunk-3PNFWVHT.js";
25
28
  import {
26
29
  createNdjsonLogger,
27
30
  getGlobalPiLensLogDir,
28
31
  getMaxLogSizeMB,
29
32
  isTestMode
30
- } from "./chunk-UK3CMEAL.js";
33
+ } from "./chunk-VSMJK3ZJ.js";
31
34
  import {
32
35
  isAtOrAboveHomeDir,
33
36
  normalizeEphemeralMapKey,
34
37
  normalizeFilePath
35
- } from "./chunk-Q5U6FMDI.js";
38
+ } from "./chunk-G3RLJYA2.js";
36
39
 
37
40
  // dist/clients/word-index.js
38
41
  import * as fs from "node:fs";
@@ -858,7 +861,7 @@ async function updateWordIndexDocumentAsyncUnsafe(index, doc, shouldContinue) {
858
861
  }
859
862
  var WORD_INDEX_MAX_BYTES = 512 * 1024;
860
863
  async function collectWordIndexDocs(root, shouldContinue = () => true, preflightFiles) {
861
- const { collectSourceFilesAsync } = await import("./chunk-E4MAEDPM.js");
864
+ const { collectSourceFilesAsync } = await import("./chunk-J7WJZ6W7.js");
862
865
  const maxFiles = preflightFiles?.length ?? getWordIndexMaxFilesDerived(root);
863
866
  const files = preflightFiles ? preflightFiles.map((file) => file.path) : await collectSourceFilesAsync(root, {
864
867
  maxFiles,
@@ -907,7 +910,7 @@ async function refreshWordIndexIncrementally(index, root, shouldContinue = () =>
907
910
  timings: { sourceWalkMs: 0, statWalkMs: 0, refreshReadsMs: 0 }
908
911
  };
909
912
  }
910
- const { collectSourceFilesAsync } = await import("./chunk-E4MAEDPM.js");
913
+ const { collectSourceFilesAsync } = await import("./chunk-J7WJZ6W7.js");
911
914
  const maxFiles = getWordIndexMaxFilesDerived(root);
912
915
  const sourceWalkStartMs = Date.now();
913
916
  const walked = await collectSourceFilesAsync(root, {
@@ -1270,6 +1273,44 @@ function recordPersistedWordIndexWireBytes(serialized, wireBytes) {
1270
1273
  if (cache?.serialized === serialized)
1271
1274
  cache.wireBytes = wireBytes;
1272
1275
  }
1276
+ var DEFAULT_WORD_INDEX_MEMO_BACKSTOP_MS = 10 * 6e4;
1277
+ var MAX_TIMER_DELAY_MS = 2147483647;
1278
+ function wordIndexMemoBackstopMs() {
1279
+ const raw = Number(process.env.PI_LENS_WORD_INDEX_MEMO_BACKSTOP_MS);
1280
+ return Number.isFinite(raw) && raw > 0 ? Math.min(raw, MAX_TIMER_DELAY_MS) : DEFAULT_WORD_INDEX_MEMO_BACKSTOP_MS;
1281
+ }
1282
+ function retainSerializedWordIndex(index, entry) {
1283
+ const prior = serializedWordIndexCaches.get(index);
1284
+ if (prior)
1285
+ clearTimeout(prior.backstopTimer);
1286
+ serializedWordIndexCaches.set(index, entry);
1287
+ const ref = new WeakRef(index);
1288
+ const timer = setTimeout(() => {
1289
+ const target = ref.deref();
1290
+ if (target)
1291
+ releaseWordIndexMemo(target, "backstop");
1292
+ }, wordIndexMemoBackstopMs());
1293
+ timer.unref?.();
1294
+ entry.backstopTimer = timer;
1295
+ }
1296
+ function releaseWordIndexMemo(index, trigger) {
1297
+ const memo = serializedWordIndexCaches.get(index);
1298
+ if (!memo)
1299
+ return;
1300
+ clearTimeout(memo.backstopTimer);
1301
+ serializedWordIndexCaches.delete(index);
1302
+ logLatency({
1303
+ type: "phase",
1304
+ phase: "word_index_memo_released",
1305
+ filePath: "<pi-lens>",
1306
+ durationMs: 0,
1307
+ metadata: { trigger, files: memo.serialized.files.length }
1308
+ });
1309
+ }
1310
+ function releaseWordIndexMemoAtSettle(index) {
1311
+ releaseWordIndexMemo(index, "settle");
1312
+ index.releaseMemoAfterPersist = true;
1313
+ }
1273
1314
  var _lastSerializeWork;
1274
1315
  function getLastWordIndexSerializeWork() {
1275
1316
  return _lastSerializeWork;
@@ -1431,7 +1472,7 @@ function serializeWordIndexIncrementally(index, cache) {
1431
1472
  function serializeWordIndex(index) {
1432
1473
  const prior = serializedWordIndexCaches.get(index);
1433
1474
  const cache = prior ? serializeWordIndexIncrementally(index, prior) : serializeWordIndexFull(index);
1434
- serializedWordIndexCaches.set(index, cache);
1475
+ retainSerializedWordIndex(index, cache);
1435
1476
  serializedWordIndexSources.set(cache.serialized, index);
1436
1477
  index.dirtyFiles?.clear();
1437
1478
  return cache.serialized;
@@ -1663,7 +1704,7 @@ function deserializeWordIndex(data) {
1663
1704
  }
1664
1705
  }
1665
1706
  if (canonical) {
1666
- serializedWordIndexCaches.set(index, {
1707
+ retainSerializedWordIndex(index, {
1667
1708
  serialized: data,
1668
1709
  slotByFileId,
1669
1710
  tokensByFile,
@@ -1702,7 +1743,7 @@ function triggerBackgroundWordIndexBuild(cwd, dbg, options = {}) {
1702
1743
  void (async () => {
1703
1744
  const startMs = Date.now();
1704
1745
  try {
1705
- const { loadProjectSnapshot, saveProjectSnapshot, PROJECT_SNAPSHOT_VERSION } = await import("./chunk-AJXODZY6.js");
1746
+ const { loadProjectSnapshot, saveProjectSnapshot, PROJECT_SNAPSHOT_VERSION } = await import("./chunk-ALQRYH6O.js");
1706
1747
  const docs = await collectWordIndexDocs(key);
1707
1748
  const index = await buildWordIndexAsync(docs);
1708
1749
  const existing = loadProjectSnapshot(key);
@@ -1768,7 +1809,7 @@ function getWordIndexPersistScheduler() {
1768
1809
  async function writeWordIndexSnapshot(cwd, index, dbg) {
1769
1810
  const persistStartedAt = Date.now();
1770
1811
  try {
1771
- const { loadProjectSnapshot, saveProjectSnapshot, PROJECT_SNAPSHOT_VERSION } = await import("./chunk-AJXODZY6.js");
1812
+ const { loadProjectSnapshot, saveProjectSnapshot, PROJECT_SNAPSHOT_VERSION } = await import("./chunk-ALQRYH6O.js");
1772
1813
  const existing = loadProjectSnapshot(cwd);
1773
1814
  const snapshot = existing ?? {
1774
1815
  version: PROJECT_SNAPSHOT_VERSION,
@@ -1785,6 +1826,10 @@ async function writeWordIndexSnapshot(cwd, index, dbg) {
1785
1826
  snapshot.wordIndex = serializeWordIndex(index);
1786
1827
  const serializeMs = performance.now() - serializeStartedAt;
1787
1828
  saveProjectSnapshot(cwd, snapshot);
1829
+ if (index.releaseMemoAfterPersist) {
1830
+ index.releaseMemoAfterPersist = false;
1831
+ releaseWordIndexMemo(index, "post_settle_persist");
1832
+ }
1788
1833
  const writeMs = performance.now() - serializeStartedAt - serializeMs;
1789
1834
  dbg?.(`word-index persist: ${index.docCount} files, ${index.postings.size} tokens`);
1790
1835
  logWordIndex({
@@ -1816,6 +1861,7 @@ async function writeWordIndexSnapshot(cwd, index, dbg) {
1816
1861
  }
1817
1862
  function scheduleWordIndexPersist(cwd, index, dbg) {
1818
1863
  const key = path2.resolve(cwd);
1864
+ index.releaseMemoAfterPersist = false;
1819
1865
  getWordIndexPersistScheduler().schedule(key, { cwd: key, index, dbg });
1820
1866
  }
1821
1867
  function flushWordIndexPersistsForTests() {
@@ -1849,6 +1895,7 @@ export {
1849
1895
  WORD_INDEX_FORMAT_VERSION,
1850
1896
  getWordIndexWireBytes,
1851
1897
  recordPersistedWordIndexWireBytes,
1898
+ releaseWordIndexMemoAtSettle,
1852
1899
  getLastWordIndexSerializeWork,
1853
1900
  serializeWordIndex,
1854
1901
  deserializeWordIndex,
@@ -1,11 +1,11 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  logExtension
4
- } from "./chunk-O6TQT6RI.js";
4
+ } from "./chunk-34OCDWOS.js";
5
5
  import {
6
6
  DEPRECATED_CONFIG_SURFACES,
7
7
  logLatency
8
- } from "./chunk-5THXD6X5.js";
8
+ } from "./chunk-3PNFWVHT.js";
9
9
  import {
10
10
  PROCESS_SINGLETON_RESET_KIND,
11
11
  getProbeHomeRedirectEvent,
@@ -16,7 +16,7 @@ import {
16
16
  getSinkWriteFailures,
17
17
  resetSinkRotations,
18
18
  resetSinkWriteFailures
19
- } from "./chunk-UK3CMEAL.js";
19
+ } from "./chunk-VSMJK3ZJ.js";
20
20
 
21
21
  // dist/clients/string-utils.js
22
22
  function compareOrdinal(a, b) {
@@ -87,13 +87,15 @@ function recordDegradationOnce(record) {
87
87
  const subject = subjectForLedger(record.subject);
88
88
  const key = `${kind}\0${subject}`;
89
89
  if (onceKeys.has(key))
90
- return;
90
+ return false;
91
91
  onceKeys.add(key);
92
92
  if (recordDegradation({ kind, subject, reason: record.reason })) {
93
93
  logDurableDegradation(kind, subject, 1, record.metadata, record.code);
94
94
  }
95
+ return true;
95
96
  } catch (error) {
96
97
  debugLedgerFailure("record-once", error);
98
+ return false;
97
99
  }
98
100
  }
99
101
  function incrementDegradationCount(record) {
@@ -793,6 +795,7 @@ var TOOL_REGISTRY = [
793
795
  }
794
796
  ];
795
797
  var LENS_TOOL_NAMES = TOOL_REGISTRY.map((tool) => tool.name);
798
+ var PI_LENS_TOOL_NAMES = TOOL_REGISTRY.flatMap((tool) => tool.piName === void 0 ? [] : [tool.piName]);
796
799
  function resolveLensToolName(name, host = "pi") {
797
800
  const entry = TOOL_REGISTRY.find((tool) => tool.name === name || tool.piName === name || tool.mcpName === name);
798
801
  if (!entry)
@@ -8,23 +8,23 @@ import {
8
8
  getDefaultStartupTools,
9
9
  resolveLanguageRootForFile,
10
10
  rootMarkersForFile
11
- } from "./chunk-22AVIGXS.js";
12
- import "./chunk-GVXA6CCE.js";
13
- import "./chunk-6QIUX4EP.js";
14
- import "./chunk-VHQLPIRJ.js";
15
- import "./chunk-VN2AXLEX.js";
11
+ } from "./chunk-VYKKMYVT.js";
12
+ import "./chunk-BNKLYOOO.js";
13
+ import "./chunk-USHG4DLH.js";
14
+ import "./chunk-H5EV3VMF.js";
15
+ import "./chunk-T54VJRAD.js";
16
16
  import "./chunk-QYF5S6P6.js";
17
- import "./chunk-5ZEJHV35.js";
18
- import "./chunk-DQ2NZ7C4.js";
19
- import "./chunk-VNMT7C64.js";
17
+ import "./chunk-64LU2OVH.js";
18
+ import "./chunk-N2IRDBZI.js";
19
+ import "./chunk-Z6BB4JLQ.js";
20
20
  import "./chunk-2EECBNC5.js";
21
- import "./chunk-N3YQJI6O.js";
22
- import "./chunk-O6TQT6RI.js";
23
- import "./chunk-5THXD6X5.js";
24
- import "./chunk-UK3CMEAL.js";
21
+ import "./chunk-7ELY2CSM.js";
22
+ import "./chunk-34OCDWOS.js";
23
+ import "./chunk-3PNFWVHT.js";
24
+ import "./chunk-VSMJK3ZJ.js";
25
25
  import "./chunk-LJDODBBZ.js";
26
26
  import "./chunk-ABBOA7UD.js";
27
- import "./chunk-Q5U6FMDI.js";
27
+ import "./chunk-G3RLJYA2.js";
28
28
  import "./chunk-NXL4FFQQ.js";
29
29
  export {
30
30
  SUPPORTED_FILE_KINDS,
@@ -4,75 +4,75 @@ import {
4
4
  } from "./chunk-7U2IDNXN.js";
5
5
  import {
6
6
  formatToolFailure
7
- } from "./chunk-ZMOL6RQC.js";
7
+ } from "./chunk-TA5L5KWQ.js";
8
8
  import {
9
9
  spawnFailedWithNoOutput
10
- } from "./chunk-I7SPGOWI.js";
10
+ } from "./chunk-FGALODG3.js";
11
11
  import {
12
12
  createAvailabilityChecker,
13
13
  findManagedNodeToolBinary,
14
14
  getManagedToolEnvironment,
15
15
  resolveAvailableOrInstall
16
- } from "./chunk-7FBF7NPR.js";
17
- import "./chunk-HHYAELLJ.js";
16
+ } from "./chunk-NFXP47RV.js";
17
+ import "./chunk-MGIWSROG.js";
18
18
  import {
19
19
  canonicalDirectory,
20
20
  listNestedLinkedWorktreeRoots
21
- } from "./chunk-3I5QFT3N.js";
22
- import "./chunk-B3I2UUT4.js";
23
- import "./chunk-DIULIWKU.js";
24
- import "./chunk-VDBPVIKD.js";
25
- import "./chunk-TGPXLY2J.js";
21
+ } from "./chunk-IMSQR4WO.js";
22
+ import "./chunk-IQZXOZ7S.js";
23
+ import "./chunk-LNOMA3MP.js";
24
+ import "./chunk-U52SAGRM.js";
25
+ import "./chunk-KJCWXUUS.js";
26
26
  import "./chunk-QOZXJ4NA.js";
27
- import "./chunk-PAK6IDME.js";
28
- import "./chunk-GUOGVTCQ.js";
29
- import "./chunk-AJVLWNFN.js";
30
- import "./chunk-YGVYKNSN.js";
31
- import "./chunk-LNAKEO63.js";
27
+ import "./chunk-S6AMWKPC.js";
28
+ import "./chunk-F5VLZHUW.js";
29
+ import "./chunk-AXKPQ6ZI.js";
30
+ import "./chunk-7BX5DWSA.js";
31
+ import "./chunk-IUKPRZER.js";
32
32
  import "./chunk-Z3CCVDUB.js";
33
33
  import "./chunk-2BEMIWEW.js";
34
34
  import {
35
35
  logSessionStart
36
- } from "./chunk-OQGFCZJ4.js";
37
- import "./chunk-RUOG5D2C.js";
36
+ } from "./chunk-LD7WFTRX.js";
37
+ import "./chunk-IUR76K6A.js";
38
38
  import {
39
39
  findLocalBinUpwards
40
- } from "./chunk-U3VGR4VU.js";
41
- import "./chunk-NTUJEGDZ.js";
42
- import "./chunk-EOKRQ3SA.js";
40
+ } from "./chunk-T4QZ6FEH.js";
41
+ import "./chunk-D6YF5HKX.js";
42
+ import "./chunk-CMU4RMJB.js";
43
43
  import {
44
44
  createAvailabilityLatch,
45
45
  describeUnavailability
46
- } from "./chunk-WONERJTP.js";
47
- import "./chunk-22AVIGXS.js";
48
- import "./chunk-GVXA6CCE.js";
49
- import "./chunk-6QIUX4EP.js";
50
- import "./chunk-VHQLPIRJ.js";
46
+ } from "./chunk-O7HZX7CA.js";
47
+ import "./chunk-VYKKMYVT.js";
48
+ import "./chunk-BNKLYOOO.js";
49
+ import "./chunk-USHG4DLH.js";
50
+ import "./chunk-H5EV3VMF.js";
51
51
  import {
52
52
  getProjectDataDir,
53
53
  safeSpawnAsync
54
- } from "./chunk-VN2AXLEX.js";
54
+ } from "./chunk-T54VJRAD.js";
55
55
  import "./chunk-BW5KFIQC.js";
56
56
  import "./chunk-QYF5S6P6.js";
57
- import "./chunk-5ZEJHV35.js";
58
- import "./chunk-DQ2NZ7C4.js";
59
- import "./chunk-VNMT7C64.js";
57
+ import "./chunk-64LU2OVH.js";
58
+ import "./chunk-N2IRDBZI.js";
59
+ import "./chunk-Z6BB4JLQ.js";
60
60
  import "./chunk-2EECBNC5.js";
61
61
  import {
62
62
  incrementDegradationCount
63
- } from "./chunk-N3YQJI6O.js";
63
+ } from "./chunk-7ELY2CSM.js";
64
64
  import {
65
65
  createSubsystemLogger
66
- } from "./chunk-O6TQT6RI.js";
67
- import "./chunk-5THXD6X5.js";
68
- import "./chunk-UK3CMEAL.js";
66
+ } from "./chunk-34OCDWOS.js";
67
+ import "./chunk-3PNFWVHT.js";
68
+ import "./chunk-VSMJK3ZJ.js";
69
69
  import "./chunk-LJDODBBZ.js";
70
70
  import "./chunk-ABBOA7UD.js";
71
71
  import {
72
72
  findNearestMarkerRoot,
73
73
  normalizeEphemeralMapKey,
74
74
  normalizeFilePath
75
- } from "./chunk-Q5U6FMDI.js";
75
+ } from "./chunk-G3RLJYA2.js";
76
76
  import "./chunk-NXL4FFQQ.js";
77
77
 
78
78
  // dist/clients/knip-client.js
@@ -44,25 +44,25 @@ import {
44
44
  setProjectSnapshotPromotionSeamForTests,
45
45
  terminateProjectSnapshotPersistWorkerForTests,
46
46
  waitForProjectSnapshotPersistsForTests
47
- } from "./chunk-AJVLWNFN.js";
48
- import "./chunk-YGVYKNSN.js";
49
- import "./chunk-LNAKEO63.js";
47
+ } from "./chunk-AXKPQ6ZI.js";
48
+ import "./chunk-7BX5DWSA.js";
49
+ import "./chunk-IUKPRZER.js";
50
50
  import "./chunk-Z3CCVDUB.js";
51
51
  import "./chunk-2BEMIWEW.js";
52
- import "./chunk-VN2AXLEX.js";
52
+ import "./chunk-T54VJRAD.js";
53
53
  import "./chunk-BW5KFIQC.js";
54
54
  import "./chunk-QYF5S6P6.js";
55
- import "./chunk-5ZEJHV35.js";
56
- import "./chunk-DQ2NZ7C4.js";
57
- import "./chunk-VNMT7C64.js";
55
+ import "./chunk-64LU2OVH.js";
56
+ import "./chunk-N2IRDBZI.js";
57
+ import "./chunk-Z6BB4JLQ.js";
58
58
  import "./chunk-2EECBNC5.js";
59
- import "./chunk-N3YQJI6O.js";
60
- import "./chunk-O6TQT6RI.js";
61
- import "./chunk-5THXD6X5.js";
62
- import "./chunk-UK3CMEAL.js";
59
+ import "./chunk-7ELY2CSM.js";
60
+ import "./chunk-34OCDWOS.js";
61
+ import "./chunk-3PNFWVHT.js";
62
+ import "./chunk-VSMJK3ZJ.js";
63
63
  import "./chunk-LJDODBBZ.js";
64
64
  import "./chunk-ABBOA7UD.js";
65
- import "./chunk-Q5U6FMDI.js";
65
+ import "./chunk-G3RLJYA2.js";
66
66
  import "./chunk-NXL4FFQQ.js";
67
67
  export {
68
68
  PROJECT_SNAPSHOT_MAX_WARM_ROOTS,
@@ -3,7 +3,7 @@ import {
3
3
  deserializeWordIndex,
4
4
  recordPersistedWordIndexWireBytes,
5
5
  serializeWordIndex
6
- } from "./chunk-YGVYKNSN.js";
6
+ } from "./chunk-7BX5DWSA.js";
7
7
  import {
8
8
  fingerprintProjectSnapshotJson
9
9
  } from "./chunk-2BEMIWEW.js";
@@ -11,22 +11,22 @@ import {
11
11
  getProjectDataDir,
12
12
  isStaleStageFile,
13
13
  withGenerationLockSync
14
- } from "./chunk-VN2AXLEX.js";
14
+ } from "./chunk-T54VJRAD.js";
15
15
  import {
16
16
  writeFileAtomic
17
17
  } from "./chunk-2EECBNC5.js";
18
18
  import {
19
19
  incrementDegradationCount
20
- } from "./chunk-N3YQJI6O.js";
20
+ } from "./chunk-7ELY2CSM.js";
21
21
  import {
22
22
  logLatency
23
- } from "./chunk-5THXD6X5.js";
23
+ } from "./chunk-3PNFWVHT.js";
24
24
  import {
25
25
  BoundedFifoMap
26
26
  } from "./chunk-ABBOA7UD.js";
27
27
  import {
28
28
  normalizeMapKey
29
- } from "./chunk-Q5U6FMDI.js";
29
+ } from "./chunk-G3RLJYA2.js";
30
30
 
31
31
  // dist/clients/project-snapshot.js
32
32
  import * as fs3 from "node:fs";
@@ -23,17 +23,17 @@ import {
23
23
  safeSpawnAsync,
24
24
  safeSpawnBatch,
25
25
  setAmbientAbortSignal
26
- } from "./chunk-VN2AXLEX.js";
27
- import "./chunk-DQ2NZ7C4.js";
28
- import "./chunk-VNMT7C64.js";
26
+ } from "./chunk-T54VJRAD.js";
27
+ import "./chunk-N2IRDBZI.js";
28
+ import "./chunk-Z6BB4JLQ.js";
29
29
  import "./chunk-2EECBNC5.js";
30
- import "./chunk-N3YQJI6O.js";
31
- import "./chunk-O6TQT6RI.js";
32
- import "./chunk-5THXD6X5.js";
33
- import "./chunk-UK3CMEAL.js";
30
+ import "./chunk-7ELY2CSM.js";
31
+ import "./chunk-34OCDWOS.js";
32
+ import "./chunk-3PNFWVHT.js";
33
+ import "./chunk-VSMJK3ZJ.js";
34
34
  import "./chunk-LJDODBBZ.js";
35
35
  import "./chunk-ABBOA7UD.js";
36
- import "./chunk-Q5U6FMDI.js";
36
+ import "./chunk-G3RLJYA2.js";
37
37
  import "./chunk-NXL4FFQQ.js";
38
38
  export {
39
39
  SpawnFailureError,