@duckmind/dm-darwin-x64 0.66.5 → 0.66.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1115) hide show
  1. package/README.md +4 -0
  2. package/dm +2 -2
  3. package/extensions/.dm-extensions.json +755 -37
  4. package/extensions/dm-lens/clients/actionable-warnings.js +63 -11
  5. package/extensions/dm-lens/clients/advisory-provenance.js +5 -3
  6. package/extensions/dm-lens/clients/agent-nudge.js +106 -2
  7. package/extensions/dm-lens/clients/analysis-root.js +103 -0
  8. package/extensions/dm-lens/clients/ast-grep-client.js +18 -7
  9. package/extensions/dm-lens/clients/ast-grep-rule-manager.js +35 -12
  10. package/extensions/dm-lens/clients/biome-client.js +18 -12
  11. package/extensions/dm-lens/clients/blocker-freshness.js +1 -9
  12. package/extensions/dm-lens/clients/bounded-pid-file-lock.js +141 -30
  13. package/extensions/dm-lens/clients/bounded-telemetry.js +3 -0
  14. package/extensions/dm-lens/clients/cache/rule-cache.js +2 -17
  15. package/extensions/dm-lens/clients/cache-manager.js +105 -17
  16. package/extensions/dm-lens/clients/cargo-manifest.js +23 -3
  17. package/extensions/dm-lens/clients/complexity-client.js +1 -1
  18. package/extensions/dm-lens/clients/config-core/normalize.js +9 -0
  19. package/extensions/dm-lens/clients/config-core/schema.js +3 -0
  20. package/extensions/dm-lens/clients/config-schema.js +105 -2
  21. package/extensions/dm-lens/clients/confirmed-delete.js +11 -0
  22. package/extensions/dm-lens/clients/custom-rule-locations.js +28 -0
  23. package/extensions/dm-lens/clients/dead-code-client.js +81 -12
  24. package/extensions/dm-lens/clients/deferred-runner-blockers.js +108 -0
  25. package/extensions/dm-lens/clients/deferred-test-targets.js +31 -0
  26. package/extensions/dm-lens/clients/degradation-ledger.js +21 -3
  27. package/extensions/dm-lens/clients/demoted-finding-render.js +5 -2
  28. package/extensions/dm-lens/clients/dependency-checker.js +13 -4
  29. package/extensions/dm-lens/clients/diagnostic-line-freshness.js +3 -5
  30. package/extensions/dm-lens/clients/dispatch/adopted-root-runners.js +22 -0
  31. package/extensions/dm-lens/clients/dispatch/dispatcher.js +105 -27
  32. package/extensions/dm-lens/clients/dispatch/facts/comment-facts.js +5 -2
  33. package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +1 -1
  34. package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +2 -2
  35. package/extensions/dm-lens/clients/dispatch/facts/tree-sitter-facts.js +2 -2
  36. package/extensions/dm-lens/clients/dispatch/facts/try-catch-facts.js +1 -1
  37. package/extensions/dm-lens/clients/dispatch/finding-policy.js +12 -4
  38. package/extensions/dm-lens/clients/dispatch/integration.js +60 -15
  39. package/extensions/dm-lens/clients/dispatch/known-runner-ids.js +13 -0
  40. package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +66 -11
  41. package/extensions/dm-lens/clients/dispatch/plan.js +6 -0
  42. package/extensions/dm-lens/clients/dispatch/rule-id-normalize.js +9 -2
  43. package/extensions/dm-lens/clients/dispatch/rule-policy.js +33 -4
  44. package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +9 -5
  45. package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +5 -2
  46. package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +7 -3
  47. package/extensions/dm-lens/clients/dispatch/runners/detekt.js +3 -3
  48. package/extensions/dm-lens/clients/dispatch/runners/fact-rules.js +3 -3
  49. package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +10 -6
  50. package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +8 -5
  51. package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +2 -1
  52. package/extensions/dm-lens/clients/dispatch/runners/lsp.js +28 -8
  53. package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +2 -2
  54. package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +6 -7
  55. package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +18 -8
  56. package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +3 -3
  57. package/extensions/dm-lens/clients/dispatch/runners/pyright.js +1 -1
  58. package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +25 -6
  59. package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +71 -4
  60. package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +5 -1
  61. package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +3 -3
  62. package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +3 -3
  63. package/extensions/dm-lens/clients/dispatch/runners/taplo.js +17 -5
  64. package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +12 -5
  65. package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +3 -3
  66. package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +127 -46
  67. package/extensions/dm-lens/clients/dispatch/runners/utils/tool-failure.js +11 -6
  68. package/extensions/dm-lens/clients/dispatch/runners/vale.js +3 -3
  69. package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +8 -1
  70. package/extensions/dm-lens/clients/dispatch/types.js +21 -1
  71. package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +13 -0
  72. package/extensions/dm-lens/clients/effective-config.js +14 -3
  73. package/extensions/dm-lens/clients/ephemeral-root.js +71 -0
  74. package/extensions/dm-lens/clients/file-kinds.js +9 -0
  75. package/extensions/dm-lens/clients/file-mutation-queue.js +95 -0
  76. package/extensions/dm-lens/clients/file-utils.js +87 -8
  77. package/extensions/dm-lens/clients/finding-delivery-gate.js +5 -2
  78. package/extensions/dm-lens/clients/fix-run-restore.js +416 -0
  79. package/extensions/dm-lens/clients/format-events-publish.js +82 -2
  80. package/extensions/dm-lens/clients/format-service.js +10 -5
  81. package/extensions/dm-lens/clients/formatters.js +29 -12
  82. package/extensions/dm-lens/clients/generation-guard.js +50 -8
  83. package/extensions/dm-lens/clients/generation-lock.js +184 -0
  84. package/extensions/dm-lens/clients/git-guard.js +19 -1
  85. package/extensions/dm-lens/clients/gitleaks-client.js +13 -4
  86. package/extensions/dm-lens/clients/grammar-source.js +5 -0
  87. package/extensions/dm-lens/clients/grammar-wasm-imports.js +48 -0
  88. package/extensions/dm-lens/clients/gzip-stage-write.js +15 -7
  89. package/extensions/dm-lens/clients/hard-failure-summary.js +28 -0
  90. package/extensions/dm-lens/clients/hook-budgets.js +1 -0
  91. package/extensions/dm-lens/clients/inline-blocker-fields.js +8 -0
  92. package/extensions/dm-lens/clients/install-diagnostics.js +31 -16
  93. package/extensions/dm-lens/clients/installer/index.js +238 -58
  94. package/extensions/dm-lens/clients/instance-reaper.js +164 -52
  95. package/extensions/dm-lens/clients/instance-registry-lock.js +117 -76
  96. package/extensions/dm-lens/clients/instance-registry-tail.js +17 -0
  97. package/extensions/dm-lens/clients/instance-registry.js +248 -91
  98. package/extensions/dm-lens/clients/io-bridge-contract.js +7 -0
  99. package/extensions/dm-lens/clients/io-bridge.js +372 -0
  100. package/extensions/dm-lens/clients/jscpd-client.js +83 -35
  101. package/extensions/dm-lens/clients/knip-client.js +75 -6
  102. package/extensions/dm-lens/clients/knip-scan-roots.js +29 -0
  103. package/extensions/dm-lens/clients/language-policy.js +2 -0
  104. package/extensions/dm-lens/clients/language-profile.js +4 -1
  105. package/extensions/dm-lens/clients/language-registry.js +4 -1
  106. package/extensions/dm-lens/clients/latency-logger.js +11 -1
  107. package/extensions/dm-lens/clients/lens-config.js +10 -1
  108. package/extensions/dm-lens/clients/lens-engine.js +1 -1
  109. package/extensions/dm-lens/clients/lens-flag-registry.js +14 -24
  110. package/extensions/dm-lens/clients/lsp/aggregation.js +9 -8
  111. package/extensions/dm-lens/clients/lsp/auxiliary-lifecycle.js +23 -0
  112. package/extensions/dm-lens/clients/lsp/capabilities.js +98 -0
  113. package/extensions/dm-lens/clients/lsp/cascade-tier.js +8 -3
  114. package/extensions/dm-lens/clients/lsp/client.js +282 -48
  115. package/extensions/dm-lens/clients/lsp/config.js +247 -15
  116. package/extensions/dm-lens/clients/lsp/document-drift.js +23 -11
  117. package/extensions/dm-lens/clients/lsp/edits.js +137 -85
  118. package/extensions/dm-lens/clients/lsp/grouping.js +38 -0
  119. package/extensions/dm-lens/clients/lsp/index.js +484 -275
  120. package/extensions/dm-lens/clients/lsp/launch.js +106 -6
  121. package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +37 -7
  122. package/extensions/dm-lens/clients/lsp/resolved-config.js +188 -0
  123. package/extensions/dm-lens/clients/lsp/server-covers.js +8 -0
  124. package/extensions/dm-lens/clients/lsp/server-traits.js +39 -0
  125. package/extensions/dm-lens/clients/lsp/server.js +259 -34
  126. package/extensions/dm-lens/clients/lsp/service-singleton.js +59 -0
  127. package/extensions/dm-lens/clients/lsp/session-roots.js +1 -1
  128. package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +2 -1
  129. package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +25 -4
  130. package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +6 -3
  131. package/extensions/dm-lens/clients/lsp-budget.js +9 -5
  132. package/extensions/dm-lens/clients/lsp-document-symbols.js +1 -1
  133. package/extensions/dm-lens/clients/lsp-lazy.js +1 -1
  134. package/extensions/dm-lens/clients/lsp-mutation.js +44 -8
  135. package/extensions/dm-lens/clients/lsp-status.js +5 -7
  136. package/extensions/dm-lens/clients/mcp/analyze.js +24 -11
  137. package/extensions/dm-lens/clients/mcp/ipc.js +26 -7
  138. package/extensions/dm-lens/clients/mcp/session.js +1 -1
  139. package/extensions/dm-lens/clients/memory-sampler.js +48 -3
  140. package/extensions/dm-lens/clients/module-report-lsp.js +1 -1
  141. package/extensions/dm-lens/clients/module-report.js +9 -3
  142. package/extensions/dm-lens/clients/mutating-tool.js +12 -3
  143. package/extensions/dm-lens/clients/mutation-attribution.js +8 -0
  144. package/extensions/dm-lens/clients/mutation-bridge.js +181 -48
  145. package/extensions/dm-lens/clients/ndjson-logger.js +33 -0
  146. package/extensions/dm-lens/clients/observed-mutation-sources.js +1 -1
  147. package/extensions/dm-lens/clients/observed-mutation.js +40 -20
  148. package/extensions/dm-lens/clients/opaque-mutation-scan.js +40 -13
  149. package/extensions/dm-lens/clients/opengrep-client.js +6 -3
  150. package/extensions/dm-lens/clients/package-manager.js +61 -6
  151. package/extensions/dm-lens/clients/path-utils.js +77 -18
  152. package/extensions/dm-lens/clients/performance-report.js +1 -1
  153. package/extensions/dm-lens/clients/persist-worker-stats.js +8 -0
  154. package/extensions/dm-lens/clients/persistent-reverify.js +5 -1
  155. package/extensions/dm-lens/clients/pipeline.js +310 -114
  156. package/extensions/dm-lens/clients/probe-home-state.js +6 -1
  157. package/extensions/dm-lens/clients/process-bridge.js +28 -0
  158. package/extensions/dm-lens/clients/process-snapshot.js +115 -2
  159. package/extensions/dm-lens/clients/project-changes.js +81 -19
  160. package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +18 -13
  161. package/extensions/dm-lens/clients/project-lens-config.js +32 -5
  162. package/extensions/dm-lens/clients/project-scale.js +1 -1
  163. package/extensions/dm-lens/clients/project-snapshot-fingerprint.js +17 -12
  164. package/extensions/dm-lens/clients/project-snapshot-persist-worker.js +2 -3
  165. package/extensions/dm-lens/clients/project-snapshot.js +229 -64
  166. package/extensions/dm-lens/clients/python-environment.js +44 -2
  167. package/extensions/dm-lens/clients/quiet-window.js +6 -3
  168. package/extensions/dm-lens/clients/read-bridge.js +28 -20
  169. package/extensions/dm-lens/clients/read-expansion.js +1 -1
  170. package/extensions/dm-lens/clients/read-guard-branch.js +129 -0
  171. package/extensions/dm-lens/clients/read-guard-logger.js +11 -3
  172. package/extensions/dm-lens/clients/read-guard-tool-lines.js +16 -8
  173. package/extensions/dm-lens/clients/read-guard.js +516 -176
  174. package/extensions/dm-lens/clients/review-graph/builder.js +132 -54
  175. package/extensions/dm-lens/clients/review-graph/git-identity.js +59 -1
  176. package/extensions/dm-lens/clients/review-graph/import-resolvers.js +6 -8
  177. package/extensions/dm-lens/clients/runtime-agent-end.js +271 -68
  178. package/extensions/dm-lens/clients/runtime-coordinator.js +386 -74
  179. package/extensions/dm-lens/clients/runtime-session.js +174 -31
  180. package/extensions/dm-lens/clients/runtime-tool-call.js +92 -17
  181. package/extensions/dm-lens/clients/runtime-tool-result.js +477 -137
  182. package/extensions/dm-lens/clients/runtime-turn.js +949 -355
  183. package/extensions/dm-lens/clients/safe-spawn.js +12 -4
  184. package/extensions/dm-lens/clients/scanner-temp-root.js +8 -0
  185. package/extensions/dm-lens/clients/scratch-tree-policy.js +9 -0
  186. package/extensions/dm-lens/clients/search-read-registration.js +2 -1
  187. package/extensions/dm-lens/clients/session-lifecycle.js +120 -18
  188. package/extensions/dm-lens/clients/session-scope.js +456 -0
  189. package/extensions/dm-lens/clients/session-state-store.js +23 -20
  190. package/extensions/dm-lens/clients/sg-runner.js +24 -6
  191. package/extensions/dm-lens/clients/sgconfig.js +35 -5
  192. package/extensions/dm-lens/clients/startup-scan.js +10 -2
  193. package/extensions/dm-lens/clients/test-runner-client.js +258 -48
  194. package/extensions/dm-lens/clients/test-runner-delivery.js +46 -9
  195. package/extensions/dm-lens/clients/test-target-roots.js +20 -0
  196. package/extensions/dm-lens/clients/tool-agreement.js +282 -19
  197. package/extensions/dm-lens/clients/tool-config.js +1 -0
  198. package/extensions/dm-lens/clients/tool-event.js +6 -0
  199. package/extensions/dm-lens/clients/tool-probe.js +8 -0
  200. package/extensions/dm-lens/clients/tool-set-policy.js +36 -26
  201. package/extensions/dm-lens/clients/tree-sitter-client.js +304 -34
  202. package/extensions/dm-lens/clients/tree-sitter-query-loader.js +76 -2
  203. package/extensions/dm-lens/clients/tree-sitter-shared.js +2 -2
  204. package/extensions/dm-lens/clients/tree-sitter-symbol-extractor.js +3 -1
  205. package/extensions/dm-lens/clients/trivy-client.js +40 -7
  206. package/extensions/dm-lens/clients/turn-end/delivery-holds.js +59 -0
  207. package/extensions/dm-lens/clients/widget-state.js +36 -2
  208. package/extensions/dm-lens/clients/word-index.js +73 -5
  209. package/extensions/dm-lens/clients/workspace-topology.js +11 -4
  210. package/extensions/dm-lens/clients/write-ordering-guard.js +4 -0
  211. package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +9 -3
  212. package/extensions/dm-lens/dist/clients/actionable-warnings-logger.js +24 -0
  213. package/extensions/dm-lens/dist/clients/actionable-warnings.js +1062 -0
  214. package/extensions/dm-lens/dist/clients/advisory-provenance.js +387 -0
  215. package/extensions/dm-lens/dist/clients/agent-behavior-client.js +94 -0
  216. package/extensions/dm-lens/dist/clients/agent-nudge.js +253 -0
  217. package/extensions/dm-lens/dist/clients/analysed-root.js +1 -0
  218. package/extensions/dm-lens/dist/clients/analysis-root.js +100 -0
  219. package/extensions/dm-lens/dist/clients/ast-grep-client.js +587 -0
  220. package/extensions/dm-lens/dist/clients/ast-grep-rule-manager.js +137 -0
  221. package/extensions/dm-lens/dist/clients/ast-grep-tool-logger.js +85 -0
  222. package/extensions/dm-lens/dist/clients/ast-grep-types.js +1 -0
  223. package/extensions/dm-lens/dist/clients/ast-grep-yaml-synth.js +109 -0
  224. package/extensions/dm-lens/dist/clients/atomic-write-staging.js +66 -0
  225. package/extensions/dm-lens/dist/clients/atomic-write.js +37 -0
  226. package/extensions/dm-lens/dist/clients/availability-probe-flight.js +11 -0
  227. package/extensions/dm-lens/dist/clients/bash-file-access.js +830 -0
  228. package/extensions/dm-lens/dist/clients/biome-client.js +223 -0
  229. package/extensions/dm-lens/dist/clients/blocker-freshness.js +377 -0
  230. package/extensions/dm-lens/dist/clients/blocker-past-eof.js +49 -0
  231. package/extensions/dm-lens/dist/clients/bootstrap.js +246 -0
  232. package/extensions/dm-lens/dist/clients/bounded-cache.js +105 -0
  233. package/extensions/dm-lens/dist/clients/bounded-pid-file-lock.js +275 -0
  234. package/extensions/dm-lens/dist/clients/bounded-telemetry.js +107 -0
  235. package/extensions/dm-lens/dist/clients/build-identity.js +45 -0
  236. package/extensions/dm-lens/dist/clients/bundled-resource-health.js +41 -0
  237. package/extensions/dm-lens/dist/clients/bus-events-logger.js +48 -0
  238. package/extensions/dm-lens/dist/clients/bus-publish.js +117 -0
  239. package/extensions/dm-lens/dist/clients/cache/rule-cache.js +87 -0
  240. package/extensions/dm-lens/dist/clients/cache-manager.js +428 -0
  241. package/extensions/dm-lens/dist/clients/cache-observability.js +847 -0
  242. package/extensions/dm-lens/dist/clients/call-graph.js +628 -0
  243. package/extensions/dm-lens/dist/clients/cargo-manifest.js +171 -0
  244. package/extensions/dm-lens/dist/clients/cascade-budget.js +52 -0
  245. package/extensions/dm-lens/dist/clients/cascade-format.js +160 -0
  246. package/extensions/dm-lens/dist/clients/cascade-logger.js +22 -0
  247. package/extensions/dm-lens/dist/clients/cascade-types.js +1 -0
  248. package/extensions/dm-lens/dist/clients/child-unref.js +59 -0
  249. package/extensions/dm-lens/dist/clients/code-quality-warnings.js +192 -0
  250. package/extensions/dm-lens/dist/clients/codebase-model.js +110 -0
  251. package/extensions/dm-lens/dist/clients/collateral-test-role.js +8 -0
  252. package/extensions/dm-lens/dist/clients/complexity-client.js +398 -0
  253. package/extensions/dm-lens/dist/clients/config-core/deny.js +117 -0
  254. package/extensions/dm-lens/dist/clients/config-core/index.js +2 -0
  255. package/extensions/dm-lens/dist/clients/config-core/merge.js +228 -0
  256. package/extensions/dm-lens/dist/clients/config-core/normalize.js +226 -0
  257. package/extensions/dm-lens/dist/clients/config-core/process-spec.js +147 -0
  258. package/extensions/dm-lens/dist/clients/config-core/provenance.js +54 -0
  259. package/extensions/dm-lens/dist/clients/config-core/records.js +79 -0
  260. package/extensions/dm-lens/dist/clients/config-core/resolve.js +48 -0
  261. package/extensions/dm-lens/dist/clients/config-core/safe-object.js +22 -0
  262. package/extensions/dm-lens/dist/clients/config-core/schema.js +93 -0
  263. package/extensions/dm-lens/dist/clients/config-diagnostic-codes.js +90 -0
  264. package/extensions/dm-lens/dist/clients/config-locations.js +175 -0
  265. package/extensions/dm-lens/dist/clients/config-resolve.js +359 -0
  266. package/extensions/dm-lens/dist/clients/config-schema.js +230 -0
  267. package/extensions/dm-lens/dist/clients/config-warn.js +146 -0
  268. package/extensions/dm-lens/dist/clients/confirmed-delete.js +11 -0
  269. package/extensions/dm-lens/dist/clients/console-guard-install.js +4 -0
  270. package/extensions/dm-lens/dist/clients/cooperative-budget.js +36 -0
  271. package/extensions/dm-lens/dist/clients/custom-rule-locations.js +28 -0
  272. package/extensions/dm-lens/dist/clients/dead-code-client.js +408 -0
  273. package/extensions/dm-lens/dist/clients/dead-code-logger.js +18 -0
  274. package/extensions/dm-lens/dist/clients/deadline-utils.js +117 -0
  275. package/extensions/dm-lens/dist/clients/debug-handles.js +121 -0
  276. package/extensions/dm-lens/dist/clients/debug-heap.js +80 -0
  277. package/extensions/dm-lens/dist/clients/deferred-lsp-work.js +33 -0
  278. package/extensions/dm-lens/dist/clients/deferred-runner-blockers.js +106 -0
  279. package/extensions/dm-lens/dist/clients/deferred-test-targets.js +31 -0
  280. package/extensions/dm-lens/dist/clients/degradation-ledger.js +289 -0
  281. package/extensions/dm-lens/dist/clients/demoted-finding-render.js +64 -0
  282. package/extensions/dm-lens/dist/clients/dependency-checker.js +534 -0
  283. package/extensions/dm-lens/dist/clients/deps/ast-grep-napi.js +17 -0
  284. package/extensions/dm-lens/dist/clients/deps/dm-host-deps.js +10 -0
  285. package/extensions/dm-lens/dist/clients/deps/dm-tui-compat.js +58 -0
  286. package/extensions/dm-lens/dist/clients/deps/js-yaml.js +7 -0
  287. package/extensions/dm-lens/dist/clients/deps/minimatch.js +6 -0
  288. package/extensions/dm-lens/dist/clients/deps/pidusage.js +5 -0
  289. package/extensions/dm-lens/dist/clients/deps/typebox.js +5 -0
  290. package/extensions/dm-lens/dist/clients/deps/vscode-jsonrpc.js +8 -0
  291. package/extensions/dm-lens/dist/clients/deps/web-tree-sitter.js +11 -0
  292. package/extensions/dm-lens/dist/clients/diagnostic-dispositions.js +318 -0
  293. package/extensions/dm-lens/dist/clients/diagnostic-line-freshness.js +142 -0
  294. package/extensions/dm-lens/dist/clients/diagnostic-logger.js +60 -0
  295. package/extensions/dm-lens/dist/clients/diagnostic-tracker.js +89 -0
  296. package/extensions/dm-lens/dist/clients/diagnostics-publish.js +134 -0
  297. package/extensions/dm-lens/dist/clients/dispatch/adopted-root-runners.js +22 -0
  298. package/extensions/dm-lens/dist/clients/dispatch/ast-grep-catalog.js +16 -0
  299. package/extensions/dm-lens/dist/clients/dispatch/auxiliary-lsp.js +158 -0
  300. package/extensions/dm-lens/dist/clients/dispatch/collect-later-tier.js +25 -0
  301. package/extensions/dm-lens/dist/clients/dispatch/diagnostic-taxonomy.js +58 -0
  302. package/extensions/dm-lens/dist/clients/dispatch/dispatcher.js +1017 -0
  303. package/extensions/dm-lens/dist/clients/dispatch/fact-provider-types.js +1 -0
  304. package/extensions/dm-lens/dist/clients/dispatch/fact-rule-runner.js +17 -0
  305. package/extensions/dm-lens/dist/clients/dispatch/fact-runner.js +18 -0
  306. package/extensions/dm-lens/dist/clients/dispatch/fact-scheduler.js +52 -0
  307. package/extensions/dm-lens/dist/clients/dispatch/fact-store.js +199 -0
  308. package/extensions/dm-lens/dist/clients/dispatch/facts/comment-facts.js +23 -0
  309. package/extensions/dm-lens/dist/clients/dispatch/facts/file-content.js +18 -0
  310. package/extensions/dm-lens/dist/clients/dispatch/facts/function-facts.js +281 -0
  311. package/extensions/dm-lens/dist/clients/dispatch/facts/import-facts.js +169 -0
  312. package/extensions/dm-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +19 -0
  313. package/extensions/dm-lens/dist/clients/dispatch/facts/try-catch-facts.js +95 -0
  314. package/extensions/dm-lens/dist/clients/dispatch/finding-policy.js +164 -0
  315. package/extensions/dm-lens/dist/clients/dispatch/indent-detect.js +227 -0
  316. package/extensions/dm-lens/dist/clients/dispatch/inline-suppressions.js +52 -0
  317. package/extensions/dm-lens/dist/clients/dispatch/integration.js +1502 -0
  318. package/extensions/dm-lens/dist/clients/dispatch/known-runner-ids.js +13 -0
  319. package/extensions/dm-lens/dist/clients/dispatch/lazy.js +8 -0
  320. package/extensions/dm-lens/dist/clients/dispatch/pending-runner-findings.js +130 -0
  321. package/extensions/dm-lens/dist/clients/dispatch/plan.js +284 -0
  322. package/extensions/dm-lens/dist/clients/dispatch/priorities.js +14 -0
  323. package/extensions/dm-lens/dist/clients/dispatch/rule-id-normalize.js +49 -0
  324. package/extensions/dm-lens/dist/clients/dispatch/rule-ignores.js +21 -0
  325. package/extensions/dm-lens/dist/clients/dispatch/rule-policy.js +102 -0
  326. package/extensions/dm-lens/dist/clients/dispatch/rules/async-noise.js +31 -0
  327. package/extensions/dm-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +27 -0
  328. package/extensions/dm-lens/dist/clients/dispatch/rules/cors-wildcard.js +35 -0
  329. package/extensions/dm-lens/dist/clients/dispatch/rules/error-obscuring.js +29 -0
  330. package/extensions/dm-lens/dist/clients/dispatch/rules/error-swallowing.js +29 -0
  331. package/extensions/dm-lens/dist/clients/dispatch/rules/framework-call-noise.js +31 -0
  332. package/extensions/dm-lens/dist/clients/dispatch/rules/high-complexity.js +56 -0
  333. package/extensions/dm-lens/dist/clients/dispatch/rules/high-fan-out.js +45 -0
  334. package/extensions/dm-lens/dist/clients/dispatch/rules/high-import-coupling.js +31 -0
  335. package/extensions/dm-lens/dist/clients/dispatch/rules/missing-error-propagation.js +45 -0
  336. package/extensions/dm-lens/dist/clients/dispatch/rules/no-commented-credentials.js +46 -0
  337. package/extensions/dm-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +38 -0
  338. package/extensions/dm-lens/dist/clients/dispatch/rules/placeholder-comments.js +40 -0
  339. package/extensions/dm-lens/dist/clients/dispatch/rules/unsafe-boundary.js +101 -0
  340. package/extensions/dm-lens/dist/clients/dispatch/runner-context.js +46 -0
  341. package/extensions/dm-lens/dist/clients/dispatch/runners/actionlint.js +98 -0
  342. package/extensions/dm-lens/dist/clients/dispatch/runners/ast-grep-napi.js +694 -0
  343. package/extensions/dm-lens/dist/clients/dispatch/runners/biome-check.js +205 -0
  344. package/extensions/dm-lens/dist/clients/dispatch/runners/cpp-check.js +190 -0
  345. package/extensions/dm-lens/dist/clients/dispatch/runners/credo.js +66 -0
  346. package/extensions/dm-lens/dist/clients/dispatch/runners/cue-vet.js +171 -0
  347. package/extensions/dm-lens/dist/clients/dispatch/runners/dart-analyze.js +151 -0
  348. package/extensions/dm-lens/dist/clients/dispatch/runners/detekt.js +157 -0
  349. package/extensions/dm-lens/dist/clients/dispatch/runners/dotnet-build.js +157 -0
  350. package/extensions/dm-lens/dist/clients/dispatch/runners/elixir-check.js +153 -0
  351. package/extensions/dm-lens/dist/clients/dispatch/runners/eslint.js +99 -0
  352. package/extensions/dm-lens/dist/clients/dispatch/runners/fact-rules.js +20 -0
  353. package/extensions/dm-lens/dist/clients/dispatch/runners/fish-indent.js +66 -0
  354. package/extensions/dm-lens/dist/clients/dispatch/runners/gleam-check.js +110 -0
  355. package/extensions/dm-lens/dist/clients/dispatch/runners/go-vet.js +52 -0
  356. package/extensions/dm-lens/dist/clients/dispatch/runners/golangci-lint.js +89 -0
  357. package/extensions/dm-lens/dist/clients/dispatch/runners/hadolint.js +83 -0
  358. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-lint.js +144 -0
  359. package/extensions/dm-lens/dist/clients/dispatch/runners/helm-render.js +593 -0
  360. package/extensions/dm-lens/dist/clients/dispatch/runners/htmlhint.js +103 -0
  361. package/extensions/dm-lens/dist/clients/dispatch/runners/index.js +100 -0
  362. package/extensions/dm-lens/dist/clients/dispatch/runners/javac.js +82 -0
  363. package/extensions/dm-lens/dist/clients/dispatch/runners/ktlint.js +93 -0
  364. package/extensions/dm-lens/dist/clients/dispatch/runners/lsp.js +226 -0
  365. package/extensions/dm-lens/dist/clients/dispatch/runners/markdownlint.js +129 -0
  366. package/extensions/dm-lens/dist/clients/dispatch/runners/mypy.js +70 -0
  367. package/extensions/dm-lens/dist/clients/dispatch/runners/oxlint.js +305 -0
  368. package/extensions/dm-lens/dist/clients/dispatch/runners/php-lint.js +66 -0
  369. package/extensions/dm-lens/dist/clients/dispatch/runners/phpstan.js +90 -0
  370. package/extensions/dm-lens/dist/clients/dispatch/runners/prisma-validate.js +66 -0
  371. package/extensions/dm-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +307 -0
  372. package/extensions/dm-lens/dist/clients/dispatch/runners/pyright.js +118 -0
  373. package/extensions/dm-lens/dist/clients/dispatch/runners/rubocop.js +79 -0
  374. package/extensions/dm-lens/dist/clients/dispatch/runners/ruff.js +69 -0
  375. package/extensions/dm-lens/dist/clients/dispatch/runners/rust-clippy.js +166 -0
  376. package/extensions/dm-lens/dist/clients/dispatch/runners/shellcheck.js +177 -0
  377. package/extensions/dm-lens/dist/clients/dispatch/runners/shfmt.js +85 -0
  378. package/extensions/dm-lens/dist/clients/dispatch/runners/spellcheck.js +74 -0
  379. package/extensions/dm-lens/dist/clients/dispatch/runners/spotbugs.js +208 -0
  380. package/extensions/dm-lens/dist/clients/dispatch/runners/sqlfluff.js +136 -0
  381. package/extensions/dm-lens/dist/clients/dispatch/runners/stylelint.js +118 -0
  382. package/extensions/dm-lens/dist/clients/dispatch/runners/swiftlint.js +143 -0
  383. package/extensions/dm-lens/dist/clients/dispatch/runners/taplo.js +108 -0
  384. package/extensions/dm-lens/dist/clients/dispatch/runners/terragrunt.js +110 -0
  385. package/extensions/dm-lens/dist/clients/dispatch/runners/tflint.js +104 -0
  386. package/extensions/dm-lens/dist/clients/dispatch/runners/tree-sitter.js +521 -0
  387. package/extensions/dm-lens/dist/clients/dispatch/runners/trivy-config.js +155 -0
  388. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/availability-policy.js +285 -0
  389. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +61 -0
  390. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +61 -0
  391. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +130 -0
  392. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +1143 -0
  393. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +40 -0
  394. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/tool-failure.js +120 -0
  395. package/extensions/dm-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +88 -0
  396. package/extensions/dm-lens/dist/clients/dispatch/runners/utils.js +8 -0
  397. package/extensions/dm-lens/dist/clients/dispatch/runners/vale.js +106 -0
  398. package/extensions/dm-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +170 -0
  399. package/extensions/dm-lens/dist/clients/dispatch/runners/yamllint.js +83 -0
  400. package/extensions/dm-lens/dist/clients/dispatch/runners/zig-check.js +72 -0
  401. package/extensions/dm-lens/dist/clients/dispatch/suppress-writer.js +57 -0
  402. package/extensions/dm-lens/dist/clients/dispatch/tool-profile.js +30 -0
  403. package/extensions/dm-lens/dist/clients/dispatch/types.js +27 -0
  404. package/extensions/dm-lens/dist/clients/dispatch/utils/format-utils.js +58 -0
  405. package/extensions/dm-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +31 -0
  406. package/extensions/dm-lens/dist/clients/disposition-logger.js +19 -0
  407. package/extensions/dm-lens/dist/clients/disposition-publish.js +88 -0
  408. package/extensions/dm-lens/dist/clients/durable-store.js +77 -0
  409. package/extensions/dm-lens/dist/clients/effective-config.js +170 -0
  410. package/extensions/dm-lens/dist/clients/env-utils.js +26 -0
  411. package/extensions/dm-lens/dist/clients/ephemeral-root.js +67 -0
  412. package/extensions/dm-lens/dist/clients/error-class.js +3 -0
  413. package/extensions/dm-lens/dist/clients/eval-timestamp.js +2 -0
  414. package/extensions/dm-lens/dist/clients/event-loop-hold.js +119 -0
  415. package/extensions/dm-lens/dist/clients/event-loop-monitor.js +84 -0
  416. package/extensions/dm-lens/dist/clients/extension-log.js +230 -0
  417. package/extensions/dm-lens/dist/clients/extension-mode.js +20 -0
  418. package/extensions/dm-lens/dist/clients/feature-hints.js +88 -0
  419. package/extensions/dm-lens/dist/clients/file-kinds.js +313 -0
  420. package/extensions/dm-lens/dist/clients/file-mutation-queue.js +95 -0
  421. package/extensions/dm-lens/dist/clients/file-role.js +50 -0
  422. package/extensions/dm-lens/dist/clients/file-time.js +112 -0
  423. package/extensions/dm-lens/dist/clients/file-utils.js +706 -0
  424. package/extensions/dm-lens/dist/clients/finding-delivery-gate.js +132 -0
  425. package/extensions/dm-lens/dist/clients/finding-identity.js +23 -0
  426. package/extensions/dm-lens/dist/clients/fix-run-restore.js +413 -0
  427. package/extensions/dm-lens/dist/clients/fix-worklog.js +75 -0
  428. package/extensions/dm-lens/dist/clients/format-events-publish.js +310 -0
  429. package/extensions/dm-lens/dist/clients/format-service.js +159 -0
  430. package/extensions/dm-lens/dist/clients/formatters-lazy.js +8 -0
  431. package/extensions/dm-lens/dist/clients/formatters.js +1367 -0
  432. package/extensions/dm-lens/dist/clients/freshness-cadence.js +1 -0
  433. package/extensions/dm-lens/dist/clients/freshness.js +8 -0
  434. package/extensions/dm-lens/dist/clients/generated-artifacts.js +209 -0
  435. package/extensions/dm-lens/dist/clients/generation-guard.js +147 -0
  436. package/extensions/dm-lens/dist/clients/generation-lock.js +181 -0
  437. package/extensions/dm-lens/dist/clients/git-guard.js +786 -0
  438. package/extensions/dm-lens/dist/clients/git-tracked-ignore.js +120 -0
  439. package/extensions/dm-lens/dist/clients/gitleaks-client.js +290 -0
  440. package/extensions/dm-lens/dist/clients/go-client.js +47 -0
  441. package/extensions/dm-lens/dist/clients/govulncheck-client.js +411 -0
  442. package/extensions/dm-lens/dist/clients/gradle-ktfmt-style.js +177 -0
  443. package/extensions/dm-lens/dist/clients/grammar-source.js +229 -0
  444. package/extensions/dm-lens/dist/clients/grammar-wasm-imports.js +48 -0
  445. package/extensions/dm-lens/dist/clients/gzip-stage-write.js +93 -0
  446. package/extensions/dm-lens/dist/clients/hard-failure-summary.js +28 -0
  447. package/extensions/dm-lens/dist/clients/hashline-anchor.js +222 -0
  448. package/extensions/dm-lens/dist/clients/hook-budgets.js +17 -0
  449. package/extensions/dm-lens/dist/clients/host-edit-normalize.js +87 -0
  450. package/extensions/dm-lens/dist/clients/host-ports.js +35 -0
  451. package/extensions/dm-lens/dist/clients/indent-retarget.js +102 -0
  452. package/extensions/dm-lens/dist/clients/inline-blocker-dispositions.js +103 -0
  453. package/extensions/dm-lens/dist/clients/inline-blocker-fields.js +8 -0
  454. package/extensions/dm-lens/dist/clients/install-diagnostics.js +135 -0
  455. package/extensions/dm-lens/dist/clients/installer/index.js +3935 -0
  456. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh-session.js +17 -0
  457. package/extensions/dm-lens/dist/clients/installer/managed-tool-refresh.js +522 -0
  458. package/extensions/dm-lens/dist/clients/instance-reaper-state.js +3 -0
  459. package/extensions/dm-lens/dist/clients/instance-reaper.js +682 -0
  460. package/extensions/dm-lens/dist/clients/instance-registry-lock.js +166 -0
  461. package/extensions/dm-lens/dist/clients/instance-registry-tail.js +17 -0
  462. package/extensions/dm-lens/dist/clients/instance-registry.js +595 -0
  463. package/extensions/dm-lens/dist/clients/io-bridge-contract.js +7 -0
  464. package/extensions/dm-lens/dist/clients/io-bridge.js +357 -0
  465. package/extensions/dm-lens/dist/clients/jscpd-client.js +300 -0
  466. package/extensions/dm-lens/dist/clients/json-cache-read.js +25 -0
  467. package/extensions/dm-lens/dist/clients/knip-client.js +534 -0
  468. package/extensions/dm-lens/dist/clients/knip-scan-roots.js +26 -0
  469. package/extensions/dm-lens/dist/clients/language-policy.js +244 -0
  470. package/extensions/dm-lens/dist/clients/language-profile.js +263 -0
  471. package/extensions/dm-lens/dist/clients/language-registry.js +427 -0
  472. package/extensions/dm-lens/dist/clients/latency-logger.js +202 -0
  473. package/extensions/dm-lens/dist/clients/lazy-import.js +14 -0
  474. package/extensions/dm-lens/dist/clients/ledger-bounds.js +21 -0
  475. package/extensions/dm-lens/dist/clients/lens-config.js +246 -0
  476. package/extensions/dm-lens/dist/clients/lens-engine.js +181 -0
  477. package/extensions/dm-lens/dist/clients/lens-events.js +105 -0
  478. package/extensions/dm-lens/dist/clients/lens-flag-registry.js +292 -0
  479. package/extensions/dm-lens/dist/clients/lens-map.js +980 -0
  480. package/extensions/dm-lens/dist/clients/live-bus-emitter.js +53 -0
  481. package/extensions/dm-lens/dist/clients/log-cleanup.js +138 -0
  482. package/extensions/dm-lens/dist/clients/lsp/aggregation.js +89 -0
  483. package/extensions/dm-lens/dist/clients/lsp/auxiliary-lifecycle.js +23 -0
  484. package/extensions/dm-lens/dist/clients/lsp/capabilities.js +94 -0
  485. package/extensions/dm-lens/dist/clients/lsp/cascade-tier.js +208 -0
  486. package/extensions/dm-lens/dist/clients/lsp/client.js +2943 -0
  487. package/extensions/dm-lens/dist/clients/lsp/config.js +471 -0
  488. package/extensions/dm-lens/dist/clients/lsp/content-limits.js +21 -0
  489. package/extensions/dm-lens/dist/clients/lsp/diagnostic-binding.js +79 -0
  490. package/extensions/dm-lens/dist/clients/lsp/document-drift.js +324 -0
  491. package/extensions/dm-lens/dist/clients/lsp/edits.js +982 -0
  492. package/extensions/dm-lens/dist/clients/lsp/grouping.js +38 -0
  493. package/extensions/dm-lens/dist/clients/lsp/index.js +4639 -0
  494. package/extensions/dm-lens/dist/clients/lsp/inferred-project.js +121 -0
  495. package/extensions/dm-lens/dist/clients/lsp/jvm-runtime.js +194 -0
  496. package/extensions/dm-lens/dist/clients/lsp/language.js +23 -0
  497. package/extensions/dm-lens/dist/clients/lsp/launch.js +564 -0
  498. package/extensions/dm-lens/dist/clients/lsp/lombok.js +146 -0
  499. package/extensions/dm-lens/dist/clients/lsp/path-utils.js +1 -0
  500. package/extensions/dm-lens/dist/clients/lsp/pending-aux-coverage.js +120 -0
  501. package/extensions/dm-lens/dist/clients/lsp/position-encoding.js +28 -0
  502. package/extensions/dm-lens/dist/clients/lsp/resolved-config.js +183 -0
  503. package/extensions/dm-lens/dist/clients/lsp/ruby-drive-dirs.js +42 -0
  504. package/extensions/dm-lens/dist/clients/lsp/server-covers.js +8 -0
  505. package/extensions/dm-lens/dist/clients/lsp/server-traits.js +39 -0
  506. package/extensions/dm-lens/dist/clients/lsp/server.js +2640 -0
  507. package/extensions/dm-lens/dist/clients/lsp/service-singleton.js +59 -0
  508. package/extensions/dm-lens/dist/clients/lsp/session-roots.js +52 -0
  509. package/extensions/dm-lens/dist/clients/lsp/spawn-history.js +15 -0
  510. package/extensions/dm-lens/dist/clients/lsp/sync-kind.js +30 -0
  511. package/extensions/dm-lens/dist/clients/lsp/tsserver-sync.js +156 -0
  512. package/extensions/dm-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +1 -0
  513. package/extensions/dm-lens/dist/clients/lsp/wait-policy/classification.js +37 -0
  514. package/extensions/dm-lens/dist/clients/lsp/wait-policy/index.js +3 -0
  515. package/extensions/dm-lens/dist/clients/lsp/wait-policy/strategies.js +196 -0
  516. package/extensions/dm-lens/dist/clients/lsp/watch-queue.js +40 -0
  517. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-cache.js +270 -0
  518. package/extensions/dm-lens/dist/clients/lsp/workspace-diagnostics-session.js +7 -0
  519. package/extensions/dm-lens/dist/clients/lsp/workspace-sweep-hold.js +93 -0
  520. package/extensions/dm-lens/dist/clients/lsp-budget.js +87 -0
  521. package/extensions/dm-lens/dist/clients/lsp-document-symbols.js +93 -0
  522. package/extensions/dm-lens/dist/clients/lsp-lazy.js +8 -0
  523. package/extensions/dm-lens/dist/clients/lsp-mutation.js +309 -0
  524. package/extensions/dm-lens/dist/clients/lsp-status.js +35 -0
  525. package/extensions/dm-lens/dist/clients/map-with-concurrency.js +20 -0
  526. package/extensions/dm-lens/dist/clients/mcp/analyze.js +265 -0
  527. package/extensions/dm-lens/dist/clients/mcp/host-shim.js +14 -0
  528. package/extensions/dm-lens/dist/clients/mcp/ipc.js +321 -0
  529. package/extensions/dm-lens/dist/clients/mcp/review.js +137 -0
  530. package/extensions/dm-lens/dist/clients/mcp/session.js +305 -0
  531. package/extensions/dm-lens/dist/clients/memory-sampler.js +145 -0
  532. package/extensions/dm-lens/dist/clients/message-end-attribution.js +18 -0
  533. package/extensions/dm-lens/dist/clients/metrics-client.js +80 -0
  534. package/extensions/dm-lens/dist/clients/metrics-history.js +255 -0
  535. package/extensions/dm-lens/dist/clients/middle-man-analysis.js +161 -0
  536. package/extensions/dm-lens/dist/clients/model-provider.js +31 -0
  537. package/extensions/dm-lens/dist/clients/module-report-lsp.js +140 -0
  538. package/extensions/dm-lens/dist/clients/module-report.js +1648 -0
  539. package/extensions/dm-lens/dist/clients/mutating-tool.js +386 -0
  540. package/extensions/dm-lens/dist/clients/mutation-attribution.js +176 -0
  541. package/extensions/dm-lens/dist/clients/mutation-bridge.js +231 -0
  542. package/extensions/dm-lens/dist/clients/ndjson-logger.js +504 -0
  543. package/extensions/dm-lens/dist/clients/observed-mutation-sources.js +43 -0
  544. package/extensions/dm-lens/dist/clients/observed-mutation.js +729 -0
  545. package/extensions/dm-lens/dist/clients/oldtext-autopatch.js +100 -0
  546. package/extensions/dm-lens/dist/clients/opaque-mutation-scan.js +340 -0
  547. package/extensions/dm-lens/dist/clients/opengrep-client.js +219 -0
  548. package/extensions/dm-lens/dist/clients/opengrep-config.js +52 -0
  549. package/extensions/dm-lens/dist/clients/package-manager.js +358 -0
  550. package/extensions/dm-lens/dist/clients/package-root.js +25 -0
  551. package/extensions/dm-lens/dist/clients/partial-edit-apply.js +337 -0
  552. package/extensions/dm-lens/dist/clients/path-attribution-telemetry.js +31 -0
  553. package/extensions/dm-lens/dist/clients/path-keyed-map.js +57 -0
  554. package/extensions/dm-lens/dist/clients/path-utils.js +535 -0
  555. package/extensions/dm-lens/dist/clients/performance-report.js +291 -0
  556. package/extensions/dm-lens/dist/clients/persist-debounce.js +37 -0
  557. package/extensions/dm-lens/dist/clients/persist-worker-stats.js +8 -0
  558. package/extensions/dm-lens/dist/clients/persistent-reverify.js +166 -0
  559. package/extensions/dm-lens/dist/clients/php-cs-fixer-config.js +15 -0
  560. package/extensions/dm-lens/dist/clients/pipeline.js +1279 -0
  561. package/extensions/dm-lens/dist/clients/post-autofix-notice.js +19 -0
  562. package/extensions/dm-lens/dist/clients/print-mode.js +3 -0
  563. package/extensions/dm-lens/dist/clients/probe-home-state.js +67 -0
  564. package/extensions/dm-lens/dist/clients/process-bridge.js +48 -0
  565. package/extensions/dm-lens/dist/clients/process-singletons.js +69 -0
  566. package/extensions/dm-lens/dist/clients/process-snapshot.js +130 -0
  567. package/extensions/dm-lens/dist/clients/project-changes.js +174 -0
  568. package/extensions/dm-lens/dist/clients/project-conventions.js +152 -0
  569. package/extensions/dm-lens/dist/clients/project-diagnostics/cache.js +91 -0
  570. package/extensions/dm-lens/dist/clients/project-diagnostics/extractors.js +53 -0
  571. package/extensions/dm-lens/dist/clients/project-diagnostics/fresh-fetch.js +413 -0
  572. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +64 -0
  573. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +38 -0
  574. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +21 -0
  575. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +23 -0
  576. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +28 -0
  577. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +45 -0
  578. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +34 -0
  579. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +32 -0
  580. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +79 -0
  581. package/extensions/dm-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +41 -0
  582. package/extensions/dm-lens/dist/clients/project-diagnostics/scanner.js +349 -0
  583. package/extensions/dm-lens/dist/clients/project-diagnostics/types.js +1 -0
  584. package/extensions/dm-lens/dist/clients/project-lens-config.js +464 -0
  585. package/extensions/dm-lens/dist/clients/project-report.js +527 -0
  586. package/extensions/dm-lens/dist/clients/project-scale.js +60 -0
  587. package/extensions/dm-lens/dist/clients/project-scan-policy.js +4 -0
  588. package/extensions/dm-lens/dist/clients/project-snapshot-fingerprint.js +44 -0
  589. package/extensions/dm-lens/dist/clients/project-snapshot-persist-worker.js +13 -0
  590. package/extensions/dm-lens/dist/clients/project-snapshot.js +1333 -0
  591. package/extensions/dm-lens/dist/clients/project-trust.js +104 -0
  592. package/extensions/dm-lens/dist/clients/python-environment.js +162 -0
  593. package/extensions/dm-lens/dist/clients/python-provenance.js +551 -0
  594. package/extensions/dm-lens/dist/clients/quiet-window-config.js +16 -0
  595. package/extensions/dm-lens/dist/clients/quiet-window.js +129 -0
  596. package/extensions/dm-lens/dist/clients/read-bridge.js +53 -0
  597. package/extensions/dm-lens/dist/clients/read-expansion.js +218 -0
  598. package/extensions/dm-lens/dist/clients/read-guard-branch.js +126 -0
  599. package/extensions/dm-lens/dist/clients/read-guard-logger.js +186 -0
  600. package/extensions/dm-lens/dist/clients/read-guard-tool-lines.js +1050 -0
  601. package/extensions/dm-lens/dist/clients/read-guard.js +1429 -0
  602. package/extensions/dm-lens/dist/clients/recent-touches.js +126 -0
  603. package/extensions/dm-lens/dist/clients/redact/secrets.js +386 -0
  604. package/extensions/dm-lens/dist/clients/resource-sampler.js +344 -0
  605. package/extensions/dm-lens/dist/clients/reverse-deps.js +227 -0
  606. package/extensions/dm-lens/dist/clients/review-graph/builder.js +3708 -0
  607. package/extensions/dm-lens/dist/clients/review-graph/format.js +30 -0
  608. package/extensions/dm-lens/dist/clients/review-graph/git-identity.js +168 -0
  609. package/extensions/dm-lens/dist/clients/review-graph/import-resolvers.js +323 -0
  610. package/extensions/dm-lens/dist/clients/review-graph/persist-worker.js +8 -0
  611. package/extensions/dm-lens/dist/clients/review-graph/query.js +195 -0
  612. package/extensions/dm-lens/dist/clients/review-graph/revision-drift.js +3 -0
  613. package/extensions/dm-lens/dist/clients/review-graph/service.js +60 -0
  614. package/extensions/dm-lens/dist/clients/review-graph/shared-extraction-ir.js +54 -0
  615. package/extensions/dm-lens/dist/clients/review-graph/symbol-id.js +29 -0
  616. package/extensions/dm-lens/dist/clients/review-graph/tsconfig-paths.js +253 -0
  617. package/extensions/dm-lens/dist/clients/review-graph/types.js +1 -0
  618. package/extensions/dm-lens/dist/clients/review-graph/workspace-modules.js +374 -0
  619. package/extensions/dm-lens/dist/clients/review-graph-logger.js +51 -0
  620. package/extensions/dm-lens/dist/clients/ruff-client.js +109 -0
  621. package/extensions/dm-lens/dist/clients/rules-scanner.js +113 -0
  622. package/extensions/dm-lens/dist/clients/run-duration.js +9 -0
  623. package/extensions/dm-lens/dist/clients/runtime-agent-end.js +800 -0
  624. package/extensions/dm-lens/dist/clients/runtime-config.js +39 -0
  625. package/extensions/dm-lens/dist/clients/runtime-context.js +155 -0
  626. package/extensions/dm-lens/dist/clients/runtime-coordinator.js +1117 -0
  627. package/extensions/dm-lens/dist/clients/runtime-session.js +1768 -0
  628. package/extensions/dm-lens/dist/clients/runtime-tool-call.js +935 -0
  629. package/extensions/dm-lens/dist/clients/runtime-tool-result.js +1630 -0
  630. package/extensions/dm-lens/dist/clients/runtime-turn.js +2900 -0
  631. package/extensions/dm-lens/dist/clients/rust-client.js +48 -0
  632. package/extensions/dm-lens/dist/clients/safe-spawn.js +1275 -0
  633. package/extensions/dm-lens/dist/clients/sanitize.js +174 -0
  634. package/extensions/dm-lens/dist/clients/scan-utils.js +7 -0
  635. package/extensions/dm-lens/dist/clients/scanner-temp-root.js +8 -0
  636. package/extensions/dm-lens/dist/clients/scratch-tree-policy.js +63 -0
  637. package/extensions/dm-lens/dist/clients/search-read-registration.js +60 -0
  638. package/extensions/dm-lens/dist/clients/secret-findings.js +69 -0
  639. package/extensions/dm-lens/dist/clients/security-scan-client.js +208 -0
  640. package/extensions/dm-lens/dist/clients/session-event-guard.js +111 -0
  641. package/extensions/dm-lens/dist/clients/session-lifecycle.js +269 -0
  642. package/extensions/dm-lens/dist/clients/session-scope.js +451 -0
  643. package/extensions/dm-lens/dist/clients/session-start-observability.js +47 -0
  644. package/extensions/dm-lens/dist/clients/session-state-store.js +66 -0
  645. package/extensions/dm-lens/dist/clients/session-summary.js +8 -0
  646. package/extensions/dm-lens/dist/clients/sessionstart-logger.js +22 -0
  647. package/extensions/dm-lens/dist/clients/sg-runner.js +645 -0
  648. package/extensions/dm-lens/dist/clients/sgconfig.js +306 -0
  649. package/extensions/dm-lens/dist/clients/shared-checkout-guard.js +177 -0
  650. package/extensions/dm-lens/dist/clients/single-flight.js +52 -0
  651. package/extensions/dm-lens/dist/clients/situational-tool-telemetry.js +85 -0
  652. package/extensions/dm-lens/dist/clients/skills-resolver.js +38 -0
  653. package/extensions/dm-lens/dist/clients/slow-fs.js +77 -0
  654. package/extensions/dm-lens/dist/clients/smells-rollup.js +118 -0
  655. package/extensions/dm-lens/dist/clients/source-filter.js +320 -0
  656. package/extensions/dm-lens/dist/clients/source-walker.js +96 -0
  657. package/extensions/dm-lens/dist/clients/spawn-output-cap.js +35 -0
  658. package/extensions/dm-lens/dist/clients/spawn-timeout-cooldown.js +51 -0
  659. package/extensions/dm-lens/dist/clients/stale-marker.js +1 -0
  660. package/extensions/dm-lens/dist/clients/startup-scan.js +230 -0
  661. package/extensions/dm-lens/dist/clients/startup-timing.js +67 -0
  662. package/extensions/dm-lens/dist/clients/string-utils.js +6 -0
  663. package/extensions/dm-lens/dist/clients/subagent-mode.js +40 -0
  664. package/extensions/dm-lens/dist/clients/symbol-containment.js +16 -0
  665. package/extensions/dm-lens/dist/clients/symbol-types.js +1 -0
  666. package/extensions/dm-lens/dist/clients/test-runner-client.js +1697 -0
  667. package/extensions/dm-lens/dist/clients/test-runner-delivery.js +293 -0
  668. package/extensions/dm-lens/dist/clients/test-target-roots.js +17 -0
  669. package/extensions/dm-lens/dist/clients/todo-scanner.js +164 -0
  670. package/extensions/dm-lens/dist/clients/tool-agreement.js +640 -0
  671. package/extensions/dm-lens/dist/clients/tool-config.js +219 -0
  672. package/extensions/dm-lens/dist/clients/tool-cwd.js +235 -0
  673. package/extensions/dm-lens/dist/clients/tool-definition.js +22 -0
  674. package/extensions/dm-lens/dist/clients/tool-event.js +24 -0
  675. package/extensions/dm-lens/dist/clients/tool-policy.js +2393 -0
  676. package/extensions/dm-lens/dist/clients/tool-probe.js +13 -0
  677. package/extensions/dm-lens/dist/clients/tool-render.js +79 -0
  678. package/extensions/dm-lens/dist/clients/tool-set-policy.js +77 -0
  679. package/extensions/dm-lens/dist/clients/tree-sitter-cache.js +206 -0
  680. package/extensions/dm-lens/dist/clients/tree-sitter-client.js +3057 -0
  681. package/extensions/dm-lens/dist/clients/tree-sitter-logger.js +77 -0
  682. package/extensions/dm-lens/dist/clients/tree-sitter-navigator.js +198 -0
  683. package/extensions/dm-lens/dist/clients/tree-sitter-query-loader.js +389 -0
  684. package/extensions/dm-lens/dist/clients/tree-sitter-shared.js +87 -0
  685. package/extensions/dm-lens/dist/clients/tree-sitter-symbol-extractor.js +959 -0
  686. package/extensions/dm-lens/dist/clients/trivy-client.js +335 -0
  687. package/extensions/dm-lens/dist/clients/tui-fit.js +26 -0
  688. package/extensions/dm-lens/dist/clients/turn-context.js +48 -0
  689. package/extensions/dm-lens/dist/clients/turn-end/delivery-holds.js +59 -0
  690. package/extensions/dm-lens/dist/clients/turn-end/lane.js +1 -0
  691. package/extensions/dm-lens/dist/clients/turn-end/lanes/govulncheck.js +54 -0
  692. package/extensions/dm-lens/dist/clients/turn-end/lanes/secrets.js +131 -0
  693. package/extensions/dm-lens/dist/clients/turn-summary-render.js +56 -0
  694. package/extensions/dm-lens/dist/clients/turn-summary.js +84 -0
  695. package/extensions/dm-lens/dist/clients/typos-config.js +9 -0
  696. package/extensions/dm-lens/dist/clients/user-notify.js +15 -0
  697. package/extensions/dm-lens/dist/clients/vanished-instance-marker.js +18 -0
  698. package/extensions/dm-lens/dist/clients/warm-attach.js +210 -0
  699. package/extensions/dm-lens/dist/clients/widget-state.js +997 -0
  700. package/extensions/dm-lens/dist/clients/word-index-logger.js +21 -0
  701. package/extensions/dm-lens/dist/clients/word-index-store.js +222 -0
  702. package/extensions/dm-lens/dist/clients/word-index.js +1494 -0
  703. package/extensions/dm-lens/dist/clients/workspace-topology.js +268 -0
  704. package/extensions/dm-lens/dist/clients/write-ordering-guard.js +28 -0
  705. package/extensions/dm-lens/dist/clients/zizmor-config.js +160 -0
  706. package/extensions/dm-lens/dist/i18n.js +67 -0
  707. package/extensions/dm-lens/dist/index.js +1973 -0
  708. package/extensions/dm-lens/dist/mcp/analyze-cli.js +205 -0
  709. package/extensions/dm-lens/dist/mcp/build-staleness.js +55 -0
  710. package/extensions/dm-lens/dist/mcp/cli.js +96 -0
  711. package/extensions/dm-lens/dist/mcp/server.js +1239 -0
  712. package/extensions/dm-lens/dist/mcp/tool-arguments.js +134 -0
  713. package/extensions/dm-lens/dist/mcp/worker.js +41 -0
  714. package/extensions/dm-lens/dist/scripts/lib/process-scan.mjs +375 -0
  715. package/extensions/dm-lens/dist/scripts/lib/skills-predicate.mjs +53 -0
  716. package/extensions/dm-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +51 -0
  717. package/extensions/dm-lens/dist/tools/activate-tools.js +62 -0
  718. package/extensions/dm-lens/dist/tools/ast-grep-outline.js +126 -0
  719. package/extensions/dm-lens/dist/tools/ast-grep-replace.js +227 -0
  720. package/extensions/dm-lens/dist/tools/ast-grep-search.js +687 -0
  721. package/extensions/dm-lens/dist/tools/effective-config.js +59 -0
  722. package/extensions/dm-lens/dist/tools/lens-diagnostic-mark.js +251 -0
  723. package/extensions/dm-lens/dist/tools/lens-diagnostics.js +1518 -0
  724. package/extensions/dm-lens/dist/tools/lsp-diagnostics.js +1198 -0
  725. package/extensions/dm-lens/dist/tools/lsp-navigation.js +1249 -0
  726. package/extensions/dm-lens/dist/tools/lsp-structured-output.js +277 -0
  727. package/extensions/dm-lens/dist/tools/module-report.js +332 -0
  728. package/extensions/dm-lens/dist/tools/project-report.js +72 -0
  729. package/extensions/dm-lens/dist/tools/render-compact.js +272 -0
  730. package/extensions/dm-lens/dist/tools/scan-progress.js +31 -0
  731. package/extensions/dm-lens/dist/tools/shared.js +32 -0
  732. package/extensions/dm-lens/dist/tools/symbol-search.js +133 -0
  733. package/extensions/dm-lens/i18n.js +3 -3
  734. package/extensions/dm-lens/index.js +431 -214
  735. package/extensions/dm-lens/mcp/analyze-cli.js +63 -36
  736. package/extensions/dm-lens/mcp/cli.js +20 -0
  737. package/extensions/dm-lens/mcp/server.js +40 -3
  738. package/extensions/dm-lens/mcp/tool-arguments.js +134 -0
  739. package/extensions/dm-lens/mcp/worker.js +8 -0
  740. package/extensions/dm-lens/package.json +1 -1
  741. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  742. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  743. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  744. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  745. package/extensions/dm-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  746. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  747. package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  748. package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  749. package/extensions/dm-lens/scripts/lib/process-scan.mjs +126 -7
  750. package/extensions/dm-lens/scripts/lib/web-tree-sitter-dir.mjs +6 -0
  751. package/extensions/dm-lens/tools/activate-tools.js +3 -2
  752. package/extensions/dm-lens/tools/ast-grep-outline.js +2 -3
  753. package/extensions/dm-lens/tools/ast-grep-replace.js +6 -5
  754. package/extensions/dm-lens/tools/ast-grep-search.js +2 -2
  755. package/extensions/dm-lens/tools/lens-diagnostic-mark.js +12 -1
  756. package/extensions/dm-lens/tools/lens-diagnostics.js +74 -37
  757. package/extensions/dm-lens/tools/lsp-diagnostics.js +140 -25
  758. package/extensions/dm-lens/tools/lsp-navigation.js +64 -7
  759. package/extensions/dm-lens/tools/module-report.js +6 -6
  760. package/extensions/dm-lens/tools/shared.js +6 -0
  761. package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +1 -1
  762. package/extensions/dm-mcp-adapter/cli.js +265 -23
  763. package/extensions/dm-mcp-adapter/commands.js +83 -17
  764. package/extensions/dm-mcp-adapter/config.js +517 -92
  765. package/extensions/dm-mcp-adapter/direct-tool-surface.js +10 -8
  766. package/extensions/dm-mcp-adapter/direct-tools.js +54 -36
  767. package/extensions/dm-mcp-adapter/dist/abort.js +35 -0
  768. package/extensions/dm-mcp-adapter/dist/agent-dir.js +45 -0
  769. package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +392 -0
  770. package/extensions/dm-mcp-adapter/dist/agent-plugin-provenance.js +26 -0
  771. package/extensions/dm-mcp-adapter/dist/bearer-command-resolver.js +182 -0
  772. package/extensions/dm-mcp-adapter/dist/claude-plugin-loader.js +350 -0
  773. package/extensions/dm-mcp-adapter/dist/config.js +1735 -0
  774. package/extensions/dm-mcp-adapter/dist/consent-manager.js +84 -0
  775. package/extensions/dm-mcp-adapter/dist/elicitation-handler.js +370 -0
  776. package/extensions/dm-mcp-adapter/dist/errors.js +225 -0
  777. package/extensions/dm-mcp-adapter/dist/http-ca.js +75 -0
  778. package/extensions/dm-mcp-adapter/dist/jev-client.js +359 -0
  779. package/extensions/dm-mcp-adapter/dist/jev-contracts.js +1 -0
  780. package/extensions/dm-mcp-adapter/dist/jev-key-store.js +189 -0
  781. package/extensions/dm-mcp-adapter/dist/json-schema-validator.js +70 -0
  782. package/extensions/dm-mcp-adapter/dist/lifecycle.js +387 -0
  783. package/extensions/dm-mcp-adapter/dist/logger.js +115 -0
  784. package/extensions/dm-mcp-adapter/dist/mcp-auth-fetch.js +86 -0
  785. package/extensions/dm-mcp-adapter/dist/mcp-auth-flow.js +956 -0
  786. package/extensions/dm-mcp-adapter/dist/mcp-auth.js +998 -0
  787. package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +182 -0
  788. package/extensions/dm-mcp-adapter/dist/mcp-callback-server.js +380 -0
  789. package/extensions/dm-mcp-adapter/dist/mcp-oauth-provider.js +525 -0
  790. package/extensions/dm-mcp-adapter/dist/mcp-probe.js +151 -0
  791. package/extensions/dm-mcp-adapter/dist/mcp-tasks.js +300 -0
  792. package/extensions/dm-mcp-adapter/dist/mcp-trace.js +220 -0
  793. package/extensions/dm-mcp-adapter/dist/metadata-cache.js +323 -0
  794. package/extensions/dm-mcp-adapter/dist/npx-resolver.js +465 -0
  795. package/extensions/dm-mcp-adapter/dist/output-shape.js +312 -0
  796. package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +144 -0
  797. package/extensions/dm-mcp-adapter/dist/project-server-trust.js +186 -0
  798. package/extensions/dm-mcp-adapter/dist/request-headers-command.js +294 -0
  799. package/extensions/dm-mcp-adapter/dist/resource-tools.js +7 -0
  800. package/extensions/dm-mcp-adapter/dist/runtime-owner.js +94 -0
  801. package/extensions/dm-mcp-adapter/dist/sampling-handler.js +213 -0
  802. package/extensions/dm-mcp-adapter/dist/secure-keyring.js +191 -0
  803. package/extensions/dm-mcp-adapter/dist/server-manager.js +1594 -0
  804. package/extensions/dm-mcp-adapter/dist/session-approvals.js +127 -0
  805. package/extensions/dm-mcp-adapter/dist/session-recovery.js +83 -0
  806. package/extensions/dm-mcp-adapter/dist/state.js +1 -0
  807. package/extensions/dm-mcp-adapter/dist/ts-shape.js +157 -0
  808. package/extensions/dm-mcp-adapter/dist/types.js +286 -0
  809. package/extensions/dm-mcp-adapter/dist/ui-app-bridge-helpers.js +36 -0
  810. package/extensions/dm-mcp-adapter/dist/ui-resource-handler.js +204 -0
  811. package/extensions/dm-mcp-adapter/dist/ui-stream-types.js +58 -0
  812. package/extensions/dm-mcp-adapter/dist/ui-tool-visibility.js +26 -0
  813. package/extensions/dm-mcp-adapter/dist/unix-socket-transport.js +83 -0
  814. package/extensions/dm-mcp-adapter/dist/utils.js +418 -0
  815. package/extensions/dm-mcp-adapter/elicitation-handler.js +67 -2
  816. package/extensions/dm-mcp-adapter/failure-backoff.js +9 -0
  817. package/extensions/dm-mcp-adapter/host-managed.js +400 -0
  818. package/extensions/dm-mcp-adapter/http-ca.js +4 -0
  819. package/extensions/dm-mcp-adapter/index.js +347 -57
  820. package/extensions/dm-mcp-adapter/init.js +92 -44
  821. package/extensions/dm-mcp-adapter/jev-client.js +5 -5
  822. package/extensions/dm-mcp-adapter/jev-key-store.js +15 -2
  823. package/extensions/dm-mcp-adapter/mcp-auth-flow.js +10 -2
  824. package/extensions/dm-mcp-adapter/mcp-auth.js +2 -1
  825. package/extensions/dm-mcp-adapter/mcp-callback-server.js +1 -1
  826. package/extensions/dm-mcp-adapter/mcp-code.js +174 -87
  827. package/extensions/dm-mcp-adapter/mcp-keyring-helper.cjs +1 -1
  828. package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +3 -2
  829. package/extensions/dm-mcp-adapter/mcp-output-guard.js +19 -5
  830. package/extensions/dm-mcp-adapter/mcp-panel.js +59 -12
  831. package/extensions/dm-mcp-adapter/mcp-script-wasm.js +22 -0
  832. package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +227 -111
  833. package/extensions/dm-mcp-adapter/mcp-setup-panel.js +500 -258
  834. package/extensions/dm-mcp-adapter/mcp-status.js +9 -2
  835. package/extensions/dm-mcp-adapter/mcp-trace.js +5 -0
  836. package/extensions/dm-mcp-adapter/metadata-cache.js +68 -11
  837. package/extensions/dm-mcp-adapter/namespace-tools.js +20 -5
  838. package/extensions/dm-mcp-adapter/onboarding-state.js +11 -1
  839. package/extensions/dm-mcp-adapter/output-shape.js +312 -0
  840. package/extensions/dm-mcp-adapter/package-mcp-loader.js +15 -6
  841. package/extensions/dm-mcp-adapter/package.json +6 -15
  842. package/extensions/dm-mcp-adapter/panel-keys.js +13 -0
  843. package/extensions/dm-mcp-adapter/pi-builtin-mcp.js +26 -0
  844. package/extensions/dm-mcp-adapter/pi-signin-import.js +121 -0
  845. package/extensions/dm-mcp-adapter/project-server-trust.js +186 -0
  846. package/extensions/dm-mcp-adapter/prompts.js +80 -7
  847. package/extensions/dm-mcp-adapter/proxy-modes.js +219 -158
  848. package/extensions/dm-mcp-adapter/runtime-protocol.js +342 -0
  849. package/extensions/dm-mcp-adapter/search-ranking.js +8 -6
  850. package/extensions/dm-mcp-adapter/semantic-search.js +5 -4
  851. package/extensions/dm-mcp-adapter/server-manager.js +108 -26
  852. package/extensions/dm-mcp-adapter/session-recovery.js +3 -2
  853. package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +24 -28
  854. package/extensions/dm-mcp-adapter/skills/mcp-scripting/references/jev.md +3 -0
  855. package/extensions/dm-mcp-adapter/test-runner.mjs +1 -1
  856. package/extensions/dm-mcp-adapter/tool-approval.js +17 -7
  857. package/extensions/dm-mcp-adapter/tool-metadata.js +4 -2
  858. package/extensions/dm-mcp-adapter/tool-parameters.js +4 -0
  859. package/extensions/dm-mcp-adapter/tool-result-renderer.js +68 -7
  860. package/extensions/dm-mcp-adapter/ts-shape.js +1 -1
  861. package/extensions/dm-mcp-adapter/ui-server.js +24 -20
  862. package/extensions/dm-mcp-adapter/unix-socket-transport.js +1 -1
  863. package/extensions/dm-mcp-adapter/utils.js +37 -1
  864. package/extensions/dm-ponytail/extensions/ponytail.mjs +37 -17
  865. package/extensions/dm-ponytail/hooks/claude-codex-hooks.json +3 -3
  866. package/extensions/dm-ponytail/hooks/copilot-hooks.json +4 -4
  867. package/extensions/dm-ponytail/hooks/ponytail-activate.js +46 -13
  868. package/extensions/dm-ponytail/hooks/ponytail-config.js +6 -5
  869. package/extensions/dm-ponytail/hooks/ponytail-instructions.js +29 -33
  870. package/extensions/dm-ponytail/hooks/ponytail-map.js +116 -0
  871. package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +26 -13
  872. package/extensions/dm-ponytail/hooks/ponytail-runtime.js +23 -9
  873. package/extensions/dm-ponytail/hooks/ponytail-subagent.js +15 -3
  874. package/extensions/dm-ponytail/hooks/qoder-hooks.json +3 -3
  875. package/extensions/dm-ponytail/package.json +1 -1
  876. package/extensions/dm-ponytail/pi-extension/index.js +37 -17
  877. package/extensions/dm-ponytail/pi-extension/package.json +1 -1
  878. package/extensions/dm-ponytail/skills/plugin.json +5 -0
  879. package/extensions/dm-ponytail/skills/ponytail/SKILL.md +33 -101
  880. package/extensions/dm-ponytail/skills/ponytail-audit/SKILL.md +89 -27
  881. package/extensions/dm-ponytail/skills/ponytail-debt/SKILL.md +13 -12
  882. package/extensions/dm-ponytail/skills/ponytail-gain/SKILL.md +21 -18
  883. package/extensions/dm-ponytail/skills/ponytail-help/SKILL.md +13 -14
  884. package/extensions/dm-ponytail/skills/ponytail-review/SKILL.md +96 -52
  885. package/extensions/dm-subagents/agents/oracle.md +8 -19
  886. package/extensions/dm-subagents/agents/researcher.md +0 -3
  887. package/extensions/dm-subagents/agents/reviewer.md +17 -61
  888. package/extensions/dm-subagents/agents/scout.md +1 -4
  889. package/extensions/dm-subagents/agents/worker.md +8 -25
  890. package/extensions/dm-subagents/index.js +5 -0
  891. package/extensions/dm-subagents/install.mjs +47 -62
  892. package/extensions/dm-subagents/package.json +6 -5
  893. package/extensions/dm-subagents/prompts/council.md +1 -1
  894. package/extensions/dm-subagents/prompts/review-loop.md +1 -1
  895. package/extensions/dm-subagents/skills/council-mode/SKILL.md +1 -1
  896. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +13 -6
  897. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +3 -3
  898. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +79 -78
  899. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +18 -14
  900. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +1 -1
  901. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +46 -49
  902. package/extensions/dm-subagents/src/agents/advertised-agent-prompt.js +18 -32
  903. package/extensions/dm-subagents/src/agents/agent-management.js +7 -2
  904. package/extensions/dm-subagents/src/agents/agent-memory.js +3 -3
  905. package/extensions/dm-subagents/src/agents/agent-scope.js +3 -0
  906. package/extensions/dm-subagents/src/agents/agent-serializer.js +12 -1
  907. package/extensions/dm-subagents/src/agents/agents.js +217 -120
  908. package/extensions/dm-subagents/src/api/inspectors.js +10 -0
  909. package/extensions/dm-subagents/src/api/preflight.js +43 -6
  910. package/extensions/dm-subagents/src/extension/config.js +35 -2
  911. package/extensions/dm-subagents/src/extension/control-notices.js +3 -7
  912. package/extensions/dm-subagents/src/extension/declaration-pinning.js +127 -0
  913. package/extensions/dm-subagents/src/extension/doctor.js +4 -7
  914. package/extensions/dm-subagents/src/extension/fanout-child.js +15 -7
  915. package/extensions/dm-subagents/src/extension/herdr-dm-bridge.js +2 -0
  916. package/extensions/dm-subagents/src/extension/index.js +231 -332
  917. package/extensions/dm-subagents/src/extension/public-execution.js +63 -33
  918. package/extensions/dm-subagents/src/extension/reply-workflow-script.js +65 -0
  919. package/extensions/dm-subagents/src/extension/rpc.js +42 -16
  920. package/extensions/dm-subagents/src/extension/schemas.js +73 -152
  921. package/extensions/dm-subagents/src/extension/subagent-guide.js +92 -7
  922. package/extensions/dm-subagents/src/extension/subagent-options.js +47 -0
  923. package/extensions/dm-subagents/src/extension/tool-activation.js +57 -89
  924. package/extensions/dm-subagents/src/extension/tool-description.js +56 -47
  925. package/extensions/dm-subagents/src/extension/upgrade-notice.js +36 -0
  926. package/extensions/dm-subagents/src/inspectors/actions.js +34 -11
  927. package/extensions/dm-subagents/src/inspectors/plugins.js +71 -2
  928. package/extensions/dm-subagents/src/inspectors/tmux/actions.js +173 -0
  929. package/extensions/dm-subagents/src/inspectors/tmux/client.js +63 -0
  930. package/extensions/dm-subagents/src/inspectors/tmux/plugin.js +14 -0
  931. package/extensions/dm-subagents/src/integrations/herdr-status.js +26 -49
  932. package/extensions/dm-subagents/src/integrations/program-status.js +179 -0
  933. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +77 -4
  934. package/extensions/dm-subagents/src/intercom/result-intercom.js +3 -2
  935. package/extensions/dm-subagents/src/intercom/supervisor-ui.js +2 -152
  936. package/extensions/dm-subagents/src/missions/goal-driver.js +47 -34
  937. package/extensions/dm-subagents/src/missions/store.js +33 -4
  938. package/extensions/dm-subagents/src/profiles/profiles.js +22 -15
  939. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +49 -6
  940. package/extensions/dm-subagents/src/runs/background/async-execution.js +301 -139
  941. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +65 -24
  942. package/extensions/dm-subagents/src/runs/background/async-resume.js +9 -3
  943. package/extensions/dm-subagents/src/runs/background/async-retention.js +40 -15
  944. package/extensions/dm-subagents/src/runs/background/await-async-run.js +68 -0
  945. package/extensions/dm-subagents/src/runs/background/binary-bootstrap.js +2 -1
  946. package/extensions/dm-subagents/src/runs/background/calendar-schedule.js +90 -0
  947. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +11 -8
  948. package/extensions/dm-subagents/src/runs/background/control-channel.js +89 -5
  949. package/extensions/dm-subagents/src/runs/background/fleet-view.js +5 -5
  950. package/extensions/dm-subagents/src/runs/background/notify.js +170 -11
  951. package/extensions/dm-subagents/src/runs/background/pid-namespace.js +17 -0
  952. package/extensions/dm-subagents/src/runs/background/result-files.js +80 -6
  953. package/extensions/dm-subagents/src/runs/background/result-watcher.js +92 -65
  954. package/extensions/dm-subagents/src/runs/background/resume-guidance.js +2 -2
  955. package/extensions/dm-subagents/src/runs/background/run-child-session.js +34 -10
  956. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +8 -6
  957. package/extensions/dm-subagents/src/runs/background/run-status.js +25 -15
  958. package/extensions/dm-subagents/src/runs/background/runner-aliases.js +4 -2
  959. package/extensions/dm-subagents/src/runs/background/runner-child-launch.js +3 -0
  960. package/extensions/dm-subagents/src/runs/background/runner-http-dispatcher.js +2 -1
  961. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +270 -79
  962. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +18 -3
  963. package/extensions/dm-subagents/src/runs/background/subagent-runner-bootstrap.js +4 -1
  964. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +123 -33
  965. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +33 -20
  966. package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +42 -1
  967. package/extensions/dm-subagents/src/runs/background/wait-completions.js +1 -0
  968. package/extensions/dm-subagents/src/runs/background/wait-tool.js +36 -26
  969. package/extensions/dm-subagents/src/runs/background/workflow-terminal-proof.js +39 -26
  970. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +58 -26
  971. package/extensions/dm-subagents/src/runs/foreground/command-action.js +37 -0
  972. package/extensions/dm-subagents/src/runs/foreground/execution.js +132 -32
  973. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +1 -0
  974. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +5 -5
  975. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +683 -325
  976. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +3 -0
  977. package/extensions/dm-subagents/src/runs/shared/child-commands.js +252 -0
  978. package/extensions/dm-subagents/src/runs/shared/child-hooks.js +6 -5
  979. package/extensions/dm-subagents/src/runs/shared/child-launch.js +13 -1
  980. package/extensions/dm-subagents/src/runs/shared/child-session.js +183 -34
  981. package/extensions/dm-subagents/src/runs/shared/child-tool-plan.js +17 -14
  982. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +87 -1
  983. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +11 -85
  984. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +3 -0
  985. package/extensions/dm-subagents/src/runs/shared/effective-system-prompt.js +1 -2
  986. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +57 -6
  987. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +6 -3
  988. package/extensions/dm-subagents/src/runs/shared/herdr-placed-run.js +13 -6
  989. package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +1 -1
  990. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +66 -14
  991. package/extensions/dm-subagents/src/runs/shared/model-resolution-diagnostic.js +25 -5
  992. package/extensions/dm-subagents/src/runs/shared/model-resolution.js +55 -11
  993. package/extensions/dm-subagents/src/runs/shared/model-scope.js +23 -10
  994. package/extensions/dm-subagents/src/runs/shared/nested-events.js +3 -0
  995. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +55 -7
  996. package/extensions/dm-subagents/src/runs/shared/partial-output.js +26 -0
  997. package/extensions/dm-subagents/src/runs/shared/run-history.js +41 -0
  998. package/extensions/dm-subagents/src/runs/shared/runner-launcher.js +21 -0
  999. package/extensions/dm-subagents/src/runs/shared/single-output.js +67 -26
  1000. package/extensions/dm-subagents/src/runs/shared/structured-output.js +24 -7
  1001. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +32 -20
  1002. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +68 -29
  1003. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +1 -1
  1004. package/extensions/dm-subagents/src/runs/shared/workflow-async-child-guidance.js +1 -1
  1005. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-apply.js +169 -0
  1006. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +41 -20
  1007. package/extensions/dm-subagents/src/runs/shared/worktree-lock.js +38 -0
  1008. package/extensions/dm-subagents/src/runs/shared/worktree.js +10 -1
  1009. package/extensions/dm-subagents/src/shared/atomic-json.js +2 -1
  1010. package/extensions/dm-subagents/src/shared/disabled-features.js +101 -0
  1011. package/extensions/dm-subagents/src/shared/dm-declarations.js +14 -0
  1012. package/extensions/dm-subagents/src/shared/dm-safeguards.js +41 -0
  1013. package/extensions/dm-subagents/src/shared/dm-settlement.js +48 -0
  1014. package/extensions/dm-subagents/src/shared/edit-distance.js +23 -0
  1015. package/extensions/dm-subagents/src/shared/extension-context.js +4 -0
  1016. package/extensions/dm-subagents/src/shared/file-lease.js +89 -0
  1017. package/extensions/dm-subagents/src/shared/fork-context.js +0 -1
  1018. package/extensions/dm-subagents/src/shared/formatters.js +1 -6
  1019. package/extensions/dm-subagents/src/shared/model-info.js +23 -0
  1020. package/extensions/dm-subagents/src/shared/package-version.js +12 -0
  1021. package/extensions/dm-subagents/src/shared/parent-wake.js +67 -0
  1022. package/extensions/dm-subagents/src/shared/pruned-fork.js +6 -2
  1023. package/extensions/dm-subagents/src/shared/required-child-extensions.js +35 -5
  1024. package/extensions/dm-subagents/src/shared/runtime-module-path.js +9 -0
  1025. package/extensions/dm-subagents/src/shared/settings-file-lease.js +31 -0
  1026. package/extensions/dm-subagents/src/shared/types.js +3 -1
  1027. package/extensions/dm-subagents/src/shared/utils.js +7 -7
  1028. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +2 -2
  1029. package/extensions/dm-subagents/src/slash/slash-commands.js +25 -15
  1030. package/extensions/dm-subagents/src/slash/subagent-cost.js +38 -7
  1031. package/extensions/dm-subagents/src/slash/subagents-admin.js +1 -1
  1032. package/extensions/dm-subagents/src/tui/dm-mouse-region.js +12 -0
  1033. package/extensions/dm-subagents/src/tui/fleet-status.js +12 -6
  1034. package/extensions/dm-subagents/src/tui/fleet-transcript.js +6 -2
  1035. package/extensions/dm-subagents/src/tui/fleet.js +20 -6
  1036. package/extensions/dm-subagents/src/tui/render.js +126 -72
  1037. package/extensions/dm-subagents/src/tui/running-tone.js +20 -0
  1038. package/extensions/dm-subagents/src/tui/subagent-messages.js +249 -0
  1039. package/extensions/dm-subagents/src/watchdog/diff-tool.js +19 -11
  1040. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +2 -2
  1041. package/extensions/dm-subagents/src/watchdog/register-child.js +2 -2
  1042. package/extensions/dm-subagents/src/watchdog/register-main.js +4 -24
  1043. package/extensions/dm-subagents/src/watchdog/render.js +1 -19
  1044. package/extensions/dm-subagents/src/watchdog/review.js +3 -3
  1045. package/extensions/dm-subagents/src/watchdog/runtime.js +6 -2
  1046. package/extensions/dm-subagents/src/watchdog/settings.js +22 -17
  1047. package/extensions/dm-subagents/src/watchdog/tool-actions.js +2 -2
  1048. package/extensions/dm-subagents/src/watchdog/turn-delta.js +1 -1
  1049. package/extensions/dm-subagents/src/workflows/chat-progress.js +2 -2
  1050. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +116 -45
  1051. package/extensions/dm-subagents/src/workflows/structured-workflow-scripts.js +154 -0
  1052. package/extensions/dm-subagents/src/workflows/workflow-checklist.js +3 -0
  1053. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +7 -4
  1054. package/extensions/dm-subagents/src/workflows/workflow-resources.js +52 -17
  1055. package/extensions/dm-subagents/src/workflows/workflow-reuse.js +87 -0
  1056. package/extensions/dm-subagents/src/workflows/workflow-revival.js +80 -0
  1057. package/extensions/dm-tty/control.js +150 -0
  1058. package/extensions/dm-tty/index.js +122 -0
  1059. package/extensions/dm-tty/package.json +20 -0
  1060. package/extensions/dm-tty/pty.js +213 -0
  1061. package/extensions/dm-tty/pty_bridge.py +266 -0
  1062. package/extensions/dm-tty/server.js +438 -0
  1063. package/extensions/dm-tty/sessions.js +97 -0
  1064. package/extensions/dm-tty/standalone.js +75 -0
  1065. package/extensions/dm-tty/web/client.js +1141 -0
  1066. package/extensions/dm-tty/web/index.html +117 -0
  1067. package/extensions/dm-tty/web/style.css +73 -0
  1068. package/extensions/dm-web-access/brave-rate-limit.js +160 -0
  1069. package/extensions/dm-web-access/brave.js +62 -11
  1070. package/extensions/dm-web-access/ceramic.js +197 -0
  1071. package/extensions/dm-web-access/chrome-cookies.js +69 -21
  1072. package/extensions/dm-web-access/curator-page.js +12 -2
  1073. package/extensions/dm-web-access/curator-server.js +10 -0
  1074. package/extensions/dm-web-access/declared-web-links.js +1 -1
  1075. package/extensions/dm-web-access/degoog.js +288 -0
  1076. package/extensions/dm-web-access/dist/index.js +28404 -0
  1077. package/extensions/dm-web-access/dist/mcp-cli.js +28186 -0
  1078. package/extensions/dm-web-access/duckduckgo.js +6 -3
  1079. package/extensions/dm-web-access/endpoint-pdf-extract.js +210 -0
  1080. package/extensions/dm-web-access/exa.js +17 -35
  1081. package/extensions/dm-web-access/extract.js +63 -10
  1082. package/extensions/dm-web-access/firecrawl.js +30 -4
  1083. package/extensions/dm-web-access/gemini-search.js +117 -37
  1084. package/extensions/dm-web-access/gemini-web.js +7 -7
  1085. package/extensions/dm-web-access/github-extract.js +28 -2
  1086. package/extensions/dm-web-access/github-issue-pr.js +88 -73
  1087. package/extensions/dm-web-access/index.js +230 -1161
  1088. package/extensions/dm-web-access/keenable.js +197 -0
  1089. package/extensions/dm-web-access/mcp-cli.js +30 -0
  1090. package/extensions/dm-web-access/mcp-server.js +51 -0
  1091. package/extensions/dm-web-access/mcp-tool-definitions.js +93 -0
  1092. package/extensions/dm-web-access/openai-search.js +70 -20
  1093. package/extensions/dm-web-access/opencode-session-headers.js +1 -1
  1094. package/extensions/dm-web-access/package.json +4 -1
  1095. package/extensions/dm-web-access/page-query.js +5 -10
  1096. package/extensions/dm-web-access/parallel-mcp.js +2 -1
  1097. package/extensions/dm-web-access/pdf-extract.js +34 -1
  1098. package/extensions/dm-web-access/perplexity.js +68 -51
  1099. package/extensions/dm-web-access/query-rewrite.js +3 -4
  1100. package/extensions/dm-web-access/scripts/build.js +8 -0
  1101. package/extensions/dm-web-access/ssrf-protection.js +10 -8
  1102. package/extensions/dm-web-access/storage.js +79 -76
  1103. package/extensions/dm-web-access/summary-model-scope.js +5 -64
  1104. package/extensions/dm-web-access/summary-review.js +35 -9
  1105. package/extensions/dm-web-access/tavily.js +69 -22
  1106. package/extensions/dm-web-access/tool-activation.js +44 -26
  1107. package/extensions/dm-web-access/tool-arguments.js +21 -0
  1108. package/extensions/dm-web-access/utils.js +17 -7
  1109. package/extensions/dm-web-access/video-extract.js +1 -1
  1110. package/extensions/dm-web-access/web-tool-contract.js +0 -0
  1111. package/extensions/dm-web-access/web-tool-core.js +1312 -0
  1112. package/extensions/dm-web-access/you.js +155 -0
  1113. package/extensions/dm-web-access/youtube-extract.js +2 -2
  1114. package/extensions/dm-web-access/zai.js +159 -0
  1115. package/package.json +13 -9
