pi-lens 4.4.1 → 4.4.3

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 (140) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/config/dependency-cruiser-eager-allowlist.json +3 -1
  3. package/dist/{chunk-BJF25SUG.js → chunk-23WOO7TX.js} +11 -10
  4. package/dist/{chunk-WATC3IQR.js → chunk-2B73ZPOK.js} +3 -3
  5. package/dist/{chunk-N2IRDBZI.js → chunk-2BBLFX75.js} +101 -11
  6. package/dist/{chunk-TA5L5KWQ.js → chunk-2CD5RS6M.js} +2 -2
  7. package/dist/{chunk-3TTPKMEF.js → chunk-2VUQMUMT.js} +38 -37
  8. package/dist/{chunk-5JHXUETW.js → chunk-3EFKIGZN.js} +3 -3
  9. package/dist/chunk-3JNKMP3B.js +17 -0
  10. package/dist/{chunk-6P54TMWL.js → chunk-3VPVG5SU.js} +6 -6
  11. package/dist/{chunk-ZETYB3XG.js → chunk-3W7IEVVL.js} +44 -28
  12. package/dist/chunk-3YN6V5TV.js +85 -0
  13. package/dist/chunk-466Z26MG.js +30 -0
  14. package/dist/{chunk-PCHDGUKT.js → chunk-4UNXBNE2.js} +12 -11
  15. package/dist/{chunk-J7WJZ6W7.js → chunk-4W4VLAPJ.js} +12 -11
  16. package/dist/{chunk-F5VLZHUW.js → chunk-52FUZI6K.js} +4 -2
  17. package/dist/{chunk-H5EV3VMF.js → chunk-5NGR67U5.js} +2 -2
  18. package/dist/{chunk-CBD2B5CP.js → chunk-5UCAH366.js} +21 -20
  19. package/dist/{chunk-BHWHXMQ2.js → chunk-67WMNWEE.js} +9 -8
  20. package/dist/{chunk-USHG4DLH.js → chunk-6C7JWPCP.js} +7 -7
  21. package/dist/{chunk-VPWKF3GN.js → chunk-6GFRNVYR.js} +11 -10
  22. package/dist/{chunk-3JL6IFD7.js → chunk-6SDEP3AJ.js} +9 -8
  23. package/dist/{chunk-NJF2X5XF.js → chunk-6STA6Z7I.js} +19 -17
  24. package/dist/{chunk-KJCWXUUS.js → chunk-724UL2TJ.js} +6 -4
  25. package/dist/{chunk-MQA2YBAH.js → chunk-76MWC2K6.js} +3 -3
  26. package/dist/{chunk-YLN4K6WD.js → chunk-77M37OKR.js} +10 -8
  27. package/dist/{chunk-XHSCVSOL.js → chunk-7DYBLXYA.js} +3 -3
  28. package/dist/{chunk-OC7LYAU5.js → chunk-AB3YYG6N.js} +24 -10
  29. package/dist/{chunk-LD7WFTRX.js → chunk-ACXEQZOU.js} +16 -16
  30. package/dist/{chunk-VSMJK3ZJ.js → chunk-AOHZU2BM.js} +1 -1
  31. package/dist/{chunk-T4QZ6FEH.js → chunk-AW7R2GWG.js} +65 -8
  32. package/dist/{chunk-GAYGGICG.js → chunk-BKE7E7TC.js} +10 -9
  33. package/dist/{chunk-EUT3B22Y.js → chunk-BRGDSBJE.js} +13 -12
  34. package/dist/{chunk-T54VJRAD.js → chunk-C34ZXZ7O.js} +55 -11
  35. package/dist/{chunk-UGSMCQ4D.js → chunk-CHOW74WE.js} +1 -1
  36. package/dist/{chunk-H2W2AXD3.js → chunk-CMMHNUZ2.js} +66 -58
  37. package/dist/chunk-CSHFH5IN.js +17 -0
  38. package/dist/chunk-EC47DWFA.js +56 -0
  39. package/dist/{chunk-KJN4IOEJ.js → chunk-EJIUXPBX.js} +1 -1
  40. package/dist/{chunk-IQZXOZ7S.js → chunk-EU63SDCG.js} +720 -334
  41. package/dist/{chunk-LNOMA3MP.js → chunk-FCSOVF55.js} +107 -3
  42. package/dist/{chunk-CFYISHUW.js → chunk-FLKWCIZH.js} +8 -5
  43. package/dist/{chunk-OYTMZXRF.js → chunk-FMSO6RDZ.js} +16 -14
  44. package/dist/{chunk-IUKPRZER.js → chunk-GAEGEPOC.js} +2 -2
  45. package/dist/{chunk-6XX5HCLK.js → chunk-GBPP5P7X.js} +4 -4
  46. package/dist/{chunk-TQFBZVCG.js → chunk-GXW6K4YJ.js} +1 -1
  47. package/dist/{chunk-ZZUFZUQZ.js → chunk-H6MF6EVN.js} +331 -107
  48. package/dist/{chunk-3JSEWUWI.js → chunk-IBGIOBEE.js} +3 -3
  49. package/dist/chunk-IZSHAIJ7.js +26 -0
  50. package/dist/{chunk-7ELY2CSM.js → chunk-JAU72XNY.js} +16 -14
  51. package/dist/chunk-JMYYOTQG.js +77 -0
  52. package/dist/{chunk-ELVWJYRV.js → chunk-JSQFTSC6.js} +12 -11
  53. package/dist/{chunk-J6DFZDFA.js → chunk-KBG47GHP.js} +4 -4
  54. package/dist/chunk-KDERNTCQ.js +28 -0
  55. package/dist/chunk-KSX3TXSZ.js +69 -0
  56. package/dist/{chunk-XGUL4SLQ.js → chunk-L3BLXZG7.js} +2 -2
  57. package/dist/chunk-LOP6GRPH.js +31 -0
  58. package/dist/{chunk-MTDRLSI7.js → chunk-M6HSLBWY.js} +1064 -986
  59. package/dist/chunk-MQLUAEOC.js +162 -0
  60. package/dist/{chunk-3MRXIJ6I.js → chunk-MRXKYPCS.js} +2 -2
  61. package/dist/{chunk-D65GOCJB.js → chunk-MXGY6KPT.js} +19 -16
  62. package/dist/{chunk-G3RLJYA2.js → chunk-N2H3ZPZY.js} +47 -1
  63. package/dist/{chunk-HREZQCT3.js → chunk-N3X6Q4YT.js} +3 -3
  64. package/dist/{chunk-HSIRMK2D.js → chunk-OCAGUNBC.js} +15 -15
  65. package/dist/{chunk-ZOEYVXSV.js → chunk-OXXKQCSV.js} +6 -6
  66. package/dist/{chunk-S6AMWKPC.js → chunk-P7266HLM.js} +2 -2
  67. package/dist/{chunk-64LU2OVH.js → chunk-PHDMFAKM.js} +12 -2
  68. package/dist/{chunk-IMSQR4WO.js → chunk-PNQDPDRC.js} +1 -1
  69. package/dist/{chunk-IUR76K6A.js → chunk-Q7DUK4LX.js} +5 -5
  70. package/dist/{chunk-CULQYFLU.js → chunk-QGQ5CCCG.js} +2 -2
  71. package/dist/{chunk-UEAHAMEI.js → chunk-QHJ6DQ2R.js} +11 -11
  72. package/dist/{chunk-BNKLYOOO.js → chunk-QILIYSJF.js} +1 -1
  73. package/dist/{chunk-VYKKMYVT.js → chunk-QOBUHWHX.js} +11 -6
  74. package/dist/{chunk-3PNFWVHT.js → chunk-QQNQ7SJW.js} +2 -75
  75. package/dist/{chunk-7M4T5N3V.js → chunk-R3PCY3YS.js} +14 -13
  76. package/dist/{chunk-MGIWSROG.js → chunk-RPLINGVB.js} +7 -7
  77. package/dist/{chunk-CMU4RMJB.js → chunk-RWWYJ623.js} +10 -1
  78. package/dist/{chunk-3FERWMCH.js → chunk-RXCOMYPY.js} +27 -26
  79. package/dist/{chunk-7BX5DWSA.js → chunk-SAEFPSB6.js} +11 -11
  80. package/dist/{chunk-N7YNJE5R.js → chunk-SQ4TVJBR.js} +10 -10
  81. package/dist/{chunk-DMS52BEP.js → chunk-SS36ZX4J.js} +9 -7
  82. package/dist/{chunk-JONGANYH.js → chunk-T6CPIZNT.js} +32 -30
  83. package/dist/{chunk-6UYA642J.js → chunk-TYM6OUIT.js} +13 -12
  84. package/dist/{chunk-ALQRYH6O.js → chunk-UXGETRP4.js} +13 -12
  85. package/dist/{chunk-FGALODG3.js → chunk-UZ3TUTRV.js} +1 -1
  86. package/dist/{chunk-J3FZR3YY.js → chunk-VCHXCQFG.js} +3 -3
  87. package/dist/{chunk-3P4PF2BX.js → chunk-VCO24T4L.js} +34 -22
  88. package/dist/{chunk-O7HZX7CA.js → chunk-VRZP76YM.js} +1 -1
  89. package/dist/{chunk-VZHJS6DR.js → chunk-VSSBEUFT.js} +16 -15
  90. package/dist/{chunk-U52SAGRM.js → chunk-VWCXW2E7.js} +1 -1
  91. package/dist/{chunk-WW5BLB74.js → chunk-WOA4LN2R.js} +2 -2
  92. package/dist/{chunk-ZMOMPX2Z.js → chunk-WU567RSC.js} +11 -10
  93. package/dist/{chunk-N77WFUL7.js → chunk-XAGLWMJ4.js} +23 -22
  94. package/dist/{chunk-WSEWKCXU.js → chunk-XCJN5IJU.js} +4 -4
  95. package/dist/{chunk-IR6XFA5P.js → chunk-XIJZVPD5.js} +16 -14
  96. package/dist/{chunk-OYOB3ZFG.js → chunk-XMSXXAHW.js} +2 -2
  97. package/dist/{chunk-34OCDWOS.js → chunk-XTMJ7XDT.js} +1 -1
  98. package/dist/{chunk-Z6BB4JLQ.js → chunk-XVF2VVXP.js} +5 -3
  99. package/dist/{chunk-AFZYMAIV.js → chunk-YIUAVF7E.js} +37 -35
  100. package/dist/{chunk-NFXP47RV.js → chunk-YSZNHOBY.js} +85 -31
  101. package/dist/{chunk-V5MEBST3.js → chunk-YYOIQFRS.js} +21 -21
  102. package/dist/chunk-Z527N6YQ.js +28 -0
  103. package/dist/{chunk-D6YF5HKX.js → chunk-ZANLILYD.js} +22 -2
  104. package/dist/{chunk-2UMYMRI3.js → chunk-ZGDGW2V3.js} +2 -2
  105. package/dist/{chunk-6B5I6ICN.js → chunk-ZHFZWTZV.js} +12 -11
  106. package/dist/{chunk-OEX24ECI.js → chunk-ZWFS3OEF.js} +51 -41
  107. package/dist/{chunk-AXKPQ6ZI.js → chunk-ZXYDQ3TZ.js} +5 -5
  108. package/dist/index.js +73783 -71033
  109. package/dist/mcp/analyze-cli.js +18 -8
  110. package/dist/mcp/cli.js +48 -37
  111. package/dist/mcp/server.js +568 -397
  112. package/dist/mcp/worker.js +67 -55
  113. package/dist/probes/installer.js +20 -19
  114. package/docs/astplayground.md +1 -1
  115. package/docs/configuration.md +29 -0
  116. package/docs/dependencies.md +3 -0
  117. package/docs/features.md +2 -2
  118. package/docs/globalconfig.md +2 -0
  119. package/docs/language-coverage.md +2 -1
  120. package/docs/lsp-capability-matrix.md +29 -7
  121. package/docs/lsp-idle-eviction.md +38 -47
  122. package/docs/pi-lens-fixer.md +4 -0
  123. package/docs/pi-lens-merge-policy.md +17 -4
  124. package/docs/pi-lens-retro.md +2 -1
  125. package/docs/pi-lens-reviewer.md +18 -0
  126. package/docs/pi-lens-subagent.md +7 -0
  127. package/docs/real-harness.md +17 -0
  128. package/docs/schema/pi-lens-config-v1.json +37 -2
  129. package/docs/servercapabilities.md +15 -4
  130. package/docs/settings.md +2 -1
  131. package/package.json +1 -1
  132. package/dist/chunk-2FQ62SPM.js +0 -83
  133. package/dist/chunk-7AXO3ZDF.js +0 -30
  134. package/dist/chunk-KMGPUKFD.js +0 -25
  135. package/dist/chunk-OZJINN4O.js +0 -84
  136. package/dist/chunk-RJFED73B.js +0 -79
  137. package/dist/chunk-RTQNRM5X.js +0 -27
  138. package/dist/chunk-VGEVL5EQ.js +0 -29
  139. package/dist/chunk-WPE5FPGR.js +0 -54
  140. package/dist/chunk-Z7QQA2KT.js +0 -27
