@duckmind/dm-darwin-x64 0.66.5 → 0.66.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +541 -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 +4 -2
  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 -5
  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 +183 -34
  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 +2 -2
  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 +3 -3
  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 +1143 -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,86 @@ 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
+ function migrateLegacyMcpConfig(source, target) {
155
+ if (!existsSync(source) || existsSync(target))
156
+ return;
157
+ try {
158
+ const sourceStat = lstatSync(source);
159
+ if (!sourceStat.isFile())
160
+ return;
161
+ const raw = readFileSync(source, "utf-8");
162
+ const parsed = parseJsonWithComments(raw);
163
+ if (!isRecord(parsed))
164
+ return;
165
+ mkdirSync(dirname(target), { recursive: true, mode: 448 });
166
+ const temporary = `${target}.tmp-${process.pid}-${Date.now()}`;
167
+ writeFileSync(temporary, raw, { encoding: "utf-8", mode: sourceStat.mode & 511 });
168
+ renameSync(temporary, target);
169
+ rmSync(source);
170
+ return `Migrated ${source} to ${target}.`;
171
+ } catch {
172
+ return;
173
+ }
174
+ }
175
+ export function getLegacyMcpMigrationNotices(cwd = process.cwd(), overridePath) {
176
+ if (piMcpConfigEnabled) {
177
+ return getConfigSources(overridePath, cwd).flatMap((source) => {
178
+ const file = isPiMcpSource(source.id) ? readPiMcpConfig(source.readPath) : null;
179
+ if (!file)
180
+ return [];
181
+ const parts = [];
182
+ if (file.adapterKeys.length > 0) {
183
+ const serversHint = file.adapterKeys.includes("mcp-servers") ? `, with "mcp-servers" entries under its "mcpServers" key` : "";
184
+ parts.push(`dm-mcp-adapter does not read ${file.adapterKeys.join(", ")} in this file; move them into ${source.writePath}${serversHint}.`);
185
+ }
186
+ if (file.skipped.length > 0)
187
+ parts.push(`Skipped ${file.skipped.join("; ")}.`);
188
+ if (file.ignoredSettings.size > 0) {
189
+ const ignored = [...file.ignoredSettings].map(([name, settings]) => `"${name}": ${settings.join(", ")}`);
190
+ parts.push(`Ignored settings (details in /mcp-adapter): ${ignored.join("; ")}.`);
191
+ }
192
+ return parts.length > 0 ? [`${source.readPath}: ${parts.join(" ")}`] : [];
193
+ });
194
+ }
195
+ const explicitPath = overridePath ? resolve(overridePath) : undefined;
196
+ const candidates = [
197
+ [getPiMcpGlobalConfigPath(), getPiGlobalConfigPath()],
198
+ [getProjectPiMcpConfigPath(cwd), getProjectPiConfigPath(cwd)]
199
+ ];
200
+ return candidates.flatMap(([source, target]) => {
201
+ if (resolve(source) === explicitPath || !legacyMcpConfigHasContent(source))
202
+ return [];
203
+ const migrated = migrateLegacyMcpConfig(source, target);
204
+ if (migrated)
205
+ return [migrated];
206
+ const fix = existsSync(target) ? `Merge ${source} into ${target}, then remove ${source}.` : `Move it with: mv ${JSON.stringify(source)} ${JSON.stringify(target)}`;
207
+ return [`dm-mcp-adapter no longer reads ${source}. ${fix}`];
208
+ });
97
209
  }
