@duckmind/dm-linux-x64 0.65.4 → 0.65.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1208) hide show
  1. package/README.md +0 -8
  2. package/dm +2 -2
  3. package/extensions/.dm-extensions.json +677 -44
  4. package/extensions/dm-lens/clients/actionable-warnings-logger.js +0 -6
  5. package/extensions/dm-lens/clients/actionable-warnings.js +42 -13
  6. package/extensions/dm-lens/clients/advisory-provenance.js +129 -41
  7. package/extensions/dm-lens/clients/agent-behavior-client.js +1 -0
  8. package/extensions/dm-lens/clients/analysed-root.js +0 -0
  9. package/extensions/dm-lens/clients/ast-grep-client.js +38 -3
  10. package/extensions/dm-lens/clients/ast-grep-rule-manager.js +37 -5
  11. package/extensions/dm-lens/clients/ast-grep-tool-logger.js +1 -7
  12. package/extensions/dm-lens/clients/bash-file-access.js +138 -1
  13. package/extensions/dm-lens/clients/biome-client.js +9 -2
  14. package/extensions/dm-lens/clients/blocker-freshness.js +171 -21
  15. package/extensions/dm-lens/clients/bootstrap.js +9 -5
  16. package/extensions/dm-lens/clients/bounded-pid-file-lock.js +1 -1
  17. package/extensions/dm-lens/clients/bounded-telemetry.js +1 -4
  18. package/extensions/dm-lens/clients/bundled-resource-health.js +43 -0
  19. package/extensions/dm-lens/clients/bus-events-logger.js +0 -6
  20. package/extensions/dm-lens/clients/cache/rule-cache.js +11 -3
  21. package/extensions/dm-lens/clients/cache-manager.js +29 -5
  22. package/extensions/dm-lens/clients/cache-observability.js +104 -4
  23. package/extensions/dm-lens/clients/cargo-manifest.js +6 -3
  24. package/extensions/dm-lens/clients/cascade-format.js +87 -5
  25. package/extensions/dm-lens/clients/cascade-logger.js +0 -6
  26. package/extensions/dm-lens/clients/child-unref.js +5 -9
  27. package/extensions/dm-lens/clients/code-quality-warnings.js +4 -2
  28. package/extensions/dm-lens/clients/complexity-client.js +5 -1
  29. package/extensions/dm-lens/clients/config-core/index.js +2 -68
  30. package/extensions/dm-lens/clients/config-core/process-spec.js +1 -1
  31. package/extensions/dm-lens/clients/config-core/provenance.js +1 -2
  32. package/extensions/dm-lens/clients/config-core/records.js +1 -1
  33. package/extensions/dm-lens/clients/config-core/schema.js +3 -6
  34. package/extensions/dm-lens/clients/config-diagnostic-codes.js +5 -3
  35. package/extensions/dm-lens/clients/config-locations.js +125 -5
  36. package/extensions/dm-lens/clients/config-resolve.js +12 -6
  37. package/extensions/dm-lens/clients/config-schema.js +56 -3
  38. package/extensions/dm-lens/clients/config-warn.js +3 -2
  39. package/extensions/dm-lens/clients/dead-code-client.js +4 -1
  40. package/extensions/dm-lens/clients/dead-code-logger.js +0 -3
  41. package/extensions/dm-lens/clients/degradation-ledger.js +29 -4
  42. package/extensions/dm-lens/clients/dependency-checker.js +29 -50
  43. package/extensions/dm-lens/clients/diagnostic-dispositions.js +23 -4
  44. package/extensions/dm-lens/clients/diagnostic-logger.js +1 -1
  45. package/extensions/dm-lens/clients/dispatch/ast-grep-catalog.js +19 -0
  46. package/extensions/dm-lens/clients/dispatch/auxiliary-lsp.js +9 -0
  47. package/extensions/dm-lens/clients/dispatch/collect-later-tier.js +0 -3
  48. package/extensions/dm-lens/clients/dispatch/dispatcher.js +30 -27
  49. package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +1 -1
  50. package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +4 -1
  51. package/extensions/dm-lens/clients/dispatch/finding-policy.js +163 -0
  52. package/extensions/dm-lens/clients/dispatch/indent-detect.js +213 -13
  53. package/extensions/dm-lens/clients/dispatch/inline-suppressions.js +20 -1
  54. package/extensions/dm-lens/clients/dispatch/integration.js +77 -13
  55. package/extensions/dm-lens/clients/dispatch/lazy.js +0 -3
  56. package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +1 -1
  57. package/extensions/dm-lens/clients/dispatch/plan.js +0 -3
  58. package/extensions/dm-lens/clients/dispatch/rule-ignores.js +21 -0
  59. package/extensions/dm-lens/clients/dispatch/rules/high-complexity.js +2 -2
  60. package/extensions/dm-lens/clients/dispatch/rules/high-fan-out.js +1 -1
  61. package/extensions/dm-lens/clients/dispatch/runners/actionlint.js +25 -29
  62. package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +8 -32
  63. package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +39 -23
  64. package/extensions/dm-lens/clients/dispatch/runners/cpp-check.js +29 -48
  65. package/extensions/dm-lens/clients/dispatch/runners/credo.js +17 -14
  66. package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +9 -7
  67. package/extensions/dm-lens/clients/dispatch/runners/dart-analyze.js +21 -43
  68. package/extensions/dm-lens/clients/dispatch/runners/detekt.js +11 -5
  69. package/extensions/dm-lens/clients/dispatch/runners/dotnet-build.js +27 -23
  70. package/extensions/dm-lens/clients/dispatch/runners/elixir-check.js +23 -38
  71. package/extensions/dm-lens/clients/dispatch/runners/eslint.js +22 -35
  72. package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +2 -1
  73. package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +35 -12
  74. package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +5 -3
  75. package/extensions/dm-lens/clients/dispatch/runners/golangci-lint.js +21 -22
  76. package/extensions/dm-lens/clients/dispatch/runners/hadolint.js +26 -16
  77. package/extensions/dm-lens/clients/dispatch/runners/helm-lint.js +3 -1
  78. package/extensions/dm-lens/clients/dispatch/runners/helm-render.js +3 -2
  79. package/extensions/dm-lens/clients/dispatch/runners/htmlhint.js +18 -9
  80. package/extensions/dm-lens/clients/dispatch/runners/javac.js +24 -23
  81. package/extensions/dm-lens/clients/dispatch/runners/ktlint.js +23 -54
  82. package/extensions/dm-lens/clients/dispatch/runners/lsp.js +17 -7
  83. package/extensions/dm-lens/clients/dispatch/runners/markdownlint.js +12 -6
  84. package/extensions/dm-lens/clients/dispatch/runners/mypy.js +2 -1
  85. package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +24 -7
  86. package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +26 -17
  87. package/extensions/dm-lens/clients/dispatch/runners/phpstan.js +2 -1
  88. package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +2 -1
  89. package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +10 -11
  90. package/extensions/dm-lens/clients/dispatch/runners/pyright.js +2 -1
  91. package/extensions/dm-lens/clients/dispatch/runners/rubocop.js +22 -18
  92. package/extensions/dm-lens/clients/dispatch/runners/ruff.js +17 -22
  93. package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +8 -11
  94. package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +9 -4
  95. package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +4 -13
  96. package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +15 -5
  97. package/extensions/dm-lens/clients/dispatch/runners/spotbugs.js +2 -1
  98. package/extensions/dm-lens/clients/dispatch/runners/sqlfluff.js +10 -4
  99. package/extensions/dm-lens/clients/dispatch/runners/stylelint.js +9 -4
  100. package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +11 -3
  101. package/extensions/dm-lens/clients/dispatch/runners/taplo.js +13 -7
  102. package/extensions/dm-lens/clients/dispatch/runners/terragrunt.js +2 -1
  103. package/extensions/dm-lens/clients/dispatch/runners/tflint.js +26 -16
  104. package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +12 -13
  105. package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +9 -3
  106. package/extensions/dm-lens/clients/dispatch/runners/utils/availability-policy.js +5 -0
  107. package/extensions/dm-lens/clients/dispatch/runners/utils/candidate-probe.js +2 -2
  108. package/extensions/dm-lens/clients/dispatch/runners/utils/diagnostic-parsers.js +8 -52
  109. package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +35 -3
  110. package/extensions/dm-lens/clients/dispatch/runners/utils.js +0 -17
  111. package/extensions/dm-lens/clients/dispatch/runners/vale.js +12 -4
  112. package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +2 -20
  113. package/extensions/dm-lens/clients/dispatch/runners/yamllint.js +16 -4
  114. package/extensions/dm-lens/clients/dispatch/runners/zig-check.js +26 -38
  115. package/extensions/dm-lens/clients/dispatch/suppress-writer.js +13 -3
  116. package/extensions/dm-lens/clients/dispatch/types.js +4 -1
  117. package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +2 -2
  118. package/extensions/dm-lens/clients/disposition-logger.js +0 -6
  119. package/extensions/dm-lens/clients/disposition-publish.js +2 -1
  120. package/extensions/dm-lens/clients/effective-config.js +14 -4
  121. package/extensions/dm-lens/clients/event-loop-hold.js +123 -0
  122. package/extensions/dm-lens/clients/event-loop-monitor.js +2 -2
  123. package/extensions/dm-lens/clients/extension-log.js +6 -1
  124. package/extensions/dm-lens/clients/feature-hints.js +2 -1
  125. package/extensions/dm-lens/clients/file-kinds.js +17 -21
  126. package/extensions/dm-lens/clients/file-role.js +11 -2
  127. package/extensions/dm-lens/clients/file-time.js +1 -1
  128. package/extensions/dm-lens/clients/file-utils.js +93 -6
  129. package/extensions/dm-lens/clients/finding-delivery-gate.js +22 -26
  130. package/extensions/dm-lens/clients/format-service.js +33 -16
  131. package/extensions/dm-lens/clients/formatters.js +129 -92
  132. package/extensions/dm-lens/clients/generated-artifacts.js +2 -2
  133. package/extensions/dm-lens/clients/generation-guard.js +4 -0
  134. package/extensions/dm-lens/clients/git-guard.js +80 -26
  135. package/extensions/dm-lens/clients/gitleaks-client.js +26 -0
  136. package/extensions/dm-lens/clients/govulncheck-client.js +34 -6
  137. package/extensions/dm-lens/clients/gradle-ktfmt-style.js +96 -13
  138. package/extensions/dm-lens/clients/grammar-source.js +3 -3
  139. package/extensions/dm-lens/clients/host-edit-normalize.js +1 -1
  140. package/extensions/dm-lens/clients/indent-retarget.js +35 -5
  141. package/extensions/dm-lens/clients/inline-blocker-dispositions.js +107 -0
  142. package/extensions/dm-lens/clients/install-diagnostics.js +8 -6
  143. package/extensions/dm-lens/clients/installer/index.js +695 -183
  144. package/extensions/dm-lens/clients/installer/managed-tool-refresh.js +85 -25
  145. package/extensions/dm-lens/clients/instance-reaper-state.js +3 -0
  146. package/extensions/dm-lens/clients/instance-reaper.js +23 -16
  147. package/extensions/dm-lens/clients/instance-registry.js +34 -2
  148. package/extensions/dm-lens/clients/jscpd-client.js +11 -1
  149. package/extensions/dm-lens/clients/knip-client.js +2 -1
  150. package/extensions/dm-lens/clients/language-profile.js +18 -12
  151. package/extensions/dm-lens/clients/language-registry.js +3 -1
  152. package/extensions/dm-lens/clients/latency-logger.js +14 -4
  153. package/extensions/dm-lens/clients/ledger-bounds.js +13 -1
  154. package/extensions/dm-lens/clients/lens-config.js +74 -7
  155. package/extensions/dm-lens/clients/lens-engine.js +9 -10
  156. package/extensions/dm-lens/clients/lens-events.js +1 -1
  157. package/extensions/dm-lens/clients/lens-flag-registry.js +47 -2
  158. package/extensions/dm-lens/clients/lens-map.js +1 -1
  159. package/extensions/dm-lens/clients/log-cleanup.js +0 -28
  160. package/extensions/dm-lens/clients/lsp/cascade-tier.js +2 -1
  161. package/extensions/dm-lens/clients/lsp/client.js +70 -30
  162. package/extensions/dm-lens/clients/lsp/config.js +41 -15
  163. package/extensions/dm-lens/clients/lsp/content-limits.js +21 -0
  164. package/extensions/dm-lens/clients/lsp/diagnostic-binding.js +8 -0
  165. package/extensions/dm-lens/clients/lsp/document-drift.js +72 -1
  166. package/extensions/dm-lens/clients/lsp/edits.js +3 -3
  167. package/extensions/dm-lens/clients/lsp/index.js +435 -62
  168. package/extensions/dm-lens/clients/lsp/inferred-project.js +1 -1
  169. package/extensions/dm-lens/clients/lsp/language.js +0 -3
  170. package/extensions/dm-lens/clients/lsp/launch.js +12 -5
  171. package/extensions/dm-lens/clients/lsp/path-utils.js +0 -2
  172. package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +0 -1
  173. package/extensions/dm-lens/clients/lsp/server.js +125 -60
  174. package/extensions/dm-lens/clients/lsp/session-roots.js +26 -5
  175. package/extensions/dm-lens/clients/lsp/sync-kind.js +14 -1
  176. package/extensions/dm-lens/clients/lsp/tsserver-sync.js +5 -7
  177. package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +3 -0
  178. package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +31 -2
  179. package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +26 -4
  180. package/extensions/dm-lens/clients/lsp-document-symbols.js +1 -1
  181. package/extensions/dm-lens/clients/map-with-concurrency.js +7 -3
  182. package/extensions/dm-lens/clients/mcp/analyze.js +1 -1
  183. package/extensions/dm-lens/clients/mcp/ipc.js +104 -40
  184. package/extensions/dm-lens/clients/mcp/review.js +39 -7
  185. package/extensions/dm-lens/clients/mcp/session.js +38 -4
  186. package/extensions/dm-lens/clients/metrics-history.js +19 -84
  187. package/extensions/dm-lens/clients/middle-man-analysis.js +2 -4
  188. package/extensions/dm-lens/clients/module-report.js +1 -1
  189. package/extensions/dm-lens/clients/mutating-tool.js +3 -3
  190. package/extensions/dm-lens/clients/mutation-attribution.js +3 -3
  191. package/extensions/dm-lens/clients/ndjson-logger.js +17 -9
  192. package/extensions/dm-lens/clients/observed-mutation.js +42 -11
  193. package/extensions/dm-lens/clients/opaque-mutation-scan.js +17 -7
  194. package/extensions/dm-lens/clients/opengrep-client.js +92 -10
  195. package/extensions/dm-lens/clients/opengrep-config.js +1 -1
  196. package/extensions/dm-lens/clients/package-manager.js +2 -1
  197. package/extensions/dm-lens/clients/path-utils.js +199 -3
  198. package/extensions/dm-lens/clients/performance-report.js +3 -3
  199. package/extensions/dm-lens/clients/persistent-reverify.js +167 -0
  200. package/extensions/dm-lens/clients/php-cs-fixer-config.js +9 -4
  201. package/extensions/dm-lens/clients/pipeline.js +124 -68
  202. package/extensions/dm-lens/clients/project-changes.js +1 -1
  203. package/extensions/dm-lens/clients/project-diagnostics/cache.js +19 -5
  204. package/extensions/dm-lens/clients/project-diagnostics/extractors.js +1 -1
  205. package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +150 -18
  206. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/dead-code.js +4 -1
  207. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -3
  208. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/jscpd.js +1 -1
  209. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/knip.js +1 -1
  210. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/madge.js +1 -1
  211. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/opengrep.js +1 -1
  212. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/runner-findings.js +19 -2
  213. package/extensions/dm-lens/clients/project-diagnostics/scanner.js +35 -4
  214. package/extensions/dm-lens/clients/project-lens-config.js +58 -4
  215. package/extensions/dm-lens/clients/project-scan-policy.js +0 -46
  216. package/extensions/dm-lens/clients/python-environment.js +80 -4
  217. package/extensions/dm-lens/clients/python-provenance.js +551 -0
  218. package/extensions/dm-lens/clients/read-guard-logger.js +3 -1
  219. package/extensions/dm-lens/clients/read-guard.js +29 -6
  220. package/extensions/dm-lens/clients/recent-touches.js +2 -2
  221. package/extensions/dm-lens/clients/resource-sampler.js +59 -9
  222. package/extensions/dm-lens/clients/review-graph/builder.js +39 -34
  223. package/extensions/dm-lens/clients/review-graph/git-identity.js +11 -7
  224. package/extensions/dm-lens/clients/review-graph/import-resolvers.js +1 -1
  225. package/extensions/dm-lens/clients/review-graph-logger.js +3 -1
  226. package/extensions/dm-lens/clients/ruff-client.js +11 -10
  227. package/extensions/dm-lens/clients/runtime-agent-end.js +41 -5
  228. package/extensions/dm-lens/clients/runtime-context.js +5 -2
  229. package/extensions/dm-lens/clients/runtime-coordinator.js +60 -6
  230. package/extensions/dm-lens/clients/runtime-session.js +52 -8
  231. package/extensions/dm-lens/clients/runtime-tool-call.js +27 -15
  232. package/extensions/dm-lens/clients/runtime-tool-result.js +279 -63
  233. package/extensions/dm-lens/clients/runtime-turn.js +453 -185
  234. package/extensions/dm-lens/clients/safe-spawn.js +248 -62
  235. package/extensions/dm-lens/clients/sanitize.js +0 -4
  236. package/extensions/dm-lens/clients/scan-utils.js +1 -39
  237. package/extensions/dm-lens/clients/scratch-tree-policy.js +2 -3
  238. package/extensions/dm-lens/clients/security-scan-client.js +2 -2
  239. package/extensions/dm-lens/clients/session-event-guard.js +59 -2
  240. package/extensions/dm-lens/clients/session-summary.js +0 -25
  241. package/extensions/dm-lens/clients/sg-runner.js +24 -12
  242. package/extensions/dm-lens/clients/sgconfig.js +58 -6
  243. package/extensions/dm-lens/clients/shared-checkout-guard.js +1 -1
  244. package/extensions/dm-lens/clients/situational-tool-telemetry.js +85 -0
  245. package/extensions/dm-lens/clients/skills-resolver.js +42 -0
  246. package/extensions/dm-lens/clients/smells-rollup.js +2 -2
  247. package/extensions/dm-lens/clients/spawn-output-cap.js +29 -0
  248. package/extensions/dm-lens/clients/startup-scan.js +1 -2
  249. package/extensions/dm-lens/clients/string-utils.js +3 -0
  250. package/extensions/dm-lens/clients/test-runner-client.js +118 -57
  251. package/extensions/dm-lens/clients/test-runner-delivery.js +118 -66
  252. package/extensions/dm-lens/clients/tool-agreement.js +403 -0
  253. package/extensions/dm-lens/clients/tool-config.js +218 -0
  254. package/extensions/dm-lens/clients/tool-cwd.js +248 -0
  255. package/extensions/dm-lens/clients/tool-definition.js +18 -1
  256. package/extensions/dm-lens/clients/tool-policy.js +138 -10
  257. package/extensions/dm-lens/clients/tool-probe.js +5 -0
  258. package/extensions/dm-lens/clients/tool-set-policy.js +35 -0
  259. package/extensions/dm-lens/clients/tree-sitter-client.js +201 -80
  260. package/extensions/dm-lens/clients/tree-sitter-query-loader.js +78 -130
  261. package/extensions/dm-lens/clients/trivy-client.js +8 -1
  262. package/extensions/dm-lens/clients/tui-fit.js +0 -3
  263. package/extensions/dm-lens/clients/turn-context.js +48 -0
  264. package/extensions/dm-lens/clients/turn-end/lane.js +0 -0
  265. package/extensions/dm-lens/clients/turn-end/lanes/govulncheck.js +54 -0
  266. package/extensions/dm-lens/clients/turn-end/lanes/secrets.js +140 -0
  267. package/extensions/dm-lens/clients/user-notify.js +0 -3
  268. package/extensions/dm-lens/clients/warm-attach.js +25 -0
  269. package/extensions/dm-lens/clients/widget-state.js +203 -13
  270. package/extensions/dm-lens/clients/word-index-logger.js +0 -6
  271. package/extensions/dm-lens/clients/word-index-store.js +1 -4
  272. package/extensions/dm-lens/clients/word-index.js +9 -5
  273. package/extensions/dm-lens/clients/workspace-topology.js +20 -3
  274. package/extensions/dm-lens/clients/write-ordering-guard.js +6 -0
  275. package/extensions/dm-lens/clients/zizmor-config.js +15 -11
  276. package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +8 -2
  277. package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +24 -0
  278. package/extensions/dm-lens/dist/clients/actionable-warnings.js +1014 -0
  279. package/extensions/dm-lens/dist/clients/advisory-provenance.js +385 -0
  280. package/extensions/dm-lens/dist/clients/agent-behavior-client.js +94 -0
  281. package/extensions/dm-lens/dist/clients/agent-nudge.js +151 -0
  282. package/extensions/dm-lens/dist/clients/analysed-root.js +1 -0
  283. package/extensions/dm-lens/dist/clients/ast-grep-client.js +576 -0
  284. package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +114 -0
  285. package/extensions/dm-lens/dist/clients/ast-grep-tool-logger.js +85 -0
  286. package/extensions/dm-lens/dist/clients/ast-grep-types.js +1 -0
  287. package/extensions/dm-lens/dist/clients/ast-grep-yaml-synth.js +109 -0
  288. package/extensions/dm-lens/dist/clients/atomic-write-staging.js +66 -0
  289. package/extensions/dm-lens/dist/clients/atomic-write.js +37 -0
  290. package/extensions/dm-lens/dist/clients/availability-probe-flight.js +11 -0
  291. package/extensions/dm-lens/dist/clients/bash-file-access.js +830 -0
  292. package/extensions/dm-lens/dist/clients/biome-client.js +221 -0
  293. package/extensions/dm-lens/dist/clients/blocker-freshness.js +385 -0
  294. package/extensions/dm-lens/dist/clients/blocker-past-eof.js +49 -0
  295. package/extensions/dm-lens/dist/clients/bootstrap.js +246 -0
  296. package/extensions/dm-lens/dist/clients/bounded-cache.js +105 -0
  297. package/extensions/dm-lens/dist/clients/bounded-pid-file-lock.js +173 -0
  298. package/extensions/dm-lens/dist/clients/bounded-telemetry.js +104 -0
  299. package/extensions/dm-lens/dist/clients/build-identity.js +45 -0
  300. package/extensions/dm-lens/dist/clients/bundled-resource-health.js +41 -0
  301. package/extensions/dm-lens/dist/clients/bus-events-logger.js +48 -0
  302. package/extensions/dm-lens/dist/clients/bus-publish.js +117 -0
  303. package/extensions/dm-lens/dist/clients/cache/rule-cache.js +103 -0
  304. package/extensions/dm-lens/dist/clients/cache-manager.js +340 -0
  305. package/extensions/dm-lens/dist/clients/cache-observability.js +847 -0
  306. package/extensions/dm-lens/dist/clients/call-graph.js +628 -0
  307. package/extensions/dm-lens/dist/clients/cargo-manifest.js +151 -0
  308. package/extensions/dm-lens/dist/clients/cascade-budget.js +52 -0
  309. package/extensions/dm-lens/dist/clients/cascade-format.js +160 -0
  310. package/extensions/dm-lens/dist/clients/cascade-logger.js +22 -0
  311. package/extensions/dm-lens/dist/clients/cascade-types.js +1 -0
  312. package/extensions/dm-lens/dist/clients/child-unref.js +59 -0
  313. package/extensions/dm-lens/dist/clients/code-quality-warnings.js +192 -0
  314. package/extensions/dm-lens/dist/clients/codebase-model.js +110 -0
  315. package/extensions/dm-lens/dist/clients/collateral-test-role.js +8 -0
  316. package/extensions/dm-lens/dist/clients/complexity-client.js +398 -0
  317. package/extensions/dm-lens/dist/clients/config-core/deny.js +117 -0
  318. package/extensions/dm-lens/dist/clients/config-core/index.js +2 -0
  319. package/extensions/dm-lens/dist/clients/config-core/merge.js +228 -0
  320. package/extensions/dm-lens/dist/clients/config-core/normalize.js +217 -0
  321. package/extensions/dm-lens/dist/clients/config-core/process-spec.js +147 -0
  322. package/extensions/dm-lens/dist/clients/config-core/provenance.js +54 -0
  323. package/extensions/dm-lens/dist/clients/config-core/records.js +79 -0
  324. package/extensions/dm-lens/dist/clients/config-core/resolve.js +48 -0
  325. package/extensions/dm-lens/dist/clients/config-core/safe-object.js +22 -0
  326. package/extensions/dm-lens/dist/clients/config-core/schema.js +90 -0
  327. package/extensions/dm-lens/dist/clients/config-diagnostic-codes.js +90 -0
  328. package/extensions/dm-lens/dist/clients/config-locations.js +175 -0
  329. package/extensions/dm-lens/dist/clients/config-resolve.js +359 -0
  330. package/extensions/dm-lens/dist/clients/config-schema.js +128 -0
  331. package/extensions/dm-lens/dist/clients/config-warn.js +146 -0
  332. package/extensions/dm-lens/dist/clients/console-guard-install.js +4 -0
  333. package/extensions/dm-lens/dist/clients/cooperative-budget.js +36 -0
  334. package/extensions/dm-lens/dist/clients/dead-code-client.js +342 -0
  335. package/extensions/dm-lens/dist/clients/dead-code-logger.js +18 -0
  336. package/extensions/dm-lens/dist/clients/deadline-utils.js +117 -0
  337. package/extensions/dm-lens/dist/clients/debug-handles.js +121 -0
  338. package/extensions/dm-lens/dist/clients/debug-heap.js +80 -0
  339. package/extensions/dm-lens/dist/clients/deferred-lsp-work.js +33 -0
  340. package/extensions/dm-lens/dist/clients/degradation-ledger.js +272 -0
  341. package/extensions/dm-lens/dist/clients/demoted-finding-render.js +61 -0
  342. package/extensions/dm-lens/dist/clients/dependency-checker.js +525 -0
  343. package/extensions/dm-lens/dist/clients/deps/ast-grep-napi.js +17 -0
  344. package/extensions/dm-lens/dist/clients/deps/dm-host-deps.js +10 -0
  345. package/extensions/dm-lens/dist/clients/deps/dm-tui-compat.js +58 -0
  346. package/extensions/dm-lens/dist/clients/deps/js-yaml.js +7 -0
  347. package/extensions/dm-lens/dist/clients/deps/minimatch.js +6 -0
  348. package/extensions/dm-lens/dist/clients/deps/pidusage.js +5 -0
  349. package/extensions/dm-lens/dist/clients/deps/typebox.js +5 -0
  350. package/extensions/dm-lens/dist/clients/deps/vscode-jsonrpc.js +8 -0
  351. package/extensions/dm-lens/dist/clients/deps/web-tree-sitter.js +11 -0
  352. package/extensions/dm-lens/dist/clients/diagnostic-dispositions.js +318 -0
  353. package/extensions/dm-lens/dist/clients/diagnostic-line-freshness.js +144 -0
  354. package/extensions/dm-lens/dist/clients/diagnostic-logger.js +60 -0
  355. package/extensions/dm-lens/dist/clients/diagnostic-tracker.js +89 -0
  356. package/extensions/dm-lens/dist/clients/diagnostics-publish.js +134 -0
  357. package/extensions/dm-lens/dist/clients/dispatch/ast-grep-catalog.js +16 -0
  358. package/extensions/dm-lens/dist/clients/dispatch/auxiliary-lsp.js +158 -0
  359. package/extensions/dm-lens/dist/clients/dispatch/collect-later-tier.js +25 -0
  360. package/extensions/dm-lens/dist/clients/dispatch/diagnostic-taxonomy.js +58 -0
  361. package/extensions/dm-lens/dist/clients/dispatch/dispatcher.js +953 -0
  362. package/extensions/dm-lens/dist/clients/dispatch/fact-provider-types.js +1 -0
  363. package/extensions/dm-lens/dist/clients/dispatch/fact-rule-runner.js +17 -0
  364. package/extensions/dm-lens/dist/clients/dispatch/fact-runner.js +18 -0
  365. package/extensions/dm-lens/dist/clients/dispatch/fact-scheduler.js +52 -0
  366. package/extensions/dm-lens/dist/clients/dispatch/fact-store.js +199 -0
  367. package/extensions/dm-lens/dist/clients/dispatch/facts/comment-facts.js +20 -0
  368. package/extensions/dm-lens/dist/clients/dispatch/facts/file-content.js +18 -0
  369. package/extensions/dm-lens/dist/clients/dispatch/facts/function-facts.js +281 -0
  370. package/extensions/dm-lens/dist/clients/dispatch/facts/import-facts.js +169 -0
  371. package/extensions/dm-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +19 -0
  372. package/extensions/dm-lens/dist/clients/dispatch/facts/try-catch-facts.js +95 -0
  373. package/extensions/dm-lens/dist/clients/dispatch/finding-policy.js +159 -0
  374. package/extensions/dm-lens/dist/clients/dispatch/indent-detect.js +227 -0
  375. package/extensions/dm-lens/dist/clients/dispatch/inline-suppressions.js +52 -0
  376. package/extensions/dm-lens/dist/clients/dispatch/integration.js +1463 -0
  377. package/extensions/dm-lens/dist/clients/dispatch/lazy.js +8 -0
  378. package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +75 -0
  379. package/extensions/dm-lens/dist/clients/dispatch/plan.js +278 -0
  380. package/extensions/dm-lens/dist/clients/dispatch/priorities.js +14 -0
  381. package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +42 -0
  382. package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +21 -0
  383. package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +73 -0
  384. package/extensions/dm-lens/dist/clients/dispatch/rules/async-noise.js +31 -0
  385. package/extensions/dm-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +27 -0
  386. package/extensions/dm-lens/dist/clients/dispatch/rules/cors-wildcard.js +35 -0
  387. package/extensions/dm-lens/dist/clients/dispatch/rules/error-obscuring.js +29 -0
  388. package/extensions/dm-lens/dist/clients/dispatch/rules/error-swallowing.js +29 -0
  389. package/extensions/dm-lens/dist/clients/dispatch/rules/framework-call-noise.js +31 -0
  390. package/extensions/dm-lens/dist/clients/dispatch/rules/high-complexity.js +56 -0
  391. package/extensions/dm-lens/dist/clients/dispatch/rules/high-fan-out.js +45 -0
  392. package/extensions/dm-lens/dist/clients/dispatch/rules/high-import-coupling.js +31 -0
  393. package/extensions/dm-lens/dist/clients/dispatch/rules/missing-error-propagation.js +45 -0
  394. package/extensions/dm-lens/dist/clients/dispatch/rules/no-commented-credentials.js +46 -0
  395. package/extensions/dm-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +38 -0
  396. package/extensions/dm-lens/dist/clients/dispatch/rules/placeholder-comments.js +40 -0
  397. package/extensions/dm-lens/dist/clients/dispatch/rules/unsafe-boundary.js +101 -0
  398. package/extensions/dm-lens/dist/clients/dispatch/runner-context.js +46 -0
  399. package/extensions/dm-lens/dist/clients/dispatch/runners/actionlint.js +98 -0
  400. package/extensions/dm-lens/dist/clients/dispatch/runners/ast-grep-napi.js +690 -0
  401. package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +202 -0
  402. package/extensions/dm-lens/dist/clients/dispatch/runners/cpp-check.js +190 -0
  403. package/extensions/dm-lens/dist/clients/dispatch/runners/credo.js +66 -0
  404. package/extensions/dm-lens/dist/clients/dispatch/runners/cue-vet.js +167 -0
  405. package/extensions/dm-lens/dist/clients/dispatch/runners/dart-analyze.js +151 -0
  406. package/extensions/dm-lens/dist/clients/dispatch/runners/detekt.js +157 -0
  407. package/extensions/dm-lens/dist/clients/dispatch/runners/dotnet-build.js +157 -0
  408. package/extensions/dm-lens/dist/clients/dispatch/runners/elixir-check.js +153 -0
  409. package/extensions/dm-lens/dist/clients/dispatch/runners/eslint.js +99 -0
  410. package/extensions/dm-lens/dist/clients/dispatch/runners/fact-rules.js +20 -0
  411. package/extensions/dm-lens/dist/clients/dispatch/runners/fish-indent.js +65 -0
  412. package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +107 -0
  413. package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +51 -0
  414. package/extensions/dm-lens/dist/clients/dispatch/runners/golangci-lint.js +89 -0
  415. package/extensions/dm-lens/dist/clients/dispatch/runners/hadolint.js +83 -0
  416. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-lint.js +144 -0
  417. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-render.js +593 -0
  418. package/extensions/dm-lens/dist/clients/dispatch/runners/htmlhint.js +103 -0
  419. package/extensions/dm-lens/dist/clients/dispatch/runners/index.js +100 -0
  420. package/extensions/dm-lens/dist/clients/dispatch/runners/javac.js +82 -0
  421. package/extensions/dm-lens/dist/clients/dispatch/runners/ktlint.js +93 -0
  422. package/extensions/dm-lens/dist/clients/dispatch/runners/lsp.js +206 -0
  423. package/extensions/dm-lens/dist/clients/dispatch/runners/markdownlint.js +129 -0
  424. package/extensions/dm-lens/dist/clients/dispatch/runners/mypy.js +70 -0
  425. package/extensions/dm-lens/dist/clients/dispatch/runners/oxlint.js +305 -0
  426. package/extensions/dm-lens/dist/clients/dispatch/runners/php-lint.js +70 -0
  427. package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +90 -0
  428. package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +56 -0
  429. package/extensions/dm-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +307 -0
  430. package/extensions/dm-lens/dist/clients/dispatch/runners/pyright.js +118 -0
  431. package/extensions/dm-lens/dist/clients/dispatch/runners/rubocop.js +79 -0
  432. package/extensions/dm-lens/dist/clients/dispatch/runners/ruff.js +69 -0
  433. package/extensions/dm-lens/dist/clients/dispatch/runners/rust-clippy.js +147 -0
  434. package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +111 -0
  435. package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +81 -0
  436. package/extensions/dm-lens/dist/clients/dispatch/runners/spellcheck.js +74 -0
  437. package/extensions/dm-lens/dist/clients/dispatch/runners/spotbugs.js +208 -0
  438. package/extensions/dm-lens/dist/clients/dispatch/runners/sqlfluff.js +136 -0
  439. package/extensions/dm-lens/dist/clients/dispatch/runners/stylelint.js +118 -0
  440. package/extensions/dm-lens/dist/clients/dispatch/runners/swiftlint.js +143 -0
  441. package/extensions/dm-lens/dist/clients/dispatch/runners/taplo.js +97 -0
  442. package/extensions/dm-lens/dist/clients/dispatch/runners/terragrunt.js +110 -0
  443. package/extensions/dm-lens/dist/clients/dispatch/runners/tflint.js +104 -0
  444. package/extensions/dm-lens/dist/clients/dispatch/runners/tree-sitter.js +516 -0
  445. package/extensions/dm-lens/dist/clients/dispatch/runners/trivy-config.js +155 -0
  446. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/availability-policy.js +285 -0
  447. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +61 -0
  448. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +61 -0
  449. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +130 -0
  450. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +1067 -0
  451. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +40 -0
  452. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/tool-failure.js +117 -0
  453. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +88 -0
  454. package/extensions/dm-lens/dist/clients/dispatch/runners/utils.js +8 -0
  455. package/extensions/dm-lens/dist/clients/dispatch/runners/vale.js +106 -0
  456. package/extensions/dm-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +163 -0
  457. package/extensions/dm-lens/dist/clients/dispatch/runners/yamllint.js +83 -0
  458. package/extensions/dm-lens/dist/clients/dispatch/runners/zig-check.js +72 -0
  459. package/extensions/dm-lens/dist/clients/dispatch/suppress-writer.js +57 -0
  460. package/extensions/dm-lens/dist/clients/dispatch/tool-profile.js +30 -0
  461. package/extensions/dm-lens/dist/clients/dispatch/types.js +7 -0
  462. package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +45 -0
  463. package/extensions/dm-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +31 -0
  464. package/extensions/dm-lens/dist/clients/disposition-logger.js +19 -0
  465. package/extensions/dm-lens/dist/clients/disposition-publish.js +88 -0
  466. package/extensions/dm-lens/dist/clients/durable-store.js +77 -0
  467. package/extensions/dm-lens/dist/clients/effective-config.js +160 -0
  468. package/extensions/dm-lens/dist/clients/env-utils.js +26 -0
  469. package/extensions/dm-lens/dist/clients/error-class.js +3 -0
  470. package/extensions/dm-lens/dist/clients/eval-timestamp.js +2 -0
  471. package/extensions/dm-lens/dist/clients/event-loop-hold.js +119 -0
  472. package/extensions/dm-lens/dist/clients/event-loop-monitor.js +84 -0
  473. package/extensions/dm-lens/dist/clients/extension-log.js +230 -0
  474. package/extensions/dm-lens/dist/clients/extension-mode.js +20 -0
  475. package/extensions/dm-lens/dist/clients/feature-hints.js +88 -0
  476. package/extensions/dm-lens/dist/clients/file-kinds.js +304 -0
  477. package/extensions/dm-lens/dist/clients/file-role.js +50 -0
  478. package/extensions/dm-lens/dist/clients/file-time.js +112 -0
  479. package/extensions/dm-lens/dist/clients/file-utils.js +630 -0
  480. package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +129 -0
  481. package/extensions/dm-lens/dist/clients/finding-identity.js +23 -0
  482. package/extensions/dm-lens/dist/clients/fix-worklog.js +75 -0
  483. package/extensions/dm-lens/dist/clients/format-events-publish.js +230 -0
  484. package/extensions/dm-lens/dist/clients/format-service.js +154 -0
  485. package/extensions/dm-lens/dist/clients/formatters-lazy.js +8 -0
  486. package/extensions/dm-lens/dist/clients/formatters.js +1351 -0
  487. package/extensions/dm-lens/dist/clients/freshness-cadence.js +1 -0
  488. package/extensions/dm-lens/dist/clients/freshness.js +8 -0
  489. package/extensions/dm-lens/dist/clients/generated-artifacts.js +209 -0
  490. package/extensions/dm-lens/dist/clients/generation-guard.js +105 -0
  491. package/extensions/dm-lens/dist/clients/git-guard.js +770 -0
  492. package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +120 -0
  493. package/extensions/dm-lens/dist/clients/gitleaks-client.js +282 -0
  494. package/extensions/dm-lens/dist/clients/go-client.js +47 -0
  495. package/extensions/dm-lens/dist/clients/govulncheck-client.js +411 -0
  496. package/extensions/dm-lens/dist/clients/gradle-ktfmt-style.js +177 -0
  497. package/extensions/dm-lens/dist/clients/grammar-source.js +224 -0
  498. package/extensions/dm-lens/dist/clients/gzip-stage-write.js +85 -0
  499. package/extensions/dm-lens/dist/clients/hashline-anchor.js +222 -0
  500. package/extensions/dm-lens/dist/clients/hook-budgets.js +16 -0
  501. package/extensions/dm-lens/dist/clients/host-edit-normalize.js +87 -0
  502. package/extensions/dm-lens/dist/clients/host-ports.js +35 -0
  503. package/extensions/dm-lens/dist/clients/indent-retarget.js +102 -0
  504. package/extensions/dm-lens/dist/clients/inline-blocker-dispositions.js +103 -0
  505. package/extensions/dm-lens/dist/clients/install-diagnostics.js +123 -0
  506. package/extensions/dm-lens/dist/clients/installer/index.js +3770 -0
  507. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh-session.js +17 -0
  508. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh.js +522 -0
  509. package/extensions/dm-lens/dist/clients/instance-reaper-state.js +3 -0
  510. package/extensions/dm-lens/dist/clients/instance-reaper.js +577 -0
  511. package/extensions/dm-lens/dist/clients/instance-registry-lock.js +131 -0
  512. package/extensions/dm-lens/dist/clients/instance-registry.js +452 -0
  513. package/extensions/dm-lens/dist/clients/jscpd-client.js +252 -0
  514. package/extensions/dm-lens/dist/clients/json-cache-read.js +25 -0
  515. package/extensions/dm-lens/dist/clients/knip-client.js +472 -0
  516. package/extensions/dm-lens/dist/clients/language-policy.js +242 -0
  517. package/extensions/dm-lens/dist/clients/language-profile.js +261 -0
  518. package/extensions/dm-lens/dist/clients/language-registry.js +424 -0
  519. package/extensions/dm-lens/dist/clients/latency-logger.js +192 -0
  520. package/extensions/dm-lens/dist/clients/lazy-import.js +14 -0
  521. package/extensions/dm-lens/dist/clients/ledger-bounds.js +21 -0
  522. package/extensions/dm-lens/dist/clients/lens-config.js +237 -0
  523. package/extensions/dm-lens/dist/clients/lens-engine.js +181 -0
  524. package/extensions/dm-lens/dist/clients/lens-events.js +105 -0
  525. package/extensions/dm-lens/dist/clients/lens-flag-registry.js +302 -0
  526. package/extensions/dm-lens/dist/clients/lens-map.js +980 -0
  527. package/extensions/dm-lens/dist/clients/live-bus-emitter.js +53 -0
  528. package/extensions/dm-lens/dist/clients/log-cleanup.js +138 -0
  529. package/extensions/dm-lens/dist/clients/lsp/aggregation.js +88 -0
  530. package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +203 -0
  531. package/extensions/dm-lens/dist/clients/lsp/client.js +2709 -0
  532. package/extensions/dm-lens/dist/clients/lsp/config.js +252 -0
  533. package/extensions/dm-lens/dist/clients/lsp/content-limits.js +21 -0
  534. package/extensions/dm-lens/dist/clients/lsp/diagnostic-binding.js +79 -0
  535. package/extensions/dm-lens/dist/clients/lsp/document-drift.js +312 -0
  536. package/extensions/dm-lens/dist/clients/lsp/edits.js +930 -0
  537. package/extensions/dm-lens/dist/clients/lsp/index.js +4448 -0
  538. package/extensions/dm-lens/dist/clients/lsp/inferred-project.js +121 -0
  539. package/extensions/dm-lens/dist/clients/lsp/jvm-runtime.js +194 -0
  540. package/extensions/dm-lens/dist/clients/lsp/language.js +23 -0
  541. package/extensions/dm-lens/dist/clients/lsp/launch.js +468 -0
  542. package/extensions/dm-lens/dist/clients/lsp/lombok.js +146 -0
  543. package/extensions/dm-lens/dist/clients/lsp/path-utils.js +1 -0
  544. package/extensions/dm-lens/dist/clients/lsp/pending-aux-coverage.js +90 -0
  545. package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +28 -0
  546. package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +42 -0
  547. package/extensions/dm-lens/dist/clients/lsp/server.js +2422 -0
  548. package/extensions/dm-lens/dist/clients/lsp/session-roots.js +52 -0
  549. package/extensions/dm-lens/dist/clients/lsp/spawn-history.js +15 -0
  550. package/extensions/dm-lens/dist/clients/lsp/sync-kind.js +30 -0
  551. package/extensions/dm-lens/dist/clients/lsp/tsserver-sync.js +156 -0
  552. package/extensions/dm-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +1 -0
  553. package/extensions/dm-lens/dist/clients/lsp/wait-policy/classification.js +36 -0
  554. package/extensions/dm-lens/dist/clients/lsp/wait-policy/index.js +3 -0
  555. package/extensions/dm-lens/dist/clients/lsp/wait-policy/strategies.js +175 -0
  556. package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +40 -0
  557. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +267 -0
  558. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-session.js +7 -0
  559. package/extensions/dm-lens/dist/clients/lsp/workspace-sweep-hold.js +93 -0
  560. package/extensions/dm-lens/dist/clients/lsp-budget.js +83 -0
  561. package/extensions/dm-lens/dist/clients/lsp-document-symbols.js +93 -0
  562. package/extensions/dm-lens/dist/clients/lsp-lazy.js +8 -0
  563. package/extensions/dm-lens/dist/clients/lsp-mutation.js +273 -0
  564. package/extensions/dm-lens/dist/clients/lsp-status.js +37 -0
  565. package/extensions/dm-lens/dist/clients/map-with-concurrency.js +20 -0
  566. package/extensions/dm-lens/dist/clients/mcp/analyze.js +251 -0
  567. package/extensions/dm-lens/dist/clients/mcp/host-shim.js +14 -0
  568. package/extensions/dm-lens/dist/clients/mcp/ipc.js +302 -0
  569. package/extensions/dm-lens/dist/clients/mcp/review.js +137 -0
  570. package/extensions/dm-lens/dist/clients/mcp/session.js +305 -0
  571. package/extensions/dm-lens/dist/clients/memory-sampler.js +107 -0
  572. package/extensions/dm-lens/dist/clients/message-end-attribution.js +18 -0
  573. package/extensions/dm-lens/dist/clients/metrics-client.js +80 -0
  574. package/extensions/dm-lens/dist/clients/metrics-history.js +255 -0
  575. package/extensions/dm-lens/dist/clients/middle-man-analysis.js +161 -0
  576. package/extensions/dm-lens/dist/clients/model-provider.js +31 -0
  577. package/extensions/dm-lens/dist/clients/module-report-lsp.js +140 -0
  578. package/extensions/dm-lens/dist/clients/module-report.js +1642 -0
  579. package/extensions/dm-lens/dist/clients/mutating-tool.js +377 -0
  580. package/extensions/dm-lens/dist/clients/mutation-attribution.js +168 -0
  581. package/extensions/dm-lens/dist/clients/mutation-bridge.js +102 -0
  582. package/extensions/dm-lens/dist/clients/ndjson-logger.js +471 -0
  583. package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +43 -0
  584. package/extensions/dm-lens/dist/clients/observed-mutation.js +709 -0
  585. package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +100 -0
  586. package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +313 -0
  587. package/extensions/dm-lens/dist/clients/opengrep-client.js +216 -0
  588. package/extensions/dm-lens/dist/clients/opengrep-config.js +52 -0
  589. package/extensions/dm-lens/dist/clients/package-manager.js +303 -0
  590. package/extensions/dm-lens/dist/clients/package-root.js +25 -0
  591. package/extensions/dm-lens/dist/clients/partial-edit-apply.js +337 -0
  592. package/extensions/dm-lens/dist/clients/path-attribution-telemetry.js +31 -0
  593. package/extensions/dm-lens/dist/clients/path-keyed-map.js +57 -0
  594. package/extensions/dm-lens/dist/clients/path-utils.js +476 -0
  595. package/extensions/dm-lens/dist/clients/performance-report.js +291 -0
  596. package/extensions/dm-lens/dist/clients/persist-debounce.js +37 -0
  597. package/extensions/dm-lens/dist/clients/persistent-reverify.js +165 -0
  598. package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +15 -0
  599. package/extensions/dm-lens/dist/clients/pipeline.js +1091 -0
  600. package/extensions/dm-lens/dist/clients/post-autofix-notice.js +19 -0
  601. package/extensions/dm-lens/dist/clients/print-mode.js +3 -0
  602. package/extensions/dm-lens/dist/clients/probe-home-state.js +62 -0
  603. package/extensions/dm-lens/dist/clients/process-bridge.js +20 -0
  604. package/extensions/dm-lens/dist/clients/process-singletons.js +69 -0
  605. package/extensions/dm-lens/dist/clients/process-snapshot.js +22 -0
  606. package/extensions/dm-lens/dist/clients/project-changes.js +112 -0
  607. package/extensions/dm-lens/dist/clients/project-conventions.js +152 -0
  608. package/extensions/dm-lens/dist/clients/project-diagnostics/cache.js +91 -0
  609. package/extensions/dm-lens/dist/clients/project-diagnostics/extractors.js +53 -0
  610. package/extensions/dm-lens/dist/clients/project-diagnostics/fresh-fetch.js +408 -0
  611. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +64 -0
  612. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +38 -0
  613. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +21 -0
  614. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +23 -0
  615. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +28 -0
  616. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +45 -0
  617. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +34 -0
  618. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +32 -0
  619. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +79 -0
  620. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +41 -0
  621. package/extensions/dm-lens/dist/clients/project-diagnostics/scanner.js +349 -0
  622. package/extensions/dm-lens/dist/clients/project-diagnostics/types.js +1 -0
  623. package/extensions/dm-lens/dist/clients/project-lens-config.js +437 -0
  624. package/extensions/dm-lens/dist/clients/project-report.js +527 -0
  625. package/extensions/dm-lens/dist/clients/project-scale.js +60 -0
  626. package/extensions/dm-lens/dist/clients/project-scan-policy.js +4 -0
  627. package/extensions/dm-lens/dist/clients/project-snapshot-fingerprint.js +39 -0
  628. package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +14 -0
  629. package/extensions/dm-lens/dist/clients/project-snapshot.js +1178 -0
  630. package/extensions/dm-lens/dist/clients/project-trust.js +104 -0
  631. package/extensions/dm-lens/dist/clients/python-environment.js +120 -0
  632. package/extensions/dm-lens/dist/clients/python-provenance.js +551 -0
  633. package/extensions/dm-lens/dist/clients/quiet-window-config.js +16 -0
  634. package/extensions/dm-lens/dist/clients/quiet-window.js +126 -0
  635. package/extensions/dm-lens/dist/clients/read-bridge.js +46 -0
  636. package/extensions/dm-lens/dist/clients/read-expansion.js +218 -0
  637. package/extensions/dm-lens/dist/clients/read-guard-logger.js +178 -0
  638. package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +1042 -0
  639. package/extensions/dm-lens/dist/clients/read-guard.js +1096 -0
  640. package/extensions/dm-lens/dist/clients/recent-touches.js +126 -0
  641. package/extensions/dm-lens/dist/clients/redact/secrets.js +386 -0
  642. package/extensions/dm-lens/dist/clients/resource-sampler.js +344 -0
  643. package/extensions/dm-lens/dist/clients/reverse-deps.js +227 -0
  644. package/extensions/dm-lens/dist/clients/review-graph/builder.js +3635 -0
  645. package/extensions/dm-lens/dist/clients/review-graph/format.js +30 -0
  646. package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +115 -0
  647. package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +325 -0
  648. package/extensions/dm-lens/dist/clients/review-graph/persist-worker.js +8 -0
  649. package/extensions/dm-lens/dist/clients/review-graph/query.js +195 -0
  650. package/extensions/dm-lens/dist/clients/review-graph/revision-drift.js +3 -0
  651. package/extensions/dm-lens/dist/clients/review-graph/service.js +60 -0
  652. package/extensions/dm-lens/dist/clients/review-graph/shared-extraction-ir.js +54 -0
  653. package/extensions/dm-lens/dist/clients/review-graph/symbol-id.js +29 -0
  654. package/extensions/dm-lens/dist/clients/review-graph/tsconfig-paths.js +253 -0
  655. package/extensions/dm-lens/dist/clients/review-graph/types.js +1 -0
  656. package/extensions/dm-lens/dist/clients/review-graph/workspace-modules.js +374 -0
  657. package/extensions/dm-lens/dist/clients/review-graph-logger.js +51 -0
  658. package/extensions/dm-lens/dist/clients/ruff-client.js +109 -0
  659. package/extensions/dm-lens/dist/clients/rules-scanner.js +113 -0
  660. package/extensions/dm-lens/dist/clients/run-duration.js +9 -0
  661. package/extensions/dm-lens/dist/clients/runtime-agent-end.js +608 -0
  662. package/extensions/dm-lens/dist/clients/runtime-config.js +39 -0
  663. package/extensions/dm-lens/dist/clients/runtime-context.js +155 -0
  664. package/extensions/dm-lens/dist/clients/runtime-coordinator.js +817 -0
  665. package/extensions/dm-lens/dist/clients/runtime-session.js +1625 -0
  666. package/extensions/dm-lens/dist/clients/runtime-tool-call.js +868 -0
  667. package/extensions/dm-lens/dist/clients/runtime-tool-result.js +1317 -0
  668. package/extensions/dm-lens/dist/clients/runtime-turn.js +2333 -0
  669. package/extensions/dm-lens/dist/clients/rust-client.js +48 -0
  670. package/extensions/dm-lens/dist/clients/safe-spawn.js +1267 -0
  671. package/extensions/dm-lens/dist/clients/sanitize.js +174 -0
  672. package/extensions/dm-lens/dist/clients/scan-utils.js +7 -0
  673. package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +57 -0
  674. package/extensions/dm-lens/dist/clients/search-read-registration.js +59 -0
  675. package/extensions/dm-lens/dist/clients/secret-findings.js +69 -0
  676. package/extensions/dm-lens/dist/clients/security-scan-client.js +208 -0
  677. package/extensions/dm-lens/dist/clients/session-event-guard.js +111 -0
  678. package/extensions/dm-lens/dist/clients/session-lifecycle.js +173 -0
  679. package/extensions/dm-lens/dist/clients/session-start-observability.js +47 -0
  680. package/extensions/dm-lens/dist/clients/session-state-store.js +63 -0
  681. package/extensions/dm-lens/dist/clients/session-summary.js +8 -0
  682. package/extensions/dm-lens/dist/clients/sessionstart-logger.js +22 -0
  683. package/extensions/dm-lens/dist/clients/sg-runner.js +627 -0
  684. package/extensions/dm-lens/dist/clients/sgconfig.js +280 -0
  685. package/extensions/dm-lens/dist/clients/shared-checkout-guard.js +177 -0
  686. package/extensions/dm-lens/dist/clients/single-flight.js +52 -0
  687. package/extensions/dm-lens/dist/clients/situational-tool-telemetry.js +85 -0
  688. package/extensions/dm-lens/dist/clients/skills-resolver.js +38 -0
  689. package/extensions/dm-lens/dist/clients/slow-fs.js +77 -0
  690. package/extensions/dm-lens/dist/clients/smells-rollup.js +118 -0
  691. package/extensions/dm-lens/dist/clients/source-filter.js +320 -0
  692. package/extensions/dm-lens/dist/clients/source-walker.js +96 -0
  693. package/extensions/dm-lens/dist/clients/spawn-output-cap.js +35 -0
  694. package/extensions/dm-lens/dist/clients/spawn-timeout-cooldown.js +51 -0
  695. package/extensions/dm-lens/dist/clients/stale-marker.js +1 -0
  696. package/extensions/dm-lens/dist/clients/startup-scan.js +222 -0
  697. package/extensions/dm-lens/dist/clients/startup-timing.js +67 -0
  698. package/extensions/dm-lens/dist/clients/string-utils.js +6 -0
  699. package/extensions/dm-lens/dist/clients/subagent-mode.js +40 -0
  700. package/extensions/dm-lens/dist/clients/symbol-containment.js +16 -0
  701. package/extensions/dm-lens/dist/clients/symbol-types.js +1 -0
  702. package/extensions/dm-lens/dist/clients/test-runner-client.js +1504 -0
  703. package/extensions/dm-lens/dist/clients/test-runner-delivery.js +260 -0
  704. package/extensions/dm-lens/dist/clients/todo-scanner.js +164 -0
  705. package/extensions/dm-lens/dist/clients/tool-agreement.js +377 -0
  706. package/extensions/dm-lens/dist/clients/tool-config.js +218 -0
  707. package/extensions/dm-lens/dist/clients/tool-cwd.js +235 -0
  708. package/extensions/dm-lens/dist/clients/tool-definition.js +22 -0
  709. package/extensions/dm-lens/dist/clients/tool-event.js +18 -0
  710. package/extensions/dm-lens/dist/clients/tool-policy.js +2393 -0
  711. package/extensions/dm-lens/dist/clients/tool-probe.js +5 -0
  712. package/extensions/dm-lens/dist/clients/tool-render.js +79 -0
  713. package/extensions/dm-lens/dist/clients/tool-set-policy.js +70 -0
  714. package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +206 -0
  715. package/extensions/dm-lens/dist/clients/tree-sitter-client.js +2787 -0
  716. package/extensions/dm-lens/dist/clients/tree-sitter-logger.js +77 -0
  717. package/extensions/dm-lens/dist/clients/tree-sitter-navigator.js +198 -0
  718. package/extensions/dm-lens/dist/clients/tree-sitter-query-loader.js +318 -0
  719. package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +87 -0
  720. package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +957 -0
  721. package/extensions/dm-lens/dist/clients/trivy-client.js +305 -0
  722. package/extensions/dm-lens/dist/clients/tui-fit.js +26 -0
  723. package/extensions/dm-lens/dist/clients/turn-context.js +48 -0
  724. package/extensions/dm-lens/dist/clients/turn-end/lane.js +1 -0
  725. package/extensions/dm-lens/dist/clients/turn-end/lanes/govulncheck.js +54 -0
  726. package/extensions/dm-lens/dist/clients/turn-end/lanes/secrets.js +131 -0
  727. package/extensions/dm-lens/dist/clients/turn-summary-render.js +56 -0
  728. package/extensions/dm-lens/dist/clients/turn-summary.js +84 -0
  729. package/extensions/dm-lens/dist/clients/typos-config.js +9 -0
  730. package/extensions/dm-lens/dist/clients/user-notify.js +15 -0
  731. package/extensions/dm-lens/dist/clients/vanished-instance-marker.js +18 -0
  732. package/extensions/dm-lens/dist/clients/warm-attach.js +210 -0
  733. package/extensions/dm-lens/dist/clients/widget-state.js +963 -0
  734. package/extensions/dm-lens/dist/clients/word-index-logger.js +21 -0
  735. package/extensions/dm-lens/dist/clients/word-index-store.js +222 -0
  736. package/extensions/dm-lens/dist/clients/word-index.js +1426 -0
  737. package/extensions/dm-lens/dist/clients/workspace-topology.js +261 -0
  738. package/extensions/dm-lens/dist/clients/write-ordering-guard.js +24 -0
  739. package/extensions/dm-lens/dist/clients/zizmor-config.js +160 -0
  740. package/extensions/dm-lens/dist/i18n.js +67 -0
  741. package/extensions/dm-lens/dist/index.js +1782 -0
  742. package/extensions/dm-lens/dist/mcp/analyze-cli.js +178 -0
  743. package/extensions/dm-lens/dist/mcp/build-staleness.js +55 -0
  744. package/extensions/dm-lens/dist/mcp/cli.js +78 -0
  745. package/extensions/dm-lens/dist/mcp/server.js +1208 -0
  746. package/extensions/dm-lens/dist/mcp/worker.js +33 -0
  747. package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +256 -0
  748. package/extensions/dm-lens/dist/scripts/lib/skills-predicate.mjs +53 -0
  749. package/extensions/dm-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +45 -0
  750. package/extensions/dm-lens/dist/tools/activate-tools.js +61 -0
  751. package/extensions/dm-lens/dist/tools/ast-grep-outline.js +127 -0
  752. package/extensions/dm-lens/dist/tools/ast-grep-replace.js +226 -0
  753. package/extensions/dm-lens/dist/tools/ast-grep-search.js +687 -0
  754. package/extensions/dm-lens/dist/tools/effective-config.js +59 -0
  755. package/extensions/dm-lens/dist/tools/lens-diagnostic-mark.js +240 -0
  756. package/extensions/dm-lens/dist/tools/lens-diagnostics.js +1484 -0
  757. package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +1088 -0
  758. package/extensions/dm-lens/dist/tools/lsp-navigation.js +1194 -0
  759. package/extensions/dm-lens/dist/tools/lsp-structured-output.js +277 -0
  760. package/extensions/dm-lens/dist/tools/module-report.js +332 -0
  761. package/extensions/dm-lens/dist/tools/project-report.js +72 -0
  762. package/extensions/dm-lens/dist/tools/render-compact.js +272 -0
  763. package/extensions/dm-lens/dist/tools/scan-progress.js +31 -0
  764. package/extensions/dm-lens/dist/tools/shared.js +26 -0
  765. package/extensions/dm-lens/dist/tools/symbol-search.js +133 -0
  766. package/extensions/dm-lens/index.js +278 -101
  767. package/extensions/dm-lens/mcp/analyze-cli.js +3 -2
  768. package/extensions/dm-lens/mcp/build-staleness.js +1 -1
  769. package/extensions/dm-lens/mcp/server.js +144 -73
  770. package/extensions/dm-lens/package.json +4 -4
  771. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
  772. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
  773. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
  774. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
  775. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
  776. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
  777. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
  778. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
  779. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
  780. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
  781. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
  782. package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
  783. package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
  784. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-cross-language-method.yml +3 -3
  785. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-hallucinated-import.yml +2 -2
  786. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-sql-injection.yml +12 -2
  787. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
  788. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/sql-injection.yml +23 -7
  789. package/extensions/dm-lens/rules/typos/_typos.toml +4 -2
  790. package/extensions/dm-lens/scripts/lib/process-scan.mjs +1 -1
  791. package/extensions/dm-lens/scripts/lib/skills-predicate.mjs +53 -0
  792. package/extensions/dm-lens/scripts/lib/web-tree-sitter-dir.mjs +45 -0
  793. package/extensions/dm-lens/skills/pi-lens-ast-grep/SKILL.md +23 -6
  794. package/extensions/dm-lens/skills/pi-lens-lsp-navigation/SKILL.md +26 -9
  795. package/extensions/dm-lens/tools/activate-tools.js +10 -7
  796. package/extensions/dm-lens/tools/ast-grep-outline.js +2 -6
  797. package/extensions/dm-lens/tools/ast-grep-replace.js +5 -16
  798. package/extensions/dm-lens/tools/ast-grep-search.js +83 -38
  799. package/extensions/dm-lens/tools/effective-config.js +5 -4
  800. package/extensions/dm-lens/tools/lens-diagnostic-mark.js +5 -3
  801. package/extensions/dm-lens/tools/lens-diagnostics.js +478 -106
  802. package/extensions/dm-lens/tools/lsp-diagnostics.js +317 -172
  803. package/extensions/dm-lens/tools/lsp-navigation.js +26 -56
  804. package/extensions/dm-lens/tools/lsp-structured-output.js +3 -3
  805. package/extensions/dm-lens/tools/module-report.js +5 -5
  806. package/extensions/dm-lens/tools/project-report.js +9 -15
  807. package/extensions/dm-lens/tools/render-compact.js +220 -1
  808. package/extensions/dm-lens/tools/symbol-search.js +3 -5
  809. package/extensions/dm-mcp-adapter/OAUTH.md +368 -2
  810. package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +1 -1
  811. package/extensions/dm-mcp-adapter/agent-plugin-loader.js +73 -30
  812. package/extensions/dm-mcp-adapter/agent-plugin-provenance.js +26 -0
  813. package/extensions/dm-mcp-adapter/bearer-command-resolver.js +182 -0
  814. package/extensions/dm-mcp-adapter/claude-plugin-loader.js +350 -0
  815. package/extensions/dm-mcp-adapter/cli.js +82 -5
  816. package/extensions/dm-mcp-adapter/commands.js +89 -15
  817. package/extensions/dm-mcp-adapter/config.js +283 -33
  818. package/extensions/dm-mcp-adapter/consent-manager.js +32 -8
  819. package/extensions/dm-mcp-adapter/direct-tool-surface.js +223 -0
  820. package/extensions/dm-mcp-adapter/direct-tools.js +21 -216
  821. package/extensions/dm-mcp-adapter/dist/abort.js +35 -0
  822. package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +73 -30
  823. package/extensions/dm-mcp-adapter/dist/agent-plugin-provenance.js +26 -0
  824. package/extensions/dm-mcp-adapter/dist/bearer-command-resolver.js +182 -0
  825. package/extensions/dm-mcp-adapter/dist/claude-plugin-loader.js +350 -0
  826. package/extensions/dm-mcp-adapter/dist/config.js +283 -33
  827. package/extensions/dm-mcp-adapter/dist/consent-manager.js +84 -0
  828. package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +308 -0
  829. package/extensions/dm-mcp-adapter/dist/errors.js +225 -0
  830. package/extensions/dm-mcp-adapter/dist/http-ca.js +71 -0
  831. package/extensions/dm-mcp-adapter/dist/jev-client.js +359 -0
  832. package/extensions/dm-mcp-adapter/dist/jev-contracts.js +1 -0
  833. package/extensions/dm-mcp-adapter/dist/jev-key-store.js +176 -0
  834. package/extensions/dm-mcp-adapter/dist/json-schema-validator.js +70 -0
  835. package/extensions/dm-mcp-adapter/dist/lifecycle.js +387 -0
  836. package/extensions/dm-mcp-adapter/dist/logger.js +115 -0
  837. package/extensions/dm-mcp-adapter/dist/mcp-auth-fetch.js +86 -0
  838. package/extensions/dm-mcp-adapter/dist/mcp-auth-flow.js +949 -0
  839. package/extensions/dm-mcp-adapter/dist/mcp-auth.js +997 -0
  840. package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +7 -136
  841. package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +381 -0
  842. package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +524 -0
  843. package/extensions/dm-mcp-adapter/dist/mcp-probe.js +151 -0
  844. package/extensions/dm-mcp-adapter/dist/mcp-tasks.js +300 -0
  845. package/extensions/dm-mcp-adapter/dist/mcp-trace.js +215 -0
  846. package/extensions/dm-mcp-adapter/dist/metadata-cache.js +10 -28
  847. package/extensions/dm-mcp-adapter/dist/npx-resolver.js +465 -0
  848. package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +5 -16
  849. package/extensions/dm-mcp-adapter/dist/request-headers-command.js +294 -0
  850. package/extensions/dm-mcp-adapter/dist/runtime-owner.js +94 -0
  851. package/extensions/dm-mcp-adapter/dist/sampling-handler.js +213 -0
  852. package/extensions/dm-mcp-adapter/dist/secure-keyring.js +191 -0
  853. package/extensions/dm-mcp-adapter/dist/server-manager.js +1514 -0
  854. package/extensions/dm-mcp-adapter/dist/session-approvals.js +127 -0
  855. package/extensions/dm-mcp-adapter/dist/session-recovery.js +82 -0
  856. package/extensions/dm-mcp-adapter/dist/state.js +1 -0
  857. package/extensions/dm-mcp-adapter/dist/types.js +39 -0
  858. package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +204 -0
  859. package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +83 -0
  860. package/extensions/dm-mcp-adapter/dist/utils.js +84 -9
  861. package/extensions/dm-mcp-adapter/elicitation-handler.js +27 -22
  862. package/extensions/dm-mcp-adapter/host-html-template.js +17 -18
  863. package/extensions/dm-mcp-adapter/http-ca.js +71 -0
  864. package/extensions/dm-mcp-adapter/index.js +904 -167
  865. package/extensions/dm-mcp-adapter/init.js +53 -42
  866. package/extensions/dm-mcp-adapter/jev-client.js +359 -0
  867. package/extensions/dm-mcp-adapter/jev-contracts.js +0 -0
  868. package/extensions/dm-mcp-adapter/jev-key-store.js +176 -0
  869. package/extensions/dm-mcp-adapter/json-schema-validator.js +19 -2
  870. package/extensions/dm-mcp-adapter/lazy-loader.js +7 -0
  871. package/extensions/dm-mcp-adapter/lifecycle.js +8 -3
  872. package/extensions/dm-mcp-adapter/mcp-auth-fetch.js +86 -0
  873. package/extensions/dm-mcp-adapter/mcp-auth-flow.js +228 -75
  874. package/extensions/dm-mcp-adapter/mcp-auth.js +312 -47
  875. package/extensions/dm-mcp-adapter/mcp-bearer-store.js +7 -136
  876. package/extensions/dm-mcp-adapter/mcp-code.js +151 -20
  877. package/extensions/dm-mcp-adapter/mcp-install.js +40 -0
  878. package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +52 -8
  879. package/extensions/dm-mcp-adapter/mcp-output-guard.js +42 -43
  880. package/extensions/dm-mcp-adapter/mcp-panel-theme.js +79 -0
  881. package/extensions/dm-mcp-adapter/mcp-panel.js +294 -286
  882. package/extensions/dm-mcp-adapter/mcp-references.js +13 -18
  883. package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +5 -1
  884. package/extensions/dm-mcp-adapter/mcp-setup-panel.js +317 -282
  885. package/extensions/dm-mcp-adapter/mcp-status.js +2 -0
  886. package/extensions/dm-mcp-adapter/mcp-tasks.js +309 -0
  887. package/extensions/dm-mcp-adapter/metadata-cache.js +11 -28
  888. package/extensions/dm-mcp-adapter/namespace-tools.js +43 -7
  889. package/extensions/dm-mcp-adapter/oauth.js +1 -1
  890. package/extensions/dm-mcp-adapter/package-mcp-loader.js +5 -16
  891. package/extensions/dm-mcp-adapter/package.json +4 -1
  892. package/extensions/dm-mcp-adapter/prompts.js +31 -4
  893. package/extensions/dm-mcp-adapter/proxy-modes.js +394 -199
  894. package/extensions/dm-mcp-adapter/request-headers-command.js +3 -2
  895. package/extensions/dm-mcp-adapter/runtime-owner.js +16 -1
  896. package/extensions/dm-mcp-adapter/sampling-handler.js +16 -25
  897. package/extensions/dm-mcp-adapter/sandbox-proxy-template.js +14 -90
  898. package/extensions/dm-mcp-adapter/search-ranking.js +31 -6
  899. package/extensions/dm-mcp-adapter/secure-keyring.js +191 -0
  900. package/extensions/dm-mcp-adapter/semantic-search.js +160 -0
  901. package/extensions/dm-mcp-adapter/server-manager.js +406 -117
  902. package/extensions/dm-mcp-adapter/session-approvals.js +127 -0
  903. package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +11 -1
  904. package/extensions/dm-mcp-adapter/test-runner.mjs +3 -4
  905. package/extensions/dm-mcp-adapter/tool-approval.js +32 -22
  906. package/extensions/dm-mcp-adapter/tool-metadata.js +18 -11
  907. package/extensions/dm-mcp-adapter/tool-registrar.js +7 -4
  908. package/extensions/dm-mcp-adapter/tool-result-renderer.js +4 -2
  909. package/extensions/dm-mcp-adapter/types.js +39 -0
  910. package/extensions/dm-mcp-adapter/ui-server.js +51 -36
  911. package/extensions/dm-mcp-adapter/ui-session.js +57 -25
  912. package/extensions/dm-mcp-adapter/utils.js +84 -9
  913. package/extensions/dm-ponytail/hooks/cursor-hooks.json +17 -0
  914. package/extensions/dm-ponytail/hooks/ponytail-activate.js +14 -2
  915. package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +21 -2
  916. package/extensions/dm-ponytail/hooks/ponytail-runtime.js +23 -0
  917. package/extensions/dm-ponytail/package.json +1 -1
  918. package/extensions/dm-subagents/agents/claude-code-writer.md +1 -0
  919. package/extensions/dm-subagents/agents/codex-exec-writer.md +1 -0
  920. package/extensions/dm-subagents/agents/cursor-agent-writer.md +1 -0
  921. package/extensions/dm-subagents/agents/evidence-auditor.md +34 -0
  922. package/extensions/dm-subagents/agents/researcher.md +23 -13
  923. package/extensions/dm-subagents/agents/reviewer.md +6 -4
  924. package/extensions/dm-subagents/agents/scout.md +1 -1
  925. package/extensions/dm-subagents/agents/worker.md +3 -2
  926. package/extensions/dm-subagents/index.js +3 -2
  927. package/extensions/dm-subagents/inspector-runner.mjs +2 -2
  928. package/extensions/dm-subagents/install.mjs +1 -2
  929. package/extensions/dm-subagents/package.json +35 -1
  930. package/extensions/dm-subagents/prompts/council.md +6 -3
  931. package/extensions/dm-subagents/prompts/parallel-review.md +1 -1
  932. package/extensions/dm-subagents/runner-peer-loader.mjs +18 -0
  933. package/extensions/dm-subagents/runner-peer-preload.mjs +29 -0
  934. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +35 -22
  935. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +9 -5
  936. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +40 -19
  937. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +6 -6
  938. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +11 -1
  939. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +35 -30
  940. package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +3 -3
  941. package/extensions/dm-subagents/src/agents/advertised-agent-prompt.js +70 -0
  942. package/extensions/dm-subagents/src/agents/agent-management.js +276 -172
  943. package/extensions/dm-subagents/src/agents/agent-memory.js +92 -3
  944. package/extensions/dm-subagents/src/agents/agent-serializer.js +17 -8
  945. package/extensions/dm-subagents/src/agents/agents.js +389 -207
  946. package/extensions/dm-subagents/src/agents/builtin-names.js +1 -0
  947. package/extensions/dm-subagents/src/agents/chain-serializer.js +7 -0
  948. package/extensions/dm-subagents/src/agents/global-npm-root.js +47 -0
  949. package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -1
  950. package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +17 -13
  951. package/extensions/dm-subagents/src/agents/skills.js +36 -10
  952. package/extensions/dm-subagents/src/api/capability-ceiling.js +0 -1
  953. package/extensions/dm-subagents/src/api/child-tool-plan.js +3 -0
  954. package/extensions/dm-subagents/src/api/preflight.js +75 -64
  955. package/extensions/dm-subagents/src/api/required-child-extensions.js +3 -0
  956. package/extensions/dm-subagents/src/api/workflow-resources.js +1 -0
  957. package/extensions/dm-subagents/src/extension/config.js +27 -18
  958. package/extensions/dm-subagents/src/extension/doctor.js +10 -13
  959. package/extensions/dm-subagents/src/extension/fanout-child.js +91 -14
  960. package/extensions/dm-subagents/src/extension/herdr-dm-bridge.js +258 -0
  961. package/extensions/dm-subagents/src/extension/index.js +202 -66
  962. package/extensions/dm-subagents/src/extension/public-execution.js +55 -4
  963. package/extensions/dm-subagents/src/extension/rpc.js +18 -27
  964. package/extensions/dm-subagents/src/extension/schemas.js +99 -84
  965. package/extensions/dm-subagents/src/extension/subagent-guide.js +14 -3
  966. package/extensions/dm-subagents/src/extension/tool-activation.js +157 -0
  967. package/extensions/dm-subagents/src/extension/tool-description.js +30 -78
  968. package/extensions/dm-subagents/src/inspectors/actions.js +145 -0
  969. package/extensions/dm-subagents/src/inspectors/ghostty/actions.js +60 -0
  970. package/extensions/dm-subagents/src/inspectors/ghostty/plugin.js +17 -0
  971. package/extensions/dm-subagents/src/inspectors/herdr/actions.js +94 -179
  972. package/extensions/dm-subagents/src/inspectors/herdr/plugin.js +13 -0
  973. package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +1 -1
  974. package/extensions/dm-subagents/src/inspectors/{herdr/inspector-runner.js → inspector-runner.js} +31 -25
  975. package/extensions/dm-subagents/src/inspectors/plugins.js +5 -0
  976. package/extensions/dm-subagents/src/inspectors/{herdr/session-roots-codec.js → session-roots-codec.js} +1 -6
  977. package/extensions/dm-subagents/src/inspectors/types.js +1 -0
  978. package/extensions/dm-subagents/src/integrations/dm-web-session-liveness.js +50 -0
  979. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +39 -5
  980. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +256 -151
  981. package/extensions/dm-subagents/src/intercom/result-intercom.js +6 -0
  982. package/extensions/dm-subagents/src/intercom/supervisor-ui.js +199 -0
  983. package/extensions/dm-subagents/src/missions/workflow-state.js +30 -17
  984. package/extensions/dm-subagents/src/policy/authority.js +6 -2
  985. package/extensions/dm-subagents/src/profiles/profiles.js +10 -5
  986. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +28 -35
  987. package/extensions/dm-subagents/src/runs/background/active-run-index.js +17 -0
  988. package/extensions/dm-subagents/src/runs/background/async-execution.js +580 -389
  989. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +71 -47
  990. package/extensions/dm-subagents/src/runs/background/async-resume.js +61 -26
  991. package/extensions/dm-subagents/src/runs/background/async-retention.js +8 -0
  992. package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +3 -4
  993. package/extensions/dm-subagents/src/runs/background/async-status.js +90 -13
  994. package/extensions/dm-subagents/src/runs/background/auto-drain.js +57 -33
  995. package/extensions/dm-subagents/src/runs/background/binary-bootstrap.js +54 -0
  996. package/extensions/dm-subagents/src/runs/background/chain-append.js +1 -1
  997. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +11 -27
  998. package/extensions/dm-subagents/src/runs/background/control-channel.js +105 -256
  999. package/extensions/dm-subagents/src/runs/background/fleet-view.js +67 -10
  1000. package/extensions/dm-subagents/src/runs/background/notify.js +252 -17
  1001. package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +33 -2
  1002. package/extensions/dm-subagents/src/runs/background/process-terminal-candidate.js +88 -0
  1003. package/extensions/dm-subagents/src/runs/background/process-terminal.js +29 -87
  1004. package/extensions/dm-subagents/src/runs/background/result-files.js +8 -4
  1005. package/extensions/dm-subagents/src/runs/background/result-watcher.js +15 -3
  1006. package/extensions/dm-subagents/src/runs/background/retained-children.js +3 -2
  1007. package/extensions/dm-subagents/src/runs/background/retained-nested-route-tracker.js +86 -0
  1008. package/extensions/dm-subagents/src/runs/background/run-child-session.js +574 -0
  1009. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +9 -5
  1010. package/extensions/dm-subagents/src/runs/background/run-status.js +114 -11
  1011. package/extensions/dm-subagents/src/runs/background/runner-aliases.js +129 -0
  1012. package/extensions/dm-subagents/src/runs/background/runner-child-launch.js +62 -0
  1013. package/extensions/dm-subagents/src/runs/background/runner-child-sessions.js +16 -0
  1014. package/extensions/dm-subagents/src/runs/background/runner-http-dispatcher.js +84 -0
  1015. package/extensions/dm-subagents/src/runs/background/runner-startup-failure.js +43 -0
  1016. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +119 -20
  1017. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +33 -10
  1018. package/extensions/dm-subagents/src/runs/background/steering.js +24 -3
  1019. package/extensions/dm-subagents/src/runs/background/subagent-runner-bootstrap.js +238 -0
  1020. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +1008 -1344
  1021. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +156 -26
  1022. package/extensions/dm-subagents/src/runs/background/wait-completions.js +91 -23
  1023. package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +10 -3
  1024. package/extensions/dm-subagents/src/runs/background/wait-tool.js +8 -12
  1025. package/extensions/dm-subagents/src/runs/background/workflow-terminal-proof.js +60 -0
  1026. package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +29 -26
  1027. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +94 -2
  1028. package/extensions/dm-subagents/src/runs/foreground/execution.js +446 -648
  1029. package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +4 -0
  1030. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +5 -2
  1031. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +8 -4
  1032. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +1337 -445
  1033. package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +10 -5
  1034. package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +65 -90
  1035. package/extensions/dm-subagents/src/runs/shared/acceptance.js +265 -68
  1036. package/extensions/dm-subagents/src/runs/shared/agent-contract.js +1 -1
  1037. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +133 -76
  1038. package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +4 -2
  1039. package/extensions/dm-subagents/src/runs/shared/child-hooks.js +166 -0
  1040. package/extensions/dm-subagents/src/runs/shared/child-identity.js +10 -2
  1041. package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +19 -2
  1042. package/extensions/dm-subagents/src/runs/shared/child-launch.js +212 -0
  1043. package/extensions/dm-subagents/src/runs/shared/child-lifecycle.js +22 -0
  1044. package/extensions/dm-subagents/src/runs/shared/child-runtime-config.js +31 -0
  1045. package/extensions/dm-subagents/src/runs/shared/child-session.js +378 -0
  1046. package/extensions/dm-subagents/src/runs/shared/child-tool-plan.js +299 -0
  1047. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +1 -1
  1048. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +148 -32
  1049. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +6 -4
  1050. package/extensions/dm-subagents/src/runs/shared/effective-system-prompt.js +19 -0
  1051. package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +6 -1
  1052. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +14 -2
  1053. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +6 -7
  1054. package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +60 -0
  1055. package/extensions/dm-subagents/src/runs/shared/git-environment.js +25 -0
  1056. package/extensions/dm-subagents/src/runs/shared/herdr-connection.js +341 -0
  1057. package/extensions/dm-subagents/src/runs/shared/herdr-dm-protocol.js +60 -0
  1058. package/extensions/dm-subagents/src/runs/shared/herdr-external-adapters.js +555 -0
  1059. package/extensions/dm-subagents/src/runs/shared/herdr-machine.js +239 -0
  1060. package/extensions/dm-subagents/src/runs/shared/herdr-placed-run.js +987 -0
  1061. package/extensions/dm-subagents/src/runs/shared/host-step-status.js +2 -0
  1062. package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +23 -3
  1063. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +4 -3
  1064. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +15 -5
  1065. package/extensions/dm-subagents/src/runs/shared/model-resolution-diagnostic.js +43 -0
  1066. package/extensions/dm-subagents/src/runs/shared/{model-fallback.js → model-resolution.js} +44 -128
  1067. package/extensions/dm-subagents/src/runs/shared/nested-events.js +39 -49
  1068. package/extensions/dm-subagents/src/runs/shared/nested-path.js +0 -13
  1069. package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +22 -12
  1070. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +78 -2
  1071. package/extensions/dm-subagents/src/runs/shared/permissions.js +1 -16
  1072. package/extensions/dm-subagents/src/runs/shared/process-signal.js +3 -0
  1073. package/extensions/dm-subagents/src/runs/shared/readonly-drain-observation.js +51 -0
  1074. package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +0 -13
  1075. package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +0 -26
  1076. package/extensions/dm-subagents/src/runs/shared/single-output.js +20 -2
  1077. package/extensions/dm-subagents/src/runs/shared/structured-output.js +263 -10
  1078. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +6 -14
  1079. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +117 -370
  1080. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +12 -50
  1081. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +10 -13
  1082. package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +1 -1
  1083. package/extensions/dm-subagents/src/runs/shared/usage-reconciliation.js +69 -0
  1084. package/extensions/dm-subagents/src/runs/shared/workflow-async-child-guidance.js +11 -0
  1085. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +30 -10
  1086. package/extensions/dm-subagents/src/runs/shared/worktree-setup-command.js +195 -0
  1087. package/extensions/dm-subagents/src/runs/shared/worktree.js +814 -141
  1088. package/extensions/dm-subagents/src/shared/atomic-json.js +2 -1
  1089. package/extensions/dm-subagents/src/shared/child-cache-retention.js +19 -0
  1090. package/extensions/dm-subagents/src/shared/fork-context.js +40 -77
  1091. package/extensions/dm-subagents/src/shared/fork-session-cwd.js +24 -0
  1092. package/extensions/dm-subagents/src/shared/jsonl-writer.js +8 -0
  1093. package/extensions/dm-subagents/src/shared/launch-contract.js +37 -6
  1094. package/extensions/dm-subagents/src/shared/model-response-aliases.js +15 -0
  1095. package/extensions/dm-subagents/src/shared/opencode-session-headers.js +15 -0
  1096. package/extensions/dm-subagents/src/shared/pruned-fork.js +83 -76
  1097. package/extensions/dm-subagents/src/shared/required-child-extensions.js +72 -0
  1098. package/extensions/dm-subagents/src/shared/shortcuts.js +0 -2
  1099. package/extensions/dm-subagents/src/shared/thinking-ceiling.js +0 -6
  1100. package/extensions/dm-subagents/src/shared/types.js +16 -12
  1101. package/extensions/dm-subagents/src/shared/utils.js +22 -7
  1102. package/extensions/dm-subagents/src/shared/watch-strategy.js +2 -0
  1103. package/extensions/dm-subagents/src/shared/workflow-child-permit.js +70 -0
  1104. package/extensions/dm-subagents/src/slash/delegation-adapters.js +15 -1
  1105. package/extensions/dm-subagents/src/slash/delegation-request.js +13 -0
  1106. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +28 -1
  1107. package/extensions/dm-subagents/src/slash/prompt-workflows.js +15 -2
  1108. package/extensions/dm-subagents/src/slash/slash-commands.js +12 -269
  1109. package/extensions/dm-subagents/src/slash/subagent-cost.js +255 -0
  1110. package/extensions/dm-subagents/src/slash/subagents-admin.js +49 -25
  1111. package/extensions/dm-subagents/src/tui/fleet-status.js +224 -23
  1112. package/extensions/dm-subagents/src/tui/fleet.js +38 -25
  1113. package/extensions/dm-subagents/src/tui/render.js +636 -63
  1114. package/extensions/dm-subagents/src/watchdog/child-status.js +42 -23
  1115. package/extensions/dm-subagents/src/watchdog/diff-tool.js +86 -0
  1116. package/extensions/dm-subagents/src/watchdog/emission-guard.js +4 -3
  1117. package/extensions/dm-subagents/src/watchdog/guidance.js +19 -0
  1118. package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +1 -1
  1119. package/extensions/dm-subagents/src/watchdog/model-selection.js +18 -1
  1120. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +16 -10
  1121. package/extensions/dm-subagents/src/watchdog/register-child.js +39 -26
  1122. package/extensions/dm-subagents/src/watchdog/register-main.js +51 -43
  1123. package/extensions/dm-subagents/src/watchdog/render.js +5 -7
  1124. package/extensions/dm-subagents/src/watchdog/review.js +142 -67
  1125. package/extensions/dm-subagents/src/watchdog/rules.js +55 -0
  1126. package/extensions/dm-subagents/src/watchdog/runtime.js +167 -109
  1127. package/extensions/dm-subagents/src/watchdog/scope.js +1 -9
  1128. package/extensions/dm-subagents/src/watchdog/settings.js +55 -99
  1129. package/extensions/dm-subagents/src/watchdog/tool-actions.js +11 -12
  1130. package/extensions/dm-subagents/src/watchdog/turn-delta.js +30 -5
  1131. package/extensions/dm-subagents/src/watchdog/types.js +2 -4
  1132. package/extensions/dm-subagents/src/watchdog/warning-format.js +2 -3
  1133. package/extensions/dm-subagents/src/workflows/chat-progress.js +4 -4
  1134. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +482 -36
  1135. package/extensions/dm-subagents/src/workflows/workflow-checklist.js +303 -0
  1136. package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +57 -5
  1137. package/extensions/dm-subagents/src/workflows/workflow-preflight.js +27 -1
  1138. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +51 -3
  1139. package/extensions/dm-subagents/src/workflows/workflow-resources.js +226 -0
  1140. package/extensions/dm-subagents/src/workflows/workflow-settlement.js +5 -0
  1141. package/extensions/dm-web-access/abortable.js +19 -0
  1142. package/extensions/dm-web-access/anysearch.js +4 -13
  1143. package/extensions/dm-web-access/baizhi.js +123 -0
  1144. package/extensions/dm-web-access/bocha.js +3 -24
  1145. package/extensions/dm-web-access/brave.js +3 -23
  1146. package/extensions/dm-web-access/brightdata.js +5 -30
  1147. package/extensions/dm-web-access/content-find.js +181 -47
  1148. package/extensions/dm-web-access/crawl4ai.js +166 -0
  1149. package/extensions/dm-web-access/credential-source.js +1 -0
  1150. package/extensions/dm-web-access/curator-page.js +27 -2
  1151. package/extensions/dm-web-access/curator-run.js +36 -0
  1152. package/extensions/dm-web-access/curator-server.js +11 -2
  1153. package/extensions/dm-web-access/domain-filter-normalization.js +17 -0
  1154. package/extensions/dm-web-access/duckduckgo.js +4 -24
  1155. package/extensions/dm-web-access/extract.js +54 -12
  1156. package/extensions/dm-web-access/fetch-params.js +1 -1
  1157. package/extensions/dm-web-access/firecrawl.js +7 -45
  1158. package/extensions/dm-web-access/gemini-search.js +101 -46
  1159. package/extensions/dm-web-access/github-extract.js +2 -11
  1160. package/extensions/dm-web-access/index.js +382 -247
  1161. package/extensions/dm-web-access/jina-search.js +4 -13
  1162. package/extensions/dm-web-access/kagi.js +4 -13
  1163. package/extensions/dm-web-access/kimi-search.js +5 -30
  1164. package/extensions/dm-web-access/mistral-search.js +251 -0
  1165. package/extensions/dm-web-access/ollama.js +2 -7
  1166. package/extensions/dm-web-access/openai-search.js +204 -46
  1167. package/extensions/dm-web-access/opencode-session-headers.js +15 -0
  1168. package/extensions/dm-web-access/package.json +1 -1
  1169. package/extensions/dm-web-access/page-query.js +14 -4
  1170. package/extensions/dm-web-access/parallel.js +1 -17
  1171. package/extensions/dm-web-access/pdf-extract.js +1 -0
  1172. package/extensions/dm-web-access/perplexity.js +10 -1
  1173. package/extensions/dm-web-access/querit.js +5 -34
  1174. package/extensions/dm-web-access/query-rewrite.js +6 -2
  1175. package/extensions/dm-web-access/search-answer-formatting.js +6 -0
  1176. package/extensions/dm-web-access/search-result-count-normalization.js +5 -0
  1177. package/extensions/dm-web-access/search1api.js +5 -34
  1178. package/extensions/dm-web-access/searchinfinity.js +5 -34
  1179. package/extensions/dm-web-access/searxng.js +3 -23
  1180. package/extensions/dm-web-access/serpapi.js +183 -0
  1181. package/extensions/dm-web-access/serpbase.js +3 -24
  1182. package/extensions/dm-web-access/serpdive.js +3 -23
  1183. package/extensions/dm-web-access/serper.js +5 -30
  1184. package/extensions/dm-web-access/serply.js +184 -0
  1185. package/extensions/dm-web-access/source-check.js +10 -46
  1186. package/extensions/dm-web-access/ssrf-protection.js +3 -1
  1187. package/extensions/dm-web-access/storage.js +9 -0
  1188. package/extensions/dm-web-access/summary-review.js +36 -25
  1189. package/extensions/dm-web-access/tavily.js +3 -23
  1190. package/extensions/dm-web-access/tinyfish.js +5 -34
  1191. package/extensions/dm-web-access/tool-activation.js +112 -0
  1192. package/extensions/dm-web-access/utils.js +27 -10
  1193. package/extensions/dm-web-access/valyu.js +5 -30
  1194. package/extensions/dm-web-access/xai-search.js +78 -42
  1195. package/extensions/dm-web-access/xcrawl.js +5 -30
  1196. package/package.json +7 -4
  1197. package/extensions/dm-lens/tools/ast-dump.js +0 -101
  1198. package/extensions/dm-subagents/src/api/dm-args.js +0 -3
  1199. package/extensions/dm-subagents/src/runs/shared/child-protocol.js +0 -447
  1200. package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +0 -40
  1201. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +0 -173
  1202. package/extensions/dm-subagents/src/runs/shared/dm-args.js +0 -581
  1203. package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +0 -190
  1204. package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +0 -207
  1205. package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +0 -50
  1206. package/extensions/dm-subagents/src/runs/shared/task-intent.js +0 -130
  1207. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +0 -68
  1208. /package/extensions/dm-subagents/src/inspectors/{herdr/shell-command.js → shell-command.js} +0 -0