@@ -1,11 +1,15 @@
1
1
  import * as nodeCrypto from "node:crypto";
2
2
  import * as nodeFs from "node:fs";
3
3
  import * as path from "node:path";
4
- import { noteAuthoritativeContentAttachment } from "./agent-nudge.js";
4
+ import {
5
+ noteAuthoritativeContentAttachment,
6
+ queueAgentAdvisory
7
+ } from "./agent-nudge.js";
5
8
  import {
6
9
  captureFileStats,
7
10
  diffFileContent,
8
11
  getOpaqueBaselineStore,
12
+ opaqueBaselineSlot,
9
13
  recoverOpaqueChangesViaGit
10
14
  } from "./opaque-mutation-scan.js";
11
15
  import { normalizeMapKey } from "./path-utils.js";
@@ -20,16 +24,25 @@ import {
20
24
  import {
21
25
  registerSearchReads
22
26
  } from "./search-read-registration.js";
23
- import { createFileTime } from "./file-time.js";
24
27
  import { publishFormatQueued } from "./format-events-publish.js";
25
28
  import {
26
29
  invalidateProjectIgnoreMatcherForPath,
30
+ isDmLensInternalPath,
27
31
  isPathIgnoredByProject
28
32
  } from "./file-utils.js";
29
33
  import { invalidateFormatterCacheForPath } from "./formatters.js";
34
+ import { judgeConfirmedDelete } from "./confirmed-delete.js";
35
+ import { deliveredLineEvidence } from "./read-guard.js";
36
+ import {
37
+ expectationFromToolInput,
38
+ noteAgentCallEnd,
39
+ noteAgentMutation
40
+ } from "./fix-run-restore.js";
30
41
  import { getFormatService } from "./format-service.js";
31
42
  import {
32
43
  isExternalOrVendorFile,
44
+ isVendorPath,
45
+ isOutsideProjectRoot,
33
46
  normalizeEphemeralMapKey,
34
47
  pathsEqual
35
48
  } from "./path-utils.js";
@@ -38,6 +51,7 @@ import { resolveLanguageRootForFile } from "./language-profile.js";
38
51
  import { logLatency } from "./latency-logger.js";
39
52
  import {
40
53
  classifyMutatingTool,
54
+ readToolResultPathField,
41
55
  DM_LENS_SYNTHETIC_MUTATION_FIELD
42
56
  } from "./mutating-tool.js";
43
57
  import {
@@ -50,7 +64,10 @@ import {
50
64
  storedLineHashesFor
51
65
  } from "./observed-mutation-sources.js";
52
66
  import { getAmbientAbortSignal } from "./safe-spawn.js";
53
- import { resolveToolCallCorrelationId } from "./tool-event.js";
67
+ import {
68
+ resolveReadEvidenceCorrelationId,
69
+ resolveToolCallCorrelationId
70
+ } from "./tool-event.js";
54
71
  import {
55
72
  boundedIndexesForCount,
56
73
  createReadGuardEditBatchSummary,
@@ -61,15 +78,20 @@ import { countFileLines } from "./read-guard-tool-lines.js";
61
78
  import {
62
79
  notifyExternalFileChange,
63
80
  resyncGitChangedFiles
64
- } from "./lsp/index.js";
81
+ } from "./lsp/capabilities.js";
65
82
  import { runPipeline } from "./pipeline.js";
66
83
  import {
67
84
  renderPostAutofixNotice
68
85
  } from "./post-autofix-notice.js";
86
+ import { EXPANSION_LIMIT_LINES } from "./read-expansion.js";
69
87
  import { syncGitGuardRecord } from "./git-guard.js";
70
88
  import { scheduleWordIndexPersist } from "./word-index.js";
71
89
  import { RUNTIME_CONFIG } from "./runtime-config.js";
72
90
  import { getActiveSessionId } from "./session-lifecycle.js";
91
+ import {
92
+ recordDroppedRead,
93
+ sessionFencedFixedThisTurn
94
+ } from "./session-scope.js";
73
95
  import { requestBootstrapClients } from "./bootstrap.js";
74
96
  import { bounded } from "./deadline-utils.js";
75
97
  import { HOOK_WALL_BUDGET_MS } from "./hook-budgets.js";
@@ -77,6 +99,11 @@ import {
77
99
  incrementDegradationCount,
78
100
  recordDegradationOnce
79
101
  } from "./degradation-ledger.js";
102
+ import {
103
+ canWriteAnalysisRoot,
104
+ resolveAnalysisRoot,
105
+ resolveAnalysisRootPath
106
+ } from "./analysis-root.js";
80
107
  const AUTHORITATIVE_CONTENT_MAX_BYTES = RUNTIME_CONFIG.pipeline.lspMaxFileBytes;
81
108
  const OBSERVED_DISPATCH_MAX_PATHS = 32;
82
109
  const GIT_INTEGRATION_SUBCOMMANDS = new Set([
@@ -169,27 +196,31 @@ function parseDiffRanges(diff) {
169
196
  }
170
197
  const inFlightPipelines = new PathKeyedMap(normalizeEphemeralMapKey);
171
198
  const lastAnalyzedStateByFile = new PathKeyedMap(normalizeEphemeralMapKey);
199
+ function inFlightKey(stateHash, authored) {
200
+ return authored ? stateHash : `${stateHash}#unauthored`;
201
+ }
172
202
  export function clearLastAnalyzedStateCache() {
173
203
  lastAnalyzedStateByFile.clear();
174
204
  }
175
- function registerInFlightPipeline(filePath, stateHash, pipeline) {
205
+ function registerInFlightPipeline(filePath, registryKey, pipeline) {
176
206
  let filePipelines = inFlightPipelines.get(filePath);
177
207
  if (!filePipelines) {
178
208
  filePipelines = new Map;
179
209
  inFlightPipelines.set(filePath, filePipelines);
180
210
  }
181
- filePipelines.set(stateHash, pipeline);
211
+ filePipelines.set(registryKey, pipeline);
182
212
  return filePipelines;
183
213
  }
184
- function releaseInFlightPipeline(filePath, stateHash, registered) {
185
- registered.delete(stateHash);
214
+ function releaseInFlightPipeline(filePath, registryKey, registered) {
215
+ registered.delete(registryKey);
186
216
  if (registered.size === 0 && inFlightPipelines.get(filePath) === registered) {
187
217
  inFlightPipelines.delete(filePath);
188
218
  }
189
219
  }
190
220
  function claimPipelineDispatch(args) {
191
- const { filePath, stateHash, turnIndex, participantId, dbg } = args;
192
- const inFlight = inFlightPipelines.get(filePath)?.get(stateHash);
221
+ const { filePath, stateHash, turnIndex, authored, participantId, dbg } = args;
222
+ const filePipelines = inFlightPipelines.get(filePath);
223
+ const inFlight = filePipelines?.get(inFlightKey(stateHash, true)) ?? (authored ? undefined : filePipelines?.get(inFlightKey(stateHash, false)));
193
224
  if (inFlight) {
194
225
  dbg(`tool_result: skipping duplicate concurrent state for ${filePath}`);
195
226
  if (inFlight.participantIds.length < 100) {
@@ -199,7 +230,7 @@ function claimPipelineDispatch(args) {
199
230
  return { proceed: false, joined: inFlight.promise };
200
231
  }
201
232
  const lastAnalyzed = lastAnalyzedStateByFile.get(filePath);
202
- if (lastAnalyzed?.turnIndex === turnIndex && lastAnalyzed.stateHash === stateHash) {
233
+ if (lastAnalyzed?.turnIndex === turnIndex && lastAnalyzed.stateHash === stateHash && (lastAnalyzed.authored || !authored)) {
203
234
  dbg(`tool_result: skipping already-analyzed file state this turn for ${filePath}`);
204
235
  return { proceed: false, joined: undefined };
205
236
  }
@@ -310,7 +341,9 @@ function sourceForMutation(classification, details) {
310
341
  function singleRange(ranges) {
311
342
  return ranges?.length === 1 ? ranges[0] : undefined;
312
343
  }
313
- function recordProjectChange(args) {
344
+ export function recordProjectChange(args) {
345
+ if (!canWriteAnalysisRoot(args.analysisRootMode))
346
+ return;
314
347
  args.runtime.recordProjectMutation?.({
315
348
  filePath: args.filePath,
316
349
  source: args.source,
@@ -319,6 +352,40 @@ function recordProjectChange(args) {
319
352
  onAppendError: (err) => args.dbg(`project change log append failed for ${args.filePath}: ${err}`)
320
353
  });
321
354
  }
355
+ export function recordTurnSummary(args) {
356
+ if (!args.resultLive)
357
+ return;
358
+ if (!canWriteAnalysisRoot(args.analysisRootMode))
359
+ return;
360
+ if (!args.getFlag("lens-turn-summary"))
361
+ return;
362
+ if (args.result.diagnostics?.length) {
363
+ for (const d of args.result.diagnostics) {
364
+ args.runtime.turnSummary.recordDiagnostic(d.filePath || args.filePath, {
365
+ tool: d.tool,
366
+ ruleId: d.rule ?? d.code,
367
+ severity: d.severity,
368
+ line: d.line,
369
+ description: d.message
370
+ });
371
+ }
372
+ }
373
+ if (args.result.fixedCount && args.result.fixedCount > 0) {
374
+ for (const label of args.result.autofixTools ?? []) {
375
+ const [tool, countStr] = label.split(":");
376
+ const count = Number.parseInt(countStr ?? "", 10);
377
+ args.runtime.turnSummary.recordAutofix(args.filePath, {
378
+ tool: tool || label,
379
+ description: Number.isFinite(count) && count > 0 ? `${count} issue(s) fixed` : undefined
380
+ });
381
+ }
382
+ }
383
+ if (args.result.formattersUsed?.length) {
384
+ for (const tool of args.result.formattersUsed) {
385
+ args.runtime.turnSummary.recordFormat(args.filePath, { tool });
386
+ }
387
+ }
388
+ }
322
389
  function recordNativeAppliedPairs(args) {
323
390
  const pairs = [];
324
391
  if (args.kind !== "edit")
@@ -364,9 +431,11 @@ async function dispatchPipelineAnalysis(args) {
364
431
  filePath,
365
432
  dispatchCwd,
366
433
  turnStateCwd,
434
+ analysisRootMode,
367
435
  autofixMode,
368
436
  modifiedRanges,
369
437
  writeIndex,
438
+ writeOrderTurn,
370
439
  initialStateHash,
371
440
  readGuardCorrelationId,
372
441
  requestedEditIndexes,
@@ -374,7 +443,10 @@ async function dispatchPipelineAnalysis(args) {
374
443
  isPartialApplyResult,
375
444
  toolResultStart,
376
445
  nativeAppliedPairs,
377
- allowAutonomousWriters
446
+ allowAutonomousWriters,
447
+ sessionGeneration,
448
+ ownFileTimeStamp = true,
449
+ preserveNativeAuthorship = false
378
450
  } = args;
379
451
  const {
380
452
  event,
@@ -386,11 +458,13 @@ async function dispatchPipelineAnalysis(args) {
386
458
  metricsClient,
387
459
  resetLSPService
388
460
  } = deps;
461
+ const fixedThisTurn = sessionFencedFixedThisTurn(runtime.fixedThisTurn, sessionGeneration);
389
462
  const pipelinePromise = runPipeline({
390
463
  signal: deps.signal,
391
464
  filePath,
392
465
  cwd: dispatchCwd,
393
466
  projectRoot: turnStateCwd,
467
+ analysisRootMode,
394
468
  toolName: event.toolName,
395
469
  autofixMode,
396
470
  allowAutonomousWriters,
@@ -400,6 +474,7 @@ async function dispatchPipelineAnalysis(args) {
400
474
  sessionId: runtime.telemetrySessionId,
401
475
  turnIndex: runtime.turnIndex,
402
476
  writeIndex,
477
+ orderTurn: writeOrderTurn,
403
478
  modelId: runtime.telemetryModelId,
404
479
  provider: runtime.telemetryProviderId
405
480
  },
@@ -414,20 +489,28 @@ async function dispatchPipelineAnalysis(args) {
414
489
  wordIndex: runtime.wordIndex,
415
490
  onWordIndexUpdated: (index) => {
416
491
  scheduleWordIndexPersist(dispatchCwd, index, dbg);
417
- }
492
+ },
493
+ sessionGeneration,
494
+ onFixRunLoss: (notice) => queueAgentAdvisory(notice, sessionGeneration),
495
+ nextWriteIndex: () => ({
496
+ turnIndex: runtime.turnIndex,
497
+ orderTurn: runtime.writeOrderTurn,
498
+ writeIndex: runtime.nextWriteIndex()
499
+ })
418
500
  }, {
419
501
  biomeClient,
420
502
  ruffClient,
421
503
  metricsClient,
422
504
  getFormatService,
423
- fixedThisTurn: runtime.fixedThisTurn
505
+ fixedThisTurn
424
506
  });
425
507
  const pipelineTelemetry = {
426
508
  promise: pipelinePromise,
427
509
  participantIds: [...new Set(args.participantIds)].slice(0, 100),
428
510
  participantTotal: args.participantTotal
429
511
  };
430
- const registeredPipelines = registerInFlightPipeline(filePath, initialStateHash, pipelineTelemetry);
512
+ const registryKey = inFlightKey(initialStateHash, allowAutonomousWriters);
513
+ const registeredPipelines = registerInFlightPipeline(filePath, registryKey, pipelineTelemetry);
431
514
  let result;
432
515
  try {
433
516
  result = await pipelinePromise;
@@ -486,11 +569,12 @@ async function dispatchPipelineAnalysis(args) {
486
569
  crashed: true,
487
570
  response: {
488
571
  content: notice ? [...event.content, { type: "text", text: notice }] : event.content,
489
- isError: true
572
+ isError: true,
573
+ structuredContent: event.structuredContent
490
574
  }
491
575
  };
492
576
  } finally {
493
- releaseInFlightPipeline(filePath, initialStateHash, registeredPipelines);
577
+ releaseInFlightPipeline(filePath, registryKey, registeredPipelines);
494
578
  }
495
579
  if (!isPartialApplyResult) {
496
580
  const postEditStatus = result.isError ? "failed" : "succeeded";
@@ -532,10 +616,11 @@ async function dispatchPipelineAnalysis(args) {
532
616
  const pipelineOwnedWriteHash = result.fileModified ? result.postWriteStateHash : undefined;
533
617
  const finalStateHash = pipelineOwnedWriteHash ?? initialStateHash;
534
618
  if (!result.fileModified || pipelineOwnedWriteHash !== undefined) {
535
- lastAnalyzedStateByFile.set(filePath, {
619
+ sessionGeneration.guardedWrite(filePath, () => lastAnalyzedStateByFile.set(filePath, {
536
620
  turnIndex: runtime.turnIndex,
537
- stateHash: finalStateHash
538
- });
621
+ stateHash: finalStateHash,
622
+ authored: allowAutonomousWriters
623
+ }));
539
624
  }
540
625
  if (pipelineOwnedWriteHash !== undefined) {
541
626
  for (const pair of nativeAppliedPairs) {
@@ -543,18 +628,77 @@ async function dispatchPipelineAnalysis(args) {
543
628
  }
544
629
  }
545
630
  if (!getFlag("no-read-guard") && allowAutonomousWriters) {
631
+ const ownPath = path.resolve(filePath);
546
632
  const changedForReadGuard = new Set([
547
- path.resolve(filePath),
633
+ ownPath,
548
634
  ...(result.changedFiles ?? []).map((changedFile) => path.resolve(changedFile))
549
635
  ]);
550
636
  for (const changedFile of changedForReadGuard) {
637
+ if (changedFile === ownPath && pipelineOwnedWriteHash === undefined && preserveNativeAuthorship)
638
+ continue;
551
639
  if (nodeFs.existsSync(changedFile)) {
552
- deps.readGuard?.recordWritten(changedFile);
640
+ deps.readGuard?.recordWritten(changedFile, {
641
+ authorship: "whole-file",
642
+ stampFileTime: ownFileTimeStamp || changedFile !== ownPath,
643
+ ...changedFile === ownPath && (!result.fileModified || pipelineOwnedWriteHash !== undefined) && {
644
+ contentHash: finalStateHash
645
+ }
646
+ });
553
647
  }
554
648
  }
555
649
  }
556
650
  return { crashed: false, result };
557
651
  }
652
+ function singlePositionalEdit(input) {
653
+ const edits = input?.edits;
654
+ if (!Array.isArray(edits) || edits.length !== 1)
655
+ return;
656
+ const edit = edits[0];
657
+ const start = edit?.range?.start?.line;
658
+ return typeof start === "number" && typeof edit.newText === "string" ? { start, newText: edit.newText } : undefined;
659
+ }
660
+ function ownEditEvidence(filePath, edit) {
661
+ const full = deliveredLineEvidence(edit.newText, edit.start);
662
+ if (!edit.newText.endsWith(`
663
+ `))
664
+ return full;
665
+ const certain = deliveredLineEvidence(edit.newText.slice(0, -1), edit.start);
666
+ try {
667
+ const next = nodeFs.readFileSync(filePath, "utf-8").split(/\r?\n/)[edit.start + certain.lineCount - 1];
668
+ return next !== undefined && next.trim() === "" ? full : certain;
669
+ } catch {
670
+ return certain;
671
+ }
672
+ }
673
+ const PI_READ_NOTICE = /\n\n\[(?:Showing lines \d+-\d+ of \d+(?: \([^)\]]+ limit\))?|\d+ more lines in file)\. Use offset=\d+ to continue\.\]$/;
674
+ function piReadBody(text) {
675
+ return text.replace(PI_READ_NOTICE, "");
676
+ }
677
+ function logConversationRead(source, filePath, offset, evidence) {
678
+ logLatency({
679
+ type: "phase",
680
+ phase: "read_guard_conversation_read",
681
+ filePath,
682
+ durationMs: 0,
683
+ metadata: {
684
+ source,
685
+ offset,
686
+ lineCount: evidence.lineCount,
687
+ hashed: evidence.lineHashes !== undefined
688
+ }
689
+ });
690
+ }
691
+ function readWideningNote(widening) {
692
+ const { requested, shown, boundary } = widening;
693
+ const reason = "heading" in boundary ? `the Markdown section under the heading "${boundary.heading}" (heading boundary)` : `the enclosing ${boundary.symbol.kind} "${boundary.symbol.name}" (symbol boundary)`;
694
+ return `[dm-lens: read widened to ${reason}: you asked for lines ${requested.offset}-${requested.offset + requested.limit - 1}, this shows lines ${shown.offset}-${shown.offset + shown.limit - 1}. Re-request with limit > ${EXPANSION_LIMIT_LINES} for the exact range.]`;
695
+ }
696
+ export function handleToolExecutionEnd(event, readGuard) {
697
+ if (event?.isError !== true)
698
+ return false;
699
+ const toolCallId = resolveToolCallCorrelationId(event);
700
+ return toolCallId !== undefined ? readGuard.dropProvisionalReadByCall(toolCallId) : false;
701
+ }
558
702
  export async function handleToolResult(deps) {
559
703
  const {
560
704
  event,
@@ -565,11 +709,34 @@ export async function handleToolResult(deps) {
565
709
  agentBehaviorRecord,
566
710
  formatBehaviorWarnings
567
711
  } = deps;
568
- const rawFilePath = event.input.path;
712
+ const writeSession = deps._sessionGeneration ?? runtime.captureSessionGeneration();
713
+ const rawFilePath = readToolResultPathField(event);
569
714
  const workspaceRoot = runtime.projectRoot || process.cwd();
570
715
  let bashAuthorshipConfirmed = deps._allowAutonomousWriters ?? deps._readGuardAuthorship ?? event.toolName !== "bash";
571
716
  const toolCallId = resolveToolCallCorrelationId(event);
717
+ const readEvidenceToolCallId = resolveReadEvidenceCorrelationId(event);
718
+ noteAgentCallEnd(toolCallId);
719
+ if (event.isError === true && toolCallId !== undefined)
720
+ deps.readGuard?.dropProvisionalReadByCall(toolCallId);
572
721
  const attribution = toolCallId !== undefined ? runtime.takeToolCallAttribution(toolCallId) : undefined;
722
+ const readWidening = event.toolName === "read" && toolCallId !== undefined ? runtime.takeReadWidening(toolCallId) : undefined;
723
+ const executedRead = event.input;
724
+ const notedWidening = readWidening && event.isError !== true && (rawFilePath ?? executedRead.filePath) === readWidening.inputPath && executedRead.offset === readWidening.shown.offset && executedRead.limit === readWidening.shown.limit ? readWidening : undefined;
725
+ const readNote = notedWidening ? [{ type: "text", text: readWideningNote(notedWidening) }] : [];
726
+ if (notedWidening) {
727
+ logLatency({
728
+ type: "phase",
729
+ phase: "read_widening_note",
730
+ toolName: event.toolName,
731
+ filePath: notedWidening.filePath,
732
+ durationMs: 0,
733
+ metadata: {
734
+ requested: notedWidening.requested,
735
+ shown: notedWidening.shown,
736
+ boundary: "heading" in notedWidening.boundary ? "heading" : "symbol"
737
+ }
738
+ });
739
+ }
573
740
  let resolutionBasis;
574
741
  if (attribution) {
575
742
  resolutionBasis = attribution.originCwd;
@@ -584,11 +751,15 @@ export async function handleToolResult(deps) {
584
751
  durationMs: 0,
585
752
  metadata: { toolCallId, rawFilePath, guessedPath }
586
753
  });
587
- return;
754
+ return readNote.length > 0 ? {
755
+ content: [...readNote, ...event.content],
756
+ structuredContent: event.structuredContent
757
+ } : undefined;
588
758
  } else {
589
759
  resolutionBasis = workspaceRoot;
590
760
  }
591
761
  const filePath = rawFilePath ? path.isAbsolute(rawFilePath) ? rawFilePath : path.resolve(resolutionBasis, rawFilePath) : rawFilePath;
762
+ const analysisRootMode = resolveAnalysisRoot(filePath ?? "", workspaceRoot);
592
763
  if (filePath) {
593
764
  invalidateProjectIgnoreMatcherForPath(filePath);
594
765
  invalidateFormatterCacheForPath(filePath);
@@ -618,17 +789,14 @@ export async function handleToolResult(deps) {
618
789
  const command = event.input.command;
619
790
  const recognized = extractWrittenPathsFromCommand(command, workspaceRoot);
620
791
  let recognizedWritten = event.isError !== true ? recognized.filter((wp) => !isExternalOrVendorFile(wp, workspaceRoot) && !isPathIgnoredByProject(wp, workspaceRoot, false)) : [];
621
- if (!getFlag("no-read-guard")) {
622
- for (const recognizedPath of recognizedWritten)
623
- deps.readGuard?.recordUnchanged?.(recognizedPath);
624
- }
625
792
  let opaquePaths = [];
793
+ let hadOpaqueRecovery = false;
626
794
  let observedChangedKeys;
627
795
  let recognizedAuthored = [];
628
796
  if (workspaceRoot && !getFlag("no-read-guard")) {
629
797
  const scanRoot = workspaceRoot;
630
798
  const started = Date.now();
631
- const pending = getOpaqueBaselineStore().take(`${normalizeMapKey(path.resolve(scanRoot))}:${runtime.sessionGeneration}`);
799
+ const pending = getOpaqueBaselineStore().take(opaqueBaselineSlot(scanRoot, runtime.sessionGeneration), toolCallId);
632
800
  let unknownReason;
633
801
  if (!pending && recognized.length > 0) {
634
802
  unknownReason = "partial-recognition-no-baseline";
@@ -682,6 +850,7 @@ export async function handleToolResult(deps) {
682
850
  const survivingKeys = new Set(recognizedWritten.map((p) => normalizeMapKey(path.resolve(p))));
683
851
  opaquePaths = opaquePaths.filter((p) => !survivingKeys.has(p));
684
852
  }
853
+ hadOpaqueRecovery = opaquePaths.length > 0;
685
854
  if (observedChangedKeys) {
686
855
  recognizedAuthored = recognizedWritten.filter((file) => observedChangedKeys.has(normalizeMapKey(path.resolve(file))));
687
856
  if (recognizedAuthored.length === 0)
@@ -717,11 +886,13 @@ export async function handleToolResult(deps) {
717
886
  bashAuthorshipConfirmed = recognizedAuthored.length > 0;
718
887
  for (const wp of written) {
719
888
  if (!getFlag("no-read-guard") && recognizedAuthoredSet.has(wp))
720
- deps.readGuard?.recordWritten(wp);
721
- else if (!getFlag("no-read-guard") && recognizedWritten.includes(wp))
722
- deps.readGuard?.recordUnchanged?.(wp);
889
+ deps.readGuard?.recordWritten(wp, {
890
+ authorship: hadOpaqueRecovery || opaqueSet.has(wp) ? "unknown" : "whole-file",
891
+ stampFileTime: false,
892
+ ...toolCallId !== undefined && { toolCallId }
893
+ });
723
894
  const receipt = runtime.recordMutationToolReceipt;
724
- const autofixMode = receipt ? receipt.call(runtime, wp, "write").autofixMode : "immediate";
895
+ const autofixMode = (receipt && writeSession.guardedWrite(wp, () => receipt.call(runtime, wp, "write"))?.autofixMode) ?? "immediate";
725
896
  const isOpaque = opaqueSet.has(wp);
726
897
  const syntheticEvent = {
727
898
  ...event,
@@ -738,7 +909,12 @@ export async function handleToolResult(deps) {
738
909
  _attachmentBudget: syntheticAttachmentBudget,
739
910
  _mutationSourceOverride: isOpaque ? "opaque-script" : undefined,
740
911
  _readGuardAuthorship: recognizedAuthoredSet.has(wp),
741
- _allowAutonomousWriters: recognizedAuthoredSet.has(wp)
912
+ _ownWriteStamp: {
913
+ stampFileTime: false,
914
+ ...toolCallId !== undefined && { toolCallId }
915
+ },
916
+ _allowAutonomousWriters: recognizedAuthoredSet.has(wp),
917
+ _sessionGeneration: writeSession
742
918
  });
743
919
  if (syntheticResult) {
744
920
  syntheticWriteContent.push(...syntheticResult.content.slice(event.content.length));
@@ -794,21 +970,25 @@ export async function handleToolResult(deps) {
794
970
  expandedByLsp: false,
795
971
  turnIndex: runtime.turnIndex,
796
972
  writeIndex: runtime.peekWriteIndex(),
797
- timestamp: Date.now()
973
+ timestamp: Date.now(),
974
+ ...readEvidenceToolCallId !== undefined && {
975
+ toolCallId: readEvidenceToolCallId
976
+ }
798
977
  });
799
978
  }
800
979
  }
801
- if (event.isError !== true && !getFlag("no-lsp") && !getFlag("no-read-guard")) {
980
+ const readGuard = deps.readGuard;
981
+ if (event.isError !== true && readGuard !== undefined && !getFlag("no-lsp") && !getFlag("no-read-guard")) {
802
982
  for (const dp of extractDeletedPathsFromCommand(command, workspaceRoot)) {
803
- if (isExternalOrVendorFile(dp, workspaceRoot))
804
- continue;
805
- if (isPathIgnoredByProject(dp, workspaceRoot, false))
806
- continue;
807
- if (!deps.readGuard || !deps.readGuard.hasKnownPath(dp))
808
- continue;
809
- if (nodeFs.existsSync(dp))
983
+ const verdict = judgeConfirmedDelete(dp, {
984
+ isExternalOrVendorFile: (p) => isExternalOrVendorFile(p, workspaceRoot),
985
+ isPathIgnoredByProject: (p) => isPathIgnoredByProject(p, workspaceRoot, false),
986
+ hasKnownPath: (p) => readGuard.hasKnownPath(p),
987
+ existsSync: (p) => nodeFs.existsSync(p)
988
+ });
989
+ if (verdict !== "confirmed")
810
990
  continue;
811
- deps.readGuard.forgetPath(dp);
991
+ readGuard.forgetPath(dp);
812
992
  notifyExternalFileChange(dp, 3).catch((err) => {
813
993
  dbg(`tool_result: external-delete notify failed for ${dp}: ${err}`);
814
994
  });
@@ -830,16 +1010,18 @@ export async function handleToolResult(deps) {
830
1010
  registerSearchReads(deps.readGuard, searchReads, {
831
1011
  projectRoot: workspaceRoot,
832
1012
  turnIndex: runtime.turnIndex,
833
- writeIndex: runtime.peekWriteIndex()
1013
+ writeIndex: runtime.peekWriteIndex(),
1014
+ ...readEvidenceToolCallId !== undefined && {
1015
+ toolCallId: readEvidenceToolCallId
1016
+ }
834
1017
  });
835
1018
  }
836
1019
  }
837
1020
  if (deps.readGuard && event.toolName === "read" && event.isError !== true && filePath && !getFlag("no-read-guard") && !isExternalOrVendorFile(filePath, workspaceRoot)) {
838
1021
  const deliveredFilePath = attribution?.resolvedPath && nodeFs.existsSync(attribution.resolvedPath) ? attribution.resolvedPath : filePath;
839
1022
  if (nodeFs.existsSync(deliveredFilePath)) {
840
- const nativeReadToolCallId = resolveToolCallCorrelationId(event);
841
1023
  const input = event.input;
842
- const requestedOffset = input.offset ?? 1;
1024
+ const requestedOffset = Math.max(1, input.offset ?? 1);
843
1025
  const requestedLimit = input.limit;
844
1026
  const truncation = event.details?.truncation;
845
1027
  const available = Math.max(0, countFileLines(deliveredFilePath) - requestedOffset + 1);
@@ -868,23 +1050,50 @@ export async function handleToolResult(deps) {
868
1050
  expandedByTs: false
869
1051
  }
870
1052
  });
871
- const deliveredRecord = {
872
- filePath: deliveredFilePath,
873
- requestedOffset,
874
- requestedLimit: requestedLimit ?? deliveredLimit,
1053
+ const raced = deps.readGuard.diskMovedSinceStamp(deliveredFilePath);
1054
+ const deliveredText = raced ? deliveredLineEvidence(piReadBody(event.content.map((part) => part.type === "text" ? part.text ?? "" : "").join(`
1055
+ `)), requestedOffset) : undefined;
1056
+ const capture = raced ? deps.readGuard.getReadHistory(deliveredFilePath).slice().reverse().find((candidate) => candidate.source === `native-read:${toolCallId}:provisional`) : undefined;
1057
+ const capturedLines = capture?.lineHashes ? Object.keys(capture.lineHashes).length : 0;
1058
+ const delivered = deliveredText && (truncation?.outputLines !== undefined ? deliveredText.lineCount <= truncation.outputLines : requestedLimit !== undefined && deliveredText.lineCount === capturedLines) ? deliveredText : undefined;
1059
+ const shownLimit = capture ? Math.min(capture.effectiveLimit, truncation?.outputLines ?? Number.POSITIVE_INFINITY, capturedLines) : 0;
1060
+ const captureEvidence = capture?.lineHashes && {
1061
+ effectiveOffset: capture.effectiveOffset,
1062
+ effectiveLimit: shownLimit,
1063
+ lineHashes: Object.fromEntries(Object.entries(capture.lineHashes).slice(0, shownLimit))
1064
+ };
1065
+ if (raced) {
1066
+ incrementDegradationCount({
1067
+ kind: "native-read-raced-writer",
1068
+ subject: deliveredFilePath,
1069
+ reason: delivered ? "the file changed between pi's read and its tool_result; the read is recorded from the delivered text" : captureEvidence ? "the file changed between pi's read and its tool_result; pi's line count does not vouch for the delivered text, so the tool_call's capture is the evidence" : "the file changed between pi's read and its tool_result; pi's line count does not vouch for the delivered text and there is no hashed tool_call capture, so the read is not recorded"
1070
+ });
1071
+ }
1072
+ const evidence = raced && !delivered ? captureEvidence : {
875
1073
  effectiveOffset: requestedOffset,
876
- effectiveLimit: deliveredLimit,
877
- expandedByLsp: false,
878
- turnIndex: runtime.turnIndex,
879
- writeIndex: runtime.peekWriteIndex(),
880
- timestamp: Date.now()
1074
+ effectiveLimit: delivered?.lineCount ?? deliveredLimit,
1075
+ lineHashes: delivered?.lineHashes
881
1076
  };
882
- if (nativeReadToolCallId) {
1077
+ if (evidence) {
1078
+ const deliveredRecord = {
1079
+ filePath: deliveredFilePath,
1080
+ requestedOffset,
1081
+ requestedLimit: requestedLimit ?? deliveredLimit,
1082
+ effectiveOffset: evidence.effectiveOffset,
1083
+ effectiveLimit: evidence.effectiveLimit,
1084
+ expandedByLsp: false,
1085
+ ...evidence.lineHashes && { lineHashes: evidence.lineHashes },
1086
+ turnIndex: runtime.turnIndex,
1087
+ writeIndex: runtime.peekWriteIndex(),
1088
+ timestamp: Date.now(),
1089
+ ...readEvidenceToolCallId !== undefined && {
1090
+ toolCallId: readEvidenceToolCallId
1091
+ }
1092
+ };
883
1093
  deps.readGuard.recordRead(deliveredRecord, {
884
- supersedes: { toolCallId: nativeReadToolCallId }
1094
+ ...toolCallId && { supersedes: { toolCallId } },
1095
+ stampFileTime: !raced
885
1096
  });
886
- } else {
887
- deps.readGuard.recordRead(deliveredRecord);
888
1097
  }
889
1098
  }
890
1099
  }
@@ -894,6 +1103,9 @@ export async function handleToolResult(deps) {
894
1103
  sessionId: deps.sessionId,
895
1104
  recognizeOnly: true
896
1105
  });
1106
+ if (mutation && filePath && event.isError !== true) {
1107
+ noteAgentMutation(filePath, expectationFromToolInput(event.input, mutation.kind));
1108
+ }
897
1109
  const observationPending = !getFlag("no-read-guard") && hasPendingObservation(resolveToolCallCorrelationId(event));
898
1110
  const preSettleStateHash = observationPending && filePath ? getFileStateHash(filePath) : undefined;
899
1111
  let observedReplayed = 0;
@@ -903,9 +1115,9 @@ export async function handleToolResult(deps) {
903
1115
  toolCallId: resolveToolCallCorrelationId(event),
904
1116
  toolName: event.toolName,
905
1117
  sessionGeneration: runtime.sessionGeneration,
906
- turnIndex: runtime.turnIndex,
1118
+ turnIndex: runtime.turnKey(deps.sessionId),
907
1119
  signal: getAmbientAbortSignal(),
908
- record: replayThroughMutationBridge,
1120
+ record: (entry) => replayThroughMutationBridge({ ...entry, lineage: writeSession }),
909
1121
  getStoredLineHashes: (candidate) => storedLineHashesFor(deps.readGuard, candidate),
910
1122
  isRecordable: (candidate) => !isExternalOrVendorFile(candidate, workspaceRoot) && !isPathIgnoredByProject(candidate, workspaceRoot, false),
911
1123
  dbg
@@ -930,7 +1142,7 @@ export async function handleToolResult(deps) {
930
1142
  filePath,
931
1143
  stateHash: observedStateHash
932
1144
  });
933
- const receiptOutcome = runtime.recordMutationToolReceipt?.call(runtime, filePath, observedKind);
1145
+ const receiptOutcome = writeSession.guardedWrite(filePath, () => runtime.recordMutationToolReceipt?.call(runtime, filePath, observedKind));
934
1146
  refreshCachedExports(runtime, filePath);
935
1147
  const observedAutofixMode = receiptOutcome?.autofixMode ?? (observedKind === "edit" ? "deferred" : "immediate");
936
1148
  const observedDispatchPaths = observedChangedPaths.filter((candidate) => {
@@ -959,6 +1171,8 @@ export async function handleToolResult(deps) {
959
1171
  return;
960
1172
  const observedReadGuardCorrelationId = getReadGuardCorrelationId(event);
961
1173
  for (const observedPath of observedDispatchPaths) {
1174
+ if (writeSession.guardedWrite(observedPath, () => true) !== true)
1175
+ continue;
962
1176
  const observedDispatchSignal = deps.signal;
963
1177
  const observedJoinSignal = deps.signal;
964
1178
  const observedStateHashForPath = getFileStateHash(observedPath);
@@ -966,6 +1180,7 @@ export async function handleToolResult(deps) {
966
1180
  filePath: observedPath,
967
1181
  stateHash: observedStateHashForPath,
968
1182
  turnIndex: runtime.turnIndex,
1183
+ authored: true,
969
1184
  participantId: observedReadGuardCorrelationId,
970
1185
  dbg
971
1186
  });
@@ -986,9 +1201,11 @@ export async function handleToolResult(deps) {
986
1201
  filePath: observedPath,
987
1202
  dispatchCwd: resolveLanguageRootForFile(observedPath, workspaceRoot),
988
1203
  turnStateCwd: path.resolve(workspaceRoot),
1204
+ analysisRootMode,
989
1205
  autofixMode: observedAutofixMode,
990
1206
  modifiedRanges: undefined,
991
1207
  writeIndex: runtime.nextWriteIndex(),
1208
+ writeOrderTurn: runtime.writeOrderTurn,
992
1209
  initialStateHash: observedStateHashForPath,
993
1210
  readGuardCorrelationId: observedReadGuardCorrelationId,
994
1211
  requestedEditIndexes: getRequestedEditIndexes(event, observedKind),
@@ -998,7 +1215,9 @@ export async function handleToolResult(deps) {
998
1215
  participantTotal: 1,
999
1216
  toolResultStart,
1000
1217
  nativeAppliedPairs: observedAppliedPairs,
1001
- allowAutonomousWriters: true
1218
+ allowAutonomousWriters: true,
1219
+ sessionGeneration: writeSession,
1220
+ ownFileTimeStamp: false
1002
1221
  }), {
1003
1222
  ms: HOOK_WALL_BUDGET_MS.tool_result_edit,
1004
1223
  signal: observedDispatchSignal,
@@ -1015,20 +1234,49 @@ export async function handleToolResult(deps) {
1015
1234
  dbg(`tool_result: the observational settle recorded ${observedReplayed} mutation(s) for "${event.toolName}", but no dispatchable changed paths remained`);
1016
1235
  }
1017
1236
  }
1018
- return syntheticWriteContent.length > 0 ? { content: [...event.content, ...syntheticWriteContent] } : undefined;
1237
+ return syntheticWriteContent.length > 0 ? {
1238
+ content: [...event.content, ...syntheticWriteContent],
1239
+ structuredContent: event.structuredContent
1240
+ } : undefined;
1019
1241
  }
1020
1242
  if (mutation === undefined) {
1021
1243
  dbg(`tool_result: skipped turn tracking - toolName="${event.toolName}" is not a classified mutation`);
1022
- return syntheticWriteContent.length > 0 ? { content: [...event.content, ...syntheticWriteContent] } : undefined;
1244
+ return syntheticWriteContent.length > 0 || readNote.length > 0 ? {
1245
+ content: [...readNote, ...event.content, ...syntheticWriteContent],
1246
+ structuredContent: event.structuredContent
1247
+ } : undefined;
1023
1248
  }
1024
1249
  if (!filePath) {
1025
1250
  dbg(`tool_result: skipped turn tracking - no filePath for toolName="${event.toolName}"`);
1026
1251
  return;
1027
1252
  }
1028
- if (isExternalOrVendorFile(filePath, workspaceRoot)) {
1253
+ if (analysisRootMode === "none") {
1254
+ if (isOutsideProjectRoot(filePath, workspaceRoot) && !isVendorPath(filePath) && !isDmLensInternalPath(filePath, workspaceRoot)) {
1255
+ const firstOutsideRootEdit = recordDegradationOnce({
1256
+ kind: "tool-result-outside-project-root",
1257
+ subject: workspaceRoot,
1258
+ reason: `edit outside session root: ${filePath}`
1259
+ });
1260
+ if (firstOutsideRootEdit) {
1261
+ queueAgentAdvisory(`dm-lens skipped analysis for the edit at ${filePath} because it is outside the session root. Start pi in that directory or add it to the workspace to get analysis.`, writeSession);
1262
+ }
1263
+ }
1029
1264
  dbg(`tool_result: skipped pipeline - file outside project root or in node_modules: ${filePath}`);
1030
1265
  return;
1031
1266
  }
1267
+ if (analysisRootMode === "adopted") {
1268
+ const adoptedRoot = resolveAnalysisRootPath(filePath, workspaceRoot);
1269
+ if (adoptedRoot) {
1270
+ const firstAdoptedRoot = recordDegradationOnce({
1271
+ kind: "tool-result-adopted-project",
1272
+ subject: adoptedRoot,
1273
+ reason: `analysing ${adoptedRoot} as a separate project`
1274
+ });
1275
+ if (firstAdoptedRoot) {
1276
+ queueAgentAdvisory(`dm-lens is analysing ${adoptedRoot} as a separate project (LSP + global or managed php-lint/fish-indent; formatting, autofix, other dispatch runners, and automatic tests are off).`, writeSession);
1277
+ }
1278
+ }
1279
+ }
1032
1280
  noteMutationHandled(filePath);
1033
1281
  const readGuardCorrelationId = getReadGuardCorrelationId(event);
1034
1282
  const resultDetails = event.details ?? {};
@@ -1064,7 +1312,11 @@ export async function handleToolResult(deps) {
1064
1312
  })
1065
1313
  }
1066
1314
  });
1067
- return { content: event.content, isError: true };
1315
+ return {
1316
+ content: event.content,
1317
+ isError: true,
1318
+ structuredContent: event.structuredContent
1319
+ };
1068
1320
  }
1069
1321
  const postWriteStateHash = preSettleStateHash ?? getFileStateHash(filePath);
1070
1322
  const nativeAppliedPairs = recordNativeAppliedPairs({
@@ -1074,27 +1326,79 @@ export async function handleToolResult(deps) {
1074
1326
  filePath,
1075
1327
  stateHash: postWriteStateHash
1076
1328
  });
1329
+ const ownEdit = attribution?.editInPlace ? singlePositionalEdit(event.input) : undefined;
1330
+ const nativeAuthoredRanges = mutation.kind === "edit" && ownEdit ? (() => {
1331
+ const evidence = ownEditEvidence(filePath, ownEdit);
1332
+ return [
1333
+ [ownEdit.start, ownEdit.start + evidence.lineCount - 1]
1334
+ ];
1335
+ })() : undefined;
1336
+ if (ownEdit) {
1337
+ const evidence = ownEditEvidence(filePath, ownEdit);
1338
+ deps.readGuard?.recordRead({
1339
+ filePath,
1340
+ requestedOffset: ownEdit.start,
1341
+ requestedLimit: evidence.lineCount,
1342
+ effectiveOffset: ownEdit.start,
1343
+ effectiveLimit: evidence.lineCount,
1344
+ expandedByLsp: false,
1345
+ ...evidence.lineHashes && { lineHashes: evidence.lineHashes },
1346
+ turnIndex: runtime.turnIndex,
1347
+ writeIndex: runtime.peekWriteIndex(),
1348
+ timestamp: Date.now(),
1349
+ source: "own-edit",
1350
+ ...readEvidenceToolCallId !== undefined && {
1351
+ toolCallId: readEvidenceToolCallId
1352
+ }
1353
+ }, { stampFileTime: false });
1354
+ logConversationRead("own-edit", filePath, ownEdit.start, evidence);
1355
+ }
1356
+ const executedContent = event.input.content;
1357
+ const ownWriteStamp = deps._ownWriteStamp ?? {
1358
+ stampFileTime: attribution?.fileTimeStale !== true,
1359
+ ...typeof executedContent === "string" && {
1360
+ writtenContent: executedContent
1361
+ },
1362
+ ...toolCallId !== undefined && { toolCallId }
1363
+ };
1077
1364
  const receipt = runtime.recordMutationToolReceipt;
1078
- const autofixMode = deps._bypassDebounce ? deps._autofixMode ?? (mutation.kind === "edit" ? "deferred" : "immediate") : receipt ? receipt.call(runtime, filePath, mutation.kind).autofixMode : mutation.kind === "edit" ? "deferred" : "immediate";
1365
+ const autofixMode = deps._bypassDebounce ? deps._autofixMode ?? (mutation.kind === "edit" ? "deferred" : "immediate") : (receipt && writeSession.guardedWrite(filePath, () => receipt.call(runtime, filePath, mutation.kind))?.autofixMode) ?? (mutation.kind === "edit" ? "deferred" : "immediate");
1079
1366
  if (!deps._bypassDebounce) {
1080
1367
  const debounceMs = getDebounceMs();
1081
1368
  if (debounceMs > 0) {
1082
1369
  return scheduleDebounced(filePath, debounceMs, {
1083
1370
  ...deps,
1371
+ _sessionGeneration: writeSession,
1084
1372
  _autofixMode: autofixMode,
1373
+ _ownWriteStamp: ownWriteStamp,
1085
1374
  _telemetryParticipantIds: [readGuardCorrelationId],
1086
1375
  _telemetryParticipantTotal: 1
1087
1376
  });
1088
1377
  }
1089
1378
  }
1090
1379
  if (bashAuthorshipConfirmed)
1091
- deps.readGuard?.recordWritten(filePath);
1380
+ deps.readGuard?.recordWritten(filePath, {
1381
+ authorship: mutation.kind === "write" ? "whole-file" : nativeAuthoredRanges !== undefined ? "partial" : "unknown",
1382
+ ...nativeAuthoredRanges !== undefined && {
1383
+ authoredRanges: nativeAuthoredRanges
1384
+ },
1385
+ ...ownWriteStamp,
1386
+ contentHash: postWriteStateHash
1387
+ });
1092
1388
  refreshCachedExports(runtime, filePath);
1093
1389
  const initialStateHash = postWriteStateHash;
1390
+ const classifiedClients = ensureToolResultClients(deps);
1391
+ const classifiedClientsReady = classifiedClients === true || !!await bounded(Promise.resolve(classifiedClients), {
1392
+ ms: HOOK_WALL_BUDGET_MS.tool_result_edit,
1393
+ signal: deps.signal,
1394
+ hook: "tool_result_edit",
1395
+ label: "classified-tool-result-analysis"
1396
+ });
1094
1397
  const classifiedClaim = claimPipelineDispatch({
1095
1398
  filePath,
1096
1399
  stateHash: initialStateHash,
1097
1400
  turnIndex: runtime.turnIndex,
1401
+ authored: bashAuthorshipConfirmed,
1098
1402
  participantId: readGuardCorrelationId,
1099
1403
  dbg
1100
1404
  });
@@ -1104,11 +1408,20 @@ export async function handleToolResult(deps) {
1104
1408
  }
1105
1409
  return;
1106
1410
  }
1107
- const sessionFileTime = createFileTime("default");
1108
- sessionFileTime.read(filePath);
1411
+ const entryLive = writeSession.guardedWrite(filePath, () => true) === true;
1109
1412
  if (!getFlag("no-read-guard") && bashAuthorshipConfirmed) {
1110
1413
  const readGuard = runtime.readGuard;
1111
- readGuard?.recordWritten?.(filePath);
1414
+ if (entryLive)
1415
+ readGuard?.recordWritten?.(filePath, {
1416
+ authorship: mutation.kind === "write" ? "whole-file" : nativeAuthoredRanges !== undefined ? "partial" : "unknown",
1417
+ ...nativeAuthoredRanges !== undefined && {
1418
+ authoredRanges: nativeAuthoredRanges
1419
+ },
1420
+ ...ownWriteStamp,
1421
+ contentHash: postWriteStateHash
1422
+ });
1423
+ else
1424
+ recordDroppedRead(writeSession, "tool-result", writeSession.branchEpoch);
1112
1425
  }
1113
1426
  dbg(`tool_result: tracking turn state for ${event.toolName} on ${filePath}`);
1114
1427
  if (isPathIgnoredByProject(filePath, workspaceRoot, false)) {
@@ -1119,8 +1432,13 @@ export async function handleToolResult(deps) {
1119
1432
  const turnStateCwd = path.resolve(workspaceRoot);
1120
1433
  dbg(`tool_result: resolved dispatch cwd ${dispatchCwd} for ${filePath} (turnState cwd ${turnStateCwd})`);
1121
1434
  const writeIndex = runtime.nextWriteIndex();
1435
+ const writeOrderTurn = runtime.writeOrderTurn;
1122
1436
  let modifiedRanges;
1123
1437
  const adapterRanges = mutation.editRanges && mutation.editRanges.length > 0 ? mutation.editRanges.map(([start, end]) => ({ start, end })) : mutation.touchedLines ? [{ start: mutation.touchedLines[0], end: mutation.touchedLines[1] }] : undefined;
1438
+ const addTurnRange = (range, importsChanged) => {
1439
+ if (entryLive)
1440
+ cacheManager.addModifiedRange(filePath, range, importsChanged, turnStateCwd, deps.sessionId ?? runtime.telemetrySessionId, "pi", undefined, analysisRootMode);
1441
+ };
1124
1442
  try {
1125
1443
  const details = event.details;
1126
1444
  dbg(`tool_result: details.diff=${details?.diff ? "present" : "missing"}, details keys: ${Object.keys(event.details || {}).join(", ")}`);
@@ -1133,30 +1451,29 @@ export async function handleToolResult(deps) {
1133
1451
  dbg(`tool_result: parsed ${ranges.length} ranges, importsChanged=${importsChanged}`);
1134
1452
  for (const range of ranges) {
1135
1453
  dbg(`tool_result: adding range ${range.start}-${range.end} for ${filePath}`);
1136
- cacheManager.addModifiedRange(filePath, range, importsChanged, turnStateCwd, runtime.telemetrySessionId);
1454
+ addTurnRange(range, importsChanged);
1137
1455
  }
1138
1456
  dbg(`tool_result: turn state after add: ${JSON.stringify(cacheManager.readTurnState(turnStateCwd))}`);
1139
1457
  } else if (mutation.kind === "edit" && adapterRanges && nodeFs.existsSync(filePath)) {
1140
1458
  const content = nodeFs.readFileSync(filePath, "utf-8");
1141
1459
  const importsChanged = /^import\s/m.test(content);
1142
1460
  modifiedRanges = adapterRanges;
1143
- for (const range of adapterRanges) {
1144
- cacheManager.addModifiedRange(filePath, range, importsChanged, turnStateCwd, runtime.telemetrySessionId);
1145
- }
1461
+ for (const range of adapterRanges)
1462
+ addTurnRange(range, importsChanged);
1146
1463
  } else if (mutation.kind === "edit" && mutation.provenance === "declared" && nodeFs.existsSync(filePath)) {
1147
1464
  const content = nodeFs.readFileSync(filePath, "utf-8");
1148
1465
  const lineCount = content.split(`
1149
1466
  `).length;
1150
1467
  const importsChanged = /^import\s/m.test(content);
1151
1468
  modifiedRanges = [{ start: 1, end: lineCount }];
1152
- cacheManager.addModifiedRange(filePath, { start: 1, end: lineCount }, importsChanged, turnStateCwd, runtime.telemetrySessionId);
1469
+ addTurnRange({ start: 1, end: lineCount }, importsChanged);
1153
1470
  } else if (mutation.kind === "write" && nodeFs.existsSync(filePath)) {
1154
1471
  const content = nodeFs.readFileSync(filePath, "utf-8");
1155
1472
  const lineCount = content.split(`
1156
1473
  `).length;
1157
1474
  const hasImports = /^import\s/m.test(content);
1158
1475
  modifiedRanges = [{ start: 1, end: lineCount }];
1159
- cacheManager.addModifiedRange(filePath, { start: 1, end: lineCount }, hasImports, turnStateCwd, runtime.telemetrySessionId);
1476
+ addTurnRange({ start: 1, end: lineCount }, hasImports);
1160
1477
  }
1161
1478
  } catch (err) {
1162
1479
  dbg(`turn state tracking error: ${err}`);
@@ -1165,6 +1482,7 @@ export async function handleToolResult(deps) {
1165
1482
  recordProjectChange({
1166
1483
  runtime,
1167
1484
  cwd: turnStateCwd,
1485
+ analysisRootMode,
1168
1486
  filePath,
1169
1487
  source: deps._mutationSourceOverride ?? sourceForMutation(mutation, event.details),
1170
1488
  changedRange: singleRange(modifiedRanges),
@@ -1179,13 +1497,7 @@ export async function handleToolResult(deps) {
1179
1497
  durationMs: turnStateMs
1180
1498
  });
1181
1499
  dbg(`tool_result fired for: ${filePath} (turn_state: ${turnStateMs}ms)`);
1182
- const classifiedClients = ensureToolResultClients(deps);
1183
- if (classifiedClients !== true && !await bounded(Promise.resolve(classifiedClients), {
1184
- ms: HOOK_WALL_BUDGET_MS.tool_result_edit,
1185
- signal: deps.signal,
1186
- hook: "tool_result_edit",
1187
- label: "classified-tool-result-analysis"
1188
- }))
1500
+ if (!classifiedClientsReady || !entryLive)
1189
1501
  return;
1190
1502
  const dispatchOutcome = await bounded(dispatchPipelineAnalysis({
1191
1503
  deps,
@@ -1193,9 +1505,11 @@ export async function handleToolResult(deps) {
1193
1505
  filePath,
1194
1506
  dispatchCwd,
1195
1507
  turnStateCwd,
1508
+ analysisRootMode,
1196
1509
  autofixMode,
1197
1510
  modifiedRanges,
1198
1511
  writeIndex,
1512
+ writeOrderTurn,
1199
1513
  initialStateHash,
1200
1514
  readGuardCorrelationId,
1201
1515
  requestedEditIndexes,
@@ -1205,7 +1519,10 @@ export async function handleToolResult(deps) {
1205
1519
  participantTotal,
1206
1520
  toolResultStart,
1207
1521
  nativeAppliedPairs,
1208
- allowAutonomousWriters: bashAuthorshipConfirmed
1522
+ preserveNativeAuthorship: nativeAuthoredRanges !== undefined,
1523
+ allowAutonomousWriters: bashAuthorshipConfirmed,
1524
+ sessionGeneration: writeSession,
1525
+ ownFileTimeStamp: ownWriteStamp.stampFileTime
1209
1526
  }), {
1210
1527
  ms: HOOK_WALL_BUDGET_MS.tool_result_edit,
1211
1528
  signal: deps.signal || undefined,
@@ -1218,14 +1535,15 @@ export async function handleToolResult(deps) {
1218
1535
  return dispatchOutcome.response;
1219
1536
  }
1220
1537
  const result = dispatchOutcome.result;
1538
+ const resultLive = writeSession.guardedWrite(filePath, () => true) === true;
1221
1539
  let autofixNewlyQueued = false;
1222
- if (!result.isError && bashAuthorshipConfirmed && autofixMode === "deferred" && nodeFs.existsSync(filePath)) {
1223
- autofixNewlyQueued = runtime.deferMutation?.call(runtime, filePath, dispatchCwd, event.toolName, turnStateCwd, "autofix", deps.sessionId, resolutionBasis) ?? false;
1540
+ if (resultLive && !result.isError && bashAuthorshipConfirmed && autofixMode === "deferred" && nodeFs.existsSync(filePath)) {
1541
+ autofixNewlyQueued = runtime.deferMutation?.call(runtime, filePath, dispatchCwd, event.toolName, turnStateCwd, "autofix", deps.sessionId, resolutionBasis, undefined, analysisRootMode) ?? false;
1224
1542
  dbg(`tool_result: queued deferred autofix for ${filePath}`);
1225
1543
  }
1226
1544
  let formatQueued = false;
1227
- if (!result.isError && bashAuthorshipConfirmed && !getFlag("no-autoformat", filePath) && (autofixMode === "deferred" || !getFlag("immediate-format")) && nodeFs.existsSync(filePath)) {
1228
- const isNewlyQueued = runtime.deferFormat(filePath, dispatchCwd, event.toolName, turnStateCwd, deps.sessionId, resolutionBasis);
1545
+ if (resultLive && !result.isError && bashAuthorshipConfirmed && !getFlag("no-autoformat", filePath) && (autofixMode === "deferred" || !getFlag("immediate-format")) && nodeFs.existsSync(filePath)) {
1546
+ const isNewlyQueued = runtime.deferFormat(filePath, dispatchCwd, event.toolName, turnStateCwd, deps.sessionId, resolutionBasis, analysisRootMode);
1229
1547
  formatQueued = true;
1230
1548
  dbg(`tool_result: queued deferred format for ${filePath}`);
1231
1549
  logLatency({
@@ -1237,21 +1555,33 @@ export async function handleToolResult(deps) {
1237
1555
  metadata: { cwd: dispatchCwd }
1238
1556
  });
1239
1557
  if (isNewlyQueued || autofixNewlyQueued) {
1558
+ const identity = runtime.deferredFormatIdentity?.(filePath);
1240
1559
  publishFormatQueued({
1241
1560
  filePath,
1242
1561
  cwd: dispatchCwd,
1243
1562
  tool: mutation.kind,
1244
1563
  dbg,
1245
- kinds: autofixMode === "deferred" ? ["autofix", "format"] : ["format"]
1564
+ kinds: autofixMode === "deferred" ? ["autofix", "format"] : ["format"],
1565
+ ...identity === undefined ? {} : {
1566
+ ...identity.ownerSessionId === undefined ? {} : { ownerSessionId: identity.ownerSessionId },
1567
+ turnIndex: identity.turnIndex,
1568
+ batchId: identity.batchId
1569
+ }
1246
1570
  });
1247
1571
  }
1248
1572
  }
1249
1573
  if (autofixNewlyQueued && !formatQueued) {
1574
+ const identity = runtime.deferredFormatIdentity?.(filePath);
1250
1575
  publishFormatQueued({
1251
1576
  filePath,
1252
1577
  cwd: dispatchCwd,
1253
1578
  tool: mutation.kind,
1254
1579
  kinds: ["autofix"],
1580
+ ...identity === undefined ? {} : {
1581
+ ...identity.ownerSessionId === undefined ? {} : { ownerSessionId: identity.ownerSessionId },
1582
+ turnIndex: identity.turnIndex,
1583
+ batchId: identity.batchId
1584
+ },
1255
1585
  dbg
1256
1586
  });
1257
1587
  }
@@ -1263,10 +1593,13 @@ export async function handleToolResult(deps) {
1263
1593
  recordProjectChange({
1264
1594
  runtime,
1265
1595
  cwd: turnStateCwd,
1596
+ analysisRootMode,
1266
1597
  filePath: resolvedChanged,
1267
1598
  source: "autofix",
1268
1599
  dbg
1269
1600
  });
1601
+ if (!resultLive)
1602
+ continue;
1270
1603
  if (pathsEqual(path.resolve(turnStateCwd, changedFile), path.resolve(filePath)))
1271
1604
  continue;
1272
1605
  try {
@@ -1274,65 +1607,54 @@ export async function handleToolResult(deps) {
1274
1607
  const lineCount = content.split(`
1275
1608
  `).length;
1276
1609
  const hasImports = /^import\s/m.test(content);
1277
- cacheManager.addModifiedRange(resolvedChanged, { start: 1, end: lineCount }, hasImports, turnStateCwd);
1610
+ cacheManager.addModifiedRange(resolvedChanged, { start: 1, end: lineCount }, hasImports, turnStateCwd, deps.sessionId ?? runtime.telemetrySessionId, "pi", undefined, analysisRootMode);
1278
1611
  dbg(`tool_result: tracking dm-lens side-effect change for ${resolvedChanged}`);
1279
1612
  } catch (err) {
1280
1613
  dbg(`tool_result: side-effect tracking failed for ${resolvedChanged}: ${err}`);
1281
1614
  }
1282
1615
  }
1283
1616
  if (result.cascadePromise) {
1284
- runtime.appendCascadePromise(result.cascadePromise);
1617
+ runtime.appendCascadePromise(result.cascadePromise, writeSession, filePath, analysisRootMode);
1285
1618
  }
1286
- if (result.actionableWarnings?.length) {
1287
- runtime.recordActionableWarnings(result.actionableWarnings);
1619
+ const { actionableWarnings, codeQualityWarnings } = result;
1620
+ if (actionableWarnings?.length) {
1621
+ writeSession.guardedWrite(filePath, () => runtime.recordActionableWarnings(actionableWarnings, deps.sessionId));
1288
1622
  }
1289
- if (result.codeQualityWarnings?.length) {
1290
- runtime.recordCodeQualityWarnings(result.codeQualityWarnings);
1623
+ if (codeQualityWarnings?.length) {
1624
+ writeSession.guardedWrite(filePath, () => runtime.recordCodeQualityWarnings(codeQualityWarnings, deps.sessionId));
1291
1625
  }
1292
- if (getFlag("lens-turn-summary")) {
1293
- if (result.diagnostics?.length) {
1294
- for (const d of result.diagnostics) {
1295
- runtime.turnSummary.recordDiagnostic(d.filePath || filePath, {
1296
- tool: d.tool,
1297
- ruleId: d.rule ?? d.code,
1298
- severity: d.severity,
1299
- line: d.line,
1300
- description: d.message
1301
- });
1302
- }
1303
- }
1304
- if (result.fixedCount && result.fixedCount > 0) {
1305
- for (const label of result.autofixTools ?? []) {
1306
- const [tool, countStr] = label.split(":");
1307
- const count = Number.parseInt(countStr ?? "", 10);
1308
- runtime.turnSummary.recordAutofix(filePath, {
1309
- tool: tool || label,
1310
- description: Number.isFinite(count) && count > 0 ? `${count} issue(s) fixed` : undefined
1311
- });
1312
- }
1313
- }
1314
- if (result.formattersUsed?.length) {
1315
- for (const tool of result.formattersUsed) {
1316
- runtime.turnSummary.recordFormat(filePath, { tool });
1317
- }
1318
- }
1319
- }
1320
- if (result.inlineBlockerSummary) {
1321
- runtime.recordInlineBlockers(filePath, result.inlineBlockerSummary, writeIndex, result.inlineBlockerSources, result.inlineBlockerLines, result.inlineBlockerFileContent, result.inlineBlockerDiagnostics);
1626
+ recordTurnSummary({
1627
+ runtime,
1628
+ filePath,
1629
+ result,
1630
+ getFlag,
1631
+ resultLive,
1632
+ analysisRootMode
1633
+ });
1634
+ let inlineVerdictApplied;
1635
+ const { inlineBlockerSummary } = result;
1636
+ if (inlineBlockerSummary) {
1637
+ inlineVerdictApplied = writeSession.guardedWrite(filePath, () => runtime.recordInlineBlockers(filePath, inlineBlockerSummary, result.writeIndex ?? writeIndex, result.inlineBlockerSources, result.inlineBlockerLines, result.inlineBlockerFileContent, result.inlineBlockerDiagnostics, result.orderTurn ?? writeOrderTurn, result.analysisReadAtMs)) !== undefined;
1322
1638
  } else {
1323
- runtime.clearInlineBlockers(filePath);
1639
+ inlineVerdictApplied = writeSession.guardedWrite(filePath, () => runtime.clearInlineBlockers(filePath, result.writeIndex ?? writeIndex, result.orderTurn ?? writeOrderTurn, {
1640
+ authored: bashAuthorshipConfirmed,
1641
+ sha256: result.inlineBlockerFileContent?.sha256
1642
+ })) ?? false;
1324
1643
  }
1325
- runtime.updateGitGuardStatus(result.hasBlockers, result.output);
1326
- if (getFlag("lens-guard")) {
1327
- syncGitGuardRecord(runtime, cacheManager, turnStateCwd, filePath);
1328
- if (result.isError && !result.hasBlockers) {
1329
- runtime.markGitGuardCacheUnknown("pipeline_error");
1644
+ if (resultLive) {
1645
+ runtime.updateGitGuardStatus(inlineVerdictApplied && result.hasBlockers, result.output);
1646
+ if (getFlag("lens-guard")) {
1647
+ syncGitGuardRecord(runtime, cacheManager, turnStateCwd, filePath, analysisRootMode);
1648
+ if (result.isError && !result.hasBlockers) {
1649
+ runtime.markGitGuardCacheUnknown("pipeline_error");
1650
+ }
1330
1651
  }
1331
1652
  }
1332
1653
  if (result.isError) {
1333
1654
  return {
1334
1655
  content: [...event.content, { type: "text", text: result.output }],
1335
- isError: true
1656
+ isError: true,
1657
+ structuredContent: event.structuredContent
1336
1658
  };
1337
1659
  }
1338
1660
  let output = result.output;
@@ -1379,6 +1701,23 @@ ${postMutation.content}` : "";
1379
1701
  }
1380
1702
  if (postMutation) {
1381
1703
  noteAuthoritativeContentAttachment(postMutation.filePath, attachAuthoritativeContent);
1704
+ if (attachAuthoritativeContent && !getFlag("no-read-guard")) {
1705
+ const evidence = deliveredLineEvidence(postMutation.content, 1);
1706
+ deps.readGuard?.recordRead({
1707
+ filePath: postMutation.filePath,
1708
+ requestedOffset: 1,
1709
+ requestedLimit: evidence.lineCount,
1710
+ effectiveOffset: 1,
1711
+ effectiveLimit: evidence.lineCount,
1712
+ expandedByLsp: false,
1713
+ ...evidence.lineHashes && { lineHashes: evidence.lineHashes },
1714
+ turnIndex: runtime.turnIndex,
1715
+ writeIndex: runtime.peekWriteIndex(),
1716
+ timestamp: Date.now(),
1717
+ source: "autofix-attachment"
1718
+ }, { stampFileTime: false });
1719
+ logConversationRead("autofix-attachment", postMutation.filePath, 1, evidence);
1720
+ }
1382
1721
  }
1383
1722
  const returnedContent = attachAuthoritativeContent ? [...event.content, { type: "text", text: attachmentText }] : event.content;
1384
1723
  if (notice) {
@@ -1389,6 +1728,7 @@ ${postMutation.content}` : "";
1389
1728
  if (!output && !result.postMutation)
1390
1729
  return;
1391
1730
  return {
1392
- content: output ? [...returnedContent, { type: "text", text: output }] : returnedContent
1731
+ content: output ? [...returnedContent, { type: "text", text: output }] : returnedContent,
1732
+ structuredContent: event.structuredContent
1393
1733
  };
1394
1734
  }