@duckmind/dm-darwin-x64 0.66.4 → 0.66.6

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 (1115) hide show
  1. package/README.md +4 -0
  2. package/dm +2 -2
  3. package/extensions/.dm-extensions.json +755 -37
  4. package/extensions/dm-lens/clients/actionable-warnings.js +63 -11
  5. package/extensions/dm-lens/clients/advisory-provenance.js +5 -3
  6. package/extensions/dm-lens/clients/agent-nudge.js +106 -2
  7. package/extensions/dm-lens/clients/analysis-root.js +103 -0
  8. package/extensions/dm-lens/clients/ast-grep-client.js +18 -7
  9. package/extensions/dm-lens/clients/ast-grep-rule-manager.js +35 -12
  10. package/extensions/dm-lens/clients/biome-client.js +18 -12
  11. package/extensions/dm-lens/clients/blocker-freshness.js +1 -9
  12. package/extensions/dm-lens/clients/bounded-pid-file-lock.js +141 -30
  13. package/extensions/dm-lens/clients/bounded-telemetry.js +3 -0
  14. package/extensions/dm-lens/clients/cache/rule-cache.js +2 -17
  15. package/extensions/dm-lens/clients/cache-manager.js +105 -17
  16. package/extensions/dm-lens/clients/cargo-manifest.js +23 -3
  17. package/extensions/dm-lens/clients/complexity-client.js +1 -1
  18. package/extensions/dm-lens/clients/config-core/normalize.js +9 -0
  19. package/extensions/dm-lens/clients/config-core/schema.js +3 -0
  20. package/extensions/dm-lens/clients/config-schema.js +105 -2
  21. package/extensions/dm-lens/clients/confirmed-delete.js +11 -0
  22. package/extensions/dm-lens/clients/custom-rule-locations.js +28 -0
  23. package/extensions/dm-lens/clients/dead-code-client.js +81 -12
  24. package/extensions/dm-lens/clients/deferred-runner-blockers.js +108 -0
  25. package/extensions/dm-lens/clients/deferred-test-targets.js +31 -0
  26. package/extensions/dm-lens/clients/degradation-ledger.js +21 -3
  27. package/extensions/dm-lens/clients/demoted-finding-render.js +5 -2
  28. package/extensions/dm-lens/clients/dependency-checker.js +13 -4
  29. package/extensions/dm-lens/clients/diagnostic-line-freshness.js +3 -5
  30. package/extensions/dm-lens/clients/dispatch/adopted-root-runners.js +22 -0
  31. package/extensions/dm-lens/clients/dispatch/dispatcher.js +105 -27
  32. package/extensions/dm-lens/clients/dispatch/facts/comment-facts.js +5 -2
  33. package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +1 -1
  34. package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +2 -2
  35. package/extensions/dm-lens/clients/dispatch/facts/tree-sitter-facts.js +2 -2
  36. package/extensions/dm-lens/clients/dispatch/facts/try-catch-facts.js +1 -1
  37. package/extensions/dm-lens/clients/dispatch/finding-policy.js +12 -4
  38. package/extensions/dm-lens/clients/dispatch/integration.js +60 -15
  39. package/extensions/dm-lens/clients/dispatch/known-runner-ids.js +13 -0
  40. package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +66 -11
  41. package/extensions/dm-lens/clients/dispatch/plan.js +6 -0
  42. package/extensions/dm-lens/clients/dispatch/rule-id-normalize.js +9 -2
  43. package/extensions/dm-lens/clients/dispatch/rule-policy.js +33 -4
  44. package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +9 -5
  45. package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +5 -2
  46. package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +7 -3
  47. package/extensions/dm-lens/clients/dispatch/runners/detekt.js +3 -3
  48. package/extensions/dm-lens/clients/dispatch/runners/fact-rules.js +3 -3
  49. package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +10 -6
  50. package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +8 -5
  51. package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +2 -1
  52. package/extensions/dm-lens/clients/dispatch/runners/lsp.js +28 -8
  53. package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +2 -2
  54. package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +6 -7
  55. package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +18 -8
  56. package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +3 -3
  57. package/extensions/dm-lens/clients/dispatch/runners/pyright.js +1 -1
  58. package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +25 -6
  59. package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +71 -4
  60. package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +5 -1
  61. package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +3 -3
  62. package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +3 -3
  63. package/extensions/dm-lens/clients/dispatch/runners/taplo.js +17 -5
  64. package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +12 -5
  65. package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +3 -3
  66. package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +127 -46
  67. package/extensions/dm-lens/clients/dispatch/runners/utils/tool-failure.js +11 -6
  68. package/extensions/dm-lens/clients/dispatch/runners/vale.js +3 -3
  69. package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +8 -1
  70. package/extensions/dm-lens/clients/dispatch/types.js +21 -1
  71. package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +13 -0
  72. package/extensions/dm-lens/clients/effective-config.js +14 -3
  73. package/extensions/dm-lens/clients/ephemeral-root.js +71 -0
  74. package/extensions/dm-lens/clients/file-kinds.js +9 -0
  75. package/extensions/dm-lens/clients/file-mutation-queue.js +95 -0
  76. package/extensions/dm-lens/clients/file-utils.js +87 -8
  77. package/extensions/dm-lens/clients/finding-delivery-gate.js +5 -2
  78. package/extensions/dm-lens/clients/fix-run-restore.js +416 -0
  79. package/extensions/dm-lens/clients/format-events-publish.js +82 -2
  80. package/extensions/dm-lens/clients/format-service.js +10 -5
  81. package/extensions/dm-lens/clients/formatters.js +29 -12
  82. package/extensions/dm-lens/clients/generation-guard.js +50 -8
  83. package/extensions/dm-lens/clients/generation-lock.js +184 -0
  84. package/extensions/dm-lens/clients/git-guard.js +19 -1
  85. package/extensions/dm-lens/clients/gitleaks-client.js +13 -4
  86. package/extensions/dm-lens/clients/grammar-source.js +5 -0
  87. package/extensions/dm-lens/clients/grammar-wasm-imports.js +48 -0
  88. package/extensions/dm-lens/clients/gzip-stage-write.js +15 -7
  89. package/extensions/dm-lens/clients/hard-failure-summary.js +28 -0
  90. package/extensions/dm-lens/clients/hook-budgets.js +1 -0
  91. package/extensions/dm-lens/clients/inline-blocker-fields.js +8 -0
  92. package/extensions/dm-lens/clients/install-diagnostics.js +31 -16
  93. package/extensions/dm-lens/clients/installer/index.js +238 -58
  94. package/extensions/dm-lens/clients/instance-reaper.js +164 -52
  95. package/extensions/dm-lens/clients/instance-registry-lock.js +117 -76
  96. package/extensions/dm-lens/clients/instance-registry-tail.js +17 -0
  97. package/extensions/dm-lens/clients/instance-registry.js +248 -91
  98. package/extensions/dm-lens/clients/io-bridge-contract.js +7 -0
  99. package/extensions/dm-lens/clients/io-bridge.js +372 -0
  100. package/extensions/dm-lens/clients/jscpd-client.js +83 -35
  101. package/extensions/dm-lens/clients/knip-client.js +75 -6
  102. package/extensions/dm-lens/clients/knip-scan-roots.js +29 -0
  103. package/extensions/dm-lens/clients/language-policy.js +2 -0
  104. package/extensions/dm-lens/clients/language-profile.js +4 -1
  105. package/extensions/dm-lens/clients/language-registry.js +4 -1
  106. package/extensions/dm-lens/clients/latency-logger.js +11 -1
  107. package/extensions/dm-lens/clients/lens-config.js +10 -1
  108. package/extensions/dm-lens/clients/lens-engine.js +1 -1
  109. package/extensions/dm-lens/clients/lens-flag-registry.js +14 -24
  110. package/extensions/dm-lens/clients/lsp/aggregation.js +9 -8
  111. package/extensions/dm-lens/clients/lsp/auxiliary-lifecycle.js +23 -0
  112. package/extensions/dm-lens/clients/lsp/capabilities.js +98 -0
  113. package/extensions/dm-lens/clients/lsp/cascade-tier.js +8 -3
  114. package/extensions/dm-lens/clients/lsp/client.js +282 -48
  115. package/extensions/dm-lens/clients/lsp/config.js +247 -15
  116. package/extensions/dm-lens/clients/lsp/document-drift.js +23 -11
  117. package/extensions/dm-lens/clients/lsp/edits.js +137 -85
  118. package/extensions/dm-lens/clients/lsp/grouping.js +38 -0
  119. package/extensions/dm-lens/clients/lsp/index.js +484 -275
  120. package/extensions/dm-lens/clients/lsp/launch.js +106 -6
  121. package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +37 -7
  122. package/extensions/dm-lens/clients/lsp/resolved-config.js +188 -0
  123. package/extensions/dm-lens/clients/lsp/server-covers.js +8 -0
  124. package/extensions/dm-lens/clients/lsp/server-traits.js +39 -0
  125. package/extensions/dm-lens/clients/lsp/server.js +259 -34
  126. package/extensions/dm-lens/clients/lsp/service-singleton.js +59 -0
  127. package/extensions/dm-lens/clients/lsp/session-roots.js +1 -1
  128. package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +2 -1
  129. package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +25 -4
  130. package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +6 -3
  131. package/extensions/dm-lens/clients/lsp-budget.js +9 -5
  132. package/extensions/dm-lens/clients/lsp-document-symbols.js +1 -1
  133. package/extensions/dm-lens/clients/lsp-lazy.js +1 -1
  134. package/extensions/dm-lens/clients/lsp-mutation.js +44 -8
  135. package/extensions/dm-lens/clients/lsp-status.js +5 -7
  136. package/extensions/dm-lens/clients/mcp/analyze.js +24 -11
  137. package/extensions/dm-lens/clients/mcp/ipc.js +26 -7
  138. package/extensions/dm-lens/clients/mcp/session.js +1 -1
  139. package/extensions/dm-lens/clients/memory-sampler.js +48 -3
  140. package/extensions/dm-lens/clients/module-report-lsp.js +1 -1
  141. package/extensions/dm-lens/clients/module-report.js +9 -3
  142. package/extensions/dm-lens/clients/mutating-tool.js +12 -3
  143. package/extensions/dm-lens/clients/mutation-attribution.js +8 -0
  144. package/extensions/dm-lens/clients/mutation-bridge.js +181 -48
  145. package/extensions/dm-lens/clients/ndjson-logger.js +33 -0
  146. package/extensions/dm-lens/clients/observed-mutation-sources.js +1 -1
  147. package/extensions/dm-lens/clients/observed-mutation.js +40 -20
  148. package/extensions/dm-lens/clients/opaque-mutation-scan.js +40 -13
  149. package/extensions/dm-lens/clients/opengrep-client.js +6 -3
  150. package/extensions/dm-lens/clients/package-manager.js +61 -6
  151. package/extensions/dm-lens/clients/path-utils.js +77 -18
  152. package/extensions/dm-lens/clients/performance-report.js +1 -1
  153. package/extensions/dm-lens/clients/persist-worker-stats.js +8 -0
  154. package/extensions/dm-lens/clients/persistent-reverify.js +5 -1
  155. package/extensions/dm-lens/clients/pipeline.js +310 -114
  156. package/extensions/dm-lens/clients/probe-home-state.js +6 -1
  157. package/extensions/dm-lens/clients/process-bridge.js +28 -0
  158. package/extensions/dm-lens/clients/process-snapshot.js +115 -2
  159. package/extensions/dm-lens/clients/project-changes.js +81 -19
  160. package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +18 -13
  161. package/extensions/dm-lens/clients/project-lens-config.js +32 -5
  162. package/extensions/dm-lens/clients/project-scale.js +1 -1
  163. package/extensions/dm-lens/clients/project-snapshot-fingerprint.js +17 -12
  164. package/extensions/dm-lens/clients/project-snapshot-persist-worker.js +2 -3
  165. package/extensions/dm-lens/clients/project-snapshot.js +229 -64
  166. package/extensions/dm-lens/clients/python-environment.js +44 -2
  167. package/extensions/dm-lens/clients/quiet-window.js +6 -3
  168. package/extensions/dm-lens/clients/read-bridge.js +28 -20
  169. package/extensions/dm-lens/clients/read-expansion.js +1 -1
  170. package/extensions/dm-lens/clients/read-guard-branch.js +129 -0
  171. package/extensions/dm-lens/clients/read-guard-logger.js +11 -3
  172. package/extensions/dm-lens/clients/read-guard-tool-lines.js +16 -8
  173. package/extensions/dm-lens/clients/read-guard.js +516 -176
  174. package/extensions/dm-lens/clients/review-graph/builder.js +132 -54
  175. package/extensions/dm-lens/clients/review-graph/git-identity.js +59 -1
  176. package/extensions/dm-lens/clients/review-graph/import-resolvers.js +6 -8
  177. package/extensions/dm-lens/clients/runtime-agent-end.js +271 -68
  178. package/extensions/dm-lens/clients/runtime-coordinator.js +386 -74
  179. package/extensions/dm-lens/clients/runtime-session.js +174 -31
  180. package/extensions/dm-lens/clients/runtime-tool-call.js +92 -17
  181. package/extensions/dm-lens/clients/runtime-tool-result.js +477 -137
  182. package/extensions/dm-lens/clients/runtime-turn.js +949 -355
  183. package/extensions/dm-lens/clients/safe-spawn.js +12 -4
  184. package/extensions/dm-lens/clients/scanner-temp-root.js +8 -0
  185. package/extensions/dm-lens/clients/scratch-tree-policy.js +9 -0
  186. package/extensions/dm-lens/clients/search-read-registration.js +2 -1
  187. package/extensions/dm-lens/clients/session-lifecycle.js +120 -18
  188. package/extensions/dm-lens/clients/session-scope.js +456 -0
  189. package/extensions/dm-lens/clients/session-state-store.js +23 -20
  190. package/extensions/dm-lens/clients/sg-runner.js +24 -6
  191. package/extensions/dm-lens/clients/sgconfig.js +35 -5
  192. package/extensions/dm-lens/clients/startup-scan.js +10 -2
  193. package/extensions/dm-lens/clients/test-runner-client.js +258 -48
  194. package/extensions/dm-lens/clients/test-runner-delivery.js +46 -9
  195. package/extensions/dm-lens/clients/test-target-roots.js +20 -0
  196. package/extensions/dm-lens/clients/tool-agreement.js +282 -19
  197. package/extensions/dm-lens/clients/tool-config.js +1 -0
  198. package/extensions/dm-lens/clients/tool-event.js +6 -0
  199. package/extensions/dm-lens/clients/tool-probe.js +8 -0
  200. package/extensions/dm-lens/clients/tool-set-policy.js +36 -26
  201. package/extensions/dm-lens/clients/tree-sitter-client.js +304 -34
  202. package/extensions/dm-lens/clients/tree-sitter-query-loader.js +76 -2
  203. package/extensions/dm-lens/clients/tree-sitter-shared.js +2 -2
  204. package/extensions/dm-lens/clients/tree-sitter-symbol-extractor.js +3 -1
  205. package/extensions/dm-lens/clients/trivy-client.js +40 -7
  206. package/extensions/dm-lens/clients/turn-end/delivery-holds.js +59 -0
  207. package/extensions/dm-lens/clients/widget-state.js +36 -2
  208. package/extensions/dm-lens/clients/word-index.js +73 -5
  209. package/extensions/dm-lens/clients/workspace-topology.js +11 -4
  210. package/extensions/dm-lens/clients/write-ordering-guard.js +4 -0
  211. package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +9 -3
  212. package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +24 -0
  213. package/extensions/dm-lens/dist/clients/actionable-warnings.js +1062 -0
  214. package/extensions/dm-lens/dist/clients/advisory-provenance.js +387 -0
  215. package/extensions/dm-lens/dist/clients/agent-behavior-client.js +94 -0
  216. package/extensions/dm-lens/dist/clients/agent-nudge.js +253 -0
  217. package/extensions/dm-lens/dist/clients/analysed-root.js +1 -0
  218. package/extensions/dm-lens/dist/clients/analysis-root.js +100 -0
  219. package/extensions/dm-lens/dist/clients/ast-grep-client.js +587 -0
  220. package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +137 -0
  221. package/extensions/dm-lens/dist/clients/ast-grep-tool-logger.js +85 -0
  222. package/extensions/dm-lens/dist/clients/ast-grep-types.js +1 -0
  223. package/extensions/dm-lens/dist/clients/ast-grep-yaml-synth.js +109 -0
  224. package/extensions/dm-lens/dist/clients/atomic-write-staging.js +66 -0
  225. package/extensions/dm-lens/dist/clients/atomic-write.js +37 -0
  226. package/extensions/dm-lens/dist/clients/availability-probe-flight.js +11 -0
  227. package/extensions/dm-lens/dist/clients/bash-file-access.js +830 -0
  228. package/extensions/dm-lens/dist/clients/biome-client.js +223 -0
  229. package/extensions/dm-lens/dist/clients/blocker-freshness.js +377 -0
  230. package/extensions/dm-lens/dist/clients/blocker-past-eof.js +49 -0
  231. package/extensions/dm-lens/dist/clients/bootstrap.js +246 -0
  232. package/extensions/dm-lens/dist/clients/bounded-cache.js +105 -0
  233. package/extensions/dm-lens/dist/clients/bounded-pid-file-lock.js +275 -0
  234. package/extensions/dm-lens/dist/clients/bounded-telemetry.js +107 -0
  235. package/extensions/dm-lens/dist/clients/build-identity.js +45 -0
  236. package/extensions/dm-lens/dist/clients/bundled-resource-health.js +41 -0
  237. package/extensions/dm-lens/dist/clients/bus-events-logger.js +48 -0
  238. package/extensions/dm-lens/dist/clients/bus-publish.js +117 -0
  239. package/extensions/dm-lens/dist/clients/cache/rule-cache.js +87 -0
  240. package/extensions/dm-lens/dist/clients/cache-manager.js +428 -0
  241. package/extensions/dm-lens/dist/clients/cache-observability.js +847 -0
  242. package/extensions/dm-lens/dist/clients/call-graph.js +628 -0
  243. package/extensions/dm-lens/dist/clients/cargo-manifest.js +171 -0
  244. package/extensions/dm-lens/dist/clients/cascade-budget.js +52 -0
  245. package/extensions/dm-lens/dist/clients/cascade-format.js +160 -0
  246. package/extensions/dm-lens/dist/clients/cascade-logger.js +22 -0
  247. package/extensions/dm-lens/dist/clients/cascade-types.js +1 -0
  248. package/extensions/dm-lens/dist/clients/child-unref.js +59 -0
  249. package/extensions/dm-lens/dist/clients/code-quality-warnings.js +192 -0
  250. package/extensions/dm-lens/dist/clients/codebase-model.js +110 -0
  251. package/extensions/dm-lens/dist/clients/collateral-test-role.js +8 -0
  252. package/extensions/dm-lens/dist/clients/complexity-client.js +398 -0
  253. package/extensions/dm-lens/dist/clients/config-core/deny.js +117 -0
  254. package/extensions/dm-lens/dist/clients/config-core/index.js +2 -0
  255. package/extensions/dm-lens/dist/clients/config-core/merge.js +228 -0
  256. package/extensions/dm-lens/dist/clients/config-core/normalize.js +226 -0
  257. package/extensions/dm-lens/dist/clients/config-core/process-spec.js +147 -0
  258. package/extensions/dm-lens/dist/clients/config-core/provenance.js +54 -0
  259. package/extensions/dm-lens/dist/clients/config-core/records.js +79 -0
  260. package/extensions/dm-lens/dist/clients/config-core/resolve.js +48 -0
  261. package/extensions/dm-lens/dist/clients/config-core/safe-object.js +22 -0
  262. package/extensions/dm-lens/dist/clients/config-core/schema.js +93 -0
  263. package/extensions/dm-lens/dist/clients/config-diagnostic-codes.js +90 -0
  264. package/extensions/dm-lens/dist/clients/config-locations.js +175 -0
  265. package/extensions/dm-lens/dist/clients/config-resolve.js +359 -0
  266. package/extensions/dm-lens/dist/clients/config-schema.js +230 -0
  267. package/extensions/dm-lens/dist/clients/config-warn.js +146 -0
  268. package/extensions/dm-lens/dist/clients/confirmed-delete.js +11 -0
  269. package/extensions/dm-lens/dist/clients/console-guard-install.js +4 -0
  270. package/extensions/dm-lens/dist/clients/cooperative-budget.js +36 -0
  271. package/extensions/dm-lens/dist/clients/custom-rule-locations.js +28 -0
  272. package/extensions/dm-lens/dist/clients/dead-code-client.js +408 -0
  273. package/extensions/dm-lens/dist/clients/dead-code-logger.js +18 -0
  274. package/extensions/dm-lens/dist/clients/deadline-utils.js +117 -0
  275. package/extensions/dm-lens/dist/clients/debug-handles.js +121 -0
  276. package/extensions/dm-lens/dist/clients/debug-heap.js +80 -0
  277. package/extensions/dm-lens/dist/clients/deferred-lsp-work.js +33 -0
  278. package/extensions/dm-lens/dist/clients/deferred-runner-blockers.js +106 -0
  279. package/extensions/dm-lens/dist/clients/deferred-test-targets.js +31 -0
  280. package/extensions/dm-lens/dist/clients/degradation-ledger.js +289 -0
  281. package/extensions/dm-lens/dist/clients/demoted-finding-render.js +64 -0
  282. package/extensions/dm-lens/dist/clients/dependency-checker.js +534 -0
  283. package/extensions/dm-lens/dist/clients/deps/ast-grep-napi.js +17 -0
  284. package/extensions/dm-lens/dist/clients/deps/dm-host-deps.js +10 -0
  285. package/extensions/dm-lens/dist/clients/deps/dm-tui-compat.js +58 -0
  286. package/extensions/dm-lens/dist/clients/deps/js-yaml.js +7 -0
  287. package/extensions/dm-lens/dist/clients/deps/minimatch.js +6 -0
  288. package/extensions/dm-lens/dist/clients/deps/pidusage.js +5 -0
  289. package/extensions/dm-lens/dist/clients/deps/typebox.js +5 -0
  290. package/extensions/dm-lens/dist/clients/deps/vscode-jsonrpc.js +8 -0
  291. package/extensions/dm-lens/dist/clients/deps/web-tree-sitter.js +11 -0
  292. package/extensions/dm-lens/dist/clients/diagnostic-dispositions.js +318 -0
  293. package/extensions/dm-lens/dist/clients/diagnostic-line-freshness.js +142 -0
  294. package/extensions/dm-lens/dist/clients/diagnostic-logger.js +60 -0
  295. package/extensions/dm-lens/dist/clients/diagnostic-tracker.js +89 -0
  296. package/extensions/dm-lens/dist/clients/diagnostics-publish.js +134 -0
  297. package/extensions/dm-lens/dist/clients/dispatch/adopted-root-runners.js +22 -0
  298. package/extensions/dm-lens/dist/clients/dispatch/ast-grep-catalog.js +16 -0
  299. package/extensions/dm-lens/dist/clients/dispatch/auxiliary-lsp.js +158 -0
  300. package/extensions/dm-lens/dist/clients/dispatch/collect-later-tier.js +25 -0
  301. package/extensions/dm-lens/dist/clients/dispatch/diagnostic-taxonomy.js +58 -0
  302. package/extensions/dm-lens/dist/clients/dispatch/dispatcher.js +1017 -0
  303. package/extensions/dm-lens/dist/clients/dispatch/fact-provider-types.js +1 -0
  304. package/extensions/dm-lens/dist/clients/dispatch/fact-rule-runner.js +17 -0
  305. package/extensions/dm-lens/dist/clients/dispatch/fact-runner.js +18 -0
  306. package/extensions/dm-lens/dist/clients/dispatch/fact-scheduler.js +52 -0
  307. package/extensions/dm-lens/dist/clients/dispatch/fact-store.js +199 -0
  308. package/extensions/dm-lens/dist/clients/dispatch/facts/comment-facts.js +23 -0
  309. package/extensions/dm-lens/dist/clients/dispatch/facts/file-content.js +18 -0
  310. package/extensions/dm-lens/dist/clients/dispatch/facts/function-facts.js +281 -0
  311. package/extensions/dm-lens/dist/clients/dispatch/facts/import-facts.js +169 -0
  312. package/extensions/dm-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +19 -0
  313. package/extensions/dm-lens/dist/clients/dispatch/facts/try-catch-facts.js +95 -0
  314. package/extensions/dm-lens/dist/clients/dispatch/finding-policy.js +164 -0
  315. package/extensions/dm-lens/dist/clients/dispatch/indent-detect.js +227 -0
  316. package/extensions/dm-lens/dist/clients/dispatch/inline-suppressions.js +52 -0
  317. package/extensions/dm-lens/dist/clients/dispatch/integration.js +1502 -0
  318. package/extensions/dm-lens/dist/clients/dispatch/known-runner-ids.js +13 -0
  319. package/extensions/dm-lens/dist/clients/dispatch/lazy.js +8 -0
  320. package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +130 -0
  321. package/extensions/dm-lens/dist/clients/dispatch/plan.js +284 -0
  322. package/extensions/dm-lens/dist/clients/dispatch/priorities.js +14 -0
  323. package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +49 -0
  324. package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +21 -0
  325. package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +102 -0
  326. package/extensions/dm-lens/dist/clients/dispatch/rules/async-noise.js +31 -0
  327. package/extensions/dm-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +27 -0
  328. package/extensions/dm-lens/dist/clients/dispatch/rules/cors-wildcard.js +35 -0
  329. package/extensions/dm-lens/dist/clients/dispatch/rules/error-obscuring.js +29 -0
  330. package/extensions/dm-lens/dist/clients/dispatch/rules/error-swallowing.js +29 -0
  331. package/extensions/dm-lens/dist/clients/dispatch/rules/framework-call-noise.js +31 -0
  332. package/extensions/dm-lens/dist/clients/dispatch/rules/high-complexity.js +56 -0
  333. package/extensions/dm-lens/dist/clients/dispatch/rules/high-fan-out.js +45 -0
  334. package/extensions/dm-lens/dist/clients/dispatch/rules/high-import-coupling.js +31 -0
  335. package/extensions/dm-lens/dist/clients/dispatch/rules/missing-error-propagation.js +45 -0
  336. package/extensions/dm-lens/dist/clients/dispatch/rules/no-commented-credentials.js +46 -0
  337. package/extensions/dm-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +38 -0
  338. package/extensions/dm-lens/dist/clients/dispatch/rules/placeholder-comments.js +40 -0
  339. package/extensions/dm-lens/dist/clients/dispatch/rules/unsafe-boundary.js +101 -0
  340. package/extensions/dm-lens/dist/clients/dispatch/runner-context.js +46 -0
  341. package/extensions/dm-lens/dist/clients/dispatch/runners/actionlint.js +98 -0
  342. package/extensions/dm-lens/dist/clients/dispatch/runners/ast-grep-napi.js +694 -0
  343. package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +205 -0
  344. package/extensions/dm-lens/dist/clients/dispatch/runners/cpp-check.js +190 -0
  345. package/extensions/dm-lens/dist/clients/dispatch/runners/credo.js +66 -0
  346. package/extensions/dm-lens/dist/clients/dispatch/runners/cue-vet.js +171 -0
  347. package/extensions/dm-lens/dist/clients/dispatch/runners/dart-analyze.js +151 -0
  348. package/extensions/dm-lens/dist/clients/dispatch/runners/detekt.js +157 -0
  349. package/extensions/dm-lens/dist/clients/dispatch/runners/dotnet-build.js +157 -0
  350. package/extensions/dm-lens/dist/clients/dispatch/runners/elixir-check.js +153 -0
  351. package/extensions/dm-lens/dist/clients/dispatch/runners/eslint.js +99 -0
  352. package/extensions/dm-lens/dist/clients/dispatch/runners/fact-rules.js +20 -0
  353. package/extensions/dm-lens/dist/clients/dispatch/runners/fish-indent.js +66 -0
  354. package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +110 -0
  355. package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +52 -0
  356. package/extensions/dm-lens/dist/clients/dispatch/runners/golangci-lint.js +89 -0
  357. package/extensions/dm-lens/dist/clients/dispatch/runners/hadolint.js +83 -0
  358. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-lint.js +144 -0
  359. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-render.js +593 -0
  360. package/extensions/dm-lens/dist/clients/dispatch/runners/htmlhint.js +103 -0
  361. package/extensions/dm-lens/dist/clients/dispatch/runners/index.js +100 -0
  362. package/extensions/dm-lens/dist/clients/dispatch/runners/javac.js +82 -0
  363. package/extensions/dm-lens/dist/clients/dispatch/runners/ktlint.js +93 -0
  364. package/extensions/dm-lens/dist/clients/dispatch/runners/lsp.js +226 -0
  365. package/extensions/dm-lens/dist/clients/dispatch/runners/markdownlint.js +129 -0
  366. package/extensions/dm-lens/dist/clients/dispatch/runners/mypy.js +70 -0
  367. package/extensions/dm-lens/dist/clients/dispatch/runners/oxlint.js +305 -0
  368. package/extensions/dm-lens/dist/clients/dispatch/runners/php-lint.js +66 -0
  369. package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +90 -0
  370. package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +66 -0
  371. package/extensions/dm-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +307 -0
  372. package/extensions/dm-lens/dist/clients/dispatch/runners/pyright.js +118 -0
  373. package/extensions/dm-lens/dist/clients/dispatch/runners/rubocop.js +79 -0
  374. package/extensions/dm-lens/dist/clients/dispatch/runners/ruff.js +69 -0
  375. package/extensions/dm-lens/dist/clients/dispatch/runners/rust-clippy.js +166 -0
  376. package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +177 -0
  377. package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +85 -0
  378. package/extensions/dm-lens/dist/clients/dispatch/runners/spellcheck.js +74 -0
  379. package/extensions/dm-lens/dist/clients/dispatch/runners/spotbugs.js +208 -0
  380. package/extensions/dm-lens/dist/clients/dispatch/runners/sqlfluff.js +136 -0
  381. package/extensions/dm-lens/dist/clients/dispatch/runners/stylelint.js +118 -0
  382. package/extensions/dm-lens/dist/clients/dispatch/runners/swiftlint.js +143 -0
  383. package/extensions/dm-lens/dist/clients/dispatch/runners/taplo.js +108 -0
  384. package/extensions/dm-lens/dist/clients/dispatch/runners/terragrunt.js +110 -0
  385. package/extensions/dm-lens/dist/clients/dispatch/runners/tflint.js +104 -0
  386. package/extensions/dm-lens/dist/clients/dispatch/runners/tree-sitter.js +521 -0
  387. package/extensions/dm-lens/dist/clients/dispatch/runners/trivy-config.js +155 -0
  388. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/availability-policy.js +285 -0
  389. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +61 -0
  390. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +61 -0
  391. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +130 -0
  392. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +1143 -0
  393. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +40 -0
  394. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/tool-failure.js +120 -0
  395. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +88 -0
  396. package/extensions/dm-lens/dist/clients/dispatch/runners/utils.js +8 -0
  397. package/extensions/dm-lens/dist/clients/dispatch/runners/vale.js +106 -0
  398. package/extensions/dm-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +170 -0
  399. package/extensions/dm-lens/dist/clients/dispatch/runners/yamllint.js +83 -0
  400. package/extensions/dm-lens/dist/clients/dispatch/runners/zig-check.js +72 -0
  401. package/extensions/dm-lens/dist/clients/dispatch/suppress-writer.js +57 -0
  402. package/extensions/dm-lens/dist/clients/dispatch/tool-profile.js +30 -0
  403. package/extensions/dm-lens/dist/clients/dispatch/types.js +27 -0
  404. package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +58 -0
  405. package/extensions/dm-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +31 -0
  406. package/extensions/dm-lens/dist/clients/disposition-logger.js +19 -0
  407. package/extensions/dm-lens/dist/clients/disposition-publish.js +88 -0
  408. package/extensions/dm-lens/dist/clients/durable-store.js +77 -0
  409. package/extensions/dm-lens/dist/clients/effective-config.js +170 -0
  410. package/extensions/dm-lens/dist/clients/env-utils.js +26 -0
  411. package/extensions/dm-lens/dist/clients/ephemeral-root.js +67 -0
  412. package/extensions/dm-lens/dist/clients/error-class.js +3 -0
  413. package/extensions/dm-lens/dist/clients/eval-timestamp.js +2 -0
  414. package/extensions/dm-lens/dist/clients/event-loop-hold.js +119 -0
  415. package/extensions/dm-lens/dist/clients/event-loop-monitor.js +84 -0
  416. package/extensions/dm-lens/dist/clients/extension-log.js +230 -0
  417. package/extensions/dm-lens/dist/clients/extension-mode.js +20 -0
  418. package/extensions/dm-lens/dist/clients/feature-hints.js +88 -0
  419. package/extensions/dm-lens/dist/clients/file-kinds.js +313 -0
  420. package/extensions/dm-lens/dist/clients/file-mutation-queue.js +95 -0
  421. package/extensions/dm-lens/dist/clients/file-role.js +50 -0
  422. package/extensions/dm-lens/dist/clients/file-time.js +112 -0
  423. package/extensions/dm-lens/dist/clients/file-utils.js +706 -0
  424. package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +132 -0
  425. package/extensions/dm-lens/dist/clients/finding-identity.js +23 -0
  426. package/extensions/dm-lens/dist/clients/fix-run-restore.js +413 -0
  427. package/extensions/dm-lens/dist/clients/fix-worklog.js +75 -0
  428. package/extensions/dm-lens/dist/clients/format-events-publish.js +310 -0
  429. package/extensions/dm-lens/dist/clients/format-service.js +159 -0
  430. package/extensions/dm-lens/dist/clients/formatters-lazy.js +8 -0
  431. package/extensions/dm-lens/dist/clients/formatters.js +1367 -0
  432. package/extensions/dm-lens/dist/clients/freshness-cadence.js +1 -0
  433. package/extensions/dm-lens/dist/clients/freshness.js +8 -0
  434. package/extensions/dm-lens/dist/clients/generated-artifacts.js +209 -0
  435. package/extensions/dm-lens/dist/clients/generation-guard.js +147 -0
  436. package/extensions/dm-lens/dist/clients/generation-lock.js +181 -0
  437. package/extensions/dm-lens/dist/clients/git-guard.js +786 -0
  438. package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +120 -0
  439. package/extensions/dm-lens/dist/clients/gitleaks-client.js +290 -0
  440. package/extensions/dm-lens/dist/clients/go-client.js +47 -0
  441. package/extensions/dm-lens/dist/clients/govulncheck-client.js +411 -0
  442. package/extensions/dm-lens/dist/clients/gradle-ktfmt-style.js +177 -0
  443. package/extensions/dm-lens/dist/clients/grammar-source.js +229 -0
  444. package/extensions/dm-lens/dist/clients/grammar-wasm-imports.js +48 -0
  445. package/extensions/dm-lens/dist/clients/gzip-stage-write.js +93 -0
  446. package/extensions/dm-lens/dist/clients/hard-failure-summary.js +28 -0
  447. package/extensions/dm-lens/dist/clients/hashline-anchor.js +222 -0
  448. package/extensions/dm-lens/dist/clients/hook-budgets.js +17 -0
  449. package/extensions/dm-lens/dist/clients/host-edit-normalize.js +87 -0
  450. package/extensions/dm-lens/dist/clients/host-ports.js +35 -0
  451. package/extensions/dm-lens/dist/clients/indent-retarget.js +102 -0
  452. package/extensions/dm-lens/dist/clients/inline-blocker-dispositions.js +103 -0
  453. package/extensions/dm-lens/dist/clients/inline-blocker-fields.js +8 -0
  454. package/extensions/dm-lens/dist/clients/install-diagnostics.js +135 -0
  455. package/extensions/dm-lens/dist/clients/installer/index.js +3935 -0
  456. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh-session.js +17 -0
  457. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh.js +522 -0
  458. package/extensions/dm-lens/dist/clients/instance-reaper-state.js +3 -0
  459. package/extensions/dm-lens/dist/clients/instance-reaper.js +682 -0
  460. package/extensions/dm-lens/dist/clients/instance-registry-lock.js +166 -0
  461. package/extensions/dm-lens/dist/clients/instance-registry-tail.js +17 -0
  462. package/extensions/dm-lens/dist/clients/instance-registry.js +595 -0
  463. package/extensions/dm-lens/dist/clients/io-bridge-contract.js +7 -0
  464. package/extensions/dm-lens/dist/clients/io-bridge.js +357 -0
  465. package/extensions/dm-lens/dist/clients/jscpd-client.js +300 -0
  466. package/extensions/dm-lens/dist/clients/json-cache-read.js +25 -0
  467. package/extensions/dm-lens/dist/clients/knip-client.js +534 -0
  468. package/extensions/dm-lens/dist/clients/knip-scan-roots.js +26 -0
  469. package/extensions/dm-lens/dist/clients/language-policy.js +244 -0
  470. package/extensions/dm-lens/dist/clients/language-profile.js +263 -0
  471. package/extensions/dm-lens/dist/clients/language-registry.js +427 -0
  472. package/extensions/dm-lens/dist/clients/latency-logger.js +202 -0
  473. package/extensions/dm-lens/dist/clients/lazy-import.js +14 -0
  474. package/extensions/dm-lens/dist/clients/ledger-bounds.js +21 -0
  475. package/extensions/dm-lens/dist/clients/lens-config.js +246 -0
  476. package/extensions/dm-lens/dist/clients/lens-engine.js +181 -0
  477. package/extensions/dm-lens/dist/clients/lens-events.js +105 -0
  478. package/extensions/dm-lens/dist/clients/lens-flag-registry.js +292 -0
  479. package/extensions/dm-lens/dist/clients/lens-map.js +980 -0
  480. package/extensions/dm-lens/dist/clients/live-bus-emitter.js +53 -0
  481. package/extensions/dm-lens/dist/clients/log-cleanup.js +138 -0
  482. package/extensions/dm-lens/dist/clients/lsp/aggregation.js +89 -0
  483. package/extensions/dm-lens/dist/clients/lsp/auxiliary-lifecycle.js +23 -0
  484. package/extensions/dm-lens/dist/clients/lsp/capabilities.js +94 -0
  485. package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +208 -0
  486. package/extensions/dm-lens/dist/clients/lsp/client.js +2943 -0
  487. package/extensions/dm-lens/dist/clients/lsp/config.js +471 -0
  488. package/extensions/dm-lens/dist/clients/lsp/content-limits.js +21 -0
  489. package/extensions/dm-lens/dist/clients/lsp/diagnostic-binding.js +79 -0
  490. package/extensions/dm-lens/dist/clients/lsp/document-drift.js +324 -0
  491. package/extensions/dm-lens/dist/clients/lsp/edits.js +982 -0
  492. package/extensions/dm-lens/dist/clients/lsp/grouping.js +38 -0
  493. package/extensions/dm-lens/dist/clients/lsp/index.js +4639 -0
  494. package/extensions/dm-lens/dist/clients/lsp/inferred-project.js +121 -0
  495. package/extensions/dm-lens/dist/clients/lsp/jvm-runtime.js +194 -0
  496. package/extensions/dm-lens/dist/clients/lsp/language.js +23 -0
  497. package/extensions/dm-lens/dist/clients/lsp/launch.js +564 -0
  498. package/extensions/dm-lens/dist/clients/lsp/lombok.js +146 -0
  499. package/extensions/dm-lens/dist/clients/lsp/path-utils.js +1 -0
  500. package/extensions/dm-lens/dist/clients/lsp/pending-aux-coverage.js +120 -0
  501. package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +28 -0
  502. package/extensions/dm-lens/dist/clients/lsp/resolved-config.js +183 -0
  503. package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +42 -0
  504. package/extensions/dm-lens/dist/clients/lsp/server-covers.js +8 -0
  505. package/extensions/dm-lens/dist/clients/lsp/server-traits.js +39 -0
  506. package/extensions/dm-lens/dist/clients/lsp/server.js +2640 -0
  507. package/extensions/dm-lens/dist/clients/lsp/service-singleton.js +59 -0
  508. package/extensions/dm-lens/dist/clients/lsp/session-roots.js +52 -0
  509. package/extensions/dm-lens/dist/clients/lsp/spawn-history.js +15 -0
  510. package/extensions/dm-lens/dist/clients/lsp/sync-kind.js +30 -0
  511. package/extensions/dm-lens/dist/clients/lsp/tsserver-sync.js +156 -0
  512. package/extensions/dm-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +1 -0
  513. package/extensions/dm-lens/dist/clients/lsp/wait-policy/classification.js +37 -0
  514. package/extensions/dm-lens/dist/clients/lsp/wait-policy/index.js +3 -0
  515. package/extensions/dm-lens/dist/clients/lsp/wait-policy/strategies.js +196 -0
  516. package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +40 -0
  517. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +270 -0
  518. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-session.js +7 -0
  519. package/extensions/dm-lens/dist/clients/lsp/workspace-sweep-hold.js +93 -0
  520. package/extensions/dm-lens/dist/clients/lsp-budget.js +87 -0
  521. package/extensions/dm-lens/dist/clients/lsp-document-symbols.js +93 -0
  522. package/extensions/dm-lens/dist/clients/lsp-lazy.js +8 -0
  523. package/extensions/dm-lens/dist/clients/lsp-mutation.js +309 -0
  524. package/extensions/dm-lens/dist/clients/lsp-status.js +35 -0
  525. package/extensions/dm-lens/dist/clients/map-with-concurrency.js +20 -0
  526. package/extensions/dm-lens/dist/clients/mcp/analyze.js +265 -0
  527. package/extensions/dm-lens/dist/clients/mcp/host-shim.js +14 -0
  528. package/extensions/dm-lens/dist/clients/mcp/ipc.js +321 -0
  529. package/extensions/dm-lens/dist/clients/mcp/review.js +137 -0
  530. package/extensions/dm-lens/dist/clients/mcp/session.js +305 -0
  531. package/extensions/dm-lens/dist/clients/memory-sampler.js +145 -0
  532. package/extensions/dm-lens/dist/clients/message-end-attribution.js +18 -0
  533. package/extensions/dm-lens/dist/clients/metrics-client.js +80 -0
  534. package/extensions/dm-lens/dist/clients/metrics-history.js +255 -0
  535. package/extensions/dm-lens/dist/clients/middle-man-analysis.js +161 -0
  536. package/extensions/dm-lens/dist/clients/model-provider.js +31 -0
  537. package/extensions/dm-lens/dist/clients/module-report-lsp.js +140 -0
  538. package/extensions/dm-lens/dist/clients/module-report.js +1648 -0
  539. package/extensions/dm-lens/dist/clients/mutating-tool.js +386 -0
  540. package/extensions/dm-lens/dist/clients/mutation-attribution.js +176 -0
  541. package/extensions/dm-lens/dist/clients/mutation-bridge.js +231 -0
  542. package/extensions/dm-lens/dist/clients/ndjson-logger.js +504 -0
  543. package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +43 -0
  544. package/extensions/dm-lens/dist/clients/observed-mutation.js +729 -0
  545. package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +100 -0
  546. package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +340 -0
  547. package/extensions/dm-lens/dist/clients/opengrep-client.js +219 -0
  548. package/extensions/dm-lens/dist/clients/opengrep-config.js +52 -0
  549. package/extensions/dm-lens/dist/clients/package-manager.js +358 -0
  550. package/extensions/dm-lens/dist/clients/package-root.js +25 -0
  551. package/extensions/dm-lens/dist/clients/partial-edit-apply.js +337 -0
  552. package/extensions/dm-lens/dist/clients/path-attribution-telemetry.js +31 -0
  553. package/extensions/dm-lens/dist/clients/path-keyed-map.js +57 -0
  554. package/extensions/dm-lens/dist/clients/path-utils.js +535 -0
  555. package/extensions/dm-lens/dist/clients/performance-report.js +291 -0
  556. package/extensions/dm-lens/dist/clients/persist-debounce.js +37 -0
  557. package/extensions/dm-lens/dist/clients/persist-worker-stats.js +8 -0
  558. package/extensions/dm-lens/dist/clients/persistent-reverify.js +166 -0
  559. package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +15 -0
  560. package/extensions/dm-lens/dist/clients/pipeline.js +1279 -0
  561. package/extensions/dm-lens/dist/clients/post-autofix-notice.js +19 -0
  562. package/extensions/dm-lens/dist/clients/print-mode.js +3 -0
  563. package/extensions/dm-lens/dist/clients/probe-home-state.js +67 -0
  564. package/extensions/dm-lens/dist/clients/process-bridge.js +48 -0
  565. package/extensions/dm-lens/dist/clients/process-singletons.js +69 -0
  566. package/extensions/dm-lens/dist/clients/process-snapshot.js +130 -0
  567. package/extensions/dm-lens/dist/clients/project-changes.js +174 -0
  568. package/extensions/dm-lens/dist/clients/project-conventions.js +152 -0
  569. package/extensions/dm-lens/dist/clients/project-diagnostics/cache.js +91 -0
  570. package/extensions/dm-lens/dist/clients/project-diagnostics/extractors.js +53 -0
  571. package/extensions/dm-lens/dist/clients/project-diagnostics/fresh-fetch.js +413 -0
  572. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +64 -0
  573. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +38 -0
  574. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +21 -0
  575. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +23 -0
  576. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +28 -0
  577. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +45 -0
  578. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +34 -0
  579. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +32 -0
  580. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +79 -0
  581. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +41 -0
  582. package/extensions/dm-lens/dist/clients/project-diagnostics/scanner.js +349 -0
  583. package/extensions/dm-lens/dist/clients/project-diagnostics/types.js +1 -0
  584. package/extensions/dm-lens/dist/clients/project-lens-config.js +464 -0
  585. package/extensions/dm-lens/dist/clients/project-report.js +527 -0
  586. package/extensions/dm-lens/dist/clients/project-scale.js +60 -0
  587. package/extensions/dm-lens/dist/clients/project-scan-policy.js +4 -0
  588. package/extensions/dm-lens/dist/clients/project-snapshot-fingerprint.js +44 -0
  589. package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +13 -0
  590. package/extensions/dm-lens/dist/clients/project-snapshot.js +1333 -0
  591. package/extensions/dm-lens/dist/clients/project-trust.js +104 -0
  592. package/extensions/dm-lens/dist/clients/python-environment.js +162 -0
  593. package/extensions/dm-lens/dist/clients/python-provenance.js +551 -0
  594. package/extensions/dm-lens/dist/clients/quiet-window-config.js +16 -0
  595. package/extensions/dm-lens/dist/clients/quiet-window.js +129 -0
  596. package/extensions/dm-lens/dist/clients/read-bridge.js +53 -0
  597. package/extensions/dm-lens/dist/clients/read-expansion.js +218 -0
  598. package/extensions/dm-lens/dist/clients/read-guard-branch.js +126 -0
  599. package/extensions/dm-lens/dist/clients/read-guard-logger.js +186 -0
  600. package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +1050 -0
  601. package/extensions/dm-lens/dist/clients/read-guard.js +1429 -0
  602. package/extensions/dm-lens/dist/clients/recent-touches.js +126 -0
  603. package/extensions/dm-lens/dist/clients/redact/secrets.js +386 -0
  604. package/extensions/dm-lens/dist/clients/resource-sampler.js +344 -0
  605. package/extensions/dm-lens/dist/clients/reverse-deps.js +227 -0
  606. package/extensions/dm-lens/dist/clients/review-graph/builder.js +3708 -0
  607. package/extensions/dm-lens/dist/clients/review-graph/format.js +30 -0
  608. package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +168 -0
  609. package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +323 -0
  610. package/extensions/dm-lens/dist/clients/review-graph/persist-worker.js +8 -0
  611. package/extensions/dm-lens/dist/clients/review-graph/query.js +195 -0
  612. package/extensions/dm-lens/dist/clients/review-graph/revision-drift.js +3 -0
  613. package/extensions/dm-lens/dist/clients/review-graph/service.js +60 -0
  614. package/extensions/dm-lens/dist/clients/review-graph/shared-extraction-ir.js +54 -0
  615. package/extensions/dm-lens/dist/clients/review-graph/symbol-id.js +29 -0
  616. package/extensions/dm-lens/dist/clients/review-graph/tsconfig-paths.js +253 -0
  617. package/extensions/dm-lens/dist/clients/review-graph/types.js +1 -0
  618. package/extensions/dm-lens/dist/clients/review-graph/workspace-modules.js +374 -0
  619. package/extensions/dm-lens/dist/clients/review-graph-logger.js +51 -0
  620. package/extensions/dm-lens/dist/clients/ruff-client.js +109 -0
  621. package/extensions/dm-lens/dist/clients/rules-scanner.js +113 -0
  622. package/extensions/dm-lens/dist/clients/run-duration.js +9 -0
  623. package/extensions/dm-lens/dist/clients/runtime-agent-end.js +800 -0
  624. package/extensions/dm-lens/dist/clients/runtime-config.js +39 -0
  625. package/extensions/dm-lens/dist/clients/runtime-context.js +155 -0
  626. package/extensions/dm-lens/dist/clients/runtime-coordinator.js +1117 -0
  627. package/extensions/dm-lens/dist/clients/runtime-session.js +1768 -0
  628. package/extensions/dm-lens/dist/clients/runtime-tool-call.js +935 -0
  629. package/extensions/dm-lens/dist/clients/runtime-tool-result.js +1630 -0
  630. package/extensions/dm-lens/dist/clients/runtime-turn.js +2900 -0
  631. package/extensions/dm-lens/dist/clients/rust-client.js +48 -0
  632. package/extensions/dm-lens/dist/clients/safe-spawn.js +1275 -0
  633. package/extensions/dm-lens/dist/clients/sanitize.js +174 -0
  634. package/extensions/dm-lens/dist/clients/scan-utils.js +7 -0
  635. package/extensions/dm-lens/dist/clients/scanner-temp-root.js +8 -0
  636. package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +63 -0
  637. package/extensions/dm-lens/dist/clients/search-read-registration.js +60 -0
  638. package/extensions/dm-lens/dist/clients/secret-findings.js +69 -0
  639. package/extensions/dm-lens/dist/clients/security-scan-client.js +208 -0
  640. package/extensions/dm-lens/dist/clients/session-event-guard.js +111 -0
  641. package/extensions/dm-lens/dist/clients/session-lifecycle.js +269 -0
  642. package/extensions/dm-lens/dist/clients/session-scope.js +451 -0
  643. package/extensions/dm-lens/dist/clients/session-start-observability.js +47 -0
  644. package/extensions/dm-lens/dist/clients/session-state-store.js +66 -0
  645. package/extensions/dm-lens/dist/clients/session-summary.js +8 -0
  646. package/extensions/dm-lens/dist/clients/sessionstart-logger.js +22 -0
  647. package/extensions/dm-lens/dist/clients/sg-runner.js +645 -0
  648. package/extensions/dm-lens/dist/clients/sgconfig.js +306 -0
  649. package/extensions/dm-lens/dist/clients/shared-checkout-guard.js +177 -0
  650. package/extensions/dm-lens/dist/clients/single-flight.js +52 -0
  651. package/extensions/dm-lens/dist/clients/situational-tool-telemetry.js +85 -0
  652. package/extensions/dm-lens/dist/clients/skills-resolver.js +38 -0
  653. package/extensions/dm-lens/dist/clients/slow-fs.js +77 -0
  654. package/extensions/dm-lens/dist/clients/smells-rollup.js +118 -0
  655. package/extensions/dm-lens/dist/clients/source-filter.js +320 -0
  656. package/extensions/dm-lens/dist/clients/source-walker.js +96 -0
  657. package/extensions/dm-lens/dist/clients/spawn-output-cap.js +35 -0
  658. package/extensions/dm-lens/dist/clients/spawn-timeout-cooldown.js +51 -0
  659. package/extensions/dm-lens/dist/clients/stale-marker.js +1 -0
  660. package/extensions/dm-lens/dist/clients/startup-scan.js +230 -0
  661. package/extensions/dm-lens/dist/clients/startup-timing.js +67 -0
  662. package/extensions/dm-lens/dist/clients/string-utils.js +6 -0
  663. package/extensions/dm-lens/dist/clients/subagent-mode.js +40 -0
  664. package/extensions/dm-lens/dist/clients/symbol-containment.js +16 -0
  665. package/extensions/dm-lens/dist/clients/symbol-types.js +1 -0
  666. package/extensions/dm-lens/dist/clients/test-runner-client.js +1697 -0
  667. package/extensions/dm-lens/dist/clients/test-runner-delivery.js +293 -0
  668. package/extensions/dm-lens/dist/clients/test-target-roots.js +17 -0
  669. package/extensions/dm-lens/dist/clients/todo-scanner.js +164 -0
  670. package/extensions/dm-lens/dist/clients/tool-agreement.js +640 -0
  671. package/extensions/dm-lens/dist/clients/tool-config.js +219 -0
  672. package/extensions/dm-lens/dist/clients/tool-cwd.js +235 -0
  673. package/extensions/dm-lens/dist/clients/tool-definition.js +22 -0
  674. package/extensions/dm-lens/dist/clients/tool-event.js +24 -0
  675. package/extensions/dm-lens/dist/clients/tool-policy.js +2393 -0
  676. package/extensions/dm-lens/dist/clients/tool-probe.js +13 -0
  677. package/extensions/dm-lens/dist/clients/tool-render.js +79 -0
  678. package/extensions/dm-lens/dist/clients/tool-set-policy.js +77 -0
  679. package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +206 -0
  680. package/extensions/dm-lens/dist/clients/tree-sitter-client.js +3057 -0
  681. package/extensions/dm-lens/dist/clients/tree-sitter-logger.js +77 -0
  682. package/extensions/dm-lens/dist/clients/tree-sitter-navigator.js +198 -0
  683. package/extensions/dm-lens/dist/clients/tree-sitter-query-loader.js +389 -0
  684. package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +87 -0
  685. package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +959 -0
  686. package/extensions/dm-lens/dist/clients/trivy-client.js +335 -0
  687. package/extensions/dm-lens/dist/clients/tui-fit.js +26 -0
  688. package/extensions/dm-lens/dist/clients/turn-context.js +48 -0
  689. package/extensions/dm-lens/dist/clients/turn-end/delivery-holds.js +59 -0
  690. package/extensions/dm-lens/dist/clients/turn-end/lane.js +1 -0
  691. package/extensions/dm-lens/dist/clients/turn-end/lanes/govulncheck.js +54 -0
  692. package/extensions/dm-lens/dist/clients/turn-end/lanes/secrets.js +131 -0
  693. package/extensions/dm-lens/dist/clients/turn-summary-render.js +56 -0
  694. package/extensions/dm-lens/dist/clients/turn-summary.js +84 -0
  695. package/extensions/dm-lens/dist/clients/typos-config.js +9 -0
  696. package/extensions/dm-lens/dist/clients/user-notify.js +15 -0
  697. package/extensions/dm-lens/dist/clients/vanished-instance-marker.js +18 -0
  698. package/extensions/dm-lens/dist/clients/warm-attach.js +210 -0
  699. package/extensions/dm-lens/dist/clients/widget-state.js +997 -0
  700. package/extensions/dm-lens/dist/clients/word-index-logger.js +21 -0
  701. package/extensions/dm-lens/dist/clients/word-index-store.js +222 -0
  702. package/extensions/dm-lens/dist/clients/word-index.js +1494 -0
  703. package/extensions/dm-lens/dist/clients/workspace-topology.js +268 -0
  704. package/extensions/dm-lens/dist/clients/write-ordering-guard.js +28 -0
  705. package/extensions/dm-lens/dist/clients/zizmor-config.js +160 -0
  706. package/extensions/dm-lens/dist/i18n.js +67 -0
  707. package/extensions/dm-lens/dist/index.js +1973 -0
  708. package/extensions/dm-lens/dist/mcp/analyze-cli.js +205 -0
  709. package/extensions/dm-lens/dist/mcp/build-staleness.js +55 -0
  710. package/extensions/dm-lens/dist/mcp/cli.js +96 -0
  711. package/extensions/dm-lens/dist/mcp/server.js +1239 -0
  712. package/extensions/dm-lens/dist/mcp/tool-arguments.js +134 -0
  713. package/extensions/dm-lens/dist/mcp/worker.js +41 -0
  714. package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +375 -0
  715. package/extensions/dm-lens/dist/scripts/lib/skills-predicate.mjs +53 -0
  716. package/extensions/dm-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +51 -0
  717. package/extensions/dm-lens/dist/tools/activate-tools.js +62 -0
  718. package/extensions/dm-lens/dist/tools/ast-grep-outline.js +126 -0
  719. package/extensions/dm-lens/dist/tools/ast-grep-replace.js +227 -0
  720. package/extensions/dm-lens/dist/tools/ast-grep-search.js +687 -0
  721. package/extensions/dm-lens/dist/tools/effective-config.js +59 -0
  722. package/extensions/dm-lens/dist/tools/lens-diagnostic-mark.js +251 -0
  723. package/extensions/dm-lens/dist/tools/lens-diagnostics.js +1518 -0
  724. package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +1198 -0
  725. package/extensions/dm-lens/dist/tools/lsp-navigation.js +1249 -0
  726. package/extensions/dm-lens/dist/tools/lsp-structured-output.js +277 -0
  727. package/extensions/dm-lens/dist/tools/module-report.js +332 -0
  728. package/extensions/dm-lens/dist/tools/project-report.js +72 -0
  729. package/extensions/dm-lens/dist/tools/render-compact.js +272 -0
  730. package/extensions/dm-lens/dist/tools/scan-progress.js +31 -0
  731. package/extensions/dm-lens/dist/tools/shared.js +32 -0
  732. package/extensions/dm-lens/dist/tools/symbol-search.js +133 -0
  733. package/extensions/dm-lens/i18n.js +3 -3
  734. package/extensions/dm-lens/index.js +431 -214
  735. package/extensions/dm-lens/mcp/analyze-cli.js +63 -36
  736. package/extensions/dm-lens/mcp/cli.js +20 -0
  737. package/extensions/dm-lens/mcp/server.js +40 -3
  738. package/extensions/dm-lens/mcp/tool-arguments.js +134 -0
  739. package/extensions/dm-lens/mcp/worker.js +8 -0
  740. package/extensions/dm-lens/package.json +1 -1
  741. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  742. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  743. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  744. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  745. package/extensions/dm-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  746. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  747. package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  748. package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  749. package/extensions/dm-lens/scripts/lib/process-scan.mjs +126 -7
  750. package/extensions/dm-lens/scripts/lib/web-tree-sitter-dir.mjs +6 -0
  751. package/extensions/dm-lens/tools/activate-tools.js +3 -2
  752. package/extensions/dm-lens/tools/ast-grep-outline.js +2 -3
  753. package/extensions/dm-lens/tools/ast-grep-replace.js +6 -5
  754. package/extensions/dm-lens/tools/ast-grep-search.js +2 -2
  755. package/extensions/dm-lens/tools/lens-diagnostic-mark.js +12 -1
  756. package/extensions/dm-lens/tools/lens-diagnostics.js +74 -37
  757. package/extensions/dm-lens/tools/lsp-diagnostics.js +140 -25
  758. package/extensions/dm-lens/tools/lsp-navigation.js +64 -7
  759. package/extensions/dm-lens/tools/module-report.js +6 -6
  760. package/extensions/dm-lens/tools/shared.js +6 -0
  761. package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +1 -1
  762. package/extensions/dm-mcp-adapter/cli.js +265 -23
  763. package/extensions/dm-mcp-adapter/commands.js +83 -17
  764. package/extensions/dm-mcp-adapter/config.js +517 -92
  765. package/extensions/dm-mcp-adapter/direct-tool-surface.js +10 -8
  766. package/extensions/dm-mcp-adapter/direct-tools.js +54 -36
  767. package/extensions/dm-mcp-adapter/dist/abort.js +35 -0
  768. package/extensions/dm-mcp-adapter/dist/agent-dir.js +45 -0
  769. package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +392 -0
  770. package/extensions/dm-mcp-adapter/dist/agent-plugin-provenance.js +26 -0
  771. package/extensions/dm-mcp-adapter/dist/bearer-command-resolver.js +182 -0
  772. package/extensions/dm-mcp-adapter/dist/claude-plugin-loader.js +350 -0
  773. package/extensions/dm-mcp-adapter/dist/config.js +1735 -0
  774. package/extensions/dm-mcp-adapter/dist/consent-manager.js +84 -0
  775. package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +370 -0
  776. package/extensions/dm-mcp-adapter/dist/errors.js +225 -0
  777. package/extensions/dm-mcp-adapter/dist/http-ca.js +75 -0
  778. package/extensions/dm-mcp-adapter/dist/jev-client.js +359 -0
  779. package/extensions/dm-mcp-adapter/dist/jev-contracts.js +1 -0
  780. package/extensions/dm-mcp-adapter/dist/jev-key-store.js +189 -0
  781. package/extensions/dm-mcp-adapter/dist/json-schema-validator.js +70 -0
  782. package/extensions/dm-mcp-adapter/dist/lifecycle.js +387 -0
  783. package/extensions/dm-mcp-adapter/dist/logger.js +115 -0
  784. package/extensions/dm-mcp-adapter/dist/mcp-auth-fetch.js +86 -0
  785. package/extensions/dm-mcp-adapter/dist/mcp-auth-flow.js +956 -0
  786. package/extensions/dm-mcp-adapter/dist/mcp-auth.js +998 -0
  787. package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +182 -0
  788. package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +380 -0
  789. package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +525 -0
  790. package/extensions/dm-mcp-adapter/dist/mcp-probe.js +151 -0
  791. package/extensions/dm-mcp-adapter/dist/mcp-tasks.js +300 -0
  792. package/extensions/dm-mcp-adapter/dist/mcp-trace.js +220 -0
  793. package/extensions/dm-mcp-adapter/dist/metadata-cache.js +323 -0
  794. package/extensions/dm-mcp-adapter/dist/npx-resolver.js +465 -0
  795. package/extensions/dm-mcp-adapter/dist/output-shape.js +312 -0
  796. package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +144 -0
  797. package/extensions/dm-mcp-adapter/dist/project-server-trust.js +186 -0
  798. package/extensions/dm-mcp-adapter/dist/request-headers-command.js +294 -0
  799. package/extensions/dm-mcp-adapter/dist/resource-tools.js +7 -0
  800. package/extensions/dm-mcp-adapter/dist/runtime-owner.js +94 -0
  801. package/extensions/dm-mcp-adapter/dist/sampling-handler.js +213 -0
  802. package/extensions/dm-mcp-adapter/dist/secure-keyring.js +191 -0
  803. package/extensions/dm-mcp-adapter/dist/server-manager.js +1594 -0
  804. package/extensions/dm-mcp-adapter/dist/session-approvals.js +127 -0
  805. package/extensions/dm-mcp-adapter/dist/session-recovery.js +83 -0
  806. package/extensions/dm-mcp-adapter/dist/state.js +1 -0
  807. package/extensions/dm-mcp-adapter/dist/ts-shape.js +157 -0
  808. package/extensions/dm-mcp-adapter/dist/types.js +286 -0
  809. package/extensions/dm-mcp-adapter/dist/ui-app-bridge-helpers.js +36 -0
  810. package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +204 -0
  811. package/extensions/dm-mcp-adapter/dist/ui-stream-types.js +58 -0
  812. package/extensions/dm-mcp-adapter/dist/ui-tool-visibility.js +26 -0
  813. package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +83 -0
  814. package/extensions/dm-mcp-adapter/dist/utils.js +418 -0
  815. package/extensions/dm-mcp-adapter/elicitation-handler.js +67 -2
  816. package/extensions/dm-mcp-adapter/failure-backoff.js +9 -0
  817. package/extensions/dm-mcp-adapter/host-managed.js +400 -0
  818. package/extensions/dm-mcp-adapter/http-ca.js +4 -0
  819. package/extensions/dm-mcp-adapter/index.js +347 -57
  820. package/extensions/dm-mcp-adapter/init.js +92 -44
  821. package/extensions/dm-mcp-adapter/jev-client.js +5 -5
  822. package/extensions/dm-mcp-adapter/jev-key-store.js +15 -2
  823. package/extensions/dm-mcp-adapter/mcp-auth-flow.js +10 -2
  824. package/extensions/dm-mcp-adapter/mcp-auth.js +2 -1
  825. package/extensions/dm-mcp-adapter/mcp-callback-server.js +1 -1
  826. package/extensions/dm-mcp-adapter/mcp-code.js +174 -87
  827. package/extensions/dm-mcp-adapter/mcp-keyring-helper.cjs +1 -1
  828. package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +3 -2
  829. package/extensions/dm-mcp-adapter/mcp-output-guard.js +19 -5
  830. package/extensions/dm-mcp-adapter/mcp-panel.js +59 -12
  831. package/extensions/dm-mcp-adapter/mcp-script-wasm.js +22 -0
  832. package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +227 -111
  833. package/extensions/dm-mcp-adapter/mcp-setup-panel.js +500 -258
  834. package/extensions/dm-mcp-adapter/mcp-status.js +9 -2
  835. package/extensions/dm-mcp-adapter/mcp-trace.js +5 -0
  836. package/extensions/dm-mcp-adapter/metadata-cache.js +68 -11
  837. package/extensions/dm-mcp-adapter/namespace-tools.js +20 -5
  838. package/extensions/dm-mcp-adapter/onboarding-state.js +11 -1
  839. package/extensions/dm-mcp-adapter/output-shape.js +312 -0
  840. package/extensions/dm-mcp-adapter/package-mcp-loader.js +15 -6
  841. package/extensions/dm-mcp-adapter/package.json +6 -15
  842. package/extensions/dm-mcp-adapter/panel-keys.js +13 -0
  843. package/extensions/dm-mcp-adapter/pi-builtin-mcp.js +26 -0
  844. package/extensions/dm-mcp-adapter/pi-signin-import.js +121 -0
  845. package/extensions/dm-mcp-adapter/project-server-trust.js +186 -0
  846. package/extensions/dm-mcp-adapter/prompts.js +80 -7
  847. package/extensions/dm-mcp-adapter/proxy-modes.js +219 -158
  848. package/extensions/dm-mcp-adapter/runtime-protocol.js +342 -0
  849. package/extensions/dm-mcp-adapter/search-ranking.js +8 -6
  850. package/extensions/dm-mcp-adapter/semantic-search.js +5 -4
  851. package/extensions/dm-mcp-adapter/server-manager.js +108 -26
  852. package/extensions/dm-mcp-adapter/session-recovery.js +3 -2
  853. package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +24 -28
  854. package/extensions/dm-mcp-adapter/skills/mcp-scripting/references/jev.md +3 -0
  855. package/extensions/dm-mcp-adapter/test-runner.mjs +1 -1
  856. package/extensions/dm-mcp-adapter/tool-approval.js +17 -7
  857. package/extensions/dm-mcp-adapter/tool-metadata.js +4 -2
  858. package/extensions/dm-mcp-adapter/tool-parameters.js +4 -0
  859. package/extensions/dm-mcp-adapter/tool-result-renderer.js +68 -7
  860. package/extensions/dm-mcp-adapter/ts-shape.js +1 -1
  861. package/extensions/dm-mcp-adapter/ui-server.js +24 -20
  862. package/extensions/dm-mcp-adapter/unix-socket-transport.js +1 -1
  863. package/extensions/dm-mcp-adapter/utils.js +37 -1
  864. package/extensions/dm-ponytail/extensions/ponytail.mjs +37 -17
  865. package/extensions/dm-ponytail/hooks/claude-codex-hooks.json +3 -3
  866. package/extensions/dm-ponytail/hooks/copilot-hooks.json +4 -4
  867. package/extensions/dm-ponytail/hooks/ponytail-activate.js +46 -13
  868. package/extensions/dm-ponytail/hooks/ponytail-config.js +6 -5
  869. package/extensions/dm-ponytail/hooks/ponytail-instructions.js +29 -33
  870. package/extensions/dm-ponytail/hooks/ponytail-map.js +116 -0
  871. package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +26 -13
  872. package/extensions/dm-ponytail/hooks/ponytail-runtime.js +23 -9
  873. package/extensions/dm-ponytail/hooks/ponytail-subagent.js +15 -3
  874. package/extensions/dm-ponytail/hooks/qoder-hooks.json +3 -3
  875. package/extensions/dm-ponytail/package.json +1 -1
  876. package/extensions/dm-ponytail/pi-extension/index.js +37 -17
  877. package/extensions/dm-ponytail/pi-extension/package.json +1 -1
  878. package/extensions/dm-ponytail/skills/plugin.json +5 -0
  879. package/extensions/dm-ponytail/skills/ponytail/SKILL.md +33 -101
  880. package/extensions/dm-ponytail/skills/ponytail-audit/SKILL.md +89 -27
  881. package/extensions/dm-ponytail/skills/ponytail-debt/SKILL.md +13 -12
  882. package/extensions/dm-ponytail/skills/ponytail-gain/SKILL.md +21 -18
  883. package/extensions/dm-ponytail/skills/ponytail-help/SKILL.md +13 -14
  884. package/extensions/dm-ponytail/skills/ponytail-review/SKILL.md +96 -52
  885. package/extensions/dm-subagents/agents/oracle.md +8 -19
  886. package/extensions/dm-subagents/agents/researcher.md +0 -3
  887. package/extensions/dm-subagents/agents/reviewer.md +17 -61
  888. package/extensions/dm-subagents/agents/scout.md +1 -4
  889. package/extensions/dm-subagents/agents/worker.md +8 -25
  890. package/extensions/dm-subagents/index.js +5 -0
  891. package/extensions/dm-subagents/install.mjs +47 -62
  892. package/extensions/dm-subagents/package.json +6 -5
  893. package/extensions/dm-subagents/prompts/council.md +1 -1
  894. package/extensions/dm-subagents/prompts/review-loop.md +1 -1
  895. package/extensions/dm-subagents/skills/council-mode/SKILL.md +1 -1
  896. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +13 -6
  897. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +3 -3
  898. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +79 -78
  899. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +18 -14
  900. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +1 -1
  901. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +46 -49
  902. package/extensions/dm-subagents/src/agents/advertised-agent-prompt.js +18 -32
  903. package/extensions/dm-subagents/src/agents/agent-management.js +7 -2
  904. package/extensions/dm-subagents/src/agents/agent-memory.js +3 -3
  905. package/extensions/dm-subagents/src/agents/agent-scope.js +3 -0
  906. package/extensions/dm-subagents/src/agents/agent-serializer.js +12 -1
  907. package/extensions/dm-subagents/src/agents/agents.js +217 -120
  908. package/extensions/dm-subagents/src/api/inspectors.js +10 -0
  909. package/extensions/dm-subagents/src/api/preflight.js +43 -6
  910. package/extensions/dm-subagents/src/extension/config.js +35 -2
  911. package/extensions/dm-subagents/src/extension/control-notices.js +3 -7
  912. package/extensions/dm-subagents/src/extension/declaration-pinning.js +127 -0
  913. package/extensions/dm-subagents/src/extension/doctor.js +4 -7
  914. package/extensions/dm-subagents/src/extension/fanout-child.js +15 -7
  915. package/extensions/dm-subagents/src/extension/herdr-dm-bridge.js +2 -0
  916. package/extensions/dm-subagents/src/extension/index.js +231 -332
  917. package/extensions/dm-subagents/src/extension/public-execution.js +63 -33
  918. package/extensions/dm-subagents/src/extension/reply-workflow-script.js +65 -0
  919. package/extensions/dm-subagents/src/extension/rpc.js +42 -16
  920. package/extensions/dm-subagents/src/extension/schemas.js +73 -152
  921. package/extensions/dm-subagents/src/extension/subagent-guide.js +92 -7
  922. package/extensions/dm-subagents/src/extension/subagent-options.js +47 -0
  923. package/extensions/dm-subagents/src/extension/tool-activation.js +57 -89
  924. package/extensions/dm-subagents/src/extension/tool-description.js +56 -47
  925. package/extensions/dm-subagents/src/extension/upgrade-notice.js +36 -0
  926. package/extensions/dm-subagents/src/inspectors/actions.js +34 -11
  927. package/extensions/dm-subagents/src/inspectors/plugins.js +71 -2
  928. package/extensions/dm-subagents/src/inspectors/tmux/actions.js +173 -0
  929. package/extensions/dm-subagents/src/inspectors/tmux/client.js +63 -0
  930. package/extensions/dm-subagents/src/inspectors/tmux/plugin.js +14 -0
  931. package/extensions/dm-subagents/src/integrations/herdr-status.js +26 -49
  932. package/extensions/dm-subagents/src/integrations/program-status.js +179 -0
  933. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +77 -4
  934. package/extensions/dm-subagents/src/intercom/result-intercom.js +3 -2
  935. package/extensions/dm-subagents/src/intercom/supervisor-ui.js +2 -152
  936. package/extensions/dm-subagents/src/missions/goal-driver.js +47 -34
  937. package/extensions/dm-subagents/src/missions/store.js +33 -4
  938. package/extensions/dm-subagents/src/profiles/profiles.js +22 -15
  939. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +49 -6
  940. package/extensions/dm-subagents/src/runs/background/async-execution.js +301 -139
  941. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +65 -24
  942. package/extensions/dm-subagents/src/runs/background/async-resume.js +9 -3
  943. package/extensions/dm-subagents/src/runs/background/async-retention.js +40 -15
  944. package/extensions/dm-subagents/src/runs/background/await-async-run.js +68 -0
  945. package/extensions/dm-subagents/src/runs/background/binary-bootstrap.js +2 -1
  946. package/extensions/dm-subagents/src/runs/background/calendar-schedule.js +90 -0
  947. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +11 -8
  948. package/extensions/dm-subagents/src/runs/background/control-channel.js +89 -5
  949. package/extensions/dm-subagents/src/runs/background/fleet-view.js +5 -5
  950. package/extensions/dm-subagents/src/runs/background/notify.js +170 -11
  951. package/extensions/dm-subagents/src/runs/background/pid-namespace.js +17 -0
  952. package/extensions/dm-subagents/src/runs/background/result-files.js +80 -6
  953. package/extensions/dm-subagents/src/runs/background/result-watcher.js +92 -65
  954. package/extensions/dm-subagents/src/runs/background/resume-guidance.js +2 -2
  955. package/extensions/dm-subagents/src/runs/background/run-child-session.js +34 -10
  956. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +8 -6
  957. package/extensions/dm-subagents/src/runs/background/run-status.js +25 -15
  958. package/extensions/dm-subagents/src/runs/background/runner-aliases.js +6 -4
  959. package/extensions/dm-subagents/src/runs/background/runner-child-launch.js +3 -0
  960. package/extensions/dm-subagents/src/runs/background/runner-http-dispatcher.js +2 -1
  961. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +270 -79
  962. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +18 -3
  963. package/extensions/dm-subagents/src/runs/background/subagent-runner-bootstrap.js +4 -1
  964. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +123 -33
  965. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +33 -20
  966. package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +42 -1
  967. package/extensions/dm-subagents/src/runs/background/wait-completions.js +1 -0
  968. package/extensions/dm-subagents/src/runs/background/wait-tool.js +36 -26
  969. package/extensions/dm-subagents/src/runs/background/workflow-terminal-proof.js +39 -26
  970. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +58 -26
  971. package/extensions/dm-subagents/src/runs/foreground/command-action.js +37 -0
  972. package/extensions/dm-subagents/src/runs/foreground/execution.js +132 -32
  973. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +1 -0
  974. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +5 -8
  975. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +683 -325
  976. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +3 -0
  977. package/extensions/dm-subagents/src/runs/shared/child-commands.js +252 -0
  978. package/extensions/dm-subagents/src/runs/shared/child-hooks.js +6 -5
  979. package/extensions/dm-subagents/src/runs/shared/child-launch.js +13 -1
  980. package/extensions/dm-subagents/src/runs/shared/child-session.js +175 -28
  981. package/extensions/dm-subagents/src/runs/shared/child-tool-plan.js +17 -14
  982. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +87 -1
  983. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +11 -85
  984. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +3 -0
  985. package/extensions/dm-subagents/src/runs/shared/effective-system-prompt.js +1 -2
  986. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +57 -6
  987. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +6 -3
  988. package/extensions/dm-subagents/src/runs/shared/herdr-placed-run.js +13 -6
  989. package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +1 -1
  990. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +66 -14
  991. package/extensions/dm-subagents/src/runs/shared/model-resolution-diagnostic.js +25 -5
  992. package/extensions/dm-subagents/src/runs/shared/model-resolution.js +55 -11
  993. package/extensions/dm-subagents/src/runs/shared/model-scope.js +23 -10
  994. package/extensions/dm-subagents/src/runs/shared/nested-events.js +3 -0
  995. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +55 -7
  996. package/extensions/dm-subagents/src/runs/shared/partial-output.js +26 -0
  997. package/extensions/dm-subagents/src/runs/shared/run-history.js +41 -0
  998. package/extensions/dm-subagents/src/runs/shared/runner-launcher.js +21 -0
  999. package/extensions/dm-subagents/src/runs/shared/single-output.js +67 -26
  1000. package/extensions/dm-subagents/src/runs/shared/structured-output.js +24 -7
  1001. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +32 -20
  1002. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +68 -29
  1003. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +1 -1
  1004. package/extensions/dm-subagents/src/runs/shared/workflow-async-child-guidance.js +1 -1
  1005. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-apply.js +169 -0
  1006. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +41 -20
  1007. package/extensions/dm-subagents/src/runs/shared/worktree-lock.js +38 -0
  1008. package/extensions/dm-subagents/src/runs/shared/worktree.js +10 -1
  1009. package/extensions/dm-subagents/src/shared/atomic-json.js +2 -1
  1010. package/extensions/dm-subagents/src/shared/disabled-features.js +101 -0
  1011. package/extensions/dm-subagents/src/shared/dm-declarations.js +14 -0
  1012. package/extensions/dm-subagents/src/shared/dm-safeguards.js +41 -0
  1013. package/extensions/dm-subagents/src/shared/dm-settlement.js +48 -0
  1014. package/extensions/dm-subagents/src/shared/edit-distance.js +23 -0
  1015. package/extensions/dm-subagents/src/shared/extension-context.js +4 -0
  1016. package/extensions/dm-subagents/src/shared/file-lease.js +89 -0
  1017. package/extensions/dm-subagents/src/shared/fork-context.js +0 -1
  1018. package/extensions/dm-subagents/src/shared/formatters.js +1 -6
  1019. package/extensions/dm-subagents/src/shared/model-info.js +23 -0
  1020. package/extensions/dm-subagents/src/shared/package-version.js +12 -0
  1021. package/extensions/dm-subagents/src/shared/parent-wake.js +67 -0
  1022. package/extensions/dm-subagents/src/shared/pruned-fork.js +6 -2
  1023. package/extensions/dm-subagents/src/shared/required-child-extensions.js +35 -5
  1024. package/extensions/dm-subagents/src/shared/runtime-module-path.js +9 -0
  1025. package/extensions/dm-subagents/src/shared/settings-file-lease.js +31 -0
  1026. package/extensions/dm-subagents/src/shared/types.js +3 -1
  1027. package/extensions/dm-subagents/src/shared/utils.js +7 -7
  1028. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +2 -2
  1029. package/extensions/dm-subagents/src/slash/slash-commands.js +25 -15
  1030. package/extensions/dm-subagents/src/slash/subagent-cost.js +38 -7
  1031. package/extensions/dm-subagents/src/slash/subagents-admin.js +1 -1
  1032. package/extensions/dm-subagents/src/tui/dm-mouse-region.js +12 -0
  1033. package/extensions/dm-subagents/src/tui/fleet-status.js +12 -6
  1034. package/extensions/dm-subagents/src/tui/fleet-transcript.js +6 -2
  1035. package/extensions/dm-subagents/src/tui/fleet.js +20 -6
  1036. package/extensions/dm-subagents/src/tui/render.js +126 -72
  1037. package/extensions/dm-subagents/src/tui/running-tone.js +20 -0
  1038. package/extensions/dm-subagents/src/tui/subagent-messages.js +249 -0
  1039. package/extensions/dm-subagents/src/watchdog/diff-tool.js +19 -11
  1040. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +3 -11
  1041. package/extensions/dm-subagents/src/watchdog/register-child.js +2 -2
  1042. package/extensions/dm-subagents/src/watchdog/register-main.js +4 -24
  1043. package/extensions/dm-subagents/src/watchdog/render.js +1 -19
  1044. package/extensions/dm-subagents/src/watchdog/review.js +4 -7
  1045. package/extensions/dm-subagents/src/watchdog/runtime.js +6 -2
  1046. package/extensions/dm-subagents/src/watchdog/settings.js +22 -17
  1047. package/extensions/dm-subagents/src/watchdog/tool-actions.js +2 -2
  1048. package/extensions/dm-subagents/src/watchdog/turn-delta.js +1 -1
  1049. package/extensions/dm-subagents/src/workflows/chat-progress.js +2 -2
  1050. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +116 -45
  1051. package/extensions/dm-subagents/src/workflows/structured-workflow-scripts.js +154 -0
  1052. package/extensions/dm-subagents/src/workflows/workflow-checklist.js +3 -0
  1053. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +7 -4
  1054. package/extensions/dm-subagents/src/workflows/workflow-resources.js +52 -17
  1055. package/extensions/dm-subagents/src/workflows/workflow-reuse.js +87 -0
  1056. package/extensions/dm-subagents/src/workflows/workflow-revival.js +80 -0
  1057. package/extensions/dm-tty/control.js +150 -0
  1058. package/extensions/dm-tty/index.js +122 -0
  1059. package/extensions/dm-tty/package.json +20 -0
  1060. package/extensions/dm-tty/pty.js +213 -0
  1061. package/extensions/dm-tty/pty_bridge.py +266 -0
  1062. package/extensions/dm-tty/server.js +438 -0
  1063. package/extensions/dm-tty/sessions.js +97 -0
  1064. package/extensions/dm-tty/standalone.js +75 -0
  1065. package/extensions/dm-tty/web/client.js +1141 -0
  1066. package/extensions/dm-tty/web/index.html +117 -0
  1067. package/extensions/dm-tty/web/style.css +73 -0
  1068. package/extensions/dm-web-access/brave-rate-limit.js +160 -0
  1069. package/extensions/dm-web-access/brave.js +62 -11
  1070. package/extensions/dm-web-access/ceramic.js +197 -0
  1071. package/extensions/dm-web-access/chrome-cookies.js +69 -21
  1072. package/extensions/dm-web-access/curator-page.js +12 -2
  1073. package/extensions/dm-web-access/curator-server.js +10 -0
  1074. package/extensions/dm-web-access/declared-web-links.js +1 -1
  1075. package/extensions/dm-web-access/degoog.js +288 -0
  1076. package/extensions/dm-web-access/dist/index.js +28404 -0
  1077. package/extensions/dm-web-access/dist/mcp-cli.js +28186 -0
  1078. package/extensions/dm-web-access/duckduckgo.js +6 -3
  1079. package/extensions/dm-web-access/endpoint-pdf-extract.js +210 -0
  1080. package/extensions/dm-web-access/exa.js +17 -35
  1081. package/extensions/dm-web-access/extract.js +63 -10
  1082. package/extensions/dm-web-access/firecrawl.js +30 -4
  1083. package/extensions/dm-web-access/gemini-search.js +117 -37
  1084. package/extensions/dm-web-access/gemini-web.js +7 -7
  1085. package/extensions/dm-web-access/github-extract.js +28 -2
  1086. package/extensions/dm-web-access/github-issue-pr.js +88 -73
  1087. package/extensions/dm-web-access/index.js +230 -1161
  1088. package/extensions/dm-web-access/keenable.js +197 -0
  1089. package/extensions/dm-web-access/mcp-cli.js +30 -0
  1090. package/extensions/dm-web-access/mcp-server.js +51 -0
  1091. package/extensions/dm-web-access/mcp-tool-definitions.js +93 -0
  1092. package/extensions/dm-web-access/openai-search.js +70 -20
  1093. package/extensions/dm-web-access/opencode-session-headers.js +1 -1
  1094. package/extensions/dm-web-access/package.json +4 -1
  1095. package/extensions/dm-web-access/page-query.js +5 -10
  1096. package/extensions/dm-web-access/parallel-mcp.js +2 -1
  1097. package/extensions/dm-web-access/pdf-extract.js +34 -1
  1098. package/extensions/dm-web-access/perplexity.js +68 -51
  1099. package/extensions/dm-web-access/query-rewrite.js +3 -4
  1100. package/extensions/dm-web-access/scripts/build.js +8 -0
  1101. package/extensions/dm-web-access/ssrf-protection.js +10 -8
  1102. package/extensions/dm-web-access/storage.js +79 -76
  1103. package/extensions/dm-web-access/summary-model-scope.js +5 -64
  1104. package/extensions/dm-web-access/summary-review.js +35 -9
  1105. package/extensions/dm-web-access/tavily.js +69 -22
  1106. package/extensions/dm-web-access/tool-activation.js +44 -26
  1107. package/extensions/dm-web-access/tool-arguments.js +21 -0
  1108. package/extensions/dm-web-access/utils.js +17 -7
  1109. package/extensions/dm-web-access/video-extract.js +1 -1
  1110. package/extensions/dm-web-access/web-tool-contract.js +0 -0
  1111. package/extensions/dm-web-access/web-tool-core.js +1312 -0
  1112. package/extensions/dm-web-access/you.js +155 -0
  1113. package/extensions/dm-web-access/youtube-extract.js +2 -2
  1114. package/extensions/dm-web-access/zai.js +159 -0
  1115. package/package.json +13 -9