@@ -1,14 +1,14 @@
1
1
  import { Box, Text, truncateToWidth } from "@duckmind/dm-tui";
2
2
  import { Type } from "typebox";
3
- import { StringEnum } from "@duckmind/dm-ai/compat";
3
+ import pLimit from "p-limit";
4
4
  import { normalizeFetchContentParams } from "./fetch-params.js";
5
5
  import { resolveAuthFetchProfile } from "./auth-fetch.js";
6
6
  import { findContent } from "./content-find.js";
7
7
  import { answerFromPage } from "./page-query.js";
8
8
  import { rewriteSearchQuery } from "./query-rewrite.js";
9
9
  import { clearCloneCache } from "./github-extract.js";
10
- import { ALL_SEARCH_PROVIDERS, getConfiguredSearchRouting, normalizeSearchProviderSelection, RESOLVED_SEARCH_PROVIDERS, SEARCH_PROVIDERS, search } from "./gemini-search.js";
11
- import { formatSeconds, getWebSearchConfigDir, getWebSearchConfigPath, installGlobalProxyFetch, resolveCuratorNetworkConfig, runWithProxy } from "./utils.js";
10
+ import { ALL_SEARCH_PROVIDERS, assertSearchProviderSelectionAllowed, getAllowedSearchProviders, getConfiguredSearchRouting, normalizeSearchProviderSelection, providerLabel, RESOLVED_SEARCH_PROVIDERS, search } from "./gemini-search.js";
11
+ import { formatSeconds, getWebSearchConfigDir, getWebSearchConfigPath, resolveCuratorNetworkConfig, runWithProxy } from "./utils.js";
12
12
  import {
13
13
  clearResults,
14
14
  deleteResult,
@@ -56,20 +56,34 @@ import { isSearXNGAvailable } from "./searxng.js";
56
56
  import { isDuckDuckGoAvailable } from "./duckduckgo.js";
57
57
  import { isAnySearchAvailable } from "./anysearch.js";
58
58
  import { isXaiSearchAvailable } from "./xai-search.js";
59
+ import { isMistralAvailable } from "./mistral-search.js";
59
60
  import { isKimiSearchAvailable } from "./kimi-search.js";
60
61
  import { isBrightDataAvailable } from "./brightdata.js";
61
62
  import { isSerpBaseAvailable } from "./serpbase.js";
63
+ import { isSerpApiAvailable } from "./serpapi.js";
62
64
  import { isSerperAvailable } from "./serper.js";
65
+ import { isSerplyAvailable } from "./serply.js";
66
+ import { isBaizhiAvailable } from "./baizhi.js";
63
67
  import { isValyuAvailable } from "./valyu.js";
64
68
  import { isXcrawlAvailable } from "./xcrawl.js";
65
69
  import { buildSearchErrorPlan } from "./render-search-error.js";
66
70
  import { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix } from "./summary-model-scope.js";
71
+ import { registerCuratorRunLifecycle, resolveWebSearchWorkflow } from "./curator-run.js";
67
72
  import {
68
73
  buildResearchArtifact,
69
74
  withClaimAssessment,
70
75
  storeResearchArtifact,
71
76
  getResearchArtifact
72
77
  } from "./source-check.js";
78
+ import { registerWebToolActivation } from "./tool-activation.js";
79
+ function StringEnum(values, options) {
80
+ return Type.Unsafe({
81
+ type: "string",
82
+ enum: values,
83
+ ...options?.description && { description: options.description },
84
+ ...options?.default && { default: options.default }
85
+ });
86
+ }
73
87
  const WEB_SEARCH_CONFIG_PATH = getWebSearchConfigPath();
74
88
  let extractModulePromise;
75
89
  async function fetchAllContent(urls, signal, options) {
@@ -143,10 +157,43 @@ const DEFAULT_CURATOR_TIMEOUT_SECONDS = 20;
143
157
  const DEFAULT_REMOTE_CURATOR_TIMEOUT_SECONDS = 60;
144
158
  const MAX_CURATOR_TIMEOUT_SECONDS = 600;
145
159
  const MAX_SUMMARY_GENERATION_DEADLINE_MS = 600000;
146
- function searchProviderSchema(description) {
160
+ const SEARCH_QUERY_CONCURRENCY = 3;
161
+ const FETCH_MODES = ["readable", "raw", "answer"];
162
+ const FETCH_MODE_DESCRIPTIONS = {
163
+ readable: "extract readable content as markdown",
164
+ raw: "return the exact textual body using direct HTTP only",
165
+ answer: "answer a prompt using only fetched content"
166
+ };
167
+ function resolveFetchModeConfig(config) {
168
+ const configuredModes = config.fetch?.allowedModes ?? FETCH_MODES;
169
+ if (!Array.isArray(configuredModes) || configuredModes.length === 0 || configuredModes.some((mode) => !FETCH_MODES.includes(mode))) {
170
+ throw new Error(`fetch.allowedModes in ${WEB_SEARCH_CONFIG_PATH} must be a non-empty array containing only "readable", "raw", or "answer"`);
171
+ }
172
+ const allowedModes = configuredModes;
173
+ const duplicateMode = allowedModes.find((mode, index) => allowedModes.indexOf(mode) !== index);
174
+ if (duplicateMode) {
175
+ throw new Error(`fetch.allowedModes in ${WEB_SEARCH_CONFIG_PATH} must not contain duplicates: "${duplicateMode}"`);
176
+ }
177
+ const defaultMode = config.fetch?.defaultMode ?? "readable";
178
+ if (!allowedModes.includes(defaultMode)) {
179
+ throw new Error(`fetch.defaultMode in ${WEB_SEARCH_CONFIG_PATH} must be one of fetch.allowedModes`);
180
+ }
181
+ return { defaultMode, allowedModes };
182
+ }
183
+ function runSearchQueries(queries, run) {
184
+ const limit = pLimit(SEARCH_QUERY_CONCURRENCY);
185
+ return Promise.all(queries.map((query, index) => limit(() => run(query, index))));
186
+ }
187
+ function curatorResultIndex(queryIndex, entryIndex, queryCount) {
188
+ return entryIndex * queryCount + queryIndex;
189
+ }
190
+ function curatorResultIndexCapacity(queryCount) {
191
+ return queryCount * RESOLVED_SEARCH_PROVIDERS.length;
192
+ }
193
+ function searchProviderSchema(description, allowedProviders) {
147
194
  return Type.Union([
148
- StringEnum([...SEARCH_PROVIDERS]),
149
- Type.Array(StringEnum([...RESOLVED_SEARCH_PROVIDERS]), { minItems: 1 })
195
+ StringEnum(["auto", "all", ...allowedProviders]),
196
+ Type.Array(StringEnum([...allowedProviders]), { minItems: 1 })
150
197
  ], { description });
151
198
  }
152
199
  function isToolEnabled(config, key) {
@@ -188,6 +235,8 @@ function resolveToolNames(config) {
188
235
  const seen = new Map;
189
236
  for (const key of registeredKeys) {
190
237
  const name = names[key];
238
+ if (name === "web_enable")
239
+ throw new Error(`toolNames.${key} in ${WEB_SEARCH_CONFIG_PATH} uses reserved loader name web_enable`);
191
240
  const previous = seen.get(name);
192
241
  if (previous)
193
242
  throw new Error(`toolNames.${key} duplicates toolNames.${previous} in ${WEB_SEARCH_CONFIG_PATH}`);
@@ -211,10 +260,14 @@ function normalizeProviderInput(value, label = "provider") {
211
260
  }
212
261
  function resolveRequestedProvider(requested) {
213
262
  const normalizedRequested = normalizeProviderInput(requested);
214
- if (normalizedRequested && normalizedRequested !== "auto")
263
+ if (normalizedRequested && normalizedRequested !== "auto") {
264
+ assertSearchProviderSelectionAllowed(normalizedRequested, "Requested provider");
215
265
  return normalizedRequested;
266
+ }
216
267
  const config = loadConfig();
217
- return normalizeProviderInput(config.searchProvider ?? config.provider, `provider in ${WEB_SEARCH_CONFIG_PATH}`) ?? "auto";
268
+ const provider = normalizeProviderInput(config.searchProvider ?? config.provider, `provider in ${WEB_SEARCH_CONFIG_PATH}`) ?? "auto";
269
+ assertSearchProviderSelectionAllowed(provider, `configured provider in ${WEB_SEARCH_CONFIG_PATH}`);
270
+ return provider;
218
271
  }
219
272
  function toCuratorProvider(provider) {
220
273
  if (Array.isArray(provider))
@@ -225,9 +278,7 @@ function resolveCuratorSearchProvider(requested, current) {
225
278
  const normalized = normalizeProviderInput(requested);
226
279
  if (!normalized || normalized === "auto")
227
280
  return current;
228
- if (normalized === "all" && Array.isArray(current))
229
- return current;
230
- return normalized;
281
+ return normalized === "all" && Array.isArray(current) ? current : normalized;
231
282
  }
232
283
  function normalizeRecencyFilter(value) {
233
284
  return value === "day" || value === "week" || value === "month" || value === "year" ? value : undefined;
@@ -240,16 +291,6 @@ function normalizeCuratorTimeoutSeconds(value) {
240
291
  return;
241
292
  return Math.min(normalized, MAX_CURATOR_TIMEOUT_SECONDS);
242
293
  }
243
- function resolveWorkflow(input, hasUI) {
244
- const normalized = typeof input === "string" ? input.trim().toLowerCase() : "";
245
- if (normalized === "auto-summary")
246
- return "auto-summary";
247
- if (!hasUI)
248
- return "none";
249
- if (normalized === "none")
250
- return "none";
251
- return "summary-review";
252
- }
253
294
  function normalizeQueryList(queryList) {
254
295
  const normalized = [];
255
296
  for (const query of queryList) {
@@ -297,41 +338,45 @@ function shouldAutoOpenCuratorBrowser(config) {
297
338
  return true;
298
339
  }
299
340
  async function getProviderAvailability(ctx) {
300
- const geminiWebAvail = await getOptionalGeminiWebAvailability();
301
- const geminiApiAvail = isGeminiApiAvailable();
341
+ const allowedProviders = new Set(getAllowedSearchProviders());
342
+ const geminiWebAvail = allowedProviders.has("gemini") ? await getOptionalGeminiWebAvailability() : null;
343
+ const geminiApiAvail = allowedProviders.has("gemini") && isGeminiApiAvailable();
302
344
  const providers = {
303
- openai: await isOpenAISearchAvailable(ctx),
304
- brave: isBraveAvailable(),
305
- parallel: isParallelAvailable(),
306
- "parallel-mcp": isParallelMcpAvailable(),
307
- tinyfish: isTinyFishAvailable(),
308
- search1api: isSearch1APIAvailable(),
309
- searchinfinity: isSearchinfinityAvailable(),
310
- querit: isQueritAvailable(),
311
- tavily: isTavilyAvailable(),
312
- firecrawl: isFirecrawlAvailable(),
313
- jina: isJinaSearchAvailable(),
314
- serpdive: isSerpdiveAvailable(),
315
- kagi: isKagiAvailable(),
316
- bocha: isBochaAvailable(),
317
- ollama: isOllamaAvailable(),
318
- searxng: isSearXNGAvailable(),
319
- duckduckgo: isDuckDuckGoAvailable(),
320
- perplexity: isPerplexityAvailable(),
321
- exa: isExaAvailable(),
345
+ openai: allowedProviders.has("openai") && await isOpenAISearchAvailable(ctx),
346
+ brave: allowedProviders.has("brave") && isBraveAvailable(),
347
+ parallel: allowedProviders.has("parallel") && isParallelAvailable(),
348
+ "parallel-mcp": allowedProviders.has("parallel-mcp") && isParallelMcpAvailable(),
349
+ tinyfish: allowedProviders.has("tinyfish") && isTinyFishAvailable(),
350
+ search1api: allowedProviders.has("search1api") && isSearch1APIAvailable(),
351
+ searchinfinity: allowedProviders.has("searchinfinity") && isSearchinfinityAvailable(),
352
+ querit: allowedProviders.has("querit") && isQueritAvailable(),
353
+ tavily: allowedProviders.has("tavily") && isTavilyAvailable(),
354
+ firecrawl: allowedProviders.has("firecrawl") && isFirecrawlAvailable(),
355
+ jina: allowedProviders.has("jina") && isJinaSearchAvailable(),
356
+ serpdive: allowedProviders.has("serpdive") && isSerpdiveAvailable(),
357
+ kagi: allowedProviders.has("kagi") && isKagiAvailable(),
358
+ bocha: allowedProviders.has("bocha") && isBochaAvailable(),
359
+ ollama: allowedProviders.has("ollama") && isOllamaAvailable(),
360
+ searxng: allowedProviders.has("searxng") && isSearXNGAvailable(),
361
+ duckduckgo: allowedProviders.has("duckduckgo") && isDuckDuckGoAvailable(),
362
+ perplexity: allowedProviders.has("perplexity") && isPerplexityAvailable(),
363
+ exa: allowedProviders.has("exa") && isExaAvailable(),
322
364
  gemini: geminiApiAvail || !!geminiWebAvail,
323
- kimi: await isKimiSearchAvailable(ctx),
324
- anysearch: isAnySearchAvailable(),
325
- xcrawl: isXcrawlAvailable(),
326
- xai: await isXaiSearchAvailable(ctx),
327
- brightdata: isBrightDataAvailable(),
328
- serpbase: isSerpBaseAvailable(),
329
- serper: isSerperAvailable(),
330
- valyu: isValyuAvailable()
365
+ kimi: allowedProviders.has("kimi") && await isKimiSearchAvailable(ctx),
366
+ anysearch: allowedProviders.has("anysearch") && isAnySearchAvailable(),
367
+ xcrawl: allowedProviders.has("xcrawl") && isXcrawlAvailable(),
368
+ xai: allowedProviders.has("xai") && await isXaiSearchAvailable(ctx),
369
+ mistral: allowedProviders.has("mistral") && isMistralAvailable(),
370
+ brightdata: allowedProviders.has("brightdata") && isBrightDataAvailable(),
371
+ serpbase: allowedProviders.has("serpbase") && isSerpBaseAvailable(),
372
+ serpapi: allowedProviders.has("serpapi") && isSerpApiAvailable(),
373
+ serper: allowedProviders.has("serper") && isSerperAvailable(),
374
+ serply: allowedProviders.has("serply") && isSerplyAvailable(),
375
+ baizhi: allowedProviders.has("baizhi") && isBaizhiAvailable(),
376
+ valyu: allowedProviders.has("valyu") && isValyuAvailable()
331
377
  };
332
- const allSearchProviders = new Set(ALL_SEARCH_PROVIDERS);
333
378
  return {
334
- all: Object.entries(providers).some(([provider, available]) => provider !== "gemini" && allSearchProviders.has(provider) && available) || geminiApiAvail,
379
+ all: ALL_SEARCH_PROVIDERS.some((provider) => provider === "gemini" ? geminiApiAvail : providers[provider]),
335
380
  ...providers
336
381
  };
337
382
  }
@@ -374,39 +419,14 @@ function firstAvailableProvider(available, preferOpenAI, fallback) {
374
419
  return "openai";
375
420
  if (available.exa)
376
421
  return "exa";
377
- if (available.openai)
378
- return "openai";
379
- if (available.brave)
380
- return "brave";
381
- if (available.parallel)
382
- return "parallel";
383
- if (available.tinyfish)
384
- return "tinyfish";
385
- if (available.search1api)
386
- return "search1api";
387
- if (available.searchinfinity)
388
- return "searchinfinity";
389
- if (available.querit)
390
- return "querit";
391
- if (available.tavily)
392
- return "tavily";
393
- if (available.firecrawl)
394
- return "firecrawl";
395
- if (available.jina)
396
- return "jina";
397
- if (available.serpdive)
398
- return "serpdive";
399
- if (available.kagi)
400
- return "kagi";
401
- if (available.bocha)
402
- return "bocha";
403
- if (available.ollama)
404
- return "ollama";
405
- if (available.perplexity)
406
- return "perplexity";
407
- if (available.gemini)
408
- return "gemini";
409
- return fallback;
422
+ for (const provider of ALL_SEARCH_PROVIDERS) {
423
+ if (provider === "ollama" && available.bocha)
424
+ return "bocha";
425
+ if (available[provider])
426
+ return provider;
427
+ }
428
+ const allowed = getAllowedSearchProviders();
429
+ return allowed.includes(fallback) ? fallback : "auto";
410
430
  }
411
431
  function resolveProvider(provider, available, options, preferOpenAICodexDefault = false, ctx) {
412
432
  if (Array.isArray(provider))
@@ -425,62 +445,11 @@ function resolveProvider(provider, available, options, preferOpenAICodexDefault
425
445
  }
426
446
  return firstAvailableProvider(available, preferOpenAI, "exa");
427
447
  }
428
- if (provider === "all" && !available.all) {
429
- return firstAvailableProvider(available, preferOpenAI, "exa");
430
- }
431
- if (provider === "openai" && !available.openai) {
432
- return firstAvailableProvider(available, false, "openai");
433
- }
434
- if (provider === "brave" && !available.brave) {
435
- return firstAvailableProvider(available, preferOpenAI, "brave");
436
- }
437
- if (provider === "parallel" && !available.parallel) {
438
- return firstAvailableProvider(available, preferOpenAI, "parallel");
439
- }
440
- if (provider === "tinyfish" && !available.tinyfish) {
441
- return firstAvailableProvider(available, preferOpenAI, "tinyfish");
442
- }
443
- if (provider === "search1api" && !available.search1api) {
444
- return firstAvailableProvider(available, preferOpenAI, "search1api");
445
- }
446
- if (provider === "searchinfinity" && !available.searchinfinity) {
447
- return firstAvailableProvider(available, preferOpenAI, "searchinfinity");
448
- }
449
- if (provider === "querit" && !available.querit) {
450
- return firstAvailableProvider(available, preferOpenAI, "querit");
451
- }
452
- if (provider === "tavily" && !available.tavily) {
453
- return firstAvailableProvider(available, preferOpenAI, "tavily");
454
- }
455
- if (provider === "firecrawl" && !available.firecrawl) {
456
- return firstAvailableProvider(available, preferOpenAI, "firecrawl");
457
- }
458
- if (provider === "jina" && !available.jina) {
459
- return firstAvailableProvider(available, preferOpenAI, "jina");
460
- }
461
- if (provider === "serpdive" && !available.serpdive) {
462
- return firstAvailableProvider(available, preferOpenAI, "serpdive");
463
- }
464
- if (provider === "kagi" && !available.kagi) {
465
- return firstAvailableProvider(available, preferOpenAI, "kagi");
466
- }
467
- if (provider === "bocha" && !available.bocha) {
468
- return firstAvailableProvider(available, preferOpenAI, "bocha");
469
- }
470
- if (provider === "ollama" && !available.ollama) {
471
- return firstAvailableProvider(available, preferOpenAI, "ollama");
472
- }
473
- if (provider === "searxng" && !available.searxng) {
474
- return firstAvailableProvider(available, preferOpenAI, "searxng");
475
- }
476
- if (provider === "exa" && !available.exa) {
477
- return firstAvailableProvider(available, preferOpenAI, "exa");
478
- }
479
- if (provider === "perplexity" && !available.perplexity) {
480
- return firstAvailableProvider(available, preferOpenAI, "perplexity");
448
+ if (provider === "all") {
449
+ return available.all ? "all" : firstAvailableProvider(available, preferOpenAI, "exa");
481
450
  }
482
- if (provider === "gemini" && !available.gemini) {
483
- return firstAvailableProvider(available, preferOpenAI, "gemini");
451
+ if (ALL_SEARCH_PROVIDERS.includes(provider) && !available[provider]) {
452
+ return firstAvailableProvider(available, provider === "openai" ? false : preferOpenAI, provider);
484
453
  }
485
454
  return provider;
486
455
  }
@@ -492,10 +461,11 @@ const pendingCurates = new Map;
492
461
  const activeCurators = new Map;
493
462
  const glimpseWins = new Map;
494
463
  const DEFAULT_MAX_INLINE_CONTENT_CHARS = 30000;
464
+ const MIN_INLINE_CONTENT_CHARS = 1000;
495
465
  const MAX_INLINE_CONTENT_CHARS = 200000;
496
466
  function getMaxInlineContentChars(config = loadConfig()) {
497
467
  const value = config.maxInlineContentChars;
498
- if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value) || value <= 0) {
468
+ if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value) || value < MIN_INLINE_CONTENT_CHARS) {
499
469
  return DEFAULT_MAX_INLINE_CONTENT_CHARS;
500
470
  }
501
471
  return Math.min(value, MAX_INLINE_CONTENT_CHARS);
@@ -639,6 +609,11 @@ function hasFullInlineCoverage(urls, inlineContent) {
639
609
  function formatFullResults(queryData) {
640
610
  let output = `## Results for: "${queryData.query}"
641
611
 
612
+ `;
613
+ const providers = queryData.providers ?? (queryData.provider ? [queryData.provider] : []);
614
+ if (providers.length > 0)
615
+ output += `**Provider${providers.length === 1 ? "" : "s"}:** ${providers.join(", ")}
616
+
642
617
  `;
643
618
  if (queryData.answer) {
644
619
  output += `${queryData.answer}
@@ -649,12 +624,33 @@ function formatFullResults(queryData) {
649
624
  }
650
625
  for (const r of queryData.results) {
651
626
  output += `### ${r.title}
652
- ${r.url}
627
+ ${r.url}${r.snippet ? `
628
+
629
+ ${r.snippet}` : ""}
653
630
 
654
631
  `;
655
632
  }
656
633
  return output;
657
634
  }
635
+ function boundSearchPresentation(text, guidance, truncationGuidance, maxChars) {
636
+ const fullText = `${text}${guidance}`;
637
+ if (fullText.length <= maxChars) {
638
+ return { text: fullText, truncated: false, originalChars: text.length, returnedChars: text.length, omittedChars: 0 };
639
+ }
640
+ const marker = `
641
+
642
+ ---
643
+ [Output truncated.]${truncationGuidance}`;
644
+ const prefixLength = maxChars - marker.length;
645
+ const bounded = `${text.slice(0, prefixLength)}${marker}`;
646
+ return {
647
+ text: bounded,
648
+ truncated: true,
649
+ originalChars: text.length,
650
+ returnedChars: prefixLength,
651
+ omittedChars: text.length - prefixLength
652
+ };
653
+ }
658
654
  function abortPendingFetches() {
659
655
  for (const controller of pendingFetches.values()) {
660
656
  controller.abort();
@@ -873,7 +869,12 @@ function handleSessionChange(ctx) {
873
869
  }
874
870
  export default function dm_web_access_default(pi) {
875
871
  const initConfig = loadConfigForExtensionInit();
876
- installGlobalProxyFetch();
872
+ const fetchModeConfig = resolveFetchModeConfig(initConfig);
873
+ const allowedSearchProviders = initConfig.webSearch?.allowedProviders === undefined ? RESOLVED_SEARCH_PROVIDERS : getAllowedSearchProviders();
874
+ const allEligibleProviders = allowedSearchProviders.filter((provider) => ALL_SEARCH_PROVIDERS.includes(provider));
875
+ const allExcludedProviders = allowedSearchProviders.filter((provider) => !ALL_SEARCH_PROVIDERS.includes(provider));
876
+ const allPolicyDescription = allEligibleProviders.length === 0 ? `all has no eligible allowed providers; explicit-only allowed providers (${allExcludedProviders.map(providerLabel).join(", ")}) remain excluded` : allExcludedProviders.length > 0 ? `all searches eligible allowed providers (${allEligibleProviders.map(providerLabel).join(", ")}); explicit-only allowed providers (${allExcludedProviders.map(providerLabel).join(", ")}) remain excluded` : `all searches every eligible allowed provider (${allEligibleProviders.map(providerLabel).join(", ")})`;
877
+ const curatorRunState = registerCuratorRunLifecycle(pi);
877
878
  const toolNames = resolveToolNames(initConfig);
878
879
  const webSearchEnabled = isToolEnabled(initConfig, "webSearch");
879
880
  const sourceCheckEnabled = isToolEnabled(initConfig, "sourceCheck");
@@ -890,6 +891,7 @@ export default function dm_web_access_default(pi) {
890
891
  ]);
891
892
  const searchQueryDescription = webSearchEnabled ? `Get content for this query (${toolNames.webSearch})` : "Get content for a stored search query";
892
893
  const fetchContentStorageNote = getSearchContentEnabled ? `Full original content is stored for retrieval with ${toolNames.getSearchContent}.` : "Full original content is stored internally, but the retrieval tool is not registered.";
894
+ const fetchModeDescription = fetchModeConfig.allowedModes.map((mode) => `${mode}${mode === fetchModeConfig.defaultMode ? " (default)" : ""}: ${FETCH_MODE_DESCRIPTIONS[mode]}`).join("; ");
893
895
  const curateKey = initConfig.shortcuts?.curate || DEFAULT_SHORTCUTS.curate;
894
896
  const activityKey = initConfig.shortcuts?.activity || DEFAULT_SHORTCUTS.activity;
895
897
  function startBackgroundFetch(urls, proxy) {
@@ -898,7 +900,7 @@ export default function dm_web_access_default(pi) {
898
900
  const fetchId = generateId();
899
901
  const controller = new AbortController;
900
902
  pendingFetches.set(fetchId, controller);
901
- runWithProxy(proxy, () => fetchAllContent(urls, controller.signal, withRegisteredFetchOptions(undefined, registeredToolNames, proxy))).then((fetched) => {
903
+ Promise.resolve().then(() => runWithProxy(proxy, () => fetchAllContent(urls, controller.signal, withRegisteredFetchOptions(undefined, registeredToolNames, proxy)))).then((fetched) => {
902
904
  if (!sessionActive || !pendingFetches.has(fetchId))
903
905
  return;
904
906
  const data = {
@@ -1102,7 +1104,7 @@ export default function dm_web_access_default(pi) {
1102
1104
  };
1103
1105
  }
1104
1106
  const selected = filterByQueryIndices(payload.selectedQueryIndices, resultsByIndex).results;
1105
- const fallbackResults = selected.length > 0 ? selected : [...resultsByIndex.values()];
1107
+ const fallbackResults = selected.length > 0 ? selected : orderedSearchResults(resultsByIndex);
1106
1108
  const deterministic = buildDeterministicSummary(fallbackResults);
1107
1109
  return {
1108
1110
  approvedSummary: deterministic.summary,
@@ -1113,6 +1115,7 @@ export default function dm_web_access_default(pi) {
1113
1115
  const sc = opts.results.filter((r) => !r.error).length;
1114
1116
  const tr = opts.results.reduce((sum, r) => sum + r.results.length, 0);
1115
1117
  const hasApprovedSummary = typeof opts.approvedSummary === "string" && opts.approvedSummary.trim().length > 0;
1118
+ const maxInlineContentChars = getMaxInlineContentChars(initConfig);
1116
1119
  let output = "";
1117
1120
  if (hasApprovedSummary) {
1118
1121
  output = opts.approvedSummary.trim();
@@ -1122,6 +1125,15 @@ export default function dm_web_access_default(pi) {
1122
1125
 
1123
1126
  `;
1124
1127
  }
1128
+ const providerNames = opts.results.map((result) => {
1129
+ const providers = result.providers ?? (result.provider ? [result.provider] : []);
1130
+ return providers.join(", ") || "unknown";
1131
+ });
1132
+ output += opts.results.length === 1 ? `**Provider:** ${providerNames[0]}
1133
+
1134
+ ` : `**Providers used:** ${providerNames.map((name, index) => `Query ${index + 1}: ${name}`).join("; ")}
1135
+
1136
+ `;
1125
1137
  const duplicateQueries = opts.curated ? duplicateQuerySet(opts.results) : new Set;
1126
1138
  for (const { query, answer, results, error, provider } of opts.results) {
1127
1139
  if (opts.queryList.length > 1) {
@@ -1150,21 +1162,35 @@ export default function dm_web_access_default(pi) {
1150
1162
  urls: opts.inlineContent
1151
1163
  };
1152
1164
  pi.appendEntry("web-search-results", storeFetchedContentResult(fetchId, data));
1153
- if (!hasApprovedSummary) {
1154
- output += `---
1155
- Full content for ${opts.inlineContent.length} sources available [${fetchId}].`;
1156
- }
1157
1165
  } else if (opts.includeContent) {
1158
1166
  fetchId = startBackgroundFetch(opts.urls, opts.proxy);
1159
- if (fetchId && !hasApprovedSummary) {
1160
- output += `---
1161
- Content fetching in background [${fetchId}]. Will notify when ready.`;
1162
- }
1163
1167
  }
1164
1168
  const searchId = storeAndPublishSearch(opts.results);
1165
1169
  const isBackgroundFetch = fetchId !== null && !hasInlineReady;
1170
+ const unboundedPresentation = output.trim();
1171
+ const buildGuidance = (forTruncation) => {
1172
+ let value = "";
1173
+ if (hasInlineReady && opts.inlineContent && fetchId) {
1174
+ value += `
1175
+ ---
1176
+ Full content for ${opts.inlineContent.length} sources is ready as responseId "${fetchId}". `;
1177
+ value += getSearchContentEnabled ? `Use ${toolNames.getSearchContent}({ responseId: "${fetchId}", urlIndex: 0, offset: 0, limit: ${maxInlineContentChars} }) to retrieve the first bounded page.` : forTruncation ? `Enable ${toolNames.getSearchContent} to retrieve the full stored content.` : "";
1178
+ } else if (isBackgroundFetch && fetchId) {
1179
+ value += `
1180
+ ---
1181
+ Content fetching in background as responseId "${fetchId}". Will notify when ready.`;
1182
+ }
1183
+ if (getSearchContentEnabled || forTruncation) {
1184
+ value += `
1185
+ ---
1186
+ Full search results are stored as responseId "${searchId}". `;
1187
+ value += getSearchContentEnabled ? `Use ${toolNames.getSearchContent}({ responseId: "${searchId}", queryIndex: 0, offset: 0, limit: ${maxInlineContentChars} }) to retrieve the first bounded page${opts.results.length > 1 ? `; repeat with queryIndex 1 through ${opts.results.length - 1}` : ""}.` : `Enable ${toolNames.getSearchContent} to retrieve the full stored results.`;
1188
+ }
1189
+ return value;
1190
+ };
1191
+ const presentation = hasApprovedSummary ? { text: unboundedPresentation, truncated: false, originalChars: unboundedPresentation.length, returnedChars: unboundedPresentation.length, omittedChars: 0 } : boundSearchPresentation(unboundedPresentation, buildGuidance(false), buildGuidance(true), maxInlineContentChars);
1166
1192
  return {
1167
- content: [{ type: "text", text: output.trim() }],
1193
+ content: [{ type: "text", text: presentation.text }],
1168
1194
  details: {
1169
1195
  queries: opts.queryList,
1170
1196
  queryCount: opts.queryList.length,
@@ -1174,6 +1200,14 @@ Content fetching in background [${fetchId}]. Will notify when ready.`;
1174
1200
  fetchId,
1175
1201
  fetchUrls: isBackgroundFetch ? opts.urls : undefined,
1176
1202
  searchId,
1203
+ queryProviders: opts.results.map((result) => ({
1204
+ query: result.query,
1205
+ providers: result.providers ?? (result.provider ? [result.provider] : [])
1206
+ })),
1207
+ truncated: presentation.truncated,
1208
+ originalChars: presentation.originalChars,
1209
+ returnedChars: presentation.returnedChars,
1210
+ omittedChars: presentation.omittedChars,
1177
1211
  ...opts.curated ? {
1178
1212
  curated: true,
1179
1213
  curatedFrom: opts.curatedFrom,
@@ -1216,8 +1250,11 @@ Content fetching in background [${fetchId}]. Will notify when ready.`;
1216
1250
  }
1217
1251
  return { results: filteredResults, urls: filteredUrls };
1218
1252
  }
1253
+ function orderedSearchResults(resultsByIndex) {
1254
+ return [...resultsByIndex.entries()].sort(([leftIndex], [rightIndex]) => leftIndex - rightIndex).map(([, result]) => result);
1255
+ }
1219
1256
  function collectAllResultsAndUrls(resultsByIndex) {
1220
- const results = [...resultsByIndex.values()];
1257
+ const results = orderedSearchResults(resultsByIndex);
1221
1258
  const urls = [];
1222
1259
  for (const result of results) {
1223
1260
  for (const source of result.results) {
@@ -1254,6 +1291,7 @@ Open manually: ${handle.url}` }],
1254
1291
  const sessionToken = randomUUID();
1255
1292
  handle = await startCuratorServer({
1256
1293
  queries: pc.queryList,
1294
+ initialResultIndexCapacity: curatorResultIndexCapacity(pc.queryList.length),
1257
1295
  sessionToken,
1258
1296
  timeout: pc.timeoutSeconds,
1259
1297
  availableProviders: pc.availableProviders,
@@ -1283,6 +1321,8 @@ Open manually: ${handle.url}` }],
1283
1321
  onSubmit(payload) {
1284
1322
  if (pendingCurates.get(callId) !== pc)
1285
1323
  return;
1324
+ if (payload.autoApproveRemainingSearches)
1325
+ curatorRunState.approveRemainingSearches();
1286
1326
  searchAbort.abort();
1287
1327
  const filtered = payload.selectedQueryIndices.length > 0 ? filterByQueryIndices(payload.selectedQueryIndices, pc.searchResults) : collectAllResultsAndUrls(pc.searchResults);
1288
1328
  const filteredInline = pc.allInlineContent.filter((c) => filtered.urls.includes(c.url));
@@ -1329,7 +1369,7 @@ Open manually: ${handle.url}` }],
1329
1369
  } else {
1330
1370
  const conn = activeCurators.get(callId)?.getConnectionState();
1331
1371
  pc.finish(buildCurationCancelledReturn(reason, {
1332
- queries: Array.from(pc.searchResults.values()),
1372
+ queries: orderedSearchResults(pc.searchResults),
1333
1373
  queryCount: pc.queryList.length,
1334
1374
  browserConnected: conn?.browserConnected,
1335
1375
  lastHeartbeatAgeMs: conn?.lastHeartbeatAgeMs,
@@ -1501,21 +1541,21 @@ Open manually: ${handle.url}` }],
1501
1541
  pi.registerTool({
1502
1542
  name: toolNames.webSearch,
1503
1543
  label: "Web Search",
1504
- description: `Search the web using OpenAI, Brave, Parallel, Parallel MCP, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, SearXNG, DuckDuckGo, Exa, Perplexity, Gemini, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, or Serper. Pass a provider array to search only those providers simultaneously, or use provider "all" to search every eligible provider except Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, and Serper. Returns an AI-synthesized answer with source citations. OpenAI search uses a Codex subscription or OpenAI API key; Kimi search uses a Kimi Code Plan authenticated through /login kimi-coding; xAI search uses a SuperGrok/X Premium subscription or xAI API key. Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, and Serper are available only when explicitly selected. For comprehensive research, prefer queries (plural) with 2-4 varied angles over a single query — each query gets its own synthesized answer, so varying phrasing and scope gives much broader coverage. When includeContent is true, full page content is fetched in the background. Searches auto-open the interactive browser curator and stream results live; set workflow to "none" to skip curation or "auto-summary" for a model-generated summary without the browser curator. The configured provider is used when provider is omitted or set to auto; omit provider unless explicitly overriding it. Without a configured provider, SearXNG is preferred first for local/private search. When the active DM model is openai-codex, Codex-backed OpenAI search is preferred next. Otherwise Exa is preferred before OpenAI, then Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, Perplexity, Gemini API, or Gemini Web.`,
1544
+ description: `Search the web with ${allowedSearchProviders.map(providerLabel).join(", ")}. Provider arrays run simultaneously; ${allPolicyDescription}. The default workflow is none: it returns bounded source-linked search results or provider answers without a curator or generated summary, identifies the providers used, and stores full results for retrieval by responseId. For comprehensive research, prefer queries (plural) with 2-4 varied angles over a single query. When includeContent is true, full page content is fetched in the background. Set workflow to "summary-review" to open the curator with an auto-generated summary draft or "auto-summary" to generate a summary without the browser curator. The configured provider is used when provider is omitted or set to auto; omit provider unless explicitly overriding it.`,
1505
1545
  promptSnippet: "Use for web research questions. Prefer {queries:[...]} with 2-4 varied angles over a single query for broader coverage. Omit provider unless explicitly overriding the configured default.",
1506
1546
  parameters: Type.Object({
1507
1547
  query: Type.Optional(Type.String({ description: "Single search query. For research tasks, prefer 'queries' with multiple varied angles instead." })),
1508
- queries: Type.Optional(Type.Array(Type.String(), { description: "Multiple queries searched in sequence, each returning its own synthesized answer. Prefer this for research — vary phrasing, scope, and angle across 2-4 queries to maximize coverage. Good: ['React vs Vue performance benchmarks 2026', 'React vs Vue developer experience comparison', 'React ecosystem size vs Vue ecosystem']. Bad: ['React vs Vue', 'React vs Vue comparison', 'React vs Vue review'] (too similar, redundant results)." })),
1548
+ queries: Type.Optional(Type.Array(Type.String(), { description: "Multiple queries searched concurrently (up to three at a time), each returning source-linked search results or a provider answer. Prefer this for research — vary phrasing, scope, and angle across 2-4 queries to maximize coverage. Good: ['React vs Vue performance benchmarks 2026', 'React vs Vue developer experience comparison', 'React ecosystem size vs Vue ecosystem']. Bad: ['React vs Vue', 'React vs Vue comparison', 'React vs Vue review'] (too similar, redundant results)." })),
1509
1549
  numResults: Type.Optional(Type.Integer({ minimum: 1, maximum: 20, description: "Results per query (default: 5, max: 20)" })),
1510
1550
  includeContent: Type.Optional(Type.Boolean({ description: "Fetch full page content (async)" })),
1511
1551
  recencyFilter: Type.Optional(StringEnum(["day", "week", "month", "year"], { description: "Filter by recency" })),
1512
1552
  domainFilter: Type.Optional(Type.Array(Type.String(), { description: "Limit to domains (prefix with - to exclude)" })),
1513
- provider: Type.Optional(searchProviderSchema("Search provider or non-empty list of providers to search simultaneously; use all to search every eligible provider except Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, and Serper, omit this field to use the configured provider, or use auto when none is configured")),
1553
+ provider: Type.Optional(searchProviderSchema(`Search provider or non-empty list of allowed providers to search simultaneously; ${allPolicyDescription}; omit this field to use the configured provider, or use auto when none is configured`, allowedSearchProviders)),
1514
1554
  workflow: Type.Optional(StringEnum(["none", "summary-review", "auto-summary"], {
1515
- description: "Search workflow mode: none = no curator, summary-review = open curator with auto summary draft (default), auto-summary = generate summary without opening curator"
1555
+ description: "Search workflow mode: none = no curator (default), summary-review = open curator with auto summary draft, auto-summary = generate summary without opening curator"
1516
1556
  })),
1517
1557
  proxy: Type.Optional(Type.String({
1518
- description: "http(s) proxy URL (e.g. http://host:port) used for every outbound request in this call (search APIs and content fetches). Node fetch ignores HTTP(S)_PROXY env vars, so set this (or `proxy` in web-search.json) when direct access is blocked; empty string forces direct access."
1558
+ description: "http(s) or socks proxy URL (e.g. http://host:port or socks5h://host:port) used for every outbound request in this call (search APIs and content fetches). Node fetch ignores HTTP(S)_PROXY env vars, so set this (or `proxy` in web-search.json) when direct access is blocked; empty string forces direct access."
1519
1559
  }))
1520
1560
  }),
1521
1561
  async execute(callId, params, signal, onUpdate, ctx) {
@@ -1523,7 +1563,7 @@ Open manually: ${handle.url}` }],
1523
1563
  const rawQueryList = Array.isArray(params.queries) ? params.queries : params.query !== undefined ? expandQueryString(params.query) : [];
1524
1564
  const queryList = normalizeQueryList(rawQueryList);
1525
1565
  const configWorkflow = loadConfigForExtensionInit().workflow;
1526
- const workflow = resolveWorkflow(params.workflow ?? configWorkflow, ctx?.hasUI !== false);
1566
+ const workflow = curatorRunState.resolve(params.workflow, configWorkflow, ctx?.hasUI !== false);
1527
1567
  const shouldCurate = workflow === "summary-review";
1528
1568
  const recencyFilter = normalizeRecencyFilter(params.recencyFilter);
1529
1569
  if (queryList.length === 0) {
@@ -1548,7 +1588,6 @@ Open manually: ${handle.url}` }],
1548
1588
  const searchResults = new Map;
1549
1589
  const resultSlots = new Map;
1550
1590
  const allInlineContent = [];
1551
- let nextResultIndex = queryList.length;
1552
1591
  const searchAbort = new AbortController;
1553
1592
  const searchSignal = signal ? AbortSignal.any([signal, searchAbort.signal]) : searchAbort.signal;
1554
1593
  let cancelled = false;
@@ -1565,6 +1604,7 @@ Open manually: ${handle.url}` }],
1565
1604
  const summaryContext = {
1566
1605
  model: ctx.model,
1567
1606
  modelRegistry: ctx.modelRegistry,
1607
+ sessionManager: ctx.sessionManager,
1568
1608
  cwd: ctx.cwd,
1569
1609
  isProjectTrusted: () => ctx.isProjectTrusted()
1570
1610
  };
@@ -1611,7 +1651,7 @@ Open manually: ${handle.url}` }],
1611
1651
  return;
1612
1652
  const conn = activeCurators.get(callId)?.getConnectionState();
1613
1653
  finish(buildCurationCancelledReturn(reason, {
1614
- queries: Array.from(searchResults.values()),
1654
+ queries: orderedSearchResults(searchResults),
1615
1655
  queryCount: queryList.length,
1616
1656
  browserConnected: conn?.browserConnected,
1617
1657
  lastHeartbeatAgeMs: conn?.lastHeartbeatAgeMs,
@@ -1625,16 +1665,17 @@ Open manually: ${handle.url}` }],
1625
1665
  pendingCurates.set(callId, pc);
1626
1666
  signal?.addEventListener("abort", onAbort, { once: true });
1627
1667
  pc.browserPromise = openCuratorBrowser(callId, pc, ctx, false);
1628
- for (let qi = 0;qi < queryList.length; qi++) {
1668
+ let completedSearches = 0;
1669
+ await runSearchQueries(queryList, async (query, qi) => {
1629
1670
  if (signal?.aborted || cancelled || searchAbort.signal.aborted)
1630
- break;
1671
+ return;
1631
1672
  onUpdate?.({
1632
- content: [{ type: "text", text: `Searching ${qi + 1}/${queryList.length}: "${queryList[qi]}"...` }],
1633
- details: { phase: "searching", progress: qi / queryList.length, currentQuery: queryList[qi] }
1673
+ content: [{ type: "text", text: `Searching "${query}" (${completedSearches}/${queryList.length} complete)...` }],
1674
+ details: { phase: "searching", progress: completedSearches / queryList.length, currentQuery: query }
1634
1675
  });
1635
1676
  const requestedProvider = pc.searchProvider;
1636
1677
  try {
1637
- const response = await search(queryList[qi], {
1678
+ const response = await search(query, {
1638
1679
  provider: requestedProvider,
1639
1680
  numResults: params.numResults,
1640
1681
  recencyFilter,
@@ -1644,42 +1685,50 @@ Open manually: ${handle.url}` }],
1644
1685
  extensionContext: ctx
1645
1686
  });
1646
1687
  if (signal?.aborted || cancelled || searchAbort.signal.aborted)
1647
- break;
1688
+ return;
1648
1689
  if (response.inlineContent)
1649
1690
  allInlineContent.push(...response.inlineContent);
1650
1691
  const entries = toCuratorSearchEntries(response);
1651
1692
  const curator = activeCurators.get(callId);
1652
1693
  for (let entryIndex = 0;entryIndex < entries.length; entryIndex++) {
1653
1694
  const entry = entries[entryIndex];
1654
- const resultIndex = entryIndex === 0 ? qi : nextResultIndex++;
1695
+ const resultIndex = curatorResultIndex(qi, entryIndex, queryList.length);
1655
1696
  const indexedEntry = {
1656
1697
  ...entry,
1657
1698
  queryIndex: resultIndex,
1658
- query: queryList[qi]
1699
+ query
1659
1700
  };
1660
1701
  searchResults.set(resultIndex, indexedCuratorEntryToQueryResult(indexedEntry));
1661
1702
  resultSlots.set(resultIndex, qi);
1662
1703
  if (curator) {
1663
1704
  if (entry.error) {
1664
- curator.pushError(resultIndex, entry.error, entry.provider, { query: queryList[qi], slotIndex: qi });
1705
+ curator.pushError(resultIndex, entry.error, entry.provider, { query, slotIndex: qi });
1665
1706
  } else {
1666
- curator.pushResult(resultIndex, { ...entry, query: queryList[qi], slotIndex: qi });
1707
+ curator.pushResult(resultIndex, { ...entry, query, slotIndex: qi });
1667
1708
  }
1668
1709
  }
1669
1710
  }
1670
1711
  } catch (err) {
1671
1712
  if (signal?.aborted || cancelled || searchAbort.signal.aborted)
1672
- break;
1713
+ return;
1673
1714
  const message = err instanceof Error ? err.message : String(err);
1674
1715
  const failedProvider = toCuratorProvider(requestedProvider);
1675
- searchResults.set(qi, { query: queryList[qi], answer: "", results: [], error: message, provider: failedProvider });
1716
+ searchResults.set(qi, { query, answer: "", results: [], error: message, provider: failedProvider });
1676
1717
  resultSlots.set(qi, qi);
1677
1718
  const curator = activeCurators.get(callId);
1678
1719
  if (curator) {
1679
- curator.pushError(qi, message, failedProvider, { query: queryList[qi], slotIndex: qi });
1720
+ curator.pushError(qi, message, failedProvider, { query, slotIndex: qi });
1721
+ }
1722
+ } finally {
1723
+ completedSearches++;
1724
+ if (!signal?.aborted && !cancelled && !searchAbort.signal.aborted) {
1725
+ onUpdate?.({
1726
+ content: [{ type: "text", text: `Completed ${completedSearches}/${queryList.length} searches.` }],
1727
+ details: { phase: "searching", progress: completedSearches / queryList.length, currentQuery: query }
1728
+ });
1680
1729
  }
1681
1730
  }
1682
- }
1731
+ });
1683
1732
  if (signal?.aborted || cancelled || searchAbort.signal.aborted) {
1684
1733
  cancel();
1685
1734
  return promise;
@@ -1715,18 +1764,18 @@ Open manually: ${handle.url}` }],
1715
1764
  }
1716
1765
  return promise;
1717
1766
  }
1718
- const searchResults = [];
1767
+ let completedSearches = 0;
1719
1768
  const allUrls = [];
1720
1769
  const allInlineContent = [];
1721
1770
  const resolvedProvider = resolveRequestedProvider(params.provider);
1722
- for (let i = 0;i < queryList.length; i++) {
1723
- const query = queryList[i];
1771
+ const queryResponses = await runSearchQueries(queryList, async (query) => {
1772
+ signal?.throwIfAborted();
1724
1773
  onUpdate?.({
1725
- content: [{ type: "text", text: `Searching ${i + 1}/${queryList.length}: "${query}"...` }],
1726
- details: { phase: "search", progress: i / queryList.length, currentQuery: query }
1774
+ content: [{ type: "text", text: `Searching "${query}" (${completedSearches}/${queryList.length} complete)...` }],
1775
+ details: { phase: "search", progress: completedSearches / queryList.length, currentQuery: query }
1727
1776
  });
1728
1777
  try {
1729
- const { answer, results, inlineContent, provider } = await search(query, {
1778
+ const { answer, results, inlineContent, provider, providerResponses } = await search(query, {
1730
1779
  provider: resolvedProvider,
1731
1780
  numResults: params.numResults,
1732
1781
  recencyFilter,
@@ -1735,21 +1784,35 @@ Open manually: ${handle.url}` }],
1735
1784
  signal,
1736
1785
  extensionContext: ctx
1737
1786
  });
1738
- searchResults.push({ query, answer, results, error: null, provider });
1739
- for (const r of results) {
1740
- if (!allUrls.includes(r.url)) {
1741
- allUrls.push(r.url);
1742
- }
1743
- }
1744
- if (inlineContent)
1745
- allInlineContent.push(...inlineContent);
1787
+ const providers = providerResponses?.map((response) => response.provider) ?? [provider];
1788
+ return { result: { query, answer, results, error: null, provider, providers }, inlineContent };
1746
1789
  } catch (err) {
1747
1790
  if (signal?.aborted || isAbortError(err))
1748
1791
  throw err;
1749
1792
  const message = err instanceof Error ? err.message : String(err);
1750
1793
  const requestedProvider = toCuratorProvider(resolvedProvider);
1751
- searchResults.push({ query, answer: "", results: [], error: message, provider: requestedProvider });
1794
+ return {
1795
+ result: { query, answer: "", results: [], error: message, provider: requestedProvider },
1796
+ inlineContent: undefined
1797
+ };
1798
+ } finally {
1799
+ completedSearches++;
1800
+ if (!signal?.aborted) {
1801
+ onUpdate?.({
1802
+ content: [{ type: "text", text: `Completed ${completedSearches}/${queryList.length} searches.` }],
1803
+ details: { phase: "search", progress: completedSearches / queryList.length, currentQuery: query }
1804
+ });
1805
+ }
1752
1806
  }
1807
+ });
1808
+ const searchResults = queryResponses.map((response) => response.result);
1809
+ for (const response of queryResponses) {
1810
+ for (const result of response.result.results) {
1811
+ if (!allUrls.includes(result.url))
1812
+ allUrls.push(result.url);
1813
+ }
1814
+ if (response.inlineContent)
1815
+ allInlineContent.push(...response.inlineContent);
1753
1816
  }