@@ -0,0 +1,162 @@
1
+ import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ logLatency
4
+ } from "./chunk-QQNQ7SJW.js";
5
+ import {
6
+ getProcessSingleton
7
+ } from "./chunk-AOHZU2BM.js";
8
+
9
+ // dist/clients/lsp/workspace-sweep-hold.js
10
+ var SWEEP_IDLE_SAFETY_MARGIN_MS = 6e4;
11
+ var WORKSPACE_SWEEP_HOLD_FAMILY = "lsp.workspace-sweep-hold";
12
+ var WORKSPACE_SWEEP_HOLD_VERSION = 1;
13
+ function state() {
14
+ return getProcessSingleton(WORKSPACE_SWEEP_HOLD_FAMILY, WORKSPACE_SWEEP_HOLD_VERSION, () => ({ holds: /* @__PURE__ */ new Map(), nextHoldId: 1, idleWaiters: [] }));
15
+ }
16
+ function flushIdleWaitersIfEmpty() {
17
+ const current = state();
18
+ if (current.holds.size > 0)
19
+ return;
20
+ if (current.idleWaiters.length === 0)
21
+ return;
22
+ const waiters = current.idleWaiters;
23
+ current.idleWaiters = [];
24
+ for (const waiter of waiters) {
25
+ try {
26
+ waiter();
27
+ } catch {
28
+ }
29
+ }
30
+ }
31
+ function getWorkspaceSweepMaxHoldAgeMs() {
32
+ return getFullScanWallClockMs() + SWEEP_IDLE_SAFETY_MARGIN_MS;
33
+ }
34
+ function reapStaleHolds() {
35
+ const current = state();
36
+ if (current.holds.size === 0)
37
+ return;
38
+ const maxAgeMs = getWorkspaceSweepMaxHoldAgeMs();
39
+ const now = Date.now();
40
+ for (const [holdId, acquiredAt] of current.holds) {
41
+ const ageMs = now - acquiredAt;
42
+ if (ageMs <= maxAgeMs)
43
+ continue;
44
+ current.holds.delete(holdId);
45
+ logLatency({
46
+ type: "phase",
47
+ phase: "lsp_workspace_sweep_hold_force_released",
48
+ filePath: "",
49
+ durationMs: ageMs,
50
+ metadata: { holdId, maxHoldAgeMs: maxAgeMs }
51
+ });
52
+ }
53
+ flushIdleWaitersIfEmpty();
54
+ }
55
+ function acquireWorkspaceSweepHold() {
56
+ const current = state();
57
+ const holdId = current.nextHoldId++;
58
+ current.holds.set(holdId, Date.now());
59
+ return () => {
60
+ if (!state().holds.delete(holdId))
61
+ return;
62
+ flushIdleWaitersIfEmpty();
63
+ };
64
+ }
65
+ function isWorkspaceSweepActive() {
66
+ reapStaleHolds();
67
+ return state().holds.size > 0;
68
+ }
69
+ function runWhenWorkspaceSweepIdle(cb) {
70
+ reapStaleHolds();
71
+ const current = state();
72
+ if (current.holds.size === 0) {
73
+ cb();
74
+ return;
75
+ }
76
+ current.idleWaiters.push(cb);
77
+ }
78
+ function clearWorkspaceSweepHoldForSessionStart() {
79
+ const current = state();
80
+ if (current.holds.size === 0)
81
+ return;
82
+ logLatency({
83
+ type: "phase",
84
+ phase: "lsp_workspace_sweep_hold_session_reset",
85
+ filePath: "",
86
+ durationMs: 0,
87
+ metadata: { clearedHolds: current.holds.size }
88
+ });
89
+ current.holds.clear();
90
+ flushIdleWaitersIfEmpty();
91
+ }
92
+ function getFullScanWallClockMs() {
93
+ const raw = Number(process.env.PI_LENS_LENS_DIAGNOSTICS_FULL_TIMEOUT_MS);
94
+ return Number.isFinite(raw) && raw > 0 ? raw : 3e5;
95
+ }
96
+
97
+ // dist/clients/lsp/service-singleton.js
98
+ var LSP_SERVICE_FAMILY = "lsp.service";
99
+ var LSP_SERVICE_VERSION = 2;
100
+ function state2() {
101
+ return getProcessSingleton(LSP_SERVICE_FAMILY, LSP_SERVICE_VERSION, () => ({
102
+ service: null,
103
+ generationHandoff: void 0,
104
+ lifecycle: void 0
105
+ }), (value) => {
106
+ const previous = value;
107
+ const service = previous.service;
108
+ if (!service || typeof service.shutdown !== "function")
109
+ return;
110
+ void Promise.resolve(service.shutdown({
111
+ fast: true,
112
+ reason: "process_singleton_reset"
113
+ })).catch(() => void 0);
114
+ });
115
+ }
116
+ function configureLspServiceLifecycle(lifecycle) {
117
+ state2().lifecycle = lifecycle;
118
+ }
119
+ function getOwnedLspService() {
120
+ const current = state2();
121
+ if (!current.lifecycle) {
122
+ throw new Error("LSP service lifecycle is not configured");
123
+ }
124
+ if (!current.service) {
125
+ current.service = current.lifecycle.create(current.generationHandoff);
126
+ }
127
+ return current.service;
128
+ }
129
+ function peekOwnedLspService() {
130
+ return state2().service ?? void 0;
131
+ }
132
+ function resetOwnedLspService(options = {}) {
133
+ const current = state2();
134
+ if (options.reason === "session_start") {
135
+ clearWorkspaceSweepHoldForSessionStart();
136
+ }
137
+ current.lifecycle?.beforeReset(options);
138
+ const retiringService = current.service;
139
+ current.service = null;
140
+ if (!retiringService || !current.lifecycle)
141
+ return;
142
+ const teardown = current.lifecycle.destroy(retiringService, options);
143
+ const pending = current.generationHandoff ? [current.generationHandoff, teardown] : [teardown];
144
+ const handoff = Promise.allSettled(pending).then(() => void 0);
145
+ current.generationHandoff = handoff;
146
+ void handoff.then(() => {
147
+ if (current.generationHandoff === handoff)
148
+ current.generationHandoff = void 0;
149
+ });
150
+ }
151
+
152
+ export {
153
+ SWEEP_IDLE_SAFETY_MARGIN_MS,
154
+ acquireWorkspaceSweepHold,
155
+ isWorkspaceSweepActive,
156
+ runWhenWorkspaceSweepIdle,
157
+ getFullScanWallClockMs,
158
+ configureLspServiceLifecycle,
159
+ getOwnedLspService,
160
+ peekOwnedLspService,
161
+ resetOwnedLspService
162
+ };
@@ -1,10 +1,10 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  createToolchainAvailability
4
- } from "./chunk-XHSCVSOL.js";
4
+ } from "./chunk-7DYBLXYA.js";
5
5
  import {
6
6
  createSubsystemLogger
7
- } from "./chunk-34OCDWOS.js";
7
+ } from "./chunk-XTMJ7XDT.js";
8
8
 
