@duckmind/dm-darwin-x64 0.66.4 → 0.66.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1115) hide show
  1. package/README.md +4 -0
  2. package/dm +2 -2
  3. package/extensions/.dm-extensions.json +755 -37
  4. package/extensions/dm-lens/clients/actionable-warnings.js +63 -11
  5. package/extensions/dm-lens/clients/advisory-provenance.js +5 -3
  6. package/extensions/dm-lens/clients/agent-nudge.js +106 -2
  7. package/extensions/dm-lens/clients/analysis-root.js +103 -0
  8. package/extensions/dm-lens/clients/ast-grep-client.js +18 -7
  9. package/extensions/dm-lens/clients/ast-grep-rule-manager.js +35 -12
  10. package/extensions/dm-lens/clients/biome-client.js +18 -12
  11. package/extensions/dm-lens/clients/blocker-freshness.js +1 -9
  12. package/extensions/dm-lens/clients/bounded-pid-file-lock.js +141 -30
  13. package/extensions/dm-lens/clients/bounded-telemetry.js +3 -0
  14. package/extensions/dm-lens/clients/cache/rule-cache.js +2 -17
  15. package/extensions/dm-lens/clients/cache-manager.js +105 -17
  16. package/extensions/dm-lens/clients/cargo-manifest.js +23 -3
  17. package/extensions/dm-lens/clients/complexity-client.js +1 -1
  18. package/extensions/dm-lens/clients/config-core/normalize.js +9 -0
  19. package/extensions/dm-lens/clients/config-core/schema.js +3 -0
  20. package/extensions/dm-lens/clients/config-schema.js +105 -2
  21. package/extensions/dm-lens/clients/confirmed-delete.js +11 -0
  22. package/extensions/dm-lens/clients/custom-rule-locations.js +28 -0
  23. package/extensions/dm-lens/clients/dead-code-client.js +81 -12
  24. package/extensions/dm-lens/clients/deferred-runner-blockers.js +108 -0
  25. package/extensions/dm-lens/clients/deferred-test-targets.js +31 -0
  26. package/extensions/dm-lens/clients/degradation-ledger.js +21 -3
  27. package/extensions/dm-lens/clients/demoted-finding-render.js +5 -2
  28. package/extensions/dm-lens/clients/dependency-checker.js +13 -4
  29. package/extensions/dm-lens/clients/diagnostic-line-freshness.js +3 -5
  30. package/extensions/dm-lens/clients/dispatch/adopted-root-runners.js +22 -0
  31. package/extensions/dm-lens/clients/dispatch/dispatcher.js +105 -27
  32. package/extensions/dm-lens/clients/dispatch/facts/comment-facts.js +5 -2
  33. package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +1 -1
  34. package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +2 -2
  35. package/extensions/dm-lens/clients/dispatch/facts/tree-sitter-facts.js +2 -2
  36. package/extensions/dm-lens/clients/dispatch/facts/try-catch-facts.js +1 -1
  37. package/extensions/dm-lens/clients/dispatch/finding-policy.js +12 -4
  38. package/extensions/dm-lens/clients/dispatch/integration.js +60 -15
  39. package/extensions/dm-lens/clients/dispatch/known-runner-ids.js +13 -0
  40. package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +66 -11
  41. package/extensions/dm-lens/clients/dispatch/plan.js +6 -0
  42. package/extensions/dm-lens/clients/dispatch/rule-id-normalize.js +9 -2
  43. package/extensions/dm-lens/clients/dispatch/rule-policy.js +33 -4
  44. package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +9 -5
  45. package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +5 -2
  46. package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +7 -3
  47. package/extensions/dm-lens/clients/dispatch/runners/detekt.js +3 -3
  48. package/extensions/dm-lens/clients/dispatch/runners/fact-rules.js +3 -3
  49. package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +10 -6
  50. package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +8 -5
  51. package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +2 -1
  52. package/extensions/dm-lens/clients/dispatch/runners/lsp.js +28 -8
  53. package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +2 -2
  54. package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +6 -7
  55. package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +18 -8
  56. package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +3 -3
  57. package/extensions/dm-lens/clients/dispatch/runners/pyright.js +1 -1
  58. package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +25 -6
  59. package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +71 -4
  60. package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +5 -1
  61. package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +3 -3
  62. package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +3 -3
  63. package/extensions/dm-lens/clients/dispatch/runners/taplo.js +17 -5
  64. package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +12 -5
  65. package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +3 -3
  66. package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +127 -46
  67. package/extensions/dm-lens/clients/dispatch/runners/utils/tool-failure.js +11 -6
  68. package/extensions/dm-lens/clients/dispatch/runners/vale.js +3 -3
  69. package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +8 -1
  70. package/extensions/dm-lens/clients/dispatch/types.js +21 -1
  71. package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +13 -0
  72. package/extensions/dm-lens/clients/effective-config.js +14 -3
  73. package/extensions/dm-lens/clients/ephemeral-root.js +71 -0
  74. package/extensions/dm-lens/clients/file-kinds.js +9 -0
  75. package/extensions/dm-lens/clients/file-mutation-queue.js +95 -0
  76. package/extensions/dm-lens/clients/file-utils.js +87 -8
  77. package/extensions/dm-lens/clients/finding-delivery-gate.js +5 -2
  78. package/extensions/dm-lens/clients/fix-run-restore.js +416 -0
  79. package/extensions/dm-lens/clients/format-events-publish.js +82 -2
  80. package/extensions/dm-lens/clients/format-service.js +10 -5
  81. package/extensions/dm-lens/clients/formatters.js +29 -12
  82. package/extensions/dm-lens/clients/generation-guard.js +50 -8
  83. package/extensions/dm-lens/clients/generation-lock.js +184 -0
  84. package/extensions/dm-lens/clients/git-guard.js +19 -1
  85. package/extensions/dm-lens/clients/gitleaks-client.js +13 -4
  86. package/extensions/dm-lens/clients/grammar-source.js +5 -0
  87. package/extensions/dm-lens/clients/grammar-wasm-imports.js +48 -0
  88. package/extensions/dm-lens/clients/gzip-stage-write.js +15 -7
  89. package/extensions/dm-lens/clients/hard-failure-summary.js +28 -0
  90. package/extensions/dm-lens/clients/hook-budgets.js +1 -0
  91. package/extensions/dm-lens/clients/inline-blocker-fields.js +8 -0
  92. package/extensions/dm-lens/clients/install-diagnostics.js +31 -16
  93. package/extensions/dm-lens/clients/installer/index.js +238 -58
  94. package/extensions/dm-lens/clients/instance-reaper.js +164 -52
  95. package/extensions/dm-lens/clients/instance-registry-lock.js +117 -76
  96. package/extensions/dm-lens/clients/instance-registry-tail.js +17 -0
  97. package/extensions/dm-lens/clients/instance-registry.js +248 -91
  98. package/extensions/dm-lens/clients/io-bridge-contract.js +7 -0
  99. package/extensions/dm-lens/clients/io-bridge.js +372 -0
  100. package/extensions/dm-lens/clients/jscpd-client.js +83 -35
  101. package/extensions/dm-lens/clients/knip-client.js +75 -6
  102. package/extensions/dm-lens/clients/knip-scan-roots.js +29 -0
  103. package/extensions/dm-lens/clients/language-policy.js +2 -0
  104. package/extensions/dm-lens/clients/language-profile.js +4 -1
  105. package/extensions/dm-lens/clients/language-registry.js +4 -1
  106. package/extensions/dm-lens/clients/latency-logger.js +11 -1
  107. package/extensions/dm-lens/clients/lens-config.js +10 -1
  108. package/extensions/dm-lens/clients/lens-engine.js +1 -1
  109. package/extensions/dm-lens/clients/lens-flag-registry.js +14 -24
  110. package/extensions/dm-lens/clients/lsp/aggregation.js +9 -8
  111. package/extensions/dm-lens/clients/lsp/auxiliary-lifecycle.js +23 -0
  112. package/extensions/dm-lens/clients/lsp/capabilities.js +98 -0
  113. package/extensions/dm-lens/clients/lsp/cascade-tier.js +8 -3
  114. package/extensions/dm-lens/clients/lsp/client.js +282 -48
  115. package/extensions/dm-lens/clients/lsp/config.js +247 -15
  116. package/extensions/dm-lens/clients/lsp/document-drift.js +23 -11
  117. package/extensions/dm-lens/clients/lsp/edits.js +137 -85
  118. package/extensions/dm-lens/clients/lsp/grouping.js +38 -0
  119. package/extensions/dm-lens/clients/lsp/index.js +484 -275
  120. package/extensions/dm-lens/clients/lsp/launch.js +106 -6
  121. package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +37 -7
  122. package/extensions/dm-lens/clients/lsp/resolved-config.js +188 -0
  123. package/extensions/dm-lens/clients/lsp/server-covers.js +8 -0
  124. package/extensions/dm-lens/clients/lsp/server-traits.js +39 -0
  125. package/extensions/dm-lens/clients/lsp/server.js +259 -34
  126. package/extensions/dm-lens/clients/lsp/service-singleton.js +59 -0
  127. package/extensions/dm-lens/clients/lsp/session-roots.js +1 -1
  128. package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +2 -1
  129. package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +25 -4
  130. package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +6 -3
  131. package/extensions/dm-lens/clients/lsp-budget.js +9 -5
  132. package/extensions/dm-lens/clients/lsp-document-symbols.js +1 -1
  133. package/extensions/dm-lens/clients/lsp-lazy.js +1 -1
  134. package/extensions/dm-lens/clients/lsp-mutation.js +44 -8
  135. package/extensions/dm-lens/clients/lsp-status.js +5 -7
  136. package/extensions/dm-lens/clients/mcp/analyze.js +24 -11
  137. package/extensions/dm-lens/clients/mcp/ipc.js +26 -7
  138. package/extensions/dm-lens/clients/mcp/session.js +1 -1
  139. package/extensions/dm-lens/clients/memory-sampler.js +48 -3
  140. package/extensions/dm-lens/clients/module-report-lsp.js +1 -1
  141. package/extensions/dm-lens/clients/module-report.js +9 -3
  142. package/extensions/dm-lens/clients/mutating-tool.js +12 -3
  143. package/extensions/dm-lens/clients/mutation-attribution.js +8 -0
  144. package/extensions/dm-lens/clients/mutation-bridge.js +181 -48
  145. package/extensions/dm-lens/clients/ndjson-logger.js +33 -0
  146. package/extensions/dm-lens/clients/observed-mutation-sources.js +1 -1
  147. package/extensions/dm-lens/clients/observed-mutation.js +40 -20
  148. package/extensions/dm-lens/clients/opaque-mutation-scan.js +40 -13
  149. package/extensions/dm-lens/clients/opengrep-client.js +6 -3
  150. package/extensions/dm-lens/clients/package-manager.js +61 -6
  151. package/extensions/dm-lens/clients/path-utils.js +77 -18
  152. package/extensions/dm-lens/clients/performance-report.js +1 -1
  153. package/extensions/dm-lens/clients/persist-worker-stats.js +8 -0
  154. package/extensions/dm-lens/clients/persistent-reverify.js +5 -1
  155. package/extensions/dm-lens/clients/pipeline.js +310 -114
  156. package/extensions/dm-lens/clients/probe-home-state.js +6 -1
  157. package/extensions/dm-lens/clients/process-bridge.js +28 -0
  158. package/extensions/dm-lens/clients/process-snapshot.js +115 -2
  159. package/extensions/dm-lens/clients/project-changes.js +81 -19
  160. package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +18 -13
  161. package/extensions/dm-lens/clients/project-lens-config.js +32 -5
  162. package/extensions/dm-lens/clients/project-scale.js +1 -1
  163. package/extensions/dm-lens/clients/project-snapshot-fingerprint.js +17 -12
  164. package/extensions/dm-lens/clients/project-snapshot-persist-worker.js +2 -3
  165. package/extensions/dm-lens/clients/project-snapshot.js +229 -64
  166. package/extensions/dm-lens/clients/python-environment.js +44 -2
  167. package/extensions/dm-lens/clients/quiet-window.js +6 -3
  168. package/extensions/dm-lens/clients/read-bridge.js +28 -20
  169. package/extensions/dm-lens/clients/read-expansion.js +1 -1
  170. package/extensions/dm-lens/clients/read-guard-branch.js +129 -0
  171. package/extensions/dm-lens/clients/read-guard-logger.js +11 -3
  172. package/extensions/dm-lens/clients/read-guard-tool-lines.js +16 -8
  173. package/extensions/dm-lens/clients/read-guard.js +516 -176
  174. package/extensions/dm-lens/clients/review-graph/builder.js +132 -54
  175. package/extensions/dm-lens/clients/review-graph/git-identity.js +59 -1
  176. package/extensions/dm-lens/clients/review-graph/import-resolvers.js +6 -8
  177. package/extensions/dm-lens/clients/runtime-agent-end.js +271 -68
  178. package/extensions/dm-lens/clients/runtime-coordinator.js +386 -74
  179. package/extensions/dm-lens/clients/runtime-session.js +174 -31
  180. package/extensions/dm-lens/clients/runtime-tool-call.js +92 -17
  181. package/extensions/dm-lens/clients/runtime-tool-result.js +477 -137
  182. package/extensions/dm-lens/clients/runtime-turn.js +949 -355
  183. package/extensions/dm-lens/clients/safe-spawn.js +12 -4
  184. package/extensions/dm-lens/clients/scanner-temp-root.js +8 -0
  185. package/extensions/dm-lens/clients/scratch-tree-policy.js +9 -0
  186. package/extensions/dm-lens/clients/search-read-registration.js +2 -1
  187. package/extensions/dm-lens/clients/session-lifecycle.js +120 -18
  188. package/extensions/dm-lens/clients/session-scope.js +456 -0
  189. package/extensions/dm-lens/clients/session-state-store.js +23 -20
  190. package/extensions/dm-lens/clients/sg-runner.js +24 -6
  191. package/extensions/dm-lens/clients/sgconfig.js +35 -5
  192. package/extensions/dm-lens/clients/startup-scan.js +10 -2
  193. package/extensions/dm-lens/clients/test-runner-client.js +258 -48
  194. package/extensions/dm-lens/clients/test-runner-delivery.js +46 -9
  195. package/extensions/dm-lens/clients/test-target-roots.js +20 -0
  196. package/extensions/dm-lens/clients/tool-agreement.js +282 -19
  197. package/extensions/dm-lens/clients/tool-config.js +1 -0
  198. package/extensions/dm-lens/clients/tool-event.js +6 -0
  199. package/extensions/dm-lens/clients/tool-probe.js +8 -0
  200. package/extensions/dm-lens/clients/tool-set-policy.js +36 -26
  201. package/extensions/dm-lens/clients/tree-sitter-client.js +304 -34
  202. package/extensions/dm-lens/clients/tree-sitter-query-loader.js +76 -2
  203. package/extensions/dm-lens/clients/tree-sitter-shared.js +2 -2
  204. package/extensions/dm-lens/clients/tree-sitter-symbol-extractor.js +3 -1
  205. package/extensions/dm-lens/clients/trivy-client.js +40 -7
  206. package/extensions/dm-lens/clients/turn-end/delivery-holds.js +59 -0
  207. package/extensions/dm-lens/clients/widget-state.js +36 -2
  208. package/extensions/dm-lens/clients/word-index.js +73 -5
  209. package/extensions/dm-lens/clients/workspace-topology.js +11 -4
  210. package/extensions/dm-lens/clients/write-ordering-guard.js +4 -0
  211. package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +9 -3
  212. package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +24 -0
  213. package/extensions/dm-lens/dist/clients/actionable-warnings.js +1062 -0
  214. package/extensions/dm-lens/dist/clients/advisory-provenance.js +387 -0
  215. package/extensions/dm-lens/dist/clients/agent-behavior-client.js +94 -0
  216. package/extensions/dm-lens/dist/clients/agent-nudge.js +253 -0
  217. package/extensions/dm-lens/dist/clients/analysed-root.js +1 -0
  218. package/extensions/dm-lens/dist/clients/analysis-root.js +100 -0
  219. package/extensions/dm-lens/dist/clients/ast-grep-client.js +587 -0
  220. package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +137 -0
  221. package/extensions/dm-lens/dist/clients/ast-grep-tool-logger.js +85 -0
  222. package/extensions/dm-lens/dist/clients/ast-grep-types.js +1 -0
  223. package/extensions/dm-lens/dist/clients/ast-grep-yaml-synth.js +109 -0
  224. package/extensions/dm-lens/dist/clients/atomic-write-staging.js +66 -0
  225. package/extensions/dm-lens/dist/clients/atomic-write.js +37 -0
  226. package/extensions/dm-lens/dist/clients/availability-probe-flight.js +11 -0
  227. package/extensions/dm-lens/dist/clients/bash-file-access.js +830 -0
  228. package/extensions/dm-lens/dist/clients/biome-client.js +223 -0
  229. package/extensions/dm-lens/dist/clients/blocker-freshness.js +377 -0
  230. package/extensions/dm-lens/dist/clients/blocker-past-eof.js +49 -0
  231. package/extensions/dm-lens/dist/clients/bootstrap.js +246 -0
  232. package/extensions/dm-lens/dist/clients/bounded-cache.js +105 -0
  233. package/extensions/dm-lens/dist/clients/bounded-pid-file-lock.js +275 -0
  234. package/extensions/dm-lens/dist/clients/bounded-telemetry.js +107 -0
  235. package/extensions/dm-lens/dist/clients/build-identity.js +45 -0
  236. package/extensions/dm-lens/dist/clients/bundled-resource-health.js +41 -0
  237. package/extensions/dm-lens/dist/clients/bus-events-logger.js +48 -0
  238. package/extensions/dm-lens/dist/clients/bus-publish.js +117 -0
  239. package/extensions/dm-lens/dist/clients/cache/rule-cache.js +87 -0
  240. package/extensions/dm-lens/dist/clients/cache-manager.js +428 -0
  241. package/extensions/dm-lens/dist/clients/cache-observability.js +847 -0
  242. package/extensions/dm-lens/dist/clients/call-graph.js +628 -0
  243. package/extensions/dm-lens/dist/clients/cargo-manifest.js +171 -0
  244. package/extensions/dm-lens/dist/clients/cascade-budget.js +52 -0
  245. package/extensions/dm-lens/dist/clients/cascade-format.js +160 -0
  246. package/extensions/dm-lens/dist/clients/cascade-logger.js +22 -0
  247. package/extensions/dm-lens/dist/clients/cascade-types.js +1 -0
  248. package/extensions/dm-lens/dist/clients/child-unref.js +59 -0
  249. package/extensions/dm-lens/dist/clients/code-quality-warnings.js +192 -0
  250. package/extensions/dm-lens/dist/clients/codebase-model.js +110 -0
  251. package/extensions/dm-lens/dist/clients/collateral-test-role.js +8 -0
  252. package/extensions/dm-lens/dist/clients/complexity-client.js +398 -0
  253. package/extensions/dm-lens/dist/clients/config-core/deny.js +117 -0
  254. package/extensions/dm-lens/dist/clients/config-core/index.js +2 -0
  255. package/extensions/dm-lens/dist/clients/config-core/merge.js +228 -0
  256. package/extensions/dm-lens/dist/clients/config-core/normalize.js +226 -0
  257. package/extensions/dm-lens/dist/clients/config-core/process-spec.js +147 -0
  258. package/extensions/dm-lens/dist/clients/config-core/provenance.js +54 -0
  259. package/extensions/dm-lens/dist/clients/config-core/records.js +79 -0
  260. package/extensions/dm-lens/dist/clients/config-core/resolve.js +48 -0
  261. package/extensions/dm-lens/dist/clients/config-core/safe-object.js +22 -0
  262. package/extensions/dm-lens/dist/clients/config-core/schema.js +93 -0
  263. package/extensions/dm-lens/dist/clients/config-diagnostic-codes.js +90 -0
  264. package/extensions/dm-lens/dist/clients/config-locations.js +175 -0
  265. package/extensions/dm-lens/dist/clients/config-resolve.js +359 -0
  266. package/extensions/dm-lens/dist/clients/config-schema.js +230 -0
  267. package/extensions/dm-lens/dist/clients/config-warn.js +146 -0
  268. package/extensions/dm-lens/dist/clients/confirmed-delete.js +11 -0
  269. package/extensions/dm-lens/dist/clients/console-guard-install.js +4 -0
  270. package/extensions/dm-lens/dist/clients/cooperative-budget.js +36 -0
  271. package/extensions/dm-lens/dist/clients/custom-rule-locations.js +28 -0
  272. package/extensions/dm-lens/dist/clients/dead-code-client.js +408 -0
  273. package/extensions/dm-lens/dist/clients/dead-code-logger.js +18 -0
  274. package/extensions/dm-lens/dist/clients/deadline-utils.js +117 -0
  275. package/extensions/dm-lens/dist/clients/debug-handles.js +121 -0
  276. package/extensions/dm-lens/dist/clients/debug-heap.js +80 -0
  277. package/extensions/dm-lens/dist/clients/deferred-lsp-work.js +33 -0
  278. package/extensions/dm-lens/dist/clients/deferred-runner-blockers.js +106 -0
  279. package/extensions/dm-lens/dist/clients/deferred-test-targets.js +31 -0
  280. package/extensions/dm-lens/dist/clients/degradation-ledger.js +289 -0
  281. package/extensions/dm-lens/dist/clients/demoted-finding-render.js +64 -0
  282. package/extensions/dm-lens/dist/clients/dependency-checker.js +534 -0
  283. package/extensions/dm-lens/dist/clients/deps/ast-grep-napi.js +17 -0
  284. package/extensions/dm-lens/dist/clients/deps/dm-host-deps.js +10 -0
  285. package/extensions/dm-lens/dist/clients/deps/dm-tui-compat.js +58 -0
  286. package/extensions/dm-lens/dist/clients/deps/js-yaml.js +7 -0
  287. package/extensions/dm-lens/dist/clients/deps/minimatch.js +6 -0
  288. package/extensions/dm-lens/dist/clients/deps/pidusage.js +5 -0
  289. package/extensions/dm-lens/dist/clients/deps/typebox.js +5 -0
  290. package/extensions/dm-lens/dist/clients/deps/vscode-jsonrpc.js +8 -0
  291. package/extensions/dm-lens/dist/clients/deps/web-tree-sitter.js +11 -0
  292. package/extensions/dm-lens/dist/clients/diagnostic-dispositions.js +318 -0
  293. package/extensions/dm-lens/dist/clients/diagnostic-line-freshness.js +142 -0
  294. package/extensions/dm-lens/dist/clients/diagnostic-logger.js +60 -0
  295. package/extensions/dm-lens/dist/clients/diagnostic-tracker.js +89 -0
  296. package/extensions/dm-lens/dist/clients/diagnostics-publish.js +134 -0
  297. package/extensions/dm-lens/dist/clients/dispatch/adopted-root-runners.js +22 -0
  298. package/extensions/dm-lens/dist/clients/dispatch/ast-grep-catalog.js +16 -0
  299. package/extensions/dm-lens/dist/clients/dispatch/auxiliary-lsp.js +158 -0
  300. package/extensions/dm-lens/dist/clients/dispatch/collect-later-tier.js +25 -0
  301. package/extensions/dm-lens/dist/clients/dispatch/diagnostic-taxonomy.js +58 -0
  302. package/extensions/dm-lens/dist/clients/dispatch/dispatcher.js +1017 -0
  303. package/extensions/dm-lens/dist/clients/dispatch/fact-provider-types.js +1 -0
  304. package/extensions/dm-lens/dist/clients/dispatch/fact-rule-runner.js +17 -0
  305. package/extensions/dm-lens/dist/clients/dispatch/fact-runner.js +18 -0
  306. package/extensions/dm-lens/dist/clients/dispatch/fact-scheduler.js +52 -0
  307. package/extensions/dm-lens/dist/clients/dispatch/fact-store.js +199 -0
  308. package/extensions/dm-lens/dist/clients/dispatch/facts/comment-facts.js +23 -0
  309. package/extensions/dm-lens/dist/clients/dispatch/facts/file-content.js +18 -0
  310. package/extensions/dm-lens/dist/clients/dispatch/facts/function-facts.js +281 -0
  311. package/extensions/dm-lens/dist/clients/dispatch/facts/import-facts.js +169 -0
  312. package/extensions/dm-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +19 -0
  313. package/extensions/dm-lens/dist/clients/dispatch/facts/try-catch-facts.js +95 -0
  314. package/extensions/dm-lens/dist/clients/dispatch/finding-policy.js +164 -0
  315. package/extensions/dm-lens/dist/clients/dispatch/indent-detect.js +227 -0
  316. package/extensions/dm-lens/dist/clients/dispatch/inline-suppressions.js +52 -0
  317. package/extensions/dm-lens/dist/clients/dispatch/integration.js +1502 -0
  318. package/extensions/dm-lens/dist/clients/dispatch/known-runner-ids.js +13 -0
  319. package/extensions/dm-lens/dist/clients/dispatch/lazy.js +8 -0
  320. package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +130 -0
  321. package/extensions/dm-lens/dist/clients/dispatch/plan.js +284 -0
  322. package/extensions/dm-lens/dist/clients/dispatch/priorities.js +14 -0
  323. package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +49 -0
  324. package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +21 -0
  325. package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +102 -0
  326. package/extensions/dm-lens/dist/clients/dispatch/rules/async-noise.js +31 -0
  327. package/extensions/dm-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +27 -0
  328. package/extensions/dm-lens/dist/clients/dispatch/rules/cors-wildcard.js +35 -0
  329. package/extensions/dm-lens/dist/clients/dispatch/rules/error-obscuring.js +29 -0
  330. package/extensions/dm-lens/dist/clients/dispatch/rules/error-swallowing.js +29 -0
  331. package/extensions/dm-lens/dist/clients/dispatch/rules/framework-call-noise.js +31 -0
  332. package/extensions/dm-lens/dist/clients/dispatch/rules/high-complexity.js +56 -0
  333. package/extensions/dm-lens/dist/clients/dispatch/rules/high-fan-out.js +45 -0
  334. package/extensions/dm-lens/dist/clients/dispatch/rules/high-import-coupling.js +31 -0
  335. package/extensions/dm-lens/dist/clients/dispatch/rules/missing-error-propagation.js +45 -0
  336. package/extensions/dm-lens/dist/clients/dispatch/rules/no-commented-credentials.js +46 -0
  337. package/extensions/dm-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +38 -0
  338. package/extensions/dm-lens/dist/clients/dispatch/rules/placeholder-comments.js +40 -0
  339. package/extensions/dm-lens/dist/clients/dispatch/rules/unsafe-boundary.js +101 -0
  340. package/extensions/dm-lens/dist/clients/dispatch/runner-context.js +46 -0
  341. package/extensions/dm-lens/dist/clients/dispatch/runners/actionlint.js +98 -0
  342. package/extensions/dm-lens/dist/clients/dispatch/runners/ast-grep-napi.js +694 -0
  343. package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +205 -0
  344. package/extensions/dm-lens/dist/clients/dispatch/runners/cpp-check.js +190 -0
  345. package/extensions/dm-lens/dist/clients/dispatch/runners/credo.js +66 -0
  346. package/extensions/dm-lens/dist/clients/dispatch/runners/cue-vet.js +171 -0
  347. package/extensions/dm-lens/dist/clients/dispatch/runners/dart-analyze.js +151 -0
  348. package/extensions/dm-lens/dist/clients/dispatch/runners/detekt.js +157 -0
  349. package/extensions/dm-lens/dist/clients/dispatch/runners/dotnet-build.js +157 -0
  350. package/extensions/dm-lens/dist/clients/dispatch/runners/elixir-check.js +153 -0
  351. package/extensions/dm-lens/dist/clients/dispatch/runners/eslint.js +99 -0
  352. package/extensions/dm-lens/dist/clients/dispatch/runners/fact-rules.js +20 -0
  353. package/extensions/dm-lens/dist/clients/dispatch/runners/fish-indent.js +66 -0
  354. package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +110 -0
  355. package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +52 -0
  356. package/extensions/dm-lens/dist/clients/dispatch/runners/golangci-lint.js +89 -0
  357. package/extensions/dm-lens/dist/clients/dispatch/runners/hadolint.js +83 -0
  358. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-lint.js +144 -0
  359. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-render.js +593 -0
  360. package/extensions/dm-lens/dist/clients/dispatch/runners/htmlhint.js +103 -0
  361. package/extensions/dm-lens/dist/clients/dispatch/runners/index.js +100 -0
  362. package/extensions/dm-lens/dist/clients/dispatch/runners/javac.js +82 -0
  363. package/extensions/dm-lens/dist/clients/dispatch/runners/ktlint.js +93 -0
  364. package/extensions/dm-lens/dist/clients/dispatch/runners/lsp.js +226 -0
  365. package/extensions/dm-lens/dist/clients/dispatch/runners/markdownlint.js +129 -0
  366. package/extensions/dm-lens/dist/clients/dispatch/runners/mypy.js +70 -0
  367. package/extensions/dm-lens/dist/clients/dispatch/runners/oxlint.js +305 -0
  368. package/extensions/dm-lens/dist/clients/dispatch/runners/php-lint.js +66 -0
  369. package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +90 -0
  370. package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +66 -0
  371. package/extensions/dm-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +307 -0
  372. package/extensions/dm-lens/dist/clients/dispatch/runners/pyright.js +118 -0
  373. package/extensions/dm-lens/dist/clients/dispatch/runners/rubocop.js +79 -0
  374. package/extensions/dm-lens/dist/clients/dispatch/runners/ruff.js +69 -0
  375. package/extensions/dm-lens/dist/clients/dispatch/runners/rust-clippy.js +166 -0
  376. package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +177 -0
  377. package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +85 -0
  378. package/extensions/dm-lens/dist/clients/dispatch/runners/spellcheck.js +74 -0
  379. package/extensions/dm-lens/dist/clients/dispatch/runners/spotbugs.js +208 -0
  380. package/extensions/dm-lens/dist/clients/dispatch/runners/sqlfluff.js +136 -0
  381. package/extensions/dm-lens/dist/clients/dispatch/runners/stylelint.js +118 -0
  382. package/extensions/dm-lens/dist/clients/dispatch/runners/swiftlint.js +143 -0
  383. package/extensions/dm-lens/dist/clients/dispatch/runners/taplo.js +108 -0
  384. package/extensions/dm-lens/dist/clients/dispatch/runners/terragrunt.js +110 -0
  385. package/extensions/dm-lens/dist/clients/dispatch/runners/tflint.js +104 -0
  386. package/extensions/dm-lens/dist/clients/dispatch/runners/tree-sitter.js +521 -0
  387. package/extensions/dm-lens/dist/clients/dispatch/runners/trivy-config.js +155 -0
  388. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/availability-policy.js +285 -0
  389. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +61 -0
  390. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +61 -0
  391. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +130 -0
  392. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +1143 -0
  393. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +40 -0
  394. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/tool-failure.js +120 -0
  395. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +88 -0
  396. package/extensions/dm-lens/dist/clients/dispatch/runners/utils.js +8 -0
  397. package/extensions/dm-lens/dist/clients/dispatch/runners/vale.js +106 -0
  398. package/extensions/dm-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +170 -0
  399. package/extensions/dm-lens/dist/clients/dispatch/runners/yamllint.js +83 -0
  400. package/extensions/dm-lens/dist/clients/dispatch/runners/zig-check.js +72 -0
  401. package/extensions/dm-lens/dist/clients/dispatch/suppress-writer.js +57 -0
  402. package/extensions/dm-lens/dist/clients/dispatch/tool-profile.js +30 -0
  403. package/extensions/dm-lens/dist/clients/dispatch/types.js +27 -0
  404. package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +58 -0
  405. package/extensions/dm-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +31 -0
  406. package/extensions/dm-lens/dist/clients/disposition-logger.js +19 -0
  407. package/extensions/dm-lens/dist/clients/disposition-publish.js +88 -0
  408. package/extensions/dm-lens/dist/clients/durable-store.js +77 -0
  409. package/extensions/dm-lens/dist/clients/effective-config.js +170 -0
  410. package/extensions/dm-lens/dist/clients/env-utils.js +26 -0
  411. package/extensions/dm-lens/dist/clients/ephemeral-root.js +67 -0
  412. package/extensions/dm-lens/dist/clients/error-class.js +3 -0
  413. package/extensions/dm-lens/dist/clients/eval-timestamp.js +2 -0
  414. package/extensions/dm-lens/dist/clients/event-loop-hold.js +119 -0
  415. package/extensions/dm-lens/dist/clients/event-loop-monitor.js +84 -0
  416. package/extensions/dm-lens/dist/clients/extension-log.js +230 -0
  417. package/extensions/dm-lens/dist/clients/extension-mode.js +20 -0
  418. package/extensions/dm-lens/dist/clients/feature-hints.js +88 -0
  419. package/extensions/dm-lens/dist/clients/file-kinds.js +313 -0
  420. package/extensions/dm-lens/dist/clients/file-mutation-queue.js +95 -0
  421. package/extensions/dm-lens/dist/clients/file-role.js +50 -0
  422. package/extensions/dm-lens/dist/clients/file-time.js +112 -0
  423. package/extensions/dm-lens/dist/clients/file-utils.js +706 -0
  424. package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +132 -0
  425. package/extensions/dm-lens/dist/clients/finding-identity.js +23 -0
  426. package/extensions/dm-lens/dist/clients/fix-run-restore.js +413 -0
  427. package/extensions/dm-lens/dist/clients/fix-worklog.js +75 -0
  428. package/extensions/dm-lens/dist/clients/format-events-publish.js +310 -0
  429. package/extensions/dm-lens/dist/clients/format-service.js +159 -0
  430. package/extensions/dm-lens/dist/clients/formatters-lazy.js +8 -0
  431. package/extensions/dm-lens/dist/clients/formatters.js +1367 -0
  432. package/extensions/dm-lens/dist/clients/freshness-cadence.js +1 -0
  433. package/extensions/dm-lens/dist/clients/freshness.js +8 -0
  434. package/extensions/dm-lens/dist/clients/generated-artifacts.js +209 -0
  435. package/extensions/dm-lens/dist/clients/generation-guard.js +147 -0
  436. package/extensions/dm-lens/dist/clients/generation-lock.js +181 -0
  437. package/extensions/dm-lens/dist/clients/git-guard.js +786 -0
  438. package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +120 -0
  439. package/extensions/dm-lens/dist/clients/gitleaks-client.js +290 -0
  440. package/extensions/dm-lens/dist/clients/go-client.js +47 -0
  441. package/extensions/dm-lens/dist/clients/govulncheck-client.js +411 -0
  442. package/extensions/dm-lens/dist/clients/gradle-ktfmt-style.js +177 -0
  443. package/extensions/dm-lens/dist/clients/grammar-source.js +229 -0
  444. package/extensions/dm-lens/dist/clients/grammar-wasm-imports.js +48 -0
  445. package/extensions/dm-lens/dist/clients/gzip-stage-write.js +93 -0
  446. package/extensions/dm-lens/dist/clients/hard-failure-summary.js +28 -0
  447. package/extensions/dm-lens/dist/clients/hashline-anchor.js +222 -0
  448. package/extensions/dm-lens/dist/clients/hook-budgets.js +17 -0
  449. package/extensions/dm-lens/dist/clients/host-edit-normalize.js +87 -0
  450. package/extensions/dm-lens/dist/clients/host-ports.js +35 -0
  451. package/extensions/dm-lens/dist/clients/indent-retarget.js +102 -0
  452. package/extensions/dm-lens/dist/clients/inline-blocker-dispositions.js +103 -0
  453. package/extensions/dm-lens/dist/clients/inline-blocker-fields.js +8 -0
  454. package/extensions/dm-lens/dist/clients/install-diagnostics.js +135 -0
  455. package/extensions/dm-lens/dist/clients/installer/index.js +3935 -0
  456. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh-session.js +17 -0
  457. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh.js +522 -0
  458. package/extensions/dm-lens/dist/clients/instance-reaper-state.js +3 -0
  459. package/extensions/dm-lens/dist/clients/instance-reaper.js +682 -0
  460. package/extensions/dm-lens/dist/clients/instance-registry-lock.js +166 -0
  461. package/extensions/dm-lens/dist/clients/instance-registry-tail.js +17 -0
  462. package/extensions/dm-lens/dist/clients/instance-registry.js +595 -0
  463. package/extensions/dm-lens/dist/clients/io-bridge-contract.js +7 -0
  464. package/extensions/dm-lens/dist/clients/io-bridge.js +357 -0
  465. package/extensions/dm-lens/dist/clients/jscpd-client.js +300 -0
  466. package/extensions/dm-lens/dist/clients/json-cache-read.js +25 -0
  467. package/extensions/dm-lens/dist/clients/knip-client.js +534 -0
  468. package/extensions/dm-lens/dist/clients/knip-scan-roots.js +26 -0
  469. package/extensions/dm-lens/dist/clients/language-policy.js +244 -0
  470. package/extensions/dm-lens/dist/clients/language-profile.js +263 -0
  471. package/extensions/dm-lens/dist/clients/language-registry.js +427 -0
  472. package/extensions/dm-lens/dist/clients/latency-logger.js +202 -0
  473. package/extensions/dm-lens/dist/clients/lazy-import.js +14 -0
  474. package/extensions/dm-lens/dist/clients/ledger-bounds.js +21 -0
  475. package/extensions/dm-lens/dist/clients/lens-config.js +246 -0
  476. package/extensions/dm-lens/dist/clients/lens-engine.js +181 -0
  477. package/extensions/dm-lens/dist/clients/lens-events.js +105 -0
  478. package/extensions/dm-lens/dist/clients/lens-flag-registry.js +292 -0
  479. package/extensions/dm-lens/dist/clients/lens-map.js +980 -0
  480. package/extensions/dm-lens/dist/clients/live-bus-emitter.js +53 -0
  481. package/extensions/dm-lens/dist/clients/log-cleanup.js +138 -0
  482. package/extensions/dm-lens/dist/clients/lsp/aggregation.js +89 -0
  483. package/extensions/dm-lens/dist/clients/lsp/auxiliary-lifecycle.js +23 -0
  484. package/extensions/dm-lens/dist/clients/lsp/capabilities.js +94 -0
  485. package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +208 -0
  486. package/extensions/dm-lens/dist/clients/lsp/client.js +2943 -0
  487. package/extensions/dm-lens/dist/clients/lsp/config.js +471 -0
  488. package/extensions/dm-lens/dist/clients/lsp/content-limits.js +21 -0
  489. package/extensions/dm-lens/dist/clients/lsp/diagnostic-binding.js +79 -0
  490. package/extensions/dm-lens/dist/clients/lsp/document-drift.js +324 -0
  491. package/extensions/dm-lens/dist/clients/lsp/edits.js +982 -0
  492. package/extensions/dm-lens/dist/clients/lsp/grouping.js +38 -0
  493. package/extensions/dm-lens/dist/clients/lsp/index.js +4639 -0
  494. package/extensions/dm-lens/dist/clients/lsp/inferred-project.js +121 -0
  495. package/extensions/dm-lens/dist/clients/lsp/jvm-runtime.js +194 -0
  496. package/extensions/dm-lens/dist/clients/lsp/language.js +23 -0
  497. package/extensions/dm-lens/dist/clients/lsp/launch.js +564 -0
  498. package/extensions/dm-lens/dist/clients/lsp/lombok.js +146 -0
  499. package/extensions/dm-lens/dist/clients/lsp/path-utils.js +1 -0
  500. package/extensions/dm-lens/dist/clients/lsp/pending-aux-coverage.js +120 -0
  501. package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +28 -0
  502. package/extensions/dm-lens/dist/clients/lsp/resolved-config.js +183 -0
  503. package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +42 -0
  504. package/extensions/dm-lens/dist/clients/lsp/server-covers.js +8 -0
  505. package/extensions/dm-lens/dist/clients/lsp/server-traits.js +39 -0
  506. package/extensions/dm-lens/dist/clients/lsp/server.js +2640 -0
  507. package/extensions/dm-lens/dist/clients/lsp/service-singleton.js +59 -0
  508. package/extensions/dm-lens/dist/clients/lsp/session-roots.js +52 -0
  509. package/extensions/dm-lens/dist/clients/lsp/spawn-history.js +15 -0
  510. package/extensions/dm-lens/dist/clients/lsp/sync-kind.js +30 -0
  511. package/extensions/dm-lens/dist/clients/lsp/tsserver-sync.js +156 -0
  512. package/extensions/dm-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +1 -0
  513. package/extensions/dm-lens/dist/clients/lsp/wait-policy/classification.js +37 -0
  514. package/extensions/dm-lens/dist/clients/lsp/wait-policy/index.js +3 -0
  515. package/extensions/dm-lens/dist/clients/lsp/wait-policy/strategies.js +196 -0
  516. package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +40 -0
  517. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +270 -0
  518. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-session.js +7 -0
  519. package/extensions/dm-lens/dist/clients/lsp/workspace-sweep-hold.js +93 -0
  520. package/extensions/dm-lens/dist/clients/lsp-budget.js +87 -0
  521. package/extensions/dm-lens/dist/clients/lsp-document-symbols.js +93 -0
  522. package/extensions/dm-lens/dist/clients/lsp-lazy.js +8 -0
  523. package/extensions/dm-lens/dist/clients/lsp-mutation.js +309 -0
  524. package/extensions/dm-lens/dist/clients/lsp-status.js +35 -0
  525. package/extensions/dm-lens/dist/clients/map-with-concurrency.js +20 -0
  526. package/extensions/dm-lens/dist/clients/mcp/analyze.js +265 -0
  527. package/extensions/dm-lens/dist/clients/mcp/host-shim.js +14 -0
  528. package/extensions/dm-lens/dist/clients/mcp/ipc.js +321 -0
  529. package/extensions/dm-lens/dist/clients/mcp/review.js +137 -0
  530. package/extensions/dm-lens/dist/clients/mcp/session.js +305 -0
  531. package/extensions/dm-lens/dist/clients/memory-sampler.js +145 -0
  532. package/extensions/dm-lens/dist/clients/message-end-attribution.js +18 -0
  533. package/extensions/dm-lens/dist/clients/metrics-client.js +80 -0
  534. package/extensions/dm-lens/dist/clients/metrics-history.js +255 -0
  535. package/extensions/dm-lens/dist/clients/middle-man-analysis.js +161 -0
  536. package/extensions/dm-lens/dist/clients/model-provider.js +31 -0
  537. package/extensions/dm-lens/dist/clients/module-report-lsp.js +140 -0
  538. package/extensions/dm-lens/dist/clients/module-report.js +1648 -0
  539. package/extensions/dm-lens/dist/clients/mutating-tool.js +386 -0
  540. package/extensions/dm-lens/dist/clients/mutation-attribution.js +176 -0
  541. package/extensions/dm-lens/dist/clients/mutation-bridge.js +231 -0
  542. package/extensions/dm-lens/dist/clients/ndjson-logger.js +504 -0
  543. package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +43 -0
  544. package/extensions/dm-lens/dist/clients/observed-mutation.js +729 -0
  545. package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +100 -0
  546. package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +340 -0
  547. package/extensions/dm-lens/dist/clients/opengrep-client.js +219 -0
  548. package/extensions/dm-lens/dist/clients/opengrep-config.js +52 -0
  549. package/extensions/dm-lens/dist/clients/package-manager.js +358 -0
  550. package/extensions/dm-lens/dist/clients/package-root.js +25 -0
  551. package/extensions/dm-lens/dist/clients/partial-edit-apply.js +337 -0
  552. package/extensions/dm-lens/dist/clients/path-attribution-telemetry.js +31 -0
  553. package/extensions/dm-lens/dist/clients/path-keyed-map.js +57 -0
  554. package/extensions/dm-lens/dist/clients/path-utils.js +535 -0
  555. package/extensions/dm-lens/dist/clients/performance-report.js +291 -0
  556. package/extensions/dm-lens/dist/clients/persist-debounce.js +37 -0
  557. package/extensions/dm-lens/dist/clients/persist-worker-stats.js +8 -0
  558. package/extensions/dm-lens/dist/clients/persistent-reverify.js +166 -0
  559. package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +15 -0
  560. package/extensions/dm-lens/dist/clients/pipeline.js +1279 -0
  561. package/extensions/dm-lens/dist/clients/post-autofix-notice.js +19 -0
  562. package/extensions/dm-lens/dist/clients/print-mode.js +3 -0
  563. package/extensions/dm-lens/dist/clients/probe-home-state.js +67 -0
  564. package/extensions/dm-lens/dist/clients/process-bridge.js +48 -0
  565. package/extensions/dm-lens/dist/clients/process-singletons.js +69 -0
  566. package/extensions/dm-lens/dist/clients/process-snapshot.js +130 -0
  567. package/extensions/dm-lens/dist/clients/project-changes.js +174 -0
  568. package/extensions/dm-lens/dist/clients/project-conventions.js +152 -0
  569. package/extensions/dm-lens/dist/clients/project-diagnostics/cache.js +91 -0
  570. package/extensions/dm-lens/dist/clients/project-diagnostics/extractors.js +53 -0
  571. package/extensions/dm-lens/dist/clients/project-diagnostics/fresh-fetch.js +413 -0
  572. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +64 -0
  573. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +38 -0
  574. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +21 -0
  575. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +23 -0
  576. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +28 -0
  577. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +45 -0
  578. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +34 -0
  579. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +32 -0
  580. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +79 -0
  581. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +41 -0
  582. package/extensions/dm-lens/dist/clients/project-diagnostics/scanner.js +349 -0
  583. package/extensions/dm-lens/dist/clients/project-diagnostics/types.js +1 -0
  584. package/extensions/dm-lens/dist/clients/project-lens-config.js +464 -0
  585. package/extensions/dm-lens/dist/clients/project-report.js +527 -0
  586. package/extensions/dm-lens/dist/clients/project-scale.js +60 -0
  587. package/extensions/dm-lens/dist/clients/project-scan-policy.js +4 -0
  588. package/extensions/dm-lens/dist/clients/project-snapshot-fingerprint.js +44 -0
  589. package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +13 -0
  590. package/extensions/dm-lens/dist/clients/project-snapshot.js +1333 -0
  591. package/extensions/dm-lens/dist/clients/project-trust.js +104 -0
  592. package/extensions/dm-lens/dist/clients/python-environment.js +162 -0
  593. package/extensions/dm-lens/dist/clients/python-provenance.js +551 -0
  594. package/extensions/dm-lens/dist/clients/quiet-window-config.js +16 -0
  595. package/extensions/dm-lens/dist/clients/quiet-window.js +129 -0
  596. package/extensions/dm-lens/dist/clients/read-bridge.js +53 -0
  597. package/extensions/dm-lens/dist/clients/read-expansion.js +218 -0
  598. package/extensions/dm-lens/dist/clients/read-guard-branch.js +126 -0
  599. package/extensions/dm-lens/dist/clients/read-guard-logger.js +186 -0
  600. package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +1050 -0
  601. package/extensions/dm-lens/dist/clients/read-guard.js +1429 -0
  602. package/extensions/dm-lens/dist/clients/recent-touches.js +126 -0
  603. package/extensions/dm-lens/dist/clients/redact/secrets.js +386 -0
  604. package/extensions/dm-lens/dist/clients/resource-sampler.js +344 -0
  605. package/extensions/dm-lens/dist/clients/reverse-deps.js +227 -0
  606. package/extensions/dm-lens/dist/clients/review-graph/builder.js +3708 -0
  607. package/extensions/dm-lens/dist/clients/review-graph/format.js +30 -0
  608. package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +168 -0
  609. package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +323 -0
  610. package/extensions/dm-lens/dist/clients/review-graph/persist-worker.js +8 -0
  611. package/extensions/dm-lens/dist/clients/review-graph/query.js +195 -0
  612. package/extensions/dm-lens/dist/clients/review-graph/revision-drift.js +3 -0
  613. package/extensions/dm-lens/dist/clients/review-graph/service.js +60 -0
  614. package/extensions/dm-lens/dist/clients/review-graph/shared-extraction-ir.js +54 -0
  615. package/extensions/dm-lens/dist/clients/review-graph/symbol-id.js +29 -0
  616. package/extensions/dm-lens/dist/clients/review-graph/tsconfig-paths.js +253 -0
  617. package/extensions/dm-lens/dist/clients/review-graph/types.js +1 -0
  618. package/extensions/dm-lens/dist/clients/review-graph/workspace-modules.js +374 -0
  619. package/extensions/dm-lens/dist/clients/review-graph-logger.js +51 -0
  620. package/extensions/dm-lens/dist/clients/ruff-client.js +109 -0
  621. package/extensions/dm-lens/dist/clients/rules-scanner.js +113 -0
  622. package/extensions/dm-lens/dist/clients/run-duration.js +9 -0
  623. package/extensions/dm-lens/dist/clients/runtime-agent-end.js +800 -0
  624. package/extensions/dm-lens/dist/clients/runtime-config.js +39 -0
  625. package/extensions/dm-lens/dist/clients/runtime-context.js +155 -0
  626. package/extensions/dm-lens/dist/clients/runtime-coordinator.js +1117 -0
  627. package/extensions/dm-lens/dist/clients/runtime-session.js +1768 -0
  628. package/extensions/dm-lens/dist/clients/runtime-tool-call.js +935 -0
  629. package/extensions/dm-lens/dist/clients/runtime-tool-result.js +1630 -0
  630. package/extensions/dm-lens/dist/clients/runtime-turn.js +2900 -0
  631. package/extensions/dm-lens/dist/clients/rust-client.js +48 -0
  632. package/extensions/dm-lens/dist/clients/safe-spawn.js +1275 -0
  633. package/extensions/dm-lens/dist/clients/sanitize.js +174 -0
  634. package/extensions/dm-lens/dist/clients/scan-utils.js +7 -0
  635. package/extensions/dm-lens/dist/clients/scanner-temp-root.js +8 -0
  636. package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +63 -0
  637. package/extensions/dm-lens/dist/clients/search-read-registration.js +60 -0
  638. package/extensions/dm-lens/dist/clients/secret-findings.js +69 -0
  639. package/extensions/dm-lens/dist/clients/security-scan-client.js +208 -0
  640. package/extensions/dm-lens/dist/clients/session-event-guard.js +111 -0
  641. package/extensions/dm-lens/dist/clients/session-lifecycle.js +269 -0
  642. package/extensions/dm-lens/dist/clients/session-scope.js +451 -0
  643. package/extensions/dm-lens/dist/clients/session-start-observability.js +47 -0
  644. package/extensions/dm-lens/dist/clients/session-state-store.js +66 -0
  645. package/extensions/dm-lens/dist/clients/session-summary.js +8 -0
  646. package/extensions/dm-lens/dist/clients/sessionstart-logger.js +22 -0
  647. package/extensions/dm-lens/dist/clients/sg-runner.js +645 -0
  648. package/extensions/dm-lens/dist/clients/sgconfig.js +306 -0
  649. package/extensions/dm-lens/dist/clients/shared-checkout-guard.js +177 -0
  650. package/extensions/dm-lens/dist/clients/single-flight.js +52 -0
  651. package/extensions/dm-lens/dist/clients/situational-tool-telemetry.js +85 -0
  652. package/extensions/dm-lens/dist/clients/skills-resolver.js +38 -0
  653. package/extensions/dm-lens/dist/clients/slow-fs.js +77 -0
  654. package/extensions/dm-lens/dist/clients/smells-rollup.js +118 -0
  655. package/extensions/dm-lens/dist/clients/source-filter.js +320 -0
  656. package/extensions/dm-lens/dist/clients/source-walker.js +96 -0
  657. package/extensions/dm-lens/dist/clients/spawn-output-cap.js +35 -0
  658. package/extensions/dm-lens/dist/clients/spawn-timeout-cooldown.js +51 -0
  659. package/extensions/dm-lens/dist/clients/stale-marker.js +1 -0
  660. package/extensions/dm-lens/dist/clients/startup-scan.js +230 -0
  661. package/extensions/dm-lens/dist/clients/startup-timing.js +67 -0
  662. package/extensions/dm-lens/dist/clients/string-utils.js +6 -0
  663. package/extensions/dm-lens/dist/clients/subagent-mode.js +40 -0
  664. package/extensions/dm-lens/dist/clients/symbol-containment.js +16 -0
  665. package/extensions/dm-lens/dist/clients/symbol-types.js +1 -0
  666. package/extensions/dm-lens/dist/clients/test-runner-client.js +1697 -0
  667. package/extensions/dm-lens/dist/clients/test-runner-delivery.js +293 -0
  668. package/extensions/dm-lens/dist/clients/test-target-roots.js +17 -0
  669. package/extensions/dm-lens/dist/clients/todo-scanner.js +164 -0
  670. package/extensions/dm-lens/dist/clients/tool-agreement.js +640 -0
  671. package/extensions/dm-lens/dist/clients/tool-config.js +219 -0
  672. package/extensions/dm-lens/dist/clients/tool-cwd.js +235 -0
  673. package/extensions/dm-lens/dist/clients/tool-definition.js +22 -0
  674. package/extensions/dm-lens/dist/clients/tool-event.js +24 -0
  675. package/extensions/dm-lens/dist/clients/tool-policy.js +2393 -0
  676. package/extensions/dm-lens/dist/clients/tool-probe.js +13 -0
  677. package/extensions/dm-lens/dist/clients/tool-render.js +79 -0
  678. package/extensions/dm-lens/dist/clients/tool-set-policy.js +77 -0
  679. package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +206 -0
  680. package/extensions/dm-lens/dist/clients/tree-sitter-client.js +3057 -0
  681. package/extensions/dm-lens/dist/clients/tree-sitter-logger.js +77 -0
  682. package/extensions/dm-lens/dist/clients/tree-sitter-navigator.js +198 -0
  683. package/extensions/dm-lens/dist/clients/tree-sitter-query-loader.js +389 -0
  684. package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +87 -0
  685. package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +959 -0
  686. package/extensions/dm-lens/dist/clients/trivy-client.js +335 -0
  687. package/extensions/dm-lens/dist/clients/tui-fit.js +26 -0
  688. package/extensions/dm-lens/dist/clients/turn-context.js +48 -0
  689. package/extensions/dm-lens/dist/clients/turn-end/delivery-holds.js +59 -0
  690. package/extensions/dm-lens/dist/clients/turn-end/lane.js +1 -0
  691. package/extensions/dm-lens/dist/clients/turn-end/lanes/govulncheck.js +54 -0
  692. package/extensions/dm-lens/dist/clients/turn-end/lanes/secrets.js +131 -0
  693. package/extensions/dm-lens/dist/clients/turn-summary-render.js +56 -0
  694. package/extensions/dm-lens/dist/clients/turn-summary.js +84 -0
  695. package/extensions/dm-lens/dist/clients/typos-config.js +9 -0
  696. package/extensions/dm-lens/dist/clients/user-notify.js +15 -0
  697. package/extensions/dm-lens/dist/clients/vanished-instance-marker.js +18 -0
  698. package/extensions/dm-lens/dist/clients/warm-attach.js +210 -0
  699. package/extensions/dm-lens/dist/clients/widget-state.js +997 -0
  700. package/extensions/dm-lens/dist/clients/word-index-logger.js +21 -0
  701. package/extensions/dm-lens/dist/clients/word-index-store.js +222 -0
  702. package/extensions/dm-lens/dist/clients/word-index.js +1494 -0
  703. package/extensions/dm-lens/dist/clients/workspace-topology.js +268 -0
  704. package/extensions/dm-lens/dist/clients/write-ordering-guard.js +28 -0
  705. package/extensions/dm-lens/dist/clients/zizmor-config.js +160 -0
  706. package/extensions/dm-lens/dist/i18n.js +67 -0
  707. package/extensions/dm-lens/dist/index.js +1973 -0
  708. package/extensions/dm-lens/dist/mcp/analyze-cli.js +205 -0
  709. package/extensions/dm-lens/dist/mcp/build-staleness.js +55 -0
  710. package/extensions/dm-lens/dist/mcp/cli.js +96 -0
  711. package/extensions/dm-lens/dist/mcp/server.js +1239 -0
  712. package/extensions/dm-lens/dist/mcp/tool-arguments.js +134 -0
  713. package/extensions/dm-lens/dist/mcp/worker.js +41 -0
  714. package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +375 -0
  715. package/extensions/dm-lens/dist/scripts/lib/skills-predicate.mjs +53 -0
  716. package/extensions/dm-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +51 -0
  717. package/extensions/dm-lens/dist/tools/activate-tools.js +62 -0
  718. package/extensions/dm-lens/dist/tools/ast-grep-outline.js +126 -0
  719. package/extensions/dm-lens/dist/tools/ast-grep-replace.js +227 -0
  720. package/extensions/dm-lens/dist/tools/ast-grep-search.js +687 -0
  721. package/extensions/dm-lens/dist/tools/effective-config.js +59 -0
  722. package/extensions/dm-lens/dist/tools/lens-diagnostic-mark.js +251 -0
  723. package/extensions/dm-lens/dist/tools/lens-diagnostics.js +1518 -0
  724. package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +1198 -0
  725. package/extensions/dm-lens/dist/tools/lsp-navigation.js +1249 -0
  726. package/extensions/dm-lens/dist/tools/lsp-structured-output.js +277 -0
  727. package/extensions/dm-lens/dist/tools/module-report.js +332 -0
  728. package/extensions/dm-lens/dist/tools/project-report.js +72 -0
  729. package/extensions/dm-lens/dist/tools/render-compact.js +272 -0
  730. package/extensions/dm-lens/dist/tools/scan-progress.js +31 -0
  731. package/extensions/dm-lens/dist/tools/shared.js +32 -0
  732. package/extensions/dm-lens/dist/tools/symbol-search.js +133 -0
  733. package/extensions/dm-lens/i18n.js +3 -3
  734. package/extensions/dm-lens/index.js +431 -214
  735. package/extensions/dm-lens/mcp/analyze-cli.js +63 -36
  736. package/extensions/dm-lens/mcp/cli.js +20 -0
  737. package/extensions/dm-lens/mcp/server.js +40 -3
  738. package/extensions/dm-lens/mcp/tool-arguments.js +134 -0
  739. package/extensions/dm-lens/mcp/worker.js +8 -0
  740. package/extensions/dm-lens/package.json +1 -1
  741. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  742. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  743. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  744. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  745. package/extensions/dm-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  746. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  747. package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  748. package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  749. package/extensions/dm-lens/scripts/lib/process-scan.mjs +126 -7
  750. package/extensions/dm-lens/scripts/lib/web-tree-sitter-dir.mjs +6 -0
  751. package/extensions/dm-lens/tools/activate-tools.js +3 -2
  752. package/extensions/dm-lens/tools/ast-grep-outline.js +2 -3
  753. package/extensions/dm-lens/tools/ast-grep-replace.js +6 -5
  754. package/extensions/dm-lens/tools/ast-grep-search.js +2 -2
  755. package/extensions/dm-lens/tools/lens-diagnostic-mark.js +12 -1
  756. package/extensions/dm-lens/tools/lens-diagnostics.js +74 -37
  757. package/extensions/dm-lens/tools/lsp-diagnostics.js +140 -25
  758. package/extensions/dm-lens/tools/lsp-navigation.js +64 -7
  759. package/extensions/dm-lens/tools/module-report.js +6 -6
  760. package/extensions/dm-lens/tools/shared.js +6 -0
  761. package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +1 -1
  762. package/extensions/dm-mcp-adapter/cli.js +265 -23
  763. package/extensions/dm-mcp-adapter/commands.js +83 -17
  764. package/extensions/dm-mcp-adapter/config.js +517 -92
  765. package/extensions/dm-mcp-adapter/direct-tool-surface.js +10 -8
  766. package/extensions/dm-mcp-adapter/direct-tools.js +54 -36
  767. package/extensions/dm-mcp-adapter/dist/abort.js +35 -0
  768. package/extensions/dm-mcp-adapter/dist/agent-dir.js +45 -0
  769. package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +392 -0
  770. package/extensions/dm-mcp-adapter/dist/agent-plugin-provenance.js +26 -0
  771. package/extensions/dm-mcp-adapter/dist/bearer-command-resolver.js +182 -0
  772. package/extensions/dm-mcp-adapter/dist/claude-plugin-loader.js +350 -0
  773. package/extensions/dm-mcp-adapter/dist/config.js +1735 -0
  774. package/extensions/dm-mcp-adapter/dist/consent-manager.js +84 -0
  775. package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +370 -0
  776. package/extensions/dm-mcp-adapter/dist/errors.js +225 -0
  777. package/extensions/dm-mcp-adapter/dist/http-ca.js +75 -0
  778. package/extensions/dm-mcp-adapter/dist/jev-client.js +359 -0
  779. package/extensions/dm-mcp-adapter/dist/jev-contracts.js +1 -0
  780. package/extensions/dm-mcp-adapter/dist/jev-key-store.js +189 -0
  781. package/extensions/dm-mcp-adapter/dist/json-schema-validator.js +70 -0
  782. package/extensions/dm-mcp-adapter/dist/lifecycle.js +387 -0
  783. package/extensions/dm-mcp-adapter/dist/logger.js +115 -0
  784. package/extensions/dm-mcp-adapter/dist/mcp-auth-fetch.js +86 -0
  785. package/extensions/dm-mcp-adapter/dist/mcp-auth-flow.js +956 -0
  786. package/extensions/dm-mcp-adapter/dist/mcp-auth.js +998 -0
  787. package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +182 -0
  788. package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +380 -0
  789. package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +525 -0
  790. package/extensions/dm-mcp-adapter/dist/mcp-probe.js +151 -0
  791. package/extensions/dm-mcp-adapter/dist/mcp-tasks.js +300 -0
  792. package/extensions/dm-mcp-adapter/dist/mcp-trace.js +220 -0
  793. package/extensions/dm-mcp-adapter/dist/metadata-cache.js +323 -0
  794. package/extensions/dm-mcp-adapter/dist/npx-resolver.js +465 -0
  795. package/extensions/dm-mcp-adapter/dist/output-shape.js +312 -0
  796. package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +144 -0
  797. package/extensions/dm-mcp-adapter/dist/project-server-trust.js +186 -0
  798. package/extensions/dm-mcp-adapter/dist/request-headers-command.js +294 -0
  799. package/extensions/dm-mcp-adapter/dist/resource-tools.js +7 -0
  800. package/extensions/dm-mcp-adapter/dist/runtime-owner.js +94 -0
  801. package/extensions/dm-mcp-adapter/dist/sampling-handler.js +213 -0
  802. package/extensions/dm-mcp-adapter/dist/secure-keyring.js +191 -0
  803. package/extensions/dm-mcp-adapter/dist/server-manager.js +1594 -0
  804. package/extensions/dm-mcp-adapter/dist/session-approvals.js +127 -0
  805. package/extensions/dm-mcp-adapter/dist/session-recovery.js +83 -0
  806. package/extensions/dm-mcp-adapter/dist/state.js +1 -0
  807. package/extensions/dm-mcp-adapter/dist/ts-shape.js +157 -0
  808. package/extensions/dm-mcp-adapter/dist/types.js +286 -0
  809. package/extensions/dm-mcp-adapter/dist/ui-app-bridge-helpers.js +36 -0
  810. package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +204 -0
  811. package/extensions/dm-mcp-adapter/dist/ui-stream-types.js +58 -0
  812. package/extensions/dm-mcp-adapter/dist/ui-tool-visibility.js +26 -0
  813. package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +83 -0
  814. package/extensions/dm-mcp-adapter/dist/utils.js +418 -0
  815. package/extensions/dm-mcp-adapter/elicitation-handler.js +67 -2
  816. package/extensions/dm-mcp-adapter/failure-backoff.js +9 -0
  817. package/extensions/dm-mcp-adapter/host-managed.js +400 -0
  818. package/extensions/dm-mcp-adapter/http-ca.js +4 -0
  819. package/extensions/dm-mcp-adapter/index.js +347 -57
  820. package/extensions/dm-mcp-adapter/init.js +92 -44
  821. package/extensions/dm-mcp-adapter/jev-client.js +5 -5
  822. package/extensions/dm-mcp-adapter/jev-key-store.js +15 -2
  823. package/extensions/dm-mcp-adapter/mcp-auth-flow.js +10 -2
  824. package/extensions/dm-mcp-adapter/mcp-auth.js +2 -1
  825. package/extensions/dm-mcp-adapter/mcp-callback-server.js +1 -1
  826. package/extensions/dm-mcp-adapter/mcp-code.js +174 -87
  827. package/extensions/dm-mcp-adapter/mcp-keyring-helper.cjs +1 -1
  828. package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +3 -2
  829. package/extensions/dm-mcp-adapter/mcp-output-guard.js +19 -5
  830. package/extensions/dm-mcp-adapter/mcp-panel.js +59 -12
  831. package/extensions/dm-mcp-adapter/mcp-script-wasm.js +22 -0
  832. package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +227 -111
  833. package/extensions/dm-mcp-adapter/mcp-setup-panel.js +500 -258
  834. package/extensions/dm-mcp-adapter/mcp-status.js +9 -2
  835. package/extensions/dm-mcp-adapter/mcp-trace.js +5 -0
  836. package/extensions/dm-mcp-adapter/metadata-cache.js +68 -11
  837. package/extensions/dm-mcp-adapter/namespace-tools.js +20 -5
  838. package/extensions/dm-mcp-adapter/onboarding-state.js +11 -1
  839. package/extensions/dm-mcp-adapter/output-shape.js +312 -0
  840. package/extensions/dm-mcp-adapter/package-mcp-loader.js +15 -6
  841. package/extensions/dm-mcp-adapter/package.json +6 -15
  842. package/extensions/dm-mcp-adapter/panel-keys.js +13 -0
  843. package/extensions/dm-mcp-adapter/pi-builtin-mcp.js +26 -0
  844. package/extensions/dm-mcp-adapter/pi-signin-import.js +121 -0
  845. package/extensions/dm-mcp-adapter/project-server-trust.js +186 -0
  846. package/extensions/dm-mcp-adapter/prompts.js +80 -7
  847. package/extensions/dm-mcp-adapter/proxy-modes.js +219 -158
  848. package/extensions/dm-mcp-adapter/runtime-protocol.js +342 -0
  849. package/extensions/dm-mcp-adapter/search-ranking.js +8 -6
  850. package/extensions/dm-mcp-adapter/semantic-search.js +5 -4
  851. package/extensions/dm-mcp-adapter/server-manager.js +108 -26
  852. package/extensions/dm-mcp-adapter/session-recovery.js +3 -2
  853. package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +24 -28
  854. package/extensions/dm-mcp-adapter/skills/mcp-scripting/references/jev.md +3 -0
  855. package/extensions/dm-mcp-adapter/test-runner.mjs +1 -1
  856. package/extensions/dm-mcp-adapter/tool-approval.js +17 -7
  857. package/extensions/dm-mcp-adapter/tool-metadata.js +4 -2
  858. package/extensions/dm-mcp-adapter/tool-parameters.js +4 -0
  859. package/extensions/dm-mcp-adapter/tool-result-renderer.js +68 -7
  860. package/extensions/dm-mcp-adapter/ts-shape.js +1 -1
  861. package/extensions/dm-mcp-adapter/ui-server.js +24 -20
  862. package/extensions/dm-mcp-adapter/unix-socket-transport.js +1 -1
  863. package/extensions/dm-mcp-adapter/utils.js +37 -1
  864. package/extensions/dm-ponytail/extensions/ponytail.mjs +37 -17
  865. package/extensions/dm-ponytail/hooks/claude-codex-hooks.json +3 -3
  866. package/extensions/dm-ponytail/hooks/copilot-hooks.json +4 -4
  867. package/extensions/dm-ponytail/hooks/ponytail-activate.js +46 -13
  868. package/extensions/dm-ponytail/hooks/ponytail-config.js +6 -5
  869. package/extensions/dm-ponytail/hooks/ponytail-instructions.js +29 -33
  870. package/extensions/dm-ponytail/hooks/ponytail-map.js +116 -0
  871. package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +26 -13
  872. package/extensions/dm-ponytail/hooks/ponytail-runtime.js +23 -9
  873. package/extensions/dm-ponytail/hooks/ponytail-subagent.js +15 -3
  874. package/extensions/dm-ponytail/hooks/qoder-hooks.json +3 -3
  875. package/extensions/dm-ponytail/package.json +1 -1
  876. package/extensions/dm-ponytail/pi-extension/index.js +37 -17
  877. package/extensions/dm-ponytail/pi-extension/package.json +1 -1
  878. package/extensions/dm-ponytail/skills/plugin.json +5 -0
  879. package/extensions/dm-ponytail/skills/ponytail/SKILL.md +33 -101
  880. package/extensions/dm-ponytail/skills/ponytail-audit/SKILL.md +89 -27
  881. package/extensions/dm-ponytail/skills/ponytail-debt/SKILL.md +13 -12
  882. package/extensions/dm-ponytail/skills/ponytail-gain/SKILL.md +21 -18
  883. package/extensions/dm-ponytail/skills/ponytail-help/SKILL.md +13 -14
  884. package/extensions/dm-ponytail/skills/ponytail-review/SKILL.md +96 -52
  885. package/extensions/dm-subagents/agents/oracle.md +8 -19
  886. package/extensions/dm-subagents/agents/researcher.md +0 -3
  887. package/extensions/dm-subagents/agents/reviewer.md +17 -61
  888. package/extensions/dm-subagents/agents/scout.md +1 -4
  889. package/extensions/dm-subagents/agents/worker.md +8 -25
  890. package/extensions/dm-subagents/index.js +5 -0
  891. package/extensions/dm-subagents/install.mjs +47 -62
  892. package/extensions/dm-subagents/package.json +6 -5
  893. package/extensions/dm-subagents/prompts/council.md +1 -1
  894. package/extensions/dm-subagents/prompts/review-loop.md +1 -1
  895. package/extensions/dm-subagents/skills/council-mode/SKILL.md +1 -1
  896. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +13 -6
  897. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +3 -3
  898. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +79 -78
  899. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +18 -14
  900. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +1 -1
  901. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +46 -49
  902. package/extensions/dm-subagents/src/agents/advertised-agent-prompt.js +18 -32
  903. package/extensions/dm-subagents/src/agents/agent-management.js +7 -2
  904. package/extensions/dm-subagents/src/agents/agent-memory.js +3 -3
  905. package/extensions/dm-subagents/src/agents/agent-scope.js +3 -0
  906. package/extensions/dm-subagents/src/agents/agent-serializer.js +12 -1
  907. package/extensions/dm-subagents/src/agents/agents.js +217 -120
  908. package/extensions/dm-subagents/src/api/inspectors.js +10 -0
  909. package/extensions/dm-subagents/src/api/preflight.js +43 -6
  910. package/extensions/dm-subagents/src/extension/config.js +35 -2
  911. package/extensions/dm-subagents/src/extension/control-notices.js +3 -7
  912. package/extensions/dm-subagents/src/extension/declaration-pinning.js +127 -0
  913. package/extensions/dm-subagents/src/extension/doctor.js +4 -7
  914. package/extensions/dm-subagents/src/extension/fanout-child.js +15 -7
  915. package/extensions/dm-subagents/src/extension/herdr-dm-bridge.js +2 -0
  916. package/extensions/dm-subagents/src/extension/index.js +231 -332
  917. package/extensions/dm-subagents/src/extension/public-execution.js +63 -33
  918. package/extensions/dm-subagents/src/extension/reply-workflow-script.js +65 -0
  919. package/extensions/dm-subagents/src/extension/rpc.js +42 -16
  920. package/extensions/dm-subagents/src/extension/schemas.js +73 -152
  921. package/extensions/dm-subagents/src/extension/subagent-guide.js +92 -7
  922. package/extensions/dm-subagents/src/extension/subagent-options.js +47 -0
  923. package/extensions/dm-subagents/src/extension/tool-activation.js +57 -89
  924. package/extensions/dm-subagents/src/extension/tool-description.js +56 -47
  925. package/extensions/dm-subagents/src/extension/upgrade-notice.js +36 -0
  926. package/extensions/dm-subagents/src/inspectors/actions.js +34 -11
  927. package/extensions/dm-subagents/src/inspectors/plugins.js +71 -2
  928. package/extensions/dm-subagents/src/inspectors/tmux/actions.js +173 -0
  929. package/extensions/dm-subagents/src/inspectors/tmux/client.js +63 -0
  930. package/extensions/dm-subagents/src/inspectors/tmux/plugin.js +14 -0
  931. package/extensions/dm-subagents/src/integrations/herdr-status.js +26 -49
  932. package/extensions/dm-subagents/src/integrations/program-status.js +179 -0
  933. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +77 -4
  934. package/extensions/dm-subagents/src/intercom/result-intercom.js +3 -2
  935. package/extensions/dm-subagents/src/intercom/supervisor-ui.js +2 -152
  936. package/extensions/dm-subagents/src/missions/goal-driver.js +47 -34
  937. package/extensions/dm-subagents/src/missions/store.js +33 -4
  938. package/extensions/dm-subagents/src/profiles/profiles.js +22 -15
  939. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +49 -6
  940. package/extensions/dm-subagents/src/runs/background/async-execution.js +301 -139
  941. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +65 -24
  942. package/extensions/dm-subagents/src/runs/background/async-resume.js +9 -3
  943. package/extensions/dm-subagents/src/runs/background/async-retention.js +40 -15
  944. package/extensions/dm-subagents/src/runs/background/await-async-run.js +68 -0
  945. package/extensions/dm-subagents/src/runs/background/binary-bootstrap.js +2 -1
  946. package/extensions/dm-subagents/src/runs/background/calendar-schedule.js +90 -0
  947. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +11 -8
  948. package/extensions/dm-subagents/src/runs/background/control-channel.js +89 -5
  949. package/extensions/dm-subagents/src/runs/background/fleet-view.js +5 -5
  950. package/extensions/dm-subagents/src/runs/background/notify.js +170 -11
  951. package/extensions/dm-subagents/src/runs/background/pid-namespace.js +17 -0
  952. package/extensions/dm-subagents/src/runs/background/result-files.js +80 -6
  953. package/extensions/dm-subagents/src/runs/background/result-watcher.js +92 -65
  954. package/extensions/dm-subagents/src/runs/background/resume-guidance.js +2 -2
  955. package/extensions/dm-subagents/src/runs/background/run-child-session.js +34 -10
  956. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +8 -6
  957. package/extensions/dm-subagents/src/runs/background/run-status.js +25 -15
  958. package/extensions/dm-subagents/src/runs/background/runner-aliases.js +6 -4
  959. package/extensions/dm-subagents/src/runs/background/runner-child-launch.js +3 -0
  960. package/extensions/dm-subagents/src/runs/background/runner-http-dispatcher.js +2 -1
  961. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +270 -79
  962. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +18 -3
  963. package/extensions/dm-subagents/src/runs/background/subagent-runner-bootstrap.js +4 -1
  964. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +123 -33
  965. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +33 -20
  966. package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +42 -1
  967. package/extensions/dm-subagents/src/runs/background/wait-completions.js +1 -0
  968. package/extensions/dm-subagents/src/runs/background/wait-tool.js +36 -26
  969. package/extensions/dm-subagents/src/runs/background/workflow-terminal-proof.js +39 -26
  970. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +58 -26
  971. package/extensions/dm-subagents/src/runs/foreground/command-action.js +37 -0
  972. package/extensions/dm-subagents/src/runs/foreground/execution.js +132 -32
  973. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +1 -0
  974. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +5 -8
  975. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +683 -325
  976. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +3 -0
  977. package/extensions/dm-subagents/src/runs/shared/child-commands.js +252 -0
  978. package/extensions/dm-subagents/src/runs/shared/child-hooks.js +6 -5
  979. package/extensions/dm-subagents/src/runs/shared/child-launch.js +13 -1
  980. package/extensions/dm-subagents/src/runs/shared/child-session.js +175 -28
  981. package/extensions/dm-subagents/src/runs/shared/child-tool-plan.js +17 -14
  982. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +87 -1
  983. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +11 -85
  984. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +3 -0
  985. package/extensions/dm-subagents/src/runs/shared/effective-system-prompt.js +1 -2
  986. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +57 -6
  987. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +6 -3
  988. package/extensions/dm-subagents/src/runs/shared/herdr-placed-run.js +13 -6
  989. package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +1 -1
  990. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +66 -14
  991. package/extensions/dm-subagents/src/runs/shared/model-resolution-diagnostic.js +25 -5
  992. package/extensions/dm-subagents/src/runs/shared/model-resolution.js +55 -11
  993. package/extensions/dm-subagents/src/runs/shared/model-scope.js +23 -10
  994. package/extensions/dm-subagents/src/runs/shared/nested-events.js +3 -0
  995. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +55 -7
  996. package/extensions/dm-subagents/src/runs/shared/partial-output.js +26 -0
  997. package/extensions/dm-subagents/src/runs/shared/run-history.js +41 -0
  998. package/extensions/dm-subagents/src/runs/shared/runner-launcher.js +21 -0
  999. package/extensions/dm-subagents/src/runs/shared/single-output.js +67 -26
  1000. package/extensions/dm-subagents/src/runs/shared/structured-output.js +24 -7
  1001. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +32 -20
  1002. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +68 -29
  1003. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +1 -1
  1004. package/extensions/dm-subagents/src/runs/shared/workflow-async-child-guidance.js +1 -1
  1005. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-apply.js +169 -0
  1006. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +41 -20
  1007. package/extensions/dm-subagents/src/runs/shared/worktree-lock.js +38 -0
  1008. package/extensions/dm-subagents/src/runs/shared/worktree.js +10 -1
  1009. package/extensions/dm-subagents/src/shared/atomic-json.js +2 -1
  1010. package/extensions/dm-subagents/src/shared/disabled-features.js +101 -0
  1011. package/extensions/dm-subagents/src/shared/dm-declarations.js +14 -0
  1012. package/extensions/dm-subagents/src/shared/dm-safeguards.js +41 -0
  1013. package/extensions/dm-subagents/src/shared/dm-settlement.js +48 -0
  1014. package/extensions/dm-subagents/src/shared/edit-distance.js +23 -0
  1015. package/extensions/dm-subagents/src/shared/extension-context.js +4 -0
  1016. package/extensions/dm-subagents/src/shared/file-lease.js +89 -0
  1017. package/extensions/dm-subagents/src/shared/fork-context.js +0 -1
  1018. package/extensions/dm-subagents/src/shared/formatters.js +1 -6
  1019. package/extensions/dm-subagents/src/shared/model-info.js +23 -0
  1020. package/extensions/dm-subagents/src/shared/package-version.js +12 -0
  1021. package/extensions/dm-subagents/src/shared/parent-wake.js +67 -0
  1022. package/extensions/dm-subagents/src/shared/pruned-fork.js +6 -2
  1023. package/extensions/dm-subagents/src/shared/required-child-extensions.js +35 -5
  1024. package/extensions/dm-subagents/src/shared/runtime-module-path.js +9 -0
  1025. package/extensions/dm-subagents/src/shared/settings-file-lease.js +31 -0
  1026. package/extensions/dm-subagents/src/shared/types.js +3 -1
  1027. package/extensions/dm-subagents/src/shared/utils.js +7 -7
  1028. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +2 -2
  1029. package/extensions/dm-subagents/src/slash/slash-commands.js +25 -15
  1030. package/extensions/dm-subagents/src/slash/subagent-cost.js +38 -7
  1031. package/extensions/dm-subagents/src/slash/subagents-admin.js +1 -1
  1032. package/extensions/dm-subagents/src/tui/dm-mouse-region.js +12 -0
  1033. package/extensions/dm-subagents/src/tui/fleet-status.js +12 -6
  1034. package/extensions/dm-subagents/src/tui/fleet-transcript.js +6 -2
  1035. package/extensions/dm-subagents/src/tui/fleet.js +20 -6
  1036. package/extensions/dm-subagents/src/tui/render.js +126 -72
  1037. package/extensions/dm-subagents/src/tui/running-tone.js +20 -0
  1038. package/extensions/dm-subagents/src/tui/subagent-messages.js +249 -0
  1039. package/extensions/dm-subagents/src/watchdog/diff-tool.js +19 -11
  1040. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +3 -11
  1041. package/extensions/dm-subagents/src/watchdog/register-child.js +2 -2
  1042. package/extensions/dm-subagents/src/watchdog/register-main.js +4 -24
  1043. package/extensions/dm-subagents/src/watchdog/render.js +1 -19
  1044. package/extensions/dm-subagents/src/watchdog/review.js +4 -7
  1045. package/extensions/dm-subagents/src/watchdog/runtime.js +6 -2
  1046. package/extensions/dm-subagents/src/watchdog/settings.js +22 -17
  1047. package/extensions/dm-subagents/src/watchdog/tool-actions.js +2 -2
  1048. package/extensions/dm-subagents/src/watchdog/turn-delta.js +1 -1
  1049. package/extensions/dm-subagents/src/workflows/chat-progress.js +2 -2
  1050. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +116 -45
  1051. package/extensions/dm-subagents/src/workflows/structured-workflow-scripts.js +154 -0
  1052. package/extensions/dm-subagents/src/workflows/workflow-checklist.js +3 -0
  1053. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +7 -4
  1054. package/extensions/dm-subagents/src/workflows/workflow-resources.js +52 -17
  1055. package/extensions/dm-subagents/src/workflows/workflow-reuse.js +87 -0
  1056. package/extensions/dm-subagents/src/workflows/workflow-revival.js +80 -0
  1057. package/extensions/dm-tty/control.js +150 -0
  1058. package/extensions/dm-tty/index.js +122 -0
  1059. package/extensions/dm-tty/package.json +20 -0
  1060. package/extensions/dm-tty/pty.js +213 -0
  1061. package/extensions/dm-tty/pty_bridge.py +266 -0
  1062. package/extensions/dm-tty/server.js +438 -0
  1063. package/extensions/dm-tty/sessions.js +97 -0
  1064. package/extensions/dm-tty/standalone.js +75 -0
  1065. package/extensions/dm-tty/web/client.js +1141 -0
  1066. package/extensions/dm-tty/web/index.html +117 -0
  1067. package/extensions/dm-tty/web/style.css +73 -0
  1068. package/extensions/dm-web-access/brave-rate-limit.js +160 -0
  1069. package/extensions/dm-web-access/brave.js +62 -11
  1070. package/extensions/dm-web-access/ceramic.js +197 -0
  1071. package/extensions/dm-web-access/chrome-cookies.js +69 -21
  1072. package/extensions/dm-web-access/curator-page.js +12 -2
  1073. package/extensions/dm-web-access/curator-server.js +10 -0
  1074. package/extensions/dm-web-access/declared-web-links.js +1 -1
  1075. package/extensions/dm-web-access/degoog.js +288 -0
  1076. package/extensions/dm-web-access/dist/index.js +28404 -0
  1077. package/extensions/dm-web-access/dist/mcp-cli.js +28186 -0
  1078. package/extensions/dm-web-access/duckduckgo.js +6 -3
  1079. package/extensions/dm-web-access/endpoint-pdf-extract.js +210 -0
  1080. package/extensions/dm-web-access/exa.js +17 -35
  1081. package/extensions/dm-web-access/extract.js +63 -10
  1082. package/extensions/dm-web-access/firecrawl.js +30 -4
  1083. package/extensions/dm-web-access/gemini-search.js +117 -37
  1084. package/extensions/dm-web-access/gemini-web.js +7 -7
  1085. package/extensions/dm-web-access/github-extract.js +28 -2
  1086. package/extensions/dm-web-access/github-issue-pr.js +88 -73
  1087. package/extensions/dm-web-access/index.js +230 -1161
  1088. package/extensions/dm-web-access/keenable.js +197 -0
  1089. package/extensions/dm-web-access/mcp-cli.js +30 -0
  1090. package/extensions/dm-web-access/mcp-server.js +51 -0
  1091. package/extensions/dm-web-access/mcp-tool-definitions.js +93 -0
  1092. package/extensions/dm-web-access/openai-search.js +70 -20
  1093. package/extensions/dm-web-access/opencode-session-headers.js +1 -1
  1094. package/extensions/dm-web-access/package.json +4 -1
  1095. package/extensions/dm-web-access/page-query.js +5 -10
  1096. package/extensions/dm-web-access/parallel-mcp.js +2 -1
  1097. package/extensions/dm-web-access/pdf-extract.js +34 -1
  1098. package/extensions/dm-web-access/perplexity.js +68 -51
  1099. package/extensions/dm-web-access/query-rewrite.js +3 -4
  1100. package/extensions/dm-web-access/scripts/build.js +8 -0
  1101. package/extensions/dm-web-access/ssrf-protection.js +10 -8
  1102. package/extensions/dm-web-access/storage.js +79 -76
  1103. package/extensions/dm-web-access/summary-model-scope.js +5 -64
  1104. package/extensions/dm-web-access/summary-review.js +35 -9
  1105. package/extensions/dm-web-access/tavily.js +69 -22
  1106. package/extensions/dm-web-access/tool-activation.js +44 -26
  1107. package/extensions/dm-web-access/tool-arguments.js +21 -0
  1108. package/extensions/dm-web-access/utils.js +17 -7
  1109. package/extensions/dm-web-access/video-extract.js +1 -1
  1110. package/extensions/dm-web-access/web-tool-contract.js +0 -0
  1111. package/extensions/dm-web-access/web-tool-core.js +1312 -0
  1112. package/extensions/dm-web-access/you.js +155 -0
  1113. package/extensions/dm-web-access/youtube-extract.js +2 -2
  1114. package/extensions/dm-web-access/zai.js +159 -0
  1115. package/package.json +13 -9