@@ -0,0 +1,1333 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { Worker } from "node:worker_threads";
5
+ import { gunzipSync, gzipSync } from "node:zlib";
6
+ import { writeFileAtomic } from "./atomic-write.js";
7
+ import { BoundedFifoMap } from "./bounded-cache.js";
8
+ import { getProjectDataDir } from "./file-utils.js";
9
+ import { incrementDegradationCount } from "./degradation-ledger.js";
10
+ import { withGenerationLockSync } from "./generation-lock.js";
11
+ import { isStaleStageFile } from "./instance-reaper.js";
12
+ import { readJsonCache } from "./json-cache-read.js";
13
+ import { logLatency } from "./latency-logger.js";
14
+ import { normalizeMapKey } from "./path-utils.js";
15
+ import { fingerprintProjectSnapshotJson } from "./project-snapshot-fingerprint.js";
16
+ import { detectProjectConventions } from "./project-conventions.js";
17
+ import { readWorkerHeapStatistics } from "./persist-worker-stats.js";
18
+ import { deserializeWordIndex, recordPersistedWordIndexWireBytes, serializeWordIndex } from "./word-index.js";
19
+ export const PROJECT_SNAPSHOT_VERSION = 2;
20
+ function parseSequenceIndex(value) {
21
+ if (!value || typeof value !== "object")
22
+ return;
23
+ const index = value;
24
+ if (typeof index.projectSeq !== "number")
25
+ return;
26
+ if (!Array.isArray(index.fileSeqByPath))
27
+ return;
28
+ const fileSeqByPath = index.fileSeqByPath.filter((entry) => Array.isArray(entry) && typeof entry[0] === "string" && typeof entry[1] === "number");
29
+ return { projectSeq: index.projectSeq, fileSeqByPath };
30
+ }
31
+ export function getProjectSnapshotPath(cwd) {
32
+ return path.join(getProjectDataDir(cwd), "cache", "project-snapshot.json.gz");
33
+ }
34
+ export function getProjectSnapshotLegacyPath(cwd) {
35
+ return path.join(getProjectDataDir(cwd), "cache", "project-snapshot.json");
36
+ }
37
+ export function getProjectSnapshotMetaPath(cwd) {
38
+ return path.join(getProjectDataDir(cwd), "cache", "project-snapshot.meta.json");
39
+ }
40
+ const INCOMPLETE_STORED_SEQ = -2;
41
+ function storedSeq(snapshot) {
42
+ return snapshot.incomplete ? { seq: INCOMPLETE_STORED_SEQ, incompleteSeq: snapshot.seq } : { seq: snapshot.seq };
43
+ }
44
+ function storedSnapshot(snapshot) {
45
+ if (!snapshot.incomplete)
46
+ return snapshot;
47
+ const stored = { ...snapshot };
48
+ delete stored.incomplete;
49
+ return { ...stored, ...storedSeq(snapshot) };
50
+ }
51
+ function readStoredSeq(stored) {
52
+ if (typeof stored.incompleteSeq === "number") {
53
+ return { seq: stored.incompleteSeq, incomplete: true };
54
+ }
55
+ return typeof stored.seq === "number" ? { seq: stored.seq } : null;
56
+ }
57
+ export function isProjectSnapshotFresh(snapshot, currentProjectSeq, unlockedThrough = 0) {
58
+ return !!snapshot && snapshot.version === PROJECT_SNAPSHOT_VERSION && !snapshot.incomplete && (snapshot.logEntries ?? 0) >= unlockedThrough && snapshot.seq === currentProjectSeq;
59
+ }
60
+ function parseSnapshot(value) {
61
+ if (!value || typeof value !== "object")
62
+ return null;
63
+ const snapshot = value;
64
+ if (snapshot.version !== PROJECT_SNAPSHOT_VERSION)
65
+ return null;
66
+ if (typeof snapshot.projectRoot !== "string")
67
+ return null;
68
+ if (typeof snapshot.generatedAt !== "string")
69
+ return null;
70
+ const stored = readStoredSeq(value);
71
+ if (!stored)
72
+ return null;
73
+ if (!Array.isArray(snapshot.cachedExports))
74
+ return null;
75
+ return {
76
+ version: PROJECT_SNAPSHOT_VERSION,
77
+ projectRoot: snapshot.projectRoot,
78
+ generatedAt: snapshot.generatedAt,
79
+ seq: stored.seq,
80
+ files: snapshot.files ?? {},
81
+ symbols: snapshot.symbols ?? {},
82
+ reverseDeps: snapshot.reverseDeps ?? {},
83
+ cachedExports: snapshot.cachedExports.filter((entry) => Array.isArray(entry) && typeof entry[0] === "string" && typeof entry[1] === "string"),
84
+ ...stored.incomplete ? { incomplete: true } : {},
85
+ logEntries: typeof snapshot.logEntries === "number" ? snapshot.logEntries : undefined,
86
+ sequenceIndex: parseSequenceIndex(snapshot.sequenceIndex),
87
+ wordIndex: snapshot.wordIndex,
88
+ projectRulesScan: snapshot.projectRulesScan,
89
+ startupScan: snapshot.startupScan,
90
+ languageProfile: snapshot.languageProfile,
91
+ conventions: snapshot.conventions
92
+ };
93
+ }
94
+ function parseSnapshotMeta(value) {
95
+ if (!value || typeof value !== "object")
96
+ return null;
97
+ const meta = value;
98
+ if (typeof meta.version !== "number")
99
+ return null;
100
+ const stored = readStoredSeq(value);
101
+ if (!stored)
102
+ return null;
103
+ return {
104
+ timestamp: typeof meta.timestamp === "string" ? meta.timestamp : "",
105
+ version: meta.version,
106
+ seq: stored.seq,
107
+ fingerprint: typeof meta.fingerprint === "string" && /^[a-f0-9]{64}$/.test(meta.fingerprint) ? meta.fingerprint : undefined,
108
+ gzBytes: typeof meta.gzBytes === "number" && Number.isInteger(meta.gzBytes) && meta.gzBytes > 0 ? meta.gzBytes : undefined,
109
+ ...stored.incomplete ? { incomplete: true } : {},
110
+ logEntries: typeof meta.logEntries === "number" ? meta.logEntries : undefined,
111
+ sequenceIndex: parseSequenceIndex(meta.sequenceIndex)
112
+ };
113
+ }
114
+ export function readProjectSnapshotMeta(cwd) {
115
+ const meta = readJsonCache(getProjectSnapshotMetaPath(cwd), (parsed) => parseSnapshotMeta(parsed) ?? undefined);
116
+ return meta ?? null;
117
+ }
118
+ export function isProjectSnapshotMetaStale(meta, currentProjectSeq, unlockedThrough = 0) {
119
+ return meta.version !== PROJECT_SNAPSHOT_VERSION || meta.incomplete === true || (meta.logEntries ?? 0) < unlockedThrough || meta.seq !== currentProjectSeq;
120
+ }
121
+ export const SNAPSHOT_PARSE_CACHE_MAX = 4;
122
+ const SNAPSHOT_PARSE_CACHE_MAX_BYTES = 24 * 1024 * 1024;
123
+ const snapshotParseCache = new BoundedFifoMap(SNAPSHOT_PARSE_CACHE_MAX);
124
+ function withoutWordIndex(snapshot) {
125
+ if (!snapshot?.wordIndex)
126
+ return snapshot;
127
+ const { wordIndex: _releasedPostings, ...stripped } = snapshot;
128
+ return stripped;
129
+ }
130
+ function cacheParsedSnapshot(snapshotPath, entry) {
131
+ snapshotParseCache.delete(snapshotPath);
132
+ snapshotParseCache.set(snapshotPath, entry);
133
+ }
134
+ const authoritativeSnapshots = new Map;
135
+ export const PROJECT_SNAPSHOT_MAX_WARM_ROOTS = 8;
136
+ const PROJECT_SNAPSHOT_IDLE_EVICT_MS_DEFAULT = 20 * 60000;
137
+ function projectSnapshotIdleEvictMs() {
138
+ const value = Number.parseInt(process.env.DM_LENS_PROJECT_SNAPSHOT_IDLE_EVICT_MS ?? "", 10);
139
+ return Number.isSafeInteger(value) && value > 0 ? value : PROJECT_SNAPSHOT_IDLE_EVICT_MS_DEFAULT;
140
+ }
141
+ function clearAuthoritativeSnapshotTimer(entry) {
142
+ if (entry.idleTimer)
143
+ clearTimeout(entry.idleTimer);
144
+ entry.idleTimer = undefined;
145
+ }
146
+ function deleteAuthoritativeSnapshot(key) {
147
+ const entry = authoritativeSnapshots.get(key);
148
+ if (entry)
149
+ clearAuthoritativeSnapshotTimer(entry);
150
+ authoritativeSnapshots.delete(key);
151
+ }
152
+ function scheduleAuthoritativeSnapshotEviction(key, entry) {
153
+ clearAuthoritativeSnapshotTimer(entry);
154
+ const generation = entry.lastUsedAt;
155
+ entry.idleTimer = setTimeout(() => {
156
+ entry.idleTimer = undefined;
157
+ if (authoritativeSnapshots.get(key) !== entry || entry.lastUsedAt !== generation)
158
+ return;
159
+ deleteAuthoritativeSnapshot(key);
160
+ }, projectSnapshotIdleEvictMs());
161
+ entry.idleTimer.unref?.();
162
+ }
163
+ function touchAuthoritativeSnapshot(key, entry) {
164
+ entry.lastUsedAt = Date.now();
165
+ scheduleAuthoritativeSnapshotEviction(key, entry);
166
+ }
167
+ function enforceAuthoritativeSnapshotCap() {
168
+ while (authoritativeSnapshots.size > PROJECT_SNAPSHOT_MAX_WARM_ROOTS) {
169
+ const victim = [...authoritativeSnapshots.entries()].sort(([, a], [, b]) => a.lastUsedAt - b.lastUsedAt)[0];
170
+ if (!victim)
171
+ return;
172
+ clearAuthoritativeSnapshotTimer(victim[1]);
173
+ deleteAuthoritativeSnapshot(victim[0]);
174
+ }
175
+ }
176
+ export function _getAuthoritativeSnapshotCacheKeysForTests() {
177
+ return [...authoritativeSnapshots.entries()].sort(([, a], [, b]) => a.lastUsedAt - b.lastUsedAt).map(([key]) => key);
178
+ }
179
+ export function _resetProjectSnapshotParseCacheForTests() {
180
+ snapshotParseCache.clear();
181
+ for (const entry of authoritativeSnapshots.values())
182
+ clearAuthoritativeSnapshotTimer(entry);
183
+ authoritativeSnapshots.clear();
184
+ }
185
+ export function _projectSnapshotParseCacheRetainsWordIndexForTests() {
186
+ return [...snapshotParseCache.values()].some((entry) => entry.snapshot?.wordIndex !== undefined);
187
+ }
188
+ function resolveSnapshotBodyPath(cwd) {
189
+ const gzPath = getProjectSnapshotPath(cwd);
190
+ try {
191
+ const stat = fs.statSync(gzPath);
192
+ return { path: gzPath, gz: true, mtimeMs: stat.mtimeMs, size: stat.size };
193
+ } catch {}
194
+ const legacyPath = getProjectSnapshotLegacyPath(cwd);
195
+ try {
196
+ const stat = fs.statSync(legacyPath);
197
+ return {
198
+ path: legacyPath,
199
+ gz: false,
200
+ mtimeMs: stat.mtimeMs,
201
+ size: stat.size
202
+ };
203
+ } catch {
204
+ return null;
205
+ }
206
+ }
207
+ let _snapshotBodyReadCountForTests = 0;
208
+ export function getSnapshotBodyReadCountForTests() {
209
+ return _snapshotBodyReadCountForTests;
210
+ }
211
+ export function resetSnapshotBodyReadCountForTests() {
212
+ _snapshotBodyReadCountForTests = 0;
213
+ }
214
+ function readSnapshotBody(bodyPath, gz) {
215
+ _snapshotBodyReadCountForTests++;
216
+ if (!gz) {
217
+ const snapshot = readJsonCache(bodyPath, (parsed) => parseSnapshot(parsed) ?? undefined) ?? null;
218
+ let rawBytes = 0;
219
+ try {
220
+ rawBytes = fs.statSync(bodyPath).size;
221
+ } catch {}
222
+ return { snapshot, rawBytes };
223
+ }
224
+ try {
225
+ const json = gunzipSync(fs.readFileSync(bodyPath)).toString("utf-8");
226
+ const snapshot = parseSnapshot(JSON.parse(json)) ?? null;
227
+ return { snapshot, rawBytes: Buffer.byteLength(json) };
228
+ } catch (err) {
229
+ logLatency({
230
+ type: "phase",
231
+ phase: "project_snapshot_body_corrupt",
232
+ filePath: bodyPath,
233
+ durationMs: 0,
234
+ metadata: { error: err instanceof Error ? err.message : String(err) }
235
+ });
236
+ return { snapshot: null, rawBytes: 0 };
237
+ }
238
+ }
239
+ function skipJsonValue(text, start) {
240
+ let i = start;
241
+ while (i < text.length && /\s/.test(text[i]))
242
+ i++;
243
+ const ch = text[i];
244
+ if (ch === '"') {
245
+ i++;
246
+ while (i < text.length) {
247
+ if (text[i] === "\\") {
248
+ i += 2;
249
+ continue;
250
+ }
251
+ if (text[i] === '"') {
252
+ i++;
253
+ break;
254
+ }
255
+ i++;
256
+ }
257
+ return i;
258
+ }
259
+ if (ch === "{" || ch === "[") {
260
+ const open = ch;
261
+ const close = open === "{" ? "}" : "]";
262
+ let depth = 0;
263
+ let inString = false;
264
+ for (;i < text.length; i++) {
265
+ const c = text[i];
266
+ if (inString) {
267
+ if (c === "\\") {
268
+ i++;
269
+ continue;
270
+ }
271
+ if (c === '"')
272
+ inString = false;
273
+ continue;
274
+ }
275
+ if (c === '"') {
276
+ inString = true;
277
+ continue;
278
+ }
279
+ if (c === open)
280
+ depth++;
281
+ else if (c === close) {
282
+ depth--;
283
+ if (depth === 0) {
284
+ i++;
285
+ break;
286
+ }
287
+ }
288
+ }
289
+ return i;
290
+ }
291
+ while (i < text.length && !",}]".includes(text[i]))
292
+ i++;
293
+ return i;
294
+ }
295
+ function stripTopLevelJsonKeys(text, keysToStrip) {
296
+ const objStart = text.indexOf("{");
297
+ if (objStart === -1)
298
+ return text;
299
+ let out = text.slice(0, objStart + 1);
300
+ let i = objStart + 1;
301
+ let wroteField = false;
302
+ while (i < text.length) {
303
+ while (i < text.length && /\s/.test(text[i]))
304
+ i++;
305
+ if (text[i] === "}" || i >= text.length) {
306
+ out += text.slice(i);
307
+ break;
308
+ }
309
+ if (text[i] === ",") {
310
+ i++;
311
+ continue;
312
+ }
313
+ const keyStart = i;
314
+ const keyTextEnd = skipJsonValue(text, keyStart);
315
+ let key;
316
+ try {
317
+ key = JSON.parse(text.slice(keyStart, keyTextEnd));
318
+ } catch {
319
+ return text;
320
+ }
321
+ let j = keyTextEnd;
322
+ while (j < text.length && /\s/.test(text[j]))
323
+ j++;
324
+ const valueStart = j + 1;
325
+ const valueEnd = skipJsonValue(text, valueStart);
326
+ if (!keysToStrip.has(key)) {
327
+ out += (wroteField ? "," : "") + text.slice(keyStart, valueEnd);
328
+ wroteField = true;
329
+ }
330
+ i = valueEnd;
331
+ }
332
+ return out;
333
+ }
334
+ export function _stripTopLevelJsonKeysForTests(text, keysToStrip) {
335
+ return stripTopLevelJsonKeys(text, new Set(keysToStrip));
336
+ }
337
+ const HEAVY_SNAPSHOT_KEYS = new Set([
338
+ "wordIndex",
339
+ "files",
340
+ "symbols",
341
+ "reverseDeps"
342
+ ]);
343
+ const NARROW_DIGEST_HEAVY_KEY_LITERALS = [
344
+ "wordIndex",
345
+ "files",
346
+ "symbols",
347
+ "reverseDeps"
348
+ ];
349
+ let _lastNarrowParseDigestForTests;
350
+ export function getLastNarrowParseDigestForTests() {
351
+ return _lastNarrowParseDigestForTests;
352
+ }
353
+ export function resetLastNarrowParseDigestForTests() {
354
+ _lastNarrowParseDigestForTests = undefined;
355
+ }
356
+ function parseExportsAndRulesOnly(json) {
357
+ const narrowed = stripTopLevelJsonKeys(json, HEAVY_SNAPSHOT_KEYS);
358
+ _lastNarrowParseDigestForTests = {
359
+ length: narrowed.length,
360
+ containsHeavyKey: NARROW_DIGEST_HEAVY_KEY_LITERALS.some((key) => narrowed.includes(`"${key}":`))
361
+ };
362
+ const parsed = JSON.parse(narrowed);
363
+ if (parsed.version !== PROJECT_SNAPSHOT_VERSION)
364
+ return null;
365
+ const stored = readStoredSeq(parsed);
366
+ if (!stored)
367
+ return null;
368
+ if (!Array.isArray(parsed.cachedExports))
369
+ return null;
370
+ return {
371
+ version: PROJECT_SNAPSHOT_VERSION,
372
+ seq: stored.seq,
373
+ ...stored.incomplete ? { incomplete: true } : {},
374
+ logEntries: typeof parsed.logEntries === "number" ? parsed.logEntries : undefined,
375
+ cachedExports: parsed.cachedExports.filter((entry) => Array.isArray(entry) && typeof entry[0] === "string" && typeof entry[1] === "string"),
376
+ projectRulesScan: parsed.projectRulesScan
377
+ };
378
+ }
379
+ function readSnapshotExportsAndRulesBody(bodyPath, gz) {
380
+ try {
381
+ const json = gz ? gunzipSync(fs.readFileSync(bodyPath)).toString("utf-8") : fs.readFileSync(bodyPath, "utf-8");
382
+ return parseExportsAndRulesOnly(json);
383
+ } catch (err) {
384
+ logLatency({
385
+ type: "phase",
386
+ phase: "project_snapshot_body_corrupt",
387
+ filePath: bodyPath,
388
+ durationMs: 0,
389
+ metadata: {
390
+ error: err instanceof Error ? err.message : String(err),
391
+ narrow: true
392
+ }
393
+ });
394
+ return null;
395
+ }
396
+ }
397
+ export function loadProjectSnapshotExportsAndRules(cwd) {
398
+ const key = normalizeMapKey(cwd);
399
+ const body = resolveSnapshotBodyPath(cwd);
400
+ const authoritative = authoritativeSnapshots.get(key);
401
+ if (authoritative) {
402
+ const notSuperseded = body === null || body.mtimeMs <= authoritative.knownMtime && body.size === authoritative.knownSize;
403
+ if (notSuperseded) {
404
+ const { version, seq, incomplete, logEntries, cachedExports, projectRulesScan } = authoritative.snapshot;
405
+ return {
406
+ version,
407
+ seq,
408
+ ...incomplete ? { incomplete } : {},
409
+ logEntries,
410
+ cachedExports,
411
+ projectRulesScan
412
+ };
413
+ }
414
+ }
415
+ if (!body)
416
+ return null;
417
+ return readSnapshotExportsAndRulesBody(body.path, body.gz);
418
+ }
419
+ function loadProjectSnapshotInternal(cwd, requireWordIndex) {
420
+ const key = normalizeMapKey(cwd);
421
+ const body = resolveSnapshotBodyPath(cwd);
422
+ const authoritative = authoritativeSnapshots.get(key);
423
+ if (authoritative) {
424
+ const notSuperseded = body === null || body.mtimeMs <= authoritative.knownMtime && body.size === authoritative.knownSize;
425
+ if (notSuperseded) {
426
+ touchAuthoritativeSnapshot(key, authoritative);
427
+ return authoritative.snapshot;
428
+ }
429
+ deleteAuthoritativeSnapshot(key);
430
+ }
431
+ if (!body) {
432
+ snapshotParseCache.delete(getProjectSnapshotPath(cwd));
433
+ return null;
434
+ }
435
+ const cacheKey = body.path;
436
+ const cached = snapshotParseCache.get(cacheKey);
437
+ if (cached && cached.mtimeMs === body.mtimeMs && cached.size === body.size) {
438
+ if (!requireWordIndex || !cached.snapshot || cached.snapshot.wordIndex) {
439
+ return cached.snapshot;
440
+ }
441
+ }
442
+ const { snapshot, rawBytes } = readSnapshotBody(body.path, body.gz);
443
+ const cacheSnapshot = withoutWordIndex(snapshot);
444
+ if (rawBytes > 0 && (rawBytes <= SNAPSHOT_PARSE_CACHE_MAX_BYTES || snapshot?.wordIndex)) {
445
+ cacheParsedSnapshot(cacheKey, {
446
+ mtimeMs: body.mtimeMs,
447
+ size: body.size,
448
+ snapshot: cacheSnapshot
449
+ });
450
+ } else {
451
+ snapshotParseCache.delete(cacheKey);
452
+ }
453
+ return snapshot;
454
+ }
455
+ export function loadProjectSnapshot(cwd) {
456
+ return loadProjectSnapshotInternal(cwd, true);
457
+ }
458
+ export function loadProjectSnapshotWithoutWordIndex(cwd) {
459
+ return loadProjectSnapshotInternal(cwd, false);
460
+ }
461
+ const _snapshotGenerationStates = new Map;
462
+ const _successfulSnapshotPersists = new BoundedFifoMap(PROJECT_SNAPSHOT_MAX_WARM_ROOTS);
463
+ const _failedSnapshotPersists = new BoundedFifoMap(PROJECT_SNAPSHOT_MAX_WARM_ROOTS);
464
+ const _activeSnapshotPersists = new Map;
465
+ const _queuedSnapshotPersists = new Map;
466
+ const _snapshotWorkerRequests = new Map;
467
+ let _snapshotPersistWorker;
468
+ let _snapshotWorkerRequestId = 0;
469
+ let _snapshotWorkerDisabled = false;
470
+ let _snapshotGenerationGateEnabledForTests = true;
471
+ let _snapshotPromotionSeamForTests;
472
+ let _lastSnapshotPersistErrorForTests;
473
+ let _snapshotExiting = false;
474
+ let _snapshotWorkerBodyWritesForTests = 0;
475
+ let _snapshotPersistWorkerHeapStatistics = null;
476
+ export function refreshProjectSnapshotPersistWorkerHeapStatistics() {
477
+ const worker = _snapshotPersistWorker;
478
+ if (!worker || typeof worker.getHeapStatistics !== "function") {
479
+ return Promise.resolve();
480
+ }
481
+ return readWorkerHeapStatistics(worker).then((stats) => {
482
+ if (_snapshotPersistWorker === worker)
483
+ _snapshotPersistWorkerHeapStatistics = stats;
484
+ }).catch(() => {});
485
+ }
486
+ export function getProjectSnapshotPersistWorkerHeapStatistics() {
487
+ return _snapshotPersistWorkerHeapStatistics;
488
+ }
489
+ function snapshotWorkerEnabled() {
490
+ const raw = process.env.DM_LENS_SNAPSHOT_PERSIST_SYNC;
491
+ return !(raw === "1" || raw === "true");
492
+ }
493
+ function pendingSnapshotIsCurrent(pending) {
494
+ return !_snapshotGenerationGateEnabledForTests || _snapshotGenerationStates.get(pending.key)?.generation === pending.generation;
495
+ }
496
+ function rememberSuccessfulSnapshotPersist(key, record) {
497
+ _successfulSnapshotPersists.delete(key);
498
+ _successfulSnapshotPersists.set(key, record);
499
+ }
500
+ function assessSnapshotBodyIntegrity(meta, body) {
501
+ if (meta.gzBytes === undefined) {
502
+ return { outcome: "legacy-meta", actualBytes: body.size };
503
+ }
504
+ if (!body.gz || body.size !== meta.gzBytes) {
505
+ return {
506
+ outcome: "size-mismatch",
507
+ expectedGzBytes: meta.gzBytes,
508
+ actualBytes: body.size
509
+ };
510
+ }
511
+ return {
512
+ outcome: "ok",
513
+ expectedGzBytes: meta.gzBytes,
514
+ actualBytes: body.size
515
+ };
516
+ }
517
+ function noteSnapshotBodyIntegrityWithheld(args) {
518
+ incrementDegradationCount({
519
+ kind: "snapshot-integrity",
520
+ subject: args.gzPath,
521
+ reason: args.verdict
522
+ });
523
+ logLatency({
524
+ type: "phase",
525
+ phase: "project_snapshot_body_integrity",
526
+ filePath: args.gzPath,
527
+ durationMs: 0,
528
+ metadata: {
529
+ outcome: "dedupe_withheld",
530
+ reason: args.verdict,
531
+ ...args.seq !== undefined ? { seq: args.seq } : {},
532
+ ...args.expectedGzBytes === undefined ? {} : { expectedGzBytes: args.expectedGzBytes },
533
+ actualBytes: args.actualBytes
534
+ }
535
+ });
536
+ }
537
+ function noteSnapshotSkipRefused(args) {
538
+ logLatency({
539
+ type: "phase",
540
+ phase: "project_snapshot_body_integrity",
541
+ filePath: args.gzPath,
542
+ durationMs: 0,
543
+ metadata: {
544
+ outcome: "skip_refused_rewrite",
545
+ reason: args.verdict,
546
+ seq: args.seq
547
+ }
548
+ });
549
+ }
550
+ function snapshotPersistBaselinesFor(cwd, key) {
551
+ const local = _successfulSnapshotPersists.get(key);
552
+ const meta = readProjectSnapshotMeta(cwd);
553
+ const body = resolveSnapshotBodyPath(cwd);
554
+ if (!meta?.fingerprint || !body) {
555
+ if (!body)
556
+ _successfulSnapshotPersists.delete(key);
557
+ return { fingerprints: [] };
558
+ }
559
+ const integrity = assessSnapshotBodyIntegrity(meta, body);
560
+ if (integrity.outcome !== "ok") {
561
+ noteSnapshotBodyIntegrityWithheld({
562
+ gzPath: getProjectSnapshotPath(cwd),
563
+ verdict: integrity.outcome,
564
+ seq: meta.seq,
565
+ expectedGzBytes: integrity.expectedGzBytes,
566
+ actualBytes: integrity.actualBytes
567
+ });
568
+ return { fingerprints: [] };
569
+ }
570
+ const durable = {
571
+ seq: meta.seq,
572
+ fingerprint: meta.fingerprint,
573
+ generatedAt: meta.timestamp,
574
+ generation: _snapshotGenerationStates.get(key)?.generation ?? 0,
575
+ gzBytes: meta.gzBytes
576
+ };
577
+ const fingerprints = [durable.fingerprint];
578
+ if (local && local.fingerprint !== durable.fingerprint) {
579
+ fingerprints.push(local.fingerprint);
580
+ }
581
+ return { durable, fingerprints, integrity: "ok" };
582
+ }
583
+ function seedSnapshotPersistBaselineFromDurable(key, durable) {
584
+ if (!durable || _successfulSnapshotPersists.has(key))
585
+ return;
586
+ rememberSuccessfulSnapshotPersist(key, durable);
587
+ }
588
+ function writeProjectSnapshotMeta(metaPath, snapshot, bodyRecord) {
589
+ writeFileAtomic(metaPath, JSON.stringify({
590
+ timestamp: bodyRecord?.generatedAt ?? snapshot.generatedAt,
591
+ version: snapshot.version,
592
+ ...storedSeq(snapshot),
593
+ ...bodyRecord ? {
594
+ fingerprint: bodyRecord.fingerprint,
595
+ ...bodyRecord.gzBytes === undefined ? {} : { gzBytes: bodyRecord.gzBytes }
596
+ } : {},
597
+ logEntries: snapshot.logEntries,
598
+ ...snapshot.sequenceIndex ? { sequenceIndex: snapshot.sequenceIndex } : {}
599
+ }), { bestEffort: false });
600
+ }
601
+ function recordSnapshotPersistFailure(pending, error, bodyPersisted = false) {
602
+ _lastSnapshotPersistErrorForTests = error;
603
+ _failedSnapshotPersists.set(pending.key, {
604
+ seq: pending.snapshot.seq,
605
+ generation: pending.generation
606
+ });
607
+ deleteAuthoritativeSnapshot(pending.key);
608
+ logLatency({
609
+ type: "phase",
610
+ phase: "project_snapshot_persist_failed",
611
+ filePath: pending.gzPath,
612
+ durationMs: 0,
613
+ metadata: {
614
+ error,
615
+ seq: pending.snapshot.seq,
616
+ outcome: bodyPersisted ? "metadata_repair_required" : "failed",
617
+ ...bodyPersisted ? { bodyPersisted: true } : {}
618
+ }
619
+ });
620
+ }
621
+ function logSnapshotPersistSuccess(pending, fingerprint, stats) {
622
+ rememberSuccessfulSnapshotPersist(pending.key, {
623
+ seq: pending.snapshot.seq,
624
+ fingerprint,
625
+ generatedAt: pending.snapshot.generatedAt,
626
+ generation: pending.generation,
627
+ rawBytes: stats.rawBytes,
628
+ gzBytes: stats.gzBytes
629
+ });
630
+ _failedSnapshotPersists.delete(pending.key);
631
+ logLatency({
632
+ type: "phase",
633
+ phase: "project_snapshot_persist",
634
+ filePath: pending.gzPath,
635
+ durationMs: stats.serializeMs + stats.writeMs,
636
+ metadata: { seq: pending.snapshot.seq, outcome: "executed", ...stats }
637
+ });
638
+ }
639
+ function logSnapshotPersistDecision(args) {
640
+ logLatency({
641
+ type: "phase",
642
+ phase: "project_snapshot_persist_decision",
643
+ filePath: getProjectSnapshotPath(args.cwd),
644
+ durationMs: 0,
645
+ metadata: {
646
+ seq: args.seq,
647
+ decision: args.decision,
648
+ ...args.fingerprint ? { fingerprint: args.fingerprint.slice(0, 12) } : {},
649
+ ...args.avoidedRawBytes === undefined ? {} : { avoidedRawBytes: args.avoidedRawBytes },
650
+ ...args.avoidedGzipBytes === undefined ? {} : { avoidedGzipBytes: args.avoidedGzipBytes },
651
+ ...args.diskSeq === undefined ? {} : { diskSeq: args.diskSeq }
652
+ }
653
+ });
654
+ }
655
+ function reconcileAuthoritativeAfterWrite(pending, rawBytes) {
656
+ const entry = authoritativeSnapshots.get(pending.key);
657
+ if (!entry || entry.snapshot !== pending.snapshot)
658
+ return;
659
+ if (pending.snapshot.wordIndex) {
660
+ try {
661
+ const stat = fs.statSync(pending.gzPath);
662
+ cacheParsedSnapshot(pending.gzPath, {
663
+ mtimeMs: stat.mtimeMs,
664
+ size: stat.size,
665
+ snapshot: withoutWordIndex(pending.snapshot)
666
+ });
667
+ } catch {}
668
+ deleteAuthoritativeSnapshot(pending.key);
669
+ logLatency({
670
+ type: "phase",
671
+ phase: "project_snapshot_word_index_released",
672
+ filePath: pending.gzPath,
673
+ durationMs: 0,
674
+ metadata: { rawBytes }
675
+ });
676
+ return;
677
+ }
678
+ if (rawBytes > SNAPSHOT_PARSE_CACHE_MAX_BYTES) {
679
+ logLatency({
680
+ type: "phase",
681
+ phase: "project_snapshot_authoritative_dropped_oversized",
682
+ filePath: pending.gzPath,
683
+ durationMs: 0,
684
+ metadata: { rawBytes, maxBytes: SNAPSHOT_PARSE_CACHE_MAX_BYTES }
685
+ });
686
+ deleteAuthoritativeSnapshot(pending.key);
687
+ return;
688
+ }
689
+ try {
690
+ const stat = fs.statSync(pending.gzPath);
691
+ entry.knownMtime = stat.mtimeMs;
692
+ entry.knownSize = stat.size;
693
+ } catch {}
694
+ }
695
+ function finalizeProjectSnapshotMeta(pending, record) {
696
+ try {
697
+ writeProjectSnapshotMeta(getProjectSnapshotMetaPath(pending.cwd), pending.snapshot, record);
698
+ return true;
699
+ } catch (err) {
700
+ recordSnapshotPersistFailure(pending, err instanceof Error ? err.message : String(err), true);
701
+ return false;
702
+ }
703
+ }
704
+ function completeSnapshotPersist(pending) {
705
+ if (_activeSnapshotPersists.get(pending.key) !== pending)
706
+ return;
707
+ _activeSnapshotPersists.delete(pending.key);
708
+ if (_snapshotExiting)
709
+ return;
710
+ const queued = _queuedSnapshotPersists.get(pending.key);
711
+ if (!queued)
712
+ return;
713
+ _queuedSnapshotPersists.delete(pending.key);
714
+ dispatchSnapshotPersist(queued);
715
+ }
716
+ const SNAPSHOT_CACHE_LOCK = { staleMs: 5000, waitMs: 500 };
717
+ function withSnapshotCacheLock(gzPath, purpose, op) {
718
+ const result = withGenerationLockSync(`${gzPath}.locks`, SNAPSHOT_CACHE_LOCK, op);
719
+ if (!result.held) {
720
+ const code = result.cause?.code;
721
+ incrementDegradationCount({
722
+ kind: "project-snapshot-lock-unavailable",
723
+ subject: gzPath,
724
+ reason: `${purpose} skipped: ${code ? `lock failed (${code})` : "lock wait ran out"}`
725
+ });
726
+ }
727
+ return result;
728
+ }
729
+ function promoteSnapshotBody(pending, body, record) {
730
+ const dropStage = () => {
731
+ if ("stagePath" in body)
732
+ fs.rmSync(body.stagePath, { force: true });
733
+ };
734
+ const locked = withSnapshotCacheLock(pending.gzPath, "body promotion", () => {
735
+ const onDisk = readProjectSnapshotMeta(pending.cwd);
736
+ if (onDisk && onDisk.seq > pending.snapshot.seq) {
737
+ dropStage();
738
+ return onDisk.seq;
739
+ }
740
+ if ("stagePath" in body)
741
+ fs.renameSync(body.stagePath, pending.gzPath);
742
+ else
743
+ writeFileAtomic(pending.gzPath, body.gzip, { bestEffort: false });
744
+ fs.rmSync(pending.legacyPath, { force: true });
745
+ return finalizeProjectSnapshotMeta(pending, record);
746
+ });
747
+ if (!locked.held) {
748
+ dropStage();
749
+ recordSnapshotPersistFailure(pending, "project snapshot cache lock unavailable");
750
+ return false;
751
+ }
752
+ if (typeof locked.value === "boolean")
753
+ return locked.value;
754
+ deleteAuthoritativeSnapshot(pending.key);
755
+ logSnapshotPersistDecision({
756
+ cwd: pending.cwd,
757
+ seq: pending.snapshot.seq,
758
+ decision: "superseded_on_disk",
759
+ diskSeq: locked.value
760
+ });
761
+ return false;
762
+ }
763
+ function serializeSnapshotBody(snapshot) {
764
+ const started = performance.now();
765
+ const stored = storedSnapshot(snapshot);
766
+ const spliced = stored.wordIndex === undefined ? undefined : spliceWordIndexBody(stored);
767
+ const bytes = spliced?.bytes ?? new TextEncoder().encode(JSON.stringify(stored));
768
+ return {
769
+ bytes,
770
+ serializeMs: performance.now() - started,
771
+ wordIndexWireBytes: spliced?.wordIndexWireBytes
772
+ };
773
+ }
774
+ const WORD_INDEX_PLACEHOLDER = `\x00dm-lens-word-index-${process.pid}-${Date.now()}\x00`;
775
+ const WORD_INDEX_KEY_JSON = '"wordIndex":';
776
+ const WORD_INDEX_PLACEHOLDER_JSON = `${WORD_INDEX_KEY_JSON}${JSON.stringify(WORD_INDEX_PLACEHOLDER)}`;
777
+ function spliceWordIndexBody(stored) {
778
+ const marker = WORD_INDEX_PLACEHOLDER_JSON;
779
+ const head = JSON.stringify({ ...stored, wordIndex: WORD_INDEX_PLACEHOLDER });
780
+ const at = head.indexOf(marker);
781
+ if (at < 0)
782
+ return;
783
+ const prefix = head.slice(0, at + WORD_INDEX_KEY_JSON.length);
784
+ const suffix = head.slice(at + marker.length);
785
+ const wordIndex = JSON.stringify(stored.wordIndex);
786
+ const prefixBytes = Buffer.byteLength(prefix);
787
+ const wordIndexWireBytes = Buffer.byteLength(wordIndex);
788
+ const bytes = new Uint8Array(prefixBytes + wordIndexWireBytes + Buffer.byteLength(suffix));
789
+ const encoder = new TextEncoder;
790
+ encoder.encodeInto(prefix, bytes.subarray(0, prefixBytes));
791
+ encoder.encodeInto(wordIndex, bytes.subarray(prefixBytes, prefixBytes + wordIndexWireBytes));
792
+ encoder.encodeInto(suffix, bytes.subarray(prefixBytes + wordIndexWireBytes));
793
+ return { bytes, wordIndexWireBytes };
794
+ }
795
+ function writeSnapshotBodyOnMainThread(pending, reason) {
796
+ if (!pendingSnapshotIsCurrent(pending)) {
797
+ completeSnapshotPersist(pending);
798
+ return;
799
+ }
800
+ if (reason) {
801
+ logLatency({
802
+ type: "phase",
803
+ phase: "project_snapshot_worker_fallback",
804
+ filePath: pending.gzPath,
805
+ durationMs: 0,
806
+ metadata: {
807
+ reason,
808
+ seq: pending.snapshot.seq,
809
+ degraded: reason !== "exit_hook"
810
+ }
811
+ });
812
+ }
813
+ try {
814
+ const { bytes, serializeMs, wordIndexWireBytes } = serializeSnapshotBody(pending.snapshot);
815
+ pending.wordIndexWireBytes = wordIndexWireBytes;
816
+ const rawBytes = bytes.byteLength;
817
+ const fingerprint = fingerprintProjectSnapshotJson(bytes, pending.snapshot.generatedAt);
818
+ if (pending.dedupeFingerprints.includes(fingerprint)) {
819
+ const current = snapshotPersistBaselinesFor(pending.cwd, pending.key);
820
+ if (current.integrity === "ok") {
821
+ const prior = current.durable ?? pending.durablePersist;
822
+ if (authoritativeSnapshots.get(pending.key)?.snapshot === pending.snapshot) {
823
+ deleteAuthoritativeSnapshot(pending.key);
824
+ }
825
+ logSnapshotPersistDecision({
826
+ cwd: pending.cwd,
827
+ seq: pending.snapshot.seq,
828
+ fingerprint,
829
+ decision: "skipped_unchanged",
830
+ avoidedRawBytes: rawBytes,
831
+ avoidedGzipBytes: prior?.gzBytes
832
+ });
833
+ return;
834
+ }
835
+ if (current.integrity !== undefined) {
836
+ noteSnapshotSkipRefused({
837
+ gzPath: pending.gzPath,
838
+ verdict: current.integrity,
839
+ seq: pending.snapshot.seq
840
+ });
841
+ }
842
+ }
843
+ const writeStarted = performance.now();
844
+ const gzip = gzipSync(bytes);
845
+ fs.mkdirSync(path.dirname(pending.gzPath), { recursive: true });
846
+ const promoted = promoteSnapshotBody(pending, { gzip }, {
847
+ fingerprint,
848
+ generatedAt: pending.snapshot.generatedAt,
849
+ gzBytes: gzip.byteLength
850
+ });
851
+ if (!promoted)
852
+ return;
853
+ recordPersistedWordIndexWireBytes(pending.snapshot.wordIndex, pending.wordIndexWireBytes);
854
+ reconcileAuthoritativeAfterWrite(pending, rawBytes);
855
+ logSnapshotPersistSuccess(pending, fingerprint, {
856
+ rawBytes,
857
+ gzBytes: gzip.byteLength,
858
+ serializeMs,
859
+ writeMs: performance.now() - writeStarted,
860
+ offloaded: false
861
+ });
862
+ if (reason)
863
+ _lastSnapshotPersistErrorForTests = reason;
864
+ } catch (err) {
865
+ recordSnapshotPersistFailure(pending, err instanceof Error ? err.message : String(err));
866
+ } finally {
867
+ completeSnapshotPersist(pending);
868
+ }
869
+ }
870
+ function dispatchMainThreadWriteThroughSeam(pending, reason) {
871
+ if (_snapshotPromotionSeamForTests) {
872
+ _snapshotPromotionSeamForTests().then(() => writeSnapshotBodyOnMainThread(pending, reason));
873
+ return;
874
+ }
875
+ writeSnapshotBodyOnMainThread(pending, reason);
876
+ }
877
+ function handleSnapshotWorkerResult(result) {
878
+ const pending = _snapshotWorkerRequests.get(result.id);
879
+ if (!pending) {
880
+ fs.rmSync(result.stagePath, { force: true });
881
+ return;
882
+ }
883
+ _snapshotWorkerRequests.delete(result.id);
884
+ if (result.error || result.rawBytes === undefined || result.gzBytes === undefined || result.serializeMs === undefined || result.writeMs === undefined || result.semanticFingerprint === undefined) {
885
+ fs.rmSync(result.stagePath, { force: true });
886
+ dispatchMainThreadWriteThroughSeam(pending, result.error ?? "invalid worker result");
887
+ return;
888
+ }
889
+ if (!result.skippedUnchanged)
890
+ _snapshotWorkerBodyWritesForTests++;
891
+ if (_snapshotGenerationGateEnabledForTests && _snapshotGenerationStates.get(pending.key)?.generation !== result.generation) {
892
+ fs.rmSync(result.stagePath, { force: true });
893
+ completeSnapshotPersist(pending);
894
+ return;
895
+ }
896
+ if (result.skippedUnchanged) {
897
+ const baselines = snapshotPersistBaselinesFor(pending.cwd, pending.key);
898
+ if (baselines.integrity !== "ok") {
899
+ if (baselines.integrity !== undefined) {
900
+ noteSnapshotSkipRefused({
901
+ gzPath: pending.gzPath,
902
+ verdict: baselines.integrity,
903
+ seq: pending.snapshot.seq
904
+ });
905
+ }
906
+ dispatchMainThreadWriteThroughSeam(pending, "snapshot body integrity regressed");
907
+ return;
908
+ }
909
+ const prior = baselines.durable ?? pending.durablePersist;
910
+ if (authoritativeSnapshots.get(pending.key)?.snapshot === pending.snapshot) {
911
+ deleteAuthoritativeSnapshot(pending.key);
912
+ }
913
+ logSnapshotPersistDecision({
914
+ cwd: pending.cwd,
915
+ seq: pending.snapshot.seq,
916
+ fingerprint: result.semanticFingerprint,
917
+ decision: "skipped_unchanged",
918
+ avoidedRawBytes: result.rawBytes,
919
+ avoidedGzipBytes: prior?.gzBytes
920
+ });
921
+ completeSnapshotPersist(pending);
922
+ return;
923
+ }
924
+ try {
925
+ const promoted = promoteSnapshotBody(pending, { stagePath: result.stagePath }, {
926
+ fingerprint: result.semanticFingerprint,
927
+ generatedAt: pending.snapshot.generatedAt,
928
+ gzBytes: result.gzBytes
929
+ });
930
+ if (!promoted) {
931
+ completeSnapshotPersist(pending);
932
+ return;
933
+ }
934
+ recordPersistedWordIndexWireBytes(pending.snapshot.wordIndex, pending.wordIndexWireBytes);
935
+ reconcileAuthoritativeAfterWrite(pending, result.rawBytes);
936
+ logSnapshotPersistSuccess(pending, result.semanticFingerprint, {
937
+ rawBytes: result.rawBytes,
938
+ gzBytes: result.gzBytes,
939
+ serializeMs: pending.serializeMs ?? result.serializeMs,
940
+ writeMs: result.writeMs,
941
+ offloaded: true
942
+ });
943
+ completeSnapshotPersist(pending);
944
+ } catch (err) {
945
+ fs.rm(result.stagePath, { force: true }, () => {});
946
+ dispatchMainThreadWriteThroughSeam(pending, err instanceof Error ? err.message : String(err));
947
+ }
948
+ }
949
+ function dispatchSnapshotPersist(pending) {
950
+ const baselines = snapshotPersistBaselinesFor(pending.cwd, pending.key);
951
+ pending.durablePersist = baselines.durable;
952
+ pending.dedupeFingerprints = baselines.fingerprints;
953
+ seedSnapshotPersistBaselineFromDurable(pending.key, baselines.durable);
954
+ _activeSnapshotPersists.set(pending.key, pending);
955
+ if (!snapshotWorkerEnabled()) {
956
+ dispatchMainThreadWriteThroughSeam(pending, undefined);
957
+ return;
958
+ }
959
+ const worker = getSnapshotPersistWorker();
960
+ if (!worker) {
961
+ dispatchMainThreadWriteThroughSeam(pending, "persist worker unavailable");
962
+ return;
963
+ }
964
+ let serialized;
965
+ try {
966
+ serialized = serializeSnapshotBody(pending.snapshot);
967
+ } catch (err) {
968
+ const message = err instanceof Error ? err.message : String(err);
969
+ incrementDegradationCount({
970
+ kind: "project-snapshot-serialize-failed",
971
+ subject: pending.gzPath,
972
+ reason: `snapshot body serialization failed: ${message}`
973
+ });
974
+ recordSnapshotPersistFailure(pending, message);
975
+ completeSnapshotPersist(pending);
976
+ return;
977
+ }
978
+ pending.serializeMs = serialized.serializeMs;
979
+ pending.wordIndexWireBytes = serialized.wordIndexWireBytes;
980
+ const id = ++_snapshotWorkerRequestId;
981
+ _snapshotWorkerRequests.set(id, pending);
982
+ const request = {
983
+ id,
984
+ generation: pending.generation,
985
+ stagePath: pending.stagePath,
986
+ data: serialized.bytes,
987
+ generatedAt: pending.snapshot.generatedAt,
988
+ priorFingerprints: pending.dedupeFingerprints,
989
+ testDelayMs: undefined
990
+ };
991
+ try {
992
+ worker.postMessage(request, [serialized.bytes.buffer]);
993
+ } catch (err) {
994
+ _snapshotWorkerRequests.delete(id);
995
+ dispatchMainThreadWriteThroughSeam(pending, err instanceof Error ? err.message : String(err));
996
+ }
997
+ }
998
+ function handleSnapshotWorkerDeath(reason) {
999
+ _snapshotPersistWorker = undefined;
1000
+ _snapshotPersistWorkerHeapStatistics = null;
1001
+ _snapshotWorkerDisabled = true;
1002
+ const requests = [..._snapshotWorkerRequests.values()];
1003
+ _snapshotWorkerRequests.clear();
1004
+ for (const pending of requests)
1005
+ dispatchMainThreadWriteThroughSeam(pending, reason);
1006
+ }
1007
+ function resolveSnapshotPersistWorkerPath() {
1008
+ const candidates = [
1009
+ new URL("./project-snapshot-persist-worker.js", import.meta.url),
1010
+ new URL("./workers/project-snapshot-persist-worker.js", import.meta.url),
1011
+ new URL("../workers/project-snapshot-persist-worker.js", import.meta.url)
1012
+ ];
1013
+ for (const url of candidates) {
1014
+ try {
1015
+ const resolved = fileURLToPath(url);
1016
+ if (fs.existsSync(resolved))
1017
+ return resolved;
1018
+ } catch {}
1019
+ }
1020
+ return;
1021
+ }
1022
+ function getSnapshotPersistWorker() {
1023
+ if (_snapshotWorkerDisabled)
1024
+ return;
1025
+ if (_snapshotPersistWorker)
1026
+ return _snapshotPersistWorker;
1027
+ try {
1028
+ const workerPath = resolveSnapshotPersistWorkerPath();
1029
+ if (workerPath === undefined) {
1030
+ handleSnapshotWorkerDeath("persist worker script not found in any layout");
1031
+ return;
1032
+ }
1033
+ const worker = new Worker(workerPath);
1034
+ worker.on("message", (result) => {
1035
+ if (_snapshotPromotionSeamForTests) {
1036
+ _snapshotPromotionSeamForTests().then(() => handleSnapshotWorkerResult(result));
1037
+ return;
1038
+ }
1039
+ handleSnapshotWorkerResult(result);
1040
+ });
1041
+ worker.on("error", (err) => handleSnapshotWorkerDeath(err.message));
1042
+ worker.on("exit", (code) => {
1043
+ if (_snapshotPersistWorker === worker) {
1044
+ _snapshotPersistWorker = undefined;
1045
+ _snapshotPersistWorkerHeapStatistics = null;
1046
+ }
1047
+ const stranded = [..._snapshotWorkerRequests.values()];
1048
+ if (stranded.length > 0) {
1049
+ _snapshotWorkerRequests.clear();
1050
+ for (const pending of stranded) {
1051
+ dispatchMainThreadWriteThroughSeam(pending, `persist worker exited with code ${code}`);
1052
+ }
1053
+ }
1054
+ if (code !== 0)
1055
+ _snapshotWorkerDisabled = true;
1056
+ });
1057
+ worker.unref();
1058
+ _snapshotPersistWorker = worker;
1059
+ return worker;
1060
+ } catch (err) {
1061
+ handleSnapshotWorkerDeath(err instanceof Error ? err.message : String(err));
1062
+ return;
1063
+ }
1064
+ }
1065
+ const _sweptSnapshotStageDirs = new Set;
1066
+ function sweepStaleSnapshotStageFiles(cacheDir) {
1067
+ if (_sweptSnapshotStageDirs.has(cacheDir))
1068
+ return;
1069
+ _sweptSnapshotStageDirs.add(cacheDir);
1070
+ fs.readdir(cacheDir, (err, entries) => {
1071
+ if (err)
1072
+ return;
1073
+ for (const entry of entries) {
1074
+ if (!isStaleStageFile(entry, "project-snapshot.json.gz.stage-"))
1075
+ continue;
1076
+ fs.rm(path.join(cacheDir, entry), { force: true }, () => {});
1077
+ }
1078
+ });
1079
+ }
1080
+ function flushSnapshotPersistsAtExit() {
1081
+ _snapshotExiting = true;
1082
+ const latestByKey = new Map;
1083
+ for (const pending of _snapshotWorkerRequests.values()) {
1084
+ latestByKey.set(pending.key, pending);
1085
+ }
1086
+ for (const pending of _queuedSnapshotPersists.values()) {
1087
+ const prior = latestByKey.get(pending.key);
1088
+ if (!prior || prior.generation <= pending.generation) {
1089
+ latestByKey.set(pending.key, pending);
1090
+ }
1091
+ }
1092
+ _snapshotWorkerRequests.clear();
1093
+ _queuedSnapshotPersists.clear();
1094
+ _activeSnapshotPersists.clear();
1095
+ for (const pending of latestByKey.values()) {
1096
+ writeSnapshotBodyOnMainThread(pending, "exit_hook");
1097
+ }
1098
+ _snapshotPersistWorker?.terminate();
1099
+ }
1100
+ let _snapshotExitHookInstalled = false;
1101
+ function ensureSnapshotPersistExitHook() {
1102
+ if (_snapshotExitHookInstalled)
1103
+ return;
1104
+ _snapshotExitHookInstalled = true;
1105
+ process.once("exit", flushSnapshotPersistsAtExit);
1106
+ }
1107
+ export function runSnapshotPersistExitFlushForTests() {
1108
+ flushSnapshotPersistsAtExit();
1109
+ }
1110
+ export function saveProjectSnapshot(cwd, snapshot) {
1111
+ const gzPath = getProjectSnapshotPath(cwd);
1112
+ const legacyPath = getProjectSnapshotLegacyPath(cwd);
1113
+ const metaPath = getProjectSnapshotMetaPath(cwd);
1114
+ const cacheDir = path.dirname(gzPath);
1115
+ const key = normalizeMapKey(cwd);
1116
+ fs.mkdirSync(cacheDir, { recursive: true });
1117
+ const baselines = snapshotPersistBaselinesFor(cwd, key);
1118
+ const priorPersist = baselines.durable;
1119
+ logSnapshotPersistDecision({
1120
+ cwd,
1121
+ seq: snapshot.seq,
1122
+ decision: "requested"
1123
+ });
1124
+ if (_failedSnapshotPersists.delete(key)) {
1125
+ logSnapshotPersistDecision({ cwd, seq: snapshot.seq, decision: "retry" });
1126
+ }
1127
+ withSnapshotCacheLock(gzPath, "admission meta write", () => {
1128
+ const onDisk = readProjectSnapshotMeta(cwd);
1129
+ if (!onDisk || onDisk.seq < snapshot.seq) {
1130
+ writeProjectSnapshotMeta(metaPath, snapshot);
1131
+ }
1132
+ });
1133
+ const priorBody = resolveSnapshotBodyPath(cwd);
1134
+ const knownMtime = priorBody ? priorBody.mtimeMs : Number.NEGATIVE_INFINITY;
1135
+ const knownSize = priorBody ? priorBody.size : Number.NEGATIVE_INFINITY;
1136
+ const authoritativeEntry = {
1137
+ snapshot,
1138
+ knownMtime,
1139
+ knownSize,
1140
+ lastUsedAt: Date.now()
1141
+ };
1142
+ const previousAuthoritativeEntry = authoritativeSnapshots.get(key);
1143
+ if (previousAuthoritativeEntry)
1144
+ clearAuthoritativeSnapshotTimer(previousAuthoritativeEntry);
1145
+ authoritativeSnapshots.set(key, authoritativeEntry);
1146
+ scheduleAuthoritativeSnapshotEviction(key, authoritativeEntry);
1147
+ enforceAuthoritativeSnapshotCap();
1148
+ snapshotParseCache.delete(gzPath);
1149
+ const generationState = _snapshotGenerationStates.get(key);
1150
+ const generation = generationState?.seq === snapshot.seq ? generationState.generation : (generationState?.generation ?? 0) + 1;
1151
+ _snapshotGenerationStates.set(key, { generation, seq: snapshot.seq });
1152
+ const stagePath = `${gzPath}.stage-${process.pid}-${generation}`;
1153
+ const pending = {
1154
+ key,
1155
+ cwd,
1156
+ gzPath,
1157
+ legacyPath,
1158
+ stagePath,
1159
+ snapshot,
1160
+ generation,
1161
+ durablePersist: priorPersist,
1162
+ dedupeFingerprints: baselines.fingerprints
1163
+ };
1164
+ sweepStaleSnapshotStageFiles(cacheDir);
1165
+ ensureSnapshotPersistExitHook();
1166
+ if (_activeSnapshotPersists.has(key)) {
1167
+ _queuedSnapshotPersists.set(key, pending);
1168
+ logSnapshotPersistDecision({
1169
+ cwd,
1170
+ seq: snapshot.seq,
1171
+ decision: "coalesced"
1172
+ });
1173
+ return;
1174
+ }
1175
+ dispatchSnapshotPersist(pending);
1176
+ }
1177
+ export async function waitForProjectSnapshotPersistsForTests() {
1178
+ for (let attempts = 0;attempts < 200 && (_snapshotWorkerRequests.size > 0 || _activeSnapshotPersists.size > 0 || _queuedSnapshotPersists.size > 0); attempts++) {
1179
+ await new Promise((resolve) => setTimeout(resolve, 10));
1180
+ }
1181
+ }
1182
+ export function flushProjectSnapshotPersistsForTests() {
1183
+ const requests = [..._snapshotWorkerRequests.values()];
1184
+ _snapshotWorkerRequests.clear();
1185
+ for (const pending of requests) {
1186
+ dispatchMainThreadWriteThroughSeam(pending, undefined);
1187
+ }
1188
+ }
1189
+ export async function terminateProjectSnapshotPersistWorkerForTests() {
1190
+ const worker = _snapshotPersistWorker;
1191
+ if (worker)
1192
+ await worker.terminate();
1193
+ }
1194
+ export function resetProjectSnapshotPersistWorkerForTests() {
1195
+ _snapshotWorkerDisabled = false;
1196
+ _snapshotGenerationGateEnabledForTests = true;
1197
+ _snapshotPromotionSeamForTests = undefined;
1198
+ _snapshotPersistWorker = undefined;
1199
+ _snapshotPersistWorkerHeapStatistics = null;
1200
+ _snapshotWorkerRequests.clear();
1201
+ _snapshotGenerationStates.clear();
1202
+ _successfulSnapshotPersists.clear();
1203
+ _failedSnapshotPersists.clear();
1204
+ _activeSnapshotPersists.clear();
1205
+ _queuedSnapshotPersists.clear();
1206
+ _snapshotExiting = false;
1207
+ _snapshotWorkerBodyWritesForTests = 0;
1208
+ _lastSnapshotPersistErrorForTests = undefined;
1209
+ }
1210
+ export function getProjectSnapshotPersistStateForTests(cwd) {
1211
+ const key = normalizeMapKey(cwd);
1212
+ return {
1213
+ active: _activeSnapshotPersists.has(key),
1214
+ queued: _queuedSnapshotPersists.has(key),
1215
+ successfulFingerprint: _successfulSnapshotPersists.get(key)?.fingerprint,
1216
+ workerBodyWrites: _snapshotWorkerBodyWritesForTests
1217
+ };
1218
+ }
1219
+ export function setProjectSnapshotGenerationGateForTests(enabled) {
1220
+ _snapshotGenerationGateEnabledForTests = enabled;
1221
+ }
1222
+ export function setProjectSnapshotPromotionSeamForTests(seam) {
1223
+ _snapshotPromotionSeamForTests = seam;
1224
+ }
1225
+ export function getProjectSnapshotPersistErrorForTests() {
1226
+ return _lastSnapshotPersistErrorForTests;
1227
+ }
1228
+ export function _seedSnapshotParseCacheForTests(key, entry) {
1229
+ cacheParsedSnapshot(key, entry);
1230
+ }
1231
+ export function _snapshotParseCacheKeysForTests() {
1232
+ return [...snapshotParseCache.keys()];
1233
+ }
1234
+ export function _snapshotParseCacheGetForTests(key) {
1235
+ return snapshotParseCache.get(key) !== undefined;
1236
+ }
1237
+ export function _seedSuccessfulSnapshotPersistForTests(key, record) {
1238
+ rememberSuccessfulSnapshotPersist(key, record);
1239
+ }
1240
+ export function _successfulSnapshotPersistKeysForTests() {
1241
+ return [..._successfulSnapshotPersists.keys()];
1242
+ }
1243
+ export function _successfulSnapshotPersistGetForTests(key) {
1244
+ return _successfulSnapshotPersists.get(key) !== undefined;
1245
+ }
1246
+ export function _seedFailedSnapshotPersistForTests(key, record) {
1247
+ _failedSnapshotPersists.set(key, record);
1248
+ }
1249
+ export function _failedSnapshotPersistKeysForTests() {
1250
+ return [..._failedSnapshotPersists.keys()];
1251
+ }
1252
+ export function buildProjectSnapshotFromRuntime(args) {
1253
+ const incomplete = args.runtime.viewMissesLoggedEntries;
1254
+ return {
1255
+ version: PROJECT_SNAPSHOT_VERSION,
1256
+ projectRoot: normalizeMapKey(path.resolve(args.cwd)),
1257
+ generatedAt: new Date().toISOString(),
1258
+ seq: args.runtime.projectSeq,
1259
+ ...incomplete ? { incomplete: true } : {},
1260
+ logEntries: args.runtime.viewLogEntries,
1261
+ files: {},
1262
+ symbols: {},
1263
+ reverseDeps: {},
1264
+ cachedExports: [...args.runtime.cachedExports.entries()].sort((a, b) => a[0].localeCompare(b[0])),
1265
+ sequenceIndex: incomplete ? undefined : {
1266
+ projectSeq: args.runtime.projectSeq,
1267
+ fileSeqByPath: args.runtime.getFileSeqEntries()
1268
+ },
1269
+ wordIndex: args.runtime.wordIndex ? serializeWordIndex(args.runtime.wordIndex) : undefined,
1270
+ projectRulesScan: args.runtime.projectRulesScan,
1271
+ startupScan: args.startupScan,
1272
+ languageProfile: args.languageProfile,
1273
+ conventions: args.conventions
1274
+ };
1275
+ }
1276
+ export function hydrateRuntimeFromProjectSnapshot(runtime, snapshot) {
1277
+ runtime.cachedExports.clear();
1278
+ for (const [name, filePath] of snapshot.cachedExports) {
1279
+ runtime.cachedExports.set(name, filePath);
1280
+ }
1281
+ if (snapshot.projectRulesScan) {
1282
+ runtime.projectRulesScan = snapshot.projectRulesScan;
1283
+ }
1284
+ runtime.wordIndex = deserializeWordIndex(snapshot.wordIndex);
1285
+ }
1286
+ export function hydrateRuntimeFromProjectSnapshotIfIdle(runtime, snapshot) {
1287
+ let hydratedAnything = false;
1288
+ if (runtime.cachedExports.size === 0 && snapshot.cachedExports.length > 0) {
1289
+ runtime.cachedExports.clear();
1290
+ for (const [name, filePath] of snapshot.cachedExports) {
1291
+ runtime.cachedExports.set(name, filePath);
1292
+ }
1293
+ hydratedAnything = true;
1294
+ }
1295
+ if (!runtime.projectRulesScan.hasCustomRules && runtime.projectRulesScan.rules.length === 0 && snapshot.projectRulesScan) {
1296
+ runtime.projectRulesScan = snapshot.projectRulesScan;
1297
+ hydratedAnything = true;
1298
+ }
1299
+ return hydratedAnything;
1300
+ }
1301
+ export function saveRuntimeProjectSnapshot(args) {
1302
+ try {
1303
+ if (typeof args.runtime.projectSeq !== "number")
1304
+ return;
1305
+ const existing = loadProjectSnapshot(args.cwd);
1306
+ let conventions = args.conventions ?? existing?.conventions;
1307
+ if (!conventions) {
1308
+ try {
1309
+ conventions = detectProjectConventions(args.cwd);
1310
+ } catch (err) {
1311
+ args.dbg?.(`project_snapshot: convention detection failed: ${err}`);
1312
+ }
1313
+ }
1314
+ const snapshot = buildProjectSnapshotFromRuntime({
1315
+ ...args,
1316
+ startupScan: args.startupScan ?? existing?.startupScan,
1317
+ languageProfile: args.languageProfile ?? existing?.languageProfile,
1318
+ conventions
1319
+ });
1320
+ if (existing) {
1321
+ snapshot.files = existing.files ?? {};
1322
+ snapshot.symbols = existing.symbols ?? {};
1323
+ snapshot.reverseDeps = existing.reverseDeps ?? {};
1324
+ if (!snapshot.wordIndex && existing.wordIndex && existing.seq === snapshot.seq && (snapshot.incomplete || !existing.incomplete)) {
1325
+ snapshot.wordIndex = existing.wordIndex;
1326
+ }
1327
+ }
1328
+ saveProjectSnapshot(args.cwd, snapshot);
1329
+ args.dbg?.(`project_snapshot: saved seq=${snapshot.seq} exports=${snapshot.cachedExports.length}`);
1330
+ } catch (err) {
1331
+ args.dbg?.(`project_snapshot: save failed: ${err}`);
1332
+ }
1333
+ }