9
9
  // dist/clients/rust-client.js
10
10
  import * as path from "node:path";
@@ -1,39 +1,42 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ scannerReportParentDir
4
+ } from "./chunk-CSHFH5IN.js";
2
5
  import {
3
6
  getScratchTreeDirNames
4
- } from "./chunk-J3FZR3YY.js";
7
+ } from "./chunk-VCHXCQFG.js";
5
8
  import {
6
9
  SecurityScanClient
7
- } from "./chunk-5JHXUETW.js";
8
- import "./chunk-IMSQR4WO.js";
10
+ } from "./chunk-3EFKIGZN.js";
9
11
  import {
10
12
  resolveOpengrepConfig
11
- } from "./chunk-U52SAGRM.js";
12
- import "./chunk-CMU4RMJB.js";
13
- import "./chunk-O7HZX7CA.js";
13
+ } from "./chunk-VWCXW2E7.js";
14
+ import "./chunk-PNQDPDRC.js";
15
+ import "./chunk-RWWYJ623.js";
16
+ import "./chunk-VRZP76YM.js";
14
17
  import {
15
18
  safeSpawnAsync
16
- } from "./chunk-T54VJRAD.js";
19
+ } from "./chunk-C34ZXZ7O.js";
17
20
  import "./chunk-BW5KFIQC.js";