@@ -1,4 +1,4 @@
1
- import { chmodSync, existsSync, readFileSync, realpathSync, rmSync, statSync, writeFileSync, mkdirSync, renameSync } from "node:fs";
1
+ import { chmodSync, existsSync, lstatSync, readFileSync, realpathSync, rmSync, statSync, writeFileSync, mkdirSync, renameSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
4
  import { parse as parseToml } from "smol-toml";
@@ -10,14 +10,15 @@ import { loadClaudePluginBundles } from "./claude-plugin-loader.js";
10
10
  import { loadPackageMcpConfigs } from "./package-mcp-loader.js";
11
11
  import { validateJevSettings } from "./jev-client.js";
12
12
  import { formatServerNamespace, isServerDisabled } from "./types.js";
13
- import { parseJsonWithComments, toStringRecord } from "./utils.js";
13
+ import { getMissingEnvVars, parseJsonWithComments, providerAuthUrlError, stripUtf8Bom, toStringRecord } from "./utils.js";
14
14
  const GENERIC_GLOBAL_CONFIG_PATH = join(homedir(), ".config", "mcp", "mcp.json");
15
15
  const AGENTS_GLOBAL_CONFIG_PATHS = [
16
16
  join(homedir(), ".agents", "mcp.json"),
17
17
  join(homedir(), ".agents", "mcp", "mcp.json")
18
18
  ];
19
19
  const PROJECT_CONFIG_NAME = ".mcp.json";
20
- const PROJECT_PI_CONFIG_NAME = "mcp.json";
20
+ const PI_MCP_CONFIG_NAME = "mcp.json";
21
+ const ADAPTER_CONFIG_NAME = "mcp-adapter.json";
21
22
  const REPOPROMPT_BINARY_CANDIDATES = [
22
23
  join(homedir(), "RepoPrompt", "repoprompt_cli"),
23
24
  "/Applications/Repo Prompt.app/Contents/MacOS/repoprompt-mcp"
@@ -41,10 +42,22 @@ export const KNOWN_SERVER_PRESETS = [
41
42
  summary: "Search the web and fetch pages without an API key.",
42
43
  entry: {
43
44
  url: "https://search.parallel.ai/mcp",
45
+ headers: { "User-Agent": "dm-mcp-adapter" },
44
46
  protocolVersion: "auto",
45
47
  directTools: true
46
48
  }
47
49
  },
50
+ {
51
+ id: "tavily-search",
52
+ name: "Tavily Search",
53
+ summary: "Search the web and extract page content without an API key.",
54
+ entry: {
55
+ url: "https://mcp.tavily.com/mcp/",
56
+ headers: { "X-Tavily-Access-Mode": "keyless" },
57
+ protocolVersion: "auto",
58
+ directTools: ["tavily_search", "tavily_extract"]
59
+ }
60
+ },
48
61
  {
49
62
  id: "notion",
50
63
  name: "Notion",
@@ -62,6 +75,20 @@ export const KNOWN_SERVER_PRESETS = [
62
75
  name: "Chrome DevTools",
63
76
  summary: "Inspect and automate a local Chrome browser.",
64
77
  entry: { command: "npx", args: ["-y", "chrome-devtools-mcp@1.6.0"] }
78
+ },
79
+ {
80
+ id: "figma",
81
+ name: "Figma (desktop)",
82
+ summary: "Read designs through the Figma desktop app. Needs a Dev or Full seat on a paid Figma plan.",
83
+ entry: { url: "http://127.0.0.1:3845/mcp", protocolVersion: "auto" },
84
+ desktopApp: {
85
+ paths: [
86
+ "/Applications/Figma.app",
87
+ join(homedir(), "Applications", "Figma.app"),
88
+ join(homedir(), "AppData", "Local", "Figma", "Figma.exe")
89
+ ],
90
+ enableSteps: "To enable it, open a Design file in Figma, switch to Dev Mode (Shift+D), and click 'Enable desktop MCP server' in the inspect panel."
91
+ }
65
92
  }
66
93
  ];
67
94
  const IMPORT_PATHS = {
@@ -84,7 +111,13 @@ const IMPORT_PATHS = {
84
111
  vscode: [".vscode/mcp.json"]
85
112
  };
86
113
  export function getPiGlobalConfigPath(overridePath) {
87
- return overridePath ? resolve(overridePath) : getAgentPath("mcp.json");
114
+ return overridePath ? resolve(overridePath) : getAgentPath(ADAPTER_CONFIG_NAME);
115
+ }
116
+ export function getPiMcpGlobalConfigPath() {
117
+ return getAgentPath(PI_MCP_CONFIG_NAME);
118
+ }
119
+ export function getPiMcpAuthPath() {
120
+ return getAgentPath("mcp-auth.json");
88
121
  }
89
122
  export function getGenericGlobalConfigPath() {
90
123
  return GENERIC_GLOBAL_CONFIG_PATH;
@@ -93,7 +126,62 @@ export function getProjectConfigPath(cwd = process.cwd()) {
93
126
  return resolve(cwd, PROJECT_CONFIG_NAME);
94
127
  }
95
128
  export function getProjectPiConfigPath(cwd = process.cwd()) {
96
- return resolve(cwd, getConfigDirName(), PROJECT_PI_CONFIG_NAME);
129
+ return resolve(cwd, getConfigDirName(), ADAPTER_CONFIG_NAME);
130
+ }
131
+ export function getProjectPiMcpConfigPath(cwd = process.cwd()) {
132
+ return resolve(cwd, getConfigDirName(), PI_MCP_CONFIG_NAME);
133
+ }
134
+ let piMcpConfigEnabled = false;
135
+ export function setPiMcpConfigEnabled(enabled) {
136
+ piMcpConfigEnabled = enabled;
137
+ }
138
+ export function isPiMcpConfigEnabled() {
139
+ return piMcpConfigEnabled;
140
+ }
141
+ function legacyMcpConfigHasContent(filePath) {
142
+ if (!existsSync(filePath))
143
+ return false;
144
+ try {
145
+ const raw = parseJsonWithComments(readFileSync(filePath, "utf-8"));
146
+ if (!isRecord(raw))
147
+ return false;
148
+ const hasServers = (value) => isRecord(value) && Object.keys(value).length > 0;
149
+ return hasServers(raw.mcpServers) || hasServers(raw["mcp-servers"]) || raw.settings !== undefined || raw.imports !== undefined || raw.claudePlugins !== undefined;
150
+ } catch {
151
+ return false;
152
+ }
153
+ }
154
+ export function getLegacyMcpMigrationNotices(cwd = process.cwd(), overridePath) {
155
+ if (piMcpConfigEnabled) {
156
+ return getConfigSources(overridePath, cwd).flatMap((source) => {
157
+ const file = isPiMcpSource(source.id) ? readPiMcpConfig(source.readPath) : null;
158
+ if (!file)
159
+ return [];
160
+ const parts = [];
161
+ if (file.adapterKeys.length > 0) {
162
+ const serversHint = file.adapterKeys.includes("mcp-servers") ? `, with "mcp-servers" entries under its "mcpServers" key` : "";
163
+ parts.push(`dm-mcp-adapter does not read ${file.adapterKeys.join(", ")} in this file; move them into ${source.writePath}${serversHint}.`);
164
+ }
165
+ if (file.skipped.length > 0)
166
+ parts.push(`Skipped ${file.skipped.join("; ")}.`);
167
+ if (file.ignoredSettings.size > 0) {
168
+ const ignored = [...file.ignoredSettings].map(([name, settings]) => `"${name}": ${settings.join(", ")}`);
169
+ parts.push(`Ignored settings (details in /mcp-adapter): ${ignored.join("; ")}.`);
170
+ }
171
+ return parts.length > 0 ? [`${source.readPath}: ${parts.join(" ")}`] : [];
172
+ });
173
+ }
174
+ const explicitPath = overridePath ? resolve(overridePath) : undefined;
175
+ const candidates = [
176
+ [getPiMcpGlobalConfigPath(), getPiGlobalConfigPath()],
177
+ [getProjectPiMcpConfigPath(cwd), getProjectPiConfigPath(cwd)]
178
+ ];
179
+ return candidates.flatMap(([source, target]) => {
180
+ if (resolve(source) === explicitPath || !legacyMcpConfigHasContent(source))
181
+ return [];
182
+ const fix = existsSync(target) ? `Merge ${source} into ${target}, then remove ${source}.` : `Move it with: mv ${JSON.stringify(source)} ${JSON.stringify(target)}`;
183
+ return [`dm-mcp-adapter no longer reads ${source}. ${fix}`];
184
+ });
97
185
  }
98
186
  export function getSharedConfigPath(target, cwd = process.cwd()) {
99
187
  return target === "project" ? getProjectConfigPath(cwd) : getGenericGlobalConfigPath();
@@ -119,7 +207,7 @@ export function findAvailableImportConfigs(cwd = process.cwd()) {
119
207
  }
120
208
  function getConfigSourceSummaries(sourceSpecs) {
121
209
  return sourceSpecs.map((source) => {
122
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
210
+ const loaded = readSourceConfig(source.id, source.readPath);
123
211
  return {
124
212
  id: source.id,
125
213
  label: source.label,
@@ -186,7 +274,8 @@ export function getMcpDiscoverySummary(overridePath, cwd = process.cwd(), option
186
274
  return {
187
275
  ...summaryWithoutRepoPrompt,
188
276
  fingerprint,
189
- repoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd)
277
+ repoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd),
278
+ knownServerPresets: KNOWN_SERVER_PRESETS.filter(({ desktopApp }) => !desktopApp || desktopApp.paths.some((path) => existsSync(path)))
190
279
  };
191
280
  }
192
281
  export function cloneMcpConfig(config) {
@@ -198,23 +287,103 @@ export function cloneMcpConfig(config) {
198
287
  }
199
288
  return cloned;
200
289
  }
290
+ export const MCP_CONFIG_SOURCE_METADATA = Symbol.for("dm-mcp-adapter/config-source-metadata");
201
291
  export function loadMcpConfig(overridePath, cwd = process.cwd()) {
292
+ const loaded = loadMcpConfigWithSources(overridePath, cwd);
293
+ Object.defineProperty(loaded.config, MCP_CONFIG_SOURCE_METADATA, {
294
+ value: { projectServers: loaded.projectServers, projectServerPolicy: loaded.projectServerPolicy },
295
+ enumerable: false
296
+ });
297
+ return loaded.config;
298
+ }
299
+ export function loadMcpConfigWithSources(overridePath, cwd = process.cwd()) {
202
300
  const sourceSpecs = getConfigSources(overridePath, cwd);
203
301
  const hostConfigDiscovery = getConfiguredHostConfigDiscovery(overridePath, cwd);
204
- let config = !isExclusiveConfigMode() && hostConfigDiscovery === "on" ? loadDiscoveredHostConfigs(cwd) : { mcpServers: {} };
302
+ const projectServers = new Map;
303
+ let projectServerPolicy = "ask";
304
+ let projectAgentPluginSource;
305
+ let projectClaudePluginSource;
306
+ const discoveredHost = !isExclusiveConfigMode() && hostConfigDiscovery === "on" ? loadDiscoveredHostConfigs(cwd) : { config: { mcpServers: {} }, serverSources: new Map };
307
+ let config = discoveredHost.config;
308
+ for (const [name, source] of discoveredHost.serverSources) {
309
+ if (source.scope === "project")
310
+ projectServers.set(name, { path: source.path });
311
+ }
312
+ const piProjectSource = sourceSpecs.find((source) => source.id === "pi-mcp-project");
313
+ const piProjectNames = Object.keys((piProjectSource && readPiMcpConfig(piProjectSource.readPath))?.mcpServers ?? {});
205
314
  for (const source of sourceSpecs) {
206
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
315
+ const loaded = readSourceConfig(source.id, source.readPath);
207
316
  if (!loaded)
208
317
  continue;
209
- config = mergeConfigs(config, expandImports(loaded, cwd));
318
+ if (source.id === "pi-mcp-global") {
319
+ for (const name of piProjectNames)
320
+ delete loaded.mcpServers[name];
321
+ }
322
+ const expandedImport = expandImports(loaded, cwd);
323
+ const expanded = expandedImport.config;
324
+ const sourceRef = { path: source.readPath };
325
+ if (Object.hasOwn(expanded.settings ?? {}, "agentPluginPaths")) {
326
+ projectAgentPluginSource = source.scope === "project" ? sourceRef : undefined;
327
+ }
328
+ if (expanded.claudePlugins !== undefined) {
329
+ projectClaudePluginSource = source.scope === "project" ? sourceRef : undefined;
330
+ }
331
+ if (source.scope === "project") {
332
+ for (const name of Object.keys(expanded.mcpServers))
333
+ projectServers.set(name, sourceRef);
334
+ if (expanded.settings?.projectServers !== undefined) {
335
+ console.warn(`Ignoring settings.projectServers in project config ${source.readPath}; set it in the user-global MCP config instead`);
336
+ const { projectServers: _ignored, ...settings } = expanded.settings;
337
+ expanded.settings = settings;
338
+ }
339
+ } else if (expanded.settings?.projectServers === "allow" || expanded.settings?.projectServers === "ask") {
340
+ projectServerPolicy = expanded.settings.projectServers;
341
+ }
342
+ for (const [name, importedSource] of expandedImport.serverSources) {
343
+ if (importedSource.scope === "project")
344
+ projectServers.set(name, { path: importedSource.path });
345
+ }
346
+ config = mergeConfigs(config, expanded);
347
+ }
348
+ if (isExclusiveConfigMode()) {
349
+ return { config: stripProjectProviderAuth(resolveConfiguredClaudePluginMcp(config, cwd), projectServers), projectServers, projectServerPolicy };
210
350
  }
211
- if (isExclusiveConfigMode())
212
- return resolveConfiguredClaudePluginMcp(config, cwd);
213
351
  const packageConfig = loadPackageMcpConfigs(cwd);
214
352
  const pluginConfig = loadAgentPluginConfigs(config.settings?.agentPluginPaths, cwd);
353
+ if (projectAgentPluginSource) {
354
+ for (const name of Object.keys(pluginConfig.mcpServers))
355
+ projectServers.set(name, projectAgentPluginSource);
356
+ }
215
357
  const packageServers = Object.fromEntries(Object.entries(packageConfig.mcpServers).filter(([name]) => !Object.hasOwn(pluginConfig.mcpServers, name)));
358
+ for (const name of Object.keys(packageServers)) {
359
+ const source = packageConfig.serverSources.get(name);
360
+ if (source?.scope === "project")
361
+ projectServers.set(name, { path: source.settingsPath });
362
+ }
216
363
  const higherPrecedenceConfig = mergeConfigs({ mcpServers: packageServers }, mergeConfigs(pluginConfig, config));
217
- return mergeClaudePluginMcpDefaults(config.claudePlugins, higherPrecedenceConfig, cwd);
364
+ const claudePluginServers = new Set;
365
+ const mergedConfig = mergeClaudePluginMcpDefaults(config.claudePlugins, higherPrecedenceConfig, cwd, claudePluginServers);
366
+ if (projectClaudePluginSource) {
367
+ for (const name of claudePluginServers)
368
+ projectServers.set(name, projectClaudePluginSource);
369
+ }
370
+ return {
371
+ config: stripProjectProviderAuth(mergedConfig, projectServers),
372
+ projectServers,
373
+ projectServerPolicy
374
+ };
375
+ }
376
+ function stripProjectProviderAuth(config, projectServers) {
377
+ const stripped = [...projectServers.keys()].filter((name) => typeof config.mcpServers[name]?.auth === "object");
378
+ if (stripped.length === 0)
379
+ return config;
380
+ const mcpServers = { ...config.mcpServers };
381
+ for (const name of stripped) {
382
+ delete mcpServers[name];
383
+ projectServers.delete(name);
384
+ }
385
+ console.warn(`Ignoring MCP servers ${stripped.map((name) => `"${name}"`).join(", ")}: auth.provider is only allowed in user-global config, and project config defines or overrides them`);
386
+ return { ...config, mcpServers };
218
387
  }
219
388
  export function resolveConfiguredClaudePluginMcp(config, cwd = process.cwd()) {
220
389
  return mergeClaudePluginMcpDefaults(config.claudePlugins, config, cwd);
@@ -222,7 +391,7 @@ export function resolveConfiguredClaudePluginMcp(config, cwd = process.cwd()) {
222
391
  export function discoverConfiguredClaudePluginSkills(config, cwd = process.cwd()) {
223
392
  return loadClaudePluginBundles(config.claudePlugins, cwd, validateConfig, { mcp: false, skills: true }).skillPaths;
224
393
  }
225
- function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd) {
394
+ function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd, loadedServerNames) {
226
395
  const pluginServers = loadClaudePluginBundles(plugins, cwd, validateConfig, { mcp: true, skills: false }).mcpServers;
227
396
  const higherNamesByNamespace = new Map(Object.keys(higherPrecedenceConfig.mcpServers).map((name) => [formatServerNamespace(name), name]));
228
397
  const defaults = Object.fromEntries(Object.entries(pluginServers).filter(([name]) => {
@@ -232,6 +401,8 @@ function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd) {
232
401
  console.warn(`Claude plugin MCP server "${name}" is shadowed by higher-precedence server "${higherName}" because both normalize to the same namespace`);
233
402
  return false;
234
403
  }));
404
+ for (const name of Object.keys(defaults))
405
+ loadedServerNames?.add(name);
235
406
  return applySettingDefaults(mergeConfigs({ mcpServers: defaults }, higherPrecedenceConfig));
236
407
  }
237
408
  function applySettingDefaults(config) {
@@ -244,7 +415,7 @@ function applySettingDefaults(config) {
244
415
  function getMergedSettings(overridePath, cwd = process.cwd()) {
245
416
  let settings;
246
417
  for (const source of getConfigSources(overridePath, cwd)) {
247
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
418
+ const loaded = readSourceConfig(source.id, source.readPath);
248
419
  if (loaded?.settings)
249
420
  settings = { ...settings, ...loaded.settings };
250
421
  }
@@ -260,15 +431,22 @@ function getConfiguredHostConfigDiscovery(overridePath, cwd = process.cwd()) {
260
431
  }
261
432
  function loadDiscoveredHostConfigs(cwd) {
262
433
  let config = { mcpServers: {} };
434
+ const serverSources = new Map;
263
435
  for (const importKind of Object.keys(IMPORT_PATHS)) {
264
436
  const imported = loadImportedConfig(importKind, cwd, `Failed to discover imported MCP config from ${importKind}:`);
265
437
  if (!imported)
266
438
  continue;
439
+ const servers = extractServers(imported.value, importKind);
267
440
  config = mergeConfigs(config, {
268
- mcpServers: extractServers(imported.value, importKind)
441
+ mcpServers: servers
269
442
  });
443
+ for (const name of Object.keys(servers)) {
444
+ const source = imported.serverSources.get(name);
445
+ if (source?.scope === "project" || !serverSources.has(name))
446
+ serverSources.set(name, source ?? imported.source);
447
+ }
270
448
  }
271
- return config;
449
+ return { config, serverSources };
272
450
  }
273
451
  function getConfigConflicts(sourceSpecs, imports, cwd) {
274
452
  const seen = new Map;
@@ -287,7 +465,7 @@ function getConfigConflicts(sourceSpecs, imports, cwd) {
287
465
  }
288
466
  }
289
467
  for (const source of sourceSpecs) {
290
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
468
+ const loaded = readSourceConfig(source.id, source.readPath);
291
469
  if (!loaded)
292
470
  continue;
293
471
  if (loaded.imports?.length) {
@@ -351,24 +529,39 @@ function getConfigSources(overridePath, cwd = process.cwd()) {
351
529
  scope: "global"
352
530
  });
353
531
  }
532
+ const piMcpGlobalPath = getPiMcpGlobalConfigPath();
533
+ if (piMcpConfigEnabled && piMcpGlobalPath !== userPath && !sources.some((source) => source.readPath === piMcpGlobalPath)) {
534
+ sources.push({
535
+ id: "pi-mcp-global",
536
+ label: "user-global DM MCP",
537
+ readPath: piMcpGlobalPath,
538
+ writePath: userPath,
539
+ kind: "import",
540
+ importKind: "DM mcp.json",
541
+ shared: true,
542
+ scope: "global"
543
+ });
544
+ }
354
545
  sources.push({
355
546
  id: "pi-global",
356
- label: "DM global override",
547
+ label: "MCP adapter global override",
357
548
  readPath: userPath,
358
549
  writePath: userPath,
359
550
  kind: "user",
360
551
  shared: false,
361
552
  scope: "global"
362
553
  });
554
+ const projectPiMcpPath = getProjectPiMcpConfigPath(cwd);
363
555
  const reservedPaths = new Set([
364
556
  ...sources.map((source) => getConfigPathIdentity(source.readPath)),
365
557
  getConfigPathIdentity(projectPath),
366
- getConfigPathIdentity(projectPiPath)
558
+ getConfigPathIdentity(projectPiPath),
559
+ ...piMcpConfigEnabled ? [getConfigPathIdentity(projectPiMcpPath)] : []
367
560
  ]);
368
561
  const ancestorSources = new Map;
369
562
  const descriptors = [
370
563
  { id: "shared-project-ancestor", label: "ancestor standard MCP", path: getProjectConfigPath, shared: true },
371
- { id: "pi-project-ancestor", label: "ancestor DM override", path: getProjectPiConfigPath, shared: false }
564
+ { id: "pi-project-ancestor", label: "ancestor MCP adapter override", path: getProjectPiConfigPath, shared: false }
372
565
  ];
373
566
  const ancestorRoot = getConfiguredAncestorRoot(sources, cwd);
374
567
  if (ancestorRoot) {
@@ -403,10 +596,22 @@ function getConfigSources(overridePath, cwd = process.cwd()) {
403
596
  scope: "project"
404
597
  });
405
598
  }
599
+ if (piMcpConfigEnabled && projectPiMcpPath !== userPath && projectPiMcpPath !== piMcpGlobalPath) {
600
+ sources.push({
601
+ id: "pi-mcp-project",
602
+ label: "project DM MCP",
603
+ readPath: projectPiMcpPath,
604
+ writePath: projectPiPath,
605
+ kind: "import",
606
+ importKind: "DM project mcp.json",
607
+ shared: true,
608
+ scope: "project"
609
+ });
610
+ }
406
611
  if (projectPiPath !== userPath && projectPiPath !== projectPath) {
407
612
  sources.push({
408
613
  id: "pi-project",
409
- label: "project DM override",
614
+ label: "project MCP adapter override",
410
615
  readPath: projectPiPath,
411
616
  writePath: projectPiPath,
412
617
  kind: "project",
@@ -430,7 +635,7 @@ function isWithin(base, target) {
430
635
  function getConfiguredAncestorRoot(globalSources, cwd) {
431
636
  let configured;
432
637
  for (const source of globalSources) {
433
- const roots = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`)?.settings?.ancestorConfigRoots;
638
+ const roots = readSourceConfig(source.id, source.readPath)?.settings?.ancestorConfigRoots;
434
639
  if (roots !== undefined)
435
640
  configured = roots;
436
641
  }
@@ -451,11 +656,12 @@ function getConfiguredAncestorRoot(globalSources, cwd) {
451
656
  }
452
657
  try {
453
658
  const root = realpathSync(expanded);
454
- if (!statSync(root).isDirectory() || !isWithin(home, root) || !isWithin(root, canonicalCwd))
659
+ if (!statSync(root).isDirectory() || !isWithin(home, root))
455
660
  throw new Error;
456
- valid.push(root);
661
+ if (isWithin(root, canonicalCwd))
662
+ valid.push(root);
457
663
  } catch {
458
- console.warn(`Invalid settings.ancestorConfigRoots entry ${JSON.stringify(entry)}: expected an existing directory under HOME containing cwd`);
664
+ console.warn(`Invalid settings.ancestorConfigRoots entry ${JSON.stringify(entry)}: expected an existing directory under HOME`);
459
665
  }
460
666
  }
461
667
  return valid.sort((left, right) => right.length - left.length)[0];
@@ -556,6 +762,8 @@ function mergeServerMaps(base, next) {
556
762
  for (const field of URL_BOUND_AUTH_FIELDS) {
557
763
  delete baseEntry[field];
558
764
  }
765
+ if (typeof baseEntry.auth === "object")
766
+ delete baseEntry.auth;
559
767
  if (baseEntry.oauth !== false) {
560
768
  delete baseEntry.oauth;
561
769
  }
@@ -577,8 +785,9 @@ function mergeImports(left, right) {
577
785
  }
578
786
  function expandImports(config, cwd = process.cwd()) {
579
787
  if (!config.imports?.length)
580
- return config;
788
+ return { config, serverSources: new Map };
581
789
  const importedServers = {};
790
+ const serverSources = new Map;
582
791
  for (const importKind of config.imports) {
583
792
  const imported = loadImportedConfig(importKind, cwd, `Failed to import MCP config from ${importKind}:`);
584
793
  if (!imported)
@@ -587,18 +796,23 @@ function expandImports(config, cwd = process.cwd()) {
587
796
  for (const [name, definition] of Object.entries(servers)) {
588
797
  if (!importedServers[name]) {
589
798
  importedServers[name] = definition;
799
+ serverSources.set(name, imported.serverSources.get(name) ?? imported.source);
590
800
  }
591
801
  }
592
802
  }
593
803
  return {
594
- imports: config.imports,
595
- ...config.settings !== undefined ? { settings: config.settings } : {},
596
- ...config.claudePlugins !== undefined ? { claudePlugins: config.claudePlugins } : {},
597
- mcpServers: mergeServerMaps(importedServers, config.mcpServers)
804
+ config: {
805
+ imports: config.imports,
806
+ ...config.settings !== undefined ? { settings: config.settings } : {},
807
+ ...config.claudePlugins !== undefined ? { claudePlugins: config.claudePlugins } : {},
808
+ mcpServers: mergeServerMaps(importedServers, config.mcpServers)
809
+ },
810
+ serverSources
598
811
  };
599
812
  }
600
813
  function resolveImportCandidates(importKind, cwd) {
601
814
  return (IMPORT_PATHS[importKind] ?? []).map((candidate) => {
815
+ const scope = candidate.startsWith(".") ? "project" : "user";
602
816
  if (importKind === "opencode" && candidate === "./opencode.json") {
603
817
  const start = resolve(cwd);
604
818
  let gitRoot;
@@ -614,27 +828,29 @@ function resolveImportCandidates(importKind, cwd) {
614
828
  current = parent;
615
829
  }
616
830
  if (!gitRoot)
617
- return join(start, "opencode.json");
831
+ return { path: join(start, "opencode.json"), scope };
618
832
  current = start;
619
833
  while (true) {
620
834
  const projectConfig = join(current, "opencode.json");
621
835
  if (existsSync(projectConfig) || current === gitRoot)
622
- return projectConfig;
836
+ return { path: projectConfig, scope };
623
837
  current = dirname(current);
624
838
  }
625
839
  }
626
- return candidate.startsWith(".") ? resolve(cwd, candidate) : candidate;
840
+ return { path: candidate.startsWith(".") ? resolve(cwd, candidate) : candidate, scope };
627
841
  });
628
842
  }
629
843
  function readImportedConfig(path) {
630
844
  const raw = readFileSync(path, "utf-8");
631
- return path.endsWith(".toml") ? parseToml(raw) : parseJsonWithComments(raw);
845
+ return path.endsWith(".toml") ? parseToml(stripUtf8Bom(raw)) : parseJsonWithComments(raw);
632
846
  }
633
847
  function loadImportedConfig(importKind, cwd, warningPrefix) {
634
848
  if (importKind === "opencode") {
635
849
  let merged = {};
636
- let highestPrecedencePath;
637
- for (const path of resolveImportCandidates(importKind, cwd)) {
850
+ let highestPrecedenceSource;
851
+ const serverSources = new Map;
852
+ for (const source of resolveImportCandidates(importKind, cwd)) {
853
+ const { path } = source;
638
854
  if (!existsSync(path))
639
855
  continue;
640
856
  try {
@@ -658,19 +874,40 @@ function loadImportedConfig(importKind, cwd, warningPrefix) {
658
874
  }];
659
875
  }));
660
876
  merged = mergeOpenCodeConfigs(merged, { ...imported, mcp: normalized });
661
- highestPrecedencePath = path;
877
+ for (const name of Object.keys(normalized))
878
+ serverSources.set(name, source);
879
+ highestPrecedenceSource = source;
662
880
  }
663
881
  } catch (error) {
664
882
  console.warn(warningPrefix, error);
665
883
  }
666
884
  }
667
- return highestPrecedencePath ? { path: highestPrecedencePath, value: merged } : null;
885
+ if (!highestPrecedenceSource)
886
+ return null;
887
+ const finalNames = new Set(Object.keys(extractServers(merged, importKind)));
888
+ for (const name of serverSources.keys()) {
889
+ if (!finalNames.has(name))
890
+ serverSources.delete(name);
891
+ }
892
+ return {
893
+ path: highestPrecedenceSource.path,
894
+ value: merged,
895
+ source: highestPrecedenceSource,
896
+ serverSources
897
+ };
668
898
  }
669
- for (const path of resolveImportCandidates(importKind, cwd)) {
899
+ for (const source of resolveImportCandidates(importKind, cwd)) {
900
+ const { path } = source;
670
901
  if (!existsSync(path))
671
902
  continue;
672
903
  try {
673
- return { path, value: readImportedConfig(path) };
904
+ const value = readImportedConfig(path);
905
+ return {
906
+ path,
907
+ value,
908
+ source,
909
+ serverSources: new Map(Object.keys(extractServers(value, importKind)).map((name) => [name, source]))
910
+ };
674
911
  } catch (error) {
675
912
  console.warn(warningPrefix, error);
676
913
  }
@@ -693,6 +930,166 @@ function readValidatedConfig(path, label) {
693
930
  return null;
694
931
  }
695
932
  }
933
+ function isPiMcpSource(id) {
934
+ return id === "pi-mcp-global" || id === "pi-mcp-project";
935
+ }
936
+ function readSourceConfig(id, path) {
937
+ return isPiMcpSource(id) ? readPiMcpConfig(path) : readValidatedConfig(path, `MCP config from ${path}`);
938
+ }
939
+ const PI_MCP_EXPOSURES = ["codemode", "codemode-deferred", "deferred", "direct", "hidden"];
940
+ function readPiMcpConfig(path) {
941
+ if (!existsSync(path))
942
+ return null;
943
+ let raw;
944
+ try {
945
+ const text = readFileSync(path, "utf-8");
946
+ if (stripJsonComments(text, { trailingCommas: true }).trim() === "")
947
+ return null;
948
+ const parsed = parseJsonWithComments(text);
949
+ if (!isRecord(parsed) || parsed.mcpServers !== undefined && !isRecord(parsed.mcpServers)) {
950
+ throw new Error('expected an object with an "mcpServers" object');
951
+ }
952
+ raw = parsed;
953
+ } catch (error) {
954
+ console.warn(`Failed to load DM MCP config from ${path}:`, error);
955
+ return null;
956
+ }
957
+ const file = {
958
+ mcpServers: {},
959
+ adapterKeys: ["settings", "imports", "claudePlugins", "mcp-servers"].filter((key) => raw[key] !== undefined),
960
+ skipped: [],
961
+ ignoredSettings: new Map
962
+ };
963
+ for (const [name, value] of Object.entries(raw.mcpServers ?? {})) {
964
+ const translated = translatePiMcpServer(name, value);
965
+ if (typeof translated === "string") {
966
+ file.skipped.push(`"${name}" (${translated})`);
967
+ continue;
968
+ }
969
+ file.mcpServers[name] = translated.entry;
970
+ if (translated.ignored.length > 0)
971
+ file.ignoredSettings.set(name, translated.ignored);
972
+ }
973
+ return file;
974
+ }
975
+ export function translatePiMcpServer(name, value) {
976
+ if (!/^[A-Za-z0-9_-]+$/.test(name))
977
+ return 'invalid server name (use letters, digits, "_" and "-")';
978
+ if (!isRecord(value))
979
+ return "must be an object";
980
+ const { type, command, args, env, cwd, url, headers, oauth, exposure, toolExposure, enabled, timeout, auth, description, ...unknown } = value;
981
+ const isExposure = (candidate) => typeof candidate === "string" && PI_MCP_EXPOSURES.includes(candidate);
982
+ if (exposure !== undefined && !isExposure(exposure))
983
+ return `exposure must be one of ${PI_MCP_EXPOSURES.join(", ")}`;
984
+ if (toolExposure !== undefined && (!isRecord(toolExposure) || !Object.values(toolExposure).every(isExposure))) {
985
+ return `toolExposure must map tool names to one of ${PI_MCP_EXPOSURES.join(", ")}`;
986
+ }
987
+ if (enabled !== undefined && typeof enabled !== "boolean")
988
+ return "enabled must be a boolean";
989
+ if (timeout !== undefined && (typeof timeout !== "number" || !(timeout > 0)))
990
+ return "timeout must be a positive number of seconds";
991
+ if (description !== undefined && typeof description !== "string")
992
+ return "description must be a string";
993
+ if (type === "sse")
994
+ return "legacy SSE transport is not supported; use the streamable HTTP URL";
995
+ const ignored = Object.keys(unknown);
996
+ let entry;
997
+ let otherTransportKeys;
998
+ if (typeof url === "string" && (type === undefined || type === "http" || type === "streamable-http")) {
999
+ if (!URL.canParse(url) || !/^https?:$/.test(new URL(url).protocol))
1000
+ return "url must be an http or https URL";
1001
+ if (headers !== undefined && !isStringRecord(headers))
1002
+ return "headers must map names to strings";
1003
+ const translatedOAuth = oauth === undefined ? undefined : translatePiOAuth(oauth);
1004
+ if (typeof translatedOAuth === "string")
1005
+ return translatedOAuth;
1006
+ entry = { url, ...headers !== undefined ? { headers } : {}, ...translatedOAuth ? { oauth: translatedOAuth.oauth } : {} };
1007
+ if (auth !== undefined) {
1008
+ if (!isRecord(auth) || typeof auth.provider !== "string" || !auth.provider)
1009
+ return "auth.provider must be a provider name";
1010
+ const urlError = providerAuthUrlError(url);
1011
+ if (urlError)
1012
+ return urlError;
1013
+ entry.auth = { provider: auth.provider };
1014
+ }
1015
+ ignored.push(...translatedOAuth?.ignored ?? []);
1016
+ otherTransportKeys = ["command", "args", "env", "cwd"];
1017
+ } else if (typeof command === "string" && (type === undefined || type === "stdio")) {
1018
+ if (args !== undefined && !(Array.isArray(args) && args.every((arg) => typeof arg === "string")))
1019
+ return "args must be an array of strings";
1020
+ if (env !== undefined && !isStringRecord(env))
1021
+ return "env must map names to strings";
1022
+ if (cwd !== undefined && typeof cwd !== "string")
1023
+ return "cwd must be a string";
1024
+ entry = {
1025
+ command,
1026
+ ...args !== undefined ? { args } : {},
1027
+ ...env !== undefined ? { env } : {},
1028
+ ...cwd !== undefined ? { cwd } : {}
1029
+ };
1030
+ otherTransportKeys = ["url", "headers", "oauth", "auth"];
1031
+ } else {
1032
+ return 'needs either "command" (stdio) or "url" (streamable HTTP)';
1033
+ }
1034
+ ignored.push(...otherTransportKeys.filter((key) => value[key] !== undefined));
1035
+ if (description !== undefined)
1036
+ entry.description = description;
1037
+ const serverExposure = exposure === undefined || exposure === "codemode-deferred" ? "codemode" : exposure;
1038
+ if (enabled === false || serverExposure === "hidden")
1039
+ entry.disabled = true;
1040
+ if (serverExposure === "direct")
1041
+ entry.directTools = true;
1042
+ if (serverExposure === "deferred")
1043
+ entry.directTools = "search";
1044
+ if (timeout !== undefined)
1045
+ entry.requestTimeoutMs = Math.round(timeout * 1000);
1046
+ const directTools = [];
1047
+ const excludeTools = [];
1048
+ for (const [tool, rawValue] of Object.entries(toolExposure ?? {})) {
1049
+ const toolValue = rawValue === "codemode-deferred" ? "codemode" : rawValue;
1050
+ if (toolValue === serverExposure)
1051
+ continue;
1052
+ if (toolValue === "hidden")
1053
+ excludeTools.push(tool);
1054
+ else if (toolValue === "direct" && !tool.includes("*") && serverExposure === "codemode")
1055
+ directTools.push(tool);
1056
+ else
1057
+ ignored.push(`toolExposure ${JSON.stringify(tool)}: ${toolValue}`);
1058
+ }
1059
+ if (directTools.length > 0)
1060
+ entry.directTools = directTools;
1061
+ if (excludeTools.length > 0)
1062
+ entry.excludeTools = excludeTools;
1063
+ return { entry, ignored };
1064
+ }
1065
+ function translatePiOAuth(oauth) {
1066
+ if (!isRecord(oauth))
1067
+ return "oauth must be an object";
1068
+ const { clientId, clientSecret, scope, clientName, callbackPort, callbackUrl, ...unknown } = oauth;
1069
+ const copied = { clientId, clientSecret, scope, clientName };
1070
+ for (const [key, field] of Object.entries(copied)) {
1071
+ if (field !== undefined && (typeof field !== "string" || key === "clientName" && !field.trim())) {
1072
+ return `oauth.${key} must be a ${key === "clientName" ? "non-empty " : ""}string`;
1073
+ }
1074
+ }
1075
+ if (callbackPort !== undefined && (typeof callbackPort !== "number" || !Number.isInteger(callbackPort) || callbackPort < 1 || callbackPort > 65535)) {
1076
+ return "oauth.callbackPort must be a port number";
1077
+ }
1078
+ const result = Object.fromEntries(Object.entries(copied).filter(([, field]) => field !== undefined));
1079
+ if (callbackUrl !== undefined) {
1080
+ const parsed = typeof callbackUrl === "string" && URL.canParse(callbackUrl) ? new URL(callbackUrl) : undefined;
1081
+ if (!parsed || parsed.protocol !== "http:" || !["localhost", "127.0.0.1", "[::1]"].includes(parsed.hostname) || parsed.search !== "" || parsed.hash !== "") {
1082
+ return "oauth.callbackUrl must be an http URI on localhost, 127.0.0.1, or [::1] without query or fragment";
1083
+ }
1084
+ if (parsed.port && callbackPort !== undefined && Number(parsed.port) !== callbackPort) {
1085
+ return "oauth.callbackUrl and oauth.callbackPort name different ports";
1086
+ }
1087
+ result.redirectUri = parsed.port ? callbackUrl : `http://${parsed.hostname}:${callbackPort ?? "{port}"}${parsed.pathname}`;
1088
+ } else if (callbackPort !== undefined) {
1089
+ result.redirectUri = `http://127.0.0.1:${callbackPort}/callback`;
1090
+ }
1091
+ return { oauth: result, ignored: Object.keys(unknown).map((key) => `oauth.${key}`) };
1092
+ }
696
1093
  function validateConfig(raw) {
697
1094
  if (!isRecord(raw)) {
698
1095
  return { mcpServers: {} };
@@ -746,8 +1143,24 @@ function toServerEntries(servers) {
746
1143
  return {};
747
1144
  const entries = {};
748
1145
  for (const [name, entry] of Object.entries(servers)) {
749
- if (isServerEntry(entry))
750
- entries[name] = entry;
1146
+ if (!isServerEntry(entry))
1147
+ continue;
1148
+ const auth = entry.auth;
1149
+ if (typeof auth === "object") {
1150
+ const provider = isRecord(auth) ? auth.provider : undefined;
1151
+ const error = typeof provider !== "string" || !provider ? "auth.provider must be a provider name" : typeof entry.url !== "string" ? "auth.provider requires a url" : getMissingEnvVars(entry.url, {}).length > 0 ? undefined : providerAuthUrlError(entry.url);
1152
+ if (error) {
1153
+ console.warn(`Ignoring MCP server "${name}": ${error}`);
1154
+ continue;
1155
+ }
1156
+ }
1157
+ if (entry.description !== undefined && typeof entry.description !== "string") {
1158
+ console.warn(`Ignoring invalid description for MCP server "${name}": expected a string`);
1159
+ const { description: _description, ...rest } = entry;
1160
+ entries[name] = rest;
1161
+ continue;
1162
+ }
1163
+ entries[name] = entry;
751
1164
  }
752
1165
  return entries;
753
1166
  }
@@ -757,6 +1170,9 @@ function isServerEntry(value) {
757
1170
  function isRecord(value) {
758
1171
  return typeof value === "object" && value !== null && !Array.isArray(value);
759
1172
  }
1173
+ function isStringRecord(value) {
1174
+ return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
1175
+ }
760
1176
  function mergeOpenCodeConfigs(base, next) {
761
1177
  const baseMcp = base.mcp;
762
1178
  const nextMcp = next.mcp;
@@ -908,7 +1324,7 @@ function extractServers(config, kind) {
908
1324
  delete mapped.env_http_headers;
909
1325
  mappedServers[name] = mapped;
910
1326
  }
911
- return mappedServers;
1327
+ return toServerEntries(mappedServers);
912
1328
  }
913
1329
  function serializeRawConfig(raw) {
914
1330
  return `${JSON.stringify(raw, null, 2)}
@@ -971,21 +1387,31 @@ function buildConfigWritePreview(filePath, nextRaw) {
971
1387
  };
972
1388
  }
973
1389
  function readRawConfigObject(filePath) {
974
- if (!existsSync(filePath))
1390
+ if (!lstatSync(filePath, { throwIfNoEntry: false }))
975
1391
  return {};
976
1392
  try {
977
- const raw = parseJsonWithComments(readFileSync(filePath, "utf-8"));
978
- return raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
979
- } catch {
980
- return {};
1393
+ const text = readFileSync(filePath, "utf-8");
1394
+ if (text.trim() === "")
1395
+ return {};
1396
+ const raw = parseJsonWithComments(text);
1397
+ if (!isRecord(raw))
1398
+ throw new Error("top-level value must be an object");
1399
+ return raw;
1400
+ } catch (error) {
1401
+ throw new Error(`Failed to read MCP config at ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
981
1402
  }
982
1403
  }
983
1404
  function writeConfigText(writePath, text) {
1405
+ const originalPath = writePath;
984
1406
  let mode;
985
1407
  try {
986
1408
  writePath = realpathSync(writePath);
987
1409
  mode = statSync(writePath).mode & 511;
988
- } catch {}
1410
+ } catch (error) {
1411
+ if (lstatSync(originalPath, { throwIfNoEntry: false })?.isSymbolicLink()) {
1412
+ throw new Error(`Cannot write MCP config at ${originalPath}: symbolic link target is unavailable`, { cause: error });
1413
+ }
1414
+ }
989
1415
  mkdirSync(dirname(writePath), { recursive: true });
990
1416
  const tmpPath = `${writePath}.${process.pid}.tmp`;
991
1417
  rmSync(tmpPath, { force: true });
@@ -1012,17 +1438,7 @@ export function writeSharedConfigText(filePath, text) {
1012
1438
  }
1013
1439
  export function writeJevSemanticSearchConfig(overridePath, cwd, allowedServers, effectiveJev) {
1014
1440
  const filePath = overridePath ? getPiGlobalConfigPath(overridePath) : getProjectPiConfigPath(cwd);
1015
- let raw = {};
1016
- if (existsSync(filePath)) {
1017
- try {
1018
- const parsed = parseJsonWithComments(readFileSync(filePath, "utf8"));
1019
- if (!isRecord(parsed))
1020
- throw new Error("top-level value must be an object");
1021
- raw = parsed;
1022
- } catch (error) {
1023
- throw new Error(`Failed to update Jev settings at ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
1024
- }
1025
- }
1441
+ const raw = readRawConfigObject(filePath);
1026
1442
  if (raw.settings !== undefined && !isRecord(raw.settings)) {
1027
1443
  throw new Error(`Failed to update Jev settings at ${filePath}: settings must be an object`);
1028
1444
  }
@@ -1041,12 +1457,21 @@ export function writeJevSemanticSearchConfig(overridePath, cwd, allowedServers,
1041
1457
  writeRawConfigObject(filePath, raw);
1042
1458
  return { path: filePath, changed: true };
1043
1459
  }
1044
- function getServersObject(raw) {
1045
- const existing = raw.mcpServers ?? raw["mcp-servers"] ?? {};
1046
- if (!existing || typeof existing !== "object" || Array.isArray(existing)) {
1047
- return {};
1460
+ function getServersObject(raw, filePath) {
1461
+ for (const key of ["mcpServers", "mcp-servers"]) {
1462
+ if (Object.hasOwn(raw, key) && !isRecord(raw[key])) {
1463
+ throw new Error(`Failed to update MCP config at ${filePath}: ${key} must be an object`);
1464
+ }
1465
+ }
1466
+ return raw.mcpServers ?? raw["mcp-servers"] ?? {};
1467
+ }
1468
+ function getConfigImports(raw, filePath) {
1469
+ if (raw.imports === undefined)
1470
+ return [];
1471
+ if (!Array.isArray(raw.imports) || raw.imports.some((value) => typeof value !== "string")) {
1472
+ throw new Error(`Failed to update MCP config at ${filePath}: imports must be an array of strings`);
1048
1473
  }
1049
- return existing;
1474
+ return raw.imports;
1050
1475
  }
1051
1476
  function setServersObject(raw, servers) {
1052
1477
  delete raw["mcp-servers"];
@@ -1054,18 +1479,7 @@ function setServersObject(raw, servers) {
1054
1479
  }
1055
1480
  export function writeProjectServerDisabledOverride(overridePath, cwd, serverName, disabled) {
1056
1481
  const filePath = getProjectPiConfigPath(cwd);
1057
- let raw = {};
1058
- if (existsSync(filePath)) {
1059
- try {
1060
- const parsed = parseJsonWithComments(readFileSync(filePath, "utf-8"));
1061
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
1062
- throw new Error("root value must be an object");
1063
- }
1064
- raw = parsed;
1065
- } catch (error) {
1066
- throw new Error(`Failed to read project MCP override at ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
1067
- }
1068
- }
1482
+ const raw = readRawConfigObject(filePath);
1069
1483
  const serverKey = raw.mcpServers !== undefined ? "mcpServers" : raw["mcp-servers"] !== undefined ? "mcp-servers" : "mcpServers";
1070
1484
  const rawServers = raw[serverKey];
1071
1485
  if (rawServers !== undefined && (!rawServers || typeof rawServers !== "object" || Array.isArray(rawServers))) {
@@ -1086,15 +1500,15 @@ export function writeProjectServerDisabledOverride(overridePath, cwd, serverName
1086
1500
  for (const source of getConfigSources(overridePath, cwd)) {
1087
1501
  if (source.readPath === filePath)
1088
1502
  continue;
1089
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
1503
+ const loaded = readSourceConfig(source.id, source.readPath);
1090
1504
  if (loaded)
1091
- lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd));
1505
+ lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd).config);
1092
1506
  }
1093
1507
  if (raw.imports !== undefined) {
1094
1508
  if (!Array.isArray(raw.imports) || raw.imports.some((kind) => typeof kind !== "string" || !Object.hasOwn(IMPORT_PATHS, kind))) {
1095
1509
  throw new Error(`Failed to update project MCP override at ${filePath}: imports contains an unsupported config kind`);
1096
1510
  }
1097
- lowerConfig = mergeConfigs(lowerConfig, expandImports({ mcpServers: {}, imports: raw.imports }, cwd));
1511
+ lowerConfig = mergeConfigs(lowerConfig, expandImports({ mcpServers: {}, imports: raw.imports }, cwd).config);
1098
1512
  }
1099
1513
  if (isServerDisabled(lowerConfig.mcpServers[serverName]))
1100
1514
  next.disabled = false;
@@ -1144,7 +1558,7 @@ function detectRepoPrompt(summary, cwd = process.cwd()) {
1144
1558
  for (const source of summary.sources) {
1145
1559
  if (source.kind !== "shared" || source.serverCount === 0)
1146
1560
  continue;
1147
- const config = readValidatedConfig(source.path, `MCP config from ${source.path}`);
1561
+ const config = readSourceConfig(source.id, source.path);
1148
1562
  if (!config)
1149
1563
  continue;
1150
1564
  for (const [name, entry] of Object.entries(config.mcpServers)) {
@@ -1170,23 +1584,23 @@ function detectRepoPrompt(summary, cwd = process.cwd()) {
1170
1584
  export function previewCompatibilityImports(importKinds, overridePath) {
1171
1585
  const targetPath = getPiGlobalConfigPath(overridePath);
1172
1586
  const raw = readRawConfigObject(targetPath);
1173
- const currentImports = Array.isArray(raw.imports) ? raw.imports.filter((value) => typeof value === "string") : [];
1587
+ const currentImports = getConfigImports(raw, targetPath);
1174
1588
  const merged = [...new Set([...currentImports, ...importKinds])];
1175
1589
  const nextRaw = { ...raw, imports: merged };
1176
- setServersObject(nextRaw, getServersObject(nextRaw));
1590
+ setServersObject(nextRaw, getServersObject(nextRaw, targetPath));
1177
1591
  return buildConfigWritePreview(targetPath, nextRaw);
1178
1592
  }
1179
1593
  export function ensureCompatibilityImports(importKinds, overridePath) {
1180
1594
  const targetPath = getPiGlobalConfigPath(overridePath);
1181
1595
  const raw = readRawConfigObject(targetPath);
1182
- const currentImports = Array.isArray(raw.imports) ? raw.imports.filter((value) => typeof value === "string") : [];
1596
+ const currentImports = getConfigImports(raw, targetPath);
1183
1597
  const merged = [...new Set([...currentImports, ...importKinds])];
1184
1598
  const added = merged.filter((kind) => !currentImports.includes(kind));
1185
1599
  if (added.length === 0) {
1186
1600
  return { path: targetPath, added: [] };
1187
1601
  }
1188
1602
  raw.imports = merged;
1189
- const servers = getServersObject(raw);
1603
+ const servers = getServersObject(raw, targetPath);
1190
1604
  setServersObject(raw, servers);
1191
1605
  writeRawConfigObject(targetPath, raw);
1192
1606
  return { path: targetPath, added };
@@ -1196,13 +1610,19 @@ export function buildStarterProjectConfig() {
1196
1610
  mcpServers: {}
1197
1611
  };
1198
1612
  }
1613
+ function assertScaffoldTargetAbsent(filePath) {
1614
+ if (lstatSync(filePath, { throwIfNoEntry: false }))
1615
+ throw new Error(`Cannot scaffold MCP config at ${filePath}: file already exists`);
1616
+ }
1199
1617
  export function previewStarterSharedConfig(target, cwd = process.cwd()) {
1200
1618
  const targetPath = getSharedConfigPath(target, cwd);
1619
+ assertScaffoldTargetAbsent(targetPath);
1201
1620
  const nextRaw = { mcpServers: buildStarterProjectConfig().mcpServers };
1202
1621
  return buildConfigWritePreview(targetPath, nextRaw);
1203
1622
  }
1204
1623
  export function writeStarterSharedConfig(target, cwd = process.cwd()) {
1205
1624
  const targetPath = getSharedConfigPath(target, cwd);
1625
+ assertScaffoldTargetAbsent(targetPath);
1206
1626
  const raw = { mcpServers: buildStarterProjectConfig().mcpServers };
1207
1627
  writeRawConfigObject(targetPath, raw);
1208
1628
  return targetPath;
@@ -1216,14 +1636,14 @@ export function writeStarterProjectConfig(cwd = process.cwd()) {
1216
1636
  export function previewSharedServerEntry(filePath, serverName, entry) {
1217
1637
  const raw = readRawConfigObject(filePath);
1218
1638
  const nextRaw = { ...raw };
1219
- const servers = getServersObject(nextRaw);
1639
+ const servers = getServersObject(nextRaw, filePath);
1220
1640
  servers[serverName] = entry;
1221
1641
  setServersObject(nextRaw, servers);
1222
1642
  return buildConfigWritePreview(filePath, nextRaw);
1223
1643
  }
1224
1644
  export function writeSharedServerEntry(filePath, serverName, entry) {
1225
1645
  const raw = readRawConfigObject(filePath);
1226
- const servers = getServersObject(raw);
1646
+ const servers = getServersObject(raw, filePath);
1227
1647
  servers[serverName] = entry;
1228
1648
  setServersObject(raw, servers);
1229
1649
  writeRawConfigObject(filePath, raw);
@@ -1243,7 +1663,7 @@ export function getServerProvenance(overridePath, cwd = process.cwd()) {
1243
1663
  }
1244
1664
  }
1245
1665
  for (const source of getConfigSources(overridePath, cwd)) {
1246
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
1666
+ const loaded = readSourceConfig(source.id, source.readPath);
1247
1667
  if (!loaded)
1248
1668
  continue;
1249
1669
  if (loaded.imports?.length) {
@@ -1260,16 +1680,18 @@ export function getServerProvenance(overridePath, cwd = process.cwd()) {
1260
1680
  }
1261
1681
  }
1262
1682
  for (const name of Object.keys(loaded.mcpServers)) {
1683
+ const ignoredSettings = loaded.ignoredSettings ? loaded.ignoredSettings.get(name) : provenance.get(name)?.ignoredSettings;
1263
1684
  provenance.set(name, {
1264
1685
  path: source.writePath,
1265
1686
  kind: source.kind,
1266
- ...source.importKind !== undefined ? { importKind: source.importKind } : {}
1687
+ ...source.importKind !== undefined ? { importKind: source.importKind } : {},
1688
+ ...ignoredSettings !== undefined ? { ignoredSettings } : {}
1267
1689
  });
1268
1690
  }
1269
1691
  }
1270
1692
  return provenance;
1271
1693
  }
1272
- export function writeDirectToolsConfig(changes, provenance, fullConfig) {
1694
+ export function writeDirectToolsConfig(changes, provenance, fullConfig, onFileWritten) {
1273
1695
  const byPath = new Map;
1274
1696
  for (const [serverName, value] of changes) {
1275
1697
  const prov = provenance.get(serverName);
@@ -1280,9 +1702,11 @@ export function writeDirectToolsConfig(changes, provenance, fullConfig) {
1280
1702
  byPath.set(targetPath, []);
1281
1703
  byPath.get(targetPath).push({ name: serverName, value, prov });
1282
1704
  }
1705
+ for (const filePath of byPath.keys())
1706
+ getServersObject(readRawConfigObject(filePath), filePath);
1283
1707
  for (const [filePath, entries] of byPath) {
1284
1708
  const raw = readRawConfigObject(filePath);
1285
- const servers = getServersObject(raw);
1709
+ const servers = getServersObject(raw, filePath);
1286
1710
  for (const { name, value, prov } of entries) {
1287
1711
  if (prov.kind === "import") {
1288
1712
  const fullDef = fullConfig.mcpServers[name];
@@ -1295,6 +1719,7 @@ export function writeDirectToolsConfig(changes, provenance, fullConfig) {
1295
1719
  }
1296
1720
  setServersObject(raw, servers);
1297
1721
  writeRawConfigObject(filePath, raw);
1722
+ onFileWritten?.();
1298
1723
  }
1299
1724
  }
1300
1725
  export function resolveConfiguredOAuthDir(raw, cwd = process.cwd()) {