@duckmind/dm-linux-x64 0.66.0 → 0.66.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dm +2 -2
  2. package/extensions/.dm-extensions.json +12 -546
  3. package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +1 -1
  4. package/extensions/dm-mcp-adapter/mcp-keyring-helper.cjs +1 -1
  5. package/extensions/dm-ponytail/hooks/ponytail-activate.js +1 -1
  6. package/extensions/dm-ponytail/hooks/ponytail-instructions.js +1 -1
  7. package/extensions/dm-subagents/src/runs/background/runner-aliases.js +2 -2
  8. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +4 -1
  9. package/extensions/dm-subagents/src/runs/shared/child-session.js +8 -6
  10. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +9 -1
  11. package/extensions/dm-subagents/src/watchdog/review.js +4 -1
  12. package/package.json +1 -1
  13. package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +0 -24
  14. package/extensions/dm-lens/dist/clients/actionable-warnings.js +0 -1014
  15. package/extensions/dm-lens/dist/clients/advisory-provenance.js +0 -385
  16. package/extensions/dm-lens/dist/clients/agent-behavior-client.js +0 -94
  17. package/extensions/dm-lens/dist/clients/agent-nudge.js +0 -151
  18. package/extensions/dm-lens/dist/clients/analysed-root.js +0 -1
  19. package/extensions/dm-lens/dist/clients/ast-grep-client.js +0 -576
  20. package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +0 -114
  21. package/extensions/dm-lens/dist/clients/ast-grep-tool-logger.js +0 -85
  22. package/extensions/dm-lens/dist/clients/ast-grep-types.js +0 -1
  23. package/extensions/dm-lens/dist/clients/ast-grep-yaml-synth.js +0 -109
  24. package/extensions/dm-lens/dist/clients/atomic-write-staging.js +0 -66
  25. package/extensions/dm-lens/dist/clients/atomic-write.js +0 -37
  26. package/extensions/dm-lens/dist/clients/availability-probe-flight.js +0 -11
  27. package/extensions/dm-lens/dist/clients/bash-file-access.js +0 -830
  28. package/extensions/dm-lens/dist/clients/biome-client.js +0 -221
  29. package/extensions/dm-lens/dist/clients/blocker-freshness.js +0 -385
  30. package/extensions/dm-lens/dist/clients/blocker-past-eof.js +0 -49
  31. package/extensions/dm-lens/dist/clients/bootstrap.js +0 -246
  32. package/extensions/dm-lens/dist/clients/bounded-cache.js +0 -105
  33. package/extensions/dm-lens/dist/clients/bounded-pid-file-lock.js +0 -173
  34. package/extensions/dm-lens/dist/clients/bounded-telemetry.js +0 -104
  35. package/extensions/dm-lens/dist/clients/build-identity.js +0 -45
  36. package/extensions/dm-lens/dist/clients/bundled-resource-health.js +0 -41
  37. package/extensions/dm-lens/dist/clients/bus-events-logger.js +0 -48
  38. package/extensions/dm-lens/dist/clients/bus-publish.js +0 -117
  39. package/extensions/dm-lens/dist/clients/cache/rule-cache.js +0 -103
  40. package/extensions/dm-lens/dist/clients/cache-manager.js +0 -340
  41. package/extensions/dm-lens/dist/clients/cache-observability.js +0 -847
  42. package/extensions/dm-lens/dist/clients/call-graph.js +0 -628
  43. package/extensions/dm-lens/dist/clients/cargo-manifest.js +0 -151
  44. package/extensions/dm-lens/dist/clients/cascade-budget.js +0 -52
  45. package/extensions/dm-lens/dist/clients/cascade-format.js +0 -160
  46. package/extensions/dm-lens/dist/clients/cascade-logger.js +0 -22
  47. package/extensions/dm-lens/dist/clients/cascade-types.js +0 -1
  48. package/extensions/dm-lens/dist/clients/child-unref.js +0 -59
  49. package/extensions/dm-lens/dist/clients/code-quality-warnings.js +0 -192
  50. package/extensions/dm-lens/dist/clients/codebase-model.js +0 -110
  51. package/extensions/dm-lens/dist/clients/collateral-test-role.js +0 -8
  52. package/extensions/dm-lens/dist/clients/complexity-client.js +0 -398
  53. package/extensions/dm-lens/dist/clients/config-core/deny.js +0 -117
  54. package/extensions/dm-lens/dist/clients/config-core/index.js +0 -2
  55. package/extensions/dm-lens/dist/clients/config-core/merge.js +0 -228
  56. package/extensions/dm-lens/dist/clients/config-core/normalize.js +0 -217
  57. package/extensions/dm-lens/dist/clients/config-core/process-spec.js +0 -147
  58. package/extensions/dm-lens/dist/clients/config-core/provenance.js +0 -54
  59. package/extensions/dm-lens/dist/clients/config-core/records.js +0 -79
  60. package/extensions/dm-lens/dist/clients/config-core/resolve.js +0 -48
  61. package/extensions/dm-lens/dist/clients/config-core/safe-object.js +0 -22
  62. package/extensions/dm-lens/dist/clients/config-core/schema.js +0 -90
  63. package/extensions/dm-lens/dist/clients/config-diagnostic-codes.js +0 -90
  64. package/extensions/dm-lens/dist/clients/config-locations.js +0 -175
  65. package/extensions/dm-lens/dist/clients/config-resolve.js +0 -359
  66. package/extensions/dm-lens/dist/clients/config-schema.js +0 -128
  67. package/extensions/dm-lens/dist/clients/config-warn.js +0 -146
  68. package/extensions/dm-lens/dist/clients/console-guard-install.js +0 -4
  69. package/extensions/dm-lens/dist/clients/cooperative-budget.js +0 -36
  70. package/extensions/dm-lens/dist/clients/dead-code-client.js +0 -342
  71. package/extensions/dm-lens/dist/clients/dead-code-logger.js +0 -18
  72. package/extensions/dm-lens/dist/clients/deadline-utils.js +0 -117
  73. package/extensions/dm-lens/dist/clients/debug-handles.js +0 -121
  74. package/extensions/dm-lens/dist/clients/debug-heap.js +0 -80
  75. package/extensions/dm-lens/dist/clients/deferred-lsp-work.js +0 -33
  76. package/extensions/dm-lens/dist/clients/degradation-ledger.js +0 -272
  77. package/extensions/dm-lens/dist/clients/demoted-finding-render.js +0 -61
  78. package/extensions/dm-lens/dist/clients/dependency-checker.js +0 -525
  79. package/extensions/dm-lens/dist/clients/deps/ast-grep-napi.js +0 -17
  80. package/extensions/dm-lens/dist/clients/deps/dm-host-deps.js +0 -10
  81. package/extensions/dm-lens/dist/clients/deps/dm-tui-compat.js +0 -58
  82. package/extensions/dm-lens/dist/clients/deps/js-yaml.js +0 -7
  83. package/extensions/dm-lens/dist/clients/deps/minimatch.js +0 -6
  84. package/extensions/dm-lens/dist/clients/deps/pidusage.js +0 -5
  85. package/extensions/dm-lens/dist/clients/deps/typebox.js +0 -5
  86. package/extensions/dm-lens/dist/clients/deps/vscode-jsonrpc.js +0 -8
  87. package/extensions/dm-lens/dist/clients/deps/web-tree-sitter.js +0 -11
  88. package/extensions/dm-lens/dist/clients/diagnostic-dispositions.js +0 -318
  89. package/extensions/dm-lens/dist/clients/diagnostic-line-freshness.js +0 -144
  90. package/extensions/dm-lens/dist/clients/diagnostic-logger.js +0 -60
  91. package/extensions/dm-lens/dist/clients/diagnostic-tracker.js +0 -89
  92. package/extensions/dm-lens/dist/clients/diagnostics-publish.js +0 -134
  93. package/extensions/dm-lens/dist/clients/dispatch/ast-grep-catalog.js +0 -16
  94. package/extensions/dm-lens/dist/clients/dispatch/auxiliary-lsp.js +0 -158
  95. package/extensions/dm-lens/dist/clients/dispatch/collect-later-tier.js +0 -25
  96. package/extensions/dm-lens/dist/clients/dispatch/diagnostic-taxonomy.js +0 -58
  97. package/extensions/dm-lens/dist/clients/dispatch/dispatcher.js +0 -953
  98. package/extensions/dm-lens/dist/clients/dispatch/fact-provider-types.js +0 -1
  99. package/extensions/dm-lens/dist/clients/dispatch/fact-rule-runner.js +0 -17
  100. package/extensions/dm-lens/dist/clients/dispatch/fact-runner.js +0 -18
  101. package/extensions/dm-lens/dist/clients/dispatch/fact-scheduler.js +0 -52
  102. package/extensions/dm-lens/dist/clients/dispatch/fact-store.js +0 -199
  103. package/extensions/dm-lens/dist/clients/dispatch/facts/comment-facts.js +0 -20
  104. package/extensions/dm-lens/dist/clients/dispatch/facts/file-content.js +0 -18
  105. package/extensions/dm-lens/dist/clients/dispatch/facts/function-facts.js +0 -281
  106. package/extensions/dm-lens/dist/clients/dispatch/facts/import-facts.js +0 -169
  107. package/extensions/dm-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -19
  108. package/extensions/dm-lens/dist/clients/dispatch/facts/try-catch-facts.js +0 -95
  109. package/extensions/dm-lens/dist/clients/dispatch/finding-policy.js +0 -159
  110. package/extensions/dm-lens/dist/clients/dispatch/indent-detect.js +0 -227
  111. package/extensions/dm-lens/dist/clients/dispatch/inline-suppressions.js +0 -52
  112. package/extensions/dm-lens/dist/clients/dispatch/integration.js +0 -1463
  113. package/extensions/dm-lens/dist/clients/dispatch/lazy.js +0 -8
  114. package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +0 -75
  115. package/extensions/dm-lens/dist/clients/dispatch/plan.js +0 -278
  116. package/extensions/dm-lens/dist/clients/dispatch/priorities.js +0 -14
  117. package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +0 -42
  118. package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +0 -21
  119. package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +0 -73
  120. package/extensions/dm-lens/dist/clients/dispatch/rules/async-noise.js +0 -31
  121. package/extensions/dm-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  122. package/extensions/dm-lens/dist/clients/dispatch/rules/cors-wildcard.js +0 -35
  123. package/extensions/dm-lens/dist/clients/dispatch/rules/error-obscuring.js +0 -29
  124. package/extensions/dm-lens/dist/clients/dispatch/rules/error-swallowing.js +0 -29
  125. package/extensions/dm-lens/dist/clients/dispatch/rules/framework-call-noise.js +0 -31
  126. package/extensions/dm-lens/dist/clients/dispatch/rules/high-complexity.js +0 -56
  127. package/extensions/dm-lens/dist/clients/dispatch/rules/high-fan-out.js +0 -45
  128. package/extensions/dm-lens/dist/clients/dispatch/rules/high-import-coupling.js +0 -31
  129. package/extensions/dm-lens/dist/clients/dispatch/rules/missing-error-propagation.js +0 -45
  130. package/extensions/dm-lens/dist/clients/dispatch/rules/no-commented-credentials.js +0 -46
  131. package/extensions/dm-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -38
  132. package/extensions/dm-lens/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  133. package/extensions/dm-lens/dist/clients/dispatch/rules/unsafe-boundary.js +0 -101
  134. package/extensions/dm-lens/dist/clients/dispatch/runner-context.js +0 -46
  135. package/extensions/dm-lens/dist/clients/dispatch/runners/actionlint.js +0 -98
  136. package/extensions/dm-lens/dist/clients/dispatch/runners/ast-grep-napi.js +0 -690
  137. package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +0 -202
  138. package/extensions/dm-lens/dist/clients/dispatch/runners/cpp-check.js +0 -190
  139. package/extensions/dm-lens/dist/clients/dispatch/runners/credo.js +0 -66
  140. package/extensions/dm-lens/dist/clients/dispatch/runners/cue-vet.js +0 -167
  141. package/extensions/dm-lens/dist/clients/dispatch/runners/dart-analyze.js +0 -151
  142. package/extensions/dm-lens/dist/clients/dispatch/runners/detekt.js +0 -157
  143. package/extensions/dm-lens/dist/clients/dispatch/runners/dotnet-build.js +0 -157
  144. package/extensions/dm-lens/dist/clients/dispatch/runners/elixir-check.js +0 -153
  145. package/extensions/dm-lens/dist/clients/dispatch/runners/eslint.js +0 -99
  146. package/extensions/dm-lens/dist/clients/dispatch/runners/fact-rules.js +0 -20
  147. package/extensions/dm-lens/dist/clients/dispatch/runners/fish-indent.js +0 -65
  148. package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +0 -107
  149. package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +0 -51
  150. package/extensions/dm-lens/dist/clients/dispatch/runners/golangci-lint.js +0 -89
  151. package/extensions/dm-lens/dist/clients/dispatch/runners/hadolint.js +0 -83
  152. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-lint.js +0 -144
  153. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-render.js +0 -593
  154. package/extensions/dm-lens/dist/clients/dispatch/runners/htmlhint.js +0 -103
  155. package/extensions/dm-lens/dist/clients/dispatch/runners/index.js +0 -100
  156. package/extensions/dm-lens/dist/clients/dispatch/runners/javac.js +0 -82
  157. package/extensions/dm-lens/dist/clients/dispatch/runners/ktlint.js +0 -93
  158. package/extensions/dm-lens/dist/clients/dispatch/runners/lsp.js +0 -206
  159. package/extensions/dm-lens/dist/clients/dispatch/runners/markdownlint.js +0 -129
  160. package/extensions/dm-lens/dist/clients/dispatch/runners/mypy.js +0 -70
  161. package/extensions/dm-lens/dist/clients/dispatch/runners/oxlint.js +0 -305
  162. package/extensions/dm-lens/dist/clients/dispatch/runners/php-lint.js +0 -70
  163. package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +0 -90
  164. package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +0 -56
  165. package/extensions/dm-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -307
  166. package/extensions/dm-lens/dist/clients/dispatch/runners/pyright.js +0 -118
  167. package/extensions/dm-lens/dist/clients/dispatch/runners/rubocop.js +0 -79
  168. package/extensions/dm-lens/dist/clients/dispatch/runners/ruff.js +0 -69
  169. package/extensions/dm-lens/dist/clients/dispatch/runners/rust-clippy.js +0 -147
  170. package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +0 -111
  171. package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +0 -81
  172. package/extensions/dm-lens/dist/clients/dispatch/runners/spellcheck.js +0 -74
  173. package/extensions/dm-lens/dist/clients/dispatch/runners/spotbugs.js +0 -208
  174. package/extensions/dm-lens/dist/clients/dispatch/runners/sqlfluff.js +0 -136
  175. package/extensions/dm-lens/dist/clients/dispatch/runners/stylelint.js +0 -118
  176. package/extensions/dm-lens/dist/clients/dispatch/runners/swiftlint.js +0 -143
  177. package/extensions/dm-lens/dist/clients/dispatch/runners/taplo.js +0 -97
  178. package/extensions/dm-lens/dist/clients/dispatch/runners/terragrunt.js +0 -110
  179. package/extensions/dm-lens/dist/clients/dispatch/runners/tflint.js +0 -104
  180. package/extensions/dm-lens/dist/clients/dispatch/runners/tree-sitter.js +0 -516
  181. package/extensions/dm-lens/dist/clients/dispatch/runners/trivy-config.js +0 -155
  182. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/availability-policy.js +0 -285
  183. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -61
  184. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -61
  185. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -130
  186. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1067
  187. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -40
  188. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/tool-failure.js +0 -117
  189. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -88
  190. package/extensions/dm-lens/dist/clients/dispatch/runners/utils.js +0 -8
  191. package/extensions/dm-lens/dist/clients/dispatch/runners/vale.js +0 -106
  192. package/extensions/dm-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -163
  193. package/extensions/dm-lens/dist/clients/dispatch/runners/yamllint.js +0 -83
  194. package/extensions/dm-lens/dist/clients/dispatch/runners/zig-check.js +0 -72
  195. package/extensions/dm-lens/dist/clients/dispatch/suppress-writer.js +0 -57
  196. package/extensions/dm-lens/dist/clients/dispatch/tool-profile.js +0 -30
  197. package/extensions/dm-lens/dist/clients/dispatch/types.js +0 -7
  198. package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +0 -45
  199. package/extensions/dm-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -31
  200. package/extensions/dm-lens/dist/clients/disposition-logger.js +0 -19
  201. package/extensions/dm-lens/dist/clients/disposition-publish.js +0 -88
  202. package/extensions/dm-lens/dist/clients/durable-store.js +0 -77
  203. package/extensions/dm-lens/dist/clients/effective-config.js +0 -160
  204. package/extensions/dm-lens/dist/clients/env-utils.js +0 -26
  205. package/extensions/dm-lens/dist/clients/error-class.js +0 -3
  206. package/extensions/dm-lens/dist/clients/eval-timestamp.js +0 -2
  207. package/extensions/dm-lens/dist/clients/event-loop-hold.js +0 -119
  208. package/extensions/dm-lens/dist/clients/event-loop-monitor.js +0 -84
  209. package/extensions/dm-lens/dist/clients/extension-log.js +0 -230
  210. package/extensions/dm-lens/dist/clients/extension-mode.js +0 -20
  211. package/extensions/dm-lens/dist/clients/feature-hints.js +0 -88
  212. package/extensions/dm-lens/dist/clients/file-kinds.js +0 -304
  213. package/extensions/dm-lens/dist/clients/file-role.js +0 -50
  214. package/extensions/dm-lens/dist/clients/file-time.js +0 -112
  215. package/extensions/dm-lens/dist/clients/file-utils.js +0 -630
  216. package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +0 -129
  217. package/extensions/dm-lens/dist/clients/finding-identity.js +0 -23
  218. package/extensions/dm-lens/dist/clients/fix-worklog.js +0 -75
  219. package/extensions/dm-lens/dist/clients/format-events-publish.js +0 -230
  220. package/extensions/dm-lens/dist/clients/format-service.js +0 -154
  221. package/extensions/dm-lens/dist/clients/formatters-lazy.js +0 -8
  222. package/extensions/dm-lens/dist/clients/formatters.js +0 -1351
  223. package/extensions/dm-lens/dist/clients/freshness-cadence.js +0 -1
  224. package/extensions/dm-lens/dist/clients/freshness.js +0 -8
  225. package/extensions/dm-lens/dist/clients/generated-artifacts.js +0 -209
  226. package/extensions/dm-lens/dist/clients/generation-guard.js +0 -105
  227. package/extensions/dm-lens/dist/clients/git-guard.js +0 -770
  228. package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +0 -120
  229. package/extensions/dm-lens/dist/clients/gitleaks-client.js +0 -282
  230. package/extensions/dm-lens/dist/clients/go-client.js +0 -47
  231. package/extensions/dm-lens/dist/clients/govulncheck-client.js +0 -411
  232. package/extensions/dm-lens/dist/clients/gradle-ktfmt-style.js +0 -177
  233. package/extensions/dm-lens/dist/clients/grammar-source.js +0 -224
  234. package/extensions/dm-lens/dist/clients/gzip-stage-write.js +0 -85
  235. package/extensions/dm-lens/dist/clients/hashline-anchor.js +0 -222
  236. package/extensions/dm-lens/dist/clients/hook-budgets.js +0 -16
  237. package/extensions/dm-lens/dist/clients/host-edit-normalize.js +0 -87
  238. package/extensions/dm-lens/dist/clients/host-ports.js +0 -35
  239. package/extensions/dm-lens/dist/clients/indent-retarget.js +0 -102
  240. package/extensions/dm-lens/dist/clients/inline-blocker-dispositions.js +0 -103
  241. package/extensions/dm-lens/dist/clients/install-diagnostics.js +0 -123
  242. package/extensions/dm-lens/dist/clients/installer/index.js +0 -3770
  243. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh-session.js +0 -17
  244. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh.js +0 -522
  245. package/extensions/dm-lens/dist/clients/instance-reaper-state.js +0 -3
  246. package/extensions/dm-lens/dist/clients/instance-reaper.js +0 -577
  247. package/extensions/dm-lens/dist/clients/instance-registry-lock.js +0 -131
  248. package/extensions/dm-lens/dist/clients/instance-registry.js +0 -452
  249. package/extensions/dm-lens/dist/clients/jscpd-client.js +0 -252
  250. package/extensions/dm-lens/dist/clients/json-cache-read.js +0 -25
  251. package/extensions/dm-lens/dist/clients/knip-client.js +0 -472
  252. package/extensions/dm-lens/dist/clients/language-policy.js +0 -242
  253. package/extensions/dm-lens/dist/clients/language-profile.js +0 -261
  254. package/extensions/dm-lens/dist/clients/language-registry.js +0 -424
  255. package/extensions/dm-lens/dist/clients/latency-logger.js +0 -192
  256. package/extensions/dm-lens/dist/clients/lazy-import.js +0 -14
  257. package/extensions/dm-lens/dist/clients/ledger-bounds.js +0 -21
  258. package/extensions/dm-lens/dist/clients/lens-config.js +0 -237
  259. package/extensions/dm-lens/dist/clients/lens-engine.js +0 -181
  260. package/extensions/dm-lens/dist/clients/lens-events.js +0 -105
  261. package/extensions/dm-lens/dist/clients/lens-flag-registry.js +0 -302
  262. package/extensions/dm-lens/dist/clients/lens-map.js +0 -980
  263. package/extensions/dm-lens/dist/clients/live-bus-emitter.js +0 -53
  264. package/extensions/dm-lens/dist/clients/log-cleanup.js +0 -138
  265. package/extensions/dm-lens/dist/clients/lsp/aggregation.js +0 -88
  266. package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +0 -203
  267. package/extensions/dm-lens/dist/clients/lsp/client.js +0 -2709
  268. package/extensions/dm-lens/dist/clients/lsp/config.js +0 -252
  269. package/extensions/dm-lens/dist/clients/lsp/content-limits.js +0 -21
  270. package/extensions/dm-lens/dist/clients/lsp/diagnostic-binding.js +0 -79
  271. package/extensions/dm-lens/dist/clients/lsp/document-drift.js +0 -312
  272. package/extensions/dm-lens/dist/clients/lsp/edits.js +0 -930
  273. package/extensions/dm-lens/dist/clients/lsp/index.js +0 -4448
  274. package/extensions/dm-lens/dist/clients/lsp/inferred-project.js +0 -121
  275. package/extensions/dm-lens/dist/clients/lsp/jvm-runtime.js +0 -194
  276. package/extensions/dm-lens/dist/clients/lsp/language.js +0 -23
  277. package/extensions/dm-lens/dist/clients/lsp/launch.js +0 -468
  278. package/extensions/dm-lens/dist/clients/lsp/lombok.js +0 -146
  279. package/extensions/dm-lens/dist/clients/lsp/path-utils.js +0 -1
  280. package/extensions/dm-lens/dist/clients/lsp/pending-aux-coverage.js +0 -90
  281. package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +0 -28
  282. package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +0 -42
  283. package/extensions/dm-lens/dist/clients/lsp/server.js +0 -2422
  284. package/extensions/dm-lens/dist/clients/lsp/session-roots.js +0 -52
  285. package/extensions/dm-lens/dist/clients/lsp/spawn-history.js +0 -15
  286. package/extensions/dm-lens/dist/clients/lsp/sync-kind.js +0 -30
  287. package/extensions/dm-lens/dist/clients/lsp/tsserver-sync.js +0 -156
  288. package/extensions/dm-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  289. package/extensions/dm-lens/dist/clients/lsp/wait-policy/classification.js +0 -36
  290. package/extensions/dm-lens/dist/clients/lsp/wait-policy/index.js +0 -3
  291. package/extensions/dm-lens/dist/clients/lsp/wait-policy/strategies.js +0 -175
  292. package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +0 -40
  293. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +0 -267
  294. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-session.js +0 -7
  295. package/extensions/dm-lens/dist/clients/lsp/workspace-sweep-hold.js +0 -93
  296. package/extensions/dm-lens/dist/clients/lsp-budget.js +0 -83
  297. package/extensions/dm-lens/dist/clients/lsp-document-symbols.js +0 -93
  298. package/extensions/dm-lens/dist/clients/lsp-lazy.js +0 -8
  299. package/extensions/dm-lens/dist/clients/lsp-mutation.js +0 -273
  300. package/extensions/dm-lens/dist/clients/lsp-status.js +0 -37
  301. package/extensions/dm-lens/dist/clients/map-with-concurrency.js +0 -20
  302. package/extensions/dm-lens/dist/clients/mcp/analyze.js +0 -251
  303. package/extensions/dm-lens/dist/clients/mcp/host-shim.js +0 -14
  304. package/extensions/dm-lens/dist/clients/mcp/ipc.js +0 -302
  305. package/extensions/dm-lens/dist/clients/mcp/review.js +0 -137
  306. package/extensions/dm-lens/dist/clients/mcp/session.js +0 -305
  307. package/extensions/dm-lens/dist/clients/memory-sampler.js +0 -107
  308. package/extensions/dm-lens/dist/clients/message-end-attribution.js +0 -18
  309. package/extensions/dm-lens/dist/clients/metrics-client.js +0 -80
  310. package/extensions/dm-lens/dist/clients/metrics-history.js +0 -255
  311. package/extensions/dm-lens/dist/clients/middle-man-analysis.js +0 -161
  312. package/extensions/dm-lens/dist/clients/model-provider.js +0 -31
  313. package/extensions/dm-lens/dist/clients/module-report-lsp.js +0 -140
  314. package/extensions/dm-lens/dist/clients/module-report.js +0 -1642
  315. package/extensions/dm-lens/dist/clients/mutating-tool.js +0 -377
  316. package/extensions/dm-lens/dist/clients/mutation-attribution.js +0 -168
  317. package/extensions/dm-lens/dist/clients/mutation-bridge.js +0 -102
  318. package/extensions/dm-lens/dist/clients/ndjson-logger.js +0 -471
  319. package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +0 -43
  320. package/extensions/dm-lens/dist/clients/observed-mutation.js +0 -709
  321. package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +0 -100
  322. package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +0 -313
  323. package/extensions/dm-lens/dist/clients/opengrep-client.js +0 -216
  324. package/extensions/dm-lens/dist/clients/opengrep-config.js +0 -52
  325. package/extensions/dm-lens/dist/clients/package-manager.js +0 -303
  326. package/extensions/dm-lens/dist/clients/package-root.js +0 -25
  327. package/extensions/dm-lens/dist/clients/partial-edit-apply.js +0 -337
  328. package/extensions/dm-lens/dist/clients/path-attribution-telemetry.js +0 -31
  329. package/extensions/dm-lens/dist/clients/path-keyed-map.js +0 -57
  330. package/extensions/dm-lens/dist/clients/path-utils.js +0 -476
  331. package/extensions/dm-lens/dist/clients/performance-report.js +0 -291
  332. package/extensions/dm-lens/dist/clients/persist-debounce.js +0 -37
  333. package/extensions/dm-lens/dist/clients/persistent-reverify.js +0 -165
  334. package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +0 -15
  335. package/extensions/dm-lens/dist/clients/pipeline.js +0 -1091
  336. package/extensions/dm-lens/dist/clients/post-autofix-notice.js +0 -19
  337. package/extensions/dm-lens/dist/clients/print-mode.js +0 -3
  338. package/extensions/dm-lens/dist/clients/probe-home-state.js +0 -62
  339. package/extensions/dm-lens/dist/clients/process-bridge.js +0 -20
  340. package/extensions/dm-lens/dist/clients/process-singletons.js +0 -69
  341. package/extensions/dm-lens/dist/clients/process-snapshot.js +0 -22
  342. package/extensions/dm-lens/dist/clients/project-changes.js +0 -112
  343. package/extensions/dm-lens/dist/clients/project-conventions.js +0 -152
  344. package/extensions/dm-lens/dist/clients/project-diagnostics/cache.js +0 -91
  345. package/extensions/dm-lens/dist/clients/project-diagnostics/extractors.js +0 -53
  346. package/extensions/dm-lens/dist/clients/project-diagnostics/fresh-fetch.js +0 -408
  347. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -64
  348. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -38
  349. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -21
  350. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -23
  351. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -28
  352. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -45
  353. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -34
  354. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -32
  355. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -79
  356. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -41
  357. package/extensions/dm-lens/dist/clients/project-diagnostics/scanner.js +0 -349
  358. package/extensions/dm-lens/dist/clients/project-diagnostics/types.js +0 -1
  359. package/extensions/dm-lens/dist/clients/project-lens-config.js +0 -437
  360. package/extensions/dm-lens/dist/clients/project-report.js +0 -527
  361. package/extensions/dm-lens/dist/clients/project-scale.js +0 -60
  362. package/extensions/dm-lens/dist/clients/project-scan-policy.js +0 -4
  363. package/extensions/dm-lens/dist/clients/project-snapshot-fingerprint.js +0 -39
  364. package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +0 -14
  365. package/extensions/dm-lens/dist/clients/project-snapshot.js +0 -1178
  366. package/extensions/dm-lens/dist/clients/project-trust.js +0 -104
  367. package/extensions/dm-lens/dist/clients/python-environment.js +0 -120
  368. package/extensions/dm-lens/dist/clients/python-provenance.js +0 -551
  369. package/extensions/dm-lens/dist/clients/quiet-window-config.js +0 -16
  370. package/extensions/dm-lens/dist/clients/quiet-window.js +0 -126
  371. package/extensions/dm-lens/dist/clients/read-bridge.js +0 -46
  372. package/extensions/dm-lens/dist/clients/read-expansion.js +0 -218
  373. package/extensions/dm-lens/dist/clients/read-guard-logger.js +0 -178
  374. package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +0 -1042
  375. package/extensions/dm-lens/dist/clients/read-guard.js +0 -1096
  376. package/extensions/dm-lens/dist/clients/recent-touches.js +0 -126
  377. package/extensions/dm-lens/dist/clients/redact/secrets.js +0 -386
  378. package/extensions/dm-lens/dist/clients/resource-sampler.js +0 -344
  379. package/extensions/dm-lens/dist/clients/reverse-deps.js +0 -227
  380. package/extensions/dm-lens/dist/clients/review-graph/builder.js +0 -3635
  381. package/extensions/dm-lens/dist/clients/review-graph/format.js +0 -30
  382. package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +0 -115
  383. package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +0 -325
  384. package/extensions/dm-lens/dist/clients/review-graph/persist-worker.js +0 -8
  385. package/extensions/dm-lens/dist/clients/review-graph/query.js +0 -195
  386. package/extensions/dm-lens/dist/clients/review-graph/revision-drift.js +0 -3
  387. package/extensions/dm-lens/dist/clients/review-graph/service.js +0 -60
  388. package/extensions/dm-lens/dist/clients/review-graph/shared-extraction-ir.js +0 -54
  389. package/extensions/dm-lens/dist/clients/review-graph/symbol-id.js +0 -29
  390. package/extensions/dm-lens/dist/clients/review-graph/tsconfig-paths.js +0 -253
  391. package/extensions/dm-lens/dist/clients/review-graph/types.js +0 -1
  392. package/extensions/dm-lens/dist/clients/review-graph/workspace-modules.js +0 -374
  393. package/extensions/dm-lens/dist/clients/review-graph-logger.js +0 -51
  394. package/extensions/dm-lens/dist/clients/ruff-client.js +0 -109
  395. package/extensions/dm-lens/dist/clients/rules-scanner.js +0 -113
  396. package/extensions/dm-lens/dist/clients/run-duration.js +0 -9
  397. package/extensions/dm-lens/dist/clients/runtime-agent-end.js +0 -608
  398. package/extensions/dm-lens/dist/clients/runtime-config.js +0 -39
  399. package/extensions/dm-lens/dist/clients/runtime-context.js +0 -155
  400. package/extensions/dm-lens/dist/clients/runtime-coordinator.js +0 -817
  401. package/extensions/dm-lens/dist/clients/runtime-session.js +0 -1625
  402. package/extensions/dm-lens/dist/clients/runtime-tool-call.js +0 -868
  403. package/extensions/dm-lens/dist/clients/runtime-tool-result.js +0 -1317
  404. package/extensions/dm-lens/dist/clients/runtime-turn.js +0 -2333
  405. package/extensions/dm-lens/dist/clients/rust-client.js +0 -48
  406. package/extensions/dm-lens/dist/clients/safe-spawn.js +0 -1267
  407. package/extensions/dm-lens/dist/clients/sanitize.js +0 -174
  408. package/extensions/dm-lens/dist/clients/scan-utils.js +0 -7
  409. package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +0 -57
  410. package/extensions/dm-lens/dist/clients/search-read-registration.js +0 -59
  411. package/extensions/dm-lens/dist/clients/secret-findings.js +0 -69
  412. package/extensions/dm-lens/dist/clients/security-scan-client.js +0 -208
  413. package/extensions/dm-lens/dist/clients/session-event-guard.js +0 -111
  414. package/extensions/dm-lens/dist/clients/session-lifecycle.js +0 -173
  415. package/extensions/dm-lens/dist/clients/session-start-observability.js +0 -47
  416. package/extensions/dm-lens/dist/clients/session-state-store.js +0 -63
  417. package/extensions/dm-lens/dist/clients/session-summary.js +0 -8
  418. package/extensions/dm-lens/dist/clients/sessionstart-logger.js +0 -22
  419. package/extensions/dm-lens/dist/clients/sg-runner.js +0 -627
  420. package/extensions/dm-lens/dist/clients/sgconfig.js +0 -280
  421. package/extensions/dm-lens/dist/clients/shared-checkout-guard.js +0 -177
  422. package/extensions/dm-lens/dist/clients/single-flight.js +0 -52
  423. package/extensions/dm-lens/dist/clients/situational-tool-telemetry.js +0 -85
  424. package/extensions/dm-lens/dist/clients/skills-resolver.js +0 -38
  425. package/extensions/dm-lens/dist/clients/slow-fs.js +0 -77
  426. package/extensions/dm-lens/dist/clients/smells-rollup.js +0 -118
  427. package/extensions/dm-lens/dist/clients/source-filter.js +0 -320
  428. package/extensions/dm-lens/dist/clients/source-walker.js +0 -96
  429. package/extensions/dm-lens/dist/clients/spawn-output-cap.js +0 -35
  430. package/extensions/dm-lens/dist/clients/spawn-timeout-cooldown.js +0 -51
  431. package/extensions/dm-lens/dist/clients/stale-marker.js +0 -1
  432. package/extensions/dm-lens/dist/clients/startup-scan.js +0 -222
  433. package/extensions/dm-lens/dist/clients/startup-timing.js +0 -67
  434. package/extensions/dm-lens/dist/clients/string-utils.js +0 -6
  435. package/extensions/dm-lens/dist/clients/subagent-mode.js +0 -40
  436. package/extensions/dm-lens/dist/clients/symbol-containment.js +0 -16
  437. package/extensions/dm-lens/dist/clients/symbol-types.js +0 -1
  438. package/extensions/dm-lens/dist/clients/test-runner-client.js +0 -1504
  439. package/extensions/dm-lens/dist/clients/test-runner-delivery.js +0 -260
  440. package/extensions/dm-lens/dist/clients/todo-scanner.js +0 -164
  441. package/extensions/dm-lens/dist/clients/tool-agreement.js +0 -377
  442. package/extensions/dm-lens/dist/clients/tool-config.js +0 -218
  443. package/extensions/dm-lens/dist/clients/tool-cwd.js +0 -235
  444. package/extensions/dm-lens/dist/clients/tool-definition.js +0 -22
  445. package/extensions/dm-lens/dist/clients/tool-event.js +0 -18
  446. package/extensions/dm-lens/dist/clients/tool-policy.js +0 -2393
  447. package/extensions/dm-lens/dist/clients/tool-probe.js +0 -5
  448. package/extensions/dm-lens/dist/clients/tool-render.js +0 -79
  449. package/extensions/dm-lens/dist/clients/tool-set-policy.js +0 -70
  450. package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +0 -206
  451. package/extensions/dm-lens/dist/clients/tree-sitter-client.js +0 -2787
  452. package/extensions/dm-lens/dist/clients/tree-sitter-logger.js +0 -77
  453. package/extensions/dm-lens/dist/clients/tree-sitter-navigator.js +0 -198
  454. package/extensions/dm-lens/dist/clients/tree-sitter-query-loader.js +0 -318
  455. package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +0 -87
  456. package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +0 -957
  457. package/extensions/dm-lens/dist/clients/trivy-client.js +0 -305
  458. package/extensions/dm-lens/dist/clients/tui-fit.js +0 -26
  459. package/extensions/dm-lens/dist/clients/turn-context.js +0 -48
  460. package/extensions/dm-lens/dist/clients/turn-end/lane.js +0 -1
  461. package/extensions/dm-lens/dist/clients/turn-end/lanes/govulncheck.js +0 -54
  462. package/extensions/dm-lens/dist/clients/turn-end/lanes/secrets.js +0 -131
  463. package/extensions/dm-lens/dist/clients/turn-summary-render.js +0 -56
  464. package/extensions/dm-lens/dist/clients/turn-summary.js +0 -84
  465. package/extensions/dm-lens/dist/clients/typos-config.js +0 -9
  466. package/extensions/dm-lens/dist/clients/user-notify.js +0 -15
  467. package/extensions/dm-lens/dist/clients/vanished-instance-marker.js +0 -18
  468. package/extensions/dm-lens/dist/clients/warm-attach.js +0 -210
  469. package/extensions/dm-lens/dist/clients/widget-state.js +0 -963
  470. package/extensions/dm-lens/dist/clients/word-index-logger.js +0 -21
  471. package/extensions/dm-lens/dist/clients/word-index-store.js +0 -222
  472. package/extensions/dm-lens/dist/clients/word-index.js +0 -1426
  473. package/extensions/dm-lens/dist/clients/workspace-topology.js +0 -261
  474. package/extensions/dm-lens/dist/clients/write-ordering-guard.js +0 -24
  475. package/extensions/dm-lens/dist/clients/zizmor-config.js +0 -160
  476. package/extensions/dm-lens/dist/i18n.js +0 -67
  477. package/extensions/dm-lens/dist/index.js +0 -1782
  478. package/extensions/dm-lens/dist/mcp/analyze-cli.js +0 -178
  479. package/extensions/dm-lens/dist/mcp/build-staleness.js +0 -55
  480. package/extensions/dm-lens/dist/mcp/cli.js +0 -78
  481. package/extensions/dm-lens/dist/mcp/server.js +0 -1208
  482. package/extensions/dm-lens/dist/mcp/worker.js +0 -33
  483. package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +0 -256
  484. package/extensions/dm-lens/dist/scripts/lib/skills-predicate.mjs +0 -53
  485. package/extensions/dm-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -45
  486. package/extensions/dm-lens/dist/tools/activate-tools.js +0 -61
  487. package/extensions/dm-lens/dist/tools/ast-grep-outline.js +0 -127
  488. package/extensions/dm-lens/dist/tools/ast-grep-replace.js +0 -226
  489. package/extensions/dm-lens/dist/tools/ast-grep-search.js +0 -687
  490. package/extensions/dm-lens/dist/tools/effective-config.js +0 -59
  491. package/extensions/dm-lens/dist/tools/lens-diagnostic-mark.js +0 -240
  492. package/extensions/dm-lens/dist/tools/lens-diagnostics.js +0 -1484
  493. package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +0 -1088
  494. package/extensions/dm-lens/dist/tools/lsp-navigation.js +0 -1194
  495. package/extensions/dm-lens/dist/tools/lsp-structured-output.js +0 -277
  496. package/extensions/dm-lens/dist/tools/module-report.js +0 -332
  497. package/extensions/dm-lens/dist/tools/project-report.js +0 -72
  498. package/extensions/dm-lens/dist/tools/render-compact.js +0 -272
  499. package/extensions/dm-lens/dist/tools/scan-progress.js +0 -31
  500. package/extensions/dm-lens/dist/tools/shared.js +0 -26
  501. package/extensions/dm-lens/dist/tools/symbol-search.js +0 -133
  502. package/extensions/dm-mcp-adapter/dist/abort.js +0 -35
  503. package/extensions/dm-mcp-adapter/dist/agent-dir.js +0 -45
  504. package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +0 -392
  505. package/extensions/dm-mcp-adapter/dist/agent-plugin-provenance.js +0 -26
  506. package/extensions/dm-mcp-adapter/dist/bearer-command-resolver.js +0 -182
  507. package/extensions/dm-mcp-adapter/dist/claude-plugin-loader.js +0 -350
  508. package/extensions/dm-mcp-adapter/dist/config.js +0 -1310
  509. package/extensions/dm-mcp-adapter/dist/consent-manager.js +0 -84
  510. package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +0 -308
  511. package/extensions/dm-mcp-adapter/dist/errors.js +0 -225
  512. package/extensions/dm-mcp-adapter/dist/http-ca.js +0 -71
  513. package/extensions/dm-mcp-adapter/dist/jev-client.js +0 -359
  514. package/extensions/dm-mcp-adapter/dist/jev-contracts.js +0 -1
  515. package/extensions/dm-mcp-adapter/dist/jev-key-store.js +0 -176
  516. package/extensions/dm-mcp-adapter/dist/json-schema-validator.js +0 -70
  517. package/extensions/dm-mcp-adapter/dist/lifecycle.js +0 -387
  518. package/extensions/dm-mcp-adapter/dist/logger.js +0 -115
  519. package/extensions/dm-mcp-adapter/dist/mcp-auth-fetch.js +0 -86
  520. package/extensions/dm-mcp-adapter/dist/mcp-auth-flow.js +0 -949
  521. package/extensions/dm-mcp-adapter/dist/mcp-auth.js +0 -997
  522. package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +0 -182
  523. package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +0 -381
  524. package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +0 -524
  525. package/extensions/dm-mcp-adapter/dist/mcp-probe.js +0 -151
  526. package/extensions/dm-mcp-adapter/dist/mcp-tasks.js +0 -300
  527. package/extensions/dm-mcp-adapter/dist/mcp-trace.js +0 -215
  528. package/extensions/dm-mcp-adapter/dist/metadata-cache.js +0 -267
  529. package/extensions/dm-mcp-adapter/dist/npx-resolver.js +0 -465
  530. package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +0 -135
  531. package/extensions/dm-mcp-adapter/dist/request-headers-command.js +0 -294
  532. package/extensions/dm-mcp-adapter/dist/resource-tools.js +0 -7
  533. package/extensions/dm-mcp-adapter/dist/runtime-owner.js +0 -94
  534. package/extensions/dm-mcp-adapter/dist/sampling-handler.js +0 -213
  535. package/extensions/dm-mcp-adapter/dist/secure-keyring.js +0 -191
  536. package/extensions/dm-mcp-adapter/dist/server-manager.js +0 -1514
  537. package/extensions/dm-mcp-adapter/dist/session-approvals.js +0 -127
  538. package/extensions/dm-mcp-adapter/dist/session-recovery.js +0 -82
  539. package/extensions/dm-mcp-adapter/dist/state.js +0 -1
  540. package/extensions/dm-mcp-adapter/dist/types.js +0 -286
  541. package/extensions/dm-mcp-adapter/dist/ui-app-bridge-helpers.js +0 -36
  542. package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +0 -204
  543. package/extensions/dm-mcp-adapter/dist/ui-stream-types.js +0 -58
  544. package/extensions/dm-mcp-adapter/dist/ui-tool-visibility.js +0 -26
  545. package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +0 -83
  546. package/extensions/dm-mcp-adapter/dist/utils.js +0 -382