18
- import "./chunk-N2IRDBZI.js";
19
- import "./chunk-Z6BB4JLQ.js";
21
+ import "./chunk-2BBLFX75.js";
22
+ import "./chunk-XVF2VVXP.js";
20
23
  import "./chunk-2EECBNC5.js";
21
24
  import {
22
25
  recordDegradationOnce
23
- } from "./chunk-7ELY2CSM.js";
24
- import "./chunk-34OCDWOS.js";
25
- import "./chunk-3PNFWVHT.js";
26
- import "./chunk-VSMJK3ZJ.js";
26
+ } from "./chunk-JAU72XNY.js";
27
+ import "./chunk-XTMJ7XDT.js";
28
+ import "./chunk-JMYYOTQG.js";
29
+ import "./chunk-QQNQ7SJW.js";
30
+ import "./chunk-AOHZU2BM.js";
27
31
  import "./chunk-LJDODBBZ.js";
28
32
  import "./chunk-ABBOA7UD.js";
29
33
  import {
30
34
  realpathOrResolve
31
- } from "./chunk-G3RLJYA2.js";
35
+ } from "./chunk-N2H3ZPZY.js";
32
36
  import "./chunk-NXL4FFQQ.js";
33
37
 
34
38
  // dist/clients/opengrep-client.js