98
210
  export function getSharedConfigPath(target, cwd = process.cwd()) {
99
211
  return target === "project" ? getProjectConfigPath(cwd) : getGenericGlobalConfigPath();
@@ -119,7 +231,7 @@ export function findAvailableImportConfigs(cwd = process.cwd()) {
119
231
  }
120
232
  function getConfigSourceSummaries(sourceSpecs) {
121
233
  return sourceSpecs.map((source) => {
122
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
234
+ const loaded = readSourceConfig(source.id, source.readPath);
123
235
  return {
124
236
  id: source.id,
125
237
  label: source.label,
@@ -186,7 +298,8 @@ export function getMcpDiscoverySummary(overridePath, cwd = process.cwd(), option
186
298
  return {
187
299
  ...summaryWithoutRepoPrompt,
188
300
  fingerprint,
189
- repoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd)
301
+ repoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd),
302
+ knownServerPresets: KNOWN_SERVER_PRESETS.filter(({ desktopApp }) => !desktopApp || desktopApp.paths.some((path) => existsSync(path)))
190
303
  };
191
304
  }
192
305
  export function cloneMcpConfig(config) {
@@ -198,23 +311,103 @@ export function cloneMcpConfig(config) {
198
311
  }
199
312
  return cloned;
200
313
  }
314
+ export const MCP_CONFIG_SOURCE_METADATA = Symbol.for("dm-mcp-adapter/config-source-metadata");
201
315
  export function loadMcpConfig(overridePath, cwd = process.cwd()) {
316
+ const loaded = loadMcpConfigWithSources(overridePath, cwd);
317
+ Object.defineProperty(loaded.config, MCP_CONFIG_SOURCE_METADATA, {
318
+ value: { projectServers: loaded.projectServers, projectServerPolicy: loaded.projectServerPolicy },
319
+ enumerable: false
320
+ });
321
+ return loaded.config;
322
+ }
323
+ export function loadMcpConfigWithSources(overridePath, cwd = process.cwd()) {
202
324
  const sourceSpecs = getConfigSources(overridePath, cwd);
203
325
  const hostConfigDiscovery = getConfiguredHostConfigDiscovery(overridePath, cwd);
204
- let config = !isExclusiveConfigMode() && hostConfigDiscovery === "on" ? loadDiscoveredHostConfigs(cwd) : { mcpServers: {} };
326
+ const projectServers = new Map;
327
+ let projectServerPolicy = "ask";
328
+ let projectAgentPluginSource;
329
+ let projectClaudePluginSource;
330
+ const discoveredHost = !isExclusiveConfigMode() && hostConfigDiscovery === "on" ? loadDiscoveredHostConfigs(cwd) : { config: { mcpServers: {} }, serverSources: new Map };
331
+ let config = discoveredHost.config;
332
+ for (const [name, source] of discoveredHost.serverSources) {
333
+ if (source.scope === "project")
334
+ projectServers.set(name, { path: source.path });
335
+ }
336
+ const piProjectSource = sourceSpecs.find((source) => source.id === "pi-mcp-project");
337
+ const piProjectNames = Object.keys((piProjectSource && readPiMcpConfig(piProjectSource.readPath))?.mcpServers ?? {});
205
338
  for (const source of sourceSpecs) {
206
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
339
+ const loaded = readSourceConfig(source.id, source.readPath);
207
340
  if (!loaded)
208
341
  continue;
209
- config = mergeConfigs(config, expandImports(loaded, cwd));
342
+ if (source.id === "pi-mcp-global") {
343
+ for (const name of piProjectNames)
344
+ delete loaded.mcpServers[name];
345
+ }
346
+ const expandedImport = expandImports(loaded, cwd);
347
+ const expanded = expandedImport.config;
348
+ const sourceRef = { path: source.readPath };
349
+ if (Object.hasOwn(expanded.settings ?? {}, "agentPluginPaths")) {
350
+ projectAgentPluginSource = source.scope === "project" ? sourceRef : undefined;
351
+ }
352
+ if (expanded.claudePlugins !== undefined) {
353
+ projectClaudePluginSource = source.scope === "project" ? sourceRef : undefined;
354
+ }
355
+ if (source.scope === "project") {
356
+ for (const name of Object.keys(expanded.mcpServers))
357
+ projectServers.set(name, sourceRef);
358
+ if (expanded.settings?.projectServers !== undefined) {
359
+ console.warn(`Ignoring settings.projectServers in project config ${source.readPath}; set it in the user-global MCP config instead`);
360
+ const { projectServers: _ignored, ...settings } = expanded.settings;
361
+ expanded.settings = settings;
362
+ }
363
+ } else if (expanded.settings?.projectServers === "allow" || expanded.settings?.projectServers === "ask") {
364
+ projectServerPolicy = expanded.settings.projectServers;
365
+ }
366
+ for (const [name, importedSource] of expandedImport.serverSources) {
367
+ if (importedSource.scope === "project")
368
+ projectServers.set(name, { path: importedSource.path });
369
+ }
370
+ config = mergeConfigs(config, expanded);
371
+ }
372
+ if (isExclusiveConfigMode()) {
373
+ return { config: stripProjectProviderAuth(resolveConfiguredClaudePluginMcp(config, cwd), projectServers), projectServers, projectServerPolicy };
210
374
  }
211
- if (isExclusiveConfigMode())
212
- return resolveConfiguredClaudePluginMcp(config, cwd);
213
375
  const packageConfig = loadPackageMcpConfigs(cwd);
214
376
  const pluginConfig = loadAgentPluginConfigs(config.settings?.agentPluginPaths, cwd);
377
+ if (projectAgentPluginSource) {
378
+ for (const name of Object.keys(pluginConfig.mcpServers))
379
+ projectServers.set(name, projectAgentPluginSource);
380
+ }
215
381
  const packageServers = Object.fromEntries(Object.entries(packageConfig.mcpServers).filter(([name]) => !Object.hasOwn(pluginConfig.mcpServers, name)));
382
+ for (const name of Object.keys(packageServers)) {
383
+ const source = packageConfig.serverSources.get(name);
384
+ if (source?.scope === "project")
385
+ projectServers.set(name, { path: source.settingsPath });
386
+ }
216
387
  const higherPrecedenceConfig = mergeConfigs({ mcpServers: packageServers }, mergeConfigs(pluginConfig, config));
217
- return mergeClaudePluginMcpDefaults(config.claudePlugins, higherPrecedenceConfig, cwd);
388
+ const claudePluginServers = new Set;
389
+ const mergedConfig = mergeClaudePluginMcpDefaults(config.claudePlugins, higherPrecedenceConfig, cwd, claudePluginServers);
390
+ if (projectClaudePluginSource) {
391
+ for (const name of claudePluginServers)
392
+ projectServers.set(name, projectClaudePluginSource);
393
+ }
394
+ return {
395
+ config: stripProjectProviderAuth(mergedConfig, projectServers),
396
+ projectServers,
397
+ projectServerPolicy
398
+ };
399
+ }
400
+ function stripProjectProviderAuth(config, projectServers) {
401
+ const stripped = [...projectServers.keys()].filter((name) => typeof config.mcpServers[name]?.auth === "object");
402
+ if (stripped.length === 0)
403
+ return config;
404
+ const mcpServers = { ...config.mcpServers };
405
+ for (const name of stripped) {
406
+ delete mcpServers[name];
407
+ projectServers.delete(name);
408
+ }
409
+ 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`);
410
+ return { ...config, mcpServers };
218
411
  }
219
412
  export function resolveConfiguredClaudePluginMcp(config, cwd = process.cwd()) {
220
413
  return mergeClaudePluginMcpDefaults(config.claudePlugins, config, cwd);
@@ -222,7 +415,7 @@ export function resolveConfiguredClaudePluginMcp(config, cwd = process.cwd()) {
222
415
  export function discoverConfiguredClaudePluginSkills(config, cwd = process.cwd()) {
223
416
  return loadClaudePluginBundles(config.claudePlugins, cwd, validateConfig, { mcp: false, skills: true }).skillPaths;
224
417
  }
225
- function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd) {
418
+ function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd, loadedServerNames) {
226
419
  const pluginServers = loadClaudePluginBundles(plugins, cwd, validateConfig, { mcp: true, skills: false }).mcpServers;
227
420
  const higherNamesByNamespace = new Map(Object.keys(higherPrecedenceConfig.mcpServers).map((name) => [formatServerNamespace(name), name]));
228
421
  const defaults = Object.fromEntries(Object.entries(pluginServers).filter(([name]) => {
@@ -232,6 +425,8 @@ function mergeClaudePluginMcpDefaults(plugins, higherPrecedenceConfig, cwd) {
232
425
  console.warn(`Claude plugin MCP server "${name}" is shadowed by higher-precedence server "${higherName}" because both normalize to the same namespace`);
233
426
  return false;
234
427
  }));
428
+ for (const name of Object.keys(defaults))
429
+ loadedServerNames?.add(name);
235
430
  return applySettingDefaults(mergeConfigs({ mcpServers: defaults }, higherPrecedenceConfig));
236
431
  }
237
432
  function applySettingDefaults(config) {
@@ -244,7 +439,7 @@ function applySettingDefaults(config) {
244
439
  function getMergedSettings(overridePath, cwd = process.cwd()) {
245
440
  let settings;
246
441
  for (const source of getConfigSources(overridePath, cwd)) {
247
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
442
+ const loaded = readSourceConfig(source.id, source.readPath);
248
443
  if (loaded?.settings)
249
444
  settings = { ...settings, ...loaded.settings };
250
445
  }
@@ -260,15 +455,22 @@ function getConfiguredHostConfigDiscovery(overridePath, cwd = process.cwd()) {
260
455
  }
261
456
  function loadDiscoveredHostConfigs(cwd) {
262
457
  let config = { mcpServers: {} };
458
+ const serverSources = new Map;
263
459
  for (const importKind of Object.keys(IMPORT_PATHS)) {
264
460
  const imported = loadImportedConfig(importKind, cwd, `Failed to discover imported MCP config from ${importKind}:`);
265
461
  if (!imported)
266
462
  continue;
463
+ const servers = extractServers(imported.value, importKind);
267
464
  config = mergeConfigs(config, {
268
- mcpServers: extractServers(imported.value, importKind)
465
+ mcpServers: servers
269
466
  });
467
+ for (const name of Object.keys(servers)) {
468
+ const source = imported.serverSources.get(name);
469
+ if (source?.scope === "project" || !serverSources.has(name))
470
+ serverSources.set(name, source ?? imported.source);
471
+ }
270
472
  }
271
- return config;
473
+ return { config, serverSources };
272
474
  }
273
475
  function getConfigConflicts(sourceSpecs, imports, cwd) {
274
476
  const seen = new Map;
@@ -287,7 +489,7 @@ function getConfigConflicts(sourceSpecs, imports, cwd) {
287
489
  }
288
490
  }
289
491
  for (const source of sourceSpecs) {
290
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
492
+ const loaded = readSourceConfig(source.id, source.readPath);
291
493
  if (!loaded)
292
494
  continue;
293
495
  if (loaded.imports?.length) {
@@ -351,24 +553,39 @@ function getConfigSources(overridePath, cwd = process.cwd()) {
351
553
  scope: "global"
352
554
  });
353
555
  }
556
+ const piMcpGlobalPath = getPiMcpGlobalConfigPath();
557
+ if (piMcpConfigEnabled && piMcpGlobalPath !== userPath && !sources.some((source) => source.readPath === piMcpGlobalPath)) {
558
+ sources.push({
559
+ id: "pi-mcp-global",
560
+ label: "user-global DM MCP",
561
+ readPath: piMcpGlobalPath,
562
+ writePath: userPath,
563
+ kind: "import",
564
+ importKind: "DM mcp.json",
565
+ shared: true,
566
+ scope: "global"
567
+ });
568
+ }
354
569
  sources.push({
355
570
  id: "pi-global",
356
- label: "DM global override",
571
+ label: "MCP adapter global override",
357
572
  readPath: userPath,
358
573
  writePath: userPath,
359
574
  kind: "user",
360
575
  shared: false,
361
576
  scope: "global"
362
577
  });
578
+ const projectPiMcpPath = getProjectPiMcpConfigPath(cwd);
363
579
  const reservedPaths = new Set([
364
580
  ...sources.map((source) => getConfigPathIdentity(source.readPath)),
365
581
  getConfigPathIdentity(projectPath),
366
- getConfigPathIdentity(projectPiPath)
582
+ getConfigPathIdentity(projectPiPath),
583
+ ...piMcpConfigEnabled ? [getConfigPathIdentity(projectPiMcpPath)] : []
367
584
  ]);
368
585
  const ancestorSources = new Map;
369
586
  const descriptors = [
370
587
  { 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 }
588
+ { id: "pi-project-ancestor", label: "ancestor MCP adapter override", path: getProjectPiConfigPath, shared: false }
372
589
  ];
373
590
  const ancestorRoot = getConfiguredAncestorRoot(sources, cwd);
374
591
  if (ancestorRoot) {
@@ -403,10 +620,22 @@ function getConfigSources(overridePath, cwd = process.cwd()) {
403
620
  scope: "project"
404
621
  });
405
622
  }
623
+ if (piMcpConfigEnabled && projectPiMcpPath !== userPath && projectPiMcpPath !== piMcpGlobalPath) {
624
+ sources.push({
625
+ id: "pi-mcp-project",
626
+ label: "project DM MCP",
627
+ readPath: projectPiMcpPath,
628
+ writePath: projectPiPath,
629
+ kind: "import",
630
+ importKind: "DM project mcp.json",
631
+ shared: true,
632
+ scope: "project"
633
+ });
634
+ }
406
635
  if (projectPiPath !== userPath && projectPiPath !== projectPath) {
407
636
  sources.push({
408
637
  id: "pi-project",
409
- label: "project DM override",
638
+ label: "project MCP adapter override",
410
639
  readPath: projectPiPath,
411
640
  writePath: projectPiPath,
412
641
  kind: "project",
@@ -430,7 +659,7 @@ function isWithin(base, target) {
430
659
  function getConfiguredAncestorRoot(globalSources, cwd) {
431
660
  let configured;
432
661
  for (const source of globalSources) {
433
- const roots = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`)?.settings?.ancestorConfigRoots;
662
+ const roots = readSourceConfig(source.id, source.readPath)?.settings?.ancestorConfigRoots;
434
663
  if (roots !== undefined)
435
664
  configured = roots;
436
665
  }
@@ -451,11 +680,12 @@ function getConfiguredAncestorRoot(globalSources, cwd) {
451
680
  }
452
681
  try {
453
682
  const root = realpathSync(expanded);
454
- if (!statSync(root).isDirectory() || !isWithin(home, root) || !isWithin(root, canonicalCwd))
683
+ if (!statSync(root).isDirectory() || !isWithin(home, root))
455
684
  throw new Error;
456
- valid.push(root);
685
+ if (isWithin(root, canonicalCwd))
686
+ valid.push(root);
457
687
  } catch {
458
- console.warn(`Invalid settings.ancestorConfigRoots entry ${JSON.stringify(entry)}: expected an existing directory under HOME containing cwd`);
688
+ console.warn(`Invalid settings.ancestorConfigRoots entry ${JSON.stringify(entry)}: expected an existing directory under HOME`);
459
689
  }
460
690
  }
461
691
  return valid.sort((left, right) => right.length - left.length)[0];
@@ -556,6 +786,8 @@ function mergeServerMaps(base, next) {
556
786
  for (const field of URL_BOUND_AUTH_FIELDS) {
557
787
  delete baseEntry[field];
558
788
  }
789
+ if (typeof baseEntry.auth === "object")
790
+ delete baseEntry.auth;
559
791
  if (baseEntry.oauth !== false) {
560
792
  delete baseEntry.oauth;
561
793
  }
@@ -577,8 +809,9 @@ function mergeImports(left, right) {
577
809
  }
578
810
  function expandImports(config, cwd = process.cwd()) {
579
811
  if (!config.imports?.length)
580
- return config;
812
+ return { config, serverSources: new Map };
581
813
  const importedServers = {};
814
+ const serverSources = new Map;
582
815
  for (const importKind of config.imports) {
583
816
  const imported = loadImportedConfig(importKind, cwd, `Failed to import MCP config from ${importKind}:`);
584
817
  if (!imported)
@@ -587,18 +820,23 @@ function expandImports(config, cwd = process.cwd()) {
587
820
  for (const [name, definition] of Object.entries(servers)) {
588
821
  if (!importedServers[name]) {
589
822
  importedServers[name] = definition;
823
+ serverSources.set(name, imported.serverSources.get(name) ?? imported.source);
590
824
  }
591
825
  }
592
826
  }
593
827
  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)
828
+ config: {
829
+ imports: config.imports,
830
+ ...config.settings !== undefined ? { settings: config.settings } : {},
831
+ ...config.claudePlugins !== undefined ? { claudePlugins: config.claudePlugins } : {},
832
+ mcpServers: mergeServerMaps(importedServers, config.mcpServers)
833
+ },
834
+ serverSources
598
835
  };
599
836
  }
600
837
  function resolveImportCandidates(importKind, cwd) {
601
838
  return (IMPORT_PATHS[importKind] ?? []).map((candidate) => {
839
+ const scope = candidate.startsWith(".") ? "project" : "user";
602
840
  if (importKind === "opencode" && candidate === "./opencode.json") {
603
841
  const start = resolve(cwd);
604
842
  let gitRoot;
@@ -614,27 +852,29 @@ function resolveImportCandidates(importKind, cwd) {
614
852
  current = parent;
615
853
  }
616
854
  if (!gitRoot)
617
- return join(start, "opencode.json");
855
+ return { path: join(start, "opencode.json"), scope };
618
856
  current = start;
619
857
  while (true) {
620
858
  const projectConfig = join(current, "opencode.json");
621
859
  if (existsSync(projectConfig) || current === gitRoot)
622
- return projectConfig;
860
+ return { path: projectConfig, scope };
623
861
  current = dirname(current);
624
862
  }
625
863
  }
626
- return candidate.startsWith(".") ? resolve(cwd, candidate) : candidate;
864
+ return { path: candidate.startsWith(".") ? resolve(cwd, candidate) : candidate, scope };
627
865
  });
628
866
  }
629
867
  function readImportedConfig(path) {
630
868
  const raw = readFileSync(path, "utf-8");
631
- return path.endsWith(".toml") ? parseToml(raw) : parseJsonWithComments(raw);
869
+ return path.endsWith(".toml") ? parseToml(stripUtf8Bom(raw)) : parseJsonWithComments(raw);
632
870
  }
633
871
  function loadImportedConfig(importKind, cwd, warningPrefix) {
634
872
  if (importKind === "opencode") {
635
873
  let merged = {};
636
- let highestPrecedencePath;
637
- for (const path of resolveImportCandidates(importKind, cwd)) {
874
+ let highestPrecedenceSource;
875
+ const serverSources = new Map;
876
+ for (const source of resolveImportCandidates(importKind, cwd)) {
877
+ const { path } = source;
638
878
  if (!existsSync(path))
639
879
  continue;
640
880
  try {
@@ -658,19 +898,40 @@ function loadImportedConfig(importKind, cwd, warningPrefix) {
658
898
  }];
659
899
  }));
660
900
  merged = mergeOpenCodeConfigs(merged, { ...imported, mcp: normalized });
661
- highestPrecedencePath = path;
901
+ for (const name of Object.keys(normalized))
902
+ serverSources.set(name, source);
903
+ highestPrecedenceSource = source;
662
904
  }
663
905
  } catch (error) {
664
906
  console.warn(warningPrefix, error);
665
907
  }
