@duckmind/dm-linux-x64 0.65.5 → 0.65.7

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 (1208) hide show
  1. package/README.md +0 -8
  2. package/dm +2 -2
  3. package/extensions/.dm-extensions.json +677 -44
  4. package/extensions/dm-lens/clients/actionable-warnings-logger.js +0 -6
  5. package/extensions/dm-lens/clients/actionable-warnings.js +42 -13
  6. package/extensions/dm-lens/clients/advisory-provenance.js +129 -41
  7. package/extensions/dm-lens/clients/agent-behavior-client.js +1 -0
  8. package/extensions/dm-lens/clients/analysed-root.js +0 -0
  9. package/extensions/dm-lens/clients/ast-grep-client.js +38 -3
  10. package/extensions/dm-lens/clients/ast-grep-rule-manager.js +37 -5
  11. package/extensions/dm-lens/clients/ast-grep-tool-logger.js +1 -7
  12. package/extensions/dm-lens/clients/bash-file-access.js +138 -1
  13. package/extensions/dm-lens/clients/biome-client.js +9 -2
  14. package/extensions/dm-lens/clients/blocker-freshness.js +171 -21
  15. package/extensions/dm-lens/clients/bootstrap.js +9 -5
  16. package/extensions/dm-lens/clients/bounded-pid-file-lock.js +1 -1
  17. package/extensions/dm-lens/clients/bounded-telemetry.js +1 -4
  18. package/extensions/dm-lens/clients/bundled-resource-health.js +43 -0
  19. package/extensions/dm-lens/clients/bus-events-logger.js +0 -6
  20. package/extensions/dm-lens/clients/cache/rule-cache.js +11 -3
  21. package/extensions/dm-lens/clients/cache-manager.js +29 -5
  22. package/extensions/dm-lens/clients/cache-observability.js +104 -4
  23. package/extensions/dm-lens/clients/cargo-manifest.js +6 -3
  24. package/extensions/dm-lens/clients/cascade-format.js +87 -5
  25. package/extensions/dm-lens/clients/cascade-logger.js +0 -6
  26. package/extensions/dm-lens/clients/child-unref.js +5 -9
  27. package/extensions/dm-lens/clients/code-quality-warnings.js +4 -2
  28. package/extensions/dm-lens/clients/complexity-client.js +5 -1
  29. package/extensions/dm-lens/clients/config-core/index.js +2 -68
  30. package/extensions/dm-lens/clients/config-core/process-spec.js +1 -1
  31. package/extensions/dm-lens/clients/config-core/provenance.js +1 -2
  32. package/extensions/dm-lens/clients/config-core/records.js +1 -1
  33. package/extensions/dm-lens/clients/config-core/schema.js +3 -6
  34. package/extensions/dm-lens/clients/config-diagnostic-codes.js +5 -3
  35. package/extensions/dm-lens/clients/config-locations.js +125 -5
  36. package/extensions/dm-lens/clients/config-resolve.js +12 -6
  37. package/extensions/dm-lens/clients/config-schema.js +56 -3
  38. package/extensions/dm-lens/clients/config-warn.js +3 -2
  39. package/extensions/dm-lens/clients/dead-code-client.js +4 -1
  40. package/extensions/dm-lens/clients/dead-code-logger.js +0 -3
  41. package/extensions/dm-lens/clients/degradation-ledger.js +29 -4
  42. package/extensions/dm-lens/clients/dependency-checker.js +29 -50
  43. package/extensions/dm-lens/clients/diagnostic-dispositions.js +23 -4
  44. package/extensions/dm-lens/clients/diagnostic-logger.js +1 -1
  45. package/extensions/dm-lens/clients/dispatch/ast-grep-catalog.js +19 -0
  46. package/extensions/dm-lens/clients/dispatch/auxiliary-lsp.js +9 -0
  47. package/extensions/dm-lens/clients/dispatch/collect-later-tier.js +0 -3
  48. package/extensions/dm-lens/clients/dispatch/dispatcher.js +30 -27
  49. package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +1 -1
  50. package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +4 -1
  51. package/extensions/dm-lens/clients/dispatch/finding-policy.js +163 -0
  52. package/extensions/dm-lens/clients/dispatch/indent-detect.js +213 -13
  53. package/extensions/dm-lens/clients/dispatch/inline-suppressions.js +20 -1
  54. package/extensions/dm-lens/clients/dispatch/integration.js +77 -13
  55. package/extensions/dm-lens/clients/dispatch/lazy.js +0 -3
  56. package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +1 -1
  57. package/extensions/dm-lens/clients/dispatch/plan.js +0 -3
  58. package/extensions/dm-lens/clients/dispatch/rule-ignores.js +21 -0
  59. package/extensions/dm-lens/clients/dispatch/rules/high-complexity.js +2 -2
  60. package/extensions/dm-lens/clients/dispatch/rules/high-fan-out.js +1 -1
  61. package/extensions/dm-lens/clients/dispatch/runners/actionlint.js +25 -29
  62. package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +8 -32
  63. package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +39 -23
  64. package/extensions/dm-lens/clients/dispatch/runners/cpp-check.js +29 -48
  65. package/extensions/dm-lens/clients/dispatch/runners/credo.js +17 -14
  66. package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +9 -7
  67. package/extensions/dm-lens/clients/dispatch/runners/dart-analyze.js +21 -43
  68. package/extensions/dm-lens/clients/dispatch/runners/detekt.js +11 -5
  69. package/extensions/dm-lens/clients/dispatch/runners/dotnet-build.js +27 -23
  70. package/extensions/dm-lens/clients/dispatch/runners/elixir-check.js +23 -38
  71. package/extensions/dm-lens/clients/dispatch/runners/eslint.js +22 -35
  72. package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +2 -1
  73. package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +35 -12
  74. package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +5 -3
  75. package/extensions/dm-lens/clients/dispatch/runners/golangci-lint.js +21 -22
  76. package/extensions/dm-lens/clients/dispatch/runners/hadolint.js +26 -16
  77. package/extensions/dm-lens/clients/dispatch/runners/helm-lint.js +3 -1
  78. package/extensions/dm-lens/clients/dispatch/runners/helm-render.js +3 -2
  79. package/extensions/dm-lens/clients/dispatch/runners/htmlhint.js +18 -9
  80. package/extensions/dm-lens/clients/dispatch/runners/javac.js +24 -23
  81. package/extensions/dm-lens/clients/dispatch/runners/ktlint.js +23 -54
  82. package/extensions/dm-lens/clients/dispatch/runners/lsp.js +17 -7
  83. package/extensions/dm-lens/clients/dispatch/runners/markdownlint.js +12 -6
  84. package/extensions/dm-lens/clients/dispatch/runners/mypy.js +2 -1
  85. package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +24 -7
  86. package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +26 -17
  87. package/extensions/dm-lens/clients/dispatch/runners/phpstan.js +2 -1
  88. package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +2 -1
  89. package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +10 -11
  90. package/extensions/dm-lens/clients/dispatch/runners/pyright.js +2 -1
  91. package/extensions/dm-lens/clients/dispatch/runners/rubocop.js +22 -18
  92. package/extensions/dm-lens/clients/dispatch/runners/ruff.js +17 -22
  93. package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +8 -11
  94. package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +9 -4
  95. package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +4 -13
  96. package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +15 -5
  97. package/extensions/dm-lens/clients/dispatch/runners/spotbugs.js +2 -1
  98. package/extensions/dm-lens/clients/dispatch/runners/sqlfluff.js +10 -4
  99. package/extensions/dm-lens/clients/dispatch/runners/stylelint.js +9 -4
  100. package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +11 -3
  101. package/extensions/dm-lens/clients/dispatch/runners/taplo.js +13 -7
  102. package/extensions/dm-lens/clients/dispatch/runners/terragrunt.js +2 -1
  103. package/extensions/dm-lens/clients/dispatch/runners/tflint.js +26 -16
  104. package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +12 -13
  105. package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +9 -3
  106. package/extensions/dm-lens/clients/dispatch/runners/utils/availability-policy.js +5 -0
  107. package/extensions/dm-lens/clients/dispatch/runners/utils/candidate-probe.js +2 -2
  108. package/extensions/dm-lens/clients/dispatch/runners/utils/diagnostic-parsers.js +8 -52
  109. package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +35 -3
  110. package/extensions/dm-lens/clients/dispatch/runners/utils.js +0 -17
  111. package/extensions/dm-lens/clients/dispatch/runners/vale.js +12 -4
  112. package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +2 -20
  113. package/extensions/dm-lens/clients/dispatch/runners/yamllint.js +16 -4
  114. package/extensions/dm-lens/clients/dispatch/runners/zig-check.js +26 -38
  115. package/extensions/dm-lens/clients/dispatch/suppress-writer.js +13 -3
  116. package/extensions/dm-lens/clients/dispatch/types.js +4 -1
  117. package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +2 -2
  118. package/extensions/dm-lens/clients/disposition-logger.js +0 -6
  119. package/extensions/dm-lens/clients/disposition-publish.js +2 -1
  120. package/extensions/dm-lens/clients/effective-config.js +14 -4
  121. package/extensions/dm-lens/clients/event-loop-hold.js +123 -0
  122. package/extensions/dm-lens/clients/event-loop-monitor.js +2 -2
  123. package/extensions/dm-lens/clients/extension-log.js +6 -1
  124. package/extensions/dm-lens/clients/feature-hints.js +2 -1
  125. package/extensions/dm-lens/clients/file-kinds.js +17 -21
  126. package/extensions/dm-lens/clients/file-role.js +11 -2
  127. package/extensions/dm-lens/clients/file-time.js +1 -1
  128. package/extensions/dm-lens/clients/file-utils.js +93 -6
  129. package/extensions/dm-lens/clients/finding-delivery-gate.js +22 -26
  130. package/extensions/dm-lens/clients/format-service.js +33 -16
  131. package/extensions/dm-lens/clients/formatters.js +129 -92
  132. package/extensions/dm-lens/clients/generated-artifacts.js +2 -2
  133. package/extensions/dm-lens/clients/generation-guard.js +4 -0
  134. package/extensions/dm-lens/clients/git-guard.js +80 -26
  135. package/extensions/dm-lens/clients/gitleaks-client.js +26 -0
  136. package/extensions/dm-lens/clients/govulncheck-client.js +34 -6
  137. package/extensions/dm-lens/clients/gradle-ktfmt-style.js +96 -13
  138. package/extensions/dm-lens/clients/grammar-source.js +3 -3
  139. package/extensions/dm-lens/clients/host-edit-normalize.js +1 -1
  140. package/extensions/dm-lens/clients/indent-retarget.js +35 -5
  141. package/extensions/dm-lens/clients/inline-blocker-dispositions.js +107 -0
  142. package/extensions/dm-lens/clients/install-diagnostics.js +8 -6
  143. package/extensions/dm-lens/clients/installer/index.js +695 -183
  144. package/extensions/dm-lens/clients/installer/managed-tool-refresh.js +85 -25
  145. package/extensions/dm-lens/clients/instance-reaper-state.js +3 -0
  146. package/extensions/dm-lens/clients/instance-reaper.js +23 -16
  147. package/extensions/dm-lens/clients/instance-registry.js +34 -2
  148. package/extensions/dm-lens/clients/jscpd-client.js +11 -1
  149. package/extensions/dm-lens/clients/knip-client.js +2 -1
  150. package/extensions/dm-lens/clients/language-profile.js +18 -12
  151. package/extensions/dm-lens/clients/language-registry.js +3 -1
  152. package/extensions/dm-lens/clients/latency-logger.js +14 -4
  153. package/extensions/dm-lens/clients/ledger-bounds.js +13 -1
  154. package/extensions/dm-lens/clients/lens-config.js +74 -7
  155. package/extensions/dm-lens/clients/lens-engine.js +9 -10
  156. package/extensions/dm-lens/clients/lens-events.js +1 -1
  157. package/extensions/dm-lens/clients/lens-flag-registry.js +47 -2
  158. package/extensions/dm-lens/clients/lens-map.js +1 -1
  159. package/extensions/dm-lens/clients/log-cleanup.js +0 -28
  160. package/extensions/dm-lens/clients/lsp/cascade-tier.js +2 -1
  161. package/extensions/dm-lens/clients/lsp/client.js +70 -30
  162. package/extensions/dm-lens/clients/lsp/config.js +41 -15
  163. package/extensions/dm-lens/clients/lsp/content-limits.js +21 -0
  164. package/extensions/dm-lens/clients/lsp/diagnostic-binding.js +8 -0
  165. package/extensions/dm-lens/clients/lsp/document-drift.js +72 -1
  166. package/extensions/dm-lens/clients/lsp/edits.js +3 -3
  167. package/extensions/dm-lens/clients/lsp/index.js +435 -62
  168. package/extensions/dm-lens/clients/lsp/inferred-project.js +1 -1
  169. package/extensions/dm-lens/clients/lsp/language.js +0 -3
  170. package/extensions/dm-lens/clients/lsp/launch.js +12 -5
  171. package/extensions/dm-lens/clients/lsp/path-utils.js +0 -2
  172. package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +0 -1
  173. package/extensions/dm-lens/clients/lsp/server.js +125 -60
  174. package/extensions/dm-lens/clients/lsp/session-roots.js +26 -5
  175. package/extensions/dm-lens/clients/lsp/sync-kind.js +14 -1
  176. package/extensions/dm-lens/clients/lsp/tsserver-sync.js +5 -7
  177. package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +3 -0
  178. package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +31 -2
  179. package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +26 -4
  180. package/extensions/dm-lens/clients/lsp-document-symbols.js +1 -1
  181. package/extensions/dm-lens/clients/map-with-concurrency.js +7 -3
  182. package/extensions/dm-lens/clients/mcp/analyze.js +1 -1
  183. package/extensions/dm-lens/clients/mcp/ipc.js +104 -40
  184. package/extensions/dm-lens/clients/mcp/review.js +39 -7
  185. package/extensions/dm-lens/clients/mcp/session.js +38 -4
  186. package/extensions/dm-lens/clients/metrics-history.js +19 -84
  187. package/extensions/dm-lens/clients/middle-man-analysis.js +2 -4
  188. package/extensions/dm-lens/clients/module-report.js +1 -1
  189. package/extensions/dm-lens/clients/mutating-tool.js +3 -3
  190. package/extensions/dm-lens/clients/mutation-attribution.js +3 -3
  191. package/extensions/dm-lens/clients/ndjson-logger.js +17 -9
  192. package/extensions/dm-lens/clients/observed-mutation.js +42 -11
  193. package/extensions/dm-lens/clients/opaque-mutation-scan.js +17 -7
  194. package/extensions/dm-lens/clients/opengrep-client.js +92 -10
  195. package/extensions/dm-lens/clients/opengrep-config.js +1 -1
  196. package/extensions/dm-lens/clients/package-manager.js +2 -1
  197. package/extensions/dm-lens/clients/path-utils.js +199 -3
  198. package/extensions/dm-lens/clients/performance-report.js +3 -3
  199. package/extensions/dm-lens/clients/persistent-reverify.js +167 -0
  200. package/extensions/dm-lens/clients/php-cs-fixer-config.js +9 -4
  201. package/extensions/dm-lens/clients/pipeline.js +124 -68
  202. package/extensions/dm-lens/clients/project-changes.js +1 -1
  203. package/extensions/dm-lens/clients/project-diagnostics/cache.js +19 -5
  204. package/extensions/dm-lens/clients/project-diagnostics/extractors.js +1 -1
  205. package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +150 -18
  206. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/dead-code.js +4 -1
  207. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -3
  208. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/jscpd.js +1 -1
  209. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/knip.js +1 -1
  210. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/madge.js +1 -1
  211. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/opengrep.js +1 -1
  212. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/runner-findings.js +19 -2
  213. package/extensions/dm-lens/clients/project-diagnostics/scanner.js +35 -4
  214. package/extensions/dm-lens/clients/project-lens-config.js +58 -4
  215. package/extensions/dm-lens/clients/project-scan-policy.js +0 -46
  216. package/extensions/dm-lens/clients/python-environment.js +80 -4
  217. package/extensions/dm-lens/clients/python-provenance.js +551 -0
  218. package/extensions/dm-lens/clients/read-guard-logger.js +3 -1
  219. package/extensions/dm-lens/clients/read-guard.js +29 -6
  220. package/extensions/dm-lens/clients/recent-touches.js +2 -2
  221. package/extensions/dm-lens/clients/resource-sampler.js +59 -9
  222. package/extensions/dm-lens/clients/review-graph/builder.js +39 -34
  223. package/extensions/dm-lens/clients/review-graph/git-identity.js +11 -7
  224. package/extensions/dm-lens/clients/review-graph/import-resolvers.js +1 -1
  225. package/extensions/dm-lens/clients/review-graph-logger.js +3 -1
  226. package/extensions/dm-lens/clients/ruff-client.js +11 -10
  227. package/extensions/dm-lens/clients/runtime-agent-end.js +41 -5
  228. package/extensions/dm-lens/clients/runtime-context.js +5 -2
  229. package/extensions/dm-lens/clients/runtime-coordinator.js +60 -6
  230. package/extensions/dm-lens/clients/runtime-session.js +52 -8
  231. package/extensions/dm-lens/clients/runtime-tool-call.js +27 -15
  232. package/extensions/dm-lens/clients/runtime-tool-result.js +279 -63
  233. package/extensions/dm-lens/clients/runtime-turn.js +453 -185
  234. package/extensions/dm-lens/clients/safe-spawn.js +248 -62
  235. package/extensions/dm-lens/clients/sanitize.js +0 -4
  236. package/extensions/dm-lens/clients/scan-utils.js +1 -39
  237. package/extensions/dm-lens/clients/scratch-tree-policy.js +2 -3
  238. package/extensions/dm-lens/clients/security-scan-client.js +2 -2
  239. package/extensions/dm-lens/clients/session-event-guard.js +59 -2
  240. package/extensions/dm-lens/clients/session-summary.js +0 -25
  241. package/extensions/dm-lens/clients/sg-runner.js +24 -12
  242. package/extensions/dm-lens/clients/sgconfig.js +58 -6
  243. package/extensions/dm-lens/clients/shared-checkout-guard.js +1 -1
  244. package/extensions/dm-lens/clients/situational-tool-telemetry.js +85 -0
  245. package/extensions/dm-lens/clients/skills-resolver.js +42 -0
  246. package/extensions/dm-lens/clients/smells-rollup.js +2 -2
  247. package/extensions/dm-lens/clients/spawn-output-cap.js +29 -0
  248. package/extensions/dm-lens/clients/startup-scan.js +1 -2
  249. package/extensions/dm-lens/clients/string-utils.js +3 -0
  250. package/extensions/dm-lens/clients/test-runner-client.js +118 -57
  251. package/extensions/dm-lens/clients/test-runner-delivery.js +118 -66
  252. package/extensions/dm-lens/clients/tool-agreement.js +403 -0
  253. package/extensions/dm-lens/clients/tool-config.js +218 -0
  254. package/extensions/dm-lens/clients/tool-cwd.js +248 -0
  255. package/extensions/dm-lens/clients/tool-definition.js +18 -1
  256. package/extensions/dm-lens/clients/tool-policy.js +138 -10
  257. package/extensions/dm-lens/clients/tool-probe.js +5 -0
  258. package/extensions/dm-lens/clients/tool-set-policy.js +35 -0
  259. package/extensions/dm-lens/clients/tree-sitter-client.js +201 -80
  260. package/extensions/dm-lens/clients/tree-sitter-query-loader.js +78 -130
  261. package/extensions/dm-lens/clients/trivy-client.js +8 -1
  262. package/extensions/dm-lens/clients/tui-fit.js +0 -3
  263. package/extensions/dm-lens/clients/turn-context.js +48 -0
  264. package/extensions/dm-lens/clients/turn-end/lane.js +0 -0
  265. package/extensions/dm-lens/clients/turn-end/lanes/govulncheck.js +54 -0
  266. package/extensions/dm-lens/clients/turn-end/lanes/secrets.js +140 -0
  267. package/extensions/dm-lens/clients/user-notify.js +0 -3
  268. package/extensions/dm-lens/clients/warm-attach.js +25 -0
  269. package/extensions/dm-lens/clients/widget-state.js +203 -13
  270. package/extensions/dm-lens/clients/word-index-logger.js +0 -6
  271. package/extensions/dm-lens/clients/word-index-store.js +1 -4
  272. package/extensions/dm-lens/clients/word-index.js +9 -5
  273. package/extensions/dm-lens/clients/workspace-topology.js +20 -3
  274. package/extensions/dm-lens/clients/write-ordering-guard.js +6 -0
  275. package/extensions/dm-lens/clients/zizmor-config.js +15 -11
  276. package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +8 -2
  277. package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +24 -0
  278. package/extensions/dm-lens/dist/clients/actionable-warnings.js +1014 -0
  279. package/extensions/dm-lens/dist/clients/advisory-provenance.js +385 -0
  280. package/extensions/dm-lens/dist/clients/agent-behavior-client.js +94 -0
  281. package/extensions/dm-lens/dist/clients/agent-nudge.js +151 -0
  282. package/extensions/dm-lens/dist/clients/analysed-root.js +1 -0
  283. package/extensions/dm-lens/dist/clients/ast-grep-client.js +576 -0
  284. package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +114 -0
  285. package/extensions/dm-lens/dist/clients/ast-grep-tool-logger.js +85 -0
  286. package/extensions/dm-lens/dist/clients/ast-grep-types.js +1 -0
  287. package/extensions/dm-lens/dist/clients/ast-grep-yaml-synth.js +109 -0
  288. package/extensions/dm-lens/dist/clients/atomic-write-staging.js +66 -0
  289. package/extensions/dm-lens/dist/clients/atomic-write.js +37 -0
  290. package/extensions/dm-lens/dist/clients/availability-probe-flight.js +11 -0
  291. package/extensions/dm-lens/dist/clients/bash-file-access.js +830 -0
  292. package/extensions/dm-lens/dist/clients/biome-client.js +221 -0
  293. package/extensions/dm-lens/dist/clients/blocker-freshness.js +385 -0
  294. package/extensions/dm-lens/dist/clients/blocker-past-eof.js +49 -0
  295. package/extensions/dm-lens/dist/clients/bootstrap.js +246 -0
  296. package/extensions/dm-lens/dist/clients/bounded-cache.js +105 -0
  297. package/extensions/dm-lens/dist/clients/bounded-pid-file-lock.js +173 -0
  298. package/extensions/dm-lens/dist/clients/bounded-telemetry.js +104 -0
  299. package/extensions/dm-lens/dist/clients/build-identity.js +45 -0
  300. package/extensions/dm-lens/dist/clients/bundled-resource-health.js +41 -0
  301. package/extensions/dm-lens/dist/clients/bus-events-logger.js +48 -0
  302. package/extensions/dm-lens/dist/clients/bus-publish.js +117 -0
  303. package/extensions/dm-lens/dist/clients/cache/rule-cache.js +103 -0
  304. package/extensions/dm-lens/dist/clients/cache-manager.js +340 -0
  305. package/extensions/dm-lens/dist/clients/cache-observability.js +847 -0
  306. package/extensions/dm-lens/dist/clients/call-graph.js +628 -0
  307. package/extensions/dm-lens/dist/clients/cargo-manifest.js +151 -0
  308. package/extensions/dm-lens/dist/clients/cascade-budget.js +52 -0
  309. package/extensions/dm-lens/dist/clients/cascade-format.js +160 -0
  310. package/extensions/dm-lens/dist/clients/cascade-logger.js +22 -0
  311. package/extensions/dm-lens/dist/clients/cascade-types.js +1 -0
  312. package/extensions/dm-lens/dist/clients/child-unref.js +59 -0
  313. package/extensions/dm-lens/dist/clients/code-quality-warnings.js +192 -0
  314. package/extensions/dm-lens/dist/clients/codebase-model.js +110 -0
  315. package/extensions/dm-lens/dist/clients/collateral-test-role.js +8 -0
  316. package/extensions/dm-lens/dist/clients/complexity-client.js +398 -0
  317. package/extensions/dm-lens/dist/clients/config-core/deny.js +117 -0
  318. package/extensions/dm-lens/dist/clients/config-core/index.js +2 -0
  319. package/extensions/dm-lens/dist/clients/config-core/merge.js +228 -0
  320. package/extensions/dm-lens/dist/clients/config-core/normalize.js +217 -0
  321. package/extensions/dm-lens/dist/clients/config-core/process-spec.js +147 -0
  322. package/extensions/dm-lens/dist/clients/config-core/provenance.js +54 -0
  323. package/extensions/dm-lens/dist/clients/config-core/records.js +79 -0
  324. package/extensions/dm-lens/dist/clients/config-core/resolve.js +48 -0
  325. package/extensions/dm-lens/dist/clients/config-core/safe-object.js +22 -0
  326. package/extensions/dm-lens/dist/clients/config-core/schema.js +90 -0
  327. package/extensions/dm-lens/dist/clients/config-diagnostic-codes.js +90 -0
  328. package/extensions/dm-lens/dist/clients/config-locations.js +175 -0
  329. package/extensions/dm-lens/dist/clients/config-resolve.js +359 -0
  330. package/extensions/dm-lens/dist/clients/config-schema.js +128 -0
  331. package/extensions/dm-lens/dist/clients/config-warn.js +146 -0
  332. package/extensions/dm-lens/dist/clients/console-guard-install.js +4 -0
  333. package/extensions/dm-lens/dist/clients/cooperative-budget.js +36 -0
  334. package/extensions/dm-lens/dist/clients/dead-code-client.js +342 -0
  335. package/extensions/dm-lens/dist/clients/dead-code-logger.js +18 -0
  336. package/extensions/dm-lens/dist/clients/deadline-utils.js +117 -0
  337. package/extensions/dm-lens/dist/clients/debug-handles.js +121 -0
  338. package/extensions/dm-lens/dist/clients/debug-heap.js +80 -0
  339. package/extensions/dm-lens/dist/clients/deferred-lsp-work.js +33 -0
  340. package/extensions/dm-lens/dist/clients/degradation-ledger.js +272 -0
  341. package/extensions/dm-lens/dist/clients/demoted-finding-render.js +61 -0
  342. package/extensions/dm-lens/dist/clients/dependency-checker.js +525 -0
  343. package/extensions/dm-lens/dist/clients/deps/ast-grep-napi.js +17 -0
  344. package/extensions/dm-lens/dist/clients/deps/dm-host-deps.js +10 -0
  345. package/extensions/dm-lens/dist/clients/deps/dm-tui-compat.js +58 -0
  346. package/extensions/dm-lens/dist/clients/deps/js-yaml.js +7 -0
  347. package/extensions/dm-lens/dist/clients/deps/minimatch.js +6 -0
  348. package/extensions/dm-lens/dist/clients/deps/pidusage.js +5 -0
  349. package/extensions/dm-lens/dist/clients/deps/typebox.js +5 -0
  350. package/extensions/dm-lens/dist/clients/deps/vscode-jsonrpc.js +8 -0
  351. package/extensions/dm-lens/dist/clients/deps/web-tree-sitter.js +11 -0
  352. package/extensions/dm-lens/dist/clients/diagnostic-dispositions.js +318 -0
  353. package/extensions/dm-lens/dist/clients/diagnostic-line-freshness.js +144 -0
  354. package/extensions/dm-lens/dist/clients/diagnostic-logger.js +60 -0
  355. package/extensions/dm-lens/dist/clients/diagnostic-tracker.js +89 -0
  356. package/extensions/dm-lens/dist/clients/diagnostics-publish.js +134 -0
  357. package/extensions/dm-lens/dist/clients/dispatch/ast-grep-catalog.js +16 -0
  358. package/extensions/dm-lens/dist/clients/dispatch/auxiliary-lsp.js +158 -0
  359. package/extensions/dm-lens/dist/clients/dispatch/collect-later-tier.js +25 -0
  360. package/extensions/dm-lens/dist/clients/dispatch/diagnostic-taxonomy.js +58 -0
  361. package/extensions/dm-lens/dist/clients/dispatch/dispatcher.js +953 -0
  362. package/extensions/dm-lens/dist/clients/dispatch/fact-provider-types.js +1 -0
  363. package/extensions/dm-lens/dist/clients/dispatch/fact-rule-runner.js +17 -0
  364. package/extensions/dm-lens/dist/clients/dispatch/fact-runner.js +18 -0
  365. package/extensions/dm-lens/dist/clients/dispatch/fact-scheduler.js +52 -0
  366. package/extensions/dm-lens/dist/clients/dispatch/fact-store.js +199 -0
  367. package/extensions/dm-lens/dist/clients/dispatch/facts/comment-facts.js +20 -0
  368. package/extensions/dm-lens/dist/clients/dispatch/facts/file-content.js +18 -0
  369. package/extensions/dm-lens/dist/clients/dispatch/facts/function-facts.js +281 -0
  370. package/extensions/dm-lens/dist/clients/dispatch/facts/import-facts.js +169 -0
  371. package/extensions/dm-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +19 -0
  372. package/extensions/dm-lens/dist/clients/dispatch/facts/try-catch-facts.js +95 -0
  373. package/extensions/dm-lens/dist/clients/dispatch/finding-policy.js +159 -0
  374. package/extensions/dm-lens/dist/clients/dispatch/indent-detect.js +227 -0
  375. package/extensions/dm-lens/dist/clients/dispatch/inline-suppressions.js +52 -0
  376. package/extensions/dm-lens/dist/clients/dispatch/integration.js +1463 -0
  377. package/extensions/dm-lens/dist/clients/dispatch/lazy.js +8 -0
  378. package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +75 -0
  379. package/extensions/dm-lens/dist/clients/dispatch/plan.js +278 -0
  380. package/extensions/dm-lens/dist/clients/dispatch/priorities.js +14 -0
  381. package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +42 -0
  382. package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +21 -0
  383. package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +73 -0
  384. package/extensions/dm-lens/dist/clients/dispatch/rules/async-noise.js +31 -0
  385. package/extensions/dm-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +27 -0
  386. package/extensions/dm-lens/dist/clients/dispatch/rules/cors-wildcard.js +35 -0
  387. package/extensions/dm-lens/dist/clients/dispatch/rules/error-obscuring.js +29 -0
  388. package/extensions/dm-lens/dist/clients/dispatch/rules/error-swallowing.js +29 -0
  389. package/extensions/dm-lens/dist/clients/dispatch/rules/framework-call-noise.js +31 -0
  390. package/extensions/dm-lens/dist/clients/dispatch/rules/high-complexity.js +56 -0
  391. package/extensions/dm-lens/dist/clients/dispatch/rules/high-fan-out.js +45 -0
  392. package/extensions/dm-lens/dist/clients/dispatch/rules/high-import-coupling.js +31 -0
  393. package/extensions/dm-lens/dist/clients/dispatch/rules/missing-error-propagation.js +45 -0
  394. package/extensions/dm-lens/dist/clients/dispatch/rules/no-commented-credentials.js +46 -0
  395. package/extensions/dm-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +38 -0
  396. package/extensions/dm-lens/dist/clients/dispatch/rules/placeholder-comments.js +40 -0
  397. package/extensions/dm-lens/dist/clients/dispatch/rules/unsafe-boundary.js +101 -0
  398. package/extensions/dm-lens/dist/clients/dispatch/runner-context.js +46 -0
  399. package/extensions/dm-lens/dist/clients/dispatch/runners/actionlint.js +98 -0
  400. package/extensions/dm-lens/dist/clients/dispatch/runners/ast-grep-napi.js +690 -0
  401. package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +202 -0
  402. package/extensions/dm-lens/dist/clients/dispatch/runners/cpp-check.js +190 -0
  403. package/extensions/dm-lens/dist/clients/dispatch/runners/credo.js +66 -0
  404. package/extensions/dm-lens/dist/clients/dispatch/runners/cue-vet.js +167 -0
  405. package/extensions/dm-lens/dist/clients/dispatch/runners/dart-analyze.js +151 -0
  406. package/extensions/dm-lens/dist/clients/dispatch/runners/detekt.js +157 -0
  407. package/extensions/dm-lens/dist/clients/dispatch/runners/dotnet-build.js +157 -0
  408. package/extensions/dm-lens/dist/clients/dispatch/runners/elixir-check.js +153 -0
  409. package/extensions/dm-lens/dist/clients/dispatch/runners/eslint.js +99 -0
  410. package/extensions/dm-lens/dist/clients/dispatch/runners/fact-rules.js +20 -0
  411. package/extensions/dm-lens/dist/clients/dispatch/runners/fish-indent.js +65 -0
  412. package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +107 -0
  413. package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +51 -0
  414. package/extensions/dm-lens/dist/clients/dispatch/runners/golangci-lint.js +89 -0
  415. package/extensions/dm-lens/dist/clients/dispatch/runners/hadolint.js +83 -0
  416. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-lint.js +144 -0
  417. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-render.js +593 -0
  418. package/extensions/dm-lens/dist/clients/dispatch/runners/htmlhint.js +103 -0
  419. package/extensions/dm-lens/dist/clients/dispatch/runners/index.js +100 -0
  420. package/extensions/dm-lens/dist/clients/dispatch/runners/javac.js +82 -0
  421. package/extensions/dm-lens/dist/clients/dispatch/runners/ktlint.js +93 -0
  422. package/extensions/dm-lens/dist/clients/dispatch/runners/lsp.js +206 -0
  423. package/extensions/dm-lens/dist/clients/dispatch/runners/markdownlint.js +129 -0
  424. package/extensions/dm-lens/dist/clients/dispatch/runners/mypy.js +70 -0
  425. package/extensions/dm-lens/dist/clients/dispatch/runners/oxlint.js +305 -0
  426. package/extensions/dm-lens/dist/clients/dispatch/runners/php-lint.js +70 -0
  427. package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +90 -0
  428. package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +56 -0
  429. package/extensions/dm-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +307 -0
  430. package/extensions/dm-lens/dist/clients/dispatch/runners/pyright.js +118 -0
  431. package/extensions/dm-lens/dist/clients/dispatch/runners/rubocop.js +79 -0
  432. package/extensions/dm-lens/dist/clients/dispatch/runners/ruff.js +69 -0
  433. package/extensions/dm-lens/dist/clients/dispatch/runners/rust-clippy.js +147 -0
  434. package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +111 -0
  435. package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +81 -0
  436. package/extensions/dm-lens/dist/clients/dispatch/runners/spellcheck.js +74 -0
  437. package/extensions/dm-lens/dist/clients/dispatch/runners/spotbugs.js +208 -0
  438. package/extensions/dm-lens/dist/clients/dispatch/runners/sqlfluff.js +136 -0
  439. package/extensions/dm-lens/dist/clients/dispatch/runners/stylelint.js +118 -0
  440. package/extensions/dm-lens/dist/clients/dispatch/runners/swiftlint.js +143 -0
  441. package/extensions/dm-lens/dist/clients/dispatch/runners/taplo.js +97 -0
  442. package/extensions/dm-lens/dist/clients/dispatch/runners/terragrunt.js +110 -0
  443. package/extensions/dm-lens/dist/clients/dispatch/runners/tflint.js +104 -0
  444. package/extensions/dm-lens/dist/clients/dispatch/runners/tree-sitter.js +516 -0
  445. package/extensions/dm-lens/dist/clients/dispatch/runners/trivy-config.js +155 -0
  446. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/availability-policy.js +285 -0
  447. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +61 -0
  448. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +61 -0
  449. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +130 -0
  450. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +1067 -0
  451. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +40 -0
  452. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/tool-failure.js +117 -0
  453. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +88 -0
  454. package/extensions/dm-lens/dist/clients/dispatch/runners/utils.js +8 -0
  455. package/extensions/dm-lens/dist/clients/dispatch/runners/vale.js +106 -0
  456. package/extensions/dm-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +163 -0
  457. package/extensions/dm-lens/dist/clients/dispatch/runners/yamllint.js +83 -0
  458. package/extensions/dm-lens/dist/clients/dispatch/runners/zig-check.js +72 -0
  459. package/extensions/dm-lens/dist/clients/dispatch/suppress-writer.js +57 -0
  460. package/extensions/dm-lens/dist/clients/dispatch/tool-profile.js +30 -0
  461. package/extensions/dm-lens/dist/clients/dispatch/types.js +7 -0
  462. package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +45 -0
  463. package/extensions/dm-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +31 -0
  464. package/extensions/dm-lens/dist/clients/disposition-logger.js +19 -0
  465. package/extensions/dm-lens/dist/clients/disposition-publish.js +88 -0
  466. package/extensions/dm-lens/dist/clients/durable-store.js +77 -0
  467. package/extensions/dm-lens/dist/clients/effective-config.js +160 -0
  468. package/extensions/dm-lens/dist/clients/env-utils.js +26 -0
  469. package/extensions/dm-lens/dist/clients/error-class.js +3 -0
  470. package/extensions/dm-lens/dist/clients/eval-timestamp.js +2 -0
  471. package/extensions/dm-lens/dist/clients/event-loop-hold.js +119 -0
  472. package/extensions/dm-lens/dist/clients/event-loop-monitor.js +84 -0
  473. package/extensions/dm-lens/dist/clients/extension-log.js +230 -0
  474. package/extensions/dm-lens/dist/clients/extension-mode.js +20 -0
  475. package/extensions/dm-lens/dist/clients/feature-hints.js +88 -0
  476. package/extensions/dm-lens/dist/clients/file-kinds.js +304 -0
  477. package/extensions/dm-lens/dist/clients/file-role.js +50 -0
  478. package/extensions/dm-lens/dist/clients/file-time.js +112 -0
  479. package/extensions/dm-lens/dist/clients/file-utils.js +630 -0
  480. package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +129 -0
  481. package/extensions/dm-lens/dist/clients/finding-identity.js +23 -0
  482. package/extensions/dm-lens/dist/clients/fix-worklog.js +75 -0
  483. package/extensions/dm-lens/dist/clients/format-events-publish.js +230 -0
  484. package/extensions/dm-lens/dist/clients/format-service.js +154 -0
  485. package/extensions/dm-lens/dist/clients/formatters-lazy.js +8 -0
  486. package/extensions/dm-lens/dist/clients/formatters.js +1351 -0
  487. package/extensions/dm-lens/dist/clients/freshness-cadence.js +1 -0
  488. package/extensions/dm-lens/dist/clients/freshness.js +8 -0
  489. package/extensions/dm-lens/dist/clients/generated-artifacts.js +209 -0
  490. package/extensions/dm-lens/dist/clients/generation-guard.js +105 -0
  491. package/extensions/dm-lens/dist/clients/git-guard.js +770 -0
  492. package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +120 -0
  493. package/extensions/dm-lens/dist/clients/gitleaks-client.js +282 -0
  494. package/extensions/dm-lens/dist/clients/go-client.js +47 -0
  495. package/extensions/dm-lens/dist/clients/govulncheck-client.js +411 -0
  496. package/extensions/dm-lens/dist/clients/gradle-ktfmt-style.js +177 -0
  497. package/extensions/dm-lens/dist/clients/grammar-source.js +224 -0
  498. package/extensions/dm-lens/dist/clients/gzip-stage-write.js +85 -0
  499. package/extensions/dm-lens/dist/clients/hashline-anchor.js +222 -0
  500. package/extensions/dm-lens/dist/clients/hook-budgets.js +16 -0
  501. package/extensions/dm-lens/dist/clients/host-edit-normalize.js +87 -0
  502. package/extensions/dm-lens/dist/clients/host-ports.js +35 -0
  503. package/extensions/dm-lens/dist/clients/indent-retarget.js +102 -0
  504. package/extensions/dm-lens/dist/clients/inline-blocker-dispositions.js +103 -0
  505. package/extensions/dm-lens/dist/clients/install-diagnostics.js +123 -0
  506. package/extensions/dm-lens/dist/clients/installer/index.js +3770 -0
  507. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh-session.js +17 -0
  508. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh.js +522 -0
  509. package/extensions/dm-lens/dist/clients/instance-reaper-state.js +3 -0
  510. package/extensions/dm-lens/dist/clients/instance-reaper.js +577 -0
  511. package/extensions/dm-lens/dist/clients/instance-registry-lock.js +131 -0
  512. package/extensions/dm-lens/dist/clients/instance-registry.js +452 -0
  513. package/extensions/dm-lens/dist/clients/jscpd-client.js +252 -0
  514. package/extensions/dm-lens/dist/clients/json-cache-read.js +25 -0
  515. package/extensions/dm-lens/dist/clients/knip-client.js +472 -0
  516. package/extensions/dm-lens/dist/clients/language-policy.js +242 -0
  517. package/extensions/dm-lens/dist/clients/language-profile.js +261 -0
  518. package/extensions/dm-lens/dist/clients/language-registry.js +424 -0
  519. package/extensions/dm-lens/dist/clients/latency-logger.js +192 -0
  520. package/extensions/dm-lens/dist/clients/lazy-import.js +14 -0
  521. package/extensions/dm-lens/dist/clients/ledger-bounds.js +21 -0
  522. package/extensions/dm-lens/dist/clients/lens-config.js +237 -0
  523. package/extensions/dm-lens/dist/clients/lens-engine.js +181 -0
  524. package/extensions/dm-lens/dist/clients/lens-events.js +105 -0
  525. package/extensions/dm-lens/dist/clients/lens-flag-registry.js +302 -0
  526. package/extensions/dm-lens/dist/clients/lens-map.js +980 -0
  527. package/extensions/dm-lens/dist/clients/live-bus-emitter.js +53 -0
  528. package/extensions/dm-lens/dist/clients/log-cleanup.js +138 -0
  529. package/extensions/dm-lens/dist/clients/lsp/aggregation.js +88 -0
  530. package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +203 -0
  531. package/extensions/dm-lens/dist/clients/lsp/client.js +2709 -0
  532. package/extensions/dm-lens/dist/clients/lsp/config.js +252 -0
  533. package/extensions/dm-lens/dist/clients/lsp/content-limits.js +21 -0
  534. package/extensions/dm-lens/dist/clients/lsp/diagnostic-binding.js +79 -0
  535. package/extensions/dm-lens/dist/clients/lsp/document-drift.js +312 -0
  536. package/extensions/dm-lens/dist/clients/lsp/edits.js +930 -0
  537. package/extensions/dm-lens/dist/clients/lsp/index.js +4448 -0
  538. package/extensions/dm-lens/dist/clients/lsp/inferred-project.js +121 -0
  539. package/extensions/dm-lens/dist/clients/lsp/jvm-runtime.js +194 -0
  540. package/extensions/dm-lens/dist/clients/lsp/language.js +23 -0
  541. package/extensions/dm-lens/dist/clients/lsp/launch.js +468 -0
  542. package/extensions/dm-lens/dist/clients/lsp/lombok.js +146 -0
  543. package/extensions/dm-lens/dist/clients/lsp/path-utils.js +1 -0
  544. package/extensions/dm-lens/dist/clients/lsp/pending-aux-coverage.js +90 -0
  545. package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +28 -0
  546. package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +42 -0
  547. package/extensions/dm-lens/dist/clients/lsp/server.js +2422 -0
  548. package/extensions/dm-lens/dist/clients/lsp/session-roots.js +52 -0
  549. package/extensions/dm-lens/dist/clients/lsp/spawn-history.js +15 -0
  550. package/extensions/dm-lens/dist/clients/lsp/sync-kind.js +30 -0
  551. package/extensions/dm-lens/dist/clients/lsp/tsserver-sync.js +156 -0
  552. package/extensions/dm-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +1 -0
  553. package/extensions/dm-lens/dist/clients/lsp/wait-policy/classification.js +36 -0
  554. package/extensions/dm-lens/dist/clients/lsp/wait-policy/index.js +3 -0
  555. package/extensions/dm-lens/dist/clients/lsp/wait-policy/strategies.js +175 -0
  556. package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +40 -0
  557. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +267 -0
  558. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-session.js +7 -0
  559. package/extensions/dm-lens/dist/clients/lsp/workspace-sweep-hold.js +93 -0
  560. package/extensions/dm-lens/dist/clients/lsp-budget.js +83 -0
  561. package/extensions/dm-lens/dist/clients/lsp-document-symbols.js +93 -0
  562. package/extensions/dm-lens/dist/clients/lsp-lazy.js +8 -0
  563. package/extensions/dm-lens/dist/clients/lsp-mutation.js +273 -0
  564. package/extensions/dm-lens/dist/clients/lsp-status.js +37 -0
  565. package/extensions/dm-lens/dist/clients/map-with-concurrency.js +20 -0
  566. package/extensions/dm-lens/dist/clients/mcp/analyze.js +251 -0
  567. package/extensions/dm-lens/dist/clients/mcp/host-shim.js +14 -0
  568. package/extensions/dm-lens/dist/clients/mcp/ipc.js +302 -0
  569. package/extensions/dm-lens/dist/clients/mcp/review.js +137 -0
  570. package/extensions/dm-lens/dist/clients/mcp/session.js +305 -0
  571. package/extensions/dm-lens/dist/clients/memory-sampler.js +107 -0
  572. package/extensions/dm-lens/dist/clients/message-end-attribution.js +18 -0
  573. package/extensions/dm-lens/dist/clients/metrics-client.js +80 -0
  574. package/extensions/dm-lens/dist/clients/metrics-history.js +255 -0
  575. package/extensions/dm-lens/dist/clients/middle-man-analysis.js +161 -0
  576. package/extensions/dm-lens/dist/clients/model-provider.js +31 -0
  577. package/extensions/dm-lens/dist/clients/module-report-lsp.js +140 -0
  578. package/extensions/dm-lens/dist/clients/module-report.js +1642 -0
  579. package/extensions/dm-lens/dist/clients/mutating-tool.js +377 -0
  580. package/extensions/dm-lens/dist/clients/mutation-attribution.js +168 -0
  581. package/extensions/dm-lens/dist/clients/mutation-bridge.js +102 -0
  582. package/extensions/dm-lens/dist/clients/ndjson-logger.js +471 -0
  583. package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +43 -0
  584. package/extensions/dm-lens/dist/clients/observed-mutation.js +709 -0
  585. package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +100 -0
  586. package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +313 -0
  587. package/extensions/dm-lens/dist/clients/opengrep-client.js +216 -0
  588. package/extensions/dm-lens/dist/clients/opengrep-config.js +52 -0
  589. package/extensions/dm-lens/dist/clients/package-manager.js +303 -0
  590. package/extensions/dm-lens/dist/clients/package-root.js +25 -0
  591. package/extensions/dm-lens/dist/clients/partial-edit-apply.js +337 -0
  592. package/extensions/dm-lens/dist/clients/path-attribution-telemetry.js +31 -0
  593. package/extensions/dm-lens/dist/clients/path-keyed-map.js +57 -0
  594. package/extensions/dm-lens/dist/clients/path-utils.js +476 -0
  595. package/extensions/dm-lens/dist/clients/performance-report.js +291 -0
  596. package/extensions/dm-lens/dist/clients/persist-debounce.js +37 -0
  597. package/extensions/dm-lens/dist/clients/persistent-reverify.js +165 -0
  598. package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +15 -0
  599. package/extensions/dm-lens/dist/clients/pipeline.js +1091 -0
  600. package/extensions/dm-lens/dist/clients/post-autofix-notice.js +19 -0
  601. package/extensions/dm-lens/dist/clients/print-mode.js +3 -0
  602. package/extensions/dm-lens/dist/clients/probe-home-state.js +62 -0
  603. package/extensions/dm-lens/dist/clients/process-bridge.js +20 -0
  604. package/extensions/dm-lens/dist/clients/process-singletons.js +69 -0
  605. package/extensions/dm-lens/dist/clients/process-snapshot.js +22 -0
  606. package/extensions/dm-lens/dist/clients/project-changes.js +112 -0
  607. package/extensions/dm-lens/dist/clients/project-conventions.js +152 -0
  608. package/extensions/dm-lens/dist/clients/project-diagnostics/cache.js +91 -0
  609. package/extensions/dm-lens/dist/clients/project-diagnostics/extractors.js +53 -0
  610. package/extensions/dm-lens/dist/clients/project-diagnostics/fresh-fetch.js +408 -0
  611. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +64 -0
  612. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +38 -0
  613. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +21 -0
  614. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +23 -0
  615. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +28 -0
  616. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +45 -0
  617. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +34 -0
  618. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +32 -0
  619. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +79 -0
  620. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +41 -0
  621. package/extensions/dm-lens/dist/clients/project-diagnostics/scanner.js +349 -0
  622. package/extensions/dm-lens/dist/clients/project-diagnostics/types.js +1 -0
  623. package/extensions/dm-lens/dist/clients/project-lens-config.js +437 -0
  624. package/extensions/dm-lens/dist/clients/project-report.js +527 -0
  625. package/extensions/dm-lens/dist/clients/project-scale.js +60 -0
  626. package/extensions/dm-lens/dist/clients/project-scan-policy.js +4 -0
  627. package/extensions/dm-lens/dist/clients/project-snapshot-fingerprint.js +39 -0
  628. package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +14 -0
  629. package/extensions/dm-lens/dist/clients/project-snapshot.js +1178 -0
  630. package/extensions/dm-lens/dist/clients/project-trust.js +104 -0
  631. package/extensions/dm-lens/dist/clients/python-environment.js +120 -0
  632. package/extensions/dm-lens/dist/clients/python-provenance.js +551 -0
  633. package/extensions/dm-lens/dist/clients/quiet-window-config.js +16 -0
  634. package/extensions/dm-lens/dist/clients/quiet-window.js +126 -0
  635. package/extensions/dm-lens/dist/clients/read-bridge.js +46 -0
  636. package/extensions/dm-lens/dist/clients/read-expansion.js +218 -0
  637. package/extensions/dm-lens/dist/clients/read-guard-logger.js +178 -0
  638. package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +1042 -0
  639. package/extensions/dm-lens/dist/clients/read-guard.js +1096 -0
  640. package/extensions/dm-lens/dist/clients/recent-touches.js +126 -0
  641. package/extensions/dm-lens/dist/clients/redact/secrets.js +386 -0
  642. package/extensions/dm-lens/dist/clients/resource-sampler.js +344 -0
  643. package/extensions/dm-lens/dist/clients/reverse-deps.js +227 -0
  644. package/extensions/dm-lens/dist/clients/review-graph/builder.js +3635 -0
  645. package/extensions/dm-lens/dist/clients/review-graph/format.js +30 -0
  646. package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +115 -0
  647. package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +325 -0
  648. package/extensions/dm-lens/dist/clients/review-graph/persist-worker.js +8 -0
  649. package/extensions/dm-lens/dist/clients/review-graph/query.js +195 -0
  650. package/extensions/dm-lens/dist/clients/review-graph/revision-drift.js +3 -0
  651. package/extensions/dm-lens/dist/clients/review-graph/service.js +60 -0
  652. package/extensions/dm-lens/dist/clients/review-graph/shared-extraction-ir.js +54 -0
  653. package/extensions/dm-lens/dist/clients/review-graph/symbol-id.js +29 -0
  654. package/extensions/dm-lens/dist/clients/review-graph/tsconfig-paths.js +253 -0
  655. package/extensions/dm-lens/dist/clients/review-graph/types.js +1 -0
  656. package/extensions/dm-lens/dist/clients/review-graph/workspace-modules.js +374 -0
  657. package/extensions/dm-lens/dist/clients/review-graph-logger.js +51 -0
  658. package/extensions/dm-lens/dist/clients/ruff-client.js +109 -0
  659. package/extensions/dm-lens/dist/clients/rules-scanner.js +113 -0
  660. package/extensions/dm-lens/dist/clients/run-duration.js +9 -0
  661. package/extensions/dm-lens/dist/clients/runtime-agent-end.js +608 -0
  662. package/extensions/dm-lens/dist/clients/runtime-config.js +39 -0
  663. package/extensions/dm-lens/dist/clients/runtime-context.js +155 -0
  664. package/extensions/dm-lens/dist/clients/runtime-coordinator.js +817 -0
  665. package/extensions/dm-lens/dist/clients/runtime-session.js +1625 -0
  666. package/extensions/dm-lens/dist/clients/runtime-tool-call.js +868 -0
  667. package/extensions/dm-lens/dist/clients/runtime-tool-result.js +1317 -0
  668. package/extensions/dm-lens/dist/clients/runtime-turn.js +2333 -0
  669. package/extensions/dm-lens/dist/clients/rust-client.js +48 -0
  670. package/extensions/dm-lens/dist/clients/safe-spawn.js +1267 -0
  671. package/extensions/dm-lens/dist/clients/sanitize.js +174 -0
  672. package/extensions/dm-lens/dist/clients/scan-utils.js +7 -0
  673. package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +57 -0
  674. package/extensions/dm-lens/dist/clients/search-read-registration.js +59 -0
  675. package/extensions/dm-lens/dist/clients/secret-findings.js +69 -0
  676. package/extensions/dm-lens/dist/clients/security-scan-client.js +208 -0
  677. package/extensions/dm-lens/dist/clients/session-event-guard.js +111 -0
  678. package/extensions/dm-lens/dist/clients/session-lifecycle.js +173 -0
  679. package/extensions/dm-lens/dist/clients/session-start-observability.js +47 -0
  680. package/extensions/dm-lens/dist/clients/session-state-store.js +63 -0
  681. package/extensions/dm-lens/dist/clients/session-summary.js +8 -0
  682. package/extensions/dm-lens/dist/clients/sessionstart-logger.js +22 -0
  683. package/extensions/dm-lens/dist/clients/sg-runner.js +627 -0
  684. package/extensions/dm-lens/dist/clients/sgconfig.js +280 -0
  685. package/extensions/dm-lens/dist/clients/shared-checkout-guard.js +177 -0
  686. package/extensions/dm-lens/dist/clients/single-flight.js +52 -0
  687. package/extensions/dm-lens/dist/clients/situational-tool-telemetry.js +85 -0
  688. package/extensions/dm-lens/dist/clients/skills-resolver.js +38 -0
  689. package/extensions/dm-lens/dist/clients/slow-fs.js +77 -0
  690. package/extensions/dm-lens/dist/clients/smells-rollup.js +118 -0
  691. package/extensions/dm-lens/dist/clients/source-filter.js +320 -0
  692. package/extensions/dm-lens/dist/clients/source-walker.js +96 -0
  693. package/extensions/dm-lens/dist/clients/spawn-output-cap.js +35 -0
  694. package/extensions/dm-lens/dist/clients/spawn-timeout-cooldown.js +51 -0
  695. package/extensions/dm-lens/dist/clients/stale-marker.js +1 -0
  696. package/extensions/dm-lens/dist/clients/startup-scan.js +222 -0
  697. package/extensions/dm-lens/dist/clients/startup-timing.js +67 -0
  698. package/extensions/dm-lens/dist/clients/string-utils.js +6 -0
  699. package/extensions/dm-lens/dist/clients/subagent-mode.js +40 -0
  700. package/extensions/dm-lens/dist/clients/symbol-containment.js +16 -0
  701. package/extensions/dm-lens/dist/clients/symbol-types.js +1 -0
  702. package/extensions/dm-lens/dist/clients/test-runner-client.js +1504 -0
  703. package/extensions/dm-lens/dist/clients/test-runner-delivery.js +260 -0
  704. package/extensions/dm-lens/dist/clients/todo-scanner.js +164 -0
  705. package/extensions/dm-lens/dist/clients/tool-agreement.js +377 -0
  706. package/extensions/dm-lens/dist/clients/tool-config.js +218 -0
  707. package/extensions/dm-lens/dist/clients/tool-cwd.js +235 -0
  708. package/extensions/dm-lens/dist/clients/tool-definition.js +22 -0
  709. package/extensions/dm-lens/dist/clients/tool-event.js +18 -0
  710. package/extensions/dm-lens/dist/clients/tool-policy.js +2393 -0
  711. package/extensions/dm-lens/dist/clients/tool-probe.js +5 -0
  712. package/extensions/dm-lens/dist/clients/tool-render.js +79 -0
  713. package/extensions/dm-lens/dist/clients/tool-set-policy.js +70 -0
  714. package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +206 -0
  715. package/extensions/dm-lens/dist/clients/tree-sitter-client.js +2787 -0
  716. package/extensions/dm-lens/dist/clients/tree-sitter-logger.js +77 -0
  717. package/extensions/dm-lens/dist/clients/tree-sitter-navigator.js +198 -0
  718. package/extensions/dm-lens/dist/clients/tree-sitter-query-loader.js +318 -0
  719. package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +87 -0
  720. package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +957 -0
  721. package/extensions/dm-lens/dist/clients/trivy-client.js +305 -0
  722. package/extensions/dm-lens/dist/clients/tui-fit.js +26 -0
  723. package/extensions/dm-lens/dist/clients/turn-context.js +48 -0
  724. package/extensions/dm-lens/dist/clients/turn-end/lane.js +1 -0
  725. package/extensions/dm-lens/dist/clients/turn-end/lanes/govulncheck.js +54 -0
  726. package/extensions/dm-lens/dist/clients/turn-end/lanes/secrets.js +131 -0
  727. package/extensions/dm-lens/dist/clients/turn-summary-render.js +56 -0
  728. package/extensions/dm-lens/dist/clients/turn-summary.js +84 -0
  729. package/extensions/dm-lens/dist/clients/typos-config.js +9 -0
  730. package/extensions/dm-lens/dist/clients/user-notify.js +15 -0
  731. package/extensions/dm-lens/dist/clients/vanished-instance-marker.js +18 -0
  732. package/extensions/dm-lens/dist/clients/warm-attach.js +210 -0
  733. package/extensions/dm-lens/dist/clients/widget-state.js +963 -0
  734. package/extensions/dm-lens/dist/clients/word-index-logger.js +21 -0
  735. package/extensions/dm-lens/dist/clients/word-index-store.js +222 -0
  736. package/extensions/dm-lens/dist/clients/word-index.js +1426 -0
  737. package/extensions/dm-lens/dist/clients/workspace-topology.js +261 -0
  738. package/extensions/dm-lens/dist/clients/write-ordering-guard.js +24 -0
  739. package/extensions/dm-lens/dist/clients/zizmor-config.js +160 -0
  740. package/extensions/dm-lens/dist/i18n.js +67 -0
  741. package/extensions/dm-lens/dist/index.js +1782 -0
  742. package/extensions/dm-lens/dist/mcp/analyze-cli.js +178 -0
  743. package/extensions/dm-lens/dist/mcp/build-staleness.js +55 -0
  744. package/extensions/dm-lens/dist/mcp/cli.js +78 -0
  745. package/extensions/dm-lens/dist/mcp/server.js +1208 -0
  746. package/extensions/dm-lens/dist/mcp/worker.js +33 -0
  747. package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +256 -0
  748. package/extensions/dm-lens/dist/scripts/lib/skills-predicate.mjs +53 -0
  749. package/extensions/dm-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +45 -0
  750. package/extensions/dm-lens/dist/tools/activate-tools.js +61 -0
  751. package/extensions/dm-lens/dist/tools/ast-grep-outline.js +127 -0
  752. package/extensions/dm-lens/dist/tools/ast-grep-replace.js +226 -0
  753. package/extensions/dm-lens/dist/tools/ast-grep-search.js +687 -0
  754. package/extensions/dm-lens/dist/tools/effective-config.js +59 -0
  755. package/extensions/dm-lens/dist/tools/lens-diagnostic-mark.js +240 -0
  756. package/extensions/dm-lens/dist/tools/lens-diagnostics.js +1484 -0
  757. package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +1088 -0
  758. package/extensions/dm-lens/dist/tools/lsp-navigation.js +1194 -0
  759. package/extensions/dm-lens/dist/tools/lsp-structured-output.js +277 -0
  760. package/extensions/dm-lens/dist/tools/module-report.js +332 -0
  761. package/extensions/dm-lens/dist/tools/project-report.js +72 -0
  762. package/extensions/dm-lens/dist/tools/render-compact.js +272 -0
  763. package/extensions/dm-lens/dist/tools/scan-progress.js +31 -0
  764. package/extensions/dm-lens/dist/tools/shared.js +26 -0
  765. package/extensions/dm-lens/dist/tools/symbol-search.js +133 -0
  766. package/extensions/dm-lens/index.js +278 -101
  767. package/extensions/dm-lens/mcp/analyze-cli.js +3 -2
  768. package/extensions/dm-lens/mcp/build-staleness.js +1 -1
  769. package/extensions/dm-lens/mcp/server.js +144 -73
  770. package/extensions/dm-lens/package.json +4 -4
  771. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
  772. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
  773. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
  774. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
  775. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
  776. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
  777. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
  778. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
  779. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
  780. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
  781. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
  782. package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
  783. package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
  784. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-cross-language-method.yml +3 -3
  785. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-hallucinated-import.yml +2 -2
  786. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-sql-injection.yml +12 -2
  787. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
  788. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/sql-injection.yml +23 -7
  789. package/extensions/dm-lens/rules/typos/_typos.toml +4 -2
  790. package/extensions/dm-lens/scripts/lib/process-scan.mjs +1 -1
  791. package/extensions/dm-lens/scripts/lib/skills-predicate.mjs +53 -0
  792. package/extensions/dm-lens/scripts/lib/web-tree-sitter-dir.mjs +45 -0
  793. package/extensions/dm-lens/skills/pi-lens-ast-grep/SKILL.md +23 -6
  794. package/extensions/dm-lens/skills/pi-lens-lsp-navigation/SKILL.md +26 -9
  795. package/extensions/dm-lens/tools/activate-tools.js +10 -7
  796. package/extensions/dm-lens/tools/ast-grep-outline.js +2 -6
  797. package/extensions/dm-lens/tools/ast-grep-replace.js +5 -16
  798. package/extensions/dm-lens/tools/ast-grep-search.js +83 -38
  799. package/extensions/dm-lens/tools/effective-config.js +5 -4
  800. package/extensions/dm-lens/tools/lens-diagnostic-mark.js +5 -3
  801. package/extensions/dm-lens/tools/lens-diagnostics.js +478 -106
  802. package/extensions/dm-lens/tools/lsp-diagnostics.js +317 -172
  803. package/extensions/dm-lens/tools/lsp-navigation.js +26 -56
  804. package/extensions/dm-lens/tools/lsp-structured-output.js +3 -3
  805. package/extensions/dm-lens/tools/module-report.js +5 -5
  806. package/extensions/dm-lens/tools/project-report.js +9 -15
  807. package/extensions/dm-lens/tools/render-compact.js +220 -1
  808. package/extensions/dm-lens/tools/symbol-search.js +3 -5
  809. package/extensions/dm-mcp-adapter/OAUTH.md +368 -2
  810. package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +1 -1
  811. package/extensions/dm-mcp-adapter/agent-plugin-loader.js +73 -30
  812. package/extensions/dm-mcp-adapter/agent-plugin-provenance.js +26 -0
  813. package/extensions/dm-mcp-adapter/bearer-command-resolver.js +182 -0
  814. package/extensions/dm-mcp-adapter/claude-plugin-loader.js +350 -0
  815. package/extensions/dm-mcp-adapter/cli.js +82 -5
  816. package/extensions/dm-mcp-adapter/commands.js +89 -15
  817. package/extensions/dm-mcp-adapter/config.js +283 -33
  818. package/extensions/dm-mcp-adapter/consent-manager.js +32 -8
  819. package/extensions/dm-mcp-adapter/direct-tool-surface.js +223 -0
  820. package/extensions/dm-mcp-adapter/direct-tools.js +21 -216
  821. package/extensions/dm-mcp-adapter/dist/abort.js +35 -0
  822. package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +73 -30
  823. package/extensions/dm-mcp-adapter/dist/agent-plugin-provenance.js +26 -0
  824. package/extensions/dm-mcp-adapter/dist/bearer-command-resolver.js +182 -0
  825. package/extensions/dm-mcp-adapter/dist/claude-plugin-loader.js +350 -0
  826. package/extensions/dm-mcp-adapter/dist/config.js +283 -33
  827. package/extensions/dm-mcp-adapter/dist/consent-manager.js +84 -0
  828. package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +308 -0
  829. package/extensions/dm-mcp-adapter/dist/errors.js +225 -0
  830. package/extensions/dm-mcp-adapter/dist/http-ca.js +71 -0
  831. package/extensions/dm-mcp-adapter/dist/jev-client.js +359 -0
  832. package/extensions/dm-mcp-adapter/dist/jev-contracts.js +1 -0
  833. package/extensions/dm-mcp-adapter/dist/jev-key-store.js +176 -0
  834. package/extensions/dm-mcp-adapter/dist/json-schema-validator.js +70 -0
  835. package/extensions/dm-mcp-adapter/dist/lifecycle.js +387 -0
  836. package/extensions/dm-mcp-adapter/dist/logger.js +115 -0
  837. package/extensions/dm-mcp-adapter/dist/mcp-auth-fetch.js +86 -0
  838. package/extensions/dm-mcp-adapter/dist/mcp-auth-flow.js +949 -0
  839. package/extensions/dm-mcp-adapter/dist/mcp-auth.js +997 -0
  840. package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +7 -136
  841. package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +381 -0
  842. package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +524 -0
  843. package/extensions/dm-mcp-adapter/dist/mcp-probe.js +151 -0
  844. package/extensions/dm-mcp-adapter/dist/mcp-tasks.js +300 -0
  845. package/extensions/dm-mcp-adapter/dist/mcp-trace.js +215 -0
  846. package/extensions/dm-mcp-adapter/dist/metadata-cache.js +10 -28
  847. package/extensions/dm-mcp-adapter/dist/npx-resolver.js +465 -0
  848. package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +5 -16
  849. package/extensions/dm-mcp-adapter/dist/request-headers-command.js +294 -0
  850. package/extensions/dm-mcp-adapter/dist/runtime-owner.js +94 -0
  851. package/extensions/dm-mcp-adapter/dist/sampling-handler.js +213 -0
  852. package/extensions/dm-mcp-adapter/dist/secure-keyring.js +191 -0
  853. package/extensions/dm-mcp-adapter/dist/server-manager.js +1514 -0
  854. package/extensions/dm-mcp-adapter/dist/session-approvals.js +127 -0
  855. package/extensions/dm-mcp-adapter/dist/session-recovery.js +82 -0
  856. package/extensions/dm-mcp-adapter/dist/state.js +1 -0
  857. package/extensions/dm-mcp-adapter/dist/types.js +39 -0
  858. package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +204 -0
  859. package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +83 -0
  860. package/extensions/dm-mcp-adapter/dist/utils.js +84 -9
  861. package/extensions/dm-mcp-adapter/elicitation-handler.js +27 -22
  862. package/extensions/dm-mcp-adapter/host-html-template.js +17 -18
  863. package/extensions/dm-mcp-adapter/http-ca.js +71 -0
  864. package/extensions/dm-mcp-adapter/index.js +904 -167
  865. package/extensions/dm-mcp-adapter/init.js +53 -42
  866. package/extensions/dm-mcp-adapter/jev-client.js +359 -0
  867. package/extensions/dm-mcp-adapter/jev-contracts.js +0 -0
  868. package/extensions/dm-mcp-adapter/jev-key-store.js +176 -0
  869. package/extensions/dm-mcp-adapter/json-schema-validator.js +19 -2
  870. package/extensions/dm-mcp-adapter/lazy-loader.js +7 -0
  871. package/extensions/dm-mcp-adapter/lifecycle.js +8 -3
  872. package/extensions/dm-mcp-adapter/mcp-auth-fetch.js +86 -0
  873. package/extensions/dm-mcp-adapter/mcp-auth-flow.js +228 -75
  874. package/extensions/dm-mcp-adapter/mcp-auth.js +312 -47
  875. package/extensions/dm-mcp-adapter/mcp-bearer-store.js +7 -136
  876. package/extensions/dm-mcp-adapter/mcp-code.js +151 -20
  877. package/extensions/dm-mcp-adapter/mcp-install.js +40 -0
  878. package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +52 -8
  879. package/extensions/dm-mcp-adapter/mcp-output-guard.js +42 -43
  880. package/extensions/dm-mcp-adapter/mcp-panel-theme.js +79 -0
  881. package/extensions/dm-mcp-adapter/mcp-panel.js +294 -286
  882. package/extensions/dm-mcp-adapter/mcp-references.js +13 -18
  883. package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +5 -1
  884. package/extensions/dm-mcp-adapter/mcp-setup-panel.js +317 -282
  885. package/extensions/dm-mcp-adapter/mcp-status.js +2 -0
  886. package/extensions/dm-mcp-adapter/mcp-tasks.js +309 -0
  887. package/extensions/dm-mcp-adapter/metadata-cache.js +11 -28
  888. package/extensions/dm-mcp-adapter/namespace-tools.js +43 -7
  889. package/extensions/dm-mcp-adapter/oauth.js +1 -1
  890. package/extensions/dm-mcp-adapter/package-mcp-loader.js +5 -16
  891. package/extensions/dm-mcp-adapter/package.json +4 -1
  892. package/extensions/dm-mcp-adapter/prompts.js +31 -4
  893. package/extensions/dm-mcp-adapter/proxy-modes.js +394 -199
  894. package/extensions/dm-mcp-adapter/request-headers-command.js +3 -2
  895. package/extensions/dm-mcp-adapter/runtime-owner.js +16 -1
  896. package/extensions/dm-mcp-adapter/sampling-handler.js +16 -25
  897. package/extensions/dm-mcp-adapter/sandbox-proxy-template.js +14 -90
  898. package/extensions/dm-mcp-adapter/search-ranking.js +31 -6
  899. package/extensions/dm-mcp-adapter/secure-keyring.js +191 -0
  900. package/extensions/dm-mcp-adapter/semantic-search.js +160 -0
  901. package/extensions/dm-mcp-adapter/server-manager.js +406 -117
  902. package/extensions/dm-mcp-adapter/session-approvals.js +127 -0
  903. package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +11 -1
  904. package/extensions/dm-mcp-adapter/test-runner.mjs +3 -4
  905. package/extensions/dm-mcp-adapter/tool-approval.js +32 -22
  906. package/extensions/dm-mcp-adapter/tool-metadata.js +18 -11
  907. package/extensions/dm-mcp-adapter/tool-registrar.js +7 -4
  908. package/extensions/dm-mcp-adapter/tool-result-renderer.js +4 -2
  909. package/extensions/dm-mcp-adapter/types.js +39 -0
  910. package/extensions/dm-mcp-adapter/ui-server.js +51 -36
  911. package/extensions/dm-mcp-adapter/ui-session.js +57 -25
  912. package/extensions/dm-mcp-adapter/utils.js +84 -9
  913. package/extensions/dm-ponytail/hooks/cursor-hooks.json +17 -0
  914. package/extensions/dm-ponytail/hooks/ponytail-activate.js +14 -2
  915. package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +21 -2
  916. package/extensions/dm-ponytail/hooks/ponytail-runtime.js +23 -0
  917. package/extensions/dm-ponytail/package.json +1 -1
  918. package/extensions/dm-subagents/agents/claude-code-writer.md +1 -0
  919. package/extensions/dm-subagents/agents/codex-exec-writer.md +1 -0
  920. package/extensions/dm-subagents/agents/cursor-agent-writer.md +1 -0
  921. package/extensions/dm-subagents/agents/evidence-auditor.md +34 -0
  922. package/extensions/dm-subagents/agents/researcher.md +23 -13
  923. package/extensions/dm-subagents/agents/reviewer.md +6 -4
  924. package/extensions/dm-subagents/agents/scout.md +1 -1
  925. package/extensions/dm-subagents/agents/worker.md +3 -2
  926. package/extensions/dm-subagents/index.js +3 -2
  927. package/extensions/dm-subagents/inspector-runner.mjs +2 -2
  928. package/extensions/dm-subagents/install.mjs +1 -2
  929. package/extensions/dm-subagents/package.json +35 -1
  930. package/extensions/dm-subagents/prompts/council.md +6 -3
  931. package/extensions/dm-subagents/prompts/parallel-review.md +1 -1
  932. package/extensions/dm-subagents/runner-peer-loader.mjs +18 -0
  933. package/extensions/dm-subagents/runner-peer-preload.mjs +29 -0
  934. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +35 -22
  935. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +9 -5
  936. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +40 -19
  937. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +6 -6
  938. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +11 -1
  939. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +35 -30
  940. package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +3 -3
  941. package/extensions/dm-subagents/src/agents/advertised-agent-prompt.js +70 -0
  942. package/extensions/dm-subagents/src/agents/agent-management.js +276 -172
  943. package/extensions/dm-subagents/src/agents/agent-memory.js +92 -3
  944. package/extensions/dm-subagents/src/agents/agent-serializer.js +17 -8
  945. package/extensions/dm-subagents/src/agents/agents.js +389 -207
  946. package/extensions/dm-subagents/src/agents/builtin-names.js +1 -0
  947. package/extensions/dm-subagents/src/agents/chain-serializer.js +7 -0
  948. package/extensions/dm-subagents/src/agents/global-npm-root.js +47 -0
  949. package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -1
  950. package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +17 -13
  951. package/extensions/dm-subagents/src/agents/skills.js +36 -10
  952. package/extensions/dm-subagents/src/api/capability-ceiling.js +0 -1
  953. package/extensions/dm-subagents/src/api/child-tool-plan.js +3 -0
  954. package/extensions/dm-subagents/src/api/preflight.js +75 -64
  955. package/extensions/dm-subagents/src/api/required-child-extensions.js +3 -0
  956. package/extensions/dm-subagents/src/api/workflow-resources.js +1 -0
  957. package/extensions/dm-subagents/src/extension/config.js +27 -18
  958. package/extensions/dm-subagents/src/extension/doctor.js +10 -13
  959. package/extensions/dm-subagents/src/extension/fanout-child.js +91 -14
  960. package/extensions/dm-subagents/src/extension/herdr-dm-bridge.js +258 -0
  961. package/extensions/dm-subagents/src/extension/index.js +202 -66
  962. package/extensions/dm-subagents/src/extension/public-execution.js +55 -4
  963. package/extensions/dm-subagents/src/extension/rpc.js +18 -27
  964. package/extensions/dm-subagents/src/extension/schemas.js +99 -84
  965. package/extensions/dm-subagents/src/extension/subagent-guide.js +14 -3
  966. package/extensions/dm-subagents/src/extension/tool-activation.js +157 -0
  967. package/extensions/dm-subagents/src/extension/tool-description.js +30 -78
  968. package/extensions/dm-subagents/src/inspectors/actions.js +145 -0
  969. package/extensions/dm-subagents/src/inspectors/ghostty/actions.js +60 -0
  970. package/extensions/dm-subagents/src/inspectors/ghostty/plugin.js +17 -0
  971. package/extensions/dm-subagents/src/inspectors/herdr/actions.js +94 -179
  972. package/extensions/dm-subagents/src/inspectors/herdr/plugin.js +13 -0
  973. package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +1 -1
  974. package/extensions/dm-subagents/src/inspectors/{herdr/inspector-runner.js → inspector-runner.js} +31 -25
  975. package/extensions/dm-subagents/src/inspectors/plugins.js +5 -0
  976. package/extensions/dm-subagents/src/inspectors/{herdr/session-roots-codec.js → session-roots-codec.js} +1 -6
  977. package/extensions/dm-subagents/src/inspectors/types.js +1 -0
  978. package/extensions/dm-subagents/src/integrations/dm-web-session-liveness.js +50 -0
  979. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +39 -5
  980. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +256 -151
  981. package/extensions/dm-subagents/src/intercom/result-intercom.js +6 -0
  982. package/extensions/dm-subagents/src/intercom/supervisor-ui.js +199 -0
  983. package/extensions/dm-subagents/src/missions/workflow-state.js +30 -17
  984. package/extensions/dm-subagents/src/policy/authority.js +6 -2
  985. package/extensions/dm-subagents/src/profiles/profiles.js +10 -5
  986. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +28 -35
  987. package/extensions/dm-subagents/src/runs/background/active-run-index.js +17 -0
  988. package/extensions/dm-subagents/src/runs/background/async-execution.js +580 -389
  989. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +71 -47
  990. package/extensions/dm-subagents/src/runs/background/async-resume.js +61 -26
  991. package/extensions/dm-subagents/src/runs/background/async-retention.js +8 -0
  992. package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +3 -4
  993. package/extensions/dm-subagents/src/runs/background/async-status.js +90 -13
  994. package/extensions/dm-subagents/src/runs/background/auto-drain.js +57 -33
  995. package/extensions/dm-subagents/src/runs/background/binary-bootstrap.js +54 -0
  996. package/extensions/dm-subagents/src/runs/background/chain-append.js +1 -1
  997. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +11 -27
  998. package/extensions/dm-subagents/src/runs/background/control-channel.js +105 -256
  999. package/extensions/dm-subagents/src/runs/background/fleet-view.js +67 -10
  1000. package/extensions/dm-subagents/src/runs/background/notify.js +252 -17
  1001. package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +33 -2
  1002. package/extensions/dm-subagents/src/runs/background/process-terminal-candidate.js +88 -0
  1003. package/extensions/dm-subagents/src/runs/background/process-terminal.js +29 -87
  1004. package/extensions/dm-subagents/src/runs/background/result-files.js +8 -4
  1005. package/extensions/dm-subagents/src/runs/background/result-watcher.js +15 -3
  1006. package/extensions/dm-subagents/src/runs/background/retained-children.js +3 -2
  1007. package/extensions/dm-subagents/src/runs/background/retained-nested-route-tracker.js +86 -0
  1008. package/extensions/dm-subagents/src/runs/background/run-child-session.js +574 -0
  1009. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +9 -5
  1010. package/extensions/dm-subagents/src/runs/background/run-status.js +114 -11
  1011. package/extensions/dm-subagents/src/runs/background/runner-aliases.js +129 -0
  1012. package/extensions/dm-subagents/src/runs/background/runner-child-launch.js +62 -0
  1013. package/extensions/dm-subagents/src/runs/background/runner-child-sessions.js +16 -0
  1014. package/extensions/dm-subagents/src/runs/background/runner-http-dispatcher.js +84 -0
  1015. package/extensions/dm-subagents/src/runs/background/runner-startup-failure.js +43 -0
  1016. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +119 -20
  1017. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +33 -10
  1018. package/extensions/dm-subagents/src/runs/background/steering.js +24 -3
  1019. package/extensions/dm-subagents/src/runs/background/subagent-runner-bootstrap.js +238 -0
  1020. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +1008 -1344
  1021. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +156 -26
  1022. package/extensions/dm-subagents/src/runs/background/wait-completions.js +91 -23
  1023. package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +10 -3
  1024. package/extensions/dm-subagents/src/runs/background/wait-tool.js +8 -12
  1025. package/extensions/dm-subagents/src/runs/background/workflow-terminal-proof.js +60 -0
  1026. package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +29 -26
  1027. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +94 -2
  1028. package/extensions/dm-subagents/src/runs/foreground/execution.js +446 -648
  1029. package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +4 -0
  1030. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +5 -2
  1031. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +8 -4
  1032. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +1337 -445
  1033. package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +10 -5
  1034. package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +65 -90
  1035. package/extensions/dm-subagents/src/runs/shared/acceptance.js +265 -68
  1036. package/extensions/dm-subagents/src/runs/shared/agent-contract.js +1 -1
  1037. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +133 -76
  1038. package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +4 -2
  1039. package/extensions/dm-subagents/src/runs/shared/child-hooks.js +166 -0
  1040. package/extensions/dm-subagents/src/runs/shared/child-identity.js +10 -2
  1041. package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +19 -2
  1042. package/extensions/dm-subagents/src/runs/shared/child-launch.js +212 -0
  1043. package/extensions/dm-subagents/src/runs/shared/child-lifecycle.js +22 -0
  1044. package/extensions/dm-subagents/src/runs/shared/child-runtime-config.js +31 -0
  1045. package/extensions/dm-subagents/src/runs/shared/child-session.js +378 -0
  1046. package/extensions/dm-subagents/src/runs/shared/child-tool-plan.js +299 -0
  1047. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +1 -1
  1048. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +148 -32
  1049. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +6 -4
  1050. package/extensions/dm-subagents/src/runs/shared/effective-system-prompt.js +19 -0
  1051. package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +6 -1
  1052. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +14 -2
  1053. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +6 -7
  1054. package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +60 -0
  1055. package/extensions/dm-subagents/src/runs/shared/git-environment.js +25 -0
  1056. package/extensions/dm-subagents/src/runs/shared/herdr-connection.js +341 -0
  1057. package/extensions/dm-subagents/src/runs/shared/herdr-dm-protocol.js +60 -0
  1058. package/extensions/dm-subagents/src/runs/shared/herdr-external-adapters.js +555 -0
  1059. package/extensions/dm-subagents/src/runs/shared/herdr-machine.js +239 -0
  1060. package/extensions/dm-subagents/src/runs/shared/herdr-placed-run.js +987 -0
  1061. package/extensions/dm-subagents/src/runs/shared/host-step-status.js +2 -0
  1062. package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +23 -3
  1063. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +4 -3
  1064. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +15 -5
  1065. package/extensions/dm-subagents/src/runs/shared/model-resolution-diagnostic.js +43 -0
  1066. package/extensions/dm-subagents/src/runs/shared/{model-fallback.js → model-resolution.js} +44 -128
  1067. package/extensions/dm-subagents/src/runs/shared/nested-events.js +39 -49
  1068. package/extensions/dm-subagents/src/runs/shared/nested-path.js +0 -13
  1069. package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +22 -12
  1070. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +78 -2
  1071. package/extensions/dm-subagents/src/runs/shared/permissions.js +1 -16
  1072. package/extensions/dm-subagents/src/runs/shared/process-signal.js +3 -0
  1073. package/extensions/dm-subagents/src/runs/shared/readonly-drain-observation.js +51 -0
  1074. package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +0 -13
  1075. package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +0 -26
  1076. package/extensions/dm-subagents/src/runs/shared/single-output.js +20 -2
  1077. package/extensions/dm-subagents/src/runs/shared/structured-output.js +263 -10
  1078. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +6 -14
  1079. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +117 -370
  1080. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +12 -50
  1081. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +10 -13
  1082. package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +1 -1
  1083. package/extensions/dm-subagents/src/runs/shared/usage-reconciliation.js +69 -0
  1084. package/extensions/dm-subagents/src/runs/shared/workflow-async-child-guidance.js +11 -0
  1085. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +30 -10
  1086. package/extensions/dm-subagents/src/runs/shared/worktree-setup-command.js +195 -0
  1087. package/extensions/dm-subagents/src/runs/shared/worktree.js +814 -141
  1088. package/extensions/dm-subagents/src/shared/atomic-json.js +2 -1
  1089. package/extensions/dm-subagents/src/shared/child-cache-retention.js +19 -0
  1090. package/extensions/dm-subagents/src/shared/fork-context.js +40 -77
  1091. package/extensions/dm-subagents/src/shared/fork-session-cwd.js +24 -0
  1092. package/extensions/dm-subagents/src/shared/jsonl-writer.js +8 -0
  1093. package/extensions/dm-subagents/src/shared/launch-contract.js +37 -6
  1094. package/extensions/dm-subagents/src/shared/model-response-aliases.js +15 -0
  1095. package/extensions/dm-subagents/src/shared/opencode-session-headers.js +15 -0
  1096. package/extensions/dm-subagents/src/shared/pruned-fork.js +83 -76
  1097. package/extensions/dm-subagents/src/shared/required-child-extensions.js +72 -0
  1098. package/extensions/dm-subagents/src/shared/shortcuts.js +0 -2
  1099. package/extensions/dm-subagents/src/shared/thinking-ceiling.js +0 -6
  1100. package/extensions/dm-subagents/src/shared/types.js +16 -12
  1101. package/extensions/dm-subagents/src/shared/utils.js +22 -7
  1102. package/extensions/dm-subagents/src/shared/watch-strategy.js +2 -0
  1103. package/extensions/dm-subagents/src/shared/workflow-child-permit.js +70 -0
  1104. package/extensions/dm-subagents/src/slash/delegation-adapters.js +15 -1
  1105. package/extensions/dm-subagents/src/slash/delegation-request.js +13 -0
  1106. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +28 -1
  1107. package/extensions/dm-subagents/src/slash/prompt-workflows.js +15 -2
  1108. package/extensions/dm-subagents/src/slash/slash-commands.js +12 -269
  1109. package/extensions/dm-subagents/src/slash/subagent-cost.js +255 -0
  1110. package/extensions/dm-subagents/src/slash/subagents-admin.js +49 -25
  1111. package/extensions/dm-subagents/src/tui/fleet-status.js +224 -23
  1112. package/extensions/dm-subagents/src/tui/fleet.js +38 -25
  1113. package/extensions/dm-subagents/src/tui/render.js +636 -63
  1114. package/extensions/dm-subagents/src/watchdog/child-status.js +42 -23
  1115. package/extensions/dm-subagents/src/watchdog/diff-tool.js +86 -0
  1116. package/extensions/dm-subagents/src/watchdog/emission-guard.js +4 -3
  1117. package/extensions/dm-subagents/src/watchdog/guidance.js +19 -0
  1118. package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +1 -1
  1119. package/extensions/dm-subagents/src/watchdog/model-selection.js +18 -1
  1120. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +16 -10
  1121. package/extensions/dm-subagents/src/watchdog/register-child.js +39 -26
  1122. package/extensions/dm-subagents/src/watchdog/register-main.js +51 -43
  1123. package/extensions/dm-subagents/src/watchdog/render.js +5 -7
  1124. package/extensions/dm-subagents/src/watchdog/review.js +142 -67
  1125. package/extensions/dm-subagents/src/watchdog/rules.js +55 -0
  1126. package/extensions/dm-subagents/src/watchdog/runtime.js +167 -109
  1127. package/extensions/dm-subagents/src/watchdog/scope.js +1 -9
  1128. package/extensions/dm-subagents/src/watchdog/settings.js +55 -99
  1129. package/extensions/dm-subagents/src/watchdog/tool-actions.js +11 -12
  1130. package/extensions/dm-subagents/src/watchdog/turn-delta.js +30 -5
  1131. package/extensions/dm-subagents/src/watchdog/types.js +2 -4
  1132. package/extensions/dm-subagents/src/watchdog/warning-format.js +2 -3
  1133. package/extensions/dm-subagents/src/workflows/chat-progress.js +4 -4
  1134. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +482 -36
  1135. package/extensions/dm-subagents/src/workflows/workflow-checklist.js +303 -0
  1136. package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +57 -5
  1137. package/extensions/dm-subagents/src/workflows/workflow-preflight.js +27 -1
  1138. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +51 -3
  1139. package/extensions/dm-subagents/src/workflows/workflow-resources.js +226 -0
  1140. package/extensions/dm-subagents/src/workflows/workflow-settlement.js +5 -0
  1141. package/extensions/dm-web-access/abortable.js +19 -0
  1142. package/extensions/dm-web-access/anysearch.js +4 -13
  1143. package/extensions/dm-web-access/baizhi.js +123 -0
  1144. package/extensions/dm-web-access/bocha.js +3 -24
  1145. package/extensions/dm-web-access/brave.js +3 -23
  1146. package/extensions/dm-web-access/brightdata.js +5 -30
  1147. package/extensions/dm-web-access/content-find.js +181 -47
  1148. package/extensions/dm-web-access/crawl4ai.js +166 -0
  1149. package/extensions/dm-web-access/credential-source.js +1 -0
  1150. package/extensions/dm-web-access/curator-page.js +27 -2
  1151. package/extensions/dm-web-access/curator-run.js +36 -0
  1152. package/extensions/dm-web-access/curator-server.js +11 -2
  1153. package/extensions/dm-web-access/domain-filter-normalization.js +17 -0
  1154. package/extensions/dm-web-access/duckduckgo.js +4 -24
  1155. package/extensions/dm-web-access/extract.js +54 -12
  1156. package/extensions/dm-web-access/fetch-params.js +1 -1
  1157. package/extensions/dm-web-access/firecrawl.js +7 -45
  1158. package/extensions/dm-web-access/gemini-search.js +101 -46
  1159. package/extensions/dm-web-access/github-extract.js +2 -11
  1160. package/extensions/dm-web-access/index.js +382 -247
  1161. package/extensions/dm-web-access/jina-search.js +4 -13
  1162. package/extensions/dm-web-access/kagi.js +4 -13
  1163. package/extensions/dm-web-access/kimi-search.js +5 -30
  1164. package/extensions/dm-web-access/mistral-search.js +251 -0
  1165. package/extensions/dm-web-access/ollama.js +2 -7
  1166. package/extensions/dm-web-access/openai-search.js +204 -46
  1167. package/extensions/dm-web-access/opencode-session-headers.js +15 -0
  1168. package/extensions/dm-web-access/package.json +1 -1
  1169. package/extensions/dm-web-access/page-query.js +14 -4
  1170. package/extensions/dm-web-access/parallel.js +1 -17
  1171. package/extensions/dm-web-access/pdf-extract.js +1 -0
  1172. package/extensions/dm-web-access/perplexity.js +10 -1
  1173. package/extensions/dm-web-access/querit.js +5 -34
  1174. package/extensions/dm-web-access/query-rewrite.js +6 -2
  1175. package/extensions/dm-web-access/search-answer-formatting.js +6 -0
  1176. package/extensions/dm-web-access/search-result-count-normalization.js +5 -0
  1177. package/extensions/dm-web-access/search1api.js +5 -34
  1178. package/extensions/dm-web-access/searchinfinity.js +5 -34
  1179. package/extensions/dm-web-access/searxng.js +3 -23
  1180. package/extensions/dm-web-access/serpapi.js +183 -0
  1181. package/extensions/dm-web-access/serpbase.js +3 -24
  1182. package/extensions/dm-web-access/serpdive.js +3 -23
  1183. package/extensions/dm-web-access/serper.js +5 -30
  1184. package/extensions/dm-web-access/serply.js +184 -0
  1185. package/extensions/dm-web-access/source-check.js +10 -46
  1186. package/extensions/dm-web-access/ssrf-protection.js +3 -1
  1187. package/extensions/dm-web-access/storage.js +9 -0
  1188. package/extensions/dm-web-access/summary-review.js +36 -25
  1189. package/extensions/dm-web-access/tavily.js +3 -23
  1190. package/extensions/dm-web-access/tinyfish.js +5 -34
  1191. package/extensions/dm-web-access/tool-activation.js +112 -0
  1192. package/extensions/dm-web-access/utils.js +27 -10
  1193. package/extensions/dm-web-access/valyu.js +5 -30
  1194. package/extensions/dm-web-access/xai-search.js +78 -42
  1195. package/extensions/dm-web-access/xcrawl.js +5 -30
  1196. package/package.json +7 -4
  1197. package/extensions/dm-lens/tools/ast-dump.js +0 -101
  1198. package/extensions/dm-subagents/src/api/dm-args.js +0 -3
  1199. package/extensions/dm-subagents/src/runs/shared/child-protocol.js +0 -447
  1200. package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +0 -40
  1201. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +0 -173
  1202. package/extensions/dm-subagents/src/runs/shared/dm-args.js +0 -581
  1203. package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +0 -190
  1204. package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +0 -207
  1205. package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +0 -50
  1206. package/extensions/dm-subagents/src/runs/shared/task-intent.js +0 -130
  1207. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +0 -68
  1208. /package/extensions/dm-subagents/src/inspectors/{herdr/shell-command.js → shell-command.js} +0 -0