1754
1817
  let approvedSummary;
1755
1818
  let summaryMeta;
@@ -1767,6 +1830,7 @@ Open manually: ${handle.url}` }],
1767
1830
  const summaryContext = {
1768
1831
  model: ctx.model,
1769
1832
  modelRegistry: ctx.modelRegistry,
1833
+ sessionManager: ctx.sessionManager,
1770
1834
  cwd: ctx.cwd,
1771
1835
  isProjectTrusted: () => ctx.isProjectTrusted()
1772
1836
  };
@@ -1996,18 +2060,18 @@ Open manually: ${handle.url}` }],
1996
2060
  pi.registerTool({
1997
2061
  name: toolNames.sourceCheck,
1998
2062
  label: "Source Check",
1999
- description: "Check a claim against web sources and return a bounded machine-readable research artifact with exact passage citations.",
2000
- promptSnippet: "Verify a claim with structured source evidence and passage-level citations.",
2063
+ description: "Gather web sources for a claim and return a bounded machine-readable research artifact with exact passage citations for manual review.",
2064
+ promptSnippet: "Gather structured source evidence and passage-level citations for manual semantic review of a claim.",
2001
2065
  parameters: Type.Object({
2002
- claim: Type.String({ description: "The assertion to check against web sources." }),
2066
+ claim: Type.String({ description: "The assertion to gather web sources for." }),
2003
2067
  queries: Type.Optional(Type.Array(Type.String(), { description: "Search queries (default: the claim)." })),
2004
2068
  numResults: Type.Optional(Type.Integer({ minimum: 1, maximum: 20, description: "Results per query (default: 5, max: 20)." })),
2005
2069
  fetchContent: Type.Optional(Type.Boolean({ description: "Fetch up to 5 result pages for exact passage extraction." })),
2006
2070
  recencyFilter: Type.Optional(StringEnum(["day", "week", "month", "year"], { description: "Filter by recency." })),
2007
2071
  domainFilter: Type.Optional(Type.Array(Type.String(), { description: "Limit to domains; prefix with - to exclude." })),
2008
- provider: Type.Optional(searchProviderSchema("Search provider or non-empty list of providers to search simultaneously; all searches every eligible provider except Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, and Serper")),
2072
+ provider: Type.Optional(searchProviderSchema(`Search provider or non-empty list of allowed providers to search simultaneously; ${allPolicyDescription}`, allowedSearchProviders)),
2009
2073
  proxy: Type.Optional(Type.String({
2010
- description: "http(s) proxy URL (e.g. http://host:port) used for every outbound request in this call (search APIs and result-page fetches). Empty string forces direct access."
2074
+ description: "http(s) or socks proxy URL (e.g. http://host:port or socks5h://host:port) used for every outbound request in this call (search APIs and result-page fetches). Empty string forces direct access."
2011
2075
  }))
2012
2076
  }),
2013
2077
  async execute(_callId, params, signal, _onUpdate, ctx) {
@@ -2095,8 +2159,8 @@ Open manually: ${handle.url}` }],
2095
2159
  pi.registerTool({
2096
2160
  name: toolNames.fetchContent,
2097
2161
  label: "Fetch Content",
2098
- description: `Fetch URL(s) and extract readable content as markdown. Use mode "raw" for exact textual HTTP response bodies or mode "answer" with prompt to answer using only fetched content. Direct image URLs return resized image content. Supports YouTube transcripts, GitHub repositories, PDFs, and local videos. ${fetchContentStorageNote}`,
2099
- promptSnippet: "Use to fetch readable or raw URL content, direct images, GitHub repos, and videos. Mode answer answers a prompt using only the fetched source.",
2162
+ description: `Fetch URL(s). Available modes: ${fetchModeDescription}. Direct image URLs return resized image content when supported by the selected mode. Supports YouTube transcripts, GitHub repositories, PDFs, and local videos when supported by the selected mode. ${fetchContentStorageNote}`,
2163
+ promptSnippet: "Use to fetch URL content, direct images, GitHub repos, and videos.",
2100
2164
  parameters: Type.Object({
2101
2165
  url: Type.Optional(Type.String({ description: "Single URL to fetch" })),
2102
2166
  urls: Type.Optional(Type.Array(Type.String(), { description: "Multiple URLs (parallel)" })),
@@ -2104,14 +2168,16 @@ Open manually: ${handle.url}` }],
2104
2168
  description: "Force cloning large GitHub repositories that exceed the size threshold"
2105
2169
  })),
