@descryy/mcp 0.11.5 → 0.11.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 (445) hide show
  1. package/dist/action-handshake.d.ts +38 -0
  2. package/dist/action-handshake.d.ts.map +1 -0
  3. package/dist/action-handshake.js +127 -0
  4. package/dist/action-handshake.js.map +1 -0
  5. package/dist/bin/descry-mcp.d.ts +7 -0
  6. package/dist/bin/descry-mcp.d.ts.map +1 -0
  7. package/dist/bin/descry-mcp.js +73 -0
  8. package/dist/bin/descry-mcp.js.map +1 -0
  9. package/dist/browser/auth.d.ts +84 -0
  10. package/dist/browser/auth.d.ts.map +1 -0
  11. package/dist/browser/auth.js +233 -0
  12. package/dist/browser/auth.js.map +1 -0
  13. package/dist/browser/capability-probe.d.ts +109 -0
  14. package/dist/browser/capability-probe.d.ts.map +1 -0
  15. package/dist/browser/capability-probe.js +201 -0
  16. package/dist/browser/capability-probe.js.map +1 -0
  17. package/dist/browser/driver.d.ts +591 -0
  18. package/dist/browser/driver.d.ts.map +1 -0
  19. package/dist/browser/driver.js +116 -0
  20. package/dist/browser/driver.js.map +1 -0
  21. package/dist/browser/evidence.d.ts +28 -0
  22. package/dist/browser/evidence.d.ts.map +1 -0
  23. package/dist/browser/evidence.js +82 -0
  24. package/dist/browser/evidence.js.map +1 -0
  25. package/dist/browser/fake-driver.d.ts +116 -0
  26. package/dist/browser/fake-driver.d.ts.map +1 -0
  27. package/dist/browser/fake-driver.js +416 -0
  28. package/dist/browser/fake-driver.js.map +1 -0
  29. package/dist/browser/fault-attribution.d.ts +178 -0
  30. package/dist/browser/fault-attribution.d.ts.map +1 -0
  31. package/dist/browser/fault-attribution.js +266 -0
  32. package/dist/browser/fault-attribution.js.map +1 -0
  33. package/dist/browser/graph-write.d.ts +45 -0
  34. package/dist/browser/graph-write.d.ts.map +1 -0
  35. package/dist/browser/graph-write.js +103 -0
  36. package/dist/browser/graph-write.js.map +1 -0
  37. package/dist/browser/identity-graph-write.d.ts +55 -0
  38. package/dist/browser/identity-graph-write.d.ts.map +1 -0
  39. package/dist/browser/identity-graph-write.js +45 -0
  40. package/dist/browser/identity-graph-write.js.map +1 -0
  41. package/dist/browser/page-probe.d.ts +81 -0
  42. package/dist/browser/page-probe.d.ts.map +1 -0
  43. package/dist/browser/page-probe.js +202 -0
  44. package/dist/browser/page-probe.js.map +1 -0
  45. package/dist/browser/playwright-driver.d.ts +115 -0
  46. package/dist/browser/playwright-driver.d.ts.map +1 -0
  47. package/dist/browser/playwright-driver.js +1545 -0
  48. package/dist/browser/playwright-driver.js.map +1 -0
  49. package/dist/browser/provider.d.ts +26 -0
  50. package/dist/browser/provider.d.ts.map +1 -0
  51. package/dist/browser/provider.js +14 -0
  52. package/dist/browser/provider.js.map +1 -0
  53. package/dist/browser/reach-recording-session.d.ts +44 -0
  54. package/dist/browser/reach-recording-session.d.ts.map +1 -0
  55. package/dist/browser/reach-recording-session.js +151 -0
  56. package/dist/browser/reach-recording-session.js.map +1 -0
  57. package/dist/browser/reachability.d.ts +168 -0
  58. package/dist/browser/reachability.d.ts.map +1 -0
  59. package/dist/browser/reachability.js +294 -0
  60. package/dist/browser/reachability.js.map +1 -0
  61. package/dist/browser/registry.d.ts +126 -0
  62. package/dist/browser/registry.d.ts.map +1 -0
  63. package/dist/browser/registry.js +177 -0
  64. package/dist/browser/registry.js.map +1 -0
  65. package/dist/browser/scenario-provenance.d.ts +23 -0
  66. package/dist/browser/scenario-provenance.d.ts.map +1 -0
  67. package/dist/browser/scenario-provenance.js +73 -0
  68. package/dist/browser/scenario-provenance.js.map +1 -0
  69. package/dist/browser/scenario-resolve.d.ts +28 -0
  70. package/dist/browser/scenario-resolve.d.ts.map +1 -0
  71. package/dist/browser/scenario-resolve.js +96 -0
  72. package/dist/browser/scenario-resolve.js.map +1 -0
  73. package/dist/browser/scenario-runner.d.ts +72 -0
  74. package/dist/browser/scenario-runner.d.ts.map +1 -0
  75. package/dist/browser/scenario-runner.js +353 -0
  76. package/dist/browser/scenario-runner.js.map +1 -0
  77. package/dist/browser/stack-parser.d.ts +19 -0
  78. package/dist/browser/stack-parser.d.ts.map +1 -0
  79. package/dist/browser/stack-parser.js +85 -0
  80. package/dist/browser/stack-parser.js.map +1 -0
  81. package/dist/browser/tool-support.d.ts +71 -0
  82. package/dist/browser/tool-support.d.ts.map +1 -0
  83. package/dist/browser/tool-support.js +216 -0
  84. package/dist/browser/tool-support.js.map +1 -0
  85. package/dist/browser/url-scheme.d.ts +14 -0
  86. package/dist/browser/url-scheme.d.ts.map +1 -0
  87. package/dist/browser/url-scheme.js +38 -0
  88. package/dist/browser/url-scheme.js.map +1 -0
  89. package/dist/browser/wait-target.d.ts +37 -0
  90. package/dist/browser/wait-target.d.ts.map +1 -0
  91. package/dist/browser/wait-target.js +54 -0
  92. package/dist/browser/wait-target.js.map +1 -0
  93. package/dist/cancellation.d.ts +20 -0
  94. package/dist/cancellation.d.ts.map +1 -0
  95. package/dist/cancellation.js +41 -0
  96. package/dist/cancellation.js.map +1 -0
  97. package/dist/capped.d.ts +39 -0
  98. package/dist/capped.d.ts.map +1 -0
  99. package/dist/capped.js +43 -0
  100. package/dist/capped.js.map +1 -0
  101. package/dist/credential-store.d.ts +22 -0
  102. package/dist/credential-store.d.ts.map +1 -0
  103. package/dist/credential-store.js +33 -0
  104. package/dist/credential-store.js.map +1 -0
  105. package/dist/disclosure-ledger.d.ts +14 -0
  106. package/dist/disclosure-ledger.d.ts.map +1 -0
  107. package/dist/disclosure-ledger.js +18 -0
  108. package/dist/disclosure-ledger.js.map +1 -0
  109. package/dist/evidence/observed-route-evidence.d.ts +25 -0
  110. package/dist/evidence/observed-route-evidence.d.ts.map +1 -0
  111. package/dist/evidence/observed-route-evidence.js +76 -0
  112. package/dist/evidence/observed-route-evidence.js.map +1 -0
  113. package/dist/heap.d.ts +61 -0
  114. package/dist/heap.d.ts.map +1 -0
  115. package/dist/heap.js +82 -0
  116. package/dist/heap.js.map +1 -0
  117. package/dist/heartbeat.d.ts +46 -0
  118. package/dist/heartbeat.d.ts.map +1 -0
  119. package/dist/heartbeat.js +66 -0
  120. package/dist/heartbeat.js.map +1 -0
  121. package/dist/index.d.ts +32 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +19 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/module-trust.d.ts +37 -0
  126. package/dist/module-trust.d.ts.map +1 -0
  127. package/dist/module-trust.js +77 -0
  128. package/dist/module-trust.js.map +1 -0
  129. package/dist/path-confinement.d.ts +31 -0
  130. package/dist/path-confinement.d.ts.map +1 -0
  131. package/dist/path-confinement.js +44 -0
  132. package/dist/path-confinement.js.map +1 -0
  133. package/dist/planner/predict-then-propose.d.ts +134 -0
  134. package/dist/planner/predict-then-propose.d.ts.map +1 -0
  135. package/dist/planner/predict-then-propose.js +138 -0
  136. package/dist/planner/predict-then-propose.js.map +1 -0
  137. package/dist/planner/propose-journey.d.ts +75 -0
  138. package/dist/planner/propose-journey.d.ts.map +1 -0
  139. package/dist/planner/propose-journey.js +96 -0
  140. package/dist/planner/propose-journey.js.map +1 -0
  141. package/dist/protocol.d.ts +57 -0
  142. package/dist/protocol.d.ts.map +1 -0
  143. package/dist/protocol.js +90 -0
  144. package/dist/protocol.js.map +1 -0
  145. package/dist/ready-checks.d.ts +12 -0
  146. package/dist/ready-checks.d.ts.map +1 -0
  147. package/dist/ready-checks.js +43 -0
  148. package/dist/ready-checks.js.map +1 -0
  149. package/dist/registry.d.ts +103 -0
  150. package/dist/registry.d.ts.map +1 -0
  151. package/dist/registry.js +327 -0
  152. package/dist/registry.js.map +1 -0
  153. package/dist/render.d.ts +623 -0
  154. package/dist/render.d.ts.map +1 -0
  155. package/dist/render.js +968 -0
  156. package/dist/render.js.map +1 -0
  157. package/dist/runtime-registry.d.ts +22 -0
  158. package/dist/runtime-registry.d.ts.map +1 -0
  159. package/dist/runtime-registry.js +142 -0
  160. package/dist/runtime-registry.js.map +1 -0
  161. package/dist/sandbox-defaults.d.ts +41 -0
  162. package/dist/sandbox-defaults.d.ts.map +1 -0
  163. package/dist/sandbox-defaults.js +14 -0
  164. package/dist/sandbox-defaults.js.map +1 -0
  165. package/dist/scenarios/browser-run-plan-projection.d.ts +161 -0
  166. package/dist/scenarios/browser-run-plan-projection.d.ts.map +1 -0
  167. package/dist/scenarios/browser-run-plan-projection.js +264 -0
  168. package/dist/scenarios/browser-run-plan-projection.js.map +1 -0
  169. package/dist/scenarios/credential-ref.d.ts +102 -0
  170. package/dist/scenarios/credential-ref.d.ts.map +1 -0
  171. package/dist/scenarios/credential-ref.js +148 -0
  172. package/dist/scenarios/credential-ref.js.map +1 -0
  173. package/dist/scenarios/index.d.ts +7 -0
  174. package/dist/scenarios/index.d.ts.map +1 -0
  175. package/dist/scenarios/index.js +7 -0
  176. package/dist/scenarios/index.js.map +1 -0
  177. package/dist/scenarios/parse.d.ts +18 -0
  178. package/dist/scenarios/parse.d.ts.map +1 -0
  179. package/dist/scenarios/parse.js +212 -0
  180. package/dist/scenarios/parse.js.map +1 -0
  181. package/dist/scenarios/scenario.d.ts +93 -0
  182. package/dist/scenarios/scenario.d.ts.map +1 -0
  183. package/dist/scenarios/scenario.js +27 -0
  184. package/dist/scenarios/scenario.js.map +1 -0
  185. package/dist/scenarios/secret-ref.d.ts +86 -0
  186. package/dist/scenarios/secret-ref.d.ts.map +1 -0
  187. package/dist/scenarios/secret-ref.js +125 -0
  188. package/dist/scenarios/secret-ref.js.map +1 -0
  189. package/dist/scenarios/storage.d.ts +21 -0
  190. package/dist/scenarios/storage.d.ts.map +1 -0
  191. package/dist/scenarios/storage.js +103 -0
  192. package/dist/scenarios/storage.js.map +1 -0
  193. package/dist/server.d.ts +61 -0
  194. package/dist/server.d.ts.map +1 -0
  195. package/dist/server.js +642 -0
  196. package/dist/server.js.map +1 -0
  197. package/dist/session.d.ts +356 -0
  198. package/dist/session.d.ts.map +1 -0
  199. package/dist/session.js +779 -0
  200. package/dist/session.js.map +1 -0
  201. package/dist/tools/alias-kit.d.ts +29 -0
  202. package/dist/tools/alias-kit.d.ts.map +1 -0
  203. package/dist/tools/alias-kit.js +21 -0
  204. package/dist/tools/alias-kit.js.map +1 -0
  205. package/dist/tools/aliases.d.ts +42 -0
  206. package/dist/tools/aliases.d.ts.map +1 -0
  207. package/dist/tools/aliases.js +52 -0
  208. package/dist/tools/aliases.js.map +1 -0
  209. package/dist/tools/analyze-workspace.d.ts +52 -0
  210. package/dist/tools/analyze-workspace.d.ts.map +1 -0
  211. package/dist/tools/analyze-workspace.js +207 -0
  212. package/dist/tools/analyze-workspace.js.map +1 -0
  213. package/dist/tools/analyze.d.ts +163 -0
  214. package/dist/tools/analyze.d.ts.map +1 -0
  215. package/dist/tools/analyze.js +724 -0
  216. package/dist/tools/analyze.js.map +1 -0
  217. package/dist/tools/browser-click.d.ts +18 -0
  218. package/dist/tools/browser-click.d.ts.map +1 -0
  219. package/dist/tools/browser-click.js +110 -0
  220. package/dist/tools/browser-click.js.map +1 -0
  221. package/dist/tools/browser-close-session.d.ts +39 -0
  222. package/dist/tools/browser-close-session.d.ts.map +1 -0
  223. package/dist/tools/browser-close-session.js +120 -0
  224. package/dist/tools/browser-close-session.js.map +1 -0
  225. package/dist/tools/browser-fill.d.ts +18 -0
  226. package/dist/tools/browser-fill.d.ts.map +1 -0
  227. package/dist/tools/browser-fill.js +117 -0
  228. package/dist/tools/browser-fill.js.map +1 -0
  229. package/dist/tools/browser-navigate.d.ts +15 -0
  230. package/dist/tools/browser-navigate.d.ts.map +1 -0
  231. package/dist/tools/browser-navigate.js +106 -0
  232. package/dist/tools/browser-navigate.js.map +1 -0
  233. package/dist/tools/browser-read.d.ts +33 -0
  234. package/dist/tools/browser-read.d.ts.map +1 -0
  235. package/dist/tools/browser-read.js +105 -0
  236. package/dist/tools/browser-read.js.map +1 -0
  237. package/dist/tools/browser-run-scenario.d.ts +28 -0
  238. package/dist/tools/browser-run-scenario.d.ts.map +1 -0
  239. package/dist/tools/browser-run-scenario.js +238 -0
  240. package/dist/tools/browser-run-scenario.js.map +1 -0
  241. package/dist/tools/browser-save-scenario.d.ts +19 -0
  242. package/dist/tools/browser-save-scenario.d.ts.map +1 -0
  243. package/dist/tools/browser-save-scenario.js +447 -0
  244. package/dist/tools/browser-save-scenario.js.map +1 -0
  245. package/dist/tools/browser-select.d.ts +20 -0
  246. package/dist/tools/browser-select.d.ts.map +1 -0
  247. package/dist/tools/browser-select.js +120 -0
  248. package/dist/tools/browser-select.js.map +1 -0
  249. package/dist/tools/browser-snapshot.d.ts +46 -0
  250. package/dist/tools/browser-snapshot.d.ts.map +1 -0
  251. package/dist/tools/browser-snapshot.js +127 -0
  252. package/dist/tools/browser-snapshot.js.map +1 -0
  253. package/dist/tools/browser-start-session.d.ts +24 -0
  254. package/dist/tools/browser-start-session.d.ts.map +1 -0
  255. package/dist/tools/browser-start-session.js +653 -0
  256. package/dist/tools/browser-start-session.js.map +1 -0
  257. package/dist/tools/browser-submit.d.ts +18 -0
  258. package/dist/tools/browser-submit.d.ts.map +1 -0
  259. package/dist/tools/browser-submit.js +106 -0
  260. package/dist/tools/browser-submit.js.map +1 -0
  261. package/dist/tools/browser-type.d.ts +18 -0
  262. package/dist/tools/browser-type.d.ts.map +1 -0
  263. package/dist/tools/browser-type.js +115 -0
  264. package/dist/tools/browser-type.js.map +1 -0
  265. package/dist/tools/browser-wait-for.d.ts +45 -0
  266. package/dist/tools/browser-wait-for.d.ts.map +1 -0
  267. package/dist/tools/browser-wait-for.js +164 -0
  268. package/dist/tools/browser-wait-for.js.map +1 -0
  269. package/dist/tools/browser.d.ts +69 -0
  270. package/dist/tools/browser.d.ts.map +1 -0
  271. package/dist/tools/browser.js +326 -0
  272. package/dist/tools/browser.js.map +1 -0
  273. package/dist/tools/chain.d.ts +41 -0
  274. package/dist/tools/chain.d.ts.map +1 -0
  275. package/dist/tools/chain.js +101 -0
  276. package/dist/tools/chain.js.map +1 -0
  277. package/dist/tools/change-scope.d.ts +25 -0
  278. package/dist/tools/change-scope.d.ts.map +1 -0
  279. package/dist/tools/change-scope.js +103 -0
  280. package/dist/tools/change-scope.js.map +1 -0
  281. package/dist/tools/code-context.d.ts +83 -0
  282. package/dist/tools/code-context.d.ts.map +1 -0
  283. package/dist/tools/code-context.js +432 -0
  284. package/dist/tools/code-context.js.map +1 -0
  285. package/dist/tools/contracts.d.ts +74 -0
  286. package/dist/tools/contracts.d.ts.map +1 -0
  287. package/dist/tools/contracts.js +214 -0
  288. package/dist/tools/contracts.js.map +1 -0
  289. package/dist/tools/cross-pr.d.ts +178 -0
  290. package/dist/tools/cross-pr.d.ts.map +1 -0
  291. package/dist/tools/cross-pr.js +362 -0
  292. package/dist/tools/cross-pr.js.map +1 -0
  293. package/dist/tools/disclosure.d.ts +75 -0
  294. package/dist/tools/disclosure.d.ts.map +1 -0
  295. package/dist/tools/disclosure.js +325 -0
  296. package/dist/tools/disclosure.js.map +1 -0
  297. package/dist/tools/draw-conclusion.d.ts +55 -0
  298. package/dist/tools/draw-conclusion.d.ts.map +1 -0
  299. package/dist/tools/draw-conclusion.js +243 -0
  300. package/dist/tools/draw-conclusion.js.map +1 -0
  301. package/dist/tools/git-context.d.ts +39 -0
  302. package/dist/tools/git-context.d.ts.map +1 -0
  303. package/dist/tools/git-context.js +374 -0
  304. package/dist/tools/git-context.js.map +1 -0
  305. package/dist/tools/git-diff.d.ts +45 -0
  306. package/dist/tools/git-diff.d.ts.map +1 -0
  307. package/dist/tools/git-diff.js +338 -0
  308. package/dist/tools/git-diff.js.map +1 -0
  309. package/dist/tools/git-history.d.ts +16 -0
  310. package/dist/tools/git-history.d.ts.map +1 -0
  311. package/dist/tools/git-history.js +106 -0
  312. package/dist/tools/git-history.js.map +1 -0
  313. package/dist/tools/history.d.ts +34 -0
  314. package/dist/tools/history.d.ts.map +1 -0
  315. package/dist/tools/history.js +121 -0
  316. package/dist/tools/history.js.map +1 -0
  317. package/dist/tools/impact.d.ts +46 -0
  318. package/dist/tools/impact.d.ts.map +1 -0
  319. package/dist/tools/impact.js +225 -0
  320. package/dist/tools/impact.js.map +1 -0
  321. package/dist/tools/index.d.ts +59 -0
  322. package/dist/tools/index.d.ts.map +1 -0
  323. package/dist/tools/index.js +70 -0
  324. package/dist/tools/index.js.map +1 -0
  325. package/dist/tools/kit.d.ts +165 -0
  326. package/dist/tools/kit.d.ts.map +1 -0
  327. package/dist/tools/kit.js +153 -0
  328. package/dist/tools/kit.js.map +1 -0
  329. package/dist/tools/link-workspace.d.ts +24 -0
  330. package/dist/tools/link-workspace.d.ts.map +1 -0
  331. package/dist/tools/link-workspace.js +131 -0
  332. package/dist/tools/link-workspace.js.map +1 -0
  333. package/dist/tools/lookup.d.ts +19 -0
  334. package/dist/tools/lookup.d.ts.map +1 -0
  335. package/dist/tools/lookup.js +63 -0
  336. package/dist/tools/lookup.js.map +1 -0
  337. package/dist/tools/mark-incident.d.ts +28 -0
  338. package/dist/tools/mark-incident.d.ts.map +1 -0
  339. package/dist/tools/mark-incident.js +171 -0
  340. package/dist/tools/mark-incident.js.map +1 -0
  341. package/dist/tools/merged-browser.d.ts +11 -0
  342. package/dist/tools/merged-browser.d.ts.map +1 -0
  343. package/dist/tools/merged-browser.js +20 -0
  344. package/dist/tools/merged-browser.js.map +1 -0
  345. package/dist/tools/merged-context.d.ts +11 -0
  346. package/dist/tools/merged-context.d.ts.map +1 -0
  347. package/dist/tools/merged-context.js +21 -0
  348. package/dist/tools/merged-context.js.map +1 -0
  349. package/dist/tools/merged-observe.d.ts +13 -0
  350. package/dist/tools/merged-observe.d.ts.map +1 -0
  351. package/dist/tools/merged-observe.js +21 -0
  352. package/dist/tools/merged-observe.js.map +1 -0
  353. package/dist/tools/merged-workspace.d.ts +14 -0
  354. package/dist/tools/merged-workspace.d.ts.map +1 -0
  355. package/dist/tools/merged-workspace.js +21 -0
  356. package/dist/tools/merged-workspace.js.map +1 -0
  357. package/dist/tools/observe-runtime.d.ts +262 -0
  358. package/dist/tools/observe-runtime.d.ts.map +1 -0
  359. package/dist/tools/observe-runtime.js +1966 -0
  360. package/dist/tools/observe-runtime.js.map +1 -0
  361. package/dist/tools/observe-tests.d.ts +57 -0
  362. package/dist/tools/observe-tests.d.ts.map +1 -0
  363. package/dist/tools/observe-tests.js +391 -0
  364. package/dist/tools/observe-tests.js.map +1 -0
  365. package/dist/tools/observe.d.ts +28 -0
  366. package/dist/tools/observe.d.ts.map +1 -0
  367. package/dist/tools/observe.js +291 -0
  368. package/dist/tools/observe.js.map +1 -0
  369. package/dist/tools/pr-analysis.d.ts +189 -0
  370. package/dist/tools/pr-analysis.d.ts.map +1 -0
  371. package/dist/tools/pr-analysis.js +365 -0
  372. package/dist/tools/pr-analysis.js.map +1 -0
  373. package/dist/tools/pre-push.d.ts +168 -0
  374. package/dist/tools/pre-push.d.ts.map +1 -0
  375. package/dist/tools/pre-push.js +416 -0
  376. package/dist/tools/pre-push.js.map +1 -0
  377. package/dist/tools/predict-reach.d.ts +57 -0
  378. package/dist/tools/predict-reach.d.ts.map +1 -0
  379. package/dist/tools/predict-reach.js +183 -0
  380. package/dist/tools/predict-reach.js.map +1 -0
  381. package/dist/tools/propagation.d.ts +37 -0
  382. package/dist/tools/propagation.d.ts.map +1 -0
  383. package/dist/tools/propagation.js +162 -0
  384. package/dist/tools/propagation.js.map +1 -0
  385. package/dist/tools/propose-journey.d.ts +16 -0
  386. package/dist/tools/propose-journey.d.ts.map +1 -0
  387. package/dist/tools/propose-journey.js +132 -0
  388. package/dist/tools/propose-journey.js.map +1 -0
  389. package/dist/tools/prove-reach.d.ts +74 -0
  390. package/dist/tools/prove-reach.d.ts.map +1 -0
  391. package/dist/tools/prove-reach.js +274 -0
  392. package/dist/tools/prove-reach.js.map +1 -0
  393. package/dist/tools/questions.d.ts +30 -0
  394. package/dist/tools/questions.d.ts.map +1 -0
  395. package/dist/tools/questions.js +230 -0
  396. package/dist/tools/questions.js.map +1 -0
  397. package/dist/tools/refusal-fetch.d.ts +35 -0
  398. package/dist/tools/refusal-fetch.d.ts.map +1 -0
  399. package/dist/tools/refusal-fetch.js +123 -0
  400. package/dist/tools/refusal-fetch.js.map +1 -0
  401. package/dist/tools/runtime-incident.d.ts +33 -0
  402. package/dist/tools/runtime-incident.d.ts.map +1 -0
  403. package/dist/tools/runtime-incident.js +67 -0
  404. package/dist/tools/runtime-incident.js.map +1 -0
  405. package/dist/tools/runtime-journey-drive.d.ts +102 -0
  406. package/dist/tools/runtime-journey-drive.d.ts.map +1 -0
  407. package/dist/tools/runtime-journey-drive.js +247 -0
  408. package/dist/tools/runtime-journey-drive.js.map +1 -0
  409. package/dist/tools/scope.d.ts +45 -0
  410. package/dist/tools/scope.d.ts.map +1 -0
  411. package/dist/tools/scope.js +217 -0
  412. package/dist/tools/scope.js.map +1 -0
  413. package/dist/tools/similar-incidents.d.ts +43 -0
  414. package/dist/tools/similar-incidents.d.ts.map +1 -0
  415. package/dist/tools/similar-incidents.js +190 -0
  416. package/dist/tools/similar-incidents.js.map +1 -0
  417. package/dist/tools/validate.d.ts +133 -0
  418. package/dist/tools/validate.d.ts.map +1 -0
  419. package/dist/tools/validate.js +488 -0
  420. package/dist/tools/validate.js.map +1 -0
  421. package/dist/tools/verb.d.ts +46 -0
  422. package/dist/tools/verb.d.ts.map +1 -0
  423. package/dist/tools/verb.js +78 -0
  424. package/dist/tools/verb.js.map +1 -0
  425. package/dist/tools/verification-status.d.ts +38 -0
  426. package/dist/tools/verification-status.d.ts.map +1 -0
  427. package/dist/tools/verification-status.js +203 -0
  428. package/dist/tools/verification-status.js.map +1 -0
  429. package/dist/tools/verify-claim.d.ts +29 -0
  430. package/dist/tools/verify-claim.d.ts.map +1 -0
  431. package/dist/tools/verify-claim.js +218 -0
  432. package/dist/tools/verify-claim.js.map +1 -0
  433. package/dist/tools/workspace.d.ts +28 -0
  434. package/dist/tools/workspace.d.ts.map +1 -0
  435. package/dist/tools/workspace.js +94 -0
  436. package/dist/tools/workspace.js.map +1 -0
  437. package/dist/transport.d.ts +32 -0
  438. package/dist/transport.d.ts.map +1 -0
  439. package/dist/transport.js +85 -0
  440. package/dist/transport.js.map +1 -0
  441. package/dist/workspace-index.d.ts +164 -0
  442. package/dist/workspace-index.d.ts.map +1 -0
  443. package/dist/workspace-index.js +381 -0
  444. package/dist/workspace-index.js.map +1 -0
  445. package/package.json +3 -3