@@ -0,0 +1,2787 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ import * as crypto from "node:crypto";
3
+ import * as fs from "node:fs";
4
+ import { createRequire } from "node:module";
5
+ import * as path from "node:path";
6
+ import { getDegradationLedgerGeneration, incrementDegradationCount, recordDegradation, recordDegradationOnce } from "./degradation-ledger.js";
7
+ import { BoundedFifoMap } from "./bounded-cache.js";
8
+ import { loadWebTreeSitter } from "./deps/web-tree-sitter.js";
9
+ import { transientRetryDelayMs } from "./dispatch/runners/utils/availability-policy.js";
10
+ import { getProjectIgnoreMatcher, isExcludedDirName } from "./file-utils.js";
11
+ import { downloadGrammarDetailed, fileHasWasmMagic, grammarBlockReason, grammarFileSha256, isVendoredGrammar, LANGUAGE_TO_GRAMMAR, pinnedGrammarHash, vendoredGrammarRefusal, vendoredGrammarsDir } from "./grammar-source.js";
12
+ import { getPackageRoot, resolvePackagePath } from "./package-root.js";
13
+ import { resolveWebTreeSitterPackageDir } from "../scripts/lib/web-tree-sitter-dir.mjs";
14
+ import { assertInstallAllowed, getProjectTrustGeneration } from "./project-trust.js";
15
+ import { escapeRegExp } from "./string-utils.js";
16
+ import { logTreeSitterDiagnostic } from "./tree-sitter-logger.js";
17
+ import { notifyUserDegradation } from "./user-notify.js";
18
+ const _require = createRequire(import.meta.url);
19
+ import { createTreeCacheCounters, deriveScanTreeCacheCapacity, TreeCache } from "./tree-sitter-cache.js";
20
+ import { TreeSitterNavigator } from "./tree-sitter-navigator.js";
21
+ import { isProvenSqlAlchemySessionReceiver, isSafePsycopgIdentifierComposition, isSqlAlchemyEntityQueryArgument, isSqlAlchemyStatementArgument, PYTHON_SQLALCHEMY_RECEIVER_NAMES, PYTHON_SQLALCHEMY_STATEMENT_BUILDERS } from "./python-provenance.js";
22
+ import { TreeSitterQueryLoader } from "./tree-sitter-query-loader.js";
23
+ const TREE_SITTER_MAX_SCAN_FILES = 20000;
24
+ const QUERY_BATCH_MAX_LOAD_FAILURES = 3;
25
+ const NO_NESTED_ANCHOR_VISIT_CAP = 1e4;
26
+ const PYTHON_SQL_SINK_METHODS = new Set([
27
+ "execute",
28
+ "executemany",
29
+ "query",
30
+ "raw"
31
+ ]);
32
+ const TYPESCRIPT_SQL_KNOWN_PACKAGES = new Set([
33
+ "pg",
34
+ "mysql2",
35
+ "better-sqlite3",
36
+ "knex",
37
+ "@prisma/client"
38
+ ]);
39
+ const TYPESCRIPT_SQL_IMPORTS = new WeakMap;
40
+ const NOT_PARSED = { parsed: false };
41
+ function createParserCounters() {
42
+ return {
43
+ parserInvocations: 0,
44
+ parserDurationMs: 0,
45
+ parserFailures: 0
46
+ };
47
+ }
48
+ function grammarWriteBlockedReason(dir) {
49
+ let probe = dir;
50
+ while (!fs.existsSync(probe)) {
51
+ const parent = path.dirname(probe);
52
+ if (parent === probe)
53
+ return "ENOENT";
54
+ probe = parent;
55
+ }
56
+ try {
57
+ fs.accessSync(probe, fs.constants.W_OK);
58
+ return;
59
+ } catch (err) {
60
+ return err?.code ?? "EACCES";
61
+ }
62
+ }
63
+ function grammarFileStamp(filePath) {
64
+ try {
65
+ const stat = fs.statSync(filePath);
66
+ return stat.isFile() ? `${stat.size}:${stat.mtimeMs}` : undefined;
67
+ } catch {
68
+ return;
69
+ }
70
+ }
71
+ function isTreeSitterWasmAbortError(error) {
72
+ const message = error instanceof Error ? error.message : String(error);
73
+ return message.includes("Aborted") || message.includes("abort()");
74
+ }
75
+ const RESOLUTION_ERROR_CODES = new Set([
76
+ "ERR_MODULE_NOT_FOUND",
77
+ "MODULE_NOT_FOUND",
78
+ "ERR_INVALID_MODULE_SPECIFIER",
79
+ "ERR_UNSUPPORTED_DIR_IMPORT",
80
+ "ENOENT",
81
+ "EMFILE",
82
+ "EBUSY",
83
+ "EAGAIN",
84
+ "EPERM",
85
+ "ETXTBSY"
86
+ ]);
87
+ function collectErrorCodes(err) {
88
+ const codes = [];
89
+ let current = err;
90
+ const seen = new Set;
91
+ while (current instanceof Error && !seen.has(current)) {
92
+ seen.add(current);
93
+ const code = current.code;
94
+ if (typeof code === "string")
95
+ codes.push(code);
96
+ current = current.cause;
97
+ }
98
+ return codes;
99
+ }
100
+ function classifyWebTreeSitterLoadFailure(err) {
101
+ const codes = collectErrorCodes(err);
102
+ return codes.some((code) => RESOLUTION_ERROR_CODES.has(code)) ? "resolution" : "evaluation";
103
+ }
104
+
105
+ export class TreeSitterClient {
106
+ initialized = false;
107
+ initPromise = null;
108
+ webTreeSitterLoadFailed = false;
109
+ languages = new Map;
110
+ parsers = new Map;
111
+ treeCache;
112
+ navigator = new TreeSitterNavigator;
113
+ grammarsDir;
114
+ grammarEnsurePromises = new Map;
115
+ grammarRetryAtMs = new Map;
116
+ verifiedGrammarPaths = new Map;
117
+ decodeFailedGrammarPaths = new Map;
118
+ verifiedGrammarVersionAt = new Map;
119
+ staleGrammarVersionAt = new Map;
120
+ staleReportedGrammarPaths = new Set;
121
+ poisonedGrammarPaths = new Set;
122
+ grammarFailureAttempts = new Map;
123
+ grammarLastNotifiedDelayMs = new Map;
124
+ grammarNotificationsLedgerGen = getDegradationLedgerGeneration();
125
+ trustBlockedGrammarNotifications = new Set;
126
+ trustNotificationsGeneration = getProjectTrustGeneration();
127
+ ParserClass = null;
128
+ LanguageLoader = null;
129
+ static QUERY_CACHE_MAX_ENTRIES = 256;
130
+ static QUERY_BATCH_CACHE_MAX_ENTRIES = 256;
131
+ queryCache = new BoundedFifoMap(TreeSitterClient.QUERY_CACHE_MAX_ENTRIES);
132
+ queryBatchCache = new BoundedFifoMap(TreeSitterClient.QUERY_BATCH_CACHE_MAX_ENTRIES);
133
+ queryCacheCap() {
134
+ const value = Number.parseInt(process.env.DM_LENS_TREE_SITTER_QUERY_CACHE_CAP ?? "", 10);
135
+ return Number.isSafeInteger(value) && value > 0 ? value : TreeSitterClient.QUERY_CACHE_MAX_ENTRIES;
136
+ }
137
+ queryBatchCacheCap() {
138
+ const value = Number.parseInt(process.env.DM_LENS_TREE_SITTER_QUERY_BATCH_CACHE_CAP ?? "", 10);
139
+ return Number.isSafeInteger(value) && value > 0 ? value : TreeSitterClient.QUERY_BATCH_CACHE_MAX_ENTRIES;
140
+ }
141
+ cacheQuery(key, value) {
142
+ this.queryCache.delete(key);
143
+ const evicted = this.queryCache.setMaxEntries(this.queryCacheCap());
144
+ evicted.push(...this.queryCache.set(key, value));
145
+ for (const [, dropped] of evicted)
146
+ dropped?.query?.delete?.();
147
+ }
148
+ cacheQueryBatch(key, value) {
149
+ this.queryBatchCache.delete(key);
150
+ const evicted = this.queryBatchCache.setMaxEntries(this.queryBatchCacheCap());
151
+ evicted.push(...this.queryBatchCache.set(key, value));
152
+ for (const [, dropped] of evicted)
153
+ dropped?.query?.delete?.();
154
+ }
155
+ queryBatchLoadFailures = new Map;
156
+ queryLoader = new TreeSitterQueryLoader;
157
+ verbose;
158
+ parserCounters = createParserCounters();
159
+ parseCacheMeasurement = new AsyncLocalStorage;
160
+ activeMeasurements = 0;
161
+ onWasmAbort;
162
+ wasmAborted = false;
163
+ grammarDirResolutionDeps;
164
+ constructor(verbose = false, onWasmAbort, grammarDirResolutionDeps) {
165
+ this.grammarDirResolutionDeps = grammarDirResolutionDeps ?? {
166
+ resolveAsset: (asset) => this.resolveWebTreeSitterAsset(asset),
167
+ resolvePackage: (specifier) => _require.resolve(specifier),
168
+ packageRoot: () => getPackageRoot(import.meta.url),
169
+ cwd: () => process.cwd()
170
+ };
171
+ this.grammarsDir = this.findGrammarsDir();
172
+ this.verbose = verbose;
173
+ this.onWasmAbort = onWasmAbort;
174
+ this.treeCache = new TreeCache(50, verbose, 4096, (key, amount) => {
175
+ const measurement = this.parseCacheMeasurement.getStore();
176
+ if (measurement)
177
+ measurement[key] += amount;
178
+ }, (error) => this.reportWasmAbort(error));
179
+ }
180
+ recordParserCounter(key, amount = 1) {
181
+ this.parserCounters[key] += amount;
182
+ const measurement = this.parseCacheMeasurement.getStore();
183
+ if (measurement)
184
+ measurement[key] += amount;
185
+ }
186
+ reportWasmAbort(error) {
187
+ if (!isTreeSitterWasmAbortError(error))
188
+ return false;
189
+ if (!this.wasmAborted) {
190
+ this.wasmAborted = true;
191
+ recordDegradation({
192
+ kind: "wasm-abort",
193
+ subject: "web-tree-sitter",
194
+ reason: error instanceof Error ? error.message : String(error)
195
+ });
196
+ this.onWasmAbort?.();
197
+ }
198
+ return true;
199
+ }
200
+ getRuntimeStats() {
201
+ return {
202
+ languagesLoaded: this.languages.size,
203
+ parsersLoaded: this.parsers.size,
204
+ queryCacheSize: this.queryCache.size,
205
+ queryBatchCacheSize: this.queryBatchCache.size
206
+ };
207
+ }
208
+ getParseCacheStats() {
209
+ return {
210
+ ...this.treeCache.getStats(),
211
+ ...this.parserCounters
212
+ };
213
+ }
214
+ ensureTreeCacheCapacity(fileCount) {
215
+ this.treeCache.setMaxSize(deriveScanTreeCacheCapacity(fileCount, this.treeCache.getMaxSize()));
216
+ }
217
+ async withParseCacheMeasurement(work, onComplete) {
218
+ const measurement = {
219
+ ...createTreeCacheCounters(),
220
+ ...createParserCounters()
221
+ };
222
+ this.activeMeasurements++;
223
+ try {
224
+ return await this.parseCacheMeasurement.run(measurement, async () => {
225
+ try {
226
+ return await work();
227
+ } finally {
228
+ const cacheStats = this.treeCache.getStats();
229
+ try {
230
+ onComplete({
231
+ ...cacheStats,
232
+ ...measurement,
233
+ misses: measurement.lookups - measurement.hits
234
+ });
235
+ } catch {}
236
+ }
237
+ });
238
+ } finally {
239
+ if (--this.activeMeasurements === 0)
240
+ this.parseCacheMeasurement.disable();
241
+ }
242
+ }
243
+ dbg(msg) {
244
+ if (this.verbose) {
245
+ logTreeSitterDiagnostic({
246
+ subsystem: "tree-sitter-client",
247
+ level: "debug",
248
+ message: msg
249
+ });
250
+ }
251
+ }
252
+ webTreeSitterPackageDir() {
253
+ return resolveWebTreeSitterPackageDir({
254
+ resolve: (specifier) => this.grammarDirResolutionDeps.resolvePackage(specifier),
255
+ packageRoot: () => this.grammarDirResolutionDeps.packageRoot(),
256
+ cwd: () => this.grammarDirResolutionDeps.cwd()
257
+ });
258
+ }
259
+ resolveWebTreeSitterAsset(asset) {
260
+ try {
261
+ const resolved = this.grammarDirResolutionDeps.resolvePackage(`web-tree-sitter/${asset}`);
262
+ if (fs.existsSync(resolved))
263
+ return resolved;
264
+ } catch {}
265
+ const pkgDir = this.webTreeSitterPackageDir();
266
+ if (pkgDir) {
267
+ const candidate = path.join(pkgDir, asset);
268
+ if (fs.existsSync(candidate))
269
+ return candidate;
270
+ }
271
+ return;
272
+ }
273
+ _bundledGrammarsDir;
274
+ bundledGrammarsDir() {
275
+ if (this._bundledGrammarsDir)
276
+ return this._bundledGrammarsDir;
277
+ try {
278
+ const dir = resolvePackagePath(import.meta.url, "grammars");
279
+ if (fs.existsSync(dir))
280
+ this._bundledGrammarsDir = dir;
281
+ return this._bundledGrammarsDir;
282
+ } catch {
283
+ return;
284
+ }
285
+ }
286
+ _vendoredGrammarsDir;
287
+ vendoredGrammarsDir() {
288
+ if (this._vendoredGrammarsDir)
289
+ return this._vendoredGrammarsDir;
290
+ try {
291
+ const dir = vendoredGrammarsDir();
292
+ if (fs.existsSync(dir))
293
+ this._vendoredGrammarsDir = dir;
294
+ return this._vendoredGrammarsDir;
295
+ } catch {
296
+ return;
297
+ }
298
+ }
299
+ grammarSourceDirs() {
300
+ const dirs = [];
301
+ const push = (d) => {
302
+ if (d && !dirs.includes(d))
303
+ dirs.push(d);
304
+ };
305
+ push(this.vendoredGrammarsDir());
306
+ push(this.bundledGrammarsDir());
307
+ push(this.grammarsDir || undefined);
308
+ push(this.resolveWebTreeSitterAsset("grammars"));
309
+ return dirs;
310
+ }
311
+ resolveGrammarFile(grammarFile) {
312
+ for (const dir of this.grammarSourceDirs()) {
313
+ const candidate = path.join(dir, grammarFile);
314
+ const stamp = grammarFileStamp(candidate);
315
+ if (!stamp)
316
+ continue;
317
+ if (this.decodeFailedGrammarPaths.get(candidate) === stamp)
318
+ continue;
319
+ if (this.verifiedGrammarPaths.get(candidate) === stamp) {
320
+ if (this.isGrammarVersionCurrent(candidate, grammarFile, stamp)) {
321
+ return candidate;
322
+ }
323
+ continue;
324
+ }
325
+ if (fileHasWasmMagic(candidate)) {
326
+ this.verifiedGrammarPaths.set(candidate, stamp);
327
+ if (this.isGrammarVersionCurrent(candidate, grammarFile, stamp)) {
328
+ return candidate;
329
+ }
330
+ continue;
331
+ }
332
+ this.verifiedGrammarPaths.delete(candidate);
333
+ this.reportPoisonedGrammarFile(candidate, grammarFile);
334
+ }
335
+ return;
336
+ }
337
+ refreshGrammarSessionLatches() {
338
+ const ledgerGen = getDegradationLedgerGeneration();
339
+ if (ledgerGen === this.grammarNotificationsLedgerGen)
340
+ return;
341
+ this.grammarNotificationsLedgerGen = ledgerGen;
342
+ this.grammarLastNotifiedDelayMs.clear();
343
+ this.poisonedGrammarPaths.clear();
344
+ this.staleReportedGrammarPaths.clear();
345
+ }
346
+ reportPoisonedGrammarFile(candidate, grammarFile) {
347
+ this.refreshGrammarSessionLatches();
348
+ if (this.poisonedGrammarPaths.has(candidate))
349
+ return;
350
+ this.poisonedGrammarPaths.add(candidate);
351
+ logTreeSitterDiagnostic({
352
+ subsystem: "tree-sitter-client",
353
+ level: "warn",
354
+ message: `ignoring ${candidate}: the file is not a wasm module (missing the \\0asm preamble) — ` + `most likely a captive-portal or proxy page written by an earlier download (#1548). ` + `dm-lens will treat the grammar as missing and try to fetch it again.`,
355
+ metadata: { grammarFile, path: candidate, outcome: "not-wasm" }
356
+ });
357
+ incrementDegradationCount({
358
+ kind: "grammar-blocked",
359
+ subject: grammarFile,
360
+ reason: "on-disk grammar file is not a wasm module — ignored, re-fetching"
361
+ });
362
+ }
363
+ isGrammarVersionCurrent(candidate, grammarFile, stamp) {
364
+ if (isVendoredGrammar(grammarFile))
365
+ return true;
366
+ if (this.staleGrammarVersionAt.get(candidate) === stamp) {
367
+ this.reportStaleGrammarVersion(candidate, grammarFile);
368
+ return false;
369
+ }
370
+ if (this.verifiedGrammarVersionAt.get(candidate) === stamp)
371
+ return true;
372
+ const pinnedHash = pinnedGrammarHash(grammarFile);
373
+ if (!pinnedHash) {
374
+ this.verifiedGrammarVersionAt.set(candidate, stamp);
375
+ return true;
376
+ }
377
+ const actualHash = grammarFileSha256(candidate);
378
+ if (actualHash === pinnedHash) {
379
+ this.verifiedGrammarVersionAt.set(candidate, stamp);
380
+ return true;
381
+ }
382
+ this.verifiedGrammarVersionAt.delete(candidate);
383
+ this.staleGrammarVersionAt.set(candidate, stamp);
384
+ this.reportStaleGrammarVersion(candidate, grammarFile);
385
+ return false;
386
+ }
387
+ reportStaleGrammarVersion(candidate, grammarFile) {
388
+ this.refreshGrammarSessionLatches();
389
+ if (this.staleReportedGrammarPaths.has(candidate))
390
+ return;
391
+ this.staleReportedGrammarPaths.add(candidate);
392
+ logTreeSitterDiagnostic({
393
+ subsystem: "tree-sitter-client",
394
+ level: "warn",
395
+ message: `ignoring ${candidate}: its sha256 no longer matches the pinned grammar ` + `manifest — the pinned tree-sitter-wasms version (or a SOURCE_OVERRIDES entry) ` + `moved since this file was downloaded. dm-lens will treat the grammar as ` + `missing and re-fetch the current build (#1760).`,
396
+ metadata: { grammarFile, path: candidate, outcome: "stale-version" }
397
+ });
398
+ incrementDegradationCount({
399
+ kind: "grammar-blocked",
400
+ subject: grammarFile,
401
+ reason: "cached grammar no longer matches the pinned manifest hash — ignored, re-fetching"
402
+ });
403
+ }
404
+ findGrammarsDir(deps = this.grammarDirResolutionDeps) {
405
+ const grammarsDir = deps.resolveAsset("grammars");
406
+ if (grammarsDir && fs.existsSync(path.join(grammarsDir, "tree-sitter-typescript.wasm"))) {
407
+ return grammarsDir;
408
+ }
409
+ try {
410
+ const wasmsOut = path.join(path.dirname(deps.resolvePackage("tree-sitter-wasms/package.json")), "out");
411
+ if (fs.existsSync(wasmsOut))
412
+ return wasmsOut;
413
+ } catch {}
414
+ const cwdWasms = path.join(deps.cwd(), "node_modules", "tree-sitter-wasms", "out");
415
+ if (fs.existsSync(cwdWasms))
416
+ return cwdWasms;
417
+ return "";
418
+ }
419
+ grammarsWriteDir() {
420
+ const pkgDir = this.webTreeSitterPackageDir();
421
+ return pkgDir ? path.join(pkgDir, "grammars") : undefined;
422
+ }
423
+ async ensureGrammar(grammarFile) {
424
+ if (this.resolveGrammarFile(grammarFile)) {
425
+ return true;
426
+ }
427
+ if (!assertInstallAllowed(`tree-sitter grammar fetch: ${grammarFile}`)) {
428
+ const unavailable = `tree-sitter grammar '${grammarFile}' is unavailable because the project is not trusted; ` + `runtime grammar downloads are disabled until trust is granted.`;
429
+ logTreeSitterDiagnostic({
430
+ subsystem: "tree-sitter-client",
431
+ message: unavailable,
432
+ metadata: { grammarFile, outcome: "trust-gated" }
433
+ });
434
+ recordDegradation({
435
+ kind: "grammar-blocked",
436
+ subject: grammarFile,
437
+ reason: "runtime grammar download blocked because project is untrusted"
438
+ });
439
+ const generation = getProjectTrustGeneration();
440
+ if (generation !== this.trustNotificationsGeneration) {
441
+ this.trustNotificationsGeneration = generation;
442
+ this.trustBlockedGrammarNotifications.clear();
443
+ }
444
+ if (!this.trustBlockedGrammarNotifications.has(grammarFile)) {
445
+ this.trustBlockedGrammarNotifications.add(grammarFile);
446
+ notifyUserDegradation(`dm-lens: ${unavailable}`);
447
+ }
448
+ return false;
449
+ }
450
+ const inflight = this.grammarEnsurePromises.get(grammarFile);
451
+ if (inflight)
452
+ return inflight;
453
+ const retryAt = this.grammarRetryAtMs.get(grammarFile);
454
+ if (retryAt !== undefined && Date.now() < retryAt) {
455
+ return false;
456
+ }
457
+ const task = (async () => {
458
+ try {
459
+ return await this.fetchGrammar(grammarFile);
460
+ } catch (err) {
461
+ const message = err instanceof Error ? err.message : String(err);
462
+ this.recordGrammarFailure(grammarFile, `The runtime grammar fetch threw an unexpected error (${message}).`, true, "download-failed");
463
+ return false;
464
+ }
465
+ })();
466
+ this.grammarEnsurePromises.set(grammarFile, task);
467
+ task.finally(() => {
468
+ if (this.grammarEnsurePromises.get(grammarFile) === task) {
469
+ this.grammarEnsurePromises.delete(grammarFile);
470
+ }
471
+ }).catch(() => {});
472
+ return task;
473
+ }
474
+ async fetchGrammar(grammarFile) {
475
+ if (isVendoredGrammar(grammarFile)) {
476
+ const { reason } = vendoredGrammarRefusal(grammarFile);
477
+ this.recordGrammarFailure(grammarFile, reason ?? `${grammarFile} is missing from vendor/grammars/.`, false);
478
+ return false;
479
+ }
480
+ const dir = this.grammarsDir && fs.existsSync(this.grammarsDir) ? this.grammarsDir : this.grammarsWriteDir();
481
+ if (!dir) {
482
+ this.recordGrammarFailure(grammarFile, "No grammars directory could be resolved for the runtime fetch: the web-tree-sitter package is not locatable from this runtime, from dm-lens's own package root, or from the working directory.", true, "write-dir-unresolvable");
483
+ return false;
484
+ }
485
+ const writeBlock = grammarWriteBlockedReason(dir);
486
+ if (writeBlock) {
487
+ this.recordGrammarFailure(grammarFile, `The grammars directory ${dir} cannot be written to (${writeBlock}), so the runtime fetch has nowhere to land.`, true, "write-dir-unwritable");
488
+ return false;
489
+ }
490
+ const { ok, retryable, reason } = await downloadGrammarDetailed(dir, grammarFile);
491
+ if (ok) {
492
+ if (!this.grammarsDir)
493
+ this.grammarsDir = dir;
494
+ this.grammarRetryAtMs.delete(grammarFile);
495
+ this.grammarFailureAttempts.delete(grammarFile);
496
+ this.grammarLastNotifiedDelayMs.delete(grammarFile);
497
+ logTreeSitterDiagnostic({
498
+ subsystem: "tree-sitter-client",
499
+ level: "warn",
500
+ message: `fetched missing tree-sitter grammar ${grammarFile} at runtime (install scripts were skipped by the package manager)`,
501
+ metadata: { grammarFile, outcome: "fetched" }
502
+ });
503
+ } else {
504
+ this.recordGrammarFailure(grammarFile, reason ?? "The package manager skipped install scripts and the runtime download failed.", retryable, "download-failed");
505
+ }
506
+ return ok;
507
+ }
508
+ recordGrammarFailure(grammarFile, detail, retryable, cause) {
509
+ const attempts = (this.grammarFailureAttempts.get(grammarFile) ?? 0) + 1;
510
+ this.grammarFailureAttempts.set(grammarFile, attempts);
511
+ const retryDelayMs = retryable ? transientRetryDelayMs(attempts, "probe-timeout") : undefined;
512
+ this.grammarRetryAtMs.set(grammarFile, retryDelayMs === undefined ? Number.POSITIVE_INFINITY : Date.now() + retryDelayMs);
513
+ const remedy = cause === "write-dir-unresolvable" ? `This is a packaging/module-resolution fault, not a download problem: reinstall dm-lens so its ` + `web-tree-sitter dependency is present, or drop the wasm into dm-lens's own grammars/ directory.` : cause === "write-dir-unwritable" ? `This is a filesystem-permission fault, not a download problem: make that directory writable ` + `for the user dm-lens runs as, or reinstall dm-lens as that user.` : retryable ? `if the problem persists, allow the package manager's build scripts ` + `(pnpm approve-builds / bun trustedDependencies) or restore network access.` : `Fix: reinstall with a manager that runs postinstall, allow its build scripts ` + `(pnpm approve-builds / bun trustedDependencies), or restore network access.`;
514
+ const unavailable = `tree-sitter grammar '${grammarFile}' is unavailable — symbol search, ` + `module reports and structural rules for this language will be degraded. ` + `${detail} ` + (retryable ? `dm-lens will retry automatically in ${Math.round(retryDelayMs / 1000)}s; ` : `The grammar source reports it does not exist (not a network problem), so this will not ` + `resolve on retry. `) + remedy;
515
+ logTreeSitterDiagnostic({
516
+ subsystem: "tree-sitter-client",
517
+ message: unavailable,
518
+ metadata: {
519
+ grammarFile,
520
+ outcome: "unavailable",
521
+ retryable,
522
+ retryDelayMs,
523
+ attempts,
524
+ ...cause ? { cause } : {}
525
+ }
526
+ });
527
+ incrementDegradationCount({
528
+ kind: "grammar-blocked",
529
+ subject: grammarFile,
530
+ reason: retryable ? `runtime grammar download failed — retryable (${detail.trim()})` : `runtime grammar download failed — durable (${detail.trim()})`
531
+ });
532
+ this.refreshGrammarSessionLatches();
533
+ const notifyKey = retryDelayMs ?? -1;
534
+ if (this.grammarLastNotifiedDelayMs.get(grammarFile) !== notifyKey) {
535
+ this.grammarLastNotifiedDelayMs.set(grammarFile, notifyKey);
536
+ notifyUserDegradation(`dm-lens: ${unavailable}`);
537
+ }
538
+ }
539
+ recordGrammarLoadFailure(grammarPath, grammarFile, err) {
540
+ const stamp = grammarFileStamp(grammarPath);
541
+ this.verifiedGrammarPaths.delete(grammarPath);
542
+ if (stamp)
543
+ this.decodeFailedGrammarPaths.set(grammarPath, stamp);
544
+ const message = err instanceof Error ? err.message : String(err);
545
+ logTreeSitterDiagnostic({
546
+ subsystem: "tree-sitter-client",
547
+ level: "warn",
548
+ message: `Language.load failed for ${grammarPath} even though the wasm preamble check ` + `passed (${message}) — most likely a truncated download (#1564). Treating the ` + `grammar as missing so the next demand re-fetches it.`,
549
+ metadata: { grammarFile, path: grammarPath, outcome: "load-failed" }
550
+ });
551
+ this.recordGrammarFailure(grammarFile, `Language.load failed on a resolved grammar file (${message}).`, true);
552
+ }
553
+ async init() {
554
+ if (this.wasmAborted)
555
+ return false;
556
+ if (this.initialized)
557
+ return true;
558
+ if (this.webTreeSitterLoadFailed)
559
+ return false;
560
+ if (this.initPromise)
561
+ return this.initPromise;
562
+ this.initPromise = (async () => {
563
+ try {
564
+ let mod;
565
+ try {
566
+ mod = await loadWebTreeSitter();
567
+ } catch (err) {
568
+ const classification = classifyWebTreeSitterLoadFailure(err);
569
+ if (classification === "evaluation") {
570
+ this.webTreeSitterLoadFailed = true;
571
+ }
572
+ recordDegradationOnce({
573
+ kind: "web-tree-sitter-load-failed",
574
+ subject: "web-tree-sitter",
575
+ reason: (err instanceof Error ? err.message : String(err)) + (classification === "resolution" ? " (resolution failure — retryable)" : " (evaluation failure — latched for the session)")
576
+ });
577
+ throw err;
578
+ }
579
+ const anyMod = mod;
580
+ const ParserClass = anyMod.Parser || anyMod.default || anyMod;
581
+ if (!ParserClass || typeof ParserClass.init !== "function") {
582
+ this.dbg("Parser class not found or missing init method");
583
+ return false;
584
+ }
585
+ this.ParserClass = ParserClass;
586
+ this.LanguageLoader = mod.Language;
587
+ const wasmPath = this.resolveWebTreeSitterAsset("tree-sitter.wasm");
588
+ if (!wasmPath) {
589
+ this.dbg("Could not resolve tree-sitter.wasm");
590
+ return false;
591
+ }
592
+ const wasmDir = path.dirname(wasmPath);
593
+ this.dbg(`Looking for WASM at: ${wasmPath}, exists: ${fs.existsSync(wasmPath)}`);
594
+ await ParserClass.init({
595
+ locateFile: (scriptName) => {
596
+ const fullPath = path.join(wasmDir, scriptName);
597
+ this.dbg(`locateFile: ${scriptName} -> ${fullPath}`);
598
+ return fullPath;
599
+ }
600
+ });
601
+ this.initialized = true;
602
+ return true;
603
+ } catch (err) {
604
+ this.reportWasmAbort(err);
605
+ this.dbg(`Init error: ${err}`);
606
+ return false;
607
+ } finally {
608
+ this.initPromise = null;
609
+ }
610
+ })();
611
+ return this.initPromise;
612
+ }
613
+ resetLoadStateForSession() {
614
+ this.webTreeSitterLoadFailed = false;
615
+ }
616
+ async loadLanguage(languageId) {
617
+ if (this.wasmAborted)
618
+ return null;
619
+ this.dbg(`Loading language: ${languageId}`);
620
+ if (this.languages.has(languageId)) {
621
+ this.dbg(`Language ${languageId} already loaded`);
622
+ return this.languages.get(languageId);
623
+ }
624
+ if (!this.ParserClass) {
625
+ this.dbg(`ParserClass not initialized`);
626
+ return null;
627
+ }
628
+ const grammarFile = LANGUAGE_TO_GRAMMAR[languageId];
629
+ if (!grammarFile) {
630
+ this.dbg(`No grammar file for ${languageId}`);
631
+ return null;
632
+ }
633
+ const blockReason = grammarBlockReason(grammarFile);
634
+ if (blockReason) {
635
+ this.dbg(`Grammar ${grammarFile} blocked on this runtime — ${blockReason}`);
636
+ recordDegradation({
637
+ kind: "grammar-blocked",
638
+ subject: grammarFile,
639
+ reason: blockReason
640
+ });
641
+ return null;
642
+ }
643
+ let grammarPath = this.resolveGrammarFile(grammarFile);
644
+ if (!grammarPath) {
645
+ if (await this.ensureGrammar(grammarFile)) {
646
+ grammarPath = this.resolveGrammarFile(grammarFile);
647
+ }
648
+ }
649
+ this.dbg(`Grammar path: ${grammarPath}, exists: ${grammarPath && fs.existsSync(grammarPath)}`);
650
+ if (!grammarPath || !fs.existsSync(grammarPath)) {
651
+ this.dbg(`Grammar file not found: ${grammarPath}`);
652
+ return null;
653
+ }
654
+ try {
655
+ if (!this.LanguageLoader?.load) {
656
+ this.dbg(`LanguageLoader.load not available`);
657
+ return null;
658
+ }
659
+ this.dbg(`Calling Language.load...`);
660
+ const language = await this.LanguageLoader.load(grammarPath);
661
+ this.dbg(`Language loaded: ${language?.name || "unknown"}`);
662
+ if (language) {
663
+ this.languages.set(languageId, language);
664
+ }
665
+ return language;
666
+ } catch (err) {
667
+ if (!this.reportWasmAbort(err)) {
668
+ this.recordGrammarLoadFailure(grammarPath, grammarFile, err);
669
+ }
670
+ this.dbg(`Language load error: ${err}`);
671
+ return null;
672
+ }
673
+ }
674
+ async getParser(languageId) {
675
+ if (this.wasmAborted)
676
+ return null;
677
+ if (this.parsers.has(languageId)) {
678
+ return this.parsers.get(languageId);
679
+ }
680
+ const language = await this.loadLanguage(languageId);
681
+ if (!language || !this.ParserClass)
682
+ return null;
683
+ const parser = new this.ParserClass;
684
+ parser.setLanguage(language);
685
+ this.parsers.set(languageId, parser);
686
+ return parser;
687
+ }
688
+ async parseFile(filePath, languageId, contentOverride) {
689
+ const outcome = await this.parseFileAndUse(filePath, languageId, contentOverride, (tree) => tree);
690
+ return outcome.parsed ? outcome.value : null;
691
+ }
692
+ async withParsedTree(filePath, languageId, contentOverride, consume) {
693
+ return this.parseFileAndUse(filePath, languageId, contentOverride, consume);
694
+ }
695
+ async parseFileAndUse(filePath, languageId, contentOverride, consume) {
696
+ this.dbg(`Parsing ${filePath} with language ${languageId}`);
697
+ const parser = await this.getParser(languageId);
698
+ if (!parser) {
699
+ this.dbg(`Failed to get parser for ${languageId}`);
700
+ return NOT_PARSED;
701
+ }
702
+ let tree;
703
+ try {
704
+ const content = contentOverride ?? fs.readFileSync(filePath, "utf-8");
705
+ this.dbg(`File content length: ${content.length}`);
706
+ const cachedTree = this.treeCache.get(filePath, content, languageId);
707
+ if (cachedTree) {
708
+ this.dbg(`Using cached tree for ${filePath}`);
709
+ tree = cachedTree;
710
+ } else {
711
+ const parseStartedAt = performance.now();
712
+ this.recordParserCounter("parserInvocations");
713
+ try {
714
+ tree = parser.parse(content);
715
+ } catch (err) {
716
+ this.recordParserCounter("parserFailures");
717
+ throw err;
718
+ } finally {
719
+ this.recordParserCounter("parserDurationMs", performance.now() - parseStartedAt);
720
+ }
721
+ this.dbg(`Parsed, root node type: ${tree.rootNode.type}`);
722
+ this.treeCache.set(filePath, content, languageId, tree);
723
+ }
724
+ } catch (err) {
725
+ this.reportWasmAbort(err);
726
+ this.dbg(`Parse error: ${err}`);
727
+ return NOT_PARSED;
728
+ }
729
+ try {
730
+ return { parsed: true, value: consume(tree) };
731
+ } catch (error) {
732
+ this.reportWasmAbort(error);
733
+ throw error;
734
+ }
735
+ }
736
+ extractInjections(filePath, content) {
737
+ const injections = [];
738
+ const sqlPattern = /\b(sql|query|execute)\s*`([^`]+)`/gi;
739
+ let match;
740
+ while ((match = sqlPattern.exec(content)) !== null) {
741
+ const lines = content.slice(0, match.index).split(`
742
+ `);
743
+ injections.push({
744
+ type: "sql",
745
+ content: match[2],
746
+ line: lines.length,
747
+ column: lines[lines.length - 1].length
748
+ });
749
+ }
750
+ const cssPattern = /\b(styled(?:\.\w+)?|css)\s*`([^`]+)`/gi;
751
+ while ((match = cssPattern.exec(content)) !== null) {
752
+ const lines = content.slice(0, match.index).split(`
753
+ `);
754
+ injections.push({
755
+ type: "css",
756
+ content: match[2],
757
+ line: lines.length,
758
+ column: lines[lines.length - 1].length
759
+ });
760
+ }
761
+ const regexPattern = /new\s+RegExp\s*\(\s*`([^`]+)`/gi;
762
+ while ((match = regexPattern.exec(content)) !== null) {
763
+ const lines = content.slice(0, match.index).split(`
764
+ `);
765
+ injections.push({
766
+ type: "regex",
767
+ content: match[1],
768
+ line: lines.length,
769
+ column: lines[lines.length - 1].length
770
+ });
771
+ }
772
+ this.dbg(`Found ${injections.length} injections in ${filePath}`);
773
+ return injections;
774
+ }
775
+ isAvailable() {
776
+ if (this.wasmAborted)
777
+ return false;
778
+ if (this.resolveGrammarFile("tree-sitter-typescript.wasm"))
779
+ return true;
780
+ const dir = this.findGrammarsDir();
781
+ this.grammarsDir = dir;
782
+ return !!dir && fs.existsSync(dir);
783
+ }
784
+ async isLanguageSupported(languageId) {
785
+ if (this.wasmAborted)
786
+ return false;
787
+ if (!this.initialized)
788
+ await this.init();
789
+ const language = await this.loadLanguage(languageId);
790
+ return language !== null;
791
+ }
792
+ getLanguage(languageId) {
793
+ if (this.wasmAborted)
794
+ return null;
795
+ return this.languages.get(languageId) || null;
796
+ }
797
+ async structuralSearch(pattern, languageId, rootDir, options = {}) {
798
+ if (!this.initialized) {
799
+ const ok = await this.init();
800
+ if (!ok)
801
+ return [];
802
+ }
803
+ try {
804
+ await this.queryLoader.loadQueries(rootDir);
805
+ } catch (err) {
806
+ this.dbg(`Failed to load queries for ${rootDir}: ${err}`);
807
+ }
808
+ this.dbg(`Compiling pattern: ${pattern.slice(0, 50)}...`);
809
+ const compiled = await this.compileQuery(pattern, languageId);
810
+ if (!compiled) {
811
+ this.dbg(`Pattern compilation failed`);
812
+ return [];
813
+ }
814
+ this.dbg(`Pattern compiled, metavars: ${compiled.metavars.join(", ")}`);
815
+ const files = this.collectFiles(rootDir, languageId, options.fileFilter);
816
+ this.dbg(`Scanning ${files.length} files...`);
817
+ const matches = [];
818
+ const maxResults = options.maxResults ?? 50;
819
+ for (const file of files) {
820
+ if (matches.length >= maxResults)
821
+ break;
822
+ const fileMatches = await this.searchFileWithQuery(file, compiled.query, compiled.metavars, languageId, pattern, compiled.postFilter, compiled.postFilterParams);
823
+ matches.push(...fileMatches);
824
+ }
825
+ return matches.slice(0, maxResults);
826
+ }
827
+ async runQueryOnFile(queryDef, filePath, languageId, options = {}, contentOverride) {
828
+ if (!this.initialized) {
829
+ const ok = await this.init();
830
+ if (!ok)
831
+ return [];
832
+ }
833
+ const compiled = await this.compileRawQuery(queryDef.id, queryDef.query, queryDef.metavars, languageId, queryDef.post_filter, queryDef.post_filter_params);
834
+ if (!compiled)
835
+ return [];
836
+ const matches = await this.searchFileWithQuery(filePath, compiled.query, compiled.metavars, languageId, queryDef.id, compiled.postFilter, compiled.postFilterParams, contentOverride);
837
+ const maxResults = options.maxResults ?? 50;
838
+ return matches.slice(0, maxResults);
839
+ }
840
+ async runQueriesOnFile(queryDefs, filePath, languageId, options = {}, contentOverride) {
841
+ if (queryDefs.length === 0)
842
+ return [];
843
+ if (!this.initialized) {
844
+ const ok = await this.init();
845
+ if (!ok)
846
+ return [];
847
+ }
848
+ const maxResults = options.maxResults ?? 50;
849
+ const batch = await this.compileQueryBatch(queryDefs, languageId);
850
+ if (!batch) {
851
+ const results = [];
852
+ for (const queryDef of queryDefs) {
853
+ const matches = await this.runQueryOnFile(queryDef, filePath, languageId, options, contentOverride);
854
+ for (const match of matches)
855
+ results.push({ queryDef, match });
856
+ }
857
+ return results;
858
+ }
859
+ const perQuery = new Map;
860
+ await this.parseFileAndUse(filePath, languageId, contentOverride, (tree) => {
861
+ try {
862
+ const rootNode = tree.rootNode;
863
+ for (const match of batch.query.matches(rootNode)) {
864
+ const owner = batch.ownerOfPattern[match.patternIndex];
865
+ if (owner === undefined)
866
+ continue;
867
+ const bucket = perQuery.get(owner) ?? [];
868
+ if (bucket.length >= maxResults)
869
+ continue;
870
+ const entry = batch.entries[owner];
871
+ const captures = {};
872
+ for (const capture of match.captures) {
873
+ if (entry.metavars.includes(capture.name)) {
874
+ captures[capture.name] = capture.node;
875
+ }
876
+ }
877
+ if (!this.evaluatePredicates(batch.query, match))
878
+ continue;
879
+ if (entry.postFilter && !this.applyPostFilter(entry.postFilter, entry.postFilterParams, captures, rootNode)) {
880
+ continue;
881
+ }
882
+ if (match.captures.length === 0)
883
+ continue;
884
+ const firstNode = match.captures[0].node;
885
+ const textCaptures = {};
886
+ for (const [name, node] of Object.entries(captures)) {
887
+ textCaptures[name] = node.text;
888
+ }
889
+ bucket.push({
890
+ file: filePath,
891
+ line: firstNode.startPosition.row + 1,
892
+ column: firstNode.startPosition.column + 1,
893
+ matchedText: firstNode.text,
894
+ nodeType: firstNode.type,
895
+ captures: textCaptures
896
+ });
897
+ perQuery.set(owner, bucket);
898
+ }
899
+ } catch (err) {
900
+ this.reportWasmAbort(err);
901
+ this.dbg(`Batched query matching error: ${err}`);
902
+ }
903
+ });
904
+ const results = [];
905
+ for (let i = 0;i < batch.entries.length; i++) {
906
+ for (const match of perQuery.get(i) ?? []) {
907
+ results.push({ queryDef: batch.entries[i].queryDef, match });
908
+ }
909
+ }
910
+ return results;
911
+ }
912
+ async compileQueryBatch(queryDefs, languageId) {
913
+ const identity = crypto.createHash("sha256").update(JSON.stringify(queryDefs)).digest("hex");
914
+ const cacheKey = this.getQueryCacheKey(`batch:${identity}`, languageId);
915
+ const cached = this.queryBatchCache.get(cacheKey);
916
+ if (cached !== undefined) {
917
+ this.queryBatchCache.delete(cacheKey);
918
+ this.queryBatchCache.set(cacheKey, cached);
919
+ return cached;
920
+ }
921
+ const language = await this.loadLanguage(languageId);
922
+ if (!language) {
923
+ const failures = (this.queryBatchLoadFailures.get(cacheKey) ?? 0) + 1;
924
+ if (failures >= QUERY_BATCH_MAX_LOAD_FAILURES) {
925
+ this.dbg(`Batch: grammar for ${languageId} failed to load ${failures} times — caching miss`);
926
+ this.queryBatchLoadFailures.delete(cacheKey);
927
+ this.cacheQueryBatch(cacheKey, null);
928
+ } else {
929
+ this.queryBatchLoadFailures.set(cacheKey, failures);
930
+ }
931
+ return null;
932
+ }
933
+ this.queryBatchLoadFailures.delete(cacheKey);
934
+ const build = async () => {
935
+ const Query = (await loadWebTreeSitter()).Query;
936
+ const entries = [];
937
+ const sources = [];
938
+ const ownerOfPattern = [];
939
+ for (const queryDef of queryDefs) {
940
+ let patternCount;
941
+ try {
942
+ const probe = new Query(language, queryDef.query);
943
+ patternCount = probe.patternCount();
944
+ probe.delete?.();
945
+ } catch (err) {
946
+ if (this.reportWasmAbort(err))
947
+ return null;
948
+ this.dbg(`Batch: skipping ${queryDef.id} for ${languageId}: ${err}`);
949
+ this.reportQueryCompileFailure(queryDef.id, languageId, err);
950
+ continue;
951
+ }
952
+ const owner = entries.length;
953
+ entries.push({
954
+ queryDef,
955
+ metavars: queryDef.metavars ?? [],
956
+ postFilter: queryDef.post_filter,
957
+ postFilterParams: queryDef.post_filter_params
958
+ });
959
+ sources.push(queryDef.query);
960
+ for (let i = 0;i < patternCount; i++)
961
+ ownerOfPattern.push(owner);
962
+ }
963
+ if (entries.length === 0)
964
+ return null;
965
+ try {
966
+ const query = new Query(language, sources.join(`
967
+ `));
968
+ if (query.patternCount() !== ownerOfPattern.length) {
969
+ this.dbg(`Batch pattern count mismatch for ${languageId} (${query.patternCount()} vs ${ownerOfPattern.length}) — falling back`);
970
+ return null;
971
+ }
972
+ return { query, entries, ownerOfPattern };
973
+ } catch (err) {
974
+ if (this.reportWasmAbort(err))
975
+ return null;
976
+ this.dbg(`Batch compile failed for ${languageId}: ${err}`);
977
+ return null;
978
+ }
979
+ };
980
+ const batch = await build();
981
+ this.cacheQueryBatch(cacheKey, batch);
982
+ return batch;
983
+ }
984
+ patternToQuery(pattern, languageId) {
985
+ const loadedQuery = this.queryLoader.findMatchingQuery(pattern, languageId);
986
+ if (loadedQuery) {
987
+ this.dbg(`Using loaded query: ${loadedQuery.id}`);
988
+ return {
989
+ query: loadedQuery.query,
990
+ metavars: loadedQuery.metavars,
991
+ postFilter: loadedQuery.post_filter,
992
+ postFilterParams: loadedQuery.post_filter_params,
993
+ queryDef: loadedQuery
994
+ };
995
+ }
996
+ return this.getInlinePattern(pattern);
997
+ }
998
+ getInlinePattern(pattern) {
999
+ if (pattern.includes("async function") && pattern.includes("$NAME")) {
1000
+ return {
1001
+ query: `(function_declaration
1002
+ "async"
1003
+ name: (identifier) @NAME
1004
+ parameters: (formal_parameters) @PARAMS
1005
+ body: (statement_block) @BODY)`,
1006
+ metavars: ["NAME", "PARAMS", "BODY"]
1007
+ };
1008
+ }
1009
+ if (pattern.includes("console")) {
1010
+ return {
1011
+ query: `(call_expression
1012
+ function: (member_expression
1013
+ object: (identifier) @OBJ (#eq? @OBJ "console")
1014
+ property: (property_identifier) @METHOD)
1015
+ arguments: (arguments) @ARGS)`,
1016
+ metavars: ["OBJ", "METHOD", "ARGS"]
1017
+ };
1018
+ }
1019
+ if (pattern.includes("function $NAME") && pattern.includes("PARAMS")) {
1020
+ return {
1021
+ query: `(function_declaration
1022
+ name: (identifier) @NAME
1023
+ parameters: (formal_parameters) @PARAMS
1024
+ body: (statement_block) @BODY)`,
1025
+ metavars: ["NAME", "PARAMS", "BODY"],
1026
+ postFilter: "count_params",
1027
+ postFilterParams: { min_params: 6 }
1028
+ };
1029
+ }
1030
+ if (pattern.includes(".then") && pattern.includes(".catch")) {
1031
+ return {
1032
+ query: `(call_expression
1033
+ function: (member_expression
1034
+ object: (call_expression
1035
+ function: (member_expression
1036
+ object: (call_expression
1037
+ function: (member_expression
1038
+ property: (property_identifier) @M1)
1039
+ arguments: (arguments))
1040
+ property: (property_identifier) @M2)
1041
+ arguments: (arguments))
1042
+ property: (property_identifier) @M3)
1043
+ arguments: (arguments))
1044
+ (#match? @M1 "^(then|catch)$")
1045
+ (#match? @M2 "^(then|catch)$")
1046
+ (#match? @M3 "^(then|catch)$")`,
1047
+ metavars: ["M1", "M2", "M3"]
1048
+ };
1049
+ }
1050
+ const simpleMatch = pattern.match(/\$([A-Z_][A-Z0-9_]*)/);
1051
+ if (simpleMatch) {
1052
+ const name = simpleMatch[1];
1053
+ return {
1054
+ query: `(identifier) @${name}`,
1055
+ metavars: [name]
1056
+ };
1057
+ }
1058
+ return { query: "", metavars: [] };
1059
+ }
1060
+ getQueryCacheKey(pattern, languageId) {
1061
+ return `${languageId}:${pattern}`;
1062
+ }
1063
+ async compileQuery(pattern, languageId) {
1064
+ const cacheKey = this.getQueryCacheKey(pattern, languageId);
1065
+ if (this.queryCache.has(cacheKey)) {
1066
+ this.dbg(`Query cache hit: ${cacheKey}`);
1067
+ const cached = this.queryCache.get(cacheKey);
1068
+ this.queryCache.delete(cacheKey);
1069
+ this.queryCache.set(cacheKey, cached);
1070
+ return cached;
1071
+ }
1072
+ const language = await this.loadLanguage(languageId);
1073
+ if (!language) {
1074
+ this.dbg(`Could not load language ${languageId}`);
1075
+ return null;
1076
+ }
1077
+ const { query: queryStr, metavars, postFilter, postFilterParams } = this.patternToQuery(pattern, languageId);
1078
+ this.dbg(`Query string: ${queryStr.slice(0, 100)}...`);
1079
+ try {
1080
+ const Query = (await loadWebTreeSitter()).Query;
1081
+ const query = new Query(language, queryStr);
1082
+ this.dbg(`Query compiled with ${query.patternCount()} patterns`);
1083
+ const result = { query, metavars, postFilter, postFilterParams };
1084
+ this.cacheQuery(cacheKey, result);
1085
+ return result;
1086
+ } catch (err) {
1087
+ this.reportWasmAbort(err);
1088
+ this.dbg(`Query compilation failed: ${err}`);
1089
+ return null;
1090
+ }
1091
+ }
1092
+ async compileRawQuery(queryId, queryStr, metavars, languageId, postFilter, postFilterParams) {
1093
+ const cacheKey = this.getQueryCacheKey(`raw:${queryId}:${queryStr}`, languageId);
1094
+ if (this.queryCache.has(cacheKey)) {
1095
+ const cached = this.queryCache.get(cacheKey);
1096
+ this.queryCache.delete(cacheKey);
1097
+ this.queryCache.set(cacheKey, cached);
1098
+ return cached;
1099
+ }
1100
+ const language = await this.loadLanguage(languageId);
1101
+ if (!language)
1102
+ return null;
1103
+ try {
1104
+ const Query = (await loadWebTreeSitter()).Query;
1105
+ const query = new Query(language, queryStr);
1106
+ const result = { query, metavars, postFilter, postFilterParams };
1107
+ this.cacheQuery(cacheKey, result);
1108
+ return result;
1109
+ } catch (err) {
1110
+ this.reportWasmAbort(err);
1111
+ this.dbg(`Raw query compilation failed (${queryId}): ${err}`);
1112
+ this.reportQueryCompileFailure(queryId, languageId, err);
1113
+ return null;
1114
+ }
1115
+ }
1116
+ reportedCompileFailures = new Set;
1117
+ reportQueryCompileFailure(ruleId, languageId, err) {
1118
+ const key = `${ruleId}:${languageId}`;
1119
+ if (this.reportedCompileFailures.has(key))
1120
+ return;
1121
+ this.reportedCompileFailures.add(key);
1122
+ logTreeSitterDiagnostic({
1123
+ subsystem: "tree-sitter-client",
1124
+ languageId,
1125
+ message: `tree-sitter rule '${ruleId}' failed to compile against '${languageId}' — ` + `matches for this rule are silently dropped rather than reported. ` + `Fix the query in the rule definition to re-enable it. (${err})`,
1126
+ metadata: { ruleId }
1127
+ });
1128
+ }
1129
+ hasChildToken(node, token) {
1130
+ return node.children?.some((child) => child.type === token || child.text === token);
1131
+ }
1132
+ bindingNames(node) {
1133
+ const names = new Set;
1134
+ if (!node)
1135
+ return names;
1136
+ const stack = [node];
1137
+ while (stack.length > 0) {
1138
+ const current = stack.pop();
1139
+ if (current.type === "identifier")
1140
+ names.add(current.text);
1141
+ else if (current.type === "shorthand_property_identifier_pattern") {
1142
+ names.add(current.text);
1143
+ }
1144
+ if (current.type === "property_identifier" || current.type === "type_identifier" || current.type === "computed_property_name")
1145
+ continue;
1146
+ if (current.type === "assignment_pattern" || current.type === "object_assignment_pattern") {
1147
+ const left = current.childForFieldName?.("left");
1148
+ if (left)
1149
+ stack.push(left);
1150
+ continue;
1151
+ }
1152
+ stack.push(...current.children ?? []);
1153
+ }
1154
+ return names;
1155
+ }
1156
+ containsYieldInFunctionBody(node, root = node) {
1157
+ for (const child of node.children ?? []) {
1158
+ if (child.type === "yield")
1159
+ return true;
1160
+ if (child !== root && ["function_definition", "class_definition", "lambda"].includes(child.type)) {
1161
+ continue;
1162
+ }
1163
+ if (this.containsYieldInFunctionBody(child, root))
1164
+ return true;
1165
+ }
1166
+ return false;
1167
+ }
1168
+ isLikelySqlAlchemyReceiver(text) {
1169
+ const tail = text.split(".").pop() ?? text;
1170
+ return PYTHON_SQLALCHEMY_RECEIVER_NAMES.has(tail.toLowerCase());
1171
+ }
1172
+ switchCaseBodyStatements(caseNode) {
1173
+ const named = (caseNode.children ?? []).filter((c) => c.isNamed && !c.type.includes("comment"));
1174
+ return named.slice(1);
1175
+ }
1176
+ hasFallthroughMarker(caseNode) {
1177
+ const comments = [];
1178
+ const body = this.switchCaseBodyStatements(caseNode);
1179
+ const last = body[body.length - 1];
1180
+ const lastEnd = last?.endIndex ?? caseNode.startIndex;
1181
+ for (const c of caseNode.children ?? []) {
1182
+ if (c.type.includes("comment") && c.startIndex >= lastEnd) {
1183
+ comments.push(c);
1184
+ }
1185
+ }
1186
+ const siblings = (caseNode.parent?.children ?? []).filter((c) => c.isNamed);
1187
+ const index = siblings.findIndex((c) => c.startIndex === caseNode.startIndex);
1188
+ const next = index >= 0 ? siblings[index + 1] : undefined;
1189
+ if (next?.type.includes("comment"))
1190
+ comments.push(next);
1191
+ if (last) {
1192
+ const NESTED_FN = new Set([
1193
+ "function_declaration",
1194
+ "function_expression",
1195
+ "arrow_function",
1196
+ "method_definition",
1197
+ "generator_function",
1198
+ "generator_function_declaration",
1199
+ "class_declaration"
1200
+ ]);
1201
+ const stack = [last];
1202
+ for (let visited = 0;stack.length > 0 && visited < 500; visited++) {
1203
+ const node = stack.pop();
1204
+ if (!node)
1205
+ break;
1206
+ if (node.type.includes("comment"))
1207
+ comments.push(node);
1208
+ if (!NESTED_FN.has(node.type)) {
1209
+ stack.push(...node.children ?? []);
1210
+ }
1211
+ }
1212
+ }
1213
+ return comments.some((c) => /falls?\s?through/i.test(c.text));
1214
+ }
1215
+ statementTerminates(node, depth = 0) {
1216
+ if (depth > 20)
1217
+ return false;
1218
+ const t = node.type;
1219
+ const TERMINATORS = new Set([
1220
+ "break_statement",
1221
+ "return_statement",
1222
+ "throw_statement",
1223
+ "continue_statement"
1224
+ ]);
1225
+ if (TERMINATORS.has(t))
1226
+ return true;
1227
+ if (t === "statement_block" || t === "else_clause" || t === "catch_clause" || t === "finally_clause") {
1228
+ const inner = (node.children ?? []).filter((c) => c.isNamed && !c.type.includes("comment"));
1229
+ const last = inner[inner.length - 1];
1230
+ if (!last)
1231
+ return false;
1232
+ return this.statementTerminates(last, depth + 1);
1233
+ }
1234
+ if (t === "try_statement") {
1235
+ const tryBody = (node.children ?? []).find((c) => c.type === "statement_block");
1236
+ const tryTerminates = tryBody ? this.statementTerminates(tryBody, depth + 1) : false;
1237
+ const catches = (node.children ?? []).filter((c) => c.type === "catch_clause");
1238
+ const fin = (node.children ?? []).find((c) => c.type === "finally_clause");
1239
+ if (tryTerminates) {
1240
+ return catches.every((c) => this.statementTerminates(c, depth + 1));
1241
+ }
1242
+ return !!fin && this.statementTerminates(fin, depth + 1);
1243
+ }
1244
+ if (t === "if_statement") {
1245
+ const named = (node.children ?? []).filter((c) => c.isNamed && !c.type.includes("comment"));
1246
+ const consequence = named[1];
1247
+ const alternative = named[2];
1248
+ if (!consequence || !alternative)
1249
+ return false;
1250
+ return this.statementTerminates(consequence, depth + 1) && this.statementTerminates(alternative, depth + 1);
1251
+ }
1252
+ return false;
1253
+ }
1254
+ nextSiblingIsSwitchLabel(caseNode) {
1255
+ const siblings = (caseNode.parent?.children ?? []).filter((c) => c.isNamed && !c.type.includes("comment"));
1256
+ const index = siblings.findIndex((c) => c.startIndex === caseNode.startIndex);
1257
+ const next = index >= 0 ? siblings[index + 1] : undefined;
1258
+ return next?.type === "switch_case" || next?.type === "switch_default";
1259
+ }
1260
+ bodyHasLoopExit(node, insideNestedLoop) {
1261
+ const NESTS_BREAK = new Set([
1262
+ "for_statement",
1263
+ "for_in_statement",
1264
+ "while_statement",
1265
+ "do_statement",
1266
+ "switch_statement"
1267
+ ]);
1268
+ const NESTED_FN = new Set([
1269
+ "function_declaration",
1270
+ "function_expression",
1271
+ "arrow_function",
1272
+ "method_definition",
1273
+ "generator_function",
1274
+ "generator_function_declaration",
1275
+ "class_declaration"
1276
+ ]);
1277
+ for (const child of node.children ?? []) {
1278
+ const t = child.type;
1279
+ if (NESTED_FN.has(t))
1280
+ continue;
1281
+ if (t === "return_statement" || t === "throw_statement")
1282
+ return true;
1283
+ if (t === "break_statement") {
1284
+ const labeled = (child.children ?? []).some((c) => c.isNamed);
1285
+ if (!insideNestedLoop || labeled)
1286
+ return true;
1287
+ }
1288
+ if (this.bodyHasLoopExit(child, insideNestedLoop || NESTS_BREAK.has(t))) {
1289
+ return true;
1290
+ }
1291
+ }
1292
+ return false;
1293
+ }
1294
+ enclosingBindingName(node) {
1295
+ let cur = node?.parent;
1296
+ for (let depth = 0;cur && depth < 12; depth++) {
1297
+ const t = cur.type;
1298
+ if (t === "variable_declarator") {
1299
+ const name = cur.children?.find((c) => c.isNamed);
1300
+ return name?.text ?? "";
1301
+ }
1302
+ if (t === "assignment_expression") {
1303
+ return cur.children?.[0]?.text ?? "";
1304
+ }
1305
+ if (t === "statement_block" || t === "program" || t === "function_declaration" || t === "function_expression" || t === "arrow_function" || t === "method_definition") {
1306
+ return "";
1307
+ }
1308
+ cur = cur.parent;
1309
+ }
1310
+ return "";
1311
+ }
1312
+ resolvesToFileLiteralConst(name, rootNode) {
1313
+ const valueNode = this.resolveFileConstValueNode(name, rootNode);
1314
+ if (!valueNode)
1315
+ return false;
1316
+ return this.isFixedUrlLiteralExpr(valueNode);
1317
+ }
1318
+ resolveFileConstValueNode(name, rootNode) {
1319
+ const constDeclarators = [];
1320
+ let hasNonConstBinding = false;
1321
+ let hasReassignment = false;
1322
+ const stack = [rootNode];
1323
+ while (stack.length > 0) {
1324
+ const node = stack.pop();
1325
+ if (!node)
1326
+ continue;
1327
+ if (node.type === "variable_declarator") {
1328
+ const nameNode = node.childForFieldName?.("name");
1329
+ if (nameNode?.type === "identifier" && nameNode.text === name) {
1330
+ const decl = node.parent;
1331
+ const isConst = decl?.type === "lexical_declaration" && (decl.children ?? []).some((c) => c.type === "const");
1332
+ if (isConst) {
1333
+ constDeclarators.push(node);
1334
+ } else {
1335
+ hasNonConstBinding = true;
1336
+ }
1337
+ }
1338
+ } else if (node.type === "assignment_expression" || node.type === "augmented_assignment_expression") {
1339
+ const left = node.childForFieldName?.("left");
1340
+ if (left?.type === "identifier" && left.text === name) {
1341
+ hasReassignment = true;
1342
+ } else if ((left?.type === "member_expression" || left?.type === "subscript_expression") && left.childForFieldName?.("object")?.type === "identifier" && left.childForFieldName?.("object")?.text === name) {
1343
+ const searchOnly = left.type === "member_expression" && left.childForFieldName?.("property")?.text === "search";
1344
+ if (!searchOnly) {
1345
+ hasReassignment = true;
1346
+ }
1347
+ }
1348
+ }
1349
+ for (const child of node.children ?? [])
1350
+ stack.push(child);
1351
+ }
1352
+ if (hasNonConstBinding || hasReassignment || constDeclarators.length !== 1) {
1353
+ return null;
1354
+ }
1355
+ return constDeclarators[0].childForFieldName?.("value") ?? null;
1356
+ }
1357
+ isFixedUrlLiteralExpr(node) {
1358
+ if (node.type === "string")
1359
+ return true;
1360
+ if (node.type === "template_string") {
1361
+ return !(node.children ?? []).some((c) => c.type === "template_substitution");
1362
+ }
1363
+ return false;
1364
+ }
1365
+ isImportedBinding(name, rootNode) {
1366
+ return this.importedAs(name, rootNode) !== null;
1367
+ }
1368
+ importedAs(name, rootNode) {
1369
+ const stack = [rootNode];
1370
+ while (stack.length > 0) {
1371
+ const node = stack.pop();
1372
+ if (!node)
1373
+ continue;
1374
+ if (node.type === "import_specifier") {
1375
+ const nameNode = node.childForFieldName?.("name");
1376
+ const aliasNode = node.childForFieldName?.("alias");
1377
+ const local = (aliasNode ?? nameNode)?.text;
1378
+ if (local === name)
1379
+ return nameNode?.text ?? null;
1380
+ } else if (node.type === "namespace_import" || node.type === "import_clause") {
1381
+ for (const c of node.children ?? []) {
1382
+ if (c.type === "identifier" && c.text === name)
1383
+ return name;
1384
+ }
1385
+ }
1386
+ for (const child of node.children ?? [])
1387
+ stack.push(child);
1388
+ }
1389
+ return null;
1390
+ }
1391
+ isFixedUrlBaseExpr(base, rootNode) {
1392
+ if (base.type === "string")
1393
+ return true;
1394
+ if (base.type === "identifier") {
1395
+ return this.isFixedBaseIdentifier(base, rootNode);
1396
+ }
1397
+ if (base.type === "template_string") {
1398
+ for (const child of base.children ?? []) {
1399
+ if (child.type !== "template_substitution")
1400
+ continue;
1401
+ const inner = (child.children ?? []).find((c) => c.isNamed);
1402
+ if (!inner || inner.type !== "identifier" || !this.isFixedBaseIdentifier(inner, rootNode)) {
1403
+ return false;
1404
+ }
1405
+ }
1406
+ return true;
1407
+ }
1408
+ return false;
1409
+ }
1410
+ isFixedBaseIdentifier(ident, rootNode) {
1411
+ const name = ident.text;
1412
+ if (!this.isShadowedByEnclosingParam(ident, name) && this.resolvesToFileLiteralConst(name, rootNode)) {
1413
+ return true;
1414
+ }
1415
+ return this.isImportedBinding(name, rootNode);
1416
+ }
1417
+ isShadowedByEnclosingParam(node, name) {
1418
+ const FUNCTION_TYPES = new Set([
1419
+ "function_declaration",
1420
+ "function_expression",
1421
+ "generator_function",
1422
+ "generator_function_declaration",
1423
+ "arrow_function",
1424
+ "method_definition"
1425
+ ]);
1426
+ let current = node.parent;
1427
+ while (current) {
1428
+ if (FUNCTION_TYPES.has(current.type)) {
1429
+ const bare = current.childForFieldName?.("parameter");
1430
+ if (bare?.type === "identifier" && bare.text === name)
1431
+ return true;
1432
+ const params = current.childForFieldName?.("parameters");
1433
+ if (params && this.paramsBindName(params, name))
1434
+ return true;
1435
+ }
1436
+ current = current.parent;
1437
+ }
1438
+ return false;
1439
+ }
1440
+ paramsBindName(params, name) {
1441
+ for (const param of params.children ?? []) {
1442
+ if (!param.isNamed)
1443
+ continue;
1444
+ const pattern = param.type === "required_parameter" || param.type === "optional_parameter" ? param.childForFieldName?.("pattern") : param;
1445
+ if (pattern && this.patternBindsName(pattern, name))
1446
+ return true;
1447
+ }
1448
+ return false;
1449
+ }
1450
+ patternBindsName(pattern, name) {
1451
+ if (pattern.type === "identifier")
1452
+ return pattern.text === name;
1453
+ const stack = [pattern];
1454
+ while (stack.length > 0) {
1455
+ const n = stack.pop();
1456
+ if (!n)
1457
+ continue;
1458
+ if ((n.type === "identifier" || n.type === "shorthand_property_identifier_pattern") && n.text === name) {
1459
+ return true;
1460
+ }
1461
+ if (n.type === "assignment_pattern") {
1462
+ const left = n.childForFieldName?.("left") ?? n.children?.[0];
1463
+ if (left)
1464
+ stack.push(left);
1465
+ continue;
1466
+ }
1467
+ for (const c of n.children ?? [])
1468
+ stack.push(c);
1469
+ }
1470
+ return false;
1471
+ }
1472
+ resolvesToFixedNewUrlConst(name, rootNode) {
1473
+ const value = this.resolveFileConstValueNode(name, rootNode);
1474
+ if (!value || value.type !== "new_expression")
1475
+ return false;
1476
+ const ctor = value.childForFieldName?.("constructor");
1477
+ const ctorName = ctor?.text ?? "";
1478
+ const isUrlCtor = ctorName === "URL" || ctor?.type === "identifier" && this.importedAs(ctorName, rootNode) === "URL";
1479
+ if (!isUrlCtor)
1480
+ return false;
1481
+ const args = (value.childForFieldName?.("arguments")?.children ?? []).filter((c) => c.isNamed && c.type !== "comment");
1482
+ if (args.length === 0)
1483
+ return false;
1484
+ if (!this.isFixedUrlLiteralExpr(args[0]))
1485
+ return false;
1486
+ if (args.length === 1)
1487
+ return true;
1488
+ return this.isFixedUrlBaseExpr(args[1], rootNode);
1489
+ }
1490
+ newUrlBaseVarName(urlNode) {
1491
+ let member;
1492
+ if (urlNode.type === "call_expression") {
1493
+ member = urlNode.childForFieldName?.("function");
1494
+ } else if (urlNode.type === "member_expression") {
1495
+ member = urlNode;
1496
+ }
1497
+ if (!member || member.type !== "member_expression")
1498
+ return null;
1499
+ const prop = member.childForFieldName?.("property")?.text;
1500
+ if (prop !== "toString" && prop !== "href")
1501
+ return null;
1502
+ const object = member.childForFieldName?.("object");
1503
+ if (object?.type !== "identifier")
1504
+ return null;
1505
+ return object.text;
1506
+ }
1507
+ isSafeSqlAlchemyExpressionCall(node) {
1508
+ if (node.type !== "call")
1509
+ return false;
1510
+ const callee = node.children?.[0]?.text ?? "";
1511
+ const expression = node.text;
1512
+ for (const name of PYTHON_SQLALCHEMY_STATEMENT_BUILDERS) {
1513
+ if (callee === name || expression.startsWith(`${name}(`))
1514
+ return true;
1515
+ }
1516
+ return false;
1517
+ }
1518
+ applyPostFilter(postFilter, postFilterParams, captures, rootNode) {
1519
+ function extractSlots(classNode) {
1520
+ const classText = classNode.text ?? "";
1521
+ if (!classText.includes("__slots__"))
1522
+ return null;
1523
+ const body = classNode.children?.find((c) => c.type === "block");
1524
+ if (!body)
1525
+ return null;
1526
+ const slots = [];
1527
+ for (const stmt of body.children ?? []) {
1528
+ if (stmt.type !== "expression_statement")
1529
+ continue;
1530
+ const assignment = stmt.children?.find((c) => c.type === "assignment");
1531
+ if (!assignment)
1532
+ continue;
1533
+ const lhsText = (assignment.children?.[0]?.text ?? "").trim();
1534
+ if (lhsText !== "__slots__")
1535
+ continue;
1536
+ const rhs = assignment.children?.[2];
1537
+ if (!rhs)
1538
+ continue;
1539
+ if (rhs.type === "string") {
1540
+ const s = (rhs.text ?? "").replace(/^["']|["']$/g, "");
1541
+ if (s)
1542
+ slots.push(s);
1543
+ } else if (rhs.type === "tuple" || rhs.type === "list") {
1544
+ for (const el of rhs.children ?? []) {
1545
+ if (!el.isNamed)
1546
+ continue;
1547
+ if (el.type === "string") {
1548
+ slots.push((el.text ?? "").replace(/^["']|["']$/g, ""));
1549
+ }
1550
+ }
1551
+ }
1552
+ break;
1553
+ }
1554
+ return slots;
1555
+ }
1556
+ switch (postFilter) {
1557
+ case "no_nested_anchor_chain": {
1558
+ try {
1559
+ const outer = captures.OUTER_ELEMENT;
1560
+ if (!outer) {
1561
+ this.reportPostFilterFailure(postFilter, "missing OUTER_ELEMENT capture");
1562
+ return true;
1563
+ }
1564
+ const isAnchorElement = (node) => {
1565
+ if (node.type !== "jsx_element")
1566
+ return false;
1567
+ const opening = node.childForFieldName?.("open_tag") ?? node.children?.find((child) => child.type === "jsx_opening_element");
1568
+ const name = opening?.childForFieldName?.("name") ?? opening?.children?.find((child) => child.type === "identifier");
1569
+ return name?.text === "a";
1570
+ };
1571
+ let visited = 0;
1572
+ let ancestor = outer.parent;
1573
+ while (ancestor) {
1574
+ if (++visited > NO_NESTED_ANCHOR_VISIT_CAP) {
1575
+ this.reportPostFilterFailure(postFilter, `ancestor walk exceeded ${NO_NESTED_ANCHOR_VISIT_CAP} nodes`);
1576
+ return true;
1577
+ }
1578
+ if (isAnchorElement(ancestor))
1579
+ return false;
1580
+ ancestor = ancestor.parent;
1581
+ }
1582
+ const pending = [...outer.children ?? []];
1583
+ while (pending.length > 0) {
1584
+ const node = pending.pop();
1585
+ if (!node)
1586
+ continue;
1587
+ if (++visited > NO_NESTED_ANCHOR_VISIT_CAP) {
1588
+ this.reportPostFilterFailure(postFilter, `descendant walk exceeded ${NO_NESTED_ANCHOR_VISIT_CAP} nodes`);
1589
+ return true;
1590
+ }
1591
+ if (isAnchorElement(node))
1592
+ return true;
1593
+ pending.push(...node.children ?? []);
1594
+ }
1595
+ return false;
1596
+ } catch (error) {
1597
+ const reason = error instanceof Error ? error.message : String(error);
1598
+ this.reportPostFilterFailure(postFilter, `tree walk failed${reason ? `: ${reason}` : ""}`);
1599
+ return true;
1600
+ }
1601
+ }
1602
+ case "differs_only_by_case": {
1603
+ try {
1604
+ const field = captures.FIELD?.text ?? "";
1605
+ const method = captures.METHOD?.text ?? "";
1606
+ return field !== method && field.toLocaleLowerCase() === method.toLocaleLowerCase();
1607
+ } catch {
1608
+ return true;
1609
+ }
1610
+ }
1611
+ case "in_default_package": {
1612
+ try {
1613
+ if (!rootNode)
1614
+ return true;
1615
+ return !(rootNode.children ?? []).some((node) => node.type === "package_declaration");
1616
+ } catch {
1617
+ return true;
1618
+ }
1619
+ }
1620
+ case "missing_mimetype_and_download_name": {
1621
+ try {
1622
+ const firstArg = captures.FIRST_ARG;
1623
+ if (!firstArg)
1624
+ return true;
1625
+ if (firstArg.type === "string")
1626
+ return false;
1627
+ const args = firstArg.parent;
1628
+ if (!args)
1629
+ return true;
1630
+ return !(args.children ?? []).some((node) => {
1631
+ if (node.type !== "keyword_argument")
1632
+ return false;
1633
+ const name = node.childForFieldName?.("name")?.text;
1634
+ return name === "mimetype" || name === "download_name";
1635
+ });
1636
+ } catch {
1637
+ return true;
1638
+ }
1639
+ }
1640
+ case "missing_super_call": {
1641
+ try {
1642
+ const body = captures.BODY;
1643
+ const method = captures.METHOD?.text ?? "";
1644
+ if (!body || !method)
1645
+ return true;
1646
+ const stack = [body];
1647
+ for (let visited = 0;stack.length > 0 && visited < 1e4; visited++) {
1648
+ const node = stack.pop();
1649
+ if (!node)
1650
+ break;
1651
+ if (node.type === "method_invocation" && node.childForFieldName?.("object")?.text === "super" && node.childForFieldName?.("name")?.text === method) {
1652
+ return false;
1653
+ }
1654
+ stack.push(...node.children ?? []);
1655
+ }
1656
+ return true;
1657
+ } catch {
1658
+ return true;
1659
+ }
1660
+ }
1661
+ case "no_assertion_call": {
1662
+ try {
1663
+ const body = captures.BODY;
1664
+ if (!body)
1665
+ return true;
1666
+ const assertionNames = /^(?:assert\w*|fail|verify|expect|check|assume\w*)$/i;
1667
+ const stack = [body];
1668
+ for (let visited = 0;stack.length > 0 && visited < 1e4; visited++) {
1669
+ const node = stack.pop();
1670
+ if (!node)
1671
+ break;
1672
+ if (node.type === "method_invocation") {
1673
+ const name = node.childForFieldName?.("name")?.text ?? "";
1674
+ if (assertionNames.test(name))
1675
+ return false;
1676
+ }
1677
+ stack.push(...node.children ?? []);
1678
+ }
1679
+ return true;
1680
+ } catch {
1681
+ return true;
1682
+ }
1683
+ }
1684
+ case "not_closed_or_try_with_resources": {
1685
+ try {
1686
+ const declaration = captures.DECL;
1687
+ const resource = captures.RESOURCE?.text ?? "";
1688
+ if (!declaration || !resource)
1689
+ return true;
1690
+ const scope = this.navigator.findParent(declaration, [
1691
+ "method_declaration",
1692
+ "constructor_declaration",
1693
+ "block"
1694
+ ]) ?? rootNode;
1695
+ if (!scope)
1696
+ return true;
1697
+ const resourceWord = new RegExp(`\\b${escapeRegExp(resource)}\\b`);
1698
+ const stack = [scope];
1699
+ for (let visited = 0;stack.length > 0 && visited < 1e4; visited++) {
1700
+ const node = stack.pop();
1701
+ if (!node)
1702
+ break;
1703
+ if (node.type === "method_invocation" && node.childForFieldName?.("object")?.text === resource && node.childForFieldName?.("name")?.text === "close") {
1704
+ return false;
1705
+ }
1706
+ if (node.type === "resource" && resourceWord.test(node.text ?? "")) {
1707
+ return false;
1708
+ }
1709
+ stack.push(...node.children ?? []);
1710
+ }
1711
+ return true;
1712
+ } catch {
1713
+ return true;
1714
+ }
1715
+ }
1716
+ case "same_method_no_base_case": {
1717
+ try {
1718
+ const method = captures.NAME?.text ?? "";
1719
+ if (!method || captures.RECURSE?.text !== method)
1720
+ return false;
1721
+ const call = captures.CALL;
1722
+ const declaration = call ? this.navigator.findParent(call, ["method_declaration"]) : undefined;
1723
+ if (!declaration)
1724
+ return true;
1725
+ const stack = [declaration];
1726
+ for (let visited = 0;stack.length > 0 && visited < 1e4; visited++) {
1727
+ const node = stack.pop();
1728
+ if (!node)
1729
+ break;
1730
+ if (node.type === "if_statement" || node.type === "switch_expression" || node.type === "switch_statement" || node.type === "while_statement" || node.type === "do_statement" || node.type === "for_statement" || node.type === "enhanced_for_statement" || node.type === "ternary_expression") {
1731
+ return false;
1732
+ }
1733
+ stack.push(...node.children ?? []);
1734
+ }
1735
+ return stack.length > 0 ? false : true;
1736
+ } catch {
1737
+ return true;
1738
+ }
1739
+ }
1740
+ case "memset_for_sensitive_data": {
1741
+ try {
1742
+ const destination = captures.DEST?.text ?? "";
1743
+ const value = captures.VALUE?.text?.trim() ?? "";
1744
+ if (!/^(?:0|0x0+|NULL|nullptr)$/.test(value))
1745
+ return false;
1746
+ return /(?:pass(?:word)?|passwd|secret|token|api_?key|private_?key|credential|auth|pin)/i.test(destination);
1747
+ } catch {
1748
+ return true;
1749
+ }
1750
+ }
1751
+ case "unsafe_regex_dynamic_identifier": {
1752
+ try {
1753
+ const interpolationNode = captures.INTERPOLATION;
1754
+ const interpolation = interpolationNode?.text ?? "";
1755
+ const identifier = interpolation.match(/^\$\{\s*([A-Za-z_$][\w$]*)\s*\}$/)?.[1];
1756
+ if (!identifier || !rootNode || !interpolationNode)
1757
+ return true;
1758
+ const useRow = interpolationNode.startPosition.row;
1759
+ const hasEscapeSignal = (text) => /\b(?:escape|Escape)\w*\s*\(/.test(text) || /\.\s*replace\s*\(\s*\//.test(text);
1760
+ let lastWriteRow = -1;
1761
+ let lastWriteSafe = false;
1762
+ const consider = (row, valueText) => {
1763
+ if (row >= useRow || row < lastWriteRow)
1764
+ return;
1765
+ lastWriteRow = row;
1766
+ lastWriteSafe = valueText !== undefined && hasEscapeSignal(valueText);
1767
+ };
1768
+ const stack = [rootNode];
1769
+ while (stack.length > 0) {
1770
+ const node = stack.pop();
1771
+ if (!node)
1772
+ continue;
1773
+ if (node.type === "variable_declarator") {
1774
+ const name = node.childForFieldName?.("name");
1775
+ if (name?.text === identifier) {
1776
+ const initializer = node.childForFieldName?.("value");
1777
+ consider(node.startPosition.row, initializer?.text);
1778
+ }
1779
+ } else if (node.type === "assignment_expression") {
1780
+ const left = node.childForFieldName?.("left");
1781
+ if (left?.type === "identifier" && left.text === identifier) {
1782
+ const right = node.childForFieldName?.("right");
1783
+ consider(node.startPosition.row, right?.text);
1784
+ }
1785
+ }
1786
+ stack.push(...node.children);
1787
+ }
1788
+ return lastWriteRow >= 0 && lastWriteSafe ? false : true;
1789
+ } catch {
1790
+ return true;
1791
+ }
1792
+ }
1793
+ case "is_generator_with_valued_return": {
1794
+ const returnNode = captures.RETURN;
1795
+ const functionNode = captures.FUNCTION ?? (returnNode ? this.navigator.findParent(returnNode, ["function_definition"]) : undefined);
1796
+ if (!functionNode)
1797
+ return false;
1798
+ if (this.hasChildToken(functionNode, "async"))
1799
+ return false;
1800
+ return this.containsYieldInFunctionBody(functionNode);
1801
+ }
1802
+ case "count_params": {
1803
+ const paramsNode = captures.PARAMS;
1804
+ if (!paramsNode)
1805
+ return true;
1806
+ const paramCount = paramsNode.children.filter((c) => {
1807
+ if (c.type !== "required_parameter")
1808
+ return false;
1809
+ if (c.text.includes("="))
1810
+ return false;
1811
+ if (c.children?.some((ch) => ch.text === "?"))
1812
+ return false;
1813
+ return true;
1814
+ }).length;
1815
+ return paramCount >= (postFilterParams?.min_params ?? 6);
1816
+ }
1817
+ case "empty_body": {
1818
+ const bodyNode = captures.BODY;
1819
+ if (!bodyNode)
1820
+ return true;
1821
+ const meaningful = bodyNode.children.filter((c) => c.isNamed && c.type !== "comment" && c.type !== "line_comment" && c.type !== "block_comment");
1822
+ return meaningful.length === 0;
1823
+ }
1824
+ case "is_empty_block": {
1825
+ const caseNode = captures.CASE;
1826
+ if (!caseNode)
1827
+ return false;
1828
+ if (this.switchCaseBodyStatements(caseNode).length > 0)
1829
+ return false;
1830
+ return !this.nextSiblingIsSwitchLabel(caseNode);
1831
+ }
1832
+ case "no_break_or_return_in_body": {
1833
+ const bodyNode = captures.BODY;
1834
+ if (!bodyNode)
1835
+ return false;
1836
+ return !this.bodyHasLoopExit(bodyNode, false);
1837
+ }
1838
+ case "same_param_name": {
1839
+ const first = this.bindingNames(captures.PARAM1);
1840
+ const second = this.bindingNames(captures.NAME);
1841
+ return [...first].some((name) => second.has(name));
1842
+ }
1843
+ case "no_terminating_statement": {
1844
+ const caseNode = captures.CASE;
1845
+ if (!caseNode)
1846
+ return false;
1847
+ if (this.hasFallthroughMarker(caseNode))
1848
+ return false;
1849
+ const body = this.switchCaseBodyStatements(caseNode);
1850
+ if (body.length === 0)
1851
+ return false;
1852
+ return !this.statementTerminates(body[body.length - 1]);
1853
+ }
1854
+ case "no_break_or_return": {
1855
+ const bodyNode = captures.BODY;
1856
+ if (!bodyNode)
1857
+ return false;
1858
+ return !this.bodyHasLoopExit(bodyNode, false);
1859
+ }
1860
+ case "is_double_checked_locking": {
1861
+ const outer = captures.FIELD?.text;
1862
+ const inner = captures.FIELD2?.text;
1863
+ return !!outer && outer === inner;
1864
+ }
1865
+ case "shadows_parent_field": {
1866
+ const parentName = captures.PARENT?.text;
1867
+ const fieldName = captures.NAME?.text;
1868
+ if (!parentName || !fieldName)
1869
+ return false;
1870
+ let root = captures.NAME;
1871
+ while (root.parent)
1872
+ root = root.parent;
1873
+ const stack = [root];
1874
+ while (stack.length) {
1875
+ const node = stack.pop();
1876
+ if (node.type === "class_declaration" && node.childForFieldName?.("name")?.text === parentName) {
1877
+ const body = node.childForFieldName?.("body");
1878
+ for (const member of body?.children ?? []) {
1879
+ if (member.type !== "field_declaration")
1880
+ continue;
1881
+ for (const declarator of member.children ?? []) {
1882
+ if (declarator.type === "variable_declarator" && declarator.childForFieldName?.("name")?.text === fieldName) {
1883
+ return true;
1884
+ }
1885
+ }
1886
+ }
1887
+ }
1888
+ for (const child of node.children ?? [])
1889
+ stack.push(child);
1890
+ }
1891
+ return false;
1892
+ }
1893
+ case "missing_break_between_cases": {
1894
+ const label = captures.LABEL;
1895
+ const group = label?.parent;
1896
+ if (!group)
1897
+ return false;
1898
+ const TERMINATORS = new Set([
1899
+ "break_statement",
1900
+ "return_statement",
1901
+ "throw_statement",
1902
+ "continue_statement",
1903
+ "yield_statement"
1904
+ ]);
1905
+ for (const child of group.children ?? []) {
1906
+ if (TERMINATORS.has(child.type))
1907
+ return false;
1908
+ }
1909
+ return true;
1910
+ }
1911
+ case "scoped_lock_empty_args": {
1912
+ const decl = captures.DECL;
1913
+ if (!decl)
1914
+ return false;
1915
+ for (const sibling of decl.parent?.children ?? []) {
1916
+ if (sibling.type === "argument_list")
1917
+ return false;
1918
+ }
1919
+ return true;
1920
+ }
1921
+ case "calc_missing_spaces": {
1922
+ const text = captures.EXPR?.text ?? "";
1923
+ return /[\w%)][+-][\w.(]/.test(text);
1924
+ }
1925
+ case "bare_except_only": {
1926
+ const clauseNode = captures.CLAUSE;
1927
+ if (!clauseNode)
1928
+ return true;
1929
+ const hasExceptionSpec = clauseNode.children.some((c) => {
1930
+ if (!c.isNamed)
1931
+ return false;
1932
+ return c.type !== "block";
1933
+ });
1934
+ return !hasExceptionSpec;
1935
+ }
1936
+ case "eq_mod_fn": {
1937
+ const mod = captures.MOD?.text ?? "";
1938
+ const fn = captures.FN?.text ?? "";
1939
+ return mod === "threading" && fn === "Thread";
1940
+ }
1941
+ case "regex_first_arg_identifier": {
1942
+ const mod = captures.MOD?.text ?? "";
1943
+ if (mod !== "re")
1944
+ return false;
1945
+ const func = captures.FUNC?.text ?? "";
1946
+ if (!/^(compile|match|search|fullmatch|findall|finditer|sub|subn|split)$/.test(func)) {
1947
+ return false;
1948
+ }
1949
+ const argsNode = captures.ARGS;
1950
+ if (!argsNode)
1951
+ return false;
1952
+ const firstNamed = (argsNode.children ?? []).find((c) => c.isNamed);
1953
+ if (!firstNamed)
1954
+ return false;
1955
+ return firstNamed.type === "identifier";
1956
+ }
1957
+ case "open_mode_invalid": {
1958
+ const modeNode = captures.MODE;
1959
+ if (!modeNode)
1960
+ return false;
1961
+ const text = modeNode.text ?? "";
1962
+ const stripped = text.replace(/^["']|["']$/g, "");
1963
+ if (stripped.length === 0)
1964
+ return false;
1965
+ if (stripped.length === 1)
1966
+ return false;
1967
+ if (!/^[rwxabt+]+$/.test(stripped))
1968
+ return true;
1969
+ const validShape = /^[rwax][bt]?\+?$/;
1970
+ if (!validShape.test(stripped))
1971
+ return true;
1972
+ return false;
1973
+ }
1974
+ case "status_204_with_value_return": {
1975
+ const funcNode = captures.FUNC;
1976
+ const valNode = captures.VAL;
1977
+ if (!funcNode || !valNode)
1978
+ return false;
1979
+ if (Number(valNode.text ?? 0) !== 204)
1980
+ return false;
1981
+ const queue = [funcNode];
1982
+ while (queue.length > 0) {
1983
+ const node = queue.shift();
1984
+ if (node.type === "return_statement") {
1985
+ const hasValue = node.children.some((c) => c.isNamed && c.type !== "comment");
1986
+ if (hasValue)
1987
+ return true;
1988
+ }
1989
+ if (node.children)
1990
+ queue.push(...node.children);
1991
+ }
1992
+ return false;
1993
+ }
1994
+ case "has_mixed_async": {
1995
+ const bodyNode = captures.BODY;
1996
+ if (!bodyNode)
1997
+ return true;
1998
+ const bodyText = bodyNode.text;
1999
+ return bodyText.includes("await") && /\.\s*(then|catch)\s*\(/.test(bodyText);
2000
+ }
2001
+ case "format_arity_mismatch": {
2002
+ const formatNode = captures.FORMAT;
2003
+ const argsNode = captures.ARGS;
2004
+ if (!formatNode || !argsNode)
2005
+ return false;
2006
+ const fmtText = (formatNode.text ?? "").replace(/^["']|["']$/g, "");
2007
+ const fmt = fmtText;
2008
+ let placeholderCount = 0;
2009
+ const namedKeys = [];
2010
+ const positionalRegex = /%(?:\([^)]+\))?[#0\- +]*\d*(?:\.\d+)?[hlL]?[diouxXeEfFgGcrs%]/g;
2011
+ const positionalMatches = fmt.match(positionalRegex) ?? [];
2012
+ for (const m of positionalMatches) {
2013
+ if (m === "%%")
2014
+ continue;
2015
+ placeholderCount++;
2016
+ const namedMatch = m.match(/^%\(([^)]+)\)/);
2017
+ if (namedMatch)
2018
+ namedKeys.push(namedMatch[1]);
2019
+ }
2020
+ if (namedKeys.length > 0) {
2021
+ if (argsNode.type === "dictionary") {
2022
+ const dictKeys = [];
2023
+ for (const child of argsNode.children ?? []) {
2024
+ if (child.type === "pair" && child.children?.[0]) {
2025
+ dictKeys.push((child.children[0].text ?? "").replace(/^["']|["']$/g, ""));
2026
+ }
2027
+ }
2028
+ const missing = namedKeys.filter((k) => !dictKeys.includes(k));
2029
+ return missing.length > 0;
2030
+ }
2031
+ return true;
2032
+ }
2033
+ if (argsNode.type === "tuple") {
2034
+ const argCount = (argsNode.children ?? []).filter((c) => c.isNamed).length;
2035
+ if (argCount !== placeholderCount)
2036
+ return true;
2037
+ }
2038
+ return false;
2039
+ }
2040
+ case "aws_policy_public": {
2041
+ const policyNode = captures.POLICY;
2042
+ if (!policyNode)
2043
+ return false;
2044
+ const text = policyNode.text ?? "";
2045
+ const patterns = [
2046
+ /"Principal"\s*:\s*"\*"/,
2047
+ /"Principal"\s*:\s*\{\s*"AWS"\s*:\s*"\*"\s*\}/,
2048
+ /"Effect"\s*:\s*"Allow"[\s\S]*?"Action"\s*:\s*"\*"[\s\S]*?"Resource"\s*:\s*"\*"/,
2049
+ /"Principal"\s*:\s*"\*"/
2050
+ ];
2051
+ return patterns.some((p) => p.test(text));
2052
+ }
2053
+ case "slots_attribute_mismatch": {
2054
+ const selfNode = captures.SELF;
2055
+ const attrNode = captures.ATTR;
2056
+ const methodNode = captures.METHOD;
2057
+ if (!selfNode || !attrNode || !methodNode)
2058
+ return false;
2059
+ if (selfNode.text !== "self")
2060
+ return false;
2061
+ const attrName = attrNode.text ?? "";
2062
+ let parent = methodNode.parent;
2063
+ while (parent && parent.type !== "class_definition") {
2064
+ parent = parent.parent;
2065
+ }
2066
+ if (!parent)
2067
+ return false;
2068
+ const slots = extractSlots(parent);
2069
+ if (slots === null || slots.length === 0)
2070
+ return false;
2071
+ return !slots.includes(attrName);
2072
+ }
2073
+ case "special_method_arity": {
2074
+ const nameNode = captures.NAME;
2075
+ const paramsNode = captures.PARAMS;
2076
+ if (!nameNode || !paramsNode)
2077
+ return false;
2078
+ const name = nameNode.text ?? "";
2079
+ const expected = {
2080
+ __del__: 0,
2081
+ __repr__: 0,
2082
+ __str__: 0,
2083
+ __hash__: 0,
2084
+ __bool__: 0,
2085
+ __len__: 0,
2086
+ __eq__: 1,
2087
+ __lt__: 1,
2088
+ __le__: 1,
2089
+ __gt__: 1,
2090
+ __ge__: 1,
2091
+ __ne__: 1
2092
+ };
2093
+ const expectedCount = expected[name];
2094
+ if (expectedCount === undefined)
2095
+ return false;
2096
+ const paramCount = (paramsNode.children ?? []).filter((c) => {
2097
+ if (c.type !== "identifier" && c.type !== "typed_parameter")
2098
+ return false;
2099
+ if (c.text.includes("="))
2100
+ return false;
2101
+ return true;
2102
+ }).length;
2103
+ return paramCount !== expectedCount + 1;
2104
+ }
2105
+ case "no_super_call": {
2106
+ const bodyNode = captures.BODY;
2107
+ if (!bodyNode)
2108
+ return true;
2109
+ return !/(?<!\/\/.*)super\s*\(/.test(bodyNode.text);
2110
+ }
2111
+ case "in_test_block": {
2112
+ const first = Object.values(captures)[0];
2113
+ return !!first && this.navigator.isInTestBlock(first);
2114
+ }
2115
+ case "not_in_test_block": {
2116
+ const first = Object.values(captures)[0];
2117
+ return !first || !this.navigator.isInTestBlock(first);
2118
+ }
2119
+ case "not_in_try_catch": {
2120
+ const first = Object.values(captures)[0];
2121
+ return !first || !this.navigator.isInTryCatch(first);
2122
+ }
2123
+ case "in_try_catch": {
2124
+ const first = Object.values(captures)[0];
2125
+ return !!first && this.navigator.isInTryCatch(first);
2126
+ }
2127
+ case "name_matches_param": {
2128
+ const nameNode = captures.NAME;
2129
+ const paramNode = captures.PARAM;
2130
+ return !!nameNode && !!paramNode && nameNode.text === paramNode.text;
2131
+ }
2132
+ case "not_in_function": {
2133
+ const first = Object.values(captures)[0];
2134
+ return !first || !this.navigator.isInside(first, [
2135
+ "function_definition",
2136
+ "function_declaration",
2137
+ "method_definition",
2138
+ "arrow_function"
2139
+ ]);
2140
+ }
2141
+ case "check_secret_pattern": {
2142
+ const varName = captures.VARNAME?.text ?? "";
2143
+ const varNameLower = varName.toLowerCase();
2144
+ if (varName === varName.toUpperCase() && /[A-Z]/.test(varName)) {
2145
+ return false;
2146
+ }
2147
+ return [
2148
+ /api[_-]?key/,
2149
+ /api[_-]?secret/,
2150
+ /password/,
2151
+ /passwd/,
2152
+ /secret/,
2153
+ /token/,
2154
+ /auth/,
2155
+ /private[_-]?key/,
2156
+ /access[_-]?token/,
2157
+ /credentials/,
2158
+ /aws[_-]?secret/,
2159
+ /github[_-]?token/,
2160
+ /client[_-]?secret/
2161
+ ].some((p) => p.test(varNameLower));
2162
+ }
2163
+ case "returns_error": {
2164
+ const first = Object.values(captures)[0];
2165
+ if (!first)
2166
+ return false;
2167
+ const funcNode = this.navigator.findParent(first, [
2168
+ "function_declaration",
2169
+ "method_declaration"
2170
+ ]);
2171
+ if (!funcNode)
2172
+ return false;
2173
+ const signature = String(funcNode.text ?? "").split("{", 1)[0]?.trim() ?? "";
2174
+ const returnPart = signature.match(/func\s*(?:\([^)]*\)\s*)?[A-Za-z_]\w*\s*\([^)]*\)\s*(.*)$/s)?.[1]?.trim() ?? "";
2175
+ return returnPart.length > 0 && /\berror\b/.test(returnPart);
2176
+ }
2177
+ case "python_empty_except": {
2178
+ const bodyNode = captures.BODY;
2179
+ if (!bodyNode)
2180
+ return true;
2181
+ return !bodyNode.children.some((c) => c.isNamed && c.type !== "pass_statement" && c.type !== "comment");
2182
+ }
2183
+ case "check_in_operator_types": {
2184
+ const target = captures.TARGET;
2185
+ if (!target)
2186
+ return false;
2187
+ return ["none", "true", "false", "integer", "float"].includes(target.type);
2188
+ }
2189
+ case "torchscript_super_call": {
2190
+ const call = captures.CALL;
2191
+ if (!call)
2192
+ return false;
2193
+ const isTorchScriptDecorated = (node) => {
2194
+ const decorated = node?.parent;
2195
+ if (!decorated || decorated.type !== "decorated_definition")
2196
+ return false;
2197
+ return (decorated.children ?? []).some((c) => c.type === "decorator" && /^@(torch\.jit\.script|jit\.script)$/.test(c.text ?? ""));
2198
+ };
2199
+ const methodNode = this.navigator.findParent(call, [
2200
+ "function_definition"
2201
+ ]);
2202
+ if (!methodNode)
2203
+ return false;
2204
+ const classNode = this.navigator.findParent(methodNode, [
2205
+ "class_definition"
2206
+ ]);
2207
+ return isTorchScriptDecorated(methodNode) || isTorchScriptDecorated(classNode);
2208
+ }
2209
+ case "exit_params_insufficient": {
2210
+ const params = captures.PARAMS;
2211
+ if (!params)
2212
+ return true;
2213
+ const named = (params.children ?? []).filter((c) => c.isNamed);
2214
+ if (named.some((c) => c.type === "list_splat_pattern" || c.type === "dictionary_splat_pattern")) {
2215
+ return false;
2216
+ }
2217
+ return named.length < 4;
2218
+ }
2219
+ case "ruby_empty_rescue": {
2220
+ const bodyNode = captures.BODY;
2221
+ if (!bodyNode)
2222
+ return true;
2223
+ return !bodyNode.children.some((c) => c.isNamed && !["comment", "nil", "nil_literal"].includes(c.type));
2224
+ }
2225
+ case "ts_command_injection_sink":
2226
+ return captures.MOD?.text === "child_process" && /^(exec|execSync)$/.test(captures.FN?.text ?? "");
2227
+ case "ts_sql_injection_sink": {
2228
+ const template = captures.TEMPLATE?.text ?? "";
2229
+ const rawPrefix = template.replace(/^`/, "").replace(/`$/, "").replace(/^(?:\s|\/\*[\s\S]*?\*\/|--[^\n]*(?:\n|$))*/, "");
2230
+ if (/^(?:SELECT[\s\S]*(?:\bFROM\b|\$\{)|INSERT\s+INTO\b|UPDATE\s+[\s\S]*\bSET\b|DELETE\s+FROM\b|CREATE\s+(?:OR\s+REPLACE\s+|TEMP(?:ORARY)?\s+|UNIQUE\s+|MATERIALIZED\s+)*(?:TABLE|INDEX|VIEW|SCHEMA|DATABASE|TRIGGER|FUNCTION|PROCEDURE|SEQUENCE|TYPE|EXTENSION)\b|DROP\s+(?:OR\s+REPLACE\s+|TEMP(?:ORARY)?\s+|UNIQUE\s+|MATERIALIZED\s+)*(?:TABLE|INDEX|VIEW|SCHEMA|DATABASE|TRIGGER|FUNCTION|PROCEDURE|SEQUENCE|TYPE|EXTENSION)\b|ALTER\s+(?:OR\s+REPLACE\s+|TEMP(?:ORARY)?\s+|UNIQUE\s+|MATERIALIZED\s+)*(?:TABLE|INDEX|VIEW|SCHEMA|DATABASE|TRIGGER|FUNCTION|PROCEDURE|SEQUENCE|TYPE|EXTENSION)\b|GRANT\b|REVOKE\b|WITH[\s\S]*\bSELECT\b|MERGE\s+INTO\b|TRUNCATE\s+TABLE\b|REPLACE\s+INTO\b)/i.test(rawPrefix))
2231
+ return true;
2232
+ if (!rootNode || !captures.OBJ)
2233
+ return false;
2234
+ let imported = TYPESCRIPT_SQL_IMPORTS.get(rootNode);
2235
+ if (!imported) {
2236
+ const names = new Set;
2237
+ const stack = [rootNode];
2238
+ while (stack.length > 0) {
2239
+ const node = stack.pop();
2240
+ if (!node)
2241
+ continue;
2242
+ if (node.type === "import_statement") {
2243
+ const source = node.childForFieldName?.("source")?.text ?? "";
2244
+ const packageName = source.replace(/^['"]|['"]$/g, "");
2245
+ const isKnown = [...TYPESCRIPT_SQL_KNOWN_PACKAGES].some((pkg) => packageName === pkg || packageName.startsWith(`${pkg}/`));
2246
+ if (isKnown) {
2247
+ const importStack = [node];
2248
+ while (importStack.length > 0) {
2249
+ const importNode = importStack.pop();
2250
+ if (!importNode)
2251
+ continue;
2252
+ if (importNode.type === "identifier" || importNode.type === "import_specifier") {
2253
+ names.add(importNode.text);
2254
+ }
2255
+ importStack.push(...importNode.children);
2256
+ }
2257
+ }
2258
+ }
2259
+ stack.push(...node.children);
2260
+ }
2261
+ const declarations = new Map;
2262
+ const declarationStack = [rootNode];
2263
+ while (declarationStack.length > 0) {
2264
+ const node = declarationStack.pop();
2265
+ if (!node)
2266
+ continue;
2267
+ if (node.type === "variable_declarator") {
2268
+ const name = node.childForFieldName?.("name")?.text;
2269
+ const value = node.childForFieldName?.("value");
2270
+ if (name && value)
2271
+ declarations.set(name, value);
2272
+ }
2273
+ declarationStack.push(...node.children);
2274
+ }
2275
+ const resolvesKnownValue = (node, seen = new Set) => {
2276
+ if (node.type === "identifier") {
2277
+ if (names.has(node.text))
2278
+ return true;
2279
+ if (seen.has(node.text))
2280
+ return false;
2281
+ const value = declarations.get(node.text);
2282
+ if (!value)
2283
+ return false;
2284
+ seen.add(node.text);
2285
+ return resolvesKnownValue(value, seen);
2286
+ }
2287
+ if (node.type === "await_expression") {
2288
+ const value = node.children.find((child) => child.isNamed);
2289
+ return value ? resolvesKnownValue(value, seen) : false;
2290
+ }
2291
+ if (node.type === "new_expression") {
2292
+ const ctor = node.childForFieldName?.("constructor");
2293
+ return ctor ? resolvesKnownValue(ctor, seen) : false;
2294
+ }
2295
+ if (node.type === "call_expression") {
2296
+ const fn = node.childForFieldName?.("function");
2297
+ return fn ? resolvesKnownValue(fn, seen) : false;
2298
+ }
2299
+ return false;
2300
+ };
2301
+ let changed = true;
2302
+ while (changed) {
2303
+ changed = false;
2304
+ for (const [name, value] of declarations) {
2305
+ if (!names.has(name) && resolvesKnownValue(value)) {
2306
+ names.add(name);
2307
+ changed = true;
2308
+ }
2309
+ }
2310
+ }
2311
+ imported = names;
2312
+ TYPESCRIPT_SQL_IMPORTS.set(rootNode, imported);
2313
+ }
2314
+ const resolvesToKnownClient = (node) => {
2315
+ if (node.type === "identifier")
2316
+ return imported.has(node.text);
2317
+ if (node.type === "await_expression") {
2318
+ const value = node.children.find((child) => child.isNamed);
2319
+ return value ? resolvesToKnownClient(value) : false;
2320
+ }
2321
+ if (node.type === "new_expression") {
2322
+ const ctor = node.childForFieldName?.("constructor");
2323
+ return ctor ? resolvesToKnownClient(ctor) : false;
2324
+ }
2325
+ if (node.type === "call_expression") {
2326
+ const fn = node.childForFieldName?.("function");
2327
+ return fn ? resolvesToKnownClient(fn) : false;
2328
+ }
2329
+ return false;
2330
+ };
2331
+ return resolvesToKnownClient(captures.OBJ);
2332
+ }
2333
+ case "ts_ssrf_sink": {
2334
+ const fn = captures.FN?.text ?? "";
2335
+ const obj = captures.OBJ?.text ?? "";
2336
+ const urlText = captures.URL?.text ?? "";
2337
+ const allowedFns = new Set([
2338
+ "fetch",
2339
+ "request",
2340
+ "get",
2341
+ "post",
2342
+ "put",
2343
+ "patch",
2344
+ "delete"
2345
+ ]);
2346
+ if (!allowedFns.has(fn))
2347
+ return false;
2348
+ if (rootNode && captures.URL?.type === "identifier" && this.resolvesToFileLiteralConst(urlText, rootNode)) {
2349
+ return false;
2350
+ }
2351
+ if (rootNode && captures.URL) {
2352
+ const urlVar = this.newUrlBaseVarName(captures.URL);
2353
+ if (urlVar && this.resolvesToFixedNewUrlConst(urlVar, rootNode)) {
2354
+ return false;
2355
+ }
2356
+ }
2357
+ const looksLikeExternalInput = urlText.includes(".") || /user|external|remote|input|target|webhook|callback|redirect|untrusted|arbitrary/i.test(urlText);
2358
+ if (!looksLikeExternalInput)
2359
+ return false;
2360
+ if (!obj)
2361
+ return fn === "fetch";
2362
+ return new Set([
2363
+ "axios",
2364
+ "http",
2365
+ "https",
2366
+ "got",
2367
+ "request",
2368
+ "superagent",
2369
+ "undici"
2370
+ ]).has(obj);
2371
+ }
2372
+ case "ts_weak_hash_algorithm":
2373
+ return captures.FN?.text === "createHash" && /^(md5|sha1)$/i.test(captures.ALG?.text ?? "");
2374
+ case "ts_insecure_random_source": {
2375
+ if (captures.OBJ?.text !== "Math" || captures.FN?.text !== "random")
2376
+ return false;
2377
+ const varName = this.enclosingBindingName(captures.CALL ?? captures.VAR);
2378
+ return /token|secret|password|key|nonce|salt|csrf|auth|session|credential|hash|otp|pin/i.test(varName);
2379
+ }
2380
+ case "ts_detached_async_call":
2381
+ return /(Async$|fetch$|request$)/.test(captures.FN?.text ?? "");
2382
+ case "incomplete_assertion": {
2383
+ const expectNode = captures.EXPECT;
2384
+ if (!expectNode)
2385
+ return false;
2386
+ const CHAI_PROPERTY_ASSERTIONS = new Set([
2387
+ "true",
2388
+ "false",
2389
+ "null",
2390
+ "undefined",
2391
+ "empty",
2392
+ "NaN",
2393
+ "finite",
2394
+ "exist",
2395
+ "arguments",
2396
+ "extensible",
2397
+ "sealed",
2398
+ "frozen",
2399
+ "locked"
2400
+ ]);
2401
+ let current = expectNode.parent;
2402
+ if (!current)
2403
+ return false;
2404
+ current = current.parent;
2405
+ if (!current)
2406
+ return false;
2407
+ if (current.type === "expression_statement" || current.type === "return_statement")
2408
+ return true;
2409
+ let lastPropertyName = null;
2410
+ while (current && current.type === "member_expression") {
2411
+ const propNode = current.children?.find((c) => c.type === "property_identifier");
2412
+ if (propNode)
2413
+ lastPropertyName = propNode.text;
2414
+ const parent = current.parent;
2415
+ if (!parent)
2416
+ return false;
2417
+ if (parent.type === "expression_statement" || parent.type === "return_statement") {
2418
+ if (lastPropertyName && CHAI_PROPERTY_ASSERTIONS.has(lastPropertyName))
2419
+ return false;
2420
+ return true;
2421
+ }
2422
+ if (parent.type === "call_expression")
2423
+ return false;
2424
+ current = parent;
2425
+ }
2426
+ return false;
2427
+ }
2428
+ case "py_command_injection_sink": {
2429
+ const mod = captures.MOD?.text ?? "";
2430
+ const fn = captures.FN?.text ?? "";
2431
+ const kw = captures.KW?.text ?? "";
2432
+ return mod === "os" && /^(system|popen)$/.test(fn) || mod === "subprocess" && /^(run|Popen|call|check_output|check_call)$/.test(fn) && kw === "shell";
2433
+ }
2434
+ case "go_command_injection_sink":
2435
+ return captures.PKG?.text === "exec" && /^(Command|CommandContext)$/.test(captures.FN?.text ?? "") && /^"(sh|bash|zsh|cmd|powershell|pwsh)"$/.test(captures.SHELL?.text ?? "") && /^"(-c|\/c)"$/.test(captures.FLAG?.text ?? "");
2436
+ case "ruby_command_injection_sink":
2437
+ return /^(system|exec|spawn|popen|capture3|capture2|capture2e)$/.test(captures.FN?.text ?? "");
2438
+ case "py_ssrf_sink":
2439
+ return captures.MOD?.text === "requests" && /^(get|post|put|patch|delete|request|head|options)$/.test(captures.FN?.text ?? "");
2440
+ case "py_path_traversal_sink":
2441
+ return /^(open|read_text|read_bytes|write_text|write_bytes|remove|unlink|rmdir)$/.test(captures.FN?.text ?? "");
2442
+ case "go_path_traversal_sink":
2443
+ return /^(os|ioutil)$/.test(captures.PKG?.text ?? "") && /^(Open|OpenFile|ReadFile|WriteFile|Create|Remove|RemoveAll)$/.test(captures.FN?.text ?? "");
2444
+ case "py_sql_injection_sink": {
2445
+ const fn = captures.FN?.text ?? "";
2446
+ if (!PYTHON_SQL_SINK_METHODS.has(fn))
2447
+ return false;
2448
+ const sqlNode = captures.SQL;
2449
+ const receiver = captures.OBJ;
2450
+ if (fn === "execute" && this.isLikelySqlAlchemyReceiver(receiver?.text ?? "")) {
2451
+ return false;
2452
+ }
2453
+ if (sqlNode && this.isSafeSqlAlchemyExpressionCall(sqlNode)) {
2454
+ return false;
2455
+ }
2456
+ if (isProvenSqlAlchemySessionReceiver(receiver, rootNode)) {
2457
+ if (fn === "query" && isSqlAlchemyEntityQueryArgument(sqlNode, rootNode)) {
2458
+ return false;
2459
+ }
2460
+ if (fn === "execute" && isSqlAlchemyStatementArgument(sqlNode, rootNode)) {
2461
+ return false;
2462
+ }
2463
+ }
2464
+ if (isSafePsycopgIdentifierComposition(sqlNode, rootNode)) {
2465
+ return false;
2466
+ }
2467
+ return true;
2468
+ }
2469
+ case "go_sql_injection_sink":
2470
+ return /^(Query|QueryContext|QueryRow|QueryRowContext|Exec|ExecContext)$/.test(captures.DBFN?.text ?? "") && captures.FMTPKG?.text === "fmt" && captures.FMTFN?.text === "Sprintf";
2471
+ case "py_insecure_deserialization_sink":
2472
+ return /^(pickle|yaml)$/.test(captures.MOD?.text ?? "") && /^(load|loads|unsafe_load)$/.test(captures.FN?.text ?? "");
2473
+ case "ruby_insecure_deserialization_sink":
2474
+ return /^(Marshal|YAML|Psych)$/.test(captures.MOD?.text ?? "") && /^(load|unsafe_load)$/.test(captures.FN?.text ?? "");
2475
+ case "match_captures": {
2476
+ for (const [captureName, pattern] of Object.entries(postFilterParams ?? {})) {
2477
+ const node = captures[captureName];
2478
+ if (!node)
2479
+ return false;
2480
+ if (!new RegExp(pattern).test(node.text))
2481
+ return false;
2482
+ }
2483
+ return true;
2484
+ }
2485
+ case "case_range_single_value": {
2486
+ const start = captures.START?.text ?? "";
2487
+ const end = captures.END?.text ?? "";
2488
+ return start === end;
2489
+ }
2490
+ case "goto_jumps_backward": {
2491
+ const label = captures.LABEL;
2492
+ const gotoNode = captures.GOTO;
2493
+ if (!label || !gotoNode)
2494
+ return false;
2495
+ return label.startIndex < gotoNode.startIndex;
2496
+ }
2497
+ case "goto_targets_inner_block": {
2498
+ const target = captures.TARGET;
2499
+ if (!target)
2500
+ return false;
2501
+ let depth = 0;
2502
+ let node = target.parent;
2503
+ while (node) {
2504
+ if (node.type === "compound_statement")
2505
+ depth++;
2506
+ node = node.parent;
2507
+ }
2508
+ return depth >= 2;
2509
+ }
2510
+ case "c_memset_sensitive_arg": {
2511
+ const callNode = captures.CALL;
2512
+ if (!callNode || callNode.type !== "call_expression")
2513
+ return false;
2514
+ const argList = callNode.children?.find((c) => c.type === "argument_list");
2515
+ if (!argList)
2516
+ return false;
2517
+ const firstArg = argList.children?.find((c) => c.isNamed);
2518
+ if (!firstArg)
2519
+ return false;
2520
+ const argName = firstArg.text ?? "";
2521
+ return /password|secret|key|token|credential|auth|private|passwd|pin|salt|nonce|iv|seed/i.test(argName);
2522
+ }
2523
+ case "c_stdlib_name": {
2524
+ const name = captures.NAME?.text ?? "";
2525
+ const STDLIB_NAMES = new Set([
2526
+ "malloc",
2527
+ "calloc",
2528
+ "realloc",
2529
+ "free",
2530
+ "alloca",
2531
+ "printf",
2532
+ "fprintf",
2533
+ "sprintf",
2534
+ "snprintf",
2535
+ "vprintf",
2536
+ "vfprintf",
2537
+ "vsprintf",
2538
+ "vsnprintf",
2539
+ "scanf",
2540
+ "fscanf",
2541
+ "sscanf",
2542
+ "vscanf",
2543
+ "vfscanf",
2544
+ "vsscanf",
2545
+ "strcpy",
2546
+ "strncpy",
2547
+ "strcat",
2548
+ "strncat",
2549
+ "strcmp",
2550
+ "strncmp",
2551
+ "strlen",
2552
+ "strchr",
2553
+ "strrchr",
2554
+ "strstr",
2555
+ "strerror",
2556
+ "memcpy",
2557
+ "memmove",
2558
+ "memset",
2559
+ "memcmp",
2560
+ "memchr",
2561
+ "fopen",
2562
+ "fclose",
2563
+ "fread",
2564
+ "fwrite",
2565
+ "fgets",
2566
+ "fputs",
2567
+ "getc",
2568
+ "putc",
2569
+ "getchar",
2570
+ "putchar",
2571
+ "exit",
2572
+ "abort",
2573
+ "assert",
2574
+ "errno",
2575
+ "abs",
2576
+ "labs",
2577
+ "llabs",
2578
+ "div",
2579
+ "ldiv",
2580
+ "lldiv",
2581
+ "atoi",
2582
+ "atol",
2583
+ "atoll",
2584
+ "strtol",
2585
+ "strtoll",
2586
+ "strtoul",
2587
+ "strtoull",
2588
+ "strtod",
2589
+ "strtof",
2590
+ "strtold",
2591
+ "qsort",
2592
+ "bsearch",
2593
+ "time",
2594
+ "clock",
2595
+ "difftime",
2596
+ "mktime",
2597
+ "strftime",
2598
+ "getenv",
2599
+ "setenv",
2600
+ "putenv",
2601
+ "system",
2602
+ "isalpha",
2603
+ "isdigit",
2604
+ "isalnum",
2605
+ "isspace",
2606
+ "isupper",
2607
+ "islower",
2608
+ "toupper",
2609
+ "tolower",
2610
+ "sizeof",
2611
+ "offsetof",
2612
+ "NULL",
2613
+ "EXIT_SUCCESS",
2614
+ "EXIT_FAILURE"
2615
+ ]);
2616
+ return STDLIB_NAMES.has(name);
2617
+ }
2618
+ case "c_octal_literal": {
2619
+ const num = captures.NUM?.text ?? "";
2620
+ return /^0[0-7]+$/.test(num);
2621
+ }
2622
+ case "c_noreturn_attr": {
2623
+ const attr = captures.ATTR?.text ?? "";
2624
+ return attr === "noreturn";
2625
+ }
2626
+ case "c_label_in_switch": {
2627
+ const stmt = captures.STMT;
2628
+ if (!stmt)
2629
+ return false;
2630
+ let node = stmt.parent;
2631
+ while (node) {
2632
+ if (node.type === "switch_statement")
2633
+ return true;
2634
+ node = node.parent;
2635
+ }
2636
+ return false;
2637
+ }
2638
+ default:
2639
+ this.reportMissingPostFilter(postFilter);
2640
+ return false;
2641
+ }
2642
+ }
2643
+ reportedMissingPostFilters = new Set;
2644
+ reportedPostFilterFailures = new Set;
2645
+ reportPostFilterFailure(postFilter, reason) {
2646
+ if (this.reportedPostFilterFailures.has(postFilter))
2647
+ return;
2648
+ this.reportedPostFilterFailures.add(postFilter);
2649
+ logTreeSitterDiagnostic({
2650
+ subsystem: "tree-sitter-client",
2651
+ message: `tree-sitter rule post_filter '${postFilter}' failed — ` + `keeping the diagnostic (fail-open): ${reason}.`,
2652
+ metadata: { postFilter }
2653
+ });
2654
+ }
2655
+ reportMissingPostFilter(postFilter) {
2656
+ if (this.reportedMissingPostFilters.has(postFilter))
2657
+ return;
2658
+ this.reportedMissingPostFilters.add(postFilter);
2659
+ logTreeSitterDiagnostic({
2660
+ subsystem: "tree-sitter-client",
2661
+ message: `tree-sitter rule post_filter '${postFilter}' is not implemented — ` + `matches for the rules using it are suppressed rather than reported unfiltered. ` + `Implement it in applyPostFilter (clients/tree-sitter-client.ts) to re-enable them.`,
2662
+ metadata: { postFilter }
2663
+ });
2664
+ }
2665
+ textPredicatesInvalidLogged = false;
2666
+ hasValidTextPredicates(query) {
2667
+ const valid = Array.isArray(query?.textPredicates);
2668
+ if (!valid) {
2669
+ if (!this.textPredicatesInvalidLogged) {
2670
+ this.textPredicatesInvalidLogged = true;
2671
+ logTreeSitterDiagnostic({
2672
+ subsystem: "tree-sitter-client",
2673
+ message: "web-tree-sitter Query.textPredicates is missing or not an array — " + "#match?/#eq? predicates cannot be evaluated. Failing CLOSED: matches " + "for this query are dropped rather than reported unfiltered.",
2674
+ metadata: { textPredicatesType: typeof query?.textPredicates }
2675
+ });
2676
+ }
2677
+ recordDegradationOnce({
2678
+ kind: "query-predicates-invalid",
2679
+ subject: "web-tree-sitter",
2680
+ reason: "Query.textPredicates is missing or not an array — #match?/#eq? " + "predicates cannot be evaluated; structural matches relying on them " + "are dropped fail-closed"
2681
+ });
2682
+ }
2683
+ return valid;
2684
+ }
2685
+ evaluatePredicates(query, match) {
2686
+ if (!this.hasValidTextPredicates(query))
2687
+ return false;
2688
+ const predicates = query.textPredicates?.[match.patternIndex] ?? [];
2689
+ return predicates.every((fn) => fn(match.captures));
2690
+ }
2691
+ async searchFileWithQuery(filePath, query, metavars, languageId, _originalPattern, postFilter, postFilterParams, contentOverride) {
2692
+ const matches = [];
2693
+ await this.parseFileAndUse(filePath, languageId, contentOverride, (tree) => {
2694
+ try {
2695
+ const rootNode = tree.rootNode;
2696
+ const queryMatches = query.matches(rootNode);
2697
+ for (const match of queryMatches) {
2698
+ const captures = {};
2699
+ for (const capture of match.captures) {
2700
+ if (metavars.includes(capture.name)) {
2701
+ captures[capture.name] = capture.node;
2702
+ }
2703
+ }
2704
+ if (!this.evaluatePredicates(query, match)) {
2705
+ continue;
2706
+ }
2707
+ if (postFilter && !this.applyPostFilter(postFilter, postFilterParams, captures, rootNode)) {
2708
+ continue;
2709
+ }
2710
+ if (match.captures.length > 0) {
2711
+ const firstNode = match.captures[0].node;
2712
+ const textCaptures = {};
2713
+ for (const [name, node] of Object.entries(captures)) {
2714
+ textCaptures[name] = node.text;
2715
+ }
2716
+ matches.push({
2717
+ file: filePath,
2718
+ line: firstNode.startPosition.row + 1,
2719
+ column: firstNode.startPosition.column + 1,
2720
+ matchedText: firstNode.text,
2721
+ nodeType: firstNode.type,
2722
+ captures: textCaptures
2723
+ });
2724
+ }
2725
+ }
2726
+ if (matches.length > 0) {
2727
+ this.dbg(`Found ${matches.length} matches in ${path.basename(filePath)}`);
2728
+ }
2729
+ } catch (err) {
2730
+ this.reportWasmAbort(err);
2731
+ this.dbg(`Query matching error: ${err}`);
2732
+ }
2733
+ });
2734
+ return matches;
2735
+ }
2736
+ collectFiles(dir, languageId, fileFilter) {
2737
+ const files = [];
2738
+ const extensions = this.getExtensionsForLanguage(languageId);
2739
+ const rootDir = path.resolve(dir);
2740
+ const ignoreMatcher = getProjectIgnoreMatcher(rootDir);
2741
+ const scan = (d) => {
2742
+ if (files.length >= TREE_SITTER_MAX_SCAN_FILES)
2743
+ return;
2744
+ try {
2745
+ const entries = fs.readdirSync(d, { withFileTypes: true });
2746
+ for (const entry of entries) {
2747
+ if (files.length >= TREE_SITTER_MAX_SCAN_FILES)
2748
+ return;
2749
+ const full = path.join(d, entry.name);
2750
+ if (entry.isDirectory()) {
2751
+ if (isExcludedDirName(entry.name))
2752
+ continue;
2753
+ if (ignoreMatcher.isIgnored(full, true))
2754
+ continue;
2755
+ scan(full);
2756
+ } else if (extensions.some((ext) => entry.name.endsWith(ext))) {
2757
+ if (ignoreMatcher.isIgnored(full, false))
2758
+ continue;
2759
+ if (!fileFilter || fileFilter(full)) {
2760
+ files.push(full);
2761
+ }
2762
+ }
2763
+ }
2764
+ } catch {}
2765
+ };
2766
+ scan(rootDir);
2767
+ return files;
2768
+ }
2769
+ getExtensionsForLanguage(languageId) {
2770
+ const mapping = {
2771
+ typescript: [".ts", ".mts", ".cts"],
2772
+ tsx: [".tsx"],
2773
+ javascript: [".js", ".mjs", ".cjs"],
2774
+ python: [".py"],
2775
+ rust: [".rs"],
2776
+ go: [".go"],
2777
+ java: [".java"],
2778
+ kotlin: [".kt", ".kts"],
2779
+ dart: [".dart"],
2780
+ c: [".c", ".h"],
2781
+ cpp: [".cpp", ".hpp", ".cc", ".hh"],
2782
+ elixir: [".ex", ".exs"],
2783
+ ruby: [".rb"]
2784
+ };
2785
+ return mapping[languageId] || [];
2786
+ }
2787
+ }