2106
2170
  prompt: Type.Optional(Type.String({
2107
- description: "Question or instruction for video analysis, or the page-local question required by mode answer."
2108
- })),
2109
- mode: Type.Optional(StringEnum(["readable", "raw", "answer"], {
2110
- description: "Fetch mode: readable (default extraction), raw (exact textual HTTP body), or answer (answer prompt using only fetched content)."
2171
+ description: fetchModeConfig.allowedModes.includes("answer") ? "Question or instruction for video analysis, or the page-local question required by answer mode." : "Question or instruction for video analysis."
2111
2172
  })),
2112
- answerModel: Type.Optional(Type.String({
2113
- description: "Optional provider/model-id override for mode answer. Defaults to fetch.answerProvider + fetch.answerModel when configured, otherwise the current DM model."
2173
+ mode: Type.Optional(StringEnum(fetchModeConfig.allowedModes, {
2174
+ description: `Fetch mode. ${fetchModeDescription}.`
2114
2175
  })),
2176
+ ...fetchModeConfig.allowedModes.includes("answer") ? {
2177
+ answerModel: Type.Optional(Type.String({
2178
+ description: "Optional provider/model-id override for answer mode. Defaults to fetch.answerProvider + fetch.answerModel when configured, otherwise the current DM model."
2179
+ }))
2180
+ } : {},
2115
2181
  timestamp: Type.Optional(Type.String({
2116
2182
  description: "Extract video frame(s) at a timestamp or time range. Single: '1:23:45', '23:45', or '85' (seconds). Range: '23:41-25:00' extracts evenly-spaced frames across that span (default 6). Use frames with ranges to control density; single+frames uses a fixed 5s interval. YouTube requires yt-dlp + ffmpeg; local videos require ffmpeg. Use a range when you know the approximate area but not the exact moment — you'll get a contact sheet to visually identify the right frame."
2117
2183
  })),
@@ -2127,7 +2193,7 @@ Open manually: ${handle.url}` }],
2127
2193
  description: "Opt into an authFetch profile for local browser-cookie fetching. Use a profile name, or true only when exactly one profile exists."
2128
2194
  })),
2129
2195
  proxy: Type.Optional(Type.String({
2130
- description: "http(s) proxy URL (e.g. http://host:port) used for this fetch. Needed when the target is unreachable directly; localhost and NO_PROXY hosts always bypass the proxy. Empty string forces direct access."
2196
+ description: "http(s) or socks proxy URL (e.g. http://host:port or socks5h://host:port) used for this fetch. Needed when the target is unreachable directly; localhost and NO_PROXY hosts always bypass the proxy. Empty string forces direct access."
2131
2197
  }))
2132
2198
  }),
2133
2199
  async execute(_toolCallId, params, signal, onUpdate, ctx) {
@@ -2139,8 +2205,12 @@ Open manually: ${handle.url}` }],
2139
2205
  return { content: [{ type: "text", text: `Error: ${error}` }], details: { error } };
2140
2206
  }