35
39
  import * as fs from "node:fs";
36
- import * as os from "node:os";
37
40
  import * as path from "node:path";
38
41
  import { mkdtempSync } from "node:fs";
39
42
  var EMPTY_RESULT = {
@@ -83,7 +86,7 @@ var OpengrepClient = class _OpengrepClient extends SecurityScanClient {
83
86
  const scannedAt = (/* @__PURE__ */ new Date()).toISOString();
84
87
  const bin = this.binaryPath ?? "opengrep";
85
88
  const resolved = _OpengrepClient.resolveConfig(cwd);
86
- const outDir = mkdtempSync(path.join(os.tmpdir(), "pi-lens-opengrep-"));
89
+ const outDir = mkdtempSync(path.join(scannerReportParentDir(), "pi-lens-opengrep-"));
87
90
  const reportPath = path.join(outDir, "opengrep-report.json");
88
91
  try {
89
92
  const result = await safeSpawnAsync(bin, [
@@ -2321,6 +2321,50 @@ function matchesWorkspaceMemberPattern(pattern, relativePath, dialect, onCap) {
2321
2321
  const steps = compileWorkspaceMemberPattern(normalized, dialect);
2322
2322
  return steps !== void 0 && matchesWorkspaceMemberSteps(steps, relativePath, onCap);
2323
2323
  }
2324
+ var HOST_UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;
2325
+ function hostNormalizeWindowsShellPath(filePath) {
2326
+ if (!filePath.startsWith("/") || filePath.startsWith("//") || filePath.includes("\\")) {
2327
+ return filePath;
2328
+ }
2329
+ const match2 = filePath.match(/^\/(?:mnt\/|cygdrive\/)?([a-z])(?:\/(.*))?$/i);
2330
+ if (!match2)
2331
+ return filePath;
2332
+ const suffix = match2[2]?.replaceAll("/", "\\");
2333
+ return `${match2[1].toUpperCase()}:\\${suffix ?? ""}`;
2334
+ }
2335
+ function normalizeHostToolPath(input, options = {}) {
2336
+ let normalized = input;
2337
+ if (options.normalizeUnicodeSpaces) {
2338
+ normalized = normalized.replace(HOST_UNICODE_SPACES, " ");
2339
+ }
2340
+ if (options.stripAtPrefix && normalized.startsWith("@")) {
2341
+ normalized = normalized.slice(1);
2342
+ }
2343
+ if (process.platform === "win32") {
2344
+ normalized = hostNormalizeWindowsShellPath(normalized);
2345
+ }
2346
+ if (normalized === "~")
2347
+ return os.homedir();
2348
+ if (normalized.startsWith("~/") || process.platform === "win32" && normalized.startsWith("~\\")) {
2349
+ return path2.join(os.homedir(), normalized.slice(2));
2350
+ }
2351
+ if (normalized.startsWith("file://")) {
2352
+ try {
2353
+ return fileURLToPath(normalized);
2354
+ } catch {
2355
+ return normalized;
2356
+ }
2357
+ }
2358
+ return normalized;
2359
+ }
2360
+ function resolveHostToolPath(input, baseDir) {
2361
+ const normalized = normalizeHostToolPath(input, {
2362
+ normalizeUnicodeSpaces: true,
2363
+ stripAtPrefix: true
2364
+ });
2365
+ const normalizedBaseDir = normalizeHostToolPath(baseDir);
2366
+ return path2.isAbsolute(normalized) ? path2.resolve(normalized) : path2.resolve(normalizedBaseDir, normalized);
2367
+ }
2324
2368
 
2325
2369
  export {
2326
2370
  minimatch,
@@ -2348,11 +2392,13 @@ export {
2348
2392
  isAtOrAboveHomeDir,
2349
2393
  homeRelativePath,
2350
2394
  isUnderDir,
2395
+ isVendorPath,
2351
2396
  isExternalOrVendorFile,
2352
2397
  nameMatchesMarkerGlob,
2353
2398
  direntsHaveMarkerGlobMatch,
2354
2399
  CARGO_WORKSPACE_MEMBER_DIALECT,
2355
2400
  UV_WORKSPACE_MEMBERS_DIALECT,
2356
2401
  UV_WORKSPACE_EXCLUDE_DIALECT,
2357
- matchesWorkspaceMemberPattern
2402
+ matchesWorkspaceMemberPattern,
2403
+ resolveHostToolPath
2358
2404
  };
@@ -1,9 +1,9 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  createSubsystemLogger
4
- } from "./chunk-34OCDWOS.js";
5
- import "./chunk-VSMJK3ZJ.js";
6
- import "./chunk-G3RLJYA2.js";
4
+ } from "./chunk-XTMJ7XDT.js";
5
+ import "./chunk-AOHZU2BM.js";
6
+ import "./chunk-N2H3ZPZY.js";
7
7
  import "./chunk-NXL4FFQQ.js";
8
8
 
9
9
  // dist/clients/metrics-client.js
@@ -2,48 +2,48 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
2
2
  import {
3
3
  HardFailureStamps
4
4
  } from "./chunk-7U2IDNXN.js";
5
- import {
6
- getScratchTreeFnmatchPatterns
7
- } from "./chunk-J3FZR3YY.js";
8
5
  import {
9
6
  formatToolFailure
10
- } from "./chunk-TA5L5KWQ.js";
7
+ } from "./chunk-2CD5RS6M.js";
11
8
  import {
12
9
  firstOutputLine,
13
10
  spawnFailedWithNoOutput
14
- } from "./chunk-FGALODG3.js";
11
+ } from "./chunk-UZ3TUTRV.js";
12
+ import {
13
+ getScratchTreeFnmatchPatterns
14
+ } from "./chunk-VCHXCQFG.js";
15
15
  import {
16
16
  listNestedLinkedWorktreeRoots
17
- } from "./chunk-IMSQR4WO.js";
17
+ } from "./chunk-PNQDPDRC.js";
18
18
  import {
19
19
  extractTomlTableSection,
20
20
  parseTomlStringArray
21
- } from "./chunk-S6AMWKPC.js";
21
+ } from "./chunk-P7266HLM.js";
22
22
  import {
23
23
  VENV_BIN_DIRS,
24
24
  findLocalBinsAt
25
- } from "./chunk-T4QZ6FEH.js";
25
+ } from "./chunk-AW7R2GWG.js";
26
26
  import {
27
27
  probeToolAsync
28
- } from "./chunk-CMU4RMJB.js";
28
+ } from "./chunk-RWWYJ623.js";
29
29
  import {
30
30
  classifyProbeFailure,
31
31
  createAvailabilityLatch,
32
32
  logAvailabilityDecision,
33
33
  startHostStallSampler
34
- } from "./chunk-O7HZX7CA.js";
34
+ } from "./chunk-VRZP76YM.js";
35
35
  import {
36
36
  safeSpawnAsync
37
- } from "./chunk-T54VJRAD.js";
37
+ } from "./chunk-C34ZXZ7O.js";
38
38
  import {
39
39
  incrementDegradationCount
40
- } from "./chunk-7ELY2CSM.js";
40
+ } from "./chunk-JAU72XNY.js";
41
41
  import {
42
42
  createSubsystemLogger
43
- } from "./chunk-34OCDWOS.js";
43
+ } from "./chunk-XTMJ7XDT.js";
44
44
  import {
45
45
  findNearestMarkerRoot
46
- } from "./chunk-G3RLJYA2.js";
46
+ } from "./chunk-N2H3ZPZY.js";
47
47
 
