@duckmind/dm-linux-x64 0.65.4 → 0.65.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -1,22 +1,23 @@
1
+ import { withFileMutationQueue } from "@duckmind/dm-coding-agent";
2
+ import { resolve } from "node:path";
3
+ import { existsSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ import { isServerDisabled } from "./types.js";
1
6
  import { Type } from "typebox";
2
- import { showStatus, showTools, showPrompts, reconnectServer, reconnectServers, authenticateServer, logoutServer, manageBearerToken, openMcpAuthPanel, openMcpPanel, openMcpSetup } from "./commands.js";
3
- import { cloneMcpConfig, loadMcpConfig, writeProjectServerDisabledOverride } from "./config.js";
4
- import { buildProxyDescription, createDirectToolExecutor, getMissingConfiguredDirectToolServers, prepareDirectToolArguments, resolveDirectTools } from "./direct-tools.js";
5
- import { flushMetadataCache, initializeMcp, updateStatusBar } from "./init.js";
7
+ import { cloneMcpConfig, discoverConfiguredClaudePluginSkills, getPiGlobalConfigPath, getProjectConfigPath, loadMcpConfig, resolveConfiguredClaudePluginMcp, writeProjectServerDisabledOverride, writeSharedServerEntry } from "./config.js";
8
+ import { buildProxyDescription, getLargeDirectToolsAdvisory, getMissingConfiguredDirectToolServers, prepareDirectToolArguments, resolveDirectTools } from "./direct-tool-surface.js";
6
9
  import { isServerInActiveFailureBackoff } from "./failure-backoff.js";
7
- import { loadMetadataCache, parseDirectToolSelectors } from "./metadata-cache.js";
10
+ import { computeServerHash, isServerCacheValid, loadMetadataCache, parseDirectToolSelectors } from "./metadata-cache.js";
8
11
  import { createPromptCommand, resolveCachedPrompts } from "./prompts.js";
9
12
  import { logger } from "./logger.js";
10
- import { executeAuthComplete, executeAuthStart, executeCall, executeConnect, executeDescribe, executeInstructions, executeList, executeSearch, executeStatus, executeUiMessages } from "./proxy-modes.js";
11
- import { formatTerminalError, getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from "./utils.js";
12
- import { createOAuthRuntime, shutdownOAuth } from "./mcp-auth-flow.js";
13
+ import { formatMcpFooterStatus, formatTerminalError, getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from "./utils.js";
13
14
  import { createMcpDirectToolCallRenderer, createMcpProxyToolCallRenderer, createMcpScriptToolCallRenderer, createMcpToolResultRenderer, resolveMcpToolRenderOptions } from "./tool-result-renderer.js";
14
15
  import { toolErrorOverride } from "./error-signal.js";
15
16
  import { createMcpRuntimeOwner, createOwnedUi, isAbortError } from "./runtime-owner.js";
16
17
  import { publishMcpStatusShutdown } from "./mcp-status.js";
17
- import { runMcpScript } from "./mcp-code.js";
18
- import { cleanupMaterializedBinaryResources } from "./tool-registrar.js";
19
18
  import { syncNamespaceProxyTools } from "./namespace-tools.js";
19
+ import { restoreSessionApprovalState } from "./session-approvals.js";
20
+ import { createRetryableLoader } from "./lazy-loader.js";
20
21
  export {
21
22
  namespaceProxyName,
22
23
  parseMcpReference,
@@ -27,15 +28,49 @@ export {
27
28
  MCP_STATUS_SNAPSHOT_VERSION,
28
29
  MCP_TOOL_APPROVAL_REQUEST_EVENT
29
30
  } from "./types.js";
31
+ const loadCoreRuntime = createRetryableLoader(() => import("./init.js"));
32
+ const loadOAuthRuntime = createRetryableLoader(() => import("./mcp-auth-flow.js"));
33
+ const loadProxyModes = createRetryableLoader(() => import("./proxy-modes.js"));
34
+ const loadDirectExecution = createRetryableLoader(() => import("./direct-tools.js"));
35
+ const loadCommands = createRetryableLoader(() => import("./commands.js"));
36
+ const loadCodeMode = createRetryableLoader(() => import("./mcp-code.js"));
37
+ const loadInstallParsing = createRetryableLoader(() => import("./mcp-install.js"));
30
38
  const INIT_WAIT_TIMEOUT_MS = 30000;
31
39
  const INIT_FAILURE_MESSAGE_MAX_CHARS = 1000;
32
40
  const INIT_WAIT_TIMED_OUT = Symbol("init-wait-timed-out");
41
+ function hasEnabledServerWithoutValidMetadata(config, cache, directSpecs = []) {
42
+ return Object.entries(config.mcpServers).some(([serverName, definition]) => {
43
+ if (isServerDisabled(definition) || directSpecs.some((spec) => spec.serverName === serverName))
44
+ return false;
45
+ const entry = cache?.servers[serverName];
46
+ return entry === undefined || !isServerCacheValid(entry, definition);
47
+ });
48
+ }
33
49
  export const MCP_RUNTIME_REGISTER_EVENT = "dm-mcp-adapter:runtime-register:v1";
34
50
  export const MCP_RUNTIME_REGISTER_VERSION = 1;
35
51
  export const MCP_RUNTIME_SNAPSHOT_EVENT = "dm-mcp-adapter:runtime-snapshot:v1";
36
52
  export const MCP_RUNTIME_SNAPSHOT_VERSION = 1;
37
53
  const runtimeRegistrars = new WeakMap;
38
54
  const runtimeSnapshotters = new WeakMap;
55
+ function resolveProgrammaticClaudePluginPath(path, cwd) {
56
+ if (path === "~")
57
+ return resolve(process.env.HOME ?? "", ".");
58
+ if (path.startsWith("~/"))
59
+ return resolve(process.env.HOME ?? "", path.slice(2));
60
+ return resolve(cwd, path);
61
+ }
62
+ function normalizeProgrammaticConfig(config) {
63
+ if (!config.claudePlugins)
64
+ return config;
65
+ const cwd = process.cwd();
66
+ return {
67
+ ...config,
68
+ claudePlugins: config.claudePlugins.map((plugin) => ({
69
+ ...plugin,
70
+ path: resolveProgrammaticClaudePluginPath(plugin.path, cwd)
71
+ }))
72
+ };
73
+ }
39
74
  async function awaitWithTimeout(promise, timeoutMs) {
40
75
  let timer;
41
76
  try {
@@ -67,10 +102,19 @@ function installMcpAdapter(pi, options) {
67
102
  const programmaticConfig = sessionConfig !== undefined;
68
103
  let state = null;
69
104
  let initPromise = null;
105
+ let initStartedPromise = null;
70
106
  let currentOwner = null;
71
107
  let currentOAuthRuntime = null;
72
108
  let lifecycleGeneration = 0;
73
109
  let retainedInitFailure = null;
110
+ let finalizationGuard = null;
111
+ let finalizationRegistrations = null;
112
+ function callReentrant(callback) {
113
+ finalizationGuard?.();
114
+ const result = callback();
115
+ finalizationGuard?.();
116
+ return result;
117
+ }
74
118
  function retainInitFailure(error) {
75
119
  const message = truncateAtWord(formatTerminalError(error), INIT_FAILURE_MESSAGE_MAX_CHARS);
76
120
  retainedInitFailure = message;
@@ -92,27 +136,59 @@ function installMcpAdapter(pi, options) {
92
136
  }
93
137
  return true;
94
138
  }
139
+ function captureRuntimeGuard(expectedState = state) {
140
+ return { generation: lifecycleGeneration, owner: currentOwner, state: expectedState };
141
+ }
142
+ function assertRuntimeGuard(guard) {
143
+ guard.owner?.throwIfInactive();
144
+ if (lifecycleGeneration !== guard.generation || currentOwner !== guard.owner || state !== guard.state) {
145
+ throw guard.owner?.signal.reason ?? new Error("MCP operation belongs to a stale session");
146
+ }
147
+ }
148
+ function isRuntimeGuardStale(guard) {
149
+ return guard.owner?.isActive() === false || lifecycleGeneration !== guard.generation || currentOwner !== guard.owner || state !== guard.state;
150
+ }
151
+ async function loadForRuntime(loader, guard) {
152
+ const loaded = await loader();
153
+ assertRuntimeGuard(guard);
154
+ return loaded;
155
+ }
156
+ function createCommandContext(ctx, owner) {
157
+ const commandCtx = Object.create(ctx);
158
+ const hasUI = ctx.hasUI;
159
+ Object.defineProperties(commandCtx, {
160
+ hasUI: { value: hasUI, enumerable: true },
161
+ ui: {
162
+ value: hasUI ? owner ? createOwnedUi(ctx.ui, owner) : ctx.ui : undefined,
163
+ enumerable: true
164
+ },
165
+ signal: { value: owner?.signal ?? ctx.signal, enumerable: true }
166
+ });
167
+ return commandCtx;
168
+ }
95
169
  function startGatewayRetryInitialization(ctx) {
96
170
  const generation = ++lifecycleGeneration;
97
171
  const owner = createMcpRuntimeOwner();
98
- const oauthRuntime = createOAuthRuntime(owner.signal);
99
172
  currentOwner = owner;
100
- currentOAuthRuntime = oauthRuntime;
173
+ currentOAuthRuntime = null;
101
174
  state = null;
102
- startInitialization(ctx, owner, oauthRuntime, generation, "stale_gateway_retry_initialization");
175
+ startInitialization(ctx, owner, generation, "stale_gateway_retry_initialization");
103
176
  }
104
- async function shutdownState(currentState, reason) {
177
+ async function shutdownState(currentState, reason, publishStatus = true) {
105
178
  if (!currentState) {
106
- publishMcpStatusShutdown(pi.events);
179
+ if (publishStatus)
180
+ publishMcpStatusShutdown(pi.events);
107
181
  return;
108
182
  }
109
- publishMcpStatusShutdown(currentState.statusEvents);
183
+ if (publishStatus)
184
+ publishMcpStatusShutdown(currentState.statusEvents);
110
185
  if (currentState.uiServer) {
111
186
  currentState.uiServer.close(reason);
112
187
  currentState.uiServer = null;
113
188
  }
114
189
  let flushError;
115
190
  try {
191
+ const { flushMetadataCache } = await loadCoreRuntime();
116
192
  flushMetadataCache(currentState);
117
193
  } catch (error) {
118
194
  flushError = error;
@@ -134,21 +210,41 @@ function installMcpAdapter(pi, options) {
134
210
  throw flushError;
135
211
  }
136
212
  }
213
+ function restoreCurrentSessionApprovals(targetState) {
214
+ const sessionManager = targetState.sessionManager;
215
+ if (!sessionManager)
216
+ return;
217
+ let branch = [];
218
+ try {
219
+ branch = sessionManager.getBranch();
220
+ } catch (error) {
221
+ const detail = error instanceof Error ? error.message : String(error);
222
+ logger.debug(`MCP: could not read the active session branch for approval restore: ${detail}`);
223
+ }
224
+ restoreSessionApprovalState(targetState, branch);
225
+ }
137
226
  const earlyConfigPath = programmaticConfig ? undefined : options.configPath ?? getConfigPathFromArgv();
138
- const earlyConfig = programmaticConfig ? cloneMcpConfig(sessionConfig) : loadMcpConfig(earlyConfigPath);
227
+ const earlyConfig = programmaticConfig ? resolveConfiguredClaudePluginMcp(cloneMcpConfig(sessionConfig), process.cwd()) : loadMcpConfig(earlyConfigPath);
139
228
  const earlyCache = loadMetadataCache();
140
229
  const envRaw = process.env.MCP_DIRECT_TOOLS;
141
230
  const envDirectToolOverride = parseEnvDirectToolOverride(envRaw);
142
231
  const namespaceEnvOverride = resolveNamespaceEnvOverride(envRaw, envDirectToolOverride);
232
+ const hasStartupServer = Object.values(earlyConfig.mcpServers).some((definition) => !isServerDisabled(definition) && (definition.lifecycle === "eager" || definition.lifecycle === "keep-alive"));
143
233
  const registeredDirectTools = new Map;
234
+ const registeredDirectToolServers = new Map;
235
+ const registeredDirectToolVersions = new Map;
236
+ const reportedDirectToolNamesByServer = new Map;
144
237
  const registeredNamespaceProxyTools = new Set;
145
238
  const fallbackDeactivatedTools = new Set;
239
+ const lazyDirectTools = new Set;
240
+ const searchActivatedTools = new Set;
146
241
  const toolRenderOptions = resolveMcpToolRenderOptions(earlyConfig.settings);
147
242
  const toolRenderShell = toolRenderOptions.resultRendering === "compact" ? "self" : "default";
148
243
  const renderMcpToolResult = createMcpToolResultRenderer(toolRenderOptions);
149
244
  let proxyToolRegistered = false;
150
245
  let proxyToolDescription = null;
151
246
  let directToolsFrozen = false;
247
+ let largeDirectToolsAdvisoryDelivered = false;
152
248
  const runtimeServers = new Map;
153
249
  function attachRuntimeServerLifecycle(targetState, name, definition) {
154
250
  const lifecycleMode = definition.lifecycle ?? "lazy";
@@ -168,22 +264,89 @@ function installMcpAdapter(pi, options) {
168
264
  inputSchema: spec.inputSchema,
169
265
  resourceUri: spec.resourceUri,
170
266
  uiResourceUri: spec.uiResourceUri,
171
- uiStreamMode: spec.uiStreamMode
267
+ uiStreamMode: spec.uiStreamMode,
268
+ lazy: spec.lazy === true
172
269
  });
173
270
  }
271
+ function forgetReportedDirectToolName(serverName, toolName) {
272
+ if (!serverName)
273
+ return;
274
+ const reportedNames = reportedDirectToolNamesByServer.get(serverName);
275
+ if (!reportedNames)
276
+ return;
277
+ reportedNames.delete(toolName);
278
+ if (reportedNames.size === 0)
279
+ reportedDirectToolNamesByServer.delete(serverName);
280
+ }
174
281
  function registerDirectTool(spec, config) {
175
- pi.registerTool({
282
+ finalizationRegistrations?.add(spec.prefixedName);
283
+ callReentrant(() => pi.registerTool({
176
284
  name: spec.prefixedName,
177
285
  label: `MCP: ${spec.originalName}`,
178
286
  description: spec.description || "(no description)",
179
287
  promptSnippet: truncateAtWord(spec.description, 100) || `MCP tool from ${spec.serverName}`,
180
288
  parameters: toToolParameters(normalizeDirectToolInputSchema(spec.inputSchema)),
181
289
  ...config.settings?.strictDirectToolArguments === true ? { prepareArguments: (args) => prepareDirectToolArguments(spec.inputSchema, args) } : {},
182
- execute: createDirectToolExecutor(() => state, () => initPromise, spec),
290
+ async execute(toolCallId, params, signal, onUpdate, ctx) {
291
+ let executor;
292
+ let guard;
293
+ try {
294
+ const targetState = await ensureSessionRuntime(ctx);
295
+ if (!targetState)
296
+ throw new Error("MCP not initialized");
297
+ guard = captureRuntimeGuard(targetState);
298
+ const executionGuard = guard;
299
+ const { createDirectToolExecutor } = await loadForRuntime(loadDirectExecution, executionGuard);
300
+ executor = createDirectToolExecutor(() => executionGuard.state, () => initPromise, spec);
301
+ } catch (error) {
302
+ if (guard && (isRuntimeGuardStale(guard) || guard.owner && isOwnerAbortError(error, guard.owner)))
303
+ throw error;
304
+ const message = error instanceof Error ? error.message : String(error);
305
+ return {
306
+ content: [{ type: "text", text: `MCP initialization failed for ${spec.serverName}: ${message}` }],
307
+ details: { error: "init_failed", server: spec.serverName, message }
308
+ };
309
+ }
310
+ if (!guard)
311
+ throw new Error("MCP runtime guard unavailable");
312
+ assertRuntimeGuard(guard);
313
+ return executor(toolCallId, params, signal, onUpdate, ctx);
314
+ },
183
315
  renderShell: toolRenderShell,
184
316
  renderCall: createMcpDirectToolCallRenderer(spec.prefixedName, toolRenderOptions),
185
317
  renderResult: renderMcpToolResult
186
- });
318
+ }));
319
+ }
320
+ function holdLazyToolsInactive() {
321
+ if (lazyDirectTools.size === 0)
322
+ return;
323
+ const activeTools = getActiveToolsIfReady();
324
+ if (!activeTools)
325
+ return;
326
+ const next = activeTools.filter((name) => !lazyDirectTools.has(name) || searchActivatedTools.has(name));
327
+ if (next.length !== activeTools.length)
328
+ pi.setActiveTools(next);
329
+ }
330
+ function activateSearchMatches(matches) {
331
+ const activeTools = getActiveToolsIfReady();
332
+ if (!activeTools)
333
+ return [];
334
+ const activeSet = new Set(activeTools);
335
+ const added = [];
336
+ for (const match of matches) {
337
+ const name = match.tool;
338
+ if (!lazyDirectTools.has(name) || registeredDirectToolServers.get(name) !== match.server)
339
+ continue;
340
+ if (activeSet.has(name) || added.includes(name))
341
+ continue;
342
+ added.push(name);
343
+ }
344
+ if (added.length > 0) {
345
+ pi.setActiveTools([...activeTools, ...added]);
346
+ for (const name of added)
347
+ searchActivatedTools.add(name);
348
+ }
349
+ return added;
187
350
  }
188
351
  function activeFailureServers() {
189
352
  const currentState = state;
@@ -199,7 +362,7 @@ function installMcpAdapter(pi, options) {
199
362
  }
200
363
  function getActiveToolsIfReady() {
201
364
  try {
202
- return pi.getActiveTools?.();
365
+ return callReentrant(() => pi.getActiveTools?.());
203
366
  } catch (error) {
204
367
  if (error instanceof Error && error.message.includes("Action methods cannot be called during extension loading"))
205
368
  return;
@@ -210,21 +373,19 @@ function installMcpAdapter(pi, options) {
210
373
  if (toolNames.length === 0)
211
374
  return [];
212
375
  const unregisterTool = pi.unregisterTool;
213
- const unregistered = toolNames.filter((toolName) => unregisterTool?.(toolName) === true);
376
+ const unregistered = toolNames.filter((toolName) => callReentrant(() => unregisterTool?.(toolName)) === true);
214
377
  const fallbackNames = toolNames.filter((toolName) => !unregistered.includes(toolName));
215
- const remove = new Set(toolNames);
216
378
  const activeTools = getActiveToolsIfReady();
217
- if (!activeTools || activeTools.length === 0) {
218
- for (const toolName of fallbackNames)
219
- fallbackDeactivatedTools.add(toolName);
379
+ if (!activeTools)
220
380
  return unregistered;
221
- }
381
+ const removedFallbackNames = fallbackNames.filter((name) => activeTools.includes(name));
382
+ if (removedFallbackNames.length === 0)
383
+ return unregistered;
384
+ const remove = new Set(removedFallbackNames);
222
385
  const nextActiveTools = activeTools.filter((name) => !remove.has(name));
223
- if (nextActiveTools.length !== activeTools.length) {
224
- for (const toolName of fallbackNames)
225
- fallbackDeactivatedTools.add(toolName);
226
- pi.setActiveTools(nextActiveTools);
227
- }
386
+ callReentrant(() => pi.setActiveTools(nextActiveTools));
387
+ for (const toolName of removedFallbackNames)
388
+ fallbackDeactivatedTools.add(toolName);
228
389
  return unregistered;
229
390
  }
230
391
  function syncDirectTools(config, cache) {
@@ -238,24 +399,45 @@ function installMcpAdapter(pi, options) {
238
399
  const fingerprint = directToolFingerprint(spec);
239
400
  const previous = registeredDirectTools.get(spec.prefixedName);
240
401
  if (previous !== fingerprint) {
402
+ const previousServer = registeredDirectToolServers.get(spec.prefixedName);
241
403
  registerDirectTool(spec, config);
404
+ finalizationGuard?.();
242
405
  registeredDirectTools.set(spec.prefixedName, fingerprint);
243
- if (fallbackDeactivatedTools.delete(spec.prefixedName)) {
406
+ registeredDirectToolServers.set(spec.prefixedName, spec.serverName);
407
+ registeredDirectToolVersions.set(spec.prefixedName, (registeredDirectToolVersions.get(spec.prefixedName) ?? 0) + 1);
408
+ if (previousServer !== spec.serverName) {
409
+ forgetReportedDirectToolName(previousServer, spec.prefixedName);
410
+ }
411
+ if (fallbackDeactivatedTools.delete(spec.prefixedName) && !spec.lazy) {
244
412
  const activeTools = getActiveToolsIfReady();
245
413
  if (activeTools && !activeTools.includes(spec.prefixedName)) {
246
- pi.setActiveTools([...activeTools, spec.prefixedName]);
414
+ callReentrant(() => pi.setActiveTools([...activeTools, spec.prefixedName]));
247
415
  }
248
416
  }
249
417
  (previous ? updated : added).push(spec.prefixedName);
250
418
  }
419
+ if (spec.lazy) {
420
+ lazyDirectTools.add(spec.prefixedName);
421
+ } else if (lazyDirectTools.delete(spec.prefixedName)) {
422
+ searchActivatedTools.delete(spec.prefixedName);
423
+ const activeTools = getActiveToolsIfReady();
424
+ if (activeTools && !activeTools.includes(spec.prefixedName))
425
+ callReentrant(() => pi.setActiveTools([...activeTools, spec.prefixedName]));
426
+ }
251
427
  }
252
428
  for (const toolName of [...registeredDirectTools.keys()]) {
253
429
  if (nextNames.has(toolName))
254
430
  continue;
431
+ const serverName = registeredDirectToolServers.get(toolName);
255
432
  registeredDirectTools.delete(toolName);
433
+ registeredDirectToolServers.delete(toolName);
434
+ forgetReportedDirectToolName(serverName, toolName);
435
+ if (lazyDirectTools.delete(toolName))
436
+ searchActivatedTools.delete(toolName);
256
437
  deactivated.push(toolName);
257
438
  }
258
439
  deactivateTools(deactivated);
440
+ holdLazyToolsInactive();
259
441
  return { specs, reservedDirectNames, activeDirectNames: nextNames, added, updated, deactivated };
260
442
  }
261
443
  function applyDirectToolConfigChanges(changes) {
@@ -268,17 +450,77 @@ function installMcpAdapter(pi, options) {
268
450
  state.config.mcpServers[serverName] = { ...definition, directTools: value };
269
451
  }
270
452
  }
453
+ function loadToolSurfaceCache(config) {
454
+ const cache = loadMetadataCache();
455
+ const currentState = state;
456
+ if (!currentState || !cache)
457
+ return cache;
458
+ const servers = { ...cache.servers };
459
+ const connections = callReentrant(() => [...currentState.manager.getAllConnections()]);
460
+ for (const [serverName, connection] of connections) {
461
+ const definition = config.mcpServers[serverName];
462
+ const entry = servers[serverName];
463
+ if (connection.status !== "connected" || !entry || !definition || isServerDisabled(definition))
464
+ continue;
465
+ const configHash = computeServerHash(definition);
466
+ if (computeServerHash(connection.definition) !== configHash || entry.configHash !== configHash)
467
+ continue;
468
+ const { ttlMs: _liveTtl, ...liveEntry } = entry;
469
+ servers[serverName] = liveEntry;
470
+ }
471
+ return { ...cache, servers };
472
+ }
271
473
  function syncToolSurface(ctx) {
474
+ const notificationGeneration = lifecycleGeneration;
475
+ const notificationOwner = currentOwner;
272
476
  const config = state?.config ?? earlyConfig;
273
- const cache = loadMetadataCache();
477
+ const cache = loadToolSurfaceCache(config);
274
478
  const result = syncDirectTools(config, cache);
479
+ if (state) {
480
+ const directToolCounts = state.directToolCounts ?? new Map;
481
+ directToolCounts.clear();
482
+ for (const spec of result.specs) {
483
+ directToolCounts.set(spec.serverName, (directToolCounts.get(spec.serverName) ?? 0) + 1);
484
+ }
485
+ state.directToolCounts = directToolCounts;
486
+ }
275
487
  syncProxyTool(config, cache, result.specs);
276
488
  syncNamespaceTools(config, cache, result.reservedDirectNames, result.activeDirectNames);
489
+ deliverLargeDirectToolsAdvisory(ctx, config, result.specs);
490
+ if (ctx && (notificationGeneration !== lifecycleGeneration || notificationOwner !== currentOwner || notificationOwner && !notificationOwner.isActive())) {
491
+ throw notificationOwner?.signal.reason ?? new Error("Stale MCP session after direct-tools advisory");
492
+ }
493
+ finalizationGuard?.();
277
494
  const changed = result.added.length + result.updated.length + result.deactivated.length;
278
495
  if (changed > 0 && ctx?.hasUI) {
279
- ctx.ui.notify(`MCP: direct tools refreshed (+${result.added.length}, ~${result.updated.length}, -${result.deactivated.length})`, "info");
496
+ callReentrant(() => ctx.ui.notify(`MCP: direct tools refreshed (+${result.added.length}, ~${result.updated.length}, -${result.deactivated.length})`, "info"));
497
+ }
498
+ }
499
+ function deliverLargeDirectToolsAdvisory(ctx, config, specs) {
500
+ if (!ctx || largeDirectToolsAdvisoryDelivered)
501
+ return;
502
+ const message = getLargeDirectToolsAdvisory(config, specs);
503
+ if (!message)
504
+ return;
505
+ largeDirectToolsAdvisoryDelivered = true;
506
+ if (ctx.hasUI) {
507
+ callReentrant(() => ctx.ui.notify(message, "warning"));
508
+ } else {
509
+ console.warn(message);
280
510
  }
281
511
  }
512
+ function getDeferredSessionSnapshot(cwd) {
513
+ const config = programmaticConfig ? resolveConfiguredClaudePluginMcp(cloneMcpConfig(sessionConfig), cwd ?? process.cwd()) : loadMcpConfig(earlyConfigPath, cwd);
514
+ const cache = loadMetadataCache();
515
+ const enabledServers = Object.values(config.mcpServers).filter((definition) => !isServerDisabled(definition));
516
+ if (enabledServers.some((definition) => definition.lifecycle === "eager" || definition.lifecycle === "keep-alive"))
517
+ return;
518
+ if (envRaw !== undefined && envRaw !== "__none__" && getMissingConfiguredDirectToolServers(config, cache, envDirectToolOverride).length > 0)
519
+ return;
520
+ if (config.settings?.deferWithMissingMetadata !== true && (cache === null || hasEnabledServerWithoutValidMetadata(config, cache)))
521
+ return;
522
+ return { config, cache, enabledServerCount: enabledServers.length };
523
+ }
282
524
  function syncNamespaceTools(config, cache, reservedDirectNames = new Set(registeredDirectTools.keys()), activeDirectNames = new Set(registeredDirectTools.keys())) {
283
525
  const result = syncNamespaceProxyTools({
284
526
  config,
@@ -291,11 +533,19 @@ function installMcpAdapter(pi, options) {
291
533
  pi,
292
534
  getState: () => state,
293
535
  getInitPromise: () => initPromise,
536
+ ensureRuntime: (ctx) => ensureSessionRuntime(ctx),
537
+ executeCall: async (...args) => {
538
+ const guard = captureRuntimeGuard(args[0]);
539
+ return (await loadForRuntime(loadProxyModes, guard)).executeCall(...args);
540
+ },
294
541
  getPiTools: () => pi.getAllTools(),
295
542
  renderOptions: toolRenderOptions,
296
543
  renderShell: toolRenderShell,
297
- renderResult: renderMcpToolResult
544
+ renderResult: renderMcpToolResult,
545
+ guardReentrant: () => finalizationGuard?.(),
546
+ onToolRegistered: (name) => finalizationRegistrations?.add(name)
298
547
  });
548
+ finalizationGuard?.();
299
549
  for (const name of result.added)
300
550
  registeredNamespaceProxyTools.add(name);
301
551
  for (const name of result.deactivated)
@@ -308,14 +558,20 @@ function installMcpAdapter(pi, options) {
308
558
  logger.debug(`MCP: prompt "${spec.originalName}" on ${spec.serverName} skipped; /${spec.commandName} is already registered`);
309
559
  continue;
310
560
  }
561
+ callReentrant(() => pi.registerCommand(spec.commandName, createPromptCommand(pi, () => state, spec, {
562
+ ensureState: (ctx) => ensureSessionRuntime(ctx),
563
+ lazyConnect: async (...args) => {
564
+ const guard = captureRuntimeGuard(args[0]);
565
+ return (await loadForRuntime(loadCoreRuntime, guard)).lazyConnect(...args);
566
+ },
567
+ isStateCurrent: (targetState) => state === targetState && currentOwner?.isActive() === true
568
+ })));
311
569
  registeredPromptCommands.add(spec.commandName);
312
- pi.registerCommand(spec.commandName, createPromptCommand(pi, () => state, spec));
313
570
  }
314
571
  }
315
572
  function syncPromptCommands() {
316
- registerPromptCommands([...state?.promptMetadata?.values() ?? []].flat());
573
+ registerPromptCommands([...state?.promptMetadata?.entries() ?? []].filter(([name]) => !state?.provisionalInstalls?.has(name)).flatMap(([, prompts]) => prompts));
317
574
  }
318
- registerPromptCommands(resolveCachedPrompts(earlyConfig));
319
575
  const registerRuntimeServer = (name, definition) => {
320
576
  if (typeof name !== "string" || name.trim() === "") {
321
577
  throw new Error("MCP server name must be a non-empty string");
@@ -335,7 +591,12 @@ function installMcpAdapter(pi, options) {
335
591
  registeredState.config.mcpServers[name] = entry;
336
592
  attachRuntimeServerLifecycle(registeredState, name, entry);
337
593
  syncToolSurface();
338
- updateStatusBar(registeredState);
594
+ const guard = captureRuntimeGuard(registeredState);
595
+ loadForRuntime(loadCoreRuntime, guard).then(({ updateStatusBar }) => updateStatusBar(registeredState)).catch((error) => {
596
+ if (!isAbortError(error, guard.owner?.signal)) {
597
+ logger.debug(`MCP: could not update status after runtime registration: ${formatTerminalError(error)}`);
598
+ }
599
+ });
339
600
  }
340
601
  let disposed = false;
341
602
  return {
@@ -349,9 +610,11 @@ function installMcpAdapter(pi, options) {
349
610
  return;
350
611
  delete currentState.config.mcpServers[name];
351
612
  currentState.lifecycle.unregisterServer(name);
613
+ const guard = captureRuntimeGuard(currentState);
352
614
  await currentState.manager.close(name);
615
+ assertRuntimeGuard(guard);
353
616
  syncToolSurface();
354
- updateStatusBar(currentState);
617
+ (await loadForRuntime(loadCoreRuntime, guard)).updateStatusBar(currentState);
355
618
  }
356
619
  };
357
620
  };
@@ -420,82 +683,195 @@ function installMcpAdapter(pi, options) {
420
683
  description: "Path to MCP config file",
421
684
  type: "string"
422
685
  });
423
- function startInitialization(ctx, owner, oauthRuntime, generation, staleReason) {
424
- owner.addCleanup(() => cleanupMaterializedBinaryResources(owner.signal));
425
- const promise = initializeMcp(pi, ctx, owner, {
426
- ...programmaticConfig || options.configPath !== undefined ? {
427
- ...earlyConfigPath !== undefined ? { configPath: earlyConfigPath } : {},
428
- ...sessionConfig !== undefined ? { config: sessionConfig } : {}
429
- } : {},
430
- oauthRuntime
686
+ function startInitialization(ctx, owner, generation, staleReason) {
687
+ let oauthRuntime = null;
688
+ let markStarted;
689
+ initStartedPromise = new Promise((resolve) => {
690
+ markStarted = resolve;
431
691
  });
432
- initPromise = promise;
433
- return promise.then(async (nextState) => {
692
+ let coreRuntime = null;
693
+ const initializationPromise = (async () => {
694
+ const guard = captureRuntimeGuard(null);
695
+ const [core, oauth] = await Promise.all([
696
+ loadCoreRuntime(),
697
+ loadOAuthRuntime()
698
+ ]);
699
+ assertRuntimeGuard(guard);
700
+ if (generation !== guard.generation || guard.owner !== owner) {
701
+ throw owner.signal.reason ?? new Error("Stale MCP initialization");
702
+ }
703
+ coreRuntime = core;
704
+ assertRuntimeGuard(guard);
705
+ oauthRuntime = oauth.createOAuthRuntime(owner.signal);
706
+ try {
707
+ assertRuntimeGuard(guard);
708
+ } catch (error) {
709
+ await oauth.shutdownOAuth(oauthRuntime);
710
+ throw error;
711
+ }
712
+ currentOAuthRuntime = oauthRuntime;
713
+ assertRuntimeGuard(guard);
714
+ owner.addCleanup(async () => {
715
+ const { cleanupMaterializedBinaryResources } = await import("./tool-registrar.js");
716
+ cleanupMaterializedBinaryResources(owner.signal);
717
+ });
718
+ assertRuntimeGuard(guard);
719
+ const initialization = core.initializeMcp(pi, ctx, owner, {
720
+ ...programmaticConfig || options.configPath !== undefined ? {
721
+ ...earlyConfigPath !== undefined ? { configPath: earlyConfigPath } : {},
722
+ ...sessionConfig !== undefined ? { config: sessionConfig } : {}
723
+ } : {},
724
+ oauthRuntime
725
+ });
726
+ assertRuntimeGuard(guard);
727
+ markStarted();
728
+ return initialization;
729
+ })().catch((error) => {
730
+ markStarted();
731
+ throw error;
732
+ }).then((value) => value);
733
+ let promise;
734
+ promise = initializationPromise.then(async (nextState) => {
434
735
  if (!owner.isActive() || generation !== lifecycleGeneration || initPromise !== promise) {
435
736
  try {
436
- await shutdownState(nextState, staleReason);
737
+ await shutdownState(nextState, staleReason, false);
437
738
  } catch (error) {
438
739
  console.error(`MCP: failed to clean stale initialization state: ${formatTerminalError(error)}`);
439
740
  }
440
- return;
741
+ throw owner.signal.reason ?? new Error("Stale MCP initialization completed");
441
742
  }
743
+ const guard = () => {
744
+ owner.throwIfInactive();
745
+ if (generation !== lifecycleGeneration || currentOwner !== owner || state !== nextState || initPromise !== promise) {
746
+ throw owner.signal.reason ?? new Error("Stale MCP initialization finalized");
747
+ }
748
+ };
749
+ const registeredDuringFinalization = new Set;
750
+ let statusPublicationAttempted = false;
442
751
  state = nextState;
443
- clearRetainedInitFailure();
444
- for (const [name, { entry }] of runtimeServers) {
445
- if (Object.hasOwn(nextState.config.mcpServers, name)) {
446
- console.error(`MCP: runtime-registered server "${name}" now collides with a configured server; keeping the configured server`);
447
- continue;
752
+ finalizationGuard = guard;
753
+ finalizationRegistrations = registeredDuringFinalization;
754
+ try {
755
+ guard();
756
+ callReentrant(() => restoreCurrentSessionApprovals(nextState));
757
+ for (const [name, { entry }] of runtimeServers) {
758
+ guard();
759
+ if (Object.hasOwn(nextState.config.mcpServers, name)) {
760
+ console.error(`MCP: runtime-registered server "${name}" now collides with a configured server; keeping the configured server`);
761
+ continue;
762
+ }
763
+ nextState.config.mcpServers[name] = entry;
764
+ guard();
765
+ callReentrant(() => attachRuntimeServerLifecycle(nextState, name, entry));
448
766
  }
449
- nextState.config.mcpServers[name] = entry;
450
- attachRuntimeServerLifecycle(nextState, name, entry);
451
- }
452
- nextState.onToolMetadataUpdated = (_serverName, _reason) => {
453
- if (state !== nextState || !owner.isActive())
454
- return;
767
+ guard();
768
+ nextState.onToolMetadataUpdated = (_serverName, _reason) => {
769
+ if (state !== nextState || !owner.isActive())
770
+ return;
771
+ syncPromptCommands();
772
+ if (directToolsFrozen) {
773
+ logger.debug(`MCP: metadata update for ${_serverName} (${_reason}) skipped — directTools frozen`);
774
+ return;
775
+ }
776
+ syncToolSurface(ctx);
777
+ };
778
+ guard();
455
779
  syncPromptCommands();
456
- if (directToolsFrozen) {
457
- logger.debug(`MCP: metadata update for ${_serverName} (${_reason}) skipped — directTools frozen`);
458
- return;
459
- }
780
+ guard();
460
781
  syncToolSurface(ctx);
461
- };
462
- syncPromptCommands();
463
- syncToolSurface(ctx);
464
- nextState.statusEvents = pi.events;
465
- updateStatusBar(nextState);
466
- initPromise = null;
467
- if (earlyConfig.settings?.freezeDirectTools === true) {
468
- directToolsFrozen = true;
469
- logger.info("MCP: direct tools frozen after initial sync — metadata can refresh without rebuilding the active tool surface");
782
+ guard();
783
+ nextState.statusEvents = pi.events;
784
+ guard();
785
+ if (!coreRuntime)
786
+ throw new Error("MCP core runtime was not loaded");
787
+ const loadedCoreRuntime = coreRuntime;
788
+ statusPublicationAttempted = true;
789
+ callReentrant(() => loadedCoreRuntime.updateStatusBar(nextState));
790
+ guard();
791
+ clearRetainedInitFailure();
792
+ guard();
793
+ if (earlyConfig.settings?.freezeDirectTools === true) {
794
+ directToolsFrozen = true;
795
+ logger.info("MCP: direct tools frozen after initial sync — metadata can refresh without rebuilding the active tool surface");
796
+ }
797
+ guard();
798
+ initPromise = null;
799
+ initStartedPromise = null;
800
+ return nextState;
801
+ } catch (error) {
802
+ if (state === nextState)
803
+ state = null;
804
+ finalizationGuard = null;
805
+ finalizationRegistrations = null;
806
+ if (registeredDuringFinalization.size > 0) {
807
+ deactivateTools([...registeredDuringFinalization]);
808
+ for (const name of registeredDuringFinalization) {
809
+ registeredDirectTools.delete(name);
810
+ registeredDirectToolServers.delete(name);
811
+ registeredDirectToolVersions.delete(name);
812
+ registeredNamespaceProxyTools.delete(name);
813
+ }
814
+ if (registeredDuringFinalization.has("mcp")) {
815
+ proxyToolRegistered = false;
816
+ proxyToolDescription = null;
817
+ }
818
+ }
819
+ if (statusPublicationAttempted && generation === lifecycleGeneration && currentOwner === owner) {
820
+ publishMcpStatusShutdown(nextState.statusEvents);
821
+ }
822
+ if (generation === lifecycleGeneration && currentOwner === owner) {
823
+ try {
824
+ await shutdownState(nextState, staleReason, false);
825
+ } catch (cleanupError) {
826
+ console.error(`MCP: failed to clean interrupted initialization state: ${formatTerminalError(cleanupError)}`);
827
+ }
828
+ }
829
+ throw error;
830
+ } finally {
831
+ if (finalizationGuard === guard)
832
+ finalizationGuard = null;
833
+ if (finalizationRegistrations === registeredDuringFinalization)
834
+ finalizationRegistrations = null;
470
835
  }
836
+ });
837
+ initPromise = promise;
838
+ return promise.then(() => {
839
+ return;
471
840
  }).catch(async (err) => {
472
841
  if (!owner.isActive() || generation !== lifecycleGeneration) {
473
842
  return;
474
843
  }
475
- if (initPromise !== promise && initPromise !== null) {
844
+ if (initPromise !== promise)
476
845
  return;
477
- }
478
846
  const message = retainInitFailure(err);
479
847
  console.error(`MCP initialization failed: ${message}`);
480
848
  initPromise = null;
849
+ initStartedPromise = null;
481
850
  if (state)
482
851
  return;
483
852
  try {
484
853
  await Promise.all([
485
854
  owner.stop("MCP initialization failed"),
486
- shutdownOAuth(oauthRuntime)
855
+ oauthRuntime ? loadOAuthRuntime().then(({ shutdownOAuth }) => shutdownOAuth(oauthRuntime)) : Promise.resolve()
487
856
  ]);
488
857
  } catch (error) {
489
858
  console.error(`MCP: failed to clean rejected initialization: ${formatTerminalError(error)}`);
490
859
  }
491
860
  });
492
861
  }
862
+ function ensureSessionRuntime(ctx) {
863
+ if (state)
864
+ return Promise.resolve(state);
865
+ if (initPromise)
866
+ return initPromise;
867
+ const owner = currentOwner?.isActive() ? currentOwner : createMcpRuntimeOwner();
868
+ if (owner !== currentOwner)
869
+ currentOwner = owner;
870
+ const generation = currentOwner === owner && lifecycleGeneration > 0 ? lifecycleGeneration : ++lifecycleGeneration;
871
+ startInitialization(ctx, owner, generation, "stale_first_operation_initialization");
872
+ return initPromise;
873
+ }
493
874
  function startLoadTimeInitialization() {
494
- const hasStartupServer = Object.values(earlyConfig.mcpServers).some((definition) => {
495
- if (definition.disabled === true)
496
- return false;
497
- return definition.lifecycle === "eager" || definition.lifecycle === "keep-alive";
498
- });
499
875
  if (!hasStartupServer)
500
876
  return;
501
877
  setImmediate(() => {
@@ -503,9 +879,8 @@ function installMcpAdapter(pi, options) {
503
879
  return;
504
880
  const generation = ++lifecycleGeneration;
505
881
  const owner = createMcpRuntimeOwner();
506
- const oauthRuntime = createOAuthRuntime(owner.signal);
507
882
  currentOwner = owner;
508
- currentOAuthRuntime = oauthRuntime;
883
+ currentOAuthRuntime = null;
509
884
  startInitialization({
510
885
  mode: "print",
511
886
  hasUI: false,
@@ -513,40 +888,101 @@ function installMcpAdapter(pi, options) {
513
888
  model: undefined,
514
889
  modelRegistry: undefined,
515
890
  signal: undefined
516
- }, owner, oauthRuntime, generation, "stale_load_time_initialization");
891
+ }, owner, generation, "stale_load_time_initialization");
517
892
  });
518
893
  }
894
+ pi.on("resources_discover", (event) => {
895
+ const resourceConfig = programmaticConfig ? cloneMcpConfig(sessionConfig) : loadMcpConfig(earlyConfigPath, event.cwd);
896
+ const skillPaths = discoverConfiguredClaudePluginSkills(resourceConfig, event.cwd);
897
+ if (earlyConfig.settings?.scriptMode !== false) {
898
+ const scriptingSkillPath = fileURLToPath(new URL("./skills/mcp-scripting/SKILL.md", import.meta.url));
899
+ if (existsSync(scriptingSkillPath) && !skillPaths.includes(scriptingSkillPath)) {
900
+ skillPaths.push(scriptingSkillPath);
901
+ }
902
+ }
903
+ return skillPaths.length > 0 ? { skillPaths } : undefined;
904
+ });
519
905
  pi.on("session_start", async (_event, ctx) => {
906
+ searchActivatedTools.clear();
907
+ holdLazyToolsInactive();
520
908
  const generation = ++lifecycleGeneration;
909
+ largeDirectToolsAdvisoryDelivered = false;
521
910
  const previousState = state;
522
911
  const previousOwner = currentOwner;
523
912
  const previousOAuthRuntime = currentOAuthRuntime;
524
913
  const owner = createMcpRuntimeOwner();
525
- const oauthRuntime = createOAuthRuntime(owner.signal);
526
914
  currentOwner = owner;
527
- currentOAuthRuntime = oauthRuntime;
915
+ currentOAuthRuntime = null;
528
916
  state = null;
529
917
  initPromise = null;
918
+ initStartedPromise = null;
530
919
  clearRetainedInitFailure();
531
920
  const stopPrevious = previousOwner?.stop("MCP extension session restarted") ?? Promise.resolve();
532
921
  try {
533
922
  await Promise.all([
534
923
  stopPrevious,
535
924
  shutdownState(previousState, "session_restart"),
536
- previousOAuthRuntime ? shutdownOAuth(previousOAuthRuntime) : Promise.resolve()
925
+ previousOAuthRuntime ? loadOAuthRuntime().then(({ shutdownOAuth }) => shutdownOAuth(previousOAuthRuntime)) : Promise.resolve()
537
926
  ]);
538
927
  } catch (error) {
539
928
  console.error(`MCP: failed to shut down previous session state: ${formatTerminalError(error)}`);
540
929
  }
541
930
  if (generation !== lifecycleGeneration || !owner.isActive())
542
931
  return;
543
- const initialization = startInitialization(ctx, owner, oauthRuntime, generation, "stale_session_start");
932
+ if (state)
933
+ return;
934
+ if (!initPromise) {
935
+ const deferredSnapshot = getDeferredSessionSnapshot(ctx.cwd);
936
+ if (deferredSnapshot) {
937
+ const { config, cache, enabledServerCount } = deferredSnapshot;
938
+ const directResult = syncDirectTools(config, cache);
939
+ syncProxyTool(config, cache, directResult.specs);
940
+ syncNamespaceTools(config, cache, directResult.reservedDirectNames, directResult.activeDirectNames);
941
+ if (config.settings?.deferWithMissingMetadata !== true) {
942
+ registerPromptCommands(resolveCachedPrompts(config));
943
+ }
944
+ deliverLargeDirectToolsAdvisory(ctx, config, directResult.specs);
945
+ if (generation !== lifecycleGeneration || !owner.isActive() || currentOwner !== owner)
946
+ return;
947
+ const serverCount = Object.keys(config.mcpServers).length;
948
+ const formattedStatus = formatMcpFooterStatus(config, enabledServerCount, serverCount - enabledServerCount, 0);
949
+ const theme = ctx.ui?.theme;
950
+ const styledStatus = formattedStatus !== undefined && typeof theme?.fg === "function" ? theme.fg("accent", formattedStatus) : formattedStatus;
951
+ ctx.ui?.setStatus("mcp", styledStatus);
952
+ return;
953
+ }
954
+ startInitialization(ctx, owner, generation, "stale_session_start");
955
+ }
956
+ const initialization = initPromise;
957
+ const initializationStarted = initStartedPromise;
544
958
  if (envRaw !== undefined && envRaw !== "__none__") {
545
959
  const missingEnvDirectTools = getMissingConfiguredDirectToolServers(earlyConfig, loadMetadataCache(), envDirectToolOverride);
546
960
  if (missingEnvDirectTools.length > 0) {
547
- await initialization;
961
+ await initialization?.then(() => {
962
+ return;
963
+ }, () => {
964
+ return;
965
+ });
966
+ return;
548
967
  }
549
968
  }
969
+ await initializationStarted;
970
+ });
971
+ pi.on("before_agent_start", holdLazyToolsInactive);
972
+ pi.on("session_tree", (_event, ctx) => {
973
+ const currentState = state;
974
+ const owner = currentOwner;
975
+ if (!currentState || !owner?.isActive() || !currentState.sessionManager)
976
+ return;
977
+ let sessionManager;
978
+ try {
979
+ sessionManager = ctx.sessionManager;
980
+ } catch {
981
+ return;
982
+ }
983
+ if (sessionManager !== currentState.sessionManager)
984
+ return;
985
+ restoreCurrentSessionApprovals(currentState);
550
986
  });
551
987
  pi.on("input", async () => {
552
988
  const inputOwner = currentOwner;
@@ -579,13 +1015,14 @@ function installMcpAdapter(pi, options) {
579
1015
  currentOAuthRuntime = null;
580
1016
  state = null;
581
1017
  initPromise = null;
1018
+ initStartedPromise = null;
582
1019
  clearRetainedInitFailure();
583
1020
  const stopOwner = owner?.stop("MCP extension session shutdown") ?? Promise.resolve();
584
1021
  try {
585
1022
  await Promise.all([
586
1023
  stopOwner,
587
1024
  shutdownState(currentState, "session_shutdown"),
588
- oauthRuntime ? shutdownOAuth(oauthRuntime) : Promise.resolve()
1025
+ oauthRuntime ? loadOAuthRuntime().then(({ shutdownOAuth }) => shutdownOAuth(oauthRuntime)) : Promise.resolve()
589
1026
  ]);
590
1027
  } catch (error) {
591
1028
  console.error(`MCP: session shutdown cleanup failed: ${formatTerminalError(error)}`);
@@ -603,6 +1040,8 @@ function installMcpAdapter(pi, options) {
603
1040
  { value: "tools", label: "tools — List all tools" },
604
1041
  { value: "prompts", label: "prompts — List all MCP prompts" },
605
1042
  { value: "setup", label: "setup — Configure MCP servers" },
1043
+ { value: "jev", label: "jev setup — Configure Jev semantic search" },
1044
+ { value: "edit", label: "edit — Edit .mcp.json or the global config" },
606
1045
  { value: "logout", label: "logout — Clear server credentials" },
607
1046
  { value: "token", label: "token — Manage stored bearer tokens" },
608
1047
  { value: "disable", label: "disable — Disable a server" },
@@ -612,8 +1051,12 @@ function installMcpAdapter(pi, options) {
612
1051
  return subcommands.length > 0 ? subcommands : null;
613
1052
  }
614
1053
  const [, subcommand, argumentPrefix] = argumentMatch;
615
- if (subcommand !== "reconnect" && subcommand !== "logout" && subcommand !== "disable" && subcommand !== "enable" && subcommand !== "token" || argumentPrefix === undefined || !state)
1054
+ if (subcommand === "jev") {
1055
+ return "setup".startsWith((argumentPrefix ?? "").trimStart()) ? [{ value: "jev setup", label: "setup — Configure Jev semantic search" }] : null;
1056
+ }
1057
+ if (subcommand !== "reconnect" && subcommand !== "logout" && subcommand !== "disable" && subcommand !== "enable" && subcommand !== "token" || argumentPrefix === undefined)
616
1058
  return null;
1059
+ const completionConfig = state?.config ?? earlyConfig;
617
1060
  if (subcommand === "token") {
618
1061
  const tokenMatch = argumentPrefix.trimStart().match(/^(set|remove|status)\s+(.*)$/);
619
1062
  if (!tokenMatch) {
@@ -622,28 +1065,22 @@ function installMcpAdapter(pi, options) {
622
1065
  }
623
1066
  const action = tokenMatch[1] ?? "";
624
1067
  const serverPrefix = tokenMatch[2] ?? "";
625
- const servers = Object.keys(state.config.mcpServers).filter((serverName) => serverName.startsWith(serverPrefix.trimStart())).map((serverName) => ({ value: `token ${action} ${serverName}`, label: serverName }));
1068
+ const servers = Object.keys(completionConfig.mcpServers).filter((serverName) => serverName.startsWith(serverPrefix.trimStart())).map((serverName) => ({ value: `token ${action} ${serverName}`, label: serverName }));
626
1069
  return servers.length > 0 ? servers : null;
627
1070
  }
628
- const servers = Object.keys(state.config.mcpServers).filter((serverName) => serverName.startsWith(argumentPrefix.trimStart())).map((serverName) => ({ value: `${subcommand} ${serverName}`, label: serverName }));
1071
+ const servers = Object.keys(completionConfig.mcpServers).filter((serverName) => serverName.startsWith(argumentPrefix.trimStart())).map((serverName) => ({ value: `${subcommand} ${serverName}`, label: serverName }));
629
1072
  return servers.length > 0 ? servers : null;
630
1073
  },
631
1074
  handler: async (args, ctx) => {
632
- const commandOwner = currentOwner;
1075
+ let commandOwner = currentOwner;
633
1076
  const commandReload = typeof ctx.reload === "function" ? ctx.reload.bind(ctx) : async () => {};
634
- const commandHasUI = ctx.hasUI;
635
- const commandCtx = {
636
- hasUI: commandHasUI,
637
- ui: commandHasUI ? commandOwner ? createOwnedUi(ctx.ui, commandOwner) : ctx.ui : undefined,
638
- cwd: ctx.cwd,
639
- mode: ctx.mode,
640
- signal: commandOwner?.signal ?? ctx.signal
641
- };
642
- if (!state && initPromise) {
1077
+ let commandCtx = createCommandContext(ctx, commandOwner);
1078
+ if (!state) {
643
1079
  try {
644
- const initialized = await initPromise;
1080
+ state = await ensureSessionRuntime(ctx);
1081
+ commandOwner = currentOwner;
1082
+ commandCtx = createCommandContext(ctx, commandOwner);
645
1083
  commandOwner?.throwIfInactive();
646
- state = initialized;
647
1084
  } catch (error) {
648
1085
  const message = error instanceof Error ? error.message : String(error);
649
1086
  if (commandCtx.hasUI)
@@ -656,6 +1093,18 @@ function installMcpAdapter(pi, options) {
656
1093
  commandCtx.ui?.notify("MCP not initialized", "error");
657
1094
  return;
658
1095
  }
1096
+ const commandGuard = captureRuntimeGuard(state);
1097
+ let commands;
1098
+ try {
1099
+ commands = await loadForRuntime(loadCommands, commandGuard);
1100
+ } catch (error) {
1101
+ if (commandGuard.owner && isOwnerAbortError(error, commandGuard.owner))
1102
+ return;
1103
+ const message = error instanceof Error ? error.message : String(error);
1104
+ if (commandCtx.hasUI)
1105
+ commandCtx.ui?.notify(`MCP initialization failed: ${message}`, "error");
1106
+ return;
1107
+ }
659
1108
  const parts = args?.trim()?.split(/\s+/) ?? [];
660
1109
  const subcommand = parts[0] ?? "";
661
1110
  const targetServer = parts[1];
@@ -663,13 +1112,13 @@ function installMcpAdapter(pi, options) {
663
1112
  switch (subcommand) {
664
1113
  case "reconnect":
665
1114
  commandOwner?.throwIfInactive();
666
- await reconnectServers(state, commandCtx, targetServer);
1115
+ await commands.reconnectServers(state, commandCtx, targetServer);
667
1116
  break;
668
1117
  case "tools":
669
- await showTools(state, commandCtx);
1118
+ await commands.showTools(state, commandCtx);
670
1119
  break;
671
1120
  case "prompts":
672
- await showPrompts(state, commandCtx);
1121
+ await commands.showPrompts(state, commandCtx);
673
1122
  break;
674
1123
  case "setup": {
675
1124
  commandOwner?.throwIfInactive();
@@ -677,7 +1126,7 @@ function installMcpAdapter(pi, options) {
677
1126
  commandCtx.ui?.notify("MCP setup is unavailable when config is supplied by createMcpAdapter().", "info");
678
1127
  break;
679
1128
  }
680
- const result = await openMcpSetup(state, pi, commandCtx, earlyConfigPath, "setup");
1129
+ const result = await commands.openMcpSetup(state, pi, commandCtx, earlyConfigPath, "setup");
681
1130
  if (result?.configChanged) {
682
1131
  commandOwner?.throwIfInactive();
683
1132
  await commandReload();
@@ -685,6 +1134,41 @@ function installMcpAdapter(pi, options) {
685
1134
  }
686
1135
  break;
687
1136
  }
1137
+ case "jev": {
1138
+ if (parts[1] !== "setup" || parts.length !== 2) {
1139
+ commandCtx.ui?.notify("Usage: /mcp jev setup", "error");
1140
+ break;
1141
+ }
1142
+ if (programmaticConfig) {
1143
+ commandCtx.ui?.notify("Jev setup is unavailable when config is supplied by createMcpAdapter().", "info");
1144
+ break;
1145
+ }
1146
+ commandOwner?.throwIfInactive();
1147
+ if (await commands.setupJevSemanticSearch(state, commandCtx, earlyConfigPath)) {
1148
+ commandOwner?.throwIfInactive();
1149
+ await commandReload();
1150
+ return;
1151
+ }
1152
+ break;
1153
+ }
1154
+ case "edit": {
1155
+ if (programmaticConfig) {
1156
+ commandCtx.ui?.notify("MCP edit is unavailable when config is supplied by createMcpAdapter().", "info");
1157
+ break;
1158
+ }
1159
+ const target = parts[1] ?? "project";
1160
+ if (target !== "project" && target !== "global") {
1161
+ commandCtx.ui?.notify("Usage: /mcp edit [project|global]", "error");
1162
+ return;
1163
+ }
1164
+ commandOwner?.throwIfInactive();
1165
+ if (await commands.editSharedConfig(commandCtx, target)) {
1166
+ commandOwner?.throwIfInactive();
1167
+ await commandReload();
1168
+ return;
1169
+ }
1170
+ break;
1171
+ }
688
1172
  case "logout": {
689
1173
  const serverName = rest;
690
1174
  if (!serverName) {
@@ -693,7 +1177,7 @@ function installMcpAdapter(pi, options) {
693
1177
  return;
694
1178
  }
695
1179
  commandOwner?.throwIfInactive();
696
- await logoutServer(serverName, state, commandCtx);
1180
+ await commands.logoutServer(serverName, state, commandCtx);
697
1181
  break;
698
1182
  }
699
1183
  case "token": {
@@ -710,7 +1194,7 @@ function installMcpAdapter(pi, options) {
710
1194
  return;
711
1195
  }
712
1196
  commandOwner?.throwIfInactive();
713
- await manageBearerToken(action, serverName, state, commandCtx);
1197
+ await commands.manageBearerToken(action, serverName, state, commandCtx);
714
1198
  break;
715
1199
  }
716
1200
  case "disable":
@@ -744,10 +1228,10 @@ function installMcpAdapter(pi, options) {
744
1228
  commandOwner?.throwIfInactive();
745
1229
  if (programmaticConfig) {
746
1230
  commandCtx.ui?.notify("MCP status is shown from the in-memory SDK config; configuration discovery is unavailable.", "info");
747
- await showStatus(state, commandCtx);
1231
+ await commands.showStatus(state, commandCtx);
748
1232
  break;
749
1233
  }
750
- const result = await openMcpPanel(state, pi, commandCtx, earlyConfigPath, (changes) => {
1234
+ const result = await commands.openMcpPanel(state, pi, commandCtx, earlyConfigPath, (changes) => {
751
1235
  applyDirectToolConfigChanges(changes);
752
1236
  syncToolSurface(commandCtx);
753
1237
  });
@@ -757,7 +1241,7 @@ function installMcpAdapter(pi, options) {
757
1241
  return;
758
1242
  }
759
1243
  } else {
760
- await showStatus(state, commandCtx);
1244
+ await commands.showStatus(state, commandCtx);
761
1245
  }
762
1246
  break;
763
1247
  }
@@ -769,24 +1253,18 @@ function installMcpAdapter(pi, options) {
769
1253
  pi.registerCommand("mcp-auth", {
770
1254
  description: "Authenticate with an MCP server (OAuth)",
771
1255
  handler: async (args, ctx) => {
772
- const commandOwner = currentOwner;
773
- const commandHasUI = ctx.hasUI;
774
- const commandCtx = {
775
- hasUI: commandHasUI,
776
- ui: commandHasUI ? commandOwner ? createOwnedUi(ctx.ui, commandOwner) : ctx.ui : undefined,
777
- cwd: ctx.cwd,
778
- mode: ctx.mode,
779
- signal: commandOwner?.signal ?? ctx.signal
780
- };
1256
+ let commandOwner = currentOwner;
1257
+ let commandCtx = createCommandContext(ctx, commandOwner);
781
1258
  const serverName = args?.trim();
782
1259
  if (!serverName && !commandCtx.hasUI) {
783
1260
  return;
784
1261
  }
785
- if (!state && initPromise) {
1262
+ if (!state) {
786
1263
  try {
787
- const initialized = await initPromise;
1264
+ state = await ensureSessionRuntime(ctx);
1265
+ commandOwner = currentOwner;
1266
+ commandCtx = createCommandContext(ctx, commandOwner);
788
1267
  commandOwner?.throwIfInactive();
789
- state = initialized;
790
1268
  } catch (error) {
791
1269
  const message = error instanceof Error ? error.message : String(error);
792
1270
  if (commandCtx.hasUI)
@@ -799,18 +1277,30 @@ function installMcpAdapter(pi, options) {
799
1277
  commandCtx.ui?.notify("MCP not initialized", "error");
800
1278
  return;
801
1279
  }
1280
+ const commandGuard = captureRuntimeGuard(state);
1281
+ let commands;
1282
+ try {
1283
+ commands = await loadForRuntime(loadCommands, commandGuard);
1284
+ } catch (error) {
1285
+ if (commandGuard.owner && isOwnerAbortError(error, commandGuard.owner))
1286
+ return;
1287
+ const message = error instanceof Error ? error.message : String(error);
1288
+ if (commandCtx.hasUI)
1289
+ commandCtx.ui?.notify(`MCP initialization failed: ${message}`, "error");
1290
+ return;
1291
+ }
802
1292
  if (!serverName) {
803
1293
  if (programmaticConfig) {
804
1294
  commandCtx.ui?.notify("Use /mcp-auth <server> to authenticate a server from the in-memory SDK config.", "info");
805
1295
  return;
806
1296
  }
807
- await openMcpAuthPanel(state, pi, commandCtx, earlyConfigPath);
1297
+ await commands.openMcpAuthPanel(state, pi, commandCtx, earlyConfigPath);
808
1298
  return;
809
1299
  }
810
- const result = await authenticateServer(serverName, state.config, commandCtx, commandCtx.signal, state.oauthRuntime);
1300
+ const result = await commands.authenticateServer(serverName, state.config, commandCtx, commandCtx.signal, state.oauthRuntime);
811
1301
  if (result.ok) {
812
1302
  commandOwner?.throwIfInactive();
813
- await reconnectServer(state, commandCtx, serverName);
1303
+ await commands.reconnectServer(state, commandCtx, serverName);
814
1304
  }
815
1305
  }
816
1306
  });
@@ -818,7 +1308,7 @@ function installMcpAdapter(pi, options) {
818
1308
  pi.registerTool({
819
1309
  name: "mcpScript",
820
1310
  label: "MCP Script",
821
- description: "Run trusted JavaScript that makes multiple MCP tool calls in one request — loop, filter, chain, or fan out between calls. For a single MCP call, search, describe, status check, or auth action, use the mcp tool instead. Discover with await tools.search({ query }) — resolves to { items: [{ path, name, server, description? }], total, hasMore, nextOffset }, not an { ok, data } envelope. Inspect with await tools.describe({ path }) — resolves to the tool descriptor with inputTypeScript, or { path, error: { code, message, suggestions } }. Then call tools.call(path, args) — resolves to { ok: true, data } or { ok: false, error: { code, message } } — or use direct flat calls when the name is already known; use emit(value) for user-visible output. Load the mcp-scripting skill for the full workflow guide.",
1311
+ description: "Run trusted JavaScript that makes multiple MCP tool calls in one request — loop, filter, chain, or fan out between calls. For a single MCP call, search, describe, status check, or auth action, use the mcp tool instead. Discover with await tools.search({ query }) — resolves to { items: [{ path, name, server, description? }], total, hasMore, nextOffset }, not an { ok, data } envelope. Inspect with await tools.describe({ path }) — resolves to the tool descriptor with inputTypeScript, or { path, error: { code, message, suggestions } }. Then call tools.call(path, args) — resolves to { ok: true, data } or { ok: false, error: { code, message } } — or use direct flat calls when the name is already known; use emit(value) for user-visible output.",
822
1312
  promptSnippet: "Batch multiple MCP tool calls in one JavaScript request (loop, filter, chain)",
823
1313
  parameters: Type.Object({
824
1314
  code: Type.String({ description: "Trusted JavaScript MCP script. Use tools.<prefixedToolName>(args) and emit(value)." }),
@@ -826,17 +1316,18 @@ function installMcpAdapter(pi, options) {
826
1316
  }),
827
1317
  renderCall: createMcpScriptToolCallRenderer(toolRenderOptions),
828
1318
  renderResult: renderMcpToolResult,
829
- async execute(_toolCallId, params, signal) {
830
- const executeOwner = currentOwner;
831
- if (!state && initPromise) {
1319
+ async execute(_toolCallId, params, signal, _onUpdate, ctx) {
1320
+ let executeOwner = currentOwner;
1321
+ if (!state) {
832
1322
  try {
833
- const initialized = await awaitWithTimeout(initPromise, INIT_WAIT_TIMEOUT_MS);
1323
+ const initialized = await awaitWithTimeout(ensureSessionRuntime(ctx), INIT_WAIT_TIMEOUT_MS);
834
1324
  if (initialized === INIT_WAIT_TIMED_OUT) {
835
1325
  return {
836
1326
  content: [{ type: "text", text: "MCP initialization is still in progress. Try again shortly." }],
837
1327
  details: { mode: "script", error: "init_timeout", timeoutMs: INIT_WAIT_TIMEOUT_MS }
838
1328
  };
839
1329
  }
1330
+ executeOwner = currentOwner;
840
1331
  executeOwner?.throwIfInactive();
841
1332
  state = initialized;
842
1333
  } catch (error) {
@@ -856,16 +1347,231 @@ function installMcpAdapter(pi, options) {
856
1347
  };
857
1348
  }
858
1349
  executeOwner?.throwIfInactive();
859
- return runMcpScript(state, params.code, params.timeoutMs, getPiTools, signal);
1350
+ const scriptState = state;
1351
+ const scriptGuard = captureRuntimeGuard(scriptState);
1352
+ const codeMode = await loadForRuntime(loadCodeMode, scriptGuard);
1353
+ return codeMode.runMcpScript(scriptState, params.code, params.timeoutMs, getPiTools, signal);
860
1354
  }
861
1355
  });
862
1356
  }
1357
+ async function connectAndReport(targetState, serverName, signal, ctx) {
1358
+ const guard = captureRuntimeGuard(targetState);
1359
+ const directToolsBefore = new Map([...registeredDirectTools.keys()].map((name) => [name, registeredDirectToolVersions.get(name) ?? 0]));
1360
+ const proxyModes = await loadForRuntime(loadProxyModes, guard);
1361
+ const result = await proxyModes.executeConnect(targetState, serverName, signal);
1362
+ assertRuntimeGuard(guard);
1363
+ if (!directToolsFrozen)
1364
+ syncToolSurface(ctx);
1365
+ const reportedNames = reportedDirectToolNamesByServer.get(serverName) ?? new Set;
1366
+ const addedToolNames = [...registeredDirectTools.keys()].filter((name) => (!directToolsBefore.has(name) || (registeredDirectToolVersions.get(name) ?? 0) !== directToolsBefore.get(name)) && registeredDirectToolServers.get(name) === serverName && !reportedNames.has(name) && !lazyDirectTools.has(name));
1367
+ if (addedToolNames.length === 0)
1368
+ return result;
1369
+ for (const name of addedToolNames)
1370
+ reportedNames.add(name);
1371
+ reportedDirectToolNamesByServer.set(serverName, reportedNames);
1372
+ return { ...result, addedToolNames };
1373
+ }
1374
+ async function executeInstall(targetState, rawUrl, requestedName, target, cwd, signal) {
1375
+ const installOwner = currentOwner;
1376
+ signal?.throwIfAborted();
1377
+ installOwner?.throwIfInactive();
1378
+ if (programmaticConfig) {
1379
+ return {
1380
+ content: [{ type: "text", text: "MCP install is unavailable when the adapter uses programmatic configuration." }],
1381
+ details: { mode: "install", error: "programmatic_config" }
1382
+ };
1383
+ }
1384
+ if (targetState.config.settings?.allowInstall === false) {
1385
+ return {
1386
+ content: [{ type: "text", text: "MCP install is disabled by configuration." }],
1387
+ details: { mode: "install", error: "install_disabled" }
1388
+ };
1389
+ }
1390
+ if (target !== undefined && target !== "global" && target !== "project") {
1391
+ return {
1392
+ content: [{ type: "text", text: "MCP install target must be 'global' or 'project'." }],
1393
+ details: { mode: "install", error: "invalid_target" }
1394
+ };
1395
+ }
1396
+ const destination = target === "project" ? getProjectConfigPath(cwd) : getPiGlobalConfigPath(earlyConfigPath);
1397
+ if (target === "project" && process.env.PI_MCP_CONFIG_MODE?.trim().toLowerCase() === "exclusive" && resolve(destination) !== resolve(getPiGlobalConfigPath(earlyConfigPath))) {
1398
+ return {
1399
+ content: [{ type: "text", text: "Project installation is unavailable in exclusive config mode; use the global target." }],
1400
+ details: { mode: "install", error: "inactive_target" }
1401
+ };
1402
+ }
1403
+ const installGuard = captureRuntimeGuard(targetState);
1404
+ const installParsing = await loadForRuntime(loadInstallParsing, installGuard);
1405
+ let normalized;
1406
+ try {
1407
+ normalized = installParsing.normalizeMcpInstallRequest({
1408
+ url: rawUrl ?? "",
1409
+ ...requestedName !== undefined ? { serverName: requestedName } : {}
1410
+ });
1411
+ } catch (error) {
1412
+ const message = error instanceof Error ? error.message : String(error);
1413
+ return {
1414
+ content: [{ type: "text", text: `Failed to install MCP server: ${message}` }],
1415
+ details: { mode: "install", error: "invalid_request", message }
1416
+ };
1417
+ }
1418
+ const matchingUrl = Object.entries(targetState.config.mcpServers).find(([, definition]) => definition.url !== undefined && installParsing.canonicalMcpServerUrl(definition.url) === normalized.url);
1419
+ const serverName = requestedName?.trim() || matchingUrl?.[0] || normalized.serverName;
1420
+ const existing = targetState.config.mcpServers[serverName];
1421
+ if (existing && installParsing.canonicalMcpServerUrl(existing.url ?? "") !== normalized.url) {
1422
+ return {
1423
+ content: [{ type: "text", text: `MCP server name "${serverName}" is already configured with a different endpoint.` }],
1424
+ details: { mode: "install", error: "name_conflict", server: serverName, url: normalized.url }
1425
+ };
1426
+ }
1427
+ if (targetState.provisionalInstalls?.has(serverName)) {
1428
+ return {
1429
+ content: [{ type: "text", text: `MCP server "${serverName}" is still being installed. Retry after that installation finishes.` }],
1430
+ details: { mode: "install", error: "install_in_progress", server: serverName }
1431
+ };
1432
+ }
1433
+ if (runtimeServers.has(serverName)) {
1434
+ return {
1435
+ content: [{ type: "text", text: `Runtime MCP server "${serverName}" cannot be promoted by URL install. Save its full definition manually.` }],
1436
+ details: { mode: "install", error: "runtime_promotion_unsupported", server: serverName }
1437
+ };
1438
+ }
1439
+ const persistedEntry = { url: normalized.url };
1440
+ const runtimeEntry = existing ?? { ...persistedEntry, directTools: false };
1441
+ const provisional = existing === undefined;
1442
+ const restoreMetadata = [
1443
+ targetState.toolMetadata,
1444
+ targetState.promptMetadata,
1445
+ targetState.serverInstructions,
1446
+ targetState.resourceCounts,
1447
+ targetState.directToolCounts
1448
+ ].map((map) => {
1449
+ const previous = map.get(serverName);
1450
+ return () => {
1451
+ if (previous === undefined)
1452
+ map.delete(serverName);
1453
+ else
1454
+ map.set(serverName, previous);
1455
+ };
1456
+ });
1457
+ const hadLivePrompts = targetState.promptMetadataLive.has(serverName);
1458
+ const rollback = async () => {
1459
+ if (!provisional || targetState.config.mcpServers[serverName] !== runtimeEntry)
1460
+ return;
1461
+ delete targetState.config.mcpServers[serverName];
1462
+ targetState.lifecycle.unregisterServer(serverName);
1463
+ try {
1464
+ await targetState.manager.close(serverName);
1465
+ } finally {
1466
+ targetState.provisionalInstalls?.delete(serverName);
1467
+ for (const restore of restoreMetadata)
1468
+ restore();
1469
+ if (!hadLivePrompts)
1470
+ targetState.promptMetadataLive.delete(serverName);
1471
+ const core = await loadForRuntime(loadCoreRuntime, installGuard);
1472
+ core.clearFailure(targetState, serverName, "install-rollback");
1473
+ syncToolSurface();
1474
+ core.updateStatusBar(targetState);
1475
+ }
1476
+ };
1477
+ let connectResult;
1478
+ try {
1479
+ if (provisional) {
1480
+ (targetState.provisionalInstalls ??= new Set).add(serverName);
1481
+ targetState.config.mcpServers[serverName] = runtimeEntry;
1482
+ attachRuntimeServerLifecycle(targetState, serverName, runtimeEntry);
1483
+ syncToolSurface();
1484
+ (await loadForRuntime(loadCoreRuntime, installGuard)).updateStatusBar(targetState);
1485
+ }
1486
+ connectResult = await connectAndReport(targetState, serverName, signal);
1487
+ signal?.throwIfAborted();
1488
+ installOwner?.throwIfInactive();
1489
+ } catch (error) {
1490
+ await rollback();
1491
+ throw error;
1492
+ }
1493
+ const connectError = connectResult.details?.error;
1494
+ const connectText = connectResult.content.find((content) => content.type === "text")?.text;
1495
+ if (connectError && connectError !== "auth_required") {
1496
+ await rollback();
1497
+ return {
1498
+ ...connectResult,
1499
+ content: [{ type: "text", text: `MCP installation validation failed for "${serverName}". ${connectText ?? "Connection failed."}` }],
1500
+ details: { mode: "install", error: "validation_failed", server: serverName, url: normalized.url }
1501
+ };
1502
+ }
1503
+ if (provisional) {
1504
+ try {
1505
+ await withFileMutationQueue(destination, async () => {
1506
+ signal?.throwIfAborted();
1507
+ installOwner?.throwIfInactive();
1508
+ writeSharedServerEntry(destination, serverName, persistedEntry);
1509
+ });
1510
+ } catch (error) {
1511
+ await rollback();
1512
+ const message = error instanceof Error ? error.message : String(error);
1513
+ return {
1514
+ content: [{ type: "text", text: `MCP server validation succeeded, but configuration could not be saved: ${message}` }],
1515
+ details: { mode: "install", error: "persistence_failed", server: serverName, url: normalized.url, message }
1516
+ };
1517
+ }
1518
+ targetState.provisionalInstalls?.delete(serverName);
1519
+ try {
1520
+ (await loadForRuntime(loadCoreRuntime, installGuard)).updateMetadataCache(targetState, serverName);
1521
+ assertRuntimeGuard(installGuard);
1522
+ } catch (error) {
1523
+ if (isRuntimeGuardStale(installGuard) || isAbortError(error, installGuard.owner?.signal))
1524
+ throw error;
1525
+ logger.warn(`MCP: installed "${serverName}" but could not cache metadata: ${error}`);
1526
+ }
1527
+ syncPromptCommands();
1528
+ }
1529
+ if (connectError === "auth_required") {
1530
+ const proxyModes = await loadForRuntime(loadProxyModes, installGuard);
1531
+ const authResult = await proxyModes.executeAuthStart(targetState, serverName, signal);
1532
+ const authError = authResult.details?.error;
1533
+ const authText = authResult.content.find((content) => content.type === "text")?.text;
1534
+ return {
1535
+ ...connectResult,
1536
+ content: [{
1537
+ type: "text",
1538
+ text: `${provisional ? "Installed" : "Found"} MCP server "${serverName}" at ${normalized.url}.
1539
+
1540
+ ${authText ?? "OAuth authorization is required."}`
1541
+ }],
1542
+ details: {
1543
+ mode: "install",
1544
+ status: authError ? "auth_start_failed" : "awaiting_auth",
1545
+ server: serverName,
1546
+ url: normalized.url,
1547
+ ...provisional ? { path: destination } : {},
1548
+ ...authError ? { error: authError } : {}
1549
+ }
1550
+ };
1551
+ }
1552
+ return {
1553
+ ...connectResult,
1554
+ content: [{
1555
+ type: "text",
1556
+ text: `${provisional ? "Installed and connected" : "Already installed; connected"} MCP server "${serverName}" at ${normalized.url}.
1557
+
1558
+ ${connectText ?? ""}`.trim()
1559
+ }],
1560
+ details: {
1561
+ mode: "install",
1562
+ status: "connected",
1563
+ server: serverName,
1564
+ url: normalized.url,
1565
+ ...provisional ? { path: destination } : {}
1566
+ }
1567
+ };
1568
+ }
863
1569
  function registerProxyTool(description) {
864
- pi.registerTool({
1570
+ callReentrant(() => pi.registerTool({
865
1571
  name: "mcp",
866
1572
  label: "MCP",
867
1573
  description,
868
- promptSnippet: "MCP gateway — status, search, describe, auth, and single MCP tool calls",
1574
+ promptSnippet: "MCP gateway — install by URL, status, search, describe, auth, and single MCP tool calls",
869
1575
  renderShell: toolRenderShell,
870
1576
  renderCall: createMcpProxyToolCallRenderer(toolRenderOptions),
871
1577
  parameters: Type.Object({
@@ -881,12 +1587,15 @@ function installMcpAdapter(pi, options) {
881
1587
  describe: Type.Optional(Type.String({ description: "Tool name to describe (shows parameters)" })),
882
1588
  instructions: Type.Optional(Type.String({ description: "Server name to show that server's usage instructions" })),
883
1589
  search: Type.Optional(Type.String({ description: "Search tools by name/description" })),
1590
+ searchMode: Type.Optional(Type.String({ enum: ["lexical", "semantic"], description: "Search backend (default: lexical; semantic is available when a System One key is configured)" })),
884
1591
  regex: Type.Optional(Type.Boolean({ description: "Treat search as regex (default: substring match)" })),
885
1592
  includeSchemas: Type.Optional(Type.Boolean({ description: "Include parameter schemas in search results (default: true)" })),
886
1593
  limit: optionalNumber({ minimum: 1, description: "Maximum search results to return (default: 12)" }),
887
1594
  offset: optionalNumber({ minimum: 0, description: "Search result offset (default: 0)" }),
888
- server: Type.Optional(Type.String({ description: "Filter to specific server (also disambiguates tool calls)" })),
889
- action: Type.Optional(Type.String({ description: "Action: 'ui-messages', 'auth-start', or 'auth-complete'" }))
1595
+ server: Type.Optional(Type.String({ description: "Server name: filters searches, disambiguates calls and describe operations, and optionally names an install" })),
1596
+ action: Type.Optional(Type.String({ description: "Action: 'install', 'ui-messages', 'auth-start', or 'auth-complete'" })),
1597
+ url: Type.Optional(Type.String({ description: "MCP endpoint URL for action: 'install'" })),
1598
+ target: Type.Optional(Type.String({ description: "Install target: 'global' (default) or 'project'" }))
890
1599
  }),
891
1600
  renderResult: renderMcpToolResult,
892
1601
  async execute(_toolCallId, params, signal, _onUpdate, _ctx) {
@@ -914,12 +1623,15 @@ function installMcpAdapter(pi, options) {
914
1623
  return args;
915
1624
  };
916
1625
  const parsedArgs = parseArgs(params.args);
917
- const hasGatewayMode = (value) => value.tool !== undefined || value.connect !== undefined || value.describe !== undefined || value.instructions !== undefined || value.search !== undefined || value.server !== undefined || value.action !== undefined;
1626
+ const hasGatewayMode = (value) => value.tool !== undefined || value.connect !== undefined || value.describe !== undefined || value.instructions !== undefined || value.search !== undefined || value.server !== undefined || value.action !== undefined || value.url !== undefined || value.target !== undefined;
918
1627
  if (!hasGatewayMode(params) && params.args !== undefined) {
919
1628
  throw new Error('Gateway params were nested inside `args`; pass them top-level (for example, mcp({ search: "..." }) or mcp({ tool: "...", args: {} })).');
920
1629
  }
921
- if (!state && !initPromise && retainedInitFailure) {
922
- startGatewayRetryInitialization(_ctx);
1630
+ if (!state && !initPromise) {
1631
+ if (retainedInitFailure)
1632
+ startGatewayRetryInitialization(_ctx);
1633
+ else
1634
+ ensureSessionRuntime(_ctx);
923
1635
  executeOwner = currentOwner;
924
1636
  }
925
1637
  if (!state && initPromise) {
@@ -950,8 +1662,14 @@ function installMcpAdapter(pi, options) {
950
1662
  };
951
1663
  }
952
1664
  executeOwner?.throwIfInactive();
1665
+ const proxyState = state;
1666
+ const proxyGuard = captureRuntimeGuard(proxyState);
1667
+ const proxyModes = await loadForRuntime(loadProxyModes, proxyGuard);
1668
+ if (params.action === "install") {
1669
+ return executeInstall(proxyState, params.url, params.server, params.target, _ctx.cwd, signal);
1670
+ }
953
1671
  if (params.action === "ui-messages") {
954
- return executeUiMessages(state);
1672
+ return proxyModes.executeUiMessages(proxyState);
955
1673
  }
956
1674
  if (params.action === "auth-start") {
957
1675
  if (!params.server) {
@@ -960,7 +1678,7 @@ function installMcpAdapter(pi, options) {
960
1678
  details: { mode: "auth-start", error: "missing_server" }
961
1679
  };
962
1680
  }
963
- return signal ? executeAuthStart(state, params.server, signal) : executeAuthStart(state, params.server);
1681
+ return signal ? proxyModes.executeAuthStart(proxyState, params.server, signal) : proxyModes.executeAuthStart(proxyState, params.server);
964
1682
  }
965
1683
  if (params.action === "auth-complete") {
966
1684
  if (!params.server) {
@@ -976,47 +1694,66 @@ function installMcpAdapter(pi, options) {
976
1694
  details: { mode: "auth-complete", error: "missing_input" }
977
1695
  };
978
1696
  }
979
- return signal ? executeAuthComplete(state, params.server, input, signal) : executeAuthComplete(state, params.server, input);
1697
+ return signal ? proxyModes.executeAuthComplete(proxyState, params.server, input, signal) : proxyModes.executeAuthComplete(proxyState, params.server, input);
980
1698
  }
981
1699
  if (params.tool) {
982
- return executeCall(state, params.tool, parsedArgs, params.server, getPiTools, signal);
1700
+ return proxyModes.executeCall(proxyState, params.tool, parsedArgs, params.server, getPiTools, signal);
983
1701
  }
984
1702
  if (params.connect) {
985
- const result = await executeConnect(state, params.connect, signal);
986
- if (!directToolsFrozen)
987
- syncToolSurface(_ctx);
988
- return result;
1703
+ return connectAndReport(proxyState, params.connect, signal, _ctx);
989
1704
  }
990
1705
  if (params.describe) {
991
- return executeDescribe(state, params.describe);
1706
+ return proxyModes.executeDescribe(proxyState, params.describe, params.server);
992
1707
  }
993
1708
  if (params.instructions) {
994
- return executeInstructions(state, params.instructions);
1709
+ return proxyModes.executeInstructions(proxyState, params.instructions);
995
1710
  }
996
1711
  if (params.search !== undefined) {
997
- return executeSearch(state, params.search, params.regex, params.server, params.includeSchemas, params.limit, params.offset);
1712
+ const result = await proxyModes.executeSearch(proxyState, params.search, params.regex, params.server, params.includeSchemas, params.limit, params.offset, params.searchMode, signal);
1713
+ assertRuntimeGuard(proxyGuard);
1714
+ if (lazyDirectTools.size === 0)
1715
+ return result;
1716
+ holdLazyToolsInactive();
1717
+ const matches = result.details?.matches ?? [];
1718
+ const added = activateSearchMatches(matches);
1719
+ if (added.length === 0)
1720
+ return result;
1721
+ const text = result.content.map((block) => ("text" in block) ? block.text : "").join(`
1722
+ `);
1723
+ return {
1724
+ ...result,
1725
+ content: [{ type: "text", text: `Activated as direct tools: ${added.join(", ")}.
1726
+
1727
+ ${text}` }],
1728
+ details: { ...result.details ?? {}, activated: added },
1729
+ addedToolNames: added
1730
+ };
998
1731
  }
999
1732
  if (params.server) {
1000
- return executeList(state, params.server);
1733
+ return proxyModes.executeList(proxyState, params.server);
1001
1734
  }
1002
- return executeStatus(state);
1735
+ return proxyModes.executeStatus(proxyState);
1003
1736
  }
1004
- });
1737
+ }));
1005
1738
  proxyToolRegistered = true;
1006
1739
  proxyToolDescription = description;
1007
1740
  }
1008
1741
  function syncProxyTool(config, cache, directSpecs) {
1009
1742
  const missingConfiguredDirectToolServers = getMissingConfiguredDirectToolServers(config, cache, envRaw === undefined || envRaw === "__none__" ? undefined : envDirectToolOverride);
1010
- const shouldRegisterProxyTool = config.settings?.disableProxyTool !== true || directSpecs.length === 0 || missingConfiguredDirectToolServers.length > 0;
1743
+ const hasSearchModeSpecs = directSpecs.some((spec) => spec.lazy === true);
1744
+ const shouldRegisterProxyTool = config.settings?.disableProxyTool !== true || directSpecs.length === 0 || hasSearchModeSpecs || missingConfiguredDirectToolServers.length > 0 || hasEnabledServerWithoutValidMetadata(config, cache, directSpecs);
1011
1745
  if (shouldRegisterProxyTool) {
1012
1746
  const description = buildProxyDescription(config);
1013
1747
  if (!proxyToolRegistered || proxyToolDescription !== description) {
1748
+ finalizationRegistrations?.add("mcp");
1014
1749
  registerProxyTool(description);
1015
- return;
1750
+ finalizationGuard?.();
1016
1751
  }
1017
1752
  const activeTools = getActiveToolsIfReady();
1018
- if (activeTools && !activeTools.includes("mcp")) {
1019
- pi.setActiveTools([...activeTools, "mcp"]);
1753
+ if (activeTools?.includes("mcp")) {
1754
+ fallbackDeactivatedTools.delete("mcp");
1755
+ } else if (activeTools && fallbackDeactivatedTools.delete("mcp")) {
1756
+ callReentrant(() => pi.setActiveTools([...activeTools, "mcp"]));
1020
1757
  }
1021
1758
  return;
1022
1759
  }
@@ -1034,7 +1771,7 @@ function installMcpAdapter(pi, options) {
1034
1771
  startLoadTimeInitialization();
1035
1772
  }
1036
1773
  export function createMcpAdapter(options = {}) {
1037
- const factoryConfig = options.config !== undefined ? cloneMcpConfig(options.config) : undefined;
1774
+ const factoryConfig = options.config !== undefined ? normalizeProgrammaticConfig(cloneMcpConfig(options.config)) : undefined;
1038
1775
  return function mcpAdapter(pi) {
1039
1776
  installMcpAdapter(pi, {
1040
1777
  ...options.configPath !== undefined ? { configPath: options.configPath } : {},