2141
2207
  const { urlList, options } = normalized;
2208
+ const mode = options.mode ?? fetchModeConfig.defaultMode;
2209
+ if (!fetchModeConfig.allowedModes.includes(mode)) {
2210
+ const error = `Fetch mode "${mode}" is disabled by fetch.allowedModes.`;
2211
+ return { content: [{ type: "text", text: `Error: ${error}` }], details: { error } };
2212
+ }
2142
2213
  return runWithProxy(options.proxy, async () => {
2143
- const mode = options.mode ?? "readable";
2144
2214
  if (mode === "answer" && !options.prompt) {
2145
2215
  return { content: [{ type: "text", text: "Error: mode answer requires prompt." }], details: { error: "mode answer requires prompt" } };
2146
2216
  }
@@ -2175,11 +2245,12 @@ Open manually: ${handle.url}` }],
2175
2245
  content: [{ type: "text", text: `Fetching ${urlList.length} URL(s)...` }],
2176
2246
  details: { phase: "fetch", progress: 0 }
2177
2247
  });
2178
- const { answerModel: _answerModel, auth: _auth, ...extractionOptions } = options;
2179
- const fetchOptions = mode === "answer" ? (() => {
2180
- const { prompt: _prompt, ...rest } = extractionOptions;
2181
- return { ...rest, ...authFetchProfile ? { authFetchProfile } : {} };
2182
- })() : { ...extractionOptions, ...authFetchProfile ? { authFetchProfile } : {} };
2248
+ const { answerModel: _answerModel, auth: _auth, ...extractionOptions } = { ...options, mode };
2249
+ const { prompt: _prompt, ...answerExtractionOptions } = extractionOptions;
2250
+ const fetchOptions = {
2251
+ ...mode === "answer" ? answerExtractionOptions : extractionOptions,
2252
+ ...authFetchProfile ? { authFetchProfile } : {}
2253
+ };
2183
2254
  const fetchResults = await fetchAllContent(urlList, signal, withRegisteredFetchOptions(fetchOptions, registeredToolNames, options.proxy));
2184
2255
  const presentedResults = mode === "answer" ? await Promise.all(fetchResults.map(async (result) => {
2185
2256
  if (result.error)
@@ -2291,7 +2362,13 @@ Authenticated fetch cache is off; repeat the fetch to read content.`;
2291
2362
  });