@@ -0,0 +1,247 @@
1
+ /**
2
+ * RG-4 — both halves in the MCP layer, and RG-6's MCP half (video).
3
+ *
4
+ * `runInstrumentedExecution`'s `onReady` fires after every declared service's
5
+ * readiness has succeeded and before the observation window's sleep — the one
6
+ * moment in a run when the application is provably up and still alive. The
7
+ * desktop already composes exactly this way (`descry-desktop/packages/session/
8
+ * src/pipeline/browser-drive.ts`, invoked from `runtime-execution.ts`'s own
9
+ * `onReady`), so that browser evidence lands in the **same `EvidenceStore`
10
+ * under the same `executionId`** as the backend's. `observe_runtime` here
11
+ * never did: it passed no `onReady` and never drove a browser, so an MCP
12
+ * client got two calls with two lifetimes and nothing to prove they were the
13
+ * same run.
14
+ *
15
+ * This module is the MCP equivalent of the desktop's `browser-drive.ts` —
16
+ * same collectors, same package, same "never fabricate a step" discipline —
17
+ * built as its own file because `packages/mcp/src/browser/driver.ts` and
18
+ * `playwright-driver.ts` are lane identity's (a session-scoped, interactive
19
+ * `BrowserDriver` port for the `browser_*` tools' own lifetime) and this is a
20
+ * different lifetime entirely: one drive, bound to one execution's readiness
21
+ * window, torn down before that execution's observation window even starts.
22
+ * Composing through the identity lane's port would mean threading a whole
23
+ * interactive session through a callback that must complete before
24
+ * `onReady` returns — the wrong shape for what is, structurally, a single
25
+ * batch replay. `@descryy/runtime-browser`'s own collectors compose directly
26
+ * instead, the same way the desktop does it.
27
+ *
28
+ * ## The journey comes from the caller, projected by the ONE shared format
29
+ *
30
+ * `DEC-NEXT-runtime-journey-is-one-declared-format` (Q1) settled this: a
31
+ * saved `Scenario` and a driveable step list are two views of one format,
32
+ * and lane journey built the single projection both directions go through —
33
+ * `../scenarios/browser-run-plan-projection.ts`'s `projectScenarioToRunPlan`.
34
+ * This module calls that function and nothing else invents a second
35
+ * translation of the same scenario. Its own header explains exactly what
36
+ * projects and what refuses (seven shared verbs; `fill`, whole-page
37
+ * assertions and anything outside those seven are refused by name, never
38
+ * silently narrowed), and secret references are resolved inside it before
39
+ * this module ever sees a step — see that module's own doc.
40
+ *
41
+ * A `Scenario` with no steps drives to `startUrl` and observes, same as an
42
+ * empty step list does anywhere else in this codebase. No step is ever
43
+ * synthesized here.
44
+ *
45
+ * `@descryy/runtime-browser`'s `BrowserActionCollector` happens to support
46
+ * more than the shared projection's seven verbs (`assertVisible`/`assertText`
47
+ * included) — this module drives every one of the seven the projection
48
+ * can produce, which is a strict superset of what the desktop's narrower
49
+ * `BrowserStep` union can act on. `fill` is not among them: the shared
50
+ * projection refuses it because `BrowserStep` (the format's other consumer)
51
+ * has no counterpart for it, a decision this module does not own and does
52
+ * not work around — see the projection's own header for why collapsing it
53
+ * into `type` would be exactly the kind of silent narrowing rule 2 forbids.
54
+ */
55
+ import { createBrowserActionCollector, createBrowserConsoleCollector, createBrowserNetworkCollector, launchBrowserSession, } from "@descryy/runtime-browser";
56
+ import { projectScenarioToRunPlan } from "../scenarios/browser-run-plan-projection.js";
57
+ export { projectScenarioToRunPlan };
58
+ const DEFAULT_SETTLE_FOR_MS = 1_000;
59
+ export function createRuntimeJourneyDrive(plan) {
60
+ const launch = plan.launchSession ?? launchBrowserSession;
61
+ const steps = plan.steps ?? [];
62
+ return async (input) => {
63
+ const harnessError = (detail) => {
64
+ input.store.write({
65
+ executionId: input.executionId,
66
+ timestamp: new Date().toISOString(),
67
+ source: "harness",
68
+ service: plan.service ?? null,
69
+ process: null,
70
+ eventType: "COLLECTOR_ERROR",
71
+ payload: { raw: detail, error: detail, collectorId: "runtime-journey-drive" },
72
+ traceId: null,
73
+ requestId: null,
74
+ correlationId: null,
75
+ graphNodeId: null,
76
+ sourceLocation: null,
77
+ stackTrace: null,
78
+ confidence: 1,
79
+ collectorVersion: RUNTIME_JOURNEY_DRIVE_VERSION,
80
+ });
81
+ };
82
+ let session;
83
+ try {
84
+ session = await launch({
85
+ headless: plan.headless ?? true,
86
+ ...(plan.recordVideo === true ? { recordVideo: true } : {}),
87
+ });
88
+ }
89
+ catch (error) {
90
+ const cause = describe(error);
91
+ const disclosure = `No browser was driven for this run: the browser session could not be launched (${cause}). ` +
92
+ `Backend evidence is unaffected — this drive runs inside the readiness window and never blocks it.`;
93
+ harnessError(disclosure);
94
+ return { ran: false, startUrl: plan.startUrl, stepsCompleted: 0, stepsRefused: [], videoBytes: null, disclosure };
95
+ }
96
+ const actions = createBrowserActionCollector({ session, ...(plan.service === undefined ? {} : { service: plan.service }) });
97
+ const consoleCollector = createBrowserConsoleCollector({
98
+ session,
99
+ ...(plan.service === undefined ? {} : { service: plan.service }),
100
+ ...(input.stackTraceParser === undefined ? {} : { stackTraceParser: input.stackTraceParser }),
101
+ });
102
+ const networkCollector = createBrowserNetworkCollector({
103
+ session,
104
+ ...(plan.service === undefined ? {} : { service: plan.service }),
105
+ ...(input.stackTraceParser === undefined ? {} : { stackTraceParser: input.stackTraceParser }),
106
+ });
107
+ const context = {
108
+ executionId: input.executionId,
109
+ configuration: input.configuration,
110
+ emit: (evidence) => {
111
+ input.store.write({ ...evidence, executionId: input.executionId });
112
+ },
113
+ ...(input.resolveSourceRoot === undefined ? {} : { resolveSourceRoot: input.resolveSourceRoot }),
114
+ };
115
+ const refusals = [];
116
+ const unavailable = [];
117
+ let completed = 0;
118
+ let videoBytes = null;
119
+ try {
120
+ for (const [name, collector] of [
121
+ ["browser-console", consoleCollector],
122
+ ["browser-network", networkCollector],
123
+ ["browser-action", actions],
124
+ ]) {
125
+ try {
126
+ const started = await collector.start(context);
127
+ if (!started.available)
128
+ unavailable.push(`${name} (${started.reason ?? "no reason given"})`);
129
+ }
130
+ catch (error) {
131
+ unavailable.push(`${name} (start() threw: ${describe(error)})`);
132
+ harnessError(`browser collector "${name}" threw during start(): ${describe(error)}`);
133
+ }
134
+ }
135
+ await actions.navigate(plan.startUrl);
136
+ for (const [index, step] of steps.entries()) {
137
+ try {
138
+ await runStep(actions, step);
139
+ completed += 1;
140
+ }
141
+ catch (error) {
142
+ const reason = describe(error);
143
+ refusals.push({ index, kind: step.kind, reason });
144
+ harnessError(`journey step ${String(index + 1)} (${step.kind}) could not be performed: ${reason}`);
145
+ }
146
+ }
147
+ await sleep(plan.settleForMs ?? DEFAULT_SETTLE_FOR_MS);
148
+ }
149
+ catch (error) {
150
+ const cause = describe(error);
151
+ harnessError(`the journey drive stopped early: ${cause}`);
152
+ refusals.push({ index: completed, kind: "navigate", reason: cause });
153
+ }
154
+ // Same ordering constraint as the desktop's browser-drive.ts: captureVideo() must run
155
+ // after session.close() (Playwright only finalizes recordVideo once the context closes)
156
+ // and before actions.stop() (which clears the emit channel it writes into).
157
+ videoBytes = await finish(consoleCollector, networkCollector, actions, session, input, harnessError);
158
+ const disclosure = describeShortfall(unavailable, refusals, plan);
159
+ return { ran: true, startUrl: plan.startUrl, stepsCompleted: completed, stepsRefused: refusals, videoBytes, disclosure };
160
+ };
161
+ }
162
+ async function finish(consoleCollector, networkCollector, actions, session, input, harnessError) {
163
+ const before = countVideoBytes(input);
164
+ for (const [name, stop] of [
165
+ ["browser-console", () => consoleCollector.stop()],
166
+ ["browser-network", () => networkCollector.stop()],
167
+ ["browser-session", () => session.close()],
168
+ ["browser-video", () => actions.captureVideo()],
169
+ ["browser-action", () => actions.stop()],
170
+ ]) {
171
+ try {
172
+ await stop();
173
+ }
174
+ catch (error) {
175
+ harnessError(`journey drive teardown step "${name}" failed: ${describe(error)}`);
176
+ }
177
+ }
178
+ const after = countVideoBytes(input);
179
+ return after === before ? null : after;
180
+ }
181
+ function countVideoBytes(input) {
182
+ for (const evidence of input.store.getByExecution(input.executionId)) {
183
+ if (evidence.eventType !== "VIDEO")
184
+ continue;
185
+ const payload = evidence.payload;
186
+ if (typeof payload?.videoBase64 !== "string")
187
+ continue;
188
+ return Buffer.from(payload.videoBase64, "base64").length;
189
+ }
190
+ return null;
191
+ }
192
+ /** Never throws on a step this module cannot resolve to an action — that would surface as a
193
+ * bare refusal with a useless reason; a `ProjectedStep` naming no target/text for a kind that
194
+ * needs one is a defect in the projection this module trusts rather than something to re-check
195
+ * here, so those are stated plainly rather than re-validated. */
196
+ async function runStep(actions, step) {
197
+ switch (step.kind) {
198
+ case "navigate":
199
+ if (step.url === null)
200
+ throw new Error(`"navigate" step carries no url`);
201
+ return actions.navigate(step.url);
202
+ case "click":
203
+ return actions.click(requireSelector(step));
204
+ case "type":
205
+ return actions.type(requireSelector(step), requireText(step));
206
+ case "select":
207
+ return actions.select(requireSelector(step), requireText(step));
208
+ case "submit":
209
+ return actions.submit(requireSelector(step));
210
+ case "assertVisible":
211
+ return actions.assertVisible(requireSelector(step));
212
+ case "assertText":
213
+ return actions.assertText(requireSelector(step), requireText(step));
214
+ }
215
+ }
216
+ function requireSelector(step) {
217
+ if (step.target === null)
218
+ throw new Error(`"${step.kind}" step carries no target`);
219
+ return step.target.selector;
220
+ }
221
+ function requireText(step) {
222
+ if (step.text === null)
223
+ throw new Error(`"${step.kind}" step carries no text`);
224
+ return step.text;
225
+ }
226
+ function describeShortfall(unavailable, refusals, plan) {
227
+ const parts = [];
228
+ if (unavailable.length > 0) {
229
+ parts.push(`These browser collectors reported themselves unavailable and observed nothing: ${unavailable.join("; ")}.`);
230
+ }
231
+ if (refusals.length > 0) {
232
+ parts.push(`${String(refusals.length)} of ${String((plan.steps ?? []).length)} declared journey step(s) could not be performed: ` +
233
+ refusals.map((r) => `step ${String(r.index + 1)} (${r.kind}): ${r.reason}`).join("; ") +
234
+ ".");
235
+ }
236
+ return parts.length === 0 ? null : parts.join(" ");
237
+ }
238
+ function describe(error) {
239
+ return error instanceof Error ? `${error.name}: ${error.message}` : String(error);
240
+ }
241
+ function sleep(ms) {
242
+ return new Promise((resolve) => setTimeout(resolve, ms));
243
+ }
244
+ /** This module's own collector version, distinct from `@descryy/runtime-browser`'s — these rows
245
+ * are the composition lane's own harness reports about driving, not the browser package's. */
246
+ export const RUNTIME_JOURNEY_DRIVE_VERSION = "descry-mcp-runtime-journey-drive@1";
247
+ //# sourceMappingURL=runtime-journey-drive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-journey-drive.js","sourceRoot":"","sources":["../../src/tools/runtime-journey-drive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * `scope` — §12.5 diff scoping: what else does this change touch? Expansion stops
3
+ * on score, not hop count — a payment gateway 4 hops out matters, a logging import
4
+ * 1 hop out doesn't. A file the graph never heard of has two causes (not analysable,
5
+ * or stale graph) — both disclosed, never reported as "0 affected" (§20.2's collapse). */
6
+ import { type ScopeTier } from "@descryy/core";
7
+ import type { EdgeType } from "@descryy/ir";
8
+ import { type BriefNode, type ToolDefinition } from "./kit.ts";
9
+ /** A node in the scope, with why it is in it. */
10
+ export interface ScopedNodeReport extends BriefNode {
11
+ readonly score: number;
12
+ readonly tier: ScopeTier;
13
+ readonly depth: number;
14
+ /** The edge type this node was reached through. Absent for a seed. */
15
+ readonly via?: EdgeType;
16
+ }
17
+ /** Tier 1 is the changed set itself; 2-4 are the scoring bands beneath it. */
18
+ export interface ScopeTierCount {
19
+ readonly tier: number;
20
+ readonly count: number;
21
+ }
22
+ export interface ScopeReport {
23
+ /** Capped by `limit`; `changedTotal` is the uncapped count. Every seed is
24
+ * traversed either way — the cap shortens the listing, not the analysis. */
25
+ readonly changed: readonly ScopedNodeReport[];
26
+ readonly changedTotal: number;
27
+ /** Capped by `limit`; `affectedTotal` is the uncapped count. */
28
+ readonly affected: readonly ScopedNodeReport[];
29
+ readonly affectedTotal: number;
30
+ readonly droppedForBudget: number;
31
+ readonly budget: number;
32
+ readonly budgetUsed: number;
33
+ readonly byTier: readonly ScopeTierCount[];
34
+ }
35
+ /** Nothing named resolved into the graph, so the traversal never ran — a different
36
+ * shape, not a zeroed `ScopeReport`: no `budget`/`affectedTotal` because nothing ran.
37
+ * Narrow on `"seeds" in data`. */
38
+ export interface ScopeNotSeeded {
39
+ readonly changed: readonly ScopedNodeReport[];
40
+ readonly affected: readonly ScopedNodeReport[];
41
+ readonly seeds: number;
42
+ }
43
+ export type ScopeData = ScopeReport | ScopeNotSeeded;
44
+ export declare const scopeTool: ToolDefinition;
45
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/tools/scope.ts"],"names":[],"mappings":"AAAA;;;;0FAI0F;AAE1F,OAAO,EAA8C,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAOL,KAAK,SAAS,EAEd,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAIlB,iDAAiD;AACjD,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;CACzB;AAED,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B;iFAC6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;CAC5C;AAED;;mCAEmC;AACnC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;AA8OrD,eAAO,MAAM,SAAS,EAAE,cAavB,CAAC"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * `scope` — §12.5 diff scoping: what else does this change touch? Expansion stops
3
+ * on score, not hop count — a payment gateway 4 hops out matters, a logging import
4
+ * 1 hop out doesn't. A file the graph never heard of has two causes (not analysable,
5
+ * or stale graph) — both disclosed, never reported as "0 affected" (§20.2's collapse). */
6
+ import { nodesInFiles, scopeChange } from "@descryy/core";
7
+ import { answer, briefNode, optionalEnum, optionalInteger, optionalStringArray, ToolInputError, } from "./kit.js";
8
+ import { capBySize, capped, sizeCapNote } from "../capped.js";
9
+ const TRIGGERS = ["pre-push", "pr", "nightly"];
10
+ const SCHEMA = {
11
+ type: "object",
12
+ properties: {
13
+ files: {
14
+ type: "array",
15
+ items: { type: "string" },
16
+ description: "Repository-relative paths that are changing. Every symbol declared in them seeds the " +
17
+ "blast radius.",
18
+ },
19
+ nodeIds: {
20
+ type: "array",
21
+ items: { type: "string" },
22
+ description: "Graph node ids to seed with directly, instead of or as well as files.",
23
+ },
24
+ trigger: {
25
+ type: "string",
26
+ enum: [...TRIGGERS],
27
+ description: "Which node budget to use: pre-push 200, pr 1000, nightly 5000. Default pr.",
28
+ },
29
+ budget: {
30
+ type: "integer",
31
+ minimum: 1,
32
+ description: "Override the trigger's node budget.",
33
+ },
34
+ limit: {
35
+ type: "integer",
36
+ minimum: 1,
37
+ description: "Cap how many nodes come back in the reply — applied to the changed list and the affected " +
38
+ "list alike. Default 25 (MK-9 — the same walk-cost reduction impact.ts applies, for the " +
39
+ "same reason). Capping the changed list shortens only the listing: every changed symbol " +
40
+ "still seeds the traversal, and changedTotal reports how many there were. A capped reply " +
41
+ "always discloses shown/total; raise this explicitly when the full set is needed.",
42
+ },
43
+ },
44
+ additionalProperties: false,
45
+ };
46
+ /**
47
+ * `fitToBudget` for `ScopeReport` — a scaffold of scalars plus two lists,
48
+ * `changed` and `affected`, already cut once by `limit`. Neither row carries
49
+ * a droppable payload, so shrinking further means only dropping trailing
50
+ * rows from each, `changed` first: every seed still seeded the traversal
51
+ * either way, but it is the caller's own named files, the more load-bearing
52
+ * of the two lists to keep whole.
53
+ */
54
+ function fitScope(rest, shapedChanged, shapedAffected, totalRows, budgetBytes) {
55
+ const scaffoldBytes = Buffer.byteLength(JSON.stringify({ ...rest, changed: [], affected: [] }), "utf8");
56
+ const changedFit = capBySize(shapedChanged, budgetBytes, scaffoldBytes);
57
+ const spentOnChanged = Buffer.byteLength(JSON.stringify(changedFit.shown), "utf8");
58
+ const affectedFit = capBySize(shapedAffected, Math.max(budgetBytes - scaffoldBytes - spentOnChanged, 0), 0);
59
+ const notes = [];
60
+ if (changedFit.droppedForSize > 0) {
61
+ notes.push(sizeCapNote("changed symbol", changedFit.shown.length, shapedChanged.length, changedFit.droppedForSize));
62
+ }
63
+ if (affectedFit.droppedForSize > 0) {
64
+ notes.push(sizeCapNote("affected node", affectedFit.shown.length, shapedAffected.length, affectedFit.droppedForSize));
65
+ }
66
+ const droppedNow = changedFit.droppedForSize + affectedFit.droppedForSize;
67
+ return {
68
+ data: { ...rest, changed: changedFit.shown, affected: affectedFit.shown },
69
+ notes,
70
+ ...(droppedNow === 0
71
+ ? {}
72
+ : { truncatedDetail: { shown: changedFit.shown.length + affectedFit.shown.length, total: totalRows, more: null } }),
73
+ };
74
+ }
75
+ function shape(entry) {
76
+ return {
77
+ ...briefNode(entry.node),
78
+ score: Number(entry.score.toFixed(4)),
79
+ tier: entry.tier,
80
+ depth: entry.depth,
81
+ ...(entry.via === null ? {} : { via: entry.via.type }),
82
+ };
83
+ }
84
+ async function run(args, ctx) {
85
+ const files = optionalStringArray(args, "files") ?? [];
86
+ const seedIds = [...(optionalStringArray(args, "nodeIds") ?? [])];
87
+ const trigger = optionalEnum(args, "trigger", TRIGGERS) ?? "pr";
88
+ const budget = optionalInteger(args, "budget", 1);
89
+ const limit = optionalInteger(args, "limit", 1) ?? 25;
90
+ if (files.length === 0 && seedIds.length === 0) {
91
+ throw new ToolInputError('give at least one of "files" or "nodeIds"');
92
+ }
93
+ const notes = [];
94
+ const session = ctx.session;
95
+ if (files.length > 0) {
96
+ ctx.progress(`Resolving ${files.length} path(s) to graph nodes`);
97
+ const absolute = files.filter((f) => f.startsWith("/"));
98
+ if (absolute.length > 0) {
99
+ notes.push(`${absolute.length} path(s) were absolute. The graph stores repository-relative paths, so ` +
100
+ "these matched nothing. Pass paths relative to the repository root.");
101
+ }
102
+ const { nodes, missing } = nodesInFiles(session.store().driver, files);
103
+ for (const node of nodes)
104
+ seedIds.push(node.id);
105
+ if (missing.length > 0) {
106
+ notes.push(`${missing.length} of ${files.length} path(s) have no node in the graph ` +
107
+ `(${missing.slice(0, 5).join(", ")}${missing.length > 5 ? ", …" : ""}). Either no ` +
108
+ "configured adapter reads them or the graph predates them — run analyze. Their impact " +
109
+ "is not in this answer and they are not reported as having none.");
110
+ }
111
+ }
112
+ if (seedIds.length === 0) {
113
+ const base = session.provider().baseStamp();
114
+ return answer({
115
+ headline: "Nothing in the graph matches what you named, so no blast radius could be computed.",
116
+ state: "refused",
117
+ nameLevel: true,
118
+ resolutionFloor: 0,
119
+ commitSha: base.commitSha,
120
+ graphBuiltAt: base.graphBuiltAt,
121
+ irSchemaVersion: base.irSchemaVersion,
122
+ commitSpread: base.commitSpread,
123
+ repoCount: base.repoCount,
124
+ notes: [
125
+ ...notes,
126
+ "This is not a result of zero impact. No seed node was found, so the traversal never ran.",
127
+ ],
128
+ data: { changed: [], affected: [], seeds: 0 },
129
+ });
130
+ }
131
+ ctx.progress(`Expanding from ${seedIds.length} changed symbol(s)`);
132
+ const scoped = scopeChange(session.provider(), [...new Set(seedIds)], {
133
+ trigger,
134
+ ...(budget === undefined ? {} : { budget }),
135
+ });
136
+ const affected = scoped.data.affected;
137
+ // `capped()` produces the slice and its shown/total detail together, so this reply
138
+ // can't cap without carrying what it capped — previously hand-sliced with only the
139
+ // prose note updated, so `truncated`/`truncatedDetail` stayed unset on the wire.
140
+ const cap = capped(affected, limit);
141
+ if (cap.detail !== null) {
142
+ notes.push(`${cap.detail.total - cap.detail.shown} lower-scoring affected node(s) are in the scope but not ` +
143
+ `listed here — the reply is capped at ${limit}. Raise "limit" to see them; they were ` +
144
+ "analysed either way.");
145
+ }
146
+ // P6-B5. `limit` used to bound `affected` alone, and `changed` — one entry per
147
+ // symbol declared in the named files — went out whole. That is unbounded by
148
+ // anything the caller controls: it is the size of the files they named, not of
149
+ // the answer they asked for. One generated file produced 638 entries and 162k
150
+ // characters, past the client's token limit, and the invariant sweep in
151
+ // `truncation-invariant.test.ts` could not catch it because an uncapped list
152
+ // emits no capping prose to scan for. The seeds are still all *analysed* — the
153
+ // traversal runs over every one of them, and `changedTotal` reports how many
154
+ // there were, so a capped list can never read as a smaller change than it was.
155
+ const changedCap = capped(scoped.data.changed, limit);
156
+ if (changedCap.detail !== null) {
157
+ notes.push(`${changedCap.detail.total - changedCap.detail.shown} of ${changedCap.detail.total} changed ` +
158
+ `symbol(s) are not listed here — the reply is capped at ${limit}. All ${changedCap.detail.total} ` +
159
+ 'seeded the traversal; only the listing is shortened. Raise "limit" to see them.');
160
+ }
161
+ const byTier = [1, 2, 3, 4].map((tier) => ({
162
+ tier,
163
+ count: tier === 1
164
+ ? scoped.data.changed.length
165
+ : affected.filter((node) => node.tier === tier).length,
166
+ }));
167
+ // One `truncatedDetail` for a reply that now caps two lists: the rows carried
168
+ // versus the rows there were. Summing is the only reading of "the primary
169
+ // collection" that stays true when either list is cut — reporting `affected`'s
170
+ // pair alone would say nothing was withheld on a reply that withheld 290 seeds.
171
+ const shownRows = changedCap.shown.length + cap.shown.length;
172
+ const totalRows = scoped.data.changed.length + affected.length;
173
+ const truncatedDetail = changedCap.detail === null && cap.detail === null
174
+ ? null
175
+ : { shown: shownRows, total: totalRows, more: null };
176
+ const shapedChanged = changedCap.shown.map(shape);
177
+ const shapedAffected = cap.shown.map(shape);
178
+ const restOfData = {
179
+ changedTotal: scoped.data.changed.length,
180
+ affectedTotal: affected.length,
181
+ droppedForBudget: scoped.data.dropped.length,
182
+ budget: scoped.data.budget,
183
+ budgetUsed: scoped.data.budgetUsed,
184
+ byTier,
185
+ };
186
+ return {
187
+ result: {
188
+ ...scoped,
189
+ data: { ...restOfData, changed: shapedChanged, affected: shapedAffected },
190
+ // Deliberately not `scoped.truncated` (the node *budget*'s own drop flag,
191
+ // disclosed separately via `droppedForBudget`) — this `truncated` means "this
192
+ // reply is shorter than the scope computed," a different fact from that.
193
+ truncated: truncatedDetail !== null,
194
+ notes: [...scoped.notes, ...notes],
195
+ },
196
+ ...(truncatedDetail === null ? {} : { truncatedDetail }),
197
+ ...(affected.length === 0 ? { state: "empty" } : {}),
198
+ nameLevel: true,
199
+ headline: `${scoped.data.changed.length} changed symbol(s) reach ${affected.length} other node(s) ` +
200
+ `above the impact threshold, under the ${trigger} budget of ${scoped.data.budget}.`,
201
+ fitToBudget: (budgetBytes) => fitScope(restOfData, shapedChanged, shapedAffected, totalRows, budgetBytes),
202
+ };
203
+ }
204
+ export const scopeTool = {
205
+ name: "scope",
206
+ class: "read",
207
+ tier: "evidence",
208
+ version: "1.0.0",
209
+ title: "Blast radius of a change",
210
+ description: "Given the files or symbols you are changing, return what else is affected, ranked by impact " +
211
+ "score and grouped into tiers 1-4. Expansion stops on score rather than hop count, so a " +
212
+ "distant high-impact dependency is kept and a nearby trivial one is dropped. Names the paths " +
213
+ "it could not find in the graph rather than reporting them as unaffected.",
214
+ inputSchema: SCHEMA,
215
+ run,
216
+ };
217
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/tools/scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /** `similar_incidents` ranks existing `INCIDENT` nodes against a failure with no graph node yet,
2
+ * deterministically (file/token Jaccard, no vector store). DEC-274 found zero `INCIDENT` nodes
3
+ * across three repos (734/459/203 commits): recall is 0/0, not 0% — an empty result never means
4
+ * "no similar incident exists" (DEC-279). §1.3a: a zero-incident graph is `refused`, never `empty`
5
+ * — the same split `contracts` and `propagation` apply to their own zero-population case. */
6
+ import { type SimilarIncidentSignalKind } from "@descryy/core";
7
+ import { type BriefNode, type ToolDefinition } from "./kit.ts";
8
+ /** One signal that fired for a candidate — the "why", never a bare score. */
9
+ export interface SimilarIncidentSignalReport {
10
+ readonly kind: SimilarIncidentSignalKind;
11
+ /** Jaccard similarity for this signal alone, 0..1. */
12
+ readonly score: number;
13
+ }
14
+ export interface SimilarIncidentReport {
15
+ readonly incident: BriefNode;
16
+ /** The `FIX_PATTERN` this incident resolved to, when a `FIXED_BY` edge exists. */
17
+ readonly fix: BriefNode | null;
18
+ /** How this incident was detected (`attrs.detectedVia`) — reported per match since the
19
+ * mechanisms differ: revert, `Fixes #123`, a process dying at runtime, or `developer-confirmed`
20
+ * testimony (capped at reliability B, DEC-223). `null` for incidents minted before this field. */
21
+ readonly detectedVia: string | null;
22
+ readonly signals: readonly SimilarIncidentSignalReport[];
23
+ /** Weighted combination of every signal the query attempted, 0..1. */
24
+ readonly score: number;
25
+ }
26
+ /** One shape, both branches: `analysed: false` with `incidentsInGraph: 0` is the zero-denominator
27
+ * case, `state: "refused"`. Counts live in the payload, not just prose, so a caller can read the
28
+ * denominator without parsing a sentence. */
29
+ export interface SimilarIncidentsData {
30
+ readonly query: {
31
+ readonly touchedFiles: readonly string[];
32
+ readonly errorMessage: string | null;
33
+ };
34
+ readonly matches: readonly SimilarIncidentReport[];
35
+ /** Count before `limit` — honest about what was capped. */
36
+ readonly matchesTotal: number;
37
+ /** How many `INCIDENT` nodes were available to compare against. Zero is the headline fact. */
38
+ readonly incidentsInGraph: number;
39
+ /** False when the graph holds no `INCIDENT` node at all: nothing was compared. */
40
+ readonly analysed: boolean;
41
+ }
42
+ export declare const similarIncidentsTool: ToolDefinition;
43
+ //# sourceMappingURL=similar-incidents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similar-incidents.d.ts","sourceRoot":"","sources":["../../src/tools/similar-incidents.ts"],"names":[],"mappings":"AAAA;;;;8FAI8F;AAE9F,OAAO,EAAoB,KAAK,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAOL,KAAK,SAAS,EAEd,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AA2BlB,6EAA6E;AAC7E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B;;uGAEmG;IACnG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACzD,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;8CAE8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;QACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8FAA8F;IAC9F,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAwLD,eAAO,MAAM,oBAAoB,EAAE,cAYlC,CAAC"}