48
48
  // dist/clients/dead-code-client.js
49
49
  import * as fs from "node:fs";
@@ -203,7 +203,7 @@ var PythonDeadCodeClient = class {
203
203
  return findLocalBinsAt(["vulture"], root, {
204
204
  windowsExt: ".exe",
205
205
  binDirs: VENV_BIN_DIRS
206
- }).map((full) => ({ cmd: full, prefix: [] }));
206
+ }).flatMap((full) => typeof full === "string" ? [{ cmd: full, prefix: [] }] : []);
207
207
  }
208
208
  async doEnsureAvailable(root) {
209
209
  const candidates = [
@@ -1,17 +1,17 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
- import {
3
- assertInstallAllowed
4
- } from "./chunk-D6YF5HKX.js";
5
2
  import {
6
3
  classifyProbeFailure,
7
4
  installRetryDelayMs
8
- } from "./chunk-O7HZX7CA.js";
5
+ } from "./chunk-VRZP76YM.js";
9
6
  import {
10
7
  safeSpawnAsync
11
- } from "./chunk-T54VJRAD.js";
8
+ } from "./chunk-C34ZXZ7O.js";
9
+ import {
10
+ assertInstallAllowed
11
+ } from "./chunk-ZANLILYD.js";
12
12
  import {
13
13
  logExtension
14
- } from "./chunk-34OCDWOS.js";
14
+ } from "./chunk-XTMJ7XDT.js";
15
15
 