2292
2363
  },
2293
2364
  renderCall(args, theme) {
2294
- const { urlList, options } = normalizeFetchContentParams(args);
2365
+ let normalized;
2366
+ try {
2367
+ normalized = normalizeFetchContentParams(args);
2368
+ } catch {
2369
+ return new Text(theme.fg("toolTitle", theme.bold("fetch ")) + theme.fg("error", "(invalid parameters)"), 0, 0);
2370
+ }
2371
+ const { urlList, options } = normalized;
2295
2372
  const { prompt, timestamp, frames, model, mode, answerModel, auth } = options;
2296
2373
  if (urlList.length === 0) {
2297
2374
  return new Text(theme.fg("toolTitle", theme.bold("fetch ")) + theme.fg("error", "(no URL)"), 0, 0);
@@ -2410,7 +2487,7 @@ Authenticated fetch cache is off; repeat the fetch to read content.`;
2410
2487
  pi.registerTool({
2411
2488
  name: toolNames.getSearchContent,
2412
2489
  label: "Get Search Content",
2413
- description: `Retrieve bounded content slices or find matching passages in a previous ${storedContentSources} call.`,
2490
+ description: `Retrieve bounded pages of full stored search results or fetched content, or find matching passages, from a previous ${storedContentSources} call.`,
2414
2491
  promptSnippet: `Use after ${storedContentSources} to retrieve stored content via responseId. Use findText to locate passages without paging through the full content.`,
2415
2492
  parameters: Type.Object({
2416
2493
  responseId: Type.String({ description: `The responseId from ${storedContentSources}` }),
@@ -2418,8 +2495,8 @@ Authenticated fetch cache is off; repeat the fetch to read content.`;
2418
2495
  queryIndex: Type.Optional(Type.Integer({ minimum: 0, description: "Get content for query at index" })),
2419
2496
  url: Type.Optional(Type.String({ description: "Get content for this URL" })),
2420
2497
  urlIndex: Type.Optional(Type.Integer({ minimum: 0, description: "Get content for URL at index" })),
2421
- offset: Type.Optional(Type.Integer({ minimum: 0, description: "Character offset for fetched URL content slices (default 0). Ignored when findText is supplied." })),
2422
- limit: Type.Optional(Type.Integer({ minimum: 1, maximum: maxInlineContentChars, description: "Maximum characters to return for fetched URL content slices (default and max are set by maxInlineContentChars). Ignored when findText is supplied." })),
2498
+ offset: Type.Optional(Type.Integer({ minimum: 0, description: "Character offset in stored search or fetched URL content (default 0). Ignored when findText is supplied." })),
2499
+ limit: Type.Optional(Type.Integer({ minimum: 1, maximum: maxInlineContentChars, description: "Requested maximum stored-content characters (default and max use maxInlineContentChars). Search-page continuation guidance shares the global output cap and may reduce returnedChars. Ignored when findText is supplied." })),
2423
2500
  findText: Type.Optional(Type.Union([
2424
2501
  Type.String({ minLength: 1, maxLength: 500 }),
2425
2502
  Type.Array(Type.String({ minLength: 1, maxLength: 500 }), { minItems: 1, maxItems: 10 })
@@ -2534,7 +2611,7 @@ Authenticated fetch cache is off; repeat the fetch to read content.`;
2534
2611
  const { text, ...findDetails } = found;
2535
2612
  return {
2536
2613
  content: [{ type: "text", text }],
2537
- details: { query: queryData.query, resultCount: queryData.results.length, findMode: params.findMode ?? "case-insensitive", ...findDetails }
2614
+ details: { responseId: params.responseId, query: queryData.query, resultCount: queryData.results.length, contentLength: fullResults.length, findMode: params.findMode ?? "case-insensitive", ...findDetails }
2538
2615
  };
2539
2616
  } catch (err) {
2540
2617
  const error = err instanceof Error ? err.message : String(err);
@@ -2544,9 +2621,57 @@ Authenticated fetch cache is off; repeat the fetch to read content.`;
2544
2621
  };
2545
2622
  }
2546
2623
  }
2624
+ const offset = params.offset ?? 0;
2625
+ const limit = params.limit ?? maxInlineContentChars;
2626
+ if (!Number.isInteger(offset) || offset < 0) {
2627
+ return {
2628
+ content: [{ type: "text", text: `Invalid offset: received ${formatInputValue(offset)} for query ${formatInputValue(queryData.query)}; offset must be a non-negative integer. Use 0 or a larger integer.` }],
2629
+ details: { error: "Invalid offset", offset }
2630
+ };
2631
+ }
2632
+ if (!Number.isInteger(limit) || limit <= 0 || limit > maxInlineContentChars) {
2633
+ return {
2634
+ content: [{ type: "text", text: `Invalid limit: received ${formatInputValue(limit)} for query ${formatInputValue(queryData.query)}; limit must be an integer from 1 to ${maxInlineContentChars}. Use a value in that range.` }],
2635
+ details: { error: "Invalid limit", limit, maxLimit: maxInlineContentChars }
2636
+ };
2637
+ }
2638
+ if (offset > fullResults.length) {
2639
+ return {
2640
+ content: [{ type: "text", text: `Offset ${offset} is out of range for query ${formatInputValue(queryData.query)} in responseId ${formatInputValue(params.responseId)}. Received offset ${offset}; valid range is 0-${fullResults.length}. Use an offset within that range.` }],
2641
+ details: { error: "Offset out of range", offset, contentLength: fullResults.length }
2642
+ };
2643
+ }
2644
+ const queryIndex = data.queries.indexOf(queryData);
2645
+ let returnedChars = Math.min(limit, fullResults.length - offset);
2646
+ let endOffset = offset + returnedChars;
2647
+ let continuation = "";
2648
+ while (endOffset < fullResults.length) {
2649
+ continuation = `
2650
+
2651
+ ---
2652
+ Showing chars ${offset}-${endOffset} of ${fullResults.length}. Use ${toolNames.getSearchContent}({ responseId: "${params.responseId}", queryIndex: ${queryIndex}, offset: ${endOffset}, limit: ${limit} }) for the next slice.`;
2653
+ const overflow = returnedChars + continuation.length - maxInlineContentChars;
2654
+ if (overflow <= 0)
2655
+ break;
2656
+ returnedChars -= overflow;
2657
+ endOffset = offset + returnedChars;
2658
+ }
2659
+ const resultSlice = fullResults.slice(offset, endOffset);
2660
+ const hasMore = endOffset < fullResults.length;
2661
+ const text = `${resultSlice}${hasMore ? continuation : ""}`;
2547
2662
  return {
2548
- content: [{ type: "text", text: fullResults }],
2549
- details: { query: queryData.query, resultCount: queryData.results.length }
2663
+ content: [{ type: "text", text }],
2664
+ details: {
2665
+ responseId: params.responseId,
2666
+ query: queryData.query,
2667
+ resultCount: queryData.results.length,
2668
+ contentLength: fullResults.length,
2669
+ offset,
2670
+ limit,
2671
+ returnedChars,
2672
+ nextOffset: hasMore ? endOffset : null,
2673
+ truncated: hasMore
2674
+ }
2550
2675
  };
2551
2676
  }
2552
2677
  if (data.type === "fetch" && data.urls) {
@@ -2721,6 +2846,13 @@ Showing chars ${offset}-${endOffset} of ${urlData.content.length}.`;
2721
2846
  }
2722
2847
  });
2723
2848
  }
2849
+ const activationTools = [
2850
+ ...webSearchEnabled ? [{ name: toolNames.webSearch, capability: "search" }] : [],
2851
+ ...sourceCheckEnabled ? [{ name: toolNames.sourceCheck, capability: "source-check" }] : [],
2852
+ ...fetchContentEnabled ? [{ name: toolNames.fetchContent, capability: "fetch" }] : [],
2853
+ ...getSearchContentEnabled ? [{ name: toolNames.getSearchContent, capability: "stored-content" }] : []
2854
+ ];
2855
+ registerWebToolActivation(pi, activationTools);
2724
2856
  if (isCommandEnabled(initConfig, "websearch"))
2725
2857
  pi.registerCommand("websearch", {
2726
2858
  description: "Open web search curator",
@@ -2748,6 +2880,7 @@ Showing chars ${offset}-${endOffset} of ${urlData.content.length}.`;
2748
2880
  const summaryContext = {
2749
2881
  model: ctx.model,
2750
2882
  modelRegistry: ctx.modelRegistry,
2883
+ sessionManager: ctx.sessionManager,
2751
2884
  cwd: ctx.cwd,
2752
2885
  isProjectTrusted: () => ctx.isProjectTrusted()
2753
2886
  };
@@ -2769,6 +2902,7 @@ Showing chars ${offset}-${endOffset} of ${urlData.content.length}.`;
2769
2902
  try {
2770
2903
  const handle = await startCuratorServer({
2771
2904
  queries,
2905
+ initialResultIndexCapacity: curatorResultIndexCapacity(queries.length),
2772
2906
  sessionToken,
2773
2907
  timeout: curatorTimeoutSeconds,
2774
2908
  availableProviders,
@@ -2844,19 +2978,21 @@ Showing chars ${offset}-${endOffset} of ${urlData.content.length}.`;
2844
2978
  }
2845
2979
  },
