pi-lens 4.4.0 → 4.4.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 (150) hide show
  1. package/CHANGELOG.md +158 -0
  2. package/README.md +1 -0
  3. package/config/dependency-cruiser-eager-allowlist.json +3 -1
  4. package/dist/{chunk-IXEBJSUE.js → chunk-23WOO7TX.js} +11 -10
  5. package/dist/{chunk-E2WFBRHM.js → chunk-2B73ZPOK.js} +3 -3
  6. package/dist/{chunk-DQ2NZ7C4.js → chunk-2BBLFX75.js} +139 -11
  7. package/dist/{chunk-ZMOL6RQC.js → chunk-2CD5RS6M.js} +2 -2
  8. package/dist/{chunk-VD4JQCQC.js → chunk-2ZGIZPDG.js} +38 -37
  9. package/dist/{chunk-DIULIWKU.js → chunk-34WSVGEM.js} +29 -3
  10. package/dist/chunk-3JNKMP3B.js +17 -0
  11. package/dist/{chunk-HVUZXSWK.js → chunk-3UUPUE3O.js} +45 -41
  12. package/dist/{chunk-5RXBNSW2.js → chunk-3VPVG5SU.js} +16 -8
  13. package/dist/chunk-3WA4HP4I.js +55 -0
  14. package/dist/chunk-466Z26MG.js +30 -0
  15. package/dist/{chunk-34U7PLGE.js → chunk-4UNXBNE2.js} +12 -11
  16. package/dist/{chunk-E4MAEDPM.js → chunk-4W4VLAPJ.js} +12 -11
  17. package/dist/{chunk-GUOGVTCQ.js → chunk-52FUZI6K.js} +4 -2
  18. package/dist/chunk-5JM2524W.js +84 -0
  19. package/dist/{chunk-VHQLPIRJ.js → chunk-5NGR67U5.js} +2 -2
  20. package/dist/{chunk-DFVMIKMQ.js → chunk-66SXUJCA.js} +45 -9
  21. package/dist/{chunk-OQGFCZJ4.js → chunk-66VMUL7Q.js} +16 -16
  22. package/dist/{chunk-HWBZIGMJ.js → chunk-67WMNWEE.js} +9 -8
  23. package/dist/{chunk-6QIUX4EP.js → chunk-6C7JWPCP.js} +7 -7
  24. package/dist/{chunk-47D2BO4S.js → chunk-6GFRNVYR.js} +11 -10
  25. package/dist/{chunk-ZAWW3AF6.js → chunk-6SDEP3AJ.js} +9 -8
  26. package/dist/{chunk-TGPXLY2J.js → chunk-724UL2TJ.js} +38 -2
  27. package/dist/{chunk-YLF3PPT5.js → chunk-76MWC2K6.js} +3 -3
  28. package/dist/{chunk-F3P7VQ7H.js → chunk-7DYBLXYA.js} +3 -3
  29. package/dist/{chunk-AJ3QXTRQ.js → chunk-7ULNCDCO.js} +37 -35
  30. package/dist/{chunk-UK3CMEAL.js → chunk-AOHZU2BM.js} +1 -1
  31. package/dist/{chunk-F3AU2TMM.js → chunk-ARJ6PLFH.js} +44 -28
  32. package/dist/{chunk-U3VGR4VU.js → chunk-AW7R2GWG.js} +65 -8
  33. package/dist/{chunk-FJNKANOS.js → chunk-BKE7E7TC.js} +10 -9
  34. package/dist/{chunk-4W2PLC4J.js → chunk-BRGDSBJE.js} +13 -12
  35. package/dist/{chunk-VN2AXLEX.js → chunk-C34ZXZ7O.js} +102 -16
  36. package/dist/{chunk-T4ERT73Y.js → chunk-CF24OIYI.js} +21 -20
  37. package/dist/{chunk-NMABWBZN.js → chunk-CHOW74WE.js} +1 -1
  38. package/dist/{chunk-ARFCXG7S.js → chunk-CO2G5PHH.js} +2 -2
  39. package/dist/{chunk-AS44CFQ4.js → chunk-EETY4LF7.js} +24 -10
  40. package/dist/{chunk-I3R7GKDR.js → chunk-EJIUXPBX.js} +1 -1
  41. package/dist/{chunk-B3I2UUT4.js → chunk-ESBQHFMJ.js} +653 -251
  42. package/dist/{chunk-O5WILGMI.js → chunk-FLKWCIZH.js} +8 -5
  43. package/dist/{chunk-LNAKEO63.js → chunk-GAEGEPOC.js} +4 -4
  44. package/dist/{chunk-V7R425XG.js → chunk-GBPP5P7X.js} +4 -4
  45. package/dist/{chunk-XK4CIILI.js → chunk-GHB6AYCP.js} +27 -26
  46. package/dist/{chunk-7FBF7NPR.js → chunk-GOYRYZ2R.js} +29 -26
  47. package/dist/{chunk-JOLITGCC.js → chunk-GXW6K4YJ.js} +1 -1
  48. package/dist/{chunk-NXPS2L6U.js → chunk-GZYBXISR.js} +9 -9
  49. package/dist/{chunk-OAXNDZJ7.js → chunk-IBGIOBEE.js} +8 -4
  50. package/dist/{chunk-IIXOAGHR.js → chunk-IBRALRBR.js} +19 -15
  51. package/dist/{chunk-7F72PXY2.js → chunk-IXXDFY73.js} +3 -3
  52. package/dist/chunk-IZSHAIJ7.js +26 -0
  53. package/dist/{chunk-N3YQJI6O.js → chunk-JAU72XNY.js} +20 -15
  54. package/dist/chunk-JMYYOTQG.js +77 -0
  55. package/dist/{chunk-NL5GLMFI.js → chunk-JSQFTSC6.js} +12 -11
  56. package/dist/{chunk-IVP5KAB7.js → chunk-JWA5I3SR.js} +35 -21
  57. package/dist/{chunk-Y4T27COV.js → chunk-KBG47GHP.js} +4 -4
  58. package/dist/{chunk-PWFHBTSF.js → chunk-L3BLXZG7.js} +2 -2
  59. package/dist/chunk-LOP6GRPH.js +31 -0
  60. package/dist/chunk-MQLUAEOC.js +162 -0
  61. package/dist/{chunk-RPD5K5NC.js → chunk-MRXKYPCS.js} +2 -2
  62. package/dist/{chunk-Q5U6FMDI.js → chunk-N2H3ZPZY.js} +59 -7
  63. package/dist/{chunk-27BBHSZC.js → chunk-N3X6Q4YT.js} +3 -3
  64. package/dist/{chunk-UY752QSN.js → chunk-NW7BOILN.js} +19 -17
  65. package/dist/{chunk-TLGFBM3F.js → chunk-ODBNXWT4.js} +302 -113
  66. package/dist/{chunk-TT22N74J.js → chunk-OG5UUPN7.js} +13 -13
  67. package/dist/{chunk-C2AUYXQH.js → chunk-OXXKQCSV.js} +6 -6
  68. package/dist/{chunk-PAK6IDME.js → chunk-P7266HLM.js} +2 -2
  69. package/dist/{chunk-52H5B5TC.js → chunk-PFNSLWU5.js} +31 -30
  70. package/dist/{chunk-5ZEJHV35.js → chunk-PHDMFAKM.js} +12 -2
  71. package/dist/{chunk-3I5QFT3N.js → chunk-PNQDPDRC.js} +6 -3
  72. package/dist/{chunk-TVN5N6GY.js → chunk-PV6LR5P5.js} +6057 -1311
  73. package/dist/{chunk-AHDW3GPE.js → chunk-Q6ZWTCLY.js} +24 -22
  74. package/dist/{chunk-RUOG5D2C.js → chunk-Q7DUK4LX.js} +5 -5
  75. package/dist/{chunk-YSNFMJKN.js → chunk-QGQ5CCCG.js} +2 -2
  76. package/dist/{chunk-LW6XKDZQ.js → chunk-QHJ6DQ2R.js} +287 -38
  77. package/dist/{chunk-GVXA6CCE.js → chunk-QILIYSJF.js} +1 -1
  78. package/dist/{chunk-22AVIGXS.js → chunk-QOBUHWHX.js} +12 -7
  79. package/dist/{chunk-5THXD6X5.js → chunk-QQNQ7SJW.js} +2 -75
  80. package/dist/{chunk-4RERDEXR.js → chunk-QZVW3AAK.js} +50 -41
  81. package/dist/{chunk-AWE5TMPO.js → chunk-R3PCY3YS.js} +14 -13
  82. package/dist/{chunk-HHYAELLJ.js → chunk-RPLINGVB.js} +7 -7
  83. package/dist/{chunk-EOKRQ3SA.js → chunk-RWWYJ623.js} +10 -1
  84. package/dist/{chunk-YGVYKNSN.js → chunk-SAEFPSB6.js} +59 -12
  85. package/dist/{chunk-K6VYLB2U.js → chunk-TYM6OUIT.js} +13 -12
  86. package/dist/{chunk-AJXODZY6.js → chunk-UXGETRP4.js} +13 -12
  87. package/dist/{chunk-I7SPGOWI.js → chunk-UZ3TUTRV.js} +1 -1
  88. package/dist/{chunk-TO6WL3GM.js → chunk-VCHXCQFG.js} +12 -2
  89. package/dist/{chunk-BRJKOBZP.js → chunk-VITUCP5A.js} +17 -6
  90. package/dist/{chunk-WONERJTP.js → chunk-VRZP76YM.js} +1 -1
  91. package/dist/{chunk-OS32RNR2.js → chunk-VSSBEUFT.js} +16 -15
  92. package/dist/{chunk-VDBPVIKD.js → chunk-VWCXW2E7.js} +1 -1
  93. package/dist/{chunk-NKOUFPQF.js → chunk-WOA4LN2R.js} +2 -2
  94. package/dist/{chunk-RIISMHKN.js → chunk-WOKKRCJ5.js} +15 -13
  95. package/dist/{chunk-XECLWQZN.js → chunk-WU567RSC.js} +13 -10
  96. package/dist/{chunk-V5PXFSZK.js → chunk-XCJN5IJU.js} +4 -4
  97. package/dist/{chunk-ORTMY4Q4.js → chunk-XKIZ2HNN.js} +22 -14
  98. package/dist/{chunk-6VCD4VKZ.js → chunk-XMSXXAHW.js} +2 -2
  99. package/dist/chunk-XPZPXCBV.js +28 -0
  100. package/dist/{chunk-O6TQT6RI.js → chunk-XTMJ7XDT.js} +1 -1
  101. package/dist/{chunk-VNMT7C64.js → chunk-XVF2VVXP.js} +5 -3
  102. package/dist/chunk-Z527N6YQ.js +28 -0
  103. package/dist/{chunk-NTUJEGDZ.js → chunk-ZANLILYD.js} +22 -2
  104. package/dist/{chunk-6P62QVEA.js → chunk-ZGDGW2V3.js} +2 -2
  105. package/dist/{chunk-ODEEOXPH.js → chunk-ZHFZWTZV.js} +12 -11
  106. package/dist/{chunk-AJVLWNFN.js → chunk-ZXYDQ3TZ.js} +5 -5
  107. package/dist/index.js +102097 -97778
  108. package/dist/mcp/analyze-cli.js +18 -8
  109. package/dist/mcp/cli.js +48 -37
  110. package/dist/mcp/server.js +695 -426
  111. package/dist/mcp/worker.js +66 -55
  112. package/dist/probes/installer.js +20 -19
  113. package/docs/ast-grep_rules_catalog.md +2 -2
  114. package/docs/astplayground.md +1 -1
  115. package/docs/configuration.md +38 -2
  116. package/docs/custom-rules.md +25 -2
  117. package/docs/dependencies.md +3 -0
  118. package/docs/environment-variables.md +34 -6
  119. package/docs/features.md +39 -3
  120. package/docs/globalconfig.md +3 -1
  121. package/docs/language-coverage.md +2 -1
  122. package/docs/lsp-capability-matrix.md +29 -6
  123. package/docs/lsp-idle-eviction.md +38 -47
  124. package/docs/pi-lens-fixer.md +13 -5
  125. package/docs/pi-lens-merge-policy.md +48 -1
  126. package/docs/pi-lens-monitor.md +3 -1
  127. package/docs/pi-lens-retro.md +2 -1
  128. package/docs/pi-lens-reviewer.md +19 -3
  129. package/docs/pi-lens-subagent.md +2 -0
  130. package/docs/real-harness.md +17 -0
  131. package/docs/schema/pi-lens-config-v1.json +565 -0
  132. package/docs/servercapabilities.md +18 -4
  133. package/docs/settings.md +2 -1
  134. package/docs/word-index.md +6 -0
  135. package/package.json +1 -1
  136. package/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  137. package/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  138. package/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  139. package/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  140. package/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  141. package/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  142. package/dist/chunk-54B42YRX.js +0 -27
  143. package/dist/chunk-CGGAIP7J.js +0 -29
  144. package/dist/chunk-D6QS3U6M.js +0 -30
  145. package/dist/chunk-HMFXILPV.js +0 -83
  146. package/dist/chunk-LSMJ6KBE.js +0 -4139
  147. package/dist/chunk-NTHH2J74.js +0 -27
  148. package/dist/chunk-RPD4ZSB7.js +0 -25
  149. package/dist/chunk-T6D4Q4AQ.js +0 -54
  150. package/dist/chunk-VCSRSYLF.js +0 -81