16
16
  // dist/clients/dispatch/runners/utils/lazy-installer.js
17
17
  var LAZY_INSTALL_SPECS = {
@@ -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-34OCDWOS.js";
4
+ } from "./chunk-XTMJ7XDT.js";
5
5
  import {
6
6
  findNearestMarkerRoot,
7
7
  isAtOrAboveHomeDir
8
- } from "./chunk-G3RLJYA2.js";
8
+ } from "./chunk-N2H3ZPZY.js";
9
9
 
10
10
  // dist/clients/cargo-manifest.js
11
11
  import { readFile } from "node:fs/promises";
@@ -1,10 +1,10 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  findNearestDirWithMarker
4
- } from "./chunk-Z6BB4JLQ.js";
4
+ } from "./chunk-XVF2VVXP.js";
5
5
  import {
6
6
  isWindowsPath
7
- } from "./chunk-G3RLJYA2.js";
7
+ } from "./chunk-N2H3ZPZY.js";
8
8
 
9
9
  // dist/clients/file-kinds.js
10
10
  import { basename, extname, win32 } from "node:path";
@@ -78,6 +78,7 @@ var KIND_EXTENSIONS = {
78
78
  ".vue"
79
79
  ],
80
80
  kotlin: [".kt", ".kts"],
81
+ lean: [".lean"],
81
82
  lua: [".lua"],
82
83
  markdown: [".md", ".mdx"],
83
84
  nix: [".nix"],
@@ -117,6 +118,11 @@ function isReadableSourceFile(filePath) {
117
118
  const extension = extname(filePath).toLowerCase();
118
119
  return Object.keys(KIND_EXTENSIONS).some((kind) => hasKindExtension(filePath, kind)) || NON_KIND_READABLE_EXTENSIONS.has(extension);
119
120
  }