2846
2980
  async onAddSearch(query, provider) {
2847
- if (commandHandle && !isCommandActive()) {
2848
- throw new Error("Curator session is no longer active.");
2849
- }
2850
- const requestedProvider = resolveCuratorSearchProvider(provider, currentSearchProvider);
2851
- const response = await search(query, {
2852
- provider: requestedProvider,
2853
- signal: searchAbort.signal,
2854
- extensionContext: ctx
2981
+ return runWithProxy(undefined, async () => {
2982
+ if (commandHandle && !isCommandActive()) {
2983
+ throw new Error("Curator session is no longer active.");
2984
+ }
2985
+ const requestedProvider = resolveCuratorSearchProvider(provider, currentSearchProvider);
2986
+ const response = await search(query, {
2987
+ provider: requestedProvider,
2988
+ signal: searchAbort.signal,
2989
+ extensionContext: ctx
2990
+ });
2991
+ if (commandHandle && !isCommandActive()) {
2992
+ throw new Error("Curator session is no longer active.");
2993
+ }
2994
+ return toCuratorSearchEntries(response);
2855
2995
  });
2856
- if (commandHandle && !isCommandActive()) {
2857
- throw new Error("Curator session is no longer active.");
2858
- }
2859
- return toCuratorSearchEntries(response);
2860
2996
  },
2861
2997
  onAddSearchResults(entries) {
2862
2998
  if (commandHandle && !isCommandActive())
@@ -2913,44 +3049,43 @@ Showing chars ${offset}-${endOffset} of ${urlData.content.length}.`;
2913
3049
  }
2914
3050
  if (queries.length > 0) {
2915
3051
  (async () => {
2916
- let nextResultIndex = queries.length;
2917
- for (let qi = 0;qi < queries.length; qi++) {
3052
+ await runSearchQueries(queries, async (query, qi) => {
2918
3053
  if (aborted || !isCommandActive())
2919
- break;
3054
+ return;
2920
3055
  const requestedProvider = currentSearchProvider;
2921
3056
  try {
2922
- const response = await search(queries[qi], {
3057
+ const response = await runWithProxy(undefined, () => search(query, {
2923
3058
  provider: requestedProvider,
2924
3059
  signal: searchAbort.signal,
2925
3060
  extensionContext: ctx
2926
- });
3061
+ }));
2927
3062
  if (aborted || !isCommandActive())
2928
- break;
3063
+ return;
2929
3064
  const entries = toCuratorSearchEntries(response);
2930
3065
  for (let entryIndex = 0;entryIndex < entries.length; entryIndex++) {
2931
3066
  const entry = entries[entryIndex];
2932
- const resultIndex = entryIndex === 0 ? qi : nextResultIndex++;
3067
+ const resultIndex = curatorResultIndex(qi, entryIndex, queries.length);
2933
3068
  const indexedEntry = {
2934
3069
  ...entry,
2935
3070
  queryIndex: resultIndex,
2936
- query: queries[qi]
3071
+ query
2937
3072
  };
2938
3073
  collected.set(resultIndex, indexedCuratorEntryToQueryResult(indexedEntry));
2939
3074
  if (entry.error) {
2940
- handle.pushError(resultIndex, entry.error, entry.provider, { query: queries[qi], slotIndex: qi });
3075
+ handle.pushError(resultIndex, entry.error, entry.provider, { query, slotIndex: qi });
2941
3076
  } else {
2942
- handle.pushResult(resultIndex, { ...entry, query: queries[qi], slotIndex: qi });
3077
+ handle.pushResult(resultIndex, { ...entry, query, slotIndex: qi });
2943
3078
  }
2944
3079
  }
2945
3080
  } catch (err) {
2946
3081
  if (aborted || !isCommandActive())
2947
- break;
3082
+ return;
2948
3083
  const message = err instanceof Error ? err.message : String(err);
2949
3084
  const failedProvider = toCuratorProvider(requestedProvider);
2950
- handle.pushError(qi, message, failedProvider, { query: queries[qi], slotIndex: qi });
2951
- collected.set(qi, { query: queries[qi], answer: "", results: [], error: message, provider: failedProvider });
3085
+ handle.pushError(qi, message, failedProvider, { query, slotIndex: qi });
3086
+ collected.set(qi, { query, answer: "", results: [], error: message, provider: failedProvider });
2952
3087
  }
2953
- }
3088
+ });
2954
3089
  if (!aborted && isCommandActive())
2955
3090
  handle.searchesDone();
2956
3091
  })();
@@ -2972,7 +3107,7 @@ Showing chars ${offset}-${endOffset} of ${urlData.content.length}.`;
2972
3107
  const arg = args.trim().toLowerCase();
2973
3108
  let newWorkflow;
2974
3109
  if (arg.length === 0) {
2975
- const current = resolveWorkflow(loadConfigForExtensionInit().workflow, true);
3110
+ const current = resolveWebSearchWorkflow(loadConfigForExtensionInit().workflow, true);
2976
3111
  newWorkflow = current === "none" ? "summary-review" : "none";
2977
3112
  } else if (arg === "on") {
2978
3113
  newWorkflow = "summary-review";