666
908
  }
667
- return highestPrecedencePath ? { path: highestPrecedencePath, value: merged } : null;
909
+ if (!highestPrecedenceSource)
910
+ return null;
911
+ const finalNames = new Set(Object.keys(extractServers(merged, importKind)));
912
+ for (const name of serverSources.keys()) {
913
+ if (!finalNames.has(name))
914
+ serverSources.delete(name);
915
+ }
916
+ return {
917
+ path: highestPrecedenceSource.path,
918
+ value: merged,
919
+ source: highestPrecedenceSource,
920
+ serverSources
921
+ };
668
922
  }
669
- for (const path of resolveImportCandidates(importKind, cwd)) {
923
+ for (const source of resolveImportCandidates(importKind, cwd)) {
924
+ const { path } = source;
670
925
  if (!existsSync(path))
671
926
  continue;
672
927
  try {
673
- return { path, value: readImportedConfig(path) };
928
+ const value = readImportedConfig(path);
929
+ return {
930
+ path,
931
+ value,
932
+ source,
933
+ serverSources: new Map(Object.keys(extractServers(value, importKind)).map((name) => [name, source]))
934
+ };
674
935
  } catch (error) {
675
936
  console.warn(warningPrefix, error);
676
937
  }
@@ -693,6 +954,166 @@ function readValidatedConfig(path, label) {
693
954
  return null;
694
955
  }
695
956
  }
957
+ function isPiMcpSource(id) {
958
+ return id === "pi-mcp-global" || id === "pi-mcp-project";
959
+ }
960
+ function readSourceConfig(id, path) {
961
+ return isPiMcpSource(id) ? readPiMcpConfig(path) : readValidatedConfig(path, `MCP config from ${path}`);
962
+ }
963
+ const PI_MCP_EXPOSURES = ["codemode", "codemode-deferred", "deferred", "direct", "hidden"];
964
+ function readPiMcpConfig(path) {
965
+ if (!existsSync(path))
966
+ return null;
967
+ let raw;
968
+ try {
969
+ const text = readFileSync(path, "utf-8");
970
+ if (stripJsonComments(text, { trailingCommas: true }).trim() === "")
971
+ return null;
972
+ const parsed = parseJsonWithComments(text);
973
+ if (!isRecord(parsed) || parsed.mcpServers !== undefined && !isRecord(parsed.mcpServers)) {
974
+ throw new Error('expected an object with an "mcpServers" object');
975
+ }
976
+ raw = parsed;
977
+ } catch (error) {
978
+ console.warn(`Failed to load DM MCP config from ${path}:`, error);
979
+ return null;
980
+ }
981
+ const file = {
982
+ mcpServers: {},
983
+ adapterKeys: ["settings", "imports", "claudePlugins", "mcp-servers"].filter((key) => raw[key] !== undefined),
984
+ skipped: [],
985
+ ignoredSettings: new Map
986
+ };
987
+ for (const [name, value] of Object.entries(raw.mcpServers ?? {})) {
988
+ const translated = translatePiMcpServer(name, value);
989
+ if (typeof translated === "string") {
990
+ file.skipped.push(`"${name}" (${translated})`);
991
+ continue;
992
+ }
993
+ file.mcpServers[name] = translated.entry;
994
+ if (translated.ignored.length > 0)
995
+ file.ignoredSettings.set(name, translated.ignored);
996
+ }
997
+ return file;
998
+ }
999
+ export function translatePiMcpServer(name, value) {
1000
+ if (!/^[A-Za-z0-9_-]+$/.test(name))
1001
+ return 'invalid server name (use letters, digits, "_" and "-")';
1002
+ if (!isRecord(value))
1003
+ return "must be an object";
1004
+ const { type, command, args, env, cwd, url, headers, oauth, exposure, toolExposure, enabled, timeout, auth, description, ...unknown } = value;
1005
+ const isExposure = (candidate) => typeof candidate === "string" && PI_MCP_EXPOSURES.includes(candidate);
1006
+ if (exposure !== undefined && !isExposure(exposure))
1007
+ return `exposure must be one of ${PI_MCP_EXPOSURES.join(", ")}`;
1008
+ if (toolExposure !== undefined && (!isRecord(toolExposure) || !Object.values(toolExposure).every(isExposure))) {
1009
+ return `toolExposure must map tool names to one of ${PI_MCP_EXPOSURES.join(", ")}`;
1010
+ }
1011
+ if (enabled !== undefined && typeof enabled !== "boolean")
1012
+ return "enabled must be a boolean";
1013
+ if (timeout !== undefined && (typeof timeout !== "number" || !(timeout > 0)))
1014
+ return "timeout must be a positive number of seconds";
1015
+ if (description !== undefined && typeof description !== "string")
1016
+ return "description must be a string";
1017
+ if (type === "sse")
1018
+ return "legacy SSE transport is not supported; use the streamable HTTP URL";
1019
+ const ignored = Object.keys(unknown);
1020
+ let entry;
1021
+ let otherTransportKeys;
1022
+ if (typeof url === "string" && (type === undefined || type === "http" || type === "streamable-http")) {
1023
+ if (!URL.canParse(url) || !/^https?:$/.test(new URL(url).protocol))
1024
+ return "url must be an http or https URL";
1025
+ if (headers !== undefined && !isStringRecord(headers))
1026
+ return "headers must map names to strings";
1027
+ const translatedOAuth = oauth === undefined ? undefined : translatePiOAuth(oauth);
1028
+ if (typeof translatedOAuth === "string")
1029
+ return translatedOAuth;
1030
+ entry = { url, ...headers !== undefined ? { headers } : {}, ...translatedOAuth ? { oauth: translatedOAuth.oauth } : {} };
1031
+ if (auth !== undefined) {
1032
+ if (!isRecord(auth) || typeof auth.provider !== "string" || !auth.provider)
1033
+ return "auth.provider must be a provider name";
1034
+ const urlError = providerAuthUrlError(url);
1035
+ if (urlError)
1036
+ return urlError;
1037
+ entry.auth = { provider: auth.provider };
1038
+ }
1039
+ ignored.push(...translatedOAuth?.ignored ?? []);
1040
+ otherTransportKeys = ["command", "args", "env", "cwd"];
1041
+ } else if (typeof command === "string" && (type === undefined || type === "stdio")) {
1042
+ if (args !== undefined && !(Array.isArray(args) && args.every((arg) => typeof arg === "string")))
1043
+ return "args must be an array of strings";
1044
+ if (env !== undefined && !isStringRecord(env))
1045
+ return "env must map names to strings";
1046
+ if (cwd !== undefined && typeof cwd !== "string")
1047
+ return "cwd must be a string";
1048
+ entry = {
1049
+ command,
1050
+ ...args !== undefined ? { args } : {},
1051
+ ...env !== undefined ? { env } : {},
1052
+ ...cwd !== undefined ? { cwd } : {}
1053
+ };
1054
+ otherTransportKeys = ["url", "headers", "oauth", "auth"];
1055
+ } else {
1056
+ return 'needs either "command" (stdio) or "url" (streamable HTTP)';
1057
+ }
1058
+ ignored.push(...otherTransportKeys.filter((key) => value[key] !== undefined));
1059
+ if (description !== undefined)
1060
+ entry.description = description;
1061
+ const serverExposure = exposure === undefined || exposure === "codemode-deferred" ? "codemode" : exposure;
1062
+ if (enabled === false || serverExposure === "hidden")
1063
+ entry.disabled = true;
1064
+ if (serverExposure === "direct")
1065
+ entry.directTools = true;
1066
+ if (serverExposure === "deferred")
1067
+ entry.directTools = "search";
1068
+ if (timeout !== undefined)
1069
+ entry.requestTimeoutMs = Math.round(timeout * 1000);
1070
+ const directTools = [];
1071
+ const excludeTools = [];
1072
+ for (const [tool, rawValue] of Object.entries(toolExposure ?? {})) {
1073
+ const toolValue = rawValue === "codemode-deferred" ? "codemode" : rawValue;
1074
+ if (toolValue === serverExposure)
1075
+ continue;
1076
+ if (toolValue === "hidden")
1077
+ excludeTools.push(tool);
1078
+ else if (toolValue === "direct" && !tool.includes("*") && serverExposure === "codemode")
1079
+ directTools.push(tool);
1080
+ else
1081
+ ignored.push(`toolExposure ${JSON.stringify(tool)}: ${toolValue}`);
1082
+ }
1083
+ if (directTools.length > 0)
1084
+ entry.directTools = directTools;
1085
+ if (excludeTools.length > 0)
1086
+ entry.excludeTools = excludeTools;
1087
+ return { entry, ignored };
1088
+ }
1089
+ function translatePiOAuth(oauth) {
1090
+ if (!isRecord(oauth))
1091
+ return "oauth must be an object";
1092
+ const { clientId, clientSecret, scope, clientName, callbackPort, callbackUrl, ...unknown } = oauth;
1093
+ const copied = { clientId, clientSecret, scope, clientName };
1094
+ for (const [key, field] of Object.entries(copied)) {
1095
+ if (field !== undefined && (typeof field !== "string" || key === "clientName" && !field.trim())) {
1096
+ return `oauth.${key} must be a ${key === "clientName" ? "non-empty " : ""}string`;
1097
+ }
1098
+ }
1099
+ if (callbackPort !== undefined && (typeof callbackPort !== "number" || !Number.isInteger(callbackPort) || callbackPort < 1 || callbackPort > 65535)) {
1100
+ return "oauth.callbackPort must be a port number";
1101
+ }
1102
+ const result = Object.fromEntries(Object.entries(copied).filter(([, field]) => field !== undefined));
1103
+ if (callbackUrl !== undefined) {
1104
+ const parsed = typeof callbackUrl === "string" && URL.canParse(callbackUrl) ? new URL(callbackUrl) : undefined;
1105
+ if (!parsed || parsed.protocol !== "http:" || !["localhost", "127.0.0.1", "[::1]"].includes(parsed.hostname) || parsed.search !== "" || parsed.hash !== "") {
1106
+ return "oauth.callbackUrl must be an http URI on localhost, 127.0.0.1, or [::1] without query or fragment";
1107
+ }
1108
+ if (parsed.port && callbackPort !== undefined && Number(parsed.port) !== callbackPort) {
1109
+ return "oauth.callbackUrl and oauth.callbackPort name different ports";
1110
+ }
1111
+ result.redirectUri = parsed.port ? callbackUrl : `http://${parsed.hostname}:${callbackPort ?? "{port}"}${parsed.pathname}`;
1112
+ } else if (callbackPort !== undefined) {
1113
+ result.redirectUri = `http://127.0.0.1:${callbackPort}/callback`;
1114
+ }
1115
+ return { oauth: result, ignored: Object.keys(unknown).map((key) => `oauth.${key}`) };
1116
+ }
696
1117
  function validateConfig(raw) {
697
1118
  if (!isRecord(raw)) {
698
1119
  return { mcpServers: {} };
@@ -746,8 +1167,24 @@ function toServerEntries(servers) {
746
1167
  return {};
747
1168
  const entries = {};
748
1169
  for (const [name, entry] of Object.entries(servers)) {
749
- if (isServerEntry(entry))
750
- entries[name] = entry;
1170
+ if (!isServerEntry(entry))
1171
+ continue;
1172
+ const auth = entry.auth;
1173
+ if (typeof auth === "object") {
1174
+ const provider = isRecord(auth) ? auth.provider : undefined;
1175
+ 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);
1176
+ if (error) {
1177
+ console.warn(`Ignoring MCP server "${name}": ${error}`);
1178
+ continue;
1179
+ }
1180
+ }
1181
+ if (entry.description !== undefined && typeof entry.description !== "string") {
1182
+ console.warn(`Ignoring invalid description for MCP server "${name}": expected a string`);
1183
+ const { description: _description, ...rest } = entry;
1184
+ entries[name] = rest;
1185
+ continue;
1186
+ }
1187
+ entries[name] = entry;
751
1188
  }
752
1189
  return entries;
753
1190
  }
@@ -757,6 +1194,9 @@ function isServerEntry(value) {
757
1194
  function isRecord(value) {
758
1195
  return typeof value === "object" && value !== null && !Array.isArray(value);
759
1196
  }
1197
+ function isStringRecord(value) {
1198
+ return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
1199
+ }
760
1200
  function mergeOpenCodeConfigs(base, next) {
761
1201
  const baseMcp = base.mcp;
762
1202
  const nextMcp = next.mcp;
@@ -908,7 +1348,7 @@ function extractServers(config, kind) {
908
1348
  delete mapped.env_http_headers;
909
1349
  mappedServers[name] = mapped;
910
1350
  }
911
- return mappedServers;
1351
+ return toServerEntries(mappedServers);
912
1352
  }
913
1353
  function serializeRawConfig(raw) {
914
1354
  return `${JSON.stringify(raw, null, 2)}
@@ -971,21 +1411,31 @@ function buildConfigWritePreview(filePath, nextRaw) {
971
1411
  };
972
1412
  }
973
1413
  function readRawConfigObject(filePath) {
974
- if (!existsSync(filePath))
1414
+ if (!lstatSync(filePath, { throwIfNoEntry: false }))
975
1415
  return {};
976
1416
  try {
977
- const raw = parseJsonWithComments(readFileSync(filePath, "utf-8"));
978
- return raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
979
- } catch {
980
- return {};
1417
+ const text = readFileSync(filePath, "utf-8");
1418
+ if (text.trim() === "")
1419
+ return {};
1420
+ const raw = parseJsonWithComments(text);
1421
+ if (!isRecord(raw))
1422
+ throw new Error("top-level value must be an object");
1423
+ return raw;
1424
+ } catch (error) {
1425
+ throw new Error(`Failed to read MCP config at ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
981
1426
  }
982
1427
  }
983
1428
  function writeConfigText(writePath, text) {
1429
+ const originalPath = writePath;
984
1430
  let mode;
985
1431
  try {
986
1432
  writePath = realpathSync(writePath);
987
1433
  mode = statSync(writePath).mode & 511;
988
- } catch {}
1434
+ } catch (error) {
1435
+ if (lstatSync(originalPath, { throwIfNoEntry: false })?.isSymbolicLink()) {
1436
+ throw new Error(`Cannot write MCP config at ${originalPath}: symbolic link target is unavailable`, { cause: error });
1437
+ }
1438
+ }
989
1439
  mkdirSync(dirname(writePath), { recursive: true });
990
1440
  const tmpPath = `${writePath}.${process.pid}.tmp`;
991
1441
  rmSync(tmpPath, { force: true });
@@ -1012,17 +1462,7 @@ export function writeSharedConfigText(filePath, text) {
1012
1462
  }
1013
1463
  export function writeJevSemanticSearchConfig(overridePath, cwd, allowedServers, effectiveJev) {
1014
1464
  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
- }
1465
+ const raw = readRawConfigObject(filePath);
1026
1466
  if (raw.settings !== undefined && !isRecord(raw.settings)) {
1027
1467
  throw new Error(`Failed to update Jev settings at ${filePath}: settings must be an object`);
1028
1468
  }
@@ -1041,12 +1481,21 @@ export function writeJevSemanticSearchConfig(overridePath, cwd, allowedServers,
1041
1481
  writeRawConfigObject(filePath, raw);
1042
1482
  return { path: filePath, changed: true };
1043
1483
  }
1044
- function getServersObject(raw) {
1045
- const existing = raw.mcpServers ?? raw["mcp-servers"] ?? {};
1046
- if (!existing || typeof existing !== "object" || Array.isArray(existing)) {
1047
- return {};
1484
+ function getServersObject(raw, filePath) {
1485
+ for (const key of ["mcpServers", "mcp-servers"]) {
1486
+ if (Object.hasOwn(raw, key) && !isRecord(raw[key])) {
1487
+ throw new Error(`Failed to update MCP config at ${filePath}: ${key} must be an object`);
1488
+ }
1048
1489
  }
1049
- return existing;
1490
+ return raw.mcpServers ?? raw["mcp-servers"] ?? {};
1491
+ }
1492
+ function getConfigImports(raw, filePath) {
1493
+ if (raw.imports === undefined)
1494
+ return [];
1495
+ if (!Array.isArray(raw.imports) || raw.imports.some((value) => typeof value !== "string")) {
1496
+ throw new Error(`Failed to update MCP config at ${filePath}: imports must be an array of strings`);
1497
+ }
1498
+ return raw.imports;
1050
1499
  }
1051
1500
  function setServersObject(raw, servers) {
1052
1501
  delete raw["mcp-servers"];
@@ -1054,18 +1503,7 @@ function setServersObject(raw, servers) {
1054
1503
  }
1055
1504
  export function writeProjectServerDisabledOverride(overridePath, cwd, serverName, disabled) {
1056
1505
  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
- }
1506
+ const raw = readRawConfigObject(filePath);
1069
1507
  const serverKey = raw.mcpServers !== undefined ? "mcpServers" : raw["mcp-servers"] !== undefined ? "mcp-servers" : "mcpServers";
1070
1508
  const rawServers = raw[serverKey];
1071
1509
  if (rawServers !== undefined && (!rawServers || typeof rawServers !== "object" || Array.isArray(rawServers))) {
@@ -1086,15 +1524,15 @@ export function writeProjectServerDisabledOverride(overridePath, cwd, serverName
1086
1524
  for (const source of getConfigSources(overridePath, cwd)) {
1087
1525
  if (source.readPath === filePath)
1088
1526
  continue;
1089
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
1527
+ const loaded = readSourceConfig(source.id, source.readPath);
1090
1528
  if (loaded)
1091
- lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd));
1529
+ lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd).config);
1092
1530
  }
1093
1531
  if (raw.imports !== undefined) {
1094
1532
  if (!Array.isArray(raw.imports) || raw.imports.some((kind) => typeof kind !== "string" || !Object.hasOwn(IMPORT_PATHS, kind))) {
1095
1533
  throw new Error(`Failed to update project MCP override at ${filePath}: imports contains an unsupported config kind`);
1096
1534
  }
1097
- lowerConfig = mergeConfigs(lowerConfig, expandImports({ mcpServers: {}, imports: raw.imports }, cwd));
1535
+ lowerConfig = mergeConfigs(lowerConfig, expandImports({ mcpServers: {}, imports: raw.imports }, cwd).config);
1098
1536
  }
1099
1537
  if (isServerDisabled(lowerConfig.mcpServers[serverName]))
1100
1538
  next.disabled = false;
@@ -1144,7 +1582,7 @@ function detectRepoPrompt(summary, cwd = process.cwd()) {
1144
1582
  for (const source of summary.sources) {
1145
1583
  if (source.kind !== "shared" || source.serverCount === 0)
1146
1584
  continue;
1147
- const config = readValidatedConfig(source.path, `MCP config from ${source.path}`);
1585
+ const config = readSourceConfig(source.id, source.path);
1148
1586
  if (!config)
1149
1587
  continue;
1150
1588
  for (const [name, entry] of Object.entries(config.mcpServers)) {
@@ -1170,23 +1608,23 @@ function detectRepoPrompt(summary, cwd = process.cwd()) {
1170
1608
  export function previewCompatibilityImports(importKinds, overridePath) {
1171
1609
  const targetPath = getPiGlobalConfigPath(overridePath);
1172
1610
  const raw = readRawConfigObject(targetPath);
1173
- const currentImports = Array.isArray(raw.imports) ? raw.imports.filter((value) => typeof value === "string") : [];
1611
+ const currentImports = getConfigImports(raw, targetPath);
1174
1612
  const merged = [...new Set([...currentImports, ...importKinds])];
1175
1613
  const nextRaw = { ...raw, imports: merged };
1176
- setServersObject(nextRaw, getServersObject(nextRaw));
1614
+ setServersObject(nextRaw, getServersObject(nextRaw, targetPath));
1177
1615
  return buildConfigWritePreview(targetPath, nextRaw);
1178
1616
  }
1179
1617
  export function ensureCompatibilityImports(importKinds, overridePath) {
1180
1618
  const targetPath = getPiGlobalConfigPath(overridePath);
1181
1619
  const raw = readRawConfigObject(targetPath);
1182
- const currentImports = Array.isArray(raw.imports) ? raw.imports.filter((value) => typeof value === "string") : [];
1620
+ const currentImports = getConfigImports(raw, targetPath);
1183
1621
  const merged = [...new Set([...currentImports, ...importKinds])];
1184
1622
  const added = merged.filter((kind) => !currentImports.includes(kind));
1185
1623
  if (added.length === 0) {
1186
1624
  return { path: targetPath, added: [] };
1187
1625
  }
1188
1626
  raw.imports = merged;
1189
- const servers = getServersObject(raw);
1627
+ const servers = getServersObject(raw, targetPath);
1190
1628
  setServersObject(raw, servers);
1191
1629
  writeRawConfigObject(targetPath, raw);
1192
1630
  return { path: targetPath, added };
@@ -1196,13 +1634,19 @@ export function buildStarterProjectConfig() {
1196
1634
  mcpServers: {}
1197
1635
  };
1198
1636
  }
1637
+ function assertScaffoldTargetAbsent(filePath) {
1638
+ if (lstatSync(filePath, { throwIfNoEntry: false }))
1639
+ throw new Error(`Cannot scaffold MCP config at ${filePath}: file already exists`);
1640
+ }
1199
1641
  export function previewStarterSharedConfig(target, cwd = process.cwd()) {
1200
1642
  const targetPath = getSharedConfigPath(target, cwd);
1643
+ assertScaffoldTargetAbsent(targetPath);
1201
1644
  const nextRaw = { mcpServers: buildStarterProjectConfig().mcpServers };
1202
1645
  return buildConfigWritePreview(targetPath, nextRaw);
1203
1646
  }
1204
1647
  export function writeStarterSharedConfig(target, cwd = process.cwd()) {
1205
1648
  const targetPath = getSharedConfigPath(target, cwd);
1649
+ assertScaffoldTargetAbsent(targetPath);
1206
1650
  const raw = { mcpServers: buildStarterProjectConfig().mcpServers };
1207
1651
  writeRawConfigObject(targetPath, raw);
1208
1652
  return targetPath;
@@ -1216,14 +1660,14 @@ export function writeStarterProjectConfig(cwd = process.cwd()) {
1216
1660
  export function previewSharedServerEntry(filePath, serverName, entry) {
1217
1661
  const raw = readRawConfigObject(filePath);
1218
1662
  const nextRaw = { ...raw };
1219
- const servers = getServersObject(nextRaw);
1663
+ const servers = getServersObject(nextRaw, filePath);
1220
1664
  servers[serverName] = entry;
1221
1665
  setServersObject(nextRaw, servers);
1222
1666
  return buildConfigWritePreview(filePath, nextRaw);
1223
1667
  }
1224
1668
  export function writeSharedServerEntry(filePath, serverName, entry) {
1225
1669
  const raw = readRawConfigObject(filePath);
1226
- const servers = getServersObject(raw);
1670
+ const servers = getServersObject(raw, filePath);
1227
1671
  servers[serverName] = entry;
1228
1672
  setServersObject(raw, servers);
1229
1673
  writeRawConfigObject(filePath, raw);
@@ -1243,7 +1687,7 @@ export function getServerProvenance(overridePath, cwd = process.cwd()) {
1243
1687
  }
1244
1688
  }
1245
1689
  for (const source of getConfigSources(overridePath, cwd)) {
1246
- const loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);
1690
+ const loaded = readSourceConfig(source.id, source.readPath);
1247
1691
  if (!loaded)
1248
1692
  continue;
1249
1693
  if (loaded.imports?.length) {
@@ -1260,16 +1704,18 @@ export function getServerProvenance(overridePath, cwd = process.cwd()) {
1260
1704
  }
1261
1705
  }
1262
1706
  for (const name of Object.keys(loaded.mcpServers)) {
1707
+ const ignoredSettings = loaded.ignoredSettings ? loaded.ignoredSettings.get(name) : provenance.get(name)?.ignoredSettings;
1263
1708
  provenance.set(name, {
1264
1709
  path: source.writePath,
1265
1710
  kind: source.kind,
1266
- ...source.importKind !== undefined ? { importKind: source.importKind } : {}
1711
+ ...source.importKind !== undefined ? { importKind: source.importKind } : {},
1712
+ ...ignoredSettings !== undefined ? { ignoredSettings } : {}
1267
1713
  });
1268
1714
  }
1269
1715
  }
1270
1716
  return provenance;
1271
1717
  }
1272
- export function writeDirectToolsConfig(changes, provenance, fullConfig) {
1718
+ export function writeDirectToolsConfig(changes, provenance, fullConfig, onFileWritten) {
1273
1719
  const byPath = new Map;
1274
1720
  for (const [serverName, value] of changes) {
1275
1721
  const prov = provenance.get(serverName);
@@ -1280,9 +1726,11 @@ export function writeDirectToolsConfig(changes, provenance, fullConfig) {
1280
1726
  byPath.set(targetPath, []);
1281
1727
  byPath.get(targetPath).push({ name: serverName, value, prov });
1282
1728
  }
1729
+ for (const filePath of byPath.keys())
1730
+ getServersObject(readRawConfigObject(filePath), filePath);
1283
1731
  for (const [filePath, entries] of byPath) {
1284
1732
  const raw = readRawConfigObject(filePath);
1285
- const servers = getServersObject(raw);
1733
+ const servers = getServersObject(raw, filePath);
1286
1734
  for (const { name, value, prov } of entries) {
1287
1735
  if (prov.kind === "import") {
1288
1736
  const fullDef = fullConfig.mcpServers[name];
@@ -1295,6 +1743,7 @@ export function writeDirectToolsConfig(changes, provenance, fullConfig) {
1295
1743
  }
1296
1744
  setServersObject(raw, servers);
1297
1745
  writeRawConfigObject(filePath, raw);
1746
+ onFileWritten?.();
1298
1747
  }
1299
1748
  }
1300
1749
  export function resolveConfiguredOAuthDir(raw, cwd = process.cwd()) {