121
+ var LEAN_ROOT_MARKERS = [
122
+ "lakefile.lean",
123
+ "lakefile.toml",
124
+ "lean-toolchain"
125
+ ];
120
126
  var DOTNET_CSHARP_ROOT_MARKERS = [
121
127
  "*.csproj",
122
128
  "*.sln",
@@ -206,6 +212,7 @@ var CODE_KINDS = /* @__PURE__ */ new Set([
206
212
  "java",
207
213
  "jsts",
208
214
  "kotlin",
215
+ "lean",
209
216
  "lua",
210
217
  "nix",
211
218
  "ocaml",
@@ -259,6 +266,7 @@ function getFileKindLabel(kind) {
259
266
  fsharp: "F#",
260
267
  java: "Java",
261
268
  kotlin: "Kotlin",
269
+ lean: "Lean 4",
262
270
  swift: "Swift",
263
271
  dart: "Dart",
264
272
  lua: "Lua",
@@ -302,6 +310,7 @@ function getLanguageId(kind) {
302
310
  fsharp: "fsharp",
303
311
  java: "java",
304
312
  kotlin: "kotlin",
313
+ lean: "lean",
305
314
  swift: "swift",
306
315
  dart: "dart",
307
316
  lua: "lua",
@@ -325,6 +334,7 @@ export {
325
334
  KIND_EXTENSIONS,
326
335
  isJstsFactFile,
327
336
  isReadableSourceFile,
337
+ LEAN_ROOT_MARKERS,
328
338
  DOTNET_CSHARP_ROOT_MARKERS,
329
339
  DOTNET_FSHARP_ROOT_MARKERS,
330
340
  TERRAGRUNT_FILENAMES,
@@ -4,7 +4,7 @@ import {
4
4
  normalizeFilePath,
5
5
  pathsEqual,
6
6
  walkUpDirs
7
- } from "./chunk-G3RLJYA2.js";
7
+ } from "./chunk-N2H3ZPZY.js";
8
8
 
9
9
  // dist/clients/review-graph/git-identity.js
10
10
  import * as fs from "node:fs";
@@ -1,18 +1,18 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  rootMarkersForFile
4
- } from "./chunk-VYKKMYVT.js";
4
+ } from "./chunk-QOBUHWHX.js";
5
5
  import {
6
6
  createGenerationMap,
7
7
  createGenerationSource
8
- } from "./chunk-T54VJRAD.js";
8
+ } from "./chunk-C34ZXZ7O.js";
9
9
  import {
10
10
  getDegradationLedgerGeneration,
11
11
  recordDegradationOnce
12
- } from "./chunk-7ELY2CSM.js";
12
+ } from "./chunk-JAU72XNY.js";
13
13
  import {
14
14
  logExtension
15
- } from "./chunk-34OCDWOS.js";
15
+ } from "./chunk-XTMJ7XDT.js";
16
16
  import {
17
17
  isAtOrAboveHomeDir,
18
18
  isRealGitMarker,
@@ -20,7 +20,7 @@ import {
20
20
  isWindowsPath,
21
21
  nameMatchesMarkerGlob,
22
22
  normalizeEphemeralMapKey
23
- } from "./chunk-G3RLJYA2.js";
23
+ } from "./chunk-N2H3ZPZY.js";
24
24
 
25
25
  // dist/clients/tool-cwd.js
26
26
  import * as os from "node:os";
@@ -3,9 +3,9 @@ import {
3
3
  FactStore,
4
4
  getFactStoreEvictionReporter,
5
5
  setFactStoreEvictionReporter
6
- } from "./chunk-UGSMCQ4D.js";
6
+ } from "./chunk-CHOW74WE.js";
7
7
  import "./chunk-ABBOA7UD.js";
8
- import "./chunk-G3RLJYA2.js";
8
+ import "./chunk-N2H3ZPZY.js";
9
9
  import "./chunk-NXL4FFQQ.js";
10
10
  export {
11
11
  FactStore,
@@ -6,26 +6,26 @@ import {
6
6
  EXTENSION_TO_GRAMMAR,
7
7
  getUserRuleRoot,
8
8
  ruleCorpusFingerprintForCycle
9
- } from "./chunk-KJCWXUUS.js";
9
+ } from "./chunk-724UL2TJ.js";
10
10
  import {
11
11
  getPackageRoot,
12
12
  js_yaml_default,
13
13
  resolvePackagePath
14
14
  } from "./chunk-QOZXJ4NA.js";
15
- import {
16
- assertInstallAllowed,
17
- getProjectTrustGeneration
18
- } from "./chunk-D6YF5HKX.js";
19
15
  import {
20
16
  transientRetryDelayMs
21
- } from "./chunk-O7HZX7CA.js";
17
+ } from "./chunk-VRZP76YM.js";
22
18
  import {
23
19
  getProjectIgnoreMatcher,
24
20
  isExcludedDirName
25
- } from "./chunk-T54VJRAD.js";
21
+ } from "./chunk-C34ZXZ7O.js";
26
22
  import {
27
23
  notifyUserDegradation
28
- } from "./chunk-N2IRDBZI.js";
24
+ } from "./chunk-2BBLFX75.js";
25
+ import {
26
+ assertInstallAllowed,
27
+ getProjectTrustGeneration
28
+ } from "./chunk-ZANLILYD.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-7ELY2CSM.js";
39
+ } from "./chunk-JAU72XNY.js";
40
40
  import {
41
41
  createNdjsonLogger,
42
42
  getGlobalPiLensLogDir,
43
43
  getMaxLogSizeMB,
44
44
  isTestMode
45
- } from "./chunk-VSMJK3ZJ.js";
45
+ } from "./chunk-AOHZU2BM.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-G3RLJYA2.js";
52
+ } from "./chunk-N2H3ZPZY.js";
53
53
 
54
54
  // dist/clients/tree-sitter-logger.js
55
55
  import * as path from "node:path";
@@ -2,7 +2,7 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
2
2
  import {
3
3
  collectSourceFiles,
4
4
  collectSourceFilesAsync
5
- } from "./chunk-USHG4DLH.js";
5
+ } from "./chunk-6C7JWPCP.js";
6
6
 
7
7
  // dist/clients/scan-utils.js
8
8
  function getSourceFiles(dir, _isTsProject) {