package/CHANGELOG.md CHANGED
@@ -16,6 +16,164 @@ All notable changes to pi-lens will be documented in this file.
16
16
 
17
17
  ### Security
18
18
 
19
+ ## [4.4.2] - 2026-10-10
20
+
21
+ ### Added
22
+
23
+ - **pi-lens now fails closed on unknown project trust** — Under pi, when pi cannot confirm the project is trusted, pi-lens refuses to run project code and emits one notice per session. It withholds project-local tool binaries while keeping global and managed fallbacks available (#4268). It refuses built-in language servers that execute project code before discovery or installation (#4269). Project-sourced LSP commands, environment, initialization options, and local binaries require trust as well (#2372). The TypeScript server skips the project's own `tsserver.js` and native TypeScript 7 `tsc`, falling back to pi-lens-managed TypeScript instead (#4296). MCP and other non-pi hosts do not consult pi trust; their calling client owns workspace trust, so project tools stay available there (#4300).
24
+
25
+ - **Built-in Lean 4 language support (refs #4119)** — `.lean` files are recognized and sent to the Lean language server using the `lean` LSP language id. In Lake projects, pi-lens launches `lake serve` from the detected project root, so Lake and elan honor the project's toolchain and environment. pi-lens does not install or manage Lean; install Lean and Lake separately and ensure `lake` is on `PATH`.
26
+
27
+ - **Path-scoped rule policy** — Add `rules.<id>.ignorePaths` to skip a rule on matching project-relative paths and reclaim scan work (#4226).
28
+
29
+ - **Analyse marked out-of-root edits as adopted projects.** An edit in a separate project gets LSP diagnostics from global servers, while project-local tools, linters and session bookkeeping stay isolated (refs #4242).
30
+
31
+ - **`/lens-health` now reports the effective pi-lens tool surface**, including disabled tools and the host-managed bundled-skill boundary.
32
+
33
+ ### Changed
34
+
35
+ - **Stale test-runner verdicts state their edit gap and re-queue a run.** When an async verdict is delivered for a file the agent has edited since the run started, the message names the file and how many edits behind it is and queues a re-run for the current version instead of presenting the old verdict as current.
36
+
37
+ ### Fixed
38
+
39
+ - **The session-start orientation names only the tools pi-lens registered** (refs #2967). A tool disabled with `tools.<name>.enabled: false` is no longer advertised, and the `pi_lens_activate_tools` example is drawn from the enabled situational set. The orientation's pre-existing-error demand is configurable with `contextInjection.requirePreExistingFixes` (default unchanged).
40
+
41
+ - **Expired session hand-offs now preserve activated tools** instead of dropping them when a successor is interrupted before startup (closes #4236). Test-only successor pending-window overrides are restricted to Vitest child processes.
42
+
43
+ - **Duplicate pi session starts are ignored safely.** pi-lens now drops repeated `session_start` events at entry while preserving distinct reload, new, resume, and fork starts, and drains NDJSON logs before graceful shutdown (refs #2891).
44
+
45
+ - **TypeScript no longer reports clean from its empty pre-index publish.**
46
+
47
+ - **Require a BuildKit rule from the official Docker smoke server** (closes #3939) — The nightly smoke now uses the upstream rule-bearing fixture and discloses runners without `docker buildx` instead of accepting an empty diagnostic baseline. Credit: qiyangfan.
48
+
49
+ - **Bridge reads survive a `/reload` on the TypeScript-source extension load.** A third-party read recorded after `/reload` (`pi -e index.ts`) now licenses the next edit instead of being falsely blocked with "Edit without read", without allowing a concurrent or stale activation to retarget the bridge (refs #4169, #4258).
50
+
51
+ - **Ast-grep fallbacks use the official CLI package from an isolated cwd (#4193)** — Structural rule replacements, path searches, and CLI probes name `@ast-grep/cli` when direct binary resolution fails and run from a pi-lens-owned tools directory, so a project's `.npmrc` never reaches `npx`; relative `paths` resolve against the project before dispatch.
52
+
53
+ - **Windows LSP auto-install now repairs missing shell commands.** Exit-code-1 startup failures are classified as missing tools only when the command or shim target is absent.
54
+
55
+ - **Unicode-normalized edits now keep their raw target span** (closes #4265) — Full-width punctuation, smart quotes, dashes, and special spaces no longer produce a false “edit target not found” block.
56
+
57
+ - **Subagent turn-end isolation** — a concurrent subagent no longer consumes the primary session's pending project analysis worklist or deferred findings. (refs #3613)
58
+
59
+ ### Internal
60
+
61
+ <details>
62
+ <summary>8 internal changes: tests, CI, tooling, and refactors</summary>
63
+
64
+ - Pin the test home used by the skills package-filter coverage so host-installed skills cannot affect its results.
65
+
66
+ - Require every PR `## Class sweep` to name the defect shape, quote the search that defines its population, and give a verdict, or say `none: <reason>` (#4273).
67
+
68
+ - The nightly tool-smoke LSP capability census builds the in-place compiled twins immediately before it runs, so vitest no longer aborts on the stale-build guard (refs #4302).
69
+
70
+ - Pre-push and lane-check now rebuild a missing or stale bundled `dist/` dependency before governance suites (#4239).
71
+
72
+ - Restore the nightly LSP smoke harness's trusted-project host boundary so project-local server fixtures exercise their intended launch paths.
73
+
74
+ - Added the grouped experimental `LspCapabilities` facade over `LSPService` and migrated production LSP callers behind it without changing behavior.
75
+
76
+ - Centralize analysis-root classification and thread adopted-root no-op gates through root-keyed tool-result writers (refs #4242).
77
+
78
+ - Pinned workflow download redirects to HTTPS and made late formatter resync ownership explicit for the Sonar quality gate.
79
+
80
+ </details>
81
+
82
+ ## [4.4.1] - 2026-10-09
83
+
84
+ ### Added
85
+
86
+ - **Public LSP config schema and compatibility normalization** (closes #2416): canonical argv-shaped server entries and legacy string-command files now share a validated, provenance-aware model without changing runtime launch behavior.
87
+
88
+ - **Shared custom rules are now loaded from a user-level directory.** Thanks to @Antrakos; project rules take precedence over user rules, which take precedence over bundled rules.
89
+
90
+ - **The official Docker Language Server is now verified in nightly LSP smoke tests.** Its pinned v0.20.1 binary is measured through the real pi-lens client, with the preferred legacy server retained as the fallback. Thanks @qiyangfan for reporting #3939.
91
+
92
+ - **Deferred formatting now announces settled completion with ownership identity** (refs #673; thanks @marioSoftmedic), including an empty path list when no bytes changed; late formatter writes delay completion until resync.
93
+
94
+ ### Changed
95
+
96
+ - Idle eviction is now enabled for `docker`, `json`, and `python-jedi` after consecutive safe measurements (refs #3989).
97
+
98
+ ### Fixed
99
+
100
+ - **Report fixer restore loss.** Agent edits that a whole-package fixer erased are now reported when their calls overlap the restore, or when a later edit landed on the fixer's bytes; newer bytes are retained when the restore can prove they are newer. One case stays unreported and is named as a residual: a fixer write that lands between an edit's tool call and the host applying that edit (#3830).
101
+
102
+ - **Batched scans keep their compiled query across a heal.** A rule healed during an in-flight compile no longer stays missing from later batched scans, scans sharing that compile no longer report zero findings when a heal races its publication, and a compile that is refused publication frees its native query instead of leaking it. (#3834)
103
+
104
+ - **A grammar that traps on two distinct files is retired, not retried until the heap aborts.** The runner reports the language unavailable instead of clean and other languages keep the remaining trap budget; a file that traps once and then parses cleanly does not count (refs #4010, #3996).
105
+
106
+ - **The word index no longer holds its serialized copy while idle.** It is released when the agent run settles (once per run), kept while a run edits so per-edit saves stay incremental, and released after 10 minutes without a save for a stalled run (`PI_LENS_WORD_INDEX_MEMO_BACKSTOP_MS`).
107
+
108
+ - **Startup warm caches now cover up to 2,500 measured source files safely.** Larger projects still see the once-per-session reason and the bound to raise.
109
+
110
+ - **The read guard keeps authorship through pi-lens-owned rewrites.** A file the agent wrote stays editable without a re-read when `ast_grep_replace`, `lens_diagnostic_mark`, or an LSP operation rewrites the file that call named and no foreign writer intervened. A file the tool wrote without naming it (a rename's importers, a folder-wide or project-wide apply), a server-initiated `workspace/applyEdit`, or a foreign byte change ends authorship instead, so the next edit asks for one read, and third-party bridge records remain fail-closed (#4131). Authorship survives `/tree`, `/fork` and resume when the branch still shows the write (#3603). Process-bridge writes, observed tool writes and partial bridge reads no longer mark the whole file as freshly read (#3865).
111
+
112
+ - **`throw Error(x)` style findings are now warnings, not blockers.** The `throw-new-error` rules still encourage explicit construction while recognizing that `Error(x)` is spec-equivalent to `new Error(x)`.
113
+
114
+ - **Shared secondary worktree roots now remain visible until every session holding them leaves.** Each session's registry record lists only the roots it registered, so a session ending after a primary reload or a cap eviction can no longer drop a root another live session still serves (#3849).
115
+
116
+ - **Lint fallback no longer hides missing type coverage.** Type-bearing files keep the existing incomplete-coverage notice when their primary analysis was skipped, unavailable, or failed; type-capable fallbacks such as mypy can still complete coverage.
117
+
118
+ - **Keep source-build tools aligned with the lockfile (#4066).** Both esbuild bundles and the TypeScript fallback use the exact locked versions while retaining isolated npm exec resolution and exact lifecycle-script approval.
119
+
120
+ - **Scanners now avoid linked worktree duplicates.** Gitleaks, trivy and opengrep discover linked checkouts nested under the project root instead of relying only on known directory names; paths that a scanner cannot represent safely are reported as bounded scan degradations (fixes #4132).
121
+
122
+ - Prevented pi-lens's read-only registry-tool operations from being mistaken for learned edits after another operation mutates a file.
123
+
124
+ - **Ast-grep rule validation no longer stalls on blank-heavy YAML (#4148)** — A rule with tens of thousands of blank lines no longer blocks the host while its language is detected.
125
+
126
+ - **Pytest and go.mod parsing no longer stall on blank-heavy input (#4148)** — Reading a pytest failure traceback and the `module` line of a `go.mod` now takes linear time, so a run with tens of thousands of blank lines or one very long `_` rule no longer blocks the host for seconds (13 s and 4 s at 100K lines before).
127
+
128
+ - **Refresh TypeScript clients across package roots (closes #4156)** — Changed files are announced to live sibling-root language-server clients, preventing stale importer diagnostics. Credit: Don-Yin.
129
+
130
+ - **A project's data directory stays stable for the whole process** (#4199): it is settled when the process first resolves the root, so an ephemeral checkout no longer moves its data when a `.pi-lens` directory appears mid-process, and a `.pi-lens` created by hand in a real project takes effect at the next process start.
131
+
132
+ - **Read-guard authorship now stays within bytes each writer actually changed.**
133
+
134
+ - **Outside-root edits now explain skipped analysis** (#4218) — pi-lens tells you to start pi in the file's directory or add it to the workspace.
135
+
136
+ - **Answered LSP findings are preserved when another server times out** — typos diagnostics now remain visible when Marksman is inconclusive for the same edit. (closes [#4219](https://github.com/apmantza/pi-lens/issues/4219))
137
+
138
+ - **Identity checks against `True`/`False` are no longer flagged** — the rule now preserves correct Python singleton checks while continuing to catch non-singleton literal comparisons. Thanks @rastarr for the report. (closes [#4225](https://github.com/apmantza/pi-lens/issues/4225))
139
+
140
+ - **Release summaries keep wrapped changelog entries intact** — release notes now join an entry's wrapped lines before shortening it, so plain entries no longer end mid-sentence and bold gist text keeps continuation-line issue references.
141
+
142
+ - **Read evidence now survives relative paths, nested codemode calls and conversation moves**: relative-path reads, nested reads and pi-lens rewrites (including the structural `ast_grep_replace` apply) keep their read-guard and mutation bookkeeping across `/clone`, `/fork`, `/tree` and `/reload`; a read that errored (even if another extension rewrites its result to success), or that another extension blocked, no longer licenses an edit later in the same run, and a read never blocks a whole-package fixer's restore of an agent edit.
143
+
144
+ ### Internal
145
+
146
+ <details>
147
+ <summary>13 internal changes: tests, CI, tooling, and refactors</summary>
148
+
149
+ - The TLA+ hook-anchor scan escapes every regex metacharacter in a handler name, not only `$`.
150
+
151
+ - Changelog fragment validation now constrains new user-facing leads.
152
+
153
+ - **Idle-eviction measurements cover temporary checkouts (refs #3989)** — The nightly probe now arms the short idle window used by ephemeral LSP roots as well as the generic window, so eligible servers are measured instead of reported as not evicted.
154
+
155
+ - **release-qa reads the pi version from `pi --version` only (closes #4176)** — The codemode row no longer takes an x.y.z from the pi binary's install path, so a version-shaped directory cannot make it run or skip on the wrong pi.
156
+
157
+ - Keep config-declared LSP roles reserved and inert in the loader; the catalog remains the owner of auxiliary selection.
158
+
159
+ - Make the workflow Git-push detector regex linear for quoted options.
160
+
161
+ - One LSP server-role vocabulary and a declared trait table (refs #1488, refs #1756): `LSPServerInfo.role` is now non-optional, 44 inlined `role === "auxiliary"` / `role !== "auxiliary"` predicates fold onto `isAuxiliary()`, `PromiseDescriptor.role` retires its duplicate `"primary"` spelling, the auxiliary wait policy moves to `clients/lsp/auxiliary-lifecycle.ts`, and the `notifyInflightLimit` / `replyOrdering` traits are declared on the server definition. No behaviour change.
162
+
163
+ - **Merge-policy mistake table: 2026-10-07 and 2026-10-08 retrospective** — new internal rows on delivery wording, shared records, worker handoffs, CI and advisory classification, release producers, probe witnesses, test doubles, and round routing.
164
+
165
+ - Failed handler-verdict tests when `handleToolCall` threw and production swallowed it: `runHandlerExpectingNoThrow` (`tests/support/handler-verdict.ts`) wraps every direct call and the pi mock's `tool_call` hooks, and a governance sweep rejects an unchecked call (#3518, recurrence #4182).
166
+
167
+ - **TLA+ session models cover marker expiry, the per-evaluation LSP generation, the widget token and the late coordinator stores (refs #3803)**: #3668's successor-pending marker expires (`MarkerExpire`, no clock), #3755's per-evaluation generation is caught by an owner-live invariant the generation clause could not see, the widget's `>=` tie and fork carry are pinned in both directions (`SessionLifecycleF1`), the receipt, `fixedThisTurn`, analysed-state latch and runner writers are fenced by their captured scope (#3824), and `session-straddle` retires the generation at shutdown (#3611), each with a violating pre-fix or mutant config and a passing merged one.
168
+
169
+ - **TLA+ session-lifecycle models the S3 writers and the subagent turn_end (refs #3803)**: the deferral queue's two-hop credit (#3705), the turn-state, turn-summary and git-guard late writers with the debounce re-entry (#3759), the mutation bridge's producer with and without a lineage (#3763), the park map of cut advisories (#4112), and a turn_end composer on a shared coordinator, each with a violating pre-fix or mutant config and a passing merged one; the coverage map names the bridge producers and the turn summary.
170
+
171
+ - Map the unmapped lifecycle files in `formal/coverage-map.json` and gate `index.ts` per lifecycle hook handler instead of per file (refs #3803).
172
+
173
+ - Vitest no longer collects test files from a stray worktree inside `.probe-home/` on a path-filtered run.
174
+
175
+ </details>
176
+
19
177
  ## [4.4.0] - 2026-10-08
20
178
 
21
179
  ### Added
package/README.md CHANGED
@@ -482,6 +482,7 @@ Thanks goes to these wonderful people:
482
482
  <tr>
483
483
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/pandas9"><img src="https://avatars.githubusercontent.com/u/81386636?v=4" width="100px;" alt=""/><br /><sub><b>pandas9</b></sub></a><br /><a href="#bug-pandas9" title="Bug reports">🐛</a></td>
484
484
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/renzooliveira"><img src="https://avatars.githubusercontent.com/u/10881850?v=4" width="100px;" alt=""/><br /><sub><b>Renzo Oliveira</b></sub></a><br /><a href="#ideas-renzooliveira" title="Ideas & Planning">🤔</a></td>
485
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/rastarr"><img src="https://avatars.githubusercontent.com/u/2160922?v=4" width="100px;" alt=""/><br /><sub><b>Martin</b></sub></a><br /><a href="#bug-rastarr" title="Bug reports">🐛</a> <a href="#ideas-rastarr" title="Ideas & Planning">🤔</a></td>
485
486
  </tr>
486
487
  </tbody>
487
488
  </table>
@@ -44,14 +44,15 @@
44
44
  "./clients/lsp-budget.js",
45
45
  "./clients/lsp-lazy.js",
46
46
  "./clients/lsp-status.js",
47
+ "./clients/lsp/capabilities.js",
47
48
  "./clients/lsp/cascade-tier.js",
48
49
  "./clients/lsp/config.js",
49
- "./clients/lsp/index.js",
50
50
  "./clients/lsp/session-roots.js",
51
51
  "./clients/memory-sampler.js",
52
52
  "./clients/message-end-attribution.js",
53
53
  "./clients/mutating-tool.js",
54
54
  "./clients/mutation-bridge.js",
55
+ "./clients/ndjson-logger.js",
55
56
  // #2430: the agent_settled sweep and its post-drain re-baseline. Eager
56
57
  // because they run inside the settle handler, on the same path as the
57
58
  // deferred drain they bracket.
@@ -59,6 +60,7 @@
59
60
  "./clients/observed-mutation.js",
60
61
  "./clients/path-attribution-telemetry.js",
61
62
  "./clients/path-utils.js",
63
+ "./clients/process-bridge.js",
62
64
  "./clients/project-lens-config.js",
63
65
  "./clients/project-trust.js",
64
66
  "./clients/quiet-window.js",
@@ -2,19 +2,20 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
2
2
  import {
3
3
  AgentBehaviorClient,
4
4
  agentBehaviorClient
5
- } from "./chunk-6P62QVEA.js";
6
- import "./chunk-OAXNDZJ7.js";
7
- import "./chunk-VN2AXLEX.js";
8
- import "./chunk-DQ2NZ7C4.js";
9
- import "./chunk-VNMT7C64.js";
5
+ } from "./chunk-ZGDGW2V3.js";
6
+ import "./chunk-IBGIOBEE.js";
7
+ import "./chunk-C34ZXZ7O.js";
8
+ import "./chunk-2BBLFX75.js";
9
+ import "./chunk-XVF2VVXP.js";
10
10
  import "./chunk-2EECBNC5.js";
11
- import "./chunk-N3YQJI6O.js";
12
- import "./chunk-O6TQT6RI.js";
13
- import "./chunk-5THXD6X5.js";
14
- import "./chunk-UK3CMEAL.js";
11
+ import "./chunk-JAU72XNY.js";
12
+ import "./chunk-XTMJ7XDT.js";
13
+ import "./chunk-JMYYOTQG.js";
14
+ import "./chunk-QQNQ7SJW.js";
15
+ import "./chunk-AOHZU2BM.js";
15
16
  import "./chunk-LJDODBBZ.js";
16
17
  import "./chunk-ABBOA7UD.js";
17
- import "./chunk-Q5U6FMDI.js";
18
+ import "./chunk-N2H3ZPZY.js";
18
19
  import "./chunk-NXL4FFQQ.js";
19
20
  export {
20
21
  AgentBehaviorClient,
@@ -3,13 +3,13 @@ import {
3
3
  findModuleForPath,
4
4
  getDownstreamModules,
5
5
  getModuleSourceFiles
6
- } from "./chunk-V7R425XG.js";
6
+ } from "./chunk-GBPP5P7X.js";
7
7
  import {
8
8
  detectFileRole
9
- } from "./chunk-DQ2NZ7C4.js";
9
+ } from "./chunk-2BBLFX75.js";
10
10
  import {
11
11
  normalizeMapKey
12
- } from "./chunk-Q5U6FMDI.js";
12
+ } from "./chunk-N2H3ZPZY.js";
13
13
 
14
14
  // dist/clients/review-graph/query.js
15
15
  function dedupe(items) {
@@ -14,7 +14,7 @@ import {
14
14
  findPiLensConfigMarkerInDir,
15
15
  getPiLensGlobalConfigPath,
16
16
  isResolvedGlobalConfigPath
17
- } from "./chunk-VNMT7C64.js";
17
+ } from "./chunk-XVF2VVXP.js";
18
18
  import {
19
19
  DEGRADATION_ENTRIES_PER_KIND,
20
20
  GLOBAL_NON_FLAG_CONFIG_SECTIONS,
@@ -31,21 +31,21 @@ import {
31
31
  readFlagConfigValue,
32
32
  readToolConfig,
33
33
  recordDegradationOnce
34
- } from "./chunk-N3YQJI6O.js";
34
+ } from "./chunk-JAU72XNY.js";
35
35
  import {
36
36
  logExtension
37
- } from "./chunk-O6TQT6RI.js";
37
+ } from "./chunk-XTMJ7XDT.js";
38
38
  import {
39
39
  CONFIG_SCHEMA_ANCHOR_KEY,
40
40
  CONFIG_SCHEMA_ID,
41
41
  DEPRECATED_CONFIG_SURFACES,
42
42
  STABILITY_TIER_KEY,
43
43
  withConfigDiagnosticCode
44
- } from "./chunk-5THXD6X5.js";
44
+ } from "./chunk-JMYYOTQG.js";
45
45
  import {
46
46
  redactSecrets,
47
47
  toPositiveFinite
48
- } from "./chunk-UK3CMEAL.js";
48
+ } from "./chunk-AOHZU2BM.js";
49
49
  import {
50
50
  BoundedLruCache
51
51
  } from "./chunk-ABBOA7UD.js";
@@ -54,7 +54,7 @@ import {
54
54
  isAtOrAboveHomeDir,
55
55
  isWindowsPath,
56
56
  walkUpDirs
57
- } from "./chunk-Q5U6FMDI.js";
57
+ } from "./chunk-N2H3ZPZY.js";
58
58
 
59
59
  // dist/clients/generated-artifacts.js
60
60
  import * as fs from "node:fs";
@@ -486,6 +486,9 @@ var TIER_CLASS = {
486
486
  function tierPrecedence(tier) {
487
487
  return SOURCE_TIERS.indexOf(tier);
488
488
  }
489
+ function isRepoTier(tier) {
490
+ return TIER_CLASS[tier] === "repo";
491
+ }
489
492
  function isOperatorTier(tier) {
490
493
  return TIER_CLASS[tier] === "operator";
491
494
  }
@@ -845,6 +848,9 @@ function propertySchema(node, name) {
845
848
  return child;
846
849
  }
847
850
  }
851
+ const additional = node.additionalProperties;
852
+ if (isSchemaNode(additional))
853
+ return additional;
848
854
  return void 0;
849
855
  }
850
856
  function additionalPropertyPolicy(node) {
@@ -1282,6 +1288,15 @@ function walkScalar(value, schema, context, declared) {
1282
1288
  });
1283
1289
  return DROPPED;
1284
1290
  }
1291
+ const minLength = schema?.minLength;
1292
+ if (declared === "string" && typeof minLength === "number" && typeof value === "string" && value.length < minLength) {
1293
+ record2(context, {
1294
+ code: "PILENS_CFG_0005",
1295
+ key: pointerOf(context.path),
1296
+ reason: `string must contain at least ${minLength} character${minLength === 1 ? "" : "s"}; ignored`
1297
+ });
1298
+ return DROPPED;
1299
+ }
1285
1300
  return checkEnum(value, schema, context) ? value : DROPPED;
1286
1301
  }
1287
1302
  function checkEnum(value, schema, context) {
@@ -1375,6 +1390,67 @@ function lspServerEntryNode() {
1375
1390
  items: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
1376
1391
  [MERGE_STRATEGY_KEY]: "replace",
1377
1392
  [STABILITY_TIER_KEY]: "experimental"
1393
+ },
1394
+ name: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
1395
+ enabled: { type: "boolean", [STABILITY_TIER_KEY]: "experimental" },
1396
+ role: {
1397
+ type: "string",
1398
+ enum: ["language", "auxiliary"],
1399
+ [STABILITY_TIER_KEY]: "experimental"
1400
+ },
1401
+ // `command` accepts string here solely for the compatibility window;
1402
+ // ResolvedLspConfig makes argv the only canonical output.
1403
+ command: { [STABILITY_TIER_KEY]: "experimental" },
1404
+ args: {
1405
+ type: "array",
1406
+ items: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
1407
+ [STABILITY_TIER_KEY]: "experimental"
1408
+ },
1409
+ extensions: {
1410
+ type: "array",
1411
+ items: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
1412
+ [STABILITY_TIER_KEY]: "experimental"
1413
+ },
1414
+ rootMarkers: {
1415
+ type: "array",
1416
+ items: { type: "string", [STABILITY_TIER_KEY]: "experimental" },
1417
+ [STABILITY_TIER_KEY]: "experimental"
1418
+ },
1419
+ env: {
1420
+ type: "object",
1421
+ additionalProperties: {
1422
+ type: "string",
1423
+ [STABILITY_TIER_KEY]: "experimental"
1424
+ },
1425
+ [STABILITY_TIER_KEY]: "experimental"
1426
+ },
1427
+ initializationOptions: {
1428
+ type: "object",
1429
+ additionalProperties: true,
1430
+ [STABILITY_TIER_KEY]: "experimental"
1431
+ }
1432
+ }
1433
+ };
1434
+ }
1435
+ function lspServerOverrideNode() {
1436
+ return {
1437
+ type: "object",
1438
+ additionalProperties: true,
1439
+ [STABILITY_TIER_KEY]: "experimental",
1440
+ properties: {
1441
+ command: { [STABILITY_TIER_KEY]: "experimental" },
1442
+ env: {
1443
+ type: "object",
1444
+ additionalProperties: {
1445
+ type: "string",
1446
+ [STABILITY_TIER_KEY]: "experimental"
1447
+ },
1448
+ [STABILITY_TIER_KEY]: "experimental"
1449
+ },
1450
+ initializationOptions: {
1451
+ type: "object",
1452
+ additionalProperties: true,
1453
+ [STABILITY_TIER_KEY]: "experimental"
1378
1454
  }
1379
1455
  }
1380
1456
  };
@@ -1399,7 +1475,7 @@ function lspNamespace() {
1399
1475
  // #3968: server entries are TYPED — each carries the covers
1400
1476
  // claim node — while staying open on every other field.
1401
1477
  { additionalProperties: lspServerEntryNode() }
1402
- ) : { additionalProperties: true } : {},
1478
+ ) : key === "serverOverrides" ? { additionalProperties: lspServerOverrideNode() } : { additionalProperties: true } : {},
1403
1479
  ...denyAnnotation(key)
1404
1480
  };
1405
1481
  }
@@ -1410,6 +1486,31 @@ function lspNamespace() {
1410
1486
  properties
1411
1487
  };
1412
1488
  }
1489
+ function rulePolicyEntryNode() {
1490
+ return {
1491
+ type: "object",
1492
+ additionalProperties: true,
1493
+ properties: {
1494
+ threshold: { type: "number", [STABILITY_TIER_KEY]: "experimental" },
1495
+ // These two legacy fields remain opaque so the project compatibility
1496
+ // parser can preserve its established field-specific diagnostics.
1497
+ disable: opaque("experimental"),
1498
+ select: opaque("experimental"),
1499
+ ignorePaths: {
1500
+ type: "array",
1501
+ items: {
1502
+ type: "string",
1503
+ minLength: 1,
1504
+ [STABILITY_TIER_KEY]: "experimental"
1505
+ },
1506
+ [MERGE_STRATEGY_KEY]: "append",
1507
+ [DENY_KEY]: "array-union",
1508
+ [STABILITY_TIER_KEY]: "experimental"
1509
+ }
1510
+ },
1511
+ [STABILITY_TIER_KEY]: "experimental"
1512
+ };
1513
+ }
1413
1514
  function buildConfigSchema() {
1414
1515
  const properties = {};
1415
1516
  for (const key of [
@@ -1435,6 +1536,11 @@ function buildConfigSchema() {
1435
1536
  ])),
1436
1537
  [STABILITY_TIER_KEY]: "stable"
1437
1538
  };
1539
+ properties.rules = {
1540
+ type: "object",
1541
+ additionalProperties: rulePolicyEntryNode(),
1542
+ [STABILITY_TIER_KEY]: "experimental"
1543
+ };
1438
1544
  for (const key of PROJECT_FOREIGN_CONFIG_NAMESPACES) {
1439
1545
  properties[key] ??= opaque("experimental");
1440
1546
  }
@@ -2097,6 +2203,18 @@ function parseRulePolicyList(note, ruleId, key, value) {
2097
2203
  }
2098
2204
  return { list, invalid: false };
2099
2205
  }
2206
+ function parseRulePathList(note, ruleId, value) {
2207
+ if (!Array.isArray(value)) {
2208
+ note(`rules.${ruleId}.ignorePaths must be an array of strings`);
2209
+ return void 0;
2210
+ }
2211
+ const paths = value.filter((entry) => typeof entry === "string" && entry.trim().length > 0).map((entry) => entry.trim());
2212
+ if (value.length > 0 && paths.length === 0) {
2213
+ note(`rules.${ruleId}.ignorePaths must contain a non-empty string`);
2214
+ return void 0;
2215
+ }
2216
+ return paths;
2217
+ }
2100
2218
  var NO_RECORDS = [];
2101
2219
  function parseConfigFile(configPath) {
2102
2220
  const { note, records: ignoredRecords } = ignoredRecordCollector(configPath, "project");
@@ -2131,7 +2249,11 @@ function parseConfigFile(configPath) {
2131
2249
  value: outcome.value
2132
2250
  });
2133
2251
  const raw = resolved.value;
2134
- const obj = resolved.value;
2252
+ const rawProject = outcome.value;
2253
+ const obj = {
2254
+ ...resolved.value,
2255
+ ...rawProject.rules !== void 0 ? { rules: rawProject.rules } : {}
2256
+ };
2135
2257
  const ignore = Array.isArray(obj.ignore) ? obj.ignore.filter((p) => typeof p === "string") : [];
2136
2258
  const mutations = {};
2137
2259
  for (const spec of PROJECT_SCOPED_LENS_FLAGS) {
@@ -2163,9 +2285,14 @@ function parseConfigFile(configPath) {
2163
2285
  if (!parsed.invalid && parsed.list.length > 0)
2164
2286
  entry.select = parsed.list;
2165
2287
  }
2166
- if (entry.threshold !== void 0 || entry.disable || entry.select) {
2288
+ if ("ignorePaths" in r) {
2289
+ const paths = parseRulePathList(note, ruleId, r.ignorePaths);
2290
+ if (paths && paths.length > 0)
2291
+ entry.ignorePaths = paths;
2292
+ }
2293
+ if (entry.threshold !== void 0 || entry.disable || entry.select || entry.ignorePaths) {
2167
2294
  rules[ruleId] = entry;
2168
- } else if (!("threshold" in r) && !("disable" in r) && !("select" in r)) {
2295
+ } else if (!("threshold" in r) && !("disable" in r) && !("select" in r) && !("ignorePaths" in r)) {
2169
2296
  note(`rules.${ruleId} has no recognized setting (threshold, disable, select); ignored`);
2170
2297
  }
2171
2298
  }
@@ -2284,7 +2411,7 @@ function parseConfigFile(configPath) {
2284
2411
  raw,
2285
2412
  configPath
2286
2413
  },
2287
- records: resolved.records,
2414
+ records: resolved.records.filter((record4) => !record4.key.startsWith("/rules/")),
2288
2415
  ignored: ignoredRecords()
2289
2416
  };
2290
2417
  }
@@ -2297,6 +2424,7 @@ export {
2297
2424
  detectFileRole,
2298
2425
  notifyUserDegradation,
2299
2426
  warnIgnoredConfigOnce,
2427
+ isRepoTier,
2300
2428
  provenanceView,
2301
2429
  provenanceFor,
2302
2430
  compareKeys,
@@ -2,11 +2,11 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
2
2
  import {
3
3
  classifyRunOutcome,
4
4
  firstOutputLine
5
- } from "./chunk-I7SPGOWI.js";
5
+ } from "./chunk-UZ3TUTRV.js";
6
6
  import {
7
7
  incrementDegradationCount,
8
8
  truncateForLedger
9
- } from "./chunk-N3YQJI6O.js";
9
+ } from "./chunk-JAU72XNY.js";
10
10
 
11
11
  // dist/clients/dispatch/types.js
12
12
  var RUNNER_SKIP_REASONS = [
@@ -54,55 +54,56 @@ import {
54
54
  reviewGraphCachePath,
55
55
  terminateReviewGraphPersistWorkerForTests,
56
56
  waitForReviewGraphPersistsForTests
57
- } from "./chunk-LSMJ6KBE.js";
57
+ } from "./chunk-PV6LR5P5.js";
58
58
  import "./chunk-3MED75HT.js";
59
- import "./chunk-3I5QFT3N.js";
60
- import "./chunk-TVN5N6GY.js";
61
- import "./chunk-ARFCXG7S.js";
62
- import "./chunk-OAXNDZJ7.js";
59
+ import "./chunk-CO2G5PHH.js";
60
+ import "./chunk-IBGIOBEE.js";
61
+ import "./chunk-PNQDPDRC.js";
63
62
  import "./chunk-XIMYZ3JA.js";
64
- import "./chunk-B3I2UUT4.js";
65
- import "./chunk-DIULIWKU.js";
66
- import "./chunk-VDBPVIKD.js";
63
+ import "./chunk-ESBQHFMJ.js";
64
+ import "./chunk-34WSVGEM.js";
65
+ import "./chunk-VWCXW2E7.js";
66
+ import "./chunk-ZXYDQ3TZ.js";
67
67
  import "./chunk-5W3R6LFT.js";
68
- import "./chunk-LW6XKDZQ.js";
68
+ import "./chunk-QHJ6DQ2R.js";
69
69
  import "./chunk-Z54ZSOBZ.js";
70
- import "./chunk-TGPXLY2J.js";
70
+ import "./chunk-724UL2TJ.js";
71
71
  import "./chunk-QOZXJ4NA.js";
72
- import "./chunk-V7R425XG.js";
73
- import "./chunk-PAK6IDME.js";
74
- import "./chunk-GUOGVTCQ.js";
75
- import "./chunk-AJVLWNFN.js";
76
- import "./chunk-YGVYKNSN.js";
77
- import "./chunk-LNAKEO63.js";
72
+ import "./chunk-GBPP5P7X.js";
73
+ import "./chunk-P7266HLM.js";
74
+ import "./chunk-MQLUAEOC.js";
75
+ import "./chunk-52FUZI6K.js";
76
+ import "./chunk-SAEFPSB6.js";
77
+ import "./chunk-GAEGEPOC.js";
78
78
  import "./chunk-Z3CCVDUB.js";
79
- import "./chunk-PWFHBTSF.js";
79
+ import "./chunk-L3BLXZG7.js";
80
80
  import "./chunk-2BEMIWEW.js";
81
- import "./chunk-OQGFCZJ4.js";
82
- import "./chunk-RUOG5D2C.js";
83
- import "./chunk-U3VGR4VU.js";
84
- import "./chunk-NTUJEGDZ.js";
85
- import "./chunk-EOKRQ3SA.js";
86
- import "./chunk-WONERJTP.js";
87
- import "./chunk-22AVIGXS.js";
88
- import "./chunk-GVXA6CCE.js";
89
- import "./chunk-6QIUX4EP.js";
90
- import "./chunk-VHQLPIRJ.js";
91
- import "./chunk-VN2AXLEX.js";
81
+ import "./chunk-66VMUL7Q.js";
82
+ import "./chunk-Q7DUK4LX.js";
83
+ import "./chunk-AW7R2GWG.js";
84
+ import "./chunk-RWWYJ623.js";
85
+ import "./chunk-VRZP76YM.js";
86
+ import "./chunk-QOBUHWHX.js";
87
+ import "./chunk-QILIYSJF.js";
88
+ import "./chunk-6C7JWPCP.js";
89
+ import "./chunk-5NGR67U5.js";
90
+ import "./chunk-C34ZXZ7O.js";
92
91
  import "./chunk-BW5KFIQC.js";
93
92
  import "./chunk-QYF5S6P6.js";
94
- import "./chunk-5ZEJHV35.js";
95
- import "./chunk-DQ2NZ7C4.js";
96
- import "./chunk-VNMT7C64.js";
93
+ import "./chunk-PHDMFAKM.js";
94
+ import "./chunk-2BBLFX75.js";
95
+ import "./chunk-XVF2VVXP.js";
96
+ import "./chunk-ZANLILYD.js";
97
97
  import "./chunk-2EECBNC5.js";
98
- import "./chunk-N3YQJI6O.js";
99
- import "./chunk-O6TQT6RI.js";
100
- import "./chunk-5THXD6X5.js";
101
- import "./chunk-UK3CMEAL.js";
98
+ import "./chunk-JAU72XNY.js";
99
+ import "./chunk-XTMJ7XDT.js";
100
+ import "./chunk-JMYYOTQG.js";
101
+ import "./chunk-QQNQ7SJW.js";
102
+ import "./chunk-AOHZU2BM.js";
102
103
  import "./chunk-LJDODBBZ.js";
103
- import "./chunk-NMABWBZN.js";
104
+ import "./chunk-CHOW74WE.js";
104
105
  import "./chunk-ABBOA7UD.js";
105
- import "./chunk-Q5U6FMDI.js";
106
+ import "./chunk-N2H3ZPZY.js";
106
107
  import "./chunk-NXL4FFQQ.js";
107
108
  export {
108
109
  GRAPH_PERSIST_MAX_ELEMENTS_DEFAULT,