@@ -1,980 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import { FactStore } from "./dispatch/fact-store.js";
4
- import { getProjectDataDir } from "./file-utils.js";
5
- import { collectUntrackedIgnoredIds } from "./git-tracked-ignore.js";
6
- import { normalizeMapKey, toProjectRelativePath } from "./path-utils.js";
7
- import { canonicalSourceTwin } from "./source-filter.js";
8
- import { buildOrUpdateGraph } from "./review-graph/service.js";
9
- import { detectFileRole } from "./file-role.js";
10
- const DEFAULT_MAX_MAP_NODES = 500;
11
- export function aggregateGraphToFiles(graph, options) {
12
- const maxNodes = Math.max(1, options?.maxNodes ?? DEFAULT_MAX_MAP_NODES);
13
- const files = new Map;
14
- let externalCount = 0;
15
- const testFileIds = new Set;
16
- const nodeToFile = new Map;
17
- const isTestById = new Map;
18
- function isTestFile(id, filePath) {
19
- let isTest = isTestById.get(id);
20
- if (isTest === undefined) {
21
- isTest = detectFileRole(filePath) === "test";
22
- isTestById.set(id, isTest);
23
- }
24
- return isTest;
25
- }
26
- const allFileIds = new Set;
27
- for (const node of graph.nodes.values()) {
28
- if (node.kind === "external") {
29
- externalCount += 1;
30
- continue;
31
- }
32
- if (node.kind !== "file" && node.kind !== "symbol" || !node.filePath) {
33
- continue;
34
- }
35
- const id = normalizeMapKey(node.filePath);
36
- if (isTestFile(id, node.filePath)) {
37
- testFileIds.add(id);
38
- continue;
39
- }
40
- allFileIds.add(id);
41
- }
42
- const compiledExtensions = new Set([".js", ".jsx", ".mjs", ".cjs"]);
43
- const excludeIds = options?.excludeIds;
44
- const canonicalOf = new Map;
45
- for (const id of allFileIds) {
46
- if (!compiledExtensions.has(path.extname(id).toLowerCase()))
47
- continue;
48
- const canonical = canonicalSourceTwin(id, allFileIds, excludeIds);
49
- if (canonical !== id)
50
- canonicalOf.set(id, canonical);
51
- }
52
- const compiledTwinCount = canonicalOf.size;
53
- const droppedIgnoredIds = new Set;
54
- if (excludeIds) {
55
- for (const id of allFileIds) {
56
- if (excludeIds.has(id) && !canonicalOf.has(id)) {
57
- droppedIgnoredIds.add(id);
58
- }
59
- }
60
- }
61
- const ignoredFileCount = droppedIgnoredIds.size;
62
- const logicalSymbolByNode = new Map;
63
- const sourceSymbolsByFile = new Map;
64
- const sourceSymbolsByName = new Map;
65
- for (const node of graph.nodes.values()) {
66
- if (node.kind !== "symbol" || !node.filePath || !node.symbolName)
67
- continue;
68
- const raw = normalizeMapKey(node.filePath);
69
- const canonical = canonicalOf.get(raw) ?? raw;
70
- if (raw !== canonical)
71
- continue;
72
- const key = `${node.symbolName}\x00${node.symbolKind ?? ""}`;
73
- const byName = sourceSymbolsByFile.get(canonical) ?? new Map;
74
- const ids = byName.get(key) ?? [];
75
- ids.push(node.id);
76
- byName.set(key, ids);
77
- sourceSymbolsByFile.set(canonical, byName);
78
- const bySymbolName = sourceSymbolsByName.get(canonical) ?? new Map;
79
- const nameIds = bySymbolName.get(node.symbolName) ?? [];
80
- nameIds.push(node.id);
81
- bySymbolName.set(node.symbolName, nameIds);
82
- sourceSymbolsByName.set(canonical, bySymbolName);
83
- logicalSymbolByNode.set(node.id, node.id);
84
- }
85
- const twinOccurrencesByFile = new Map;
86
- for (const node of graph.nodes.values()) {
87
- if (node.kind !== "symbol" || !node.filePath || !node.symbolName)
88
- continue;
89
- const raw = normalizeMapKey(node.filePath);
90
- const canonical = canonicalOf.get(raw) ?? raw;
91
- if (raw === canonical)
92
- continue;
93
- const key = `${node.symbolName}\x00${node.symbolKind ?? ""}`;
94
- const exactSourceIds = sourceSymbolsByFile.get(canonical)?.get(key) ?? [];
95
- const nameSourceIds = sourceSymbolsByName.get(canonical)?.get(node.symbolName) ?? [];
96
- const sourceIds = exactSourceIds.length > 0 ? exactSourceIds : nameSourceIds.length === 1 ? nameSourceIds : [];
97
- const occurrenceKey = exactSourceIds.length > 0 ? key : node.symbolName;
98
- const occurrences = twinOccurrencesByFile.get(raw) ?? new Map;
99
- const occurrence = occurrences.get(occurrenceKey) ?? 0;
100
- occurrences.set(occurrenceKey, occurrence + 1);
101
- twinOccurrencesByFile.set(raw, occurrences);
102
- const logical = sourceIds[occurrence];
103
- if (logical) {
104
- logicalSymbolByNode.set(node.id, logical);
105
- } else {
106
- logicalSymbolByNode.set(node.id, node.id);
107
- }
108
- }
109
- const countedLogicalSymbols = new Set;
110
- for (const node of graph.nodes.values()) {
111
- if (node.kind === "external")
112
- continue;
113
- if (node.kind === "file" && node.filePath) {
114
- const raw = normalizeMapKey(node.filePath);
115
- if (isTestById.get(raw))
116
- continue;
117
- if (droppedIgnoredIds.has(raw))
118
- continue;
119
- const id = canonicalOf.get(raw) ?? raw;
120
- nodeToFile.set(node.id, id);
121
- const existing = files.get(id);
122
- if (existing) {
123
- if (raw === id) {
124
- existing.language = node.language || existing.language;
125
- } else if (!existing.language) {
126
- existing.language = node.language || "";
127
- }
128
- } else {
129
- files.set(id, {
130
- id,
131
- path: id,
132
- language: node.language || "",
133
- symbolCount: 0
134
- });
135
- }
136
- continue;
137
- }
138
- if (node.kind === "symbol" && node.filePath) {
139
- const raw = normalizeMapKey(node.filePath);
140
- if (isTestById.get(raw))
141
- continue;
142
- if (droppedIgnoredIds.has(raw))
143
- continue;
144
- const id = canonicalOf.get(raw) ?? raw;
145
- nodeToFile.set(node.id, id);
146
- const logicalId = logicalSymbolByNode.get(node.id) ?? node.id;
147
- const existing = files.get(id);
148
- if (existing) {
149
- if (!countedLogicalSymbols.has(logicalId)) {
150
- existing.symbolCount += 1;
151
- countedLogicalSymbols.add(logicalId);
152
- }
153
- } else {
154
- files.set(id, {
155
- id,
156
- path: id,
157
- language: node.language || "",
158
- symbolCount: 1
159
- });
160
- countedLogicalSymbols.add(logicalId);
161
- }
162
- continue;
163
- }
164
- }
165
- const edgeWeights = new Map;
166
- const seenLogicalEdges = new Set;
167
- for (const edge of graph.edges) {
168
- const fromFile = nodeToFile.get(edge.from);
169
- const toFile = nodeToFile.get(edge.to);
170
- if (!fromFile || !toFile || fromFile === toFile)
171
- continue;
172
- const logicalFrom = logicalSymbolByNode.get(edge.from) ?? fromFile;
173
- const logicalTo = logicalSymbolByNode.get(edge.to) ?? toFile;
174
- const logicalEdgeKey = `${logicalFrom}\x00${logicalTo}\x00${edge.kind}`;
175
- if (seenLogicalEdges.has(logicalEdgeKey))
176
- continue;
177
- seenLogicalEdges.add(logicalEdgeKey);
178
- const key = `${fromFile}\x00${toFile}`;
179
- edgeWeights.set(key, (edgeWeights.get(key) ?? 0) + 1);
180
- }
181
- function buildEdgeList(keepIds) {
182
- const out = [];
183
- for (const [key, weight] of edgeWeights) {
184
- const sep = key.indexOf("\x00");
185
- const from = key.slice(0, sep);
186
- const to = key.slice(sep + 1);
187
- if (keepIds && (!keepIds.has(from) || !keepIds.has(to)))
188
- continue;
189
- out.push({ from, to, weight });
190
- }
191
- return out;
192
- }
193
- function degreesFor(edges) {
194
- const inNeighbors = new Map;
195
- const outNeighbors = new Map;
196
- for (const edge of edges) {
197
- if (!outNeighbors.has(edge.from))
198
- outNeighbors.set(edge.from, new Set);
199
- outNeighbors.get(edge.from)?.add(edge.to);
200
- if (!inNeighbors.has(edge.to))
201
- inNeighbors.set(edge.to, new Set);
202
- inNeighbors.get(edge.to)?.add(edge.from);
203
- }
204
- return { inNeighbors, outNeighbors };
205
- }
206
- let keepIds;
207
- let truncated = false;
208
- if (files.size > maxNodes) {
209
- const fullEdges = buildEdgeList(undefined);
210
- const { inNeighbors, outNeighbors } = degreesFor(fullEdges);
211
- const ranked = [...files.keys()].sort((a, b) => {
212
- const degA = (inNeighbors.get(a)?.size ?? 0) + (outNeighbors.get(a)?.size ?? 0);
213
- const degB = (inNeighbors.get(b)?.size ?? 0) + (outNeighbors.get(b)?.size ?? 0);
214
- if (degA !== degB)
215
- return degB - degA;
216
- return a.localeCompare(b);
217
- });
218
- keepIds = new Set(ranked.slice(0, maxNodes));
219
- truncated = true;
220
- }
221
- const finalEdges = buildEdgeList(keepIds);
222
- const { inNeighbors, outNeighbors } = degreesFor(finalEdges);
223
- function transitiveDependents(seed) {
224
- const visited = new Set([seed]);
225
- let frontier = [seed];
226
- while (frontier.length > 0) {
227
- const next = [];
228
- for (const id of frontier) {
229
- for (const dependent of inNeighbors.get(id) ?? []) {
230
- if (visited.has(dependent))
231
- continue;
232
- visited.add(dependent);
233
- next.push(dependent);
234
- }
235
- }
236
- frontier = next;
237
- }
238
- visited.delete(seed);
239
- return visited.size;
240
- }
241
- const keptEntries = [...files.values()].filter((entry) => !keepIds || keepIds.has(entry.id));
242
- const nodes = keptEntries.map((entry) => ({
243
- id: entry.id,
244
- path: entry.path,
245
- language: entry.language,
246
- symbolCount: entry.symbolCount,
247
- outDegree: outNeighbors.get(entry.id)?.size ?? 0,
248
- inDegree: inNeighbors.get(entry.id)?.size ?? 0,
249
- dependents: transitiveDependents(entry.id)
250
- })).sort((a, b) => a.id.localeCompare(b.id));
251
- return {
252
- nodes,
253
- edges: finalEdges,
254
- externalCount,
255
- testFileCount: testFileIds.size,
256
- compiledTwinCount,
257
- ignoredFileCount,
258
- truncated
259
- };
260
- }
261
- const DEFAULT_LAYOUT_WIDTH = 1600;
262
- const DEFAULT_LAYOUT_HEIGHT = 1200;
263
- const DEFAULT_ITERATIONS = 200;
264
- const LAYOUT_MARGIN = 40;
265
- const GRAVITY_STRENGTH = 0.02;
266
- const ATTRACTION_SCALE = 0.02;
267
- function fnv1a(input) {
268
- let hash = 2166136261;
269
- for (let i = 0;i < input.length; i += 1) {
270
- hash ^= input.charCodeAt(i);
271
- hash = Math.imul(hash, 16777619);
272
- }
273
- return hash >>> 0;
274
- }
275
- function seededPosition(id, width, height) {
276
- const hx = fnv1a(id);
277
- const hy = fnv1a(`${id}\x00y`);
278
- return {
279
- x: hx % 1e4 / 1e4 * width,
280
- y: hy % 1e4 / 1e4 * height
281
- };
282
- }
283
- export function computeLayout(nodes, edges, options) {
284
- const width = Math.max(1, options?.width ?? DEFAULT_LAYOUT_WIDTH);
285
- const height = Math.max(1, options?.height ?? DEFAULT_LAYOUT_HEIGHT);
286
- const iterations = Math.max(1, options?.iterations ?? DEFAULT_ITERATIONS);
287
- if (nodes.length === 0)
288
- return [];
289
- const ids = nodes.map((n) => n.id);
290
- const pos = new Map;
291
- for (const id of ids) {
292
- const seed = seededPosition(id, width, height);
293
- pos.set(id, { x: seed.x, y: seed.y, dx: 0, dy: 0 });
294
- }
295
- if (ids.length === 1) {
296
- const only = pos.get(ids[0]);
297
- if (only) {
298
- only.x = width / 2;
299
- only.y = height / 2;
300
- }
301
- }
302
- const relevantEdges = edges.filter((e) => pos.has(e.from) && pos.has(e.to) && e.from !== e.to);
303
- const area = width * height;
304
- const k = Math.sqrt(area / Math.max(1, ids.length));
305
- const center = { x: width / 2, y: height / 2 };
306
- for (let iter = 0;iter < iterations; iter += 1) {
307
- for (const id of ids) {
308
- const p = pos.get(id);
309
- if (p) {
310
- p.dx = 0;
311
- p.dy = 0;
312
- }
313
- }
314
- for (let i = 0;i < ids.length; i += 1) {
315
- const a = pos.get(ids[i]);
316
- if (!a)
317
- continue;
318
- for (let j = i + 1;j < ids.length; j += 1) {
319
- const b = pos.get(ids[j]);
320
- if (!b)
321
- continue;
322
- let dx = a.x - b.x;
323
- let dy = a.y - b.y;
324
- let distSq = dx * dx + dy * dy;
325
- if (distSq < 0.0001) {
326
- dx = 0.1;
327
- dy = 0.1;
328
- distSq = 0.02;
329
- }
330
- const dist = Math.sqrt(distSq);
331
- const force = k * k / dist;
332
- const fx = dx / dist * force;
333
- const fy = dy / dist * force;
334
- a.dx += fx;
335
- a.dy += fy;
336
- b.dx -= fx;
337
- b.dy -= fy;
338
- }
339
- }
340
- for (const edge of relevantEdges) {
341
- const a = pos.get(edge.from);
342
- const b = pos.get(edge.to);
343
- if (!a || !b)
344
- continue;
345
- const dx = b.x - a.x;
346
- const dy = b.y - a.y;
347
- const dist = Math.max(0.01, Math.sqrt(dx * dx + dy * dy));
348
- const weightFactor = Math.min(4, 1 + Math.log2(edge.weight + 1));
349
- const force = dist * dist / k * weightFactor * ATTRACTION_SCALE;
350
- const fx = dx / dist * force;
351
- const fy = dy / dist * force;
352
- a.dx += fx;
353
- a.dy += fy;
354
- b.dx -= fx;
355
- b.dy -= fy;
356
- }
357
- for (const id of ids) {
358
- const p = pos.get(id);
359
- if (!p)
360
- continue;
361
- p.dx += (center.x - p.x) * GRAVITY_STRENGTH;
362
- p.dy += (center.y - p.y) * GRAVITY_STRENGTH;
363
- }
364
- const temperature = Math.max(0.5, width * 0.05 * (1 - iter / iterations));
365
- for (const id of ids) {
366
- const p = pos.get(id);
367
- if (!p)
368
- continue;
369
- const dispLen = Math.max(0.0001, Math.sqrt(p.dx * p.dx + p.dy * p.dy));
370
- const capped = Math.min(dispLen, temperature);
371
- p.x += p.dx / dispLen * capped;
372
- p.y += p.dy / dispLen * capped;
373
- p.x = Math.min(width - LAYOUT_MARGIN, Math.max(LAYOUT_MARGIN, p.x));
374
- p.y = Math.min(height - LAYOUT_MARGIN, Math.max(LAYOUT_MARGIN, p.y));
375
- }
376
- }
377
- return nodes.map((n) => {
378
- const p = pos.get(n.id);
379
- const x = p && Number.isFinite(p.x) ? p.x : width / 2;
380
- const y = p && Number.isFinite(p.y) ? p.y : height / 2;
381
- return { id: n.id, x, y };
382
- });
383
- }
384
- function escapeJsonForScriptTag(json) {
385
- return json.replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/&/g, "\\u0026");
386
- }
387
- export function renderMapHtml(payload) {
388
- const json = escapeJsonForScriptTag(JSON.stringify(payload));
389
- return `<!doctype html>
390
- <html lang="en">
391
- <head>
392
- <meta charset="utf-8" />
393
- <meta name="viewport" content="width=device-width, initial-scale=1" />
394
- <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; img-src 'none'; connect-src 'none'; base-uri 'none'; form-action 'none'; object-src 'none'" />
395
- <title>dm-lens project map</title>
396
- <style>
397
- :root {
398
- color-scheme: light;
399
- --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, "Inter", "Helvetica Neue", Arial, sans-serif;
400
- --font-mono: ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;
401
- --bg: #ffffff;
402
- --panel: #ffffff;
403
- --panel-recessed: #f4f5f7;
404
- --fg: #0f172a;
405
- --muted: #64748b;
406
- --line: #e2e8f0;
407
- --line-strong: #cbd5e1;
408
- --accent: #2563eb;
409
- --accent-soft: #dbeafe;
410
- --warn: #d97706;
411
- }
412
- @media (prefers-color-scheme: dark) {
413
- :root {
414
- color-scheme: dark;
415
- --bg: #0a0a0b; --panel: #16161a; --panel-recessed: #1f1f25;
416
- --fg: #f1f5f9; --muted: #94a3b8; --line: #26262c; --line-strong: #36363d;
417
- --accent: #60a5fa; --accent-soft: rgba(96, 165, 250, 0.16); --warn: #fbbf24;
418
- }
419
- }
420
- * { box-sizing: border-box; }
421
- body { margin: 0; min-height: 100vh; background: var(--bg); color: var(--fg); font-family: var(--font-body); }
422
- header { padding: 16px 20px; border-bottom: 1px solid var(--line); display: flex; flex-wrap: wrap; gap: 10px 18px; align-items: baseline; }
423
- header h1 { margin: 0; font-size: 1.15rem; letter-spacing: -0.01em; }
424
- .stats { display: flex; flex-wrap: wrap; gap: 14px; color: var(--muted); font-size: 0.85rem; }
425
- .stats strong { color: var(--fg); font-family: var(--font-mono); }
426
- #truncation-note { width: 100%; margin-top: 4px; color: var(--warn); font-size: 0.82rem; }
427
- #truncation-note[hidden] { display: none; }
428
- #stage { position: relative; height: calc(100vh - 76px); overflow: hidden; }
429
- #graph-svg { width: 100%; height: 100%; display: block; cursor: grab; background: var(--panel-recessed); }
430
- #graph-svg:active { cursor: grabbing; }
431
- .node-circle { stroke: var(--panel); stroke-width: 1.5px; cursor: pointer; transition: opacity 120ms ease; }
432
- .node text { font-family: var(--font-mono); font-size: 9px; fill: var(--muted); pointer-events: none; }
433
- .edge { stroke: var(--line-strong); stroke-opacity: 0.55; transition: opacity 120ms ease, stroke 120ms ease; }
434
- .edge.active { stroke: var(--accent); stroke-opacity: 0.9; }
435
- .dimmed { opacity: 0.12; }
436
- .faded { opacity: 0.15; }
437
- .edge.edge-hidden { display: none; }
438
- .node.no-label text { display: none; }
439
- .node.search-hit .node-circle { stroke: var(--accent); stroke-width: 2.5px; }
440
- .node.selected .node-circle { stroke: var(--warn); stroke-width: 2.5px; }
441
- .node.trace-hit .node-circle { stroke: var(--accent); stroke-width: 3px; }
442
- #controls { position: absolute; top: 12px; left: 12px; z-index: 5; display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; max-width: min(560px, calc(100% - 24px)); padding: 8px 12px; border: 1px solid var(--line); border-radius: 10px; background: var(--panel); box-shadow: 0 6px 18px rgba(0,0,0,0.12); font-size: 0.8rem; color: var(--muted); }
443
- #search-input { width: 170px; padding: 4px 8px; border: 1px solid var(--line); border-radius: 6px; background: var(--panel-recessed); color: var(--fg); font-family: var(--font-mono); font-size: 0.8rem; }
444
- #weight-label { display: flex; align-items: center; gap: 6px; white-space: nowrap; }
445
- #weight-slider { width: 100px; }
446
- #trace-toggle { border: 1px solid var(--line); border-radius: 6px; background: var(--panel-recessed); color: var(--fg); padding: 4px 10px; cursor: pointer; font-size: 0.78rem; }
447
- #trace-toggle[aria-pressed="true"] { background: var(--accent-soft); border-color: var(--accent); }
448
- #help-note { flex-basis: 100%; font-size: 0.72rem; line-height: 1.4; }
449
- #trace-status { margin: 0 0 8px; color: var(--warn); }
450
- #trace-status[hidden] { display: none; }
451
- #detail-panel { position: fixed; right: 16px; bottom: 16px; width: 300px; max-width: calc(100% - 32px); border: 1px solid var(--line); border-radius: 12px; background: var(--panel); box-shadow: 0 12px 34px rgba(0,0,0,0.18); padding: 14px 16px; font-size: 0.85rem; }
452
- #detail-panel[hidden] { display: none; }
453
- #detail-panel h2 { margin: 0 0 8px; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); }
454
- #detail-path { display: block; word-break: break-word; font-family: var(--font-mono); color: var(--fg); margin-bottom: 10px; }
455
- #detail-panel dl { margin: 0; display: grid; grid-template-columns: auto 1fr; gap: 4px 10px; }
456
- #detail-panel dt { color: var(--muted); }
457
- #detail-panel dd { margin: 0; font-family: var(--font-mono); text-align: right; }
458
- #detail-close { position: absolute; top: 8px; right: 10px; border: 0; background: none; color: var(--muted); cursor: pointer; font-size: 0.95rem; }
459
- #detail-close:hover { color: var(--fg); }
460
- #empty-note { padding: 40px 20px; color: var(--muted); }
461
- noscript { display: block; padding: 20px; color: var(--muted); }
462
- </style>
463
- </head>
464
- <body>
465
- <noscript>This project map needs JavaScript to render the interactive graph.</noscript>
466
- <header>
467
- <h1>dm-lens project map</h1>
468
- <div class="stats">
469
- <span><strong id="stat-files">-</strong> files</span>
470
- <span><strong id="stat-edges">-</strong> edges</span>
471
- <span><strong id="stat-external">-</strong> external deps (excluded)</span>
472
- <span id="stat-testfiles-wrap" hidden><strong id="stat-testfiles">-</strong> test files (excluded)</span>
473
- <span id="stat-twins-wrap" hidden><strong id="stat-twins">-</strong> compiled twins (merged into sources)</span>
474
- <span id="stat-ignored-wrap" hidden><strong id="stat-ignored">-</strong> gitignored files (excluded)</span>
475
- <span>generated <strong id="stat-generated">-</strong></span>
476
- <span id="stat-project"></span>
477
- </div>
478
- <p id="truncation-note" hidden></p>
479
- </header>
480
- <div id="stage">
481
- <div id="controls">
482
- <input id="search-input" type="search" placeholder="search files" autocomplete="off" spellcheck="false" aria-label="Search files" />
483
- <label id="weight-label">min edge weight
484
- <input id="weight-slider" type="range" min="1" max="1" step="1" value="1" />
485
- <span id="weight-value">1</span> (<span id="visible-edges">0</span> edges)
486
- </label>
487
- <button id="trace-toggle" type="button" aria-pressed="false">trace path</button>
488
- <span id="help-note">hover: neighbors &middot; click: select + details &middot; shift+click a 2nd node (or arm &quot;trace path&quot;, then click another node): trace their connection &middot; Esc or background click: clear</span>
489
- </div>
490
- <svg id="graph-svg" xmlns="http://www.w3.org/2000/svg"></svg>
491
- <div id="detail-panel" hidden>
492
- <button id="detail-close" type="button" aria-label="Close">&times;</button>
493
- <h2>File</h2>
494
- <p id="trace-status" hidden></p>
495
- <span id="detail-path"></span>
496
- <dl>
497
- <dt>Symbols</dt><dd id="detail-symbols"></dd>
498
- <dt>In-degree</dt><dd id="detail-in"></dd>
499
- <dt>Out-degree</dt><dd id="detail-out"></dd>
500
- <dt>Dependents</dt><dd id="detail-dependents"></dd>
501
- </dl>
502
- </div>
503
- </div>
504
- <script type="application/json" id="lens-map-payload">${json}</script>
505
- <script>
506
- (function () {
507
- "use strict";
508
- var payloadEl = document.getElementById("lens-map-payload");
509
- var payload = JSON.parse(payloadEl.textContent || "{}");
510
- var nodes = payload.nodes || [];
511
- var edges = payload.edges || [];
512
-
513
- function setText(id, value) {
514
- var el = document.getElementById(id);
515
- if (el) el.textContent = value;
516
- }
517
-
518
- setText("stat-files", String(payload.fileCount || 0));
519
- setText("stat-edges", String(payload.edgeCount || 0));
520
- setText("stat-external", String(payload.externalCount || 0));
521
- // The review graph itself excludes test files by role since #260, so this
522
- // count is normally 0 — only show the stat when the exclusion actually did
523
- // something (belt-and-braces against a future graph-scope change).
524
- if (payload.testFileCount > 0) {
525
- setText("stat-testfiles", String(payload.testFileCount));
526
- var tfWrap = document.getElementById("stat-testfiles-wrap");
527
- if (tfWrap) tfWrap.hidden = false;
528
- }
529
- // Compiled twins (X.js merged into its X.ts source) only occur in
530
- // compile-in-place projects — hide the stat when nothing was merged.
531
- if (payload.compiledTwinCount > 0) {
532
- setText("stat-twins", String(payload.compiledTwinCount));
533
- var twWrap = document.getElementById("stat-twins-wrap");
534
- if (twWrap) twWrap.hidden = false;
535
- }
536
- // Untracked-gitignored files dropped from the map (0 when the project is
537
- // not a git repo — the filter degrades to a no-op there): hide when zero.
538
- if (payload.ignoredFileCount > 0) {
539
- setText("stat-ignored", String(payload.ignoredFileCount));
540
- var igWrap = document.getElementById("stat-ignored-wrap");
541
- if (igWrap) igWrap.hidden = false;
542
- }
543
- setText("stat-generated", payload.generatedAt || "");
544
- setText("stat-project", payload.projectLabel || "");
545
-
546
- var truncationNote = document.getElementById("truncation-note");
547
- if (payload.truncated) {
548
- truncationNote.textContent =
549
- "Showing the " + payload.fileCount + " highest-degree files " +
550
- "(project exceeds the " + payload.maxNodes + "-file map cap).";
551
- truncationNote.hidden = false;
552
- }
553
-
554
- var svg = document.getElementById("graph-svg");
555
- if (nodes.length === 0) {
556
- var stage = document.getElementById("stage");
557
- var empty = document.createElement("div");
558
- empty.id = "empty-note";
559
- empty.textContent = "No files to map yet.";
560
- stage.replaceChild(empty, svg);
561
- return;
562
- }
563
-
564
- var svgNS = "http://www.w3.org/2000/svg";
565
- var width = payload.width || 1600;
566
- var height = payload.height || 1200;
567
- svg.setAttribute("viewBox", "0 0 " + width + " " + height);
568
-
569
- var world = document.createElementNS(svgNS, "g");
570
- world.setAttribute("id", "world");
571
- svg.appendChild(world);
572
- var edgeGroup = document.createElementNS(svgNS, "g");
573
- world.appendChild(edgeGroup);
574
- var nodeGroup = document.createElementNS(svgNS, "g");
575
- world.appendChild(nodeGroup);
576
-
577
- var nodeById = {};
578
- nodes.forEach(function (n) { nodeById[n.id] = n; });
579
-
580
- var neighbors = {};
581
- nodes.forEach(function (n) { neighbors[n.id] = {}; });
582
- edges.forEach(function (e) {
583
- if (neighbors[e.from]) neighbors[e.from][e.to] = true;
584
- if (neighbors[e.to]) neighbors[e.to][e.from] = true;
585
- });
586
-
587
- // Edge records keep from/to/weight alongside the element so the single
588
- // visibility pass below can filter without re-reading DOM attributes.
589
- var edgeEls = [];
590
- edges.forEach(function (e) {
591
- var a = nodeById[e.from];
592
- var b = nodeById[e.to];
593
- if (!a || !b) return;
594
- var line = document.createElementNS(svgNS, "line");
595
- line.setAttribute("x1", String(a.x));
596
- line.setAttribute("y1", String(a.y));
597
- line.setAttribute("x2", String(b.x));
598
- line.setAttribute("y2", String(b.y));
599
- line.setAttribute("class", "edge");
600
- line.setAttribute("stroke-width", String(Math.min(4, 0.6 + Math.log2(e.weight + 1))));
601
- edgeGroup.appendChild(line);
602
- edgeEls.push({ el: line, from: e.from, to: e.to, weight: e.weight || 1 });
603
- });
604
-
605
- // Node fill: neutral brand-blue intensity scale by transitive dependents
606
- // ONLY (light #2563eb family / dark #60a5fa family) — NOT complexity-based.
607
- // Calibrated complexity-aware coloring is deferred to #306; wiring a second
608
- // color dimension here would guess at a scale nobody has validated yet.
609
- var isDark = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches;
610
- var loStop = isDark ? [30, 41, 59] : [219, 234, 254];
611
- var hiStop = isDark ? [96, 165, 250] : [37, 99, 235];
612
- function blueForRatio(ratio) {
613
- var t = Math.max(0, Math.min(1, ratio));
614
- var r = Math.round(loStop[0] + (hiStop[0] - loStop[0]) * t);
615
- var g = Math.round(loStop[1] + (hiStop[1] - loStop[1]) * t);
616
- var b = Math.round(loStop[2] + (hiStop[2] - loStop[2]) * t);
617
- return "rgb(" + r + "," + g + "," + b + ")";
618
- }
619
-
620
- var maxDependents = nodes.reduce(function (m, n) { return Math.max(m, n.dependents || 0); }, 0) || 1;
621
- var minRadius = 5, maxRadius = 22;
622
-
623
- // Label culling: a label renders only when (zoomed in past LABEL_ZOOM) OR
624
- // (the node is in the top-25 by transitive dependents — the structurally
625
- // load-bearing files a viewer wants named at any zoom). Safe on tiny
626
- // graphs: slice(0, 25) of a 3-node list is just those 3.
627
- var LABEL_ZOOM = 1.5;
628
- var labelAlways = {};
629
- nodes.slice()
630
- .sort(function (a, b) { return (b.dependents || 0) - (a.dependents || 0); })
631
- .slice(0, 25)
632
- .forEach(function (n) { labelAlways[n.id] = true; });
633
-
634
- var nodeEls = {};
635
- nodes.forEach(function (n) {
636
- var g = document.createElementNS(svgNS, "g");
637
- g.setAttribute("class", "node");
638
- g.setAttribute("transform", "translate(" + n.x + "," + n.y + ")");
639
- g.dataset.id = n.id;
640
-
641
- var ratio = (n.dependents || 0) / maxDependents;
642
- var radius = minRadius + (maxRadius - minRadius) * Math.sqrt(ratio);
643
-
644
- var circle = document.createElementNS(svgNS, "circle");
645
- circle.setAttribute("r", String(radius));
646
- circle.setAttribute("fill", blueForRatio(ratio));
647
- circle.setAttribute("class", "node-circle");
648
- g.appendChild(circle);
649
-
650
- var title = document.createElementNS(svgNS, "title");
651
- title.textContent = n.path + " — " + n.symbolCount + " symbols, " + n.dependents + " dependents";
652
- g.appendChild(title);
653
-
654
- // Repo-derived string → textContent only, never markup (the #504-spike
655
- // discipline): the label is the path's last segment.
656
- var label = document.createElementNS(svgNS, "text");
657
- label.setAttribute("y", String(radius + 10));
658
- label.setAttribute("text-anchor", "middle");
659
- label.textContent = (n.path || "").split("/").pop() || n.path;
660
- g.appendChild(label);
661
-
662
- g.addEventListener("mouseenter", function () { hoverId = n.id; recomputeVisibility(); });
663
- g.addEventListener("mouseleave", function () { hoverId = null; recomputeVisibility(); });
664
- g.addEventListener("click", function (ev) { ev.stopPropagation(); onNodeClick(n, ev); });
665
-
666
- nodeGroup.appendChild(g);
667
- nodeEls[n.id] = g;
668
- });
669
-
670
- // ── Interaction state — composed by ONE visibility pass ───────────────────
671
- var hoverId = null;
672
- var searchTerm = "";
673
- var weightThreshold = 1;
674
- var selectedId = null;
675
- var traceArmed = false;
676
- var trace = null; // { found, nodeSet, edgeKeys } while a trace is displayed
677
-
678
- // Undirected edge identity (order-independent): NUL can never appear in a
679
- // file path, same idiom as the aggregation layer.
680
- function edgeKey(a, b) { return a < b ? a + "\\u0000" + b : b + "\\u0000" + a; }
681
-
682
- // The four interactions (search, weight filter, trace, label culling) all
683
- // funnel through this single pass instead of four fighting inline style
684
- // writers. Precedence for node/edge OPACITY: trace active > search filter
685
- // > weight-isolation fade (hover only narrows within what the winning
686
- // filter allows). The weight filter is a DISPLAY axis — edges below the
687
- // threshold hide entirely — with one exception: a traced-path edge always
688
- // shows, or the trace visual would have holes. Label culling only ever
689
- // affects labels, never circles or edges.
690
- function recomputeVisibility() {
691
- var searching = searchTerm.length > 0;
692
- var matches = {};
693
- if (searching) {
694
- nodes.forEach(function (n) {
695
- if ((n.path || "").toLowerCase().indexOf(searchTerm) !== -1) matches[n.id] = true;
696
- });
697
- }
698
-
699
- var tracing = trace !== null && trace.found;
700
- var visibleEdgeCount = 0;
701
- var touchedByVisibleEdge = {};
702
- edgeEls.forEach(function (e) {
703
- var passesWeight = e.weight >= weightThreshold;
704
- if (passesWeight) {
705
- visibleEdgeCount += 1;
706
- touchedByVisibleEdge[e.from] = true;
707
- touchedByVisibleEdge[e.to] = true;
708
- }
709
- var onTracePath = tracing && trace.edgeKeys[edgeKey(e.from, e.to)];
710
- var dimmed, active;
711
- if (trace !== null) {
712
- active = !!onTracePath;
713
- dimmed = !onTracePath;
714
- } else {
715
- active = hoverId !== null && (e.from === hoverId || e.to === hoverId);
716
- if (searching) {
717
- dimmed = !(matches[e.from] && matches[e.to]);
718
- if (!dimmed && hoverId !== null) dimmed = !active;
719
- } else {
720
- dimmed = hoverId !== null ? !active : false;
721
- }
722
- }
723
- e.el.classList.toggle("edge-hidden", !passesWeight && !onTracePath);
724
- e.el.classList.toggle("active", !!active);
725
- e.el.classList.toggle("dimmed", dimmed);
726
- });
727
- setText("weight-value", String(weightThreshold));
728
- setText("visible-edges", String(visibleEdgeCount));
729
-
730
- nodes.forEach(function (n) {
731
- var el = nodeEls[n.id];
732
- if (!el) return;
733
- var dimmed;
734
- var faded = false;
735
- if (trace !== null) {
736
- dimmed = !(tracing && trace.nodeSet[n.id]);
737
- } else if (searching) {
738
- dimmed = !matches[n.id];
739
- if (!dimmed && hoverId !== null) {
740
- dimmed = !(n.id === hoverId || (neighbors[hoverId] || {})[n.id]);
741
- }
742
- } else {
743
- dimmed = hoverId !== null
744
- ? !(n.id === hoverId || (neighbors[hoverId] || {})[n.id])
745
- : false;
746
- // Weight-isolation fade — lowest precedence, and a fade rather than
747
- // a removal: layout position stability matters more than reclaiming
748
- // the pixels.
749
- if (!dimmed && weightThreshold > 1 && !touchedByVisibleEdge[n.id]) faded = true;
750
- }
751
- el.classList.toggle("dimmed", dimmed);
752
- el.classList.toggle("faded", faded);
753
- el.classList.toggle("search-hit", searching && trace === null && !!matches[n.id]);
754
- el.classList.toggle("selected", n.id === selectedId);
755
- el.classList.toggle("trace-hit", tracing && !!trace.nodeSet[n.id]);
756
- var labelOn = !dimmed && !faded && (view.scale > LABEL_ZOOM || !!labelAlways[n.id]);
757
- el.classList.toggle("no-label", !labelOn);
758
- });
759
- }
760
-
761
- // Path tracing: BFS treating edges as UNDIRECTED — for "how are these two
762
- // files related", connectivity matters more than dependency direction
763
- // (whether A imports B or B imports A, a human tracing the map wants the
764
- // chain shown either way).
765
- function runTrace(fromId, toId) {
766
- var parent = {};
767
- parent[fromId] = fromId;
768
- var queue = [fromId];
769
- var found = false;
770
- while (queue.length > 0 && !found) {
771
- var next = [];
772
- for (var i = 0; i < queue.length && !found; i += 1) {
773
- var adj = neighbors[queue[i]] || {};
774
- for (var nid in adj) {
775
- if (parent[nid] !== undefined) continue;
776
- parent[nid] = queue[i];
777
- if (nid === toId) { found = true; break; }
778
- next.push(nid);
779
- }
780
- }
781
- queue = next;
782
- }
783
- var nodeSet = {};
784
- var edgeKeys = {};
785
- var hops = 0;
786
- if (found) {
787
- var cur = toId;
788
- nodeSet[cur] = true;
789
- while (cur !== fromId) {
790
- var p = parent[cur];
791
- edgeKeys[edgeKey(p, cur)] = true;
792
- nodeSet[p] = true;
793
- cur = p;
794
- hops += 1;
795
- }
796
- }
797
- trace = { found: found, nodeSet: nodeSet, edgeKeys: edgeKeys };
798
- var status = document.getElementById("trace-status");
799
- if (status) {
800
- status.textContent = found
801
- ? "Path: " + (hops + 1) + " files, " + hops + " hops."
802
- : "No path between the selected files.";
803
- status.hidden = false;
804
- }
805
- detailPanel.hidden = false;
806
- }
807
-
808
- function hideTraceStatus() {
809
- var status = document.getElementById("trace-status");
810
- if (status) status.hidden = true;
811
- }
812
-
813
- function onNodeClick(n, ev) {
814
- var wantsTrace = (ev.shiftKey || traceArmed) && selectedId !== null && selectedId !== n.id;
815
- if (wantsTrace) {
816
- runTrace(selectedId, n.id);
817
- } else {
818
- trace = null;
819
- hideTraceStatus();
820
- selectedId = n.id;
821
- showDetail(n);
822
- }
823
- recomputeVisibility();
824
- }
825
-
826
- function clearTraceAndSelection() {
827
- trace = null;
828
- selectedId = null;
829
- hideTraceStatus();
830
- detailPanel.hidden = true;
831
- recomputeVisibility();
832
- }
833
-
834
- var detailPanel = document.getElementById("detail-panel");
835
- function showDetail(n) {
836
- setText("detail-path", n.path);
837
- setText("detail-symbols", String(n.symbolCount));
838
- setText("detail-in", String(n.inDegree));
839
- setText("detail-out", String(n.outDegree));
840
- setText("detail-dependents", String(n.dependents));
841
- detailPanel.hidden = false;
842
- }
843
- document.getElementById("detail-close").addEventListener("click", function () {
844
- detailPanel.hidden = true;
845
- });
846
- svg.addEventListener("click", clearTraceAndSelection);
847
- document.addEventListener("keydown", function (ev) {
848
- if (ev.key === "Escape") clearTraceAndSelection();
849
- });
850
-
851
- // ── Controls wiring ───────────────────────────────────────────────────────
852
- var searchInput = document.getElementById("search-input");
853
- if (searchInput) {
854
- // No debounce: recomputeVisibility is a single O(nodes+edges) pass and
855
- // the map caps at DM_LENS_MAP_MAX_NODES (500 default) — cheap per input.
856
- searchInput.addEventListener("input", function () {
857
- searchTerm = searchInput.value.trim().toLowerCase();
858
- recomputeVisibility();
859
- });
860
- }
861
- var maxWeight = edges.reduce(function (m, e) { return Math.max(m, e.weight || 1); }, 1);
862
- var slider = document.getElementById("weight-slider");
863
- if (slider) {
864
- slider.max = String(maxWeight);
865
- slider.addEventListener("input", function () {
866
- weightThreshold = Number(slider.value) || 1;
867
- recomputeVisibility();
868
- });
869
- }
870
- var traceToggle = document.getElementById("trace-toggle");
871
- if (traceToggle) {
872
- traceToggle.addEventListener("click", function () {
873
- traceArmed = !traceArmed;
874
- traceToggle.setAttribute("aria-pressed", traceArmed ? "true" : "false");
875
- });
876
- }
877
-
878
- // Pan (drag background) + zoom (wheel).
879
- var view = { x: 0, y: 0, scale: 1 };
880
- var dragging = false, lastX = 0, lastY = 0;
881
- function applyTransform() {
882
- world.setAttribute("transform", "translate(" + view.x + "," + view.y + ") scale(" + view.scale + ")");
883
- }
884
- svg.addEventListener("pointerdown", function (ev) {
885
- dragging = true;
886
- lastX = ev.clientX;
887
- lastY = ev.clientY;
888
- svg.setPointerCapture(ev.pointerId);
889
- });
890
- svg.addEventListener("pointermove", function (ev) {
891
- if (!dragging) return;
892
- view.x += ev.clientX - lastX;
893
- view.y += ev.clientY - lastY;
894
- lastX = ev.clientX;
895
- lastY = ev.clientY;
896
- applyTransform();
897
- });
898
- svg.addEventListener("pointerup", function () { dragging = false; });
899
- svg.addEventListener("pointercancel", function () { dragging = false; });
900
- svg.addEventListener("wheel", function (ev) {
901
- ev.preventDefault();
902
- var delta = ev.deltaY > 0 ? 0.9 : 1.1;
903
- view.scale = Math.max(0.15, Math.min(6, view.scale * delta));
904
- applyTransform();
905
- // Zoom crossing LABEL_ZOOM changes which labels render.
906
- recomputeVisibility();
907
- }, { passive: false });
908
- applyTransform();
909
- recomputeVisibility();
910
- })();
911
- </script>
912
- </body>
913
- </html>
914
- `;
915
- }
916
- function resolveMaxNodes() {
917
- const raw = process.env.DM_LENS_MAP_MAX_NODES?.trim();
918
- if (!raw)
919
- return DEFAULT_MAX_MAP_NODES;
920
- const parsed = Number(raw);
921
- return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : DEFAULT_MAX_MAP_NODES;
922
- }
923
- export { parseUntrackedIgnoredOutput } from "./git-tracked-ignore.js";
924
- function toDisplayPath(p, projectRoot) {
925
- return toProjectRelativePath(p, projectRoot);
926
- }
927
- export async function generateLensMap(cwd) {
928
- const facts = new FactStore("lens-map");
929
- const excludeIdsPromise = collectUntrackedIgnoredIds(cwd);
930
- const graph = await buildOrUpdateGraph(cwd, [], facts);
931
- const excludeIds = await excludeIdsPromise;
932
- const maxNodes = resolveMaxNodes();
933
- const aggregated = aggregateGraphToFiles(graph, { maxNodes, excludeIds });
934
- const displayNodes = aggregated.nodes.map((node) => ({
935
- ...node,
936
- path: toDisplayPath(node.path, cwd)
937
- }));
938
- const width = DEFAULT_LAYOUT_WIDTH;
939
- const height = DEFAULT_LAYOUT_HEIGHT;
940
- const layout = computeLayout(displayNodes, aggregated.edges, {
941
- width,
942
- height
943
- });
944
- const positionById = new Map(layout.map((p) => [p.id, p]));
945
- const payloadNodes = displayNodes.map((node) => {
946
- const point = positionById.get(node.id);
947
- return { ...node, x: point?.x ?? width / 2, y: point?.y ?? height / 2 };
948
- });
949
- const payload = {
950
- generatedAt: new Date().toISOString(),
951
- projectLabel: path.basename(path.resolve(cwd)),
952
- fileCount: aggregated.nodes.length,
953
- edgeCount: aggregated.edges.length,
954
- externalCount: aggregated.externalCount,
955
- testFileCount: aggregated.testFileCount,
956
- compiledTwinCount: aggregated.compiledTwinCount,
957
- ignoredFileCount: aggregated.ignoredFileCount,
958
- truncated: aggregated.truncated,
959
- maxNodes,
960
- width,
961
- height,
962
- nodes: payloadNodes,
963
- edges: aggregated.edges
964
- };
965
- const html = renderMapHtml(payload);
966
- const outDir = path.join(getProjectDataDir(cwd), "reports");
967
- fs.mkdirSync(outDir, { recursive: true });
968
- const filePath = path.join(outDir, "lens-map.html");
969
- fs.writeFileSync(filePath, html, "utf-8");
970
- return {
971
- filePath,
972
- fileCount: aggregated.nodes.length,
973
- edgeCount: aggregated.edges.length,
974
- truncated: aggregated.truncated,
975
- externalCount: aggregated.externalCount,
976
- testFileCount: aggregated.testFileCount,
977
- compiledTwinCount: aggregated.compiledTwinCount,
978
- ignoredFileCount: aggregated.ignoredFileCount
979
- };
980
- }