@descryy/mcp 0.11.3 → 0.11.5

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 (441) hide show
  1. package/package.json +20 -20
  2. package/dist/action-handshake.d.ts +0 -38
  3. package/dist/action-handshake.d.ts.map +0 -1
  4. package/dist/action-handshake.js +0 -127
  5. package/dist/action-handshake.js.map +0 -1
  6. package/dist/bin/descry-mcp.d.ts +0 -7
  7. package/dist/bin/descry-mcp.d.ts.map +0 -1
  8. package/dist/bin/descry-mcp.js +0 -72
  9. package/dist/bin/descry-mcp.js.map +0 -1
  10. package/dist/browser/auth.d.ts +0 -84
  11. package/dist/browser/auth.d.ts.map +0 -1
  12. package/dist/browser/auth.js +0 -233
  13. package/dist/browser/auth.js.map +0 -1
  14. package/dist/browser/capability-probe.d.ts +0 -109
  15. package/dist/browser/capability-probe.d.ts.map +0 -1
  16. package/dist/browser/capability-probe.js +0 -201
  17. package/dist/browser/capability-probe.js.map +0 -1
  18. package/dist/browser/driver.d.ts +0 -570
  19. package/dist/browser/driver.d.ts.map +0 -1
  20. package/dist/browser/driver.js +0 -116
  21. package/dist/browser/driver.js.map +0 -1
  22. package/dist/browser/evidence.d.ts +0 -28
  23. package/dist/browser/evidence.d.ts.map +0 -1
  24. package/dist/browser/evidence.js +0 -82
  25. package/dist/browser/evidence.js.map +0 -1
  26. package/dist/browser/fake-driver.d.ts +0 -116
  27. package/dist/browser/fake-driver.d.ts.map +0 -1
  28. package/dist/browser/fake-driver.js +0 -416
  29. package/dist/browser/fake-driver.js.map +0 -1
  30. package/dist/browser/fault-attribution.d.ts +0 -178
  31. package/dist/browser/fault-attribution.d.ts.map +0 -1
  32. package/dist/browser/fault-attribution.js +0 -266
  33. package/dist/browser/fault-attribution.js.map +0 -1
  34. package/dist/browser/graph-write.d.ts +0 -45
  35. package/dist/browser/graph-write.d.ts.map +0 -1
  36. package/dist/browser/graph-write.js +0 -103
  37. package/dist/browser/graph-write.js.map +0 -1
  38. package/dist/browser/identity-graph-write.d.ts +0 -55
  39. package/dist/browser/identity-graph-write.d.ts.map +0 -1
  40. package/dist/browser/identity-graph-write.js +0 -45
  41. package/dist/browser/identity-graph-write.js.map +0 -1
  42. package/dist/browser/page-probe.d.ts +0 -81
  43. package/dist/browser/page-probe.d.ts.map +0 -1
  44. package/dist/browser/page-probe.js +0 -202
  45. package/dist/browser/page-probe.js.map +0 -1
  46. package/dist/browser/playwright-driver.d.ts +0 -114
  47. package/dist/browser/playwright-driver.d.ts.map +0 -1
  48. package/dist/browser/playwright-driver.js +0 -1479
  49. package/dist/browser/playwright-driver.js.map +0 -1
  50. package/dist/browser/provider.d.ts +0 -26
  51. package/dist/browser/provider.d.ts.map +0 -1
  52. package/dist/browser/provider.js +0 -14
  53. package/dist/browser/provider.js.map +0 -1
  54. package/dist/browser/reach-recording-session.d.ts +0 -44
  55. package/dist/browser/reach-recording-session.d.ts.map +0 -1
  56. package/dist/browser/reach-recording-session.js +0 -143
  57. package/dist/browser/reach-recording-session.js.map +0 -1
  58. package/dist/browser/reachability.d.ts +0 -168
  59. package/dist/browser/reachability.d.ts.map +0 -1
  60. package/dist/browser/reachability.js +0 -294
  61. package/dist/browser/reachability.js.map +0 -1
  62. package/dist/browser/registry.d.ts +0 -126
  63. package/dist/browser/registry.d.ts.map +0 -1
  64. package/dist/browser/registry.js +0 -177
  65. package/dist/browser/registry.js.map +0 -1
  66. package/dist/browser/scenario-provenance.d.ts +0 -23
  67. package/dist/browser/scenario-provenance.d.ts.map +0 -1
  68. package/dist/browser/scenario-provenance.js +0 -73
  69. package/dist/browser/scenario-provenance.js.map +0 -1
  70. package/dist/browser/scenario-resolve.d.ts +0 -28
  71. package/dist/browser/scenario-resolve.d.ts.map +0 -1
  72. package/dist/browser/scenario-resolve.js +0 -96
  73. package/dist/browser/scenario-resolve.js.map +0 -1
  74. package/dist/browser/scenario-runner.d.ts +0 -72
  75. package/dist/browser/scenario-runner.d.ts.map +0 -1
  76. package/dist/browser/scenario-runner.js +0 -353
  77. package/dist/browser/scenario-runner.js.map +0 -1
  78. package/dist/browser/stack-parser.d.ts +0 -19
  79. package/dist/browser/stack-parser.d.ts.map +0 -1
  80. package/dist/browser/stack-parser.js +0 -85
  81. package/dist/browser/stack-parser.js.map +0 -1
  82. package/dist/browser/tool-support.d.ts +0 -71
  83. package/dist/browser/tool-support.d.ts.map +0 -1
  84. package/dist/browser/tool-support.js +0 -216
  85. package/dist/browser/tool-support.js.map +0 -1
  86. package/dist/browser/url-scheme.d.ts +0 -14
  87. package/dist/browser/url-scheme.d.ts.map +0 -1
  88. package/dist/browser/url-scheme.js +0 -38
  89. package/dist/browser/url-scheme.js.map +0 -1
  90. package/dist/browser/wait-target.d.ts +0 -37
  91. package/dist/browser/wait-target.d.ts.map +0 -1
  92. package/dist/browser/wait-target.js +0 -54
  93. package/dist/browser/wait-target.js.map +0 -1
  94. package/dist/cancellation.d.ts +0 -20
  95. package/dist/cancellation.d.ts.map +0 -1
  96. package/dist/cancellation.js +0 -41
  97. package/dist/cancellation.js.map +0 -1
  98. package/dist/capped.d.ts +0 -17
  99. package/dist/capped.d.ts.map +0 -1
  100. package/dist/capped.js +0 -15
  101. package/dist/capped.js.map +0 -1
  102. package/dist/credential-store.d.ts +0 -22
  103. package/dist/credential-store.d.ts.map +0 -1
  104. package/dist/credential-store.js +0 -33
  105. package/dist/credential-store.js.map +0 -1
  106. package/dist/disclosure-ledger.d.ts +0 -14
  107. package/dist/disclosure-ledger.d.ts.map +0 -1
  108. package/dist/disclosure-ledger.js +0 -18
  109. package/dist/disclosure-ledger.js.map +0 -1
  110. package/dist/evidence/observed-route-evidence.d.ts +0 -25
  111. package/dist/evidence/observed-route-evidence.d.ts.map +0 -1
  112. package/dist/evidence/observed-route-evidence.js +0 -76
  113. package/dist/evidence/observed-route-evidence.js.map +0 -1
  114. package/dist/heap.d.ts +0 -61
  115. package/dist/heap.d.ts.map +0 -1
  116. package/dist/heap.js +0 -82
  117. package/dist/heap.js.map +0 -1
  118. package/dist/heartbeat.d.ts +0 -46
  119. package/dist/heartbeat.d.ts.map +0 -1
  120. package/dist/heartbeat.js +0 -66
  121. package/dist/heartbeat.js.map +0 -1
  122. package/dist/index.d.ts +0 -32
  123. package/dist/index.d.ts.map +0 -1
  124. package/dist/index.js +0 -19
  125. package/dist/index.js.map +0 -1
  126. package/dist/module-trust.d.ts +0 -37
  127. package/dist/module-trust.d.ts.map +0 -1
  128. package/dist/module-trust.js +0 -77
  129. package/dist/module-trust.js.map +0 -1
  130. package/dist/path-confinement.d.ts +0 -31
  131. package/dist/path-confinement.d.ts.map +0 -1
  132. package/dist/path-confinement.js +0 -44
  133. package/dist/path-confinement.js.map +0 -1
  134. package/dist/planner/predict-then-propose.d.ts +0 -134
  135. package/dist/planner/predict-then-propose.d.ts.map +0 -1
  136. package/dist/planner/predict-then-propose.js +0 -138
  137. package/dist/planner/predict-then-propose.js.map +0 -1
  138. package/dist/planner/propose-journey.d.ts +0 -75
  139. package/dist/planner/propose-journey.d.ts.map +0 -1
  140. package/dist/planner/propose-journey.js +0 -96
  141. package/dist/planner/propose-journey.js.map +0 -1
  142. package/dist/protocol.d.ts +0 -57
  143. package/dist/protocol.d.ts.map +0 -1
  144. package/dist/protocol.js +0 -90
  145. package/dist/protocol.js.map +0 -1
  146. package/dist/registry.d.ts +0 -103
  147. package/dist/registry.d.ts.map +0 -1
  148. package/dist/registry.js +0 -319
  149. package/dist/registry.js.map +0 -1
  150. package/dist/render.d.ts +0 -580
  151. package/dist/render.d.ts.map +0 -1
  152. package/dist/render.js +0 -867
  153. package/dist/render.js.map +0 -1
  154. package/dist/runtime-registry.d.ts +0 -22
  155. package/dist/runtime-registry.d.ts.map +0 -1
  156. package/dist/runtime-registry.js +0 -142
  157. package/dist/runtime-registry.js.map +0 -1
  158. package/dist/sandbox-defaults.d.ts +0 -41
  159. package/dist/sandbox-defaults.d.ts.map +0 -1
  160. package/dist/sandbox-defaults.js +0 -14
  161. package/dist/sandbox-defaults.js.map +0 -1
  162. package/dist/scenarios/browser-run-plan-projection.d.ts +0 -161
  163. package/dist/scenarios/browser-run-plan-projection.d.ts.map +0 -1
  164. package/dist/scenarios/browser-run-plan-projection.js +0 -264
  165. package/dist/scenarios/browser-run-plan-projection.js.map +0 -1
  166. package/dist/scenarios/credential-ref.d.ts +0 -102
  167. package/dist/scenarios/credential-ref.d.ts.map +0 -1
  168. package/dist/scenarios/credential-ref.js +0 -148
  169. package/dist/scenarios/credential-ref.js.map +0 -1
  170. package/dist/scenarios/index.d.ts +0 -7
  171. package/dist/scenarios/index.d.ts.map +0 -1
  172. package/dist/scenarios/index.js +0 -7
  173. package/dist/scenarios/index.js.map +0 -1
  174. package/dist/scenarios/parse.d.ts +0 -18
  175. package/dist/scenarios/parse.d.ts.map +0 -1
  176. package/dist/scenarios/parse.js +0 -212
  177. package/dist/scenarios/parse.js.map +0 -1
  178. package/dist/scenarios/scenario.d.ts +0 -93
  179. package/dist/scenarios/scenario.d.ts.map +0 -1
  180. package/dist/scenarios/scenario.js +0 -27
  181. package/dist/scenarios/scenario.js.map +0 -1
  182. package/dist/scenarios/secret-ref.d.ts +0 -86
  183. package/dist/scenarios/secret-ref.d.ts.map +0 -1
  184. package/dist/scenarios/secret-ref.js +0 -125
  185. package/dist/scenarios/secret-ref.js.map +0 -1
  186. package/dist/scenarios/storage.d.ts +0 -21
  187. package/dist/scenarios/storage.d.ts.map +0 -1
  188. package/dist/scenarios/storage.js +0 -103
  189. package/dist/scenarios/storage.js.map +0 -1
  190. package/dist/server.d.ts +0 -61
  191. package/dist/server.d.ts.map +0 -1
  192. package/dist/server.js +0 -541
  193. package/dist/server.js.map +0 -1
  194. package/dist/session.d.ts +0 -243
  195. package/dist/session.d.ts.map +0 -1
  196. package/dist/session.js +0 -602
  197. package/dist/session.js.map +0 -1
  198. package/dist/tools/alias-kit.d.ts +0 -29
  199. package/dist/tools/alias-kit.d.ts.map +0 -1
  200. package/dist/tools/alias-kit.js +0 -21
  201. package/dist/tools/alias-kit.js.map +0 -1
  202. package/dist/tools/aliases.d.ts +0 -42
  203. package/dist/tools/aliases.d.ts.map +0 -1
  204. package/dist/tools/aliases.js +0 -52
  205. package/dist/tools/aliases.js.map +0 -1
  206. package/dist/tools/analyze-workspace.d.ts +0 -52
  207. package/dist/tools/analyze-workspace.d.ts.map +0 -1
  208. package/dist/tools/analyze-workspace.js +0 -207
  209. package/dist/tools/analyze-workspace.js.map +0 -1
  210. package/dist/tools/analyze.d.ts +0 -163
  211. package/dist/tools/analyze.d.ts.map +0 -1
  212. package/dist/tools/analyze.js +0 -724
  213. package/dist/tools/analyze.js.map +0 -1
  214. package/dist/tools/browser-click.d.ts +0 -18
  215. package/dist/tools/browser-click.d.ts.map +0 -1
  216. package/dist/tools/browser-click.js +0 -110
  217. package/dist/tools/browser-click.js.map +0 -1
  218. package/dist/tools/browser-close-session.d.ts +0 -39
  219. package/dist/tools/browser-close-session.d.ts.map +0 -1
  220. package/dist/tools/browser-close-session.js +0 -120
  221. package/dist/tools/browser-close-session.js.map +0 -1
  222. package/dist/tools/browser-fill.d.ts +0 -18
  223. package/dist/tools/browser-fill.d.ts.map +0 -1
  224. package/dist/tools/browser-fill.js +0 -117
  225. package/dist/tools/browser-fill.js.map +0 -1
  226. package/dist/tools/browser-navigate.d.ts +0 -15
  227. package/dist/tools/browser-navigate.d.ts.map +0 -1
  228. package/dist/tools/browser-navigate.js +0 -104
  229. package/dist/tools/browser-navigate.js.map +0 -1
  230. package/dist/tools/browser-read.d.ts +0 -33
  231. package/dist/tools/browser-read.d.ts.map +0 -1
  232. package/dist/tools/browser-read.js +0 -113
  233. package/dist/tools/browser-read.js.map +0 -1
  234. package/dist/tools/browser-run-scenario.d.ts +0 -28
  235. package/dist/tools/browser-run-scenario.d.ts.map +0 -1
  236. package/dist/tools/browser-run-scenario.js +0 -206
  237. package/dist/tools/browser-run-scenario.js.map +0 -1
  238. package/dist/tools/browser-save-scenario.d.ts +0 -19
  239. package/dist/tools/browser-save-scenario.d.ts.map +0 -1
  240. package/dist/tools/browser-save-scenario.js +0 -447
  241. package/dist/tools/browser-save-scenario.js.map +0 -1
  242. package/dist/tools/browser-select.d.ts +0 -20
  243. package/dist/tools/browser-select.d.ts.map +0 -1
  244. package/dist/tools/browser-select.js +0 -120
  245. package/dist/tools/browser-select.js.map +0 -1
  246. package/dist/tools/browser-snapshot.d.ts +0 -46
  247. package/dist/tools/browser-snapshot.d.ts.map +0 -1
  248. package/dist/tools/browser-snapshot.js +0 -127
  249. package/dist/tools/browser-snapshot.js.map +0 -1
  250. package/dist/tools/browser-start-session.d.ts +0 -24
  251. package/dist/tools/browser-start-session.d.ts.map +0 -1
  252. package/dist/tools/browser-start-session.js +0 -622
  253. package/dist/tools/browser-start-session.js.map +0 -1
  254. package/dist/tools/browser-submit.d.ts +0 -18
  255. package/dist/tools/browser-submit.d.ts.map +0 -1
  256. package/dist/tools/browser-submit.js +0 -106
  257. package/dist/tools/browser-submit.js.map +0 -1
  258. package/dist/tools/browser-type.d.ts +0 -18
  259. package/dist/tools/browser-type.d.ts.map +0 -1
  260. package/dist/tools/browser-type.js +0 -115
  261. package/dist/tools/browser-type.js.map +0 -1
  262. package/dist/tools/browser-wait-for.d.ts +0 -45
  263. package/dist/tools/browser-wait-for.d.ts.map +0 -1
  264. package/dist/tools/browser-wait-for.js +0 -150
  265. package/dist/tools/browser-wait-for.js.map +0 -1
  266. package/dist/tools/browser.d.ts +0 -69
  267. package/dist/tools/browser.d.ts.map +0 -1
  268. package/dist/tools/browser.js +0 -386
  269. package/dist/tools/browser.js.map +0 -1
  270. package/dist/tools/chain.d.ts +0 -41
  271. package/dist/tools/chain.d.ts.map +0 -1
  272. package/dist/tools/chain.js +0 -105
  273. package/dist/tools/chain.js.map +0 -1
  274. package/dist/tools/change-scope.d.ts +0 -25
  275. package/dist/tools/change-scope.d.ts.map +0 -1
  276. package/dist/tools/change-scope.js +0 -110
  277. package/dist/tools/change-scope.js.map +0 -1
  278. package/dist/tools/code-context.d.ts +0 -83
  279. package/dist/tools/code-context.d.ts.map +0 -1
  280. package/dist/tools/code-context.js +0 -416
  281. package/dist/tools/code-context.js.map +0 -1
  282. package/dist/tools/contracts.d.ts +0 -74
  283. package/dist/tools/contracts.d.ts.map +0 -1
  284. package/dist/tools/contracts.js +0 -196
  285. package/dist/tools/contracts.js.map +0 -1
  286. package/dist/tools/cross-pr.d.ts +0 -178
  287. package/dist/tools/cross-pr.d.ts.map +0 -1
  288. package/dist/tools/cross-pr.js +0 -321
  289. package/dist/tools/cross-pr.js.map +0 -1
  290. package/dist/tools/disclosure.d.ts +0 -75
  291. package/dist/tools/disclosure.d.ts.map +0 -1
  292. package/dist/tools/disclosure.js +0 -288
  293. package/dist/tools/disclosure.js.map +0 -1
  294. package/dist/tools/draw-conclusion.d.ts +0 -55
  295. package/dist/tools/draw-conclusion.d.ts.map +0 -1
  296. package/dist/tools/draw-conclusion.js +0 -259
  297. package/dist/tools/draw-conclusion.js.map +0 -1
  298. package/dist/tools/git-context.d.ts +0 -39
  299. package/dist/tools/git-context.d.ts.map +0 -1
  300. package/dist/tools/git-context.js +0 -364
  301. package/dist/tools/git-context.js.map +0 -1
  302. package/dist/tools/git-diff.d.ts +0 -45
  303. package/dist/tools/git-diff.d.ts.map +0 -1
  304. package/dist/tools/git-diff.js +0 -338
  305. package/dist/tools/git-diff.js.map +0 -1
  306. package/dist/tools/git-history.d.ts +0 -16
  307. package/dist/tools/git-history.d.ts.map +0 -1
  308. package/dist/tools/git-history.js +0 -86
  309. package/dist/tools/git-history.js.map +0 -1
  310. package/dist/tools/history.d.ts +0 -34
  311. package/dist/tools/history.d.ts.map +0 -1
  312. package/dist/tools/history.js +0 -121
  313. package/dist/tools/history.js.map +0 -1
  314. package/dist/tools/impact.d.ts +0 -46
  315. package/dist/tools/impact.d.ts.map +0 -1
  316. package/dist/tools/impact.js +0 -225
  317. package/dist/tools/impact.js.map +0 -1
  318. package/dist/tools/index.d.ts +0 -59
  319. package/dist/tools/index.d.ts.map +0 -1
  320. package/dist/tools/index.js +0 -70
  321. package/dist/tools/index.js.map +0 -1
  322. package/dist/tools/kit.d.ts +0 -165
  323. package/dist/tools/kit.d.ts.map +0 -1
  324. package/dist/tools/kit.js +0 -153
  325. package/dist/tools/kit.js.map +0 -1
  326. package/dist/tools/link-workspace.d.ts +0 -24
  327. package/dist/tools/link-workspace.d.ts.map +0 -1
  328. package/dist/tools/link-workspace.js +0 -131
  329. package/dist/tools/link-workspace.js.map +0 -1
  330. package/dist/tools/lookup.d.ts +0 -19
  331. package/dist/tools/lookup.d.ts.map +0 -1
  332. package/dist/tools/lookup.js +0 -63
  333. package/dist/tools/lookup.js.map +0 -1
  334. package/dist/tools/mark-incident.d.ts +0 -28
  335. package/dist/tools/mark-incident.d.ts.map +0 -1
  336. package/dist/tools/mark-incident.js +0 -188
  337. package/dist/tools/mark-incident.js.map +0 -1
  338. package/dist/tools/merged-browser.d.ts +0 -11
  339. package/dist/tools/merged-browser.d.ts.map +0 -1
  340. package/dist/tools/merged-browser.js +0 -20
  341. package/dist/tools/merged-browser.js.map +0 -1
  342. package/dist/tools/merged-context.d.ts +0 -11
  343. package/dist/tools/merged-context.d.ts.map +0 -1
  344. package/dist/tools/merged-context.js +0 -21
  345. package/dist/tools/merged-context.js.map +0 -1
  346. package/dist/tools/merged-observe.d.ts +0 -13
  347. package/dist/tools/merged-observe.d.ts.map +0 -1
  348. package/dist/tools/merged-observe.js +0 -21
  349. package/dist/tools/merged-observe.js.map +0 -1
  350. package/dist/tools/merged-workspace.d.ts +0 -14
  351. package/dist/tools/merged-workspace.d.ts.map +0 -1
  352. package/dist/tools/merged-workspace.js +0 -21
  353. package/dist/tools/merged-workspace.js.map +0 -1
  354. package/dist/tools/observe-runtime.d.ts +0 -250
  355. package/dist/tools/observe-runtime.d.ts.map +0 -1
  356. package/dist/tools/observe-runtime.js +0 -1753
  357. package/dist/tools/observe-runtime.js.map +0 -1
  358. package/dist/tools/observe-tests.d.ts +0 -57
  359. package/dist/tools/observe-tests.d.ts.map +0 -1
  360. package/dist/tools/observe-tests.js +0 -368
  361. package/dist/tools/observe-tests.js.map +0 -1
  362. package/dist/tools/observe.d.ts +0 -28
  363. package/dist/tools/observe.d.ts.map +0 -1
  364. package/dist/tools/observe.js +0 -330
  365. package/dist/tools/observe.js.map +0 -1
  366. package/dist/tools/pr-analysis.d.ts +0 -189
  367. package/dist/tools/pr-analysis.d.ts.map +0 -1
  368. package/dist/tools/pr-analysis.js +0 -299
  369. package/dist/tools/pr-analysis.js.map +0 -1
  370. package/dist/tools/pre-push.d.ts +0 -168
  371. package/dist/tools/pre-push.d.ts.map +0 -1
  372. package/dist/tools/pre-push.js +0 -416
  373. package/dist/tools/pre-push.js.map +0 -1
  374. package/dist/tools/predict-reach.d.ts +0 -57
  375. package/dist/tools/predict-reach.d.ts.map +0 -1
  376. package/dist/tools/predict-reach.js +0 -159
  377. package/dist/tools/predict-reach.js.map +0 -1
  378. package/dist/tools/propagation.d.ts +0 -37
  379. package/dist/tools/propagation.d.ts.map +0 -1
  380. package/dist/tools/propagation.js +0 -162
  381. package/dist/tools/propagation.js.map +0 -1
  382. package/dist/tools/propose-journey.d.ts +0 -16
  383. package/dist/tools/propose-journey.d.ts.map +0 -1
  384. package/dist/tools/propose-journey.js +0 -121
  385. package/dist/tools/propose-journey.js.map +0 -1
  386. package/dist/tools/prove-reach.d.ts +0 -74
  387. package/dist/tools/prove-reach.d.ts.map +0 -1
  388. package/dist/tools/prove-reach.js +0 -286
  389. package/dist/tools/prove-reach.js.map +0 -1
  390. package/dist/tools/questions.d.ts +0 -30
  391. package/dist/tools/questions.d.ts.map +0 -1
  392. package/dist/tools/questions.js +0 -232
  393. package/dist/tools/questions.js.map +0 -1
  394. package/dist/tools/refusal-fetch.d.ts +0 -35
  395. package/dist/tools/refusal-fetch.d.ts.map +0 -1
  396. package/dist/tools/refusal-fetch.js +0 -103
  397. package/dist/tools/refusal-fetch.js.map +0 -1
  398. package/dist/tools/runtime-incident.d.ts +0 -33
  399. package/dist/tools/runtime-incident.d.ts.map +0 -1
  400. package/dist/tools/runtime-incident.js +0 -67
  401. package/dist/tools/runtime-incident.js.map +0 -1
  402. package/dist/tools/runtime-journey-drive.d.ts +0 -102
  403. package/dist/tools/runtime-journey-drive.d.ts.map +0 -1
  404. package/dist/tools/runtime-journey-drive.js +0 -247
  405. package/dist/tools/runtime-journey-drive.js.map +0 -1
  406. package/dist/tools/scope.d.ts +0 -45
  407. package/dist/tools/scope.d.ts.map +0 -1
  408. package/dist/tools/scope.js +0 -186
  409. package/dist/tools/scope.js.map +0 -1
  410. package/dist/tools/similar-incidents.d.ts +0 -43
  411. package/dist/tools/similar-incidents.d.ts.map +0 -1
  412. package/dist/tools/similar-incidents.js +0 -179
  413. package/dist/tools/similar-incidents.js.map +0 -1
  414. package/dist/tools/validate.d.ts +0 -133
  415. package/dist/tools/validate.d.ts.map +0 -1
  416. package/dist/tools/validate.js +0 -442
  417. package/dist/tools/validate.js.map +0 -1
  418. package/dist/tools/verb.d.ts +0 -46
  419. package/dist/tools/verb.d.ts.map +0 -1
  420. package/dist/tools/verb.js +0 -78
  421. package/dist/tools/verb.js.map +0 -1
  422. package/dist/tools/verification-status.d.ts +0 -38
  423. package/dist/tools/verification-status.d.ts.map +0 -1
  424. package/dist/tools/verification-status.js +0 -203
  425. package/dist/tools/verification-status.js.map +0 -1
  426. package/dist/tools/verify-claim.d.ts +0 -29
  427. package/dist/tools/verify-claim.d.ts.map +0 -1
  428. package/dist/tools/verify-claim.js +0 -220
  429. package/dist/tools/verify-claim.js.map +0 -1
  430. package/dist/tools/workspace.d.ts +0 -28
  431. package/dist/tools/workspace.d.ts.map +0 -1
  432. package/dist/tools/workspace.js +0 -101
  433. package/dist/tools/workspace.js.map +0 -1
  434. package/dist/transport.d.ts +0 -32
  435. package/dist/transport.d.ts.map +0 -1
  436. package/dist/transport.js +0 -85
  437. package/dist/transport.js.map +0 -1
  438. package/dist/workspace-index.d.ts +0 -164
  439. package/dist/workspace-index.d.ts.map +0 -1
  440. package/dist/workspace-index.js +0 -381
  441. package/dist/workspace-index.js.map +0 -1
@@ -1,294 +0,0 @@
1
- /**
2
- * What a browser session actually reached, and what it did not. §4.1.
3
- *
4
- * ## The claim this module exists to make possible
5
- *
6
- * *"I reached 40% of your application, and here is the 60% I could not."*
7
- *
8
- * Everything else here serves that sentence. The browser path already reports
9
- * what it saw; what it has never reported is what it **missed**, and a testing
10
- * agent that cannot say that is not merely incomplete — it is misleading,
11
- * because "no failures found" and "nothing was driven" render identically.
12
- * `fixtures/hostile-apps/` app 11 reproduces exactly that: a CAPTCHA screen
13
- * reports two interactive elements and no failures, which is true and useless.
14
- *
15
- * ## Coverage is not one of the five report categories
16
- *
17
- * Rule 6 is explicit: untested scope is a **separate axis**, reported as
18
- * verification status, not folded into confirmed/strongly-supported/
19
- * unconfirmed/not-analysable/unsupported. This module is on that separate axis.
20
- * So every rendering of it says, in words, that it is not a verdict — and the
21
- * tests assert that it still says so at 100% reach, which is the one case where
22
- * a reader is most likely to hear "all clear".
23
- *
24
- * ## Why counting is per screen and not per snapshot
25
- *
26
- * Two snapshots of one screen are not twice the coverage, and a reply that was
27
- * trimmed to fit a budget is not a screen that shrank. So screens are keyed by
28
- * URL and the largest observation of each wins. The alternative — summing
29
- * snapshots — would let an agent inflate its own coverage by asking twice.
30
- *
31
- * Rule 1: nothing here names a language or a framework.
32
- */
33
- import { evidenceInWindow, refineAttribution, assertEveryFailureAttributed, } from "./fault-attribution.js";
34
- /** Roles the port has a verb for. Anything else is enumerated and undrivable —
35
- * §1.3, and a fact about the port rather than about the page.
36
- *
37
- * `combobox` is here because the port grew `select`. It has to be added in the
38
- * same change as the verb or the gap stays reported after it is closed, which
39
- * is worse than either state on its own: a caller reading "no verb for this
40
- * role" would go and build the verb that already exists. The hostile corpus's
41
- * harness carries the same list and moves with this one. */
42
- const ROLES_WITH_A_VERB = new Set(["button", "link", "textbox", "searchbox", "combobox"]);
43
- /**
44
- * The risk kinds that mean **a region with controls in it was not entered at
45
- * all** — as opposed to reached with something lost on the way.
46
- *
47
- * The line is drawn by what a caller would do about it, not by severity. A
48
- * shadow root is reached and unsaveable; a same-origin frame is entered and
49
- * enumerated (`fixtures/hostile-apps/` app 05 measured both of its targets
50
- * driven); a tall document is unvisited until someone asks for a reveal pass.
51
- * None of those is a region nobody got into, so none of them is a gate.
52
- *
53
- * What is: a challenge and a sign-in, which put the whole application on the
54
- * far side; a cross-origin frame, which this session's consent does not cover;
55
- * an overlay or an inert subtree, under which every control is enumerable,
56
- * counted and impossible to operate; a canvas, whose controls have no elements
57
- * to enumerate at all; and a windowed region, which no single snapshot can ever
58
- * hold all of.
59
- *
60
- * Promoting them here rather than at each call site is deliberate: a disclosure
61
- * that depends on a caller remembering to file it is a disclosure that goes
62
- * missing on the path nobody tested.
63
- */
64
- const GATING_RISKS = new Set([
65
- "challenge",
66
- "authWall",
67
- "crossOriginFrame",
68
- "overlay",
69
- "inertSubtree",
70
- "canvasRendered",
71
- "virtualizedRegion",
72
- ]);
73
- export function createReachabilityTracker() {
74
- const screens = new Map();
75
- const actions = [];
76
- const gates = [];
77
- const skipped = [];
78
- let estimate = null;
79
- return {
80
- recordScreen(snapshot) {
81
- let actionable = 0;
82
- let savable = 0;
83
- let noVerb = 0;
84
- for (const el of snapshot.elements) {
85
- if (ROLES_WITH_A_VERB.has(el.role.trim().toLowerCase()))
86
- actionable += 1;
87
- else
88
- noVerb += 1;
89
- if (el.selector !== null)
90
- savable += 1;
91
- }
92
- // `totalElements`, never `elements.length`: a budget-trimmed reply is a
93
- // shorter list, not a smaller page, and coverage measured off the list
94
- // would improve every time a reply got tighter.
95
- const unlisted = Math.max(0, snapshot.totalElements - snapshot.elements.length);
96
- const next = {
97
- seen: snapshot.totalElements,
98
- actionable,
99
- savable,
100
- // Elements that did not fit in the reply were never classified. They
101
- // are counted as seen and as having no known verb, because claiming
102
- // them as actionable would be claiming something nothing looked at.
103
- noVerb: noVerb + unlisted,
104
- };
105
- const existing = screens.get(snapshot.url);
106
- if (existing === undefined || next.seen > existing.seen)
107
- screens.set(snapshot.url, next);
108
- },
109
- recordEstimate(next) {
110
- estimate = next;
111
- },
112
- recordAction(action) {
113
- actions.push(action);
114
- },
115
- recordGate(gate) {
116
- if (gate.reason.trim() === "") {
117
- throw new Error("A gated region must carry a reason. A region recorded as unreachable with no reason is the silence " +
118
- "reachability reporting exists to remove.");
119
- }
120
- gates.push(gate);
121
- },
122
- recordSkip(item) {
123
- skipped.push(item);
124
- },
125
- refineFailures(drained, applicationOrigin) {
126
- for (let index = 0; index < actions.length; index += 1) {
127
- const action = actions[index];
128
- if (action.succeeded)
129
- continue;
130
- // Only `undetermined` is open to revision — see `refineAttribution`.
131
- // Checked here as well as there so a failure that already has a domain
132
- // costs nothing to walk past on every later drain.
133
- if (action.attribution.owner !== "undetermined")
134
- continue;
135
- if (action.failure === undefined || action.window === undefined)
136
- continue;
137
- const later = evidenceInWindow(drained, action.window, applicationOrigin);
138
- if (later.pageErrors === 0 && later.failedRequests === 0)
139
- continue;
140
- actions[index] = { ...action, attribution: refineAttribution(action.attribution, action.failure, later) };
141
- }
142
- },
143
- report() {
144
- const perScreen = [...screens.entries()].map(([url, acc]) => ({
145
- url,
146
- elementsSeen: acc.seen,
147
- elementsActionable: acc.actionable,
148
- elementsSavable: acc.savable,
149
- }));
150
- const elementsSeen = perScreen.reduce((sum, s) => sum + s.elementsSeen, 0);
151
- const elementsActionable = perScreen.reduce((sum, s) => sum + s.elementsActionable, 0);
152
- const elementsSavable = perScreen.reduce((sum, s) => sum + s.elementsSavable, 0);
153
- const noVerb = [...screens.values()].reduce((sum, s) => sum + s.noVerb, 0);
154
- const blocked = noVerb === 0
155
- ? []
156
- : [
157
- {
158
- reason: "noVerbForRole",
159
- count: noVerb,
160
- detail: "Enumerated on the page, but Descry has no verb for their role, so they were listed and never " +
161
- "operated. This is a gap in Descry's browser port, not something wrong with the page.",
162
- },
163
- ];
164
- // A risk named before the run that nothing later contradicted is still a
165
- // region nobody reached. Promoting it to a gate here means the disclosure
166
- // does not depend on some caller remembering to file it.
167
- const gatedFromEstimate = estimate === null
168
- ? []
169
- : estimate.risks
170
- .filter((risk) => GATING_RISKS.has(risk.kind))
171
- .map((risk) => ({ region: risk.detail, reason: risk.effect, kind: risk.kind }));
172
- const gated = [...gatedFromEstimate, ...gates];
173
- // RG-12(c): every failed action in `actions` is, by the type above,
174
- // already carrying a real attribution — nothing to filter, nothing
175
- // that can silently fall out of the report unseen. Asserted, not just
176
- // typed: a cast or a future widening of the type could still produce
177
- // one from outside this module, and this is the belt for that.
178
- assertEveryFailureAttributed(actions);
179
- const failures = actions
180
- .filter((a) => !a.succeeded)
181
- .map((a) => ({ verb: a.verb, ref: a.ref, attribution: a.attribution }));
182
- const wall = wallFor(estimate, perScreen.length);
183
- return {
184
- screens: perScreen,
185
- elementsSeen,
186
- elementsActionable,
187
- elementsSavable,
188
- blocked,
189
- actionsAttempted: actions.length,
190
- actionsSucceeded: actions.filter((a) => a.succeeded).length,
191
- failures,
192
- gated,
193
- skipped,
194
- estimate,
195
- wall,
196
- statement: statementFor(wall, perScreen.length, elementsSeen, elementsActionable, gated.length, skipped.length),
197
- };
198
- },
199
- };
200
- }
201
- /**
202
- * Is the session behind a wall, and which one?
203
- *
204
- * A challenge is unconditional. Descry does not pass one, so however many
205
- * screens a session went on to see, it did not legitimately get past that.
206
- *
207
- * A sign-in is conditional on the session having stayed on one screen. The
208
- * evidence for the wall is a password field on the probed screen, and a session
209
- * that went on to read a second screen demonstrably moved — claiming it never
210
- * got in would be a false statement made from a true observation, which is the
211
- * precise failure rule 2 exists to prevent. It keeps its gated region either
212
- * way.
213
- *
214
- * An overlay is deliberately **not** a wall. The application underneath one is
215
- * present and enumerated, and one dismissal reaches it; "this session did not
216
- * reach the application" would overstate what a fixed banner proves. The gated
217
- * region carries it instead.
218
- */
219
- function wallFor(estimate, screens) {
220
- if (estimate === null)
221
- return null;
222
- const challenge = estimate.risks.find((risk) => risk.kind === "challenge");
223
- if (challenge !== undefined) {
224
- return {
225
- kind: "challenge",
226
- detail: challenge.detail,
227
- reason: "Descry does not attempt to pass a human-verification challenge, by design. Everything behind it is not " +
228
- "analysable, which is a different statement from finding nothing wrong with it.",
229
- };
230
- }
231
- const auth = estimate.risks.find((risk) => risk.kind === "authWall");
232
- if (auth !== undefined && screens <= 1) {
233
- return {
234
- kind: "authWall",
235
- detail: auth.detail,
236
- reason: "The only screen this session saw is the logged-out surface. Nothing behind the sign-in was seen, so " +
237
- "nothing behind it was tested. Seed an authenticated session — browser_start_session takes a " +
238
- "storageState or a storageStatePath — to drive the application itself.",
239
- };
240
- }
241
- return null;
242
- }
243
- /** The wall's own sentence. Written out per kind rather than assembled, because
244
- * this is the one sentence in the reply that must not read as boilerplate. */
245
- function wallStatement(wall, seen, screenNoun) {
246
- const counted = seen === 0
247
- ? ""
248
- : ` The ${seen} interactive element${seen === 1 ? "" : "s"} counted below are the ${screenNoun}'s own, not the application's.`;
249
- return `This session did not reach the application: ${wall.reason}${counted}`;
250
- }
251
- function statementFor(wall, screens, seen, actionable, gates, skips) {
252
- if (wall !== null) {
253
- return wallStatement(wall, seen, wall.kind === "challenge" ? "challenge screen" : "sign-in screen");
254
- }
255
- if (screens === 0) {
256
- return ("This session read no screen, so it reached none of the application. That is a statement about coverage " +
257
- "and not about the application.");
258
- }
259
- const plural = (n, word) => `${n} ${word}${n === 1 ? "" : "s"}`;
260
- const tail = [];
261
- if (gates > 0)
262
- tail.push(`${plural(gates, "region")} could not be entered at all`);
263
- if (skips > 0)
264
- tail.push(`${plural(skips, "thing")} was deliberately skipped`);
265
- const suffix = tail.length === 0 ? "" : `, and ${tail.join(", ")}`;
266
- return `Reached ${actionable} of ${seen} interactive elements across ${plural(screens, "screen")}${suffix}.`;
267
- }
268
- /** The disclosure lines. Every one of them is on the coverage axis, and the
269
- * last one says so explicitly at every level of reach — including total. */
270
- export function reachabilityNotes(report) {
271
- const notes = [report.statement];
272
- for (const blocked of report.blocked) {
273
- notes.push(`${blocked.count} element${blocked.count === 1 ? " was" : "s were"} seen but not usable. ${blocked.detail}`);
274
- }
275
- const unsavable = report.elementsSeen - report.elementsSavable;
276
- if (unsavable > 0) {
277
- notes.push(`${unsavable} of the ${report.elementsSeen} elements seen have no stable selector. They can be driven in this ` +
278
- "session and can never be saved to a scenario, so a flow through them cannot be replayed.");
279
- }
280
- for (const gate of report.gated) {
281
- notes.push(`Not reached — ${gate.region}: ${gate.reason}`);
282
- }
283
- for (const skip of report.skipped) {
284
- notes.push(`Skipped — ${skip.what}: ${skip.why}`);
285
- }
286
- for (const failure of report.failures) {
287
- notes.push(`A ${failure.verb} failed${failure.ref === null ? "" : ` on ${failure.ref}`}. Fault: ${failure.attribution.owner}. ` +
288
- `${failure.attribution.reason} ${failure.attribution.evidence}`);
289
- }
290
- notes.push("Reachability is coverage, not a verdict — it is a separate axis from the five report categories. Nothing here " +
291
- "says the parts that were reached are correct, and nothing here says the parts that were not are broken.");
292
- return notes;
293
- }
294
- //# sourceMappingURL=reachability.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reachability.js","sourceRoot":"","sources":["../../src/browser/reachability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,4BAA4B,GAI7B,MAAM,wBAAwB,CAAC;AAGhC;;;;;;;6DAO6D;AAC7D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAE1F;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,YAAY,GAA+B,IAAI,GAAG,CAAgB;IACtE,WAAW;IACX,UAAU;IACV,kBAAkB;IAClB,SAAS;IACT,cAAc;IACd,gBAAgB;IAChB,mBAAmB;CACpB,CAAC,CAAC;AAkJH,MAAM,UAAU,yBAAyB;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAE1C,OAAO;QACL,YAAY,CAAC,QAAQ;YACnB,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACnC,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBAAE,UAAU,IAAI,CAAC,CAAC;;oBACpE,MAAM,IAAI,CAAC,CAAC;gBACjB,IAAI,EAAE,CAAC,QAAQ,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC,CAAC;YACzC,CAAC;YACD,wEAAwE;YACxE,uEAAuE;YACvE,gDAAgD;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChF,MAAM,IAAI,GAAsB;gBAC9B,IAAI,EAAE,QAAQ,CAAC,aAAa;gBAC5B,UAAU;gBACV,OAAO;gBACP,qEAAqE;gBACrE,oEAAoE;gBACpE,oEAAoE;gBACpE,MAAM,EAAE,MAAM,GAAG,QAAQ;aAC1B,CAAC;YACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3F,CAAC;QAED,cAAc,CAAC,IAAI;YACjB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QAED,YAAY,CAAC,MAAM;YACjB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,UAAU,CAAC,IAAI;YACb,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CACb,qGAAqG;oBACnG,0CAA0C,CAC7C,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,UAAU,CAAC,IAAI;YACb,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,cAAc,CAAC,OAAO,EAAE,iBAAiB;YACvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBACvD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAE,CAAC;gBAC/B,IAAI,MAAM,CAAC,SAAS;oBAAE,SAAS;gBAC/B,qEAAqE;gBACrE,uEAAuE;gBACvE,mDAAmD;gBACnD,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,cAAc;oBAAE,SAAS;gBAC1D,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE,SAAS;gBAC1E,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;gBAC1E,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC;oBAAE,SAAS;gBACnE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YAC5G,CAAC;QACH,CAAC;QAED,MAAM;YACJ,MAAM,SAAS,GAAkB,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3E,GAAG;gBACH,YAAY,EAAE,GAAG,CAAC,IAAI;gBACtB,kBAAkB,EAAE,GAAG,CAAC,UAAU;gBAClC,eAAe,EAAE,GAAG,CAAC,OAAO;aAC7B,CAAC,CAAC,CAAC;YAEJ,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YAC3E,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YACvF,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YACjF,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAE3E,MAAM,OAAO,GACX,MAAM,KAAK,CAAC;gBACV,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE;wBACE,MAAM,EAAE,eAAe;wBACvB,KAAK,EAAE,MAAM;wBACb,MAAM,EACJ,+FAA+F;4BAC/F,sFAAsF;qBACzF;iBACF,CAAC;YAER,yEAAyE;YACzE,0EAA0E;YAC1E,yDAAyD;YACzD,MAAM,iBAAiB,GACrB,QAAQ,KAAK,IAAI;gBACf,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,QAAQ,CAAC,KAAK;qBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBAC7C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAExF,MAAM,KAAK,GAAG,CAAC,GAAG,iBAAiB,EAAE,GAAG,KAAK,CAAC,CAAC;YAC/C,oEAAoE;YACpE,mEAAmE;YACnE,sEAAsE;YACtE,qEAAqE;YACrE,+DAA+D;YAC/D,4BAA4B,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,QAAQ,GAA0B,OAAO;iBAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;iBAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAE1E,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAEjD,OAAO;gBACL,OAAO,EAAE,SAAS;gBAClB,YAAY;gBACZ,kBAAkB;gBAClB,eAAe;gBACf,OAAO;gBACP,gBAAgB,EAAE,OAAO,CAAC,MAAM;gBAChC,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM;gBAC3D,QAAQ;gBACR,KAAK;gBACL,OAAO;gBACP,QAAQ;gBACR,IAAI;gBACJ,SAAS,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;aAChH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,OAAO,CAAC,QAA8B,EAAE,OAAe;IAC9D,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IAC3E,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,MAAM,EACJ,yGAAyG;gBACzG,gFAAgF;SACnF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACrE,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EACJ,sGAAsG;gBACtG,8FAA8F;gBAC9F,uEAAuE;SAC1E,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;+EAC+E;AAC/E,SAAS,aAAa,CAAC,IAAiB,EAAE,IAAY,EAAE,UAAkB;IACxE,MAAM,OAAO,GACX,IAAI,KAAK,CAAC;QACR,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,QAAQ,IAAI,uBAAuB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,0BAA0B,UAAU,gCAAgC,CAAC;IACnI,OAAO,+CAA+C,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,YAAY,CACnB,IAAwB,EACxB,OAAe,EACf,IAAY,EACZ,UAAkB,EAClB,KAAa,EACb,KAAa;IAEb,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,CACL,yGAAyG;YACzG,gCAAgC,CACjC,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,IAAY,EAAU,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxF,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,KAAK,GAAG,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,8BAA8B,CAAC,CAAC;IACnF,IAAI,KAAK,GAAG,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACnE,OAAO,WAAW,UAAU,OAAO,IAAI,gCAAgC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,GAAG,CAAC;AAC/G,CAAC;AAED;6EAC6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,MAA0B;IAC1D,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE3C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,WAAW,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,yBAAyB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1H,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC;IAC/D,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CACR,GAAG,SAAS,WAAW,MAAM,CAAC,YAAY,qEAAqE;YAC7G,0FAA0F,CAC7F,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CACR,KAAK,OAAO,CAAC,IAAI,UAAU,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,GAAG,EAAE,YAAY,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI;YAClH,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,gHAAgH;QAC9G,yGAAyG,CAC5G,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,126 +0,0 @@
1
- /** Live browser sessions belonging to one connection — `mcp-browser-tools.md` §4. Four
2
- * teardown paths (idle timeout, disconnect, crash, close) converge on one `reap` so a
3
- * session never stops being tracked without its browser closing and evidence being
4
- * flushed (kept, never dropped — rule 7). Per-connection, never global — a global
5
- * registry would let one client guess another's browser by session id. */
6
- import type { BrowserDriver, BrowserLaunchOptions, BrowserObservation, BrowserPageSession, ChromiumRefusal } from "./driver.ts";
7
- import type { ReachabilityReport, ReachabilityTracker } from "./reachability.ts";
8
- /** How long a session may go untouched before torn down. Starting value, not a
9
- * measurement — 5 min balances agent-thinking time against leak size; matches the
10
- * action handshake's token TTL deliberately. */
11
- export declare const BROWSER_IDLE_TIMEOUT_MS: number;
12
- /** Max sessions per connection. Small on purpose — each is a real Chromium process;
13
- * 3 leaves room for comparing two states plus one opening, without a loop with a
14
- * missing `browser_close_session` filling the machine. */
15
- export declare const MAX_BROWSER_SESSIONS = 3;
16
- export type ReapReason = "idleTimeout" | "clientDisconnect" | "crashed" | "closed";
17
- /** DEC-270's vocabulary. Reuses `observe_runtime`'s environment-profile field rather
18
- * than a browser-only notion of "safe" (item 27: two definitions could disagree).
19
- * Null means no profile — session consent alone governs. */
20
- export type BrowserSafetyLevel = "readOnly" | "write" | "destructiveWithApproval";
21
- export interface BrowserSessionEntry {
22
- readonly sessionId: string;
23
- /** Run id every R4 edge this session witnesses is stamped with. One per session, not
24
- * per call — a run changing identity between a click and the request it caused would
25
- * make `observedByRun` meaningless. */
26
- readonly runId: string;
27
- readonly page: BrowserPageSession;
28
- /** The profile this session was opened under, or null when none was declared. */
29
- readonly profile: {
30
- readonly name: string;
31
- readonly safetyLevel: BrowserSafetyLevel;
32
- } | null;
33
- /** Origin `browser_start_session` was consented for, recorded at open time — a page
34
- * that navigated since would let re-deriving it launder a cross-origin move into an
35
- * approved one. */
36
- readonly consentedOrigin: string;
37
- readonly openedAt: number;
38
- readonly lastUsedAt: number;
39
- /** What this session has reached so far. Accumulated by the port wrapper, not
40
- * by the tools — see `reach-recording-session.ts` for why that is not a
41
- * convenience. */
42
- readonly reach: ReachabilityTracker;
43
- }
44
- export interface ReapedSession {
45
- readonly sessionId: string;
46
- readonly reason: ReapReason;
47
- readonly observation: BrowserObservation;
48
- readonly at: number;
49
- /**
50
- * Why this session's `saveStorageStateTo` write did not happen, or null —
51
- * B1.
52
- *
53
- * Recorded on the reap record for the same reason the final observation is:
54
- * three of the four teardown paths have no reply to attach it to, and a
55
- * caller who asked for a state and silently got none would only find out on
56
- * the next run, when a session seeded from an absent file quietly drove the
57
- * logged-out surface.
58
- */
59
- readonly storageStateSaveFailure: string | null;
60
- /** The session's final reachability report, taken at teardown.
61
- *
62
- * It rides on the reap record for the same reason `observation` does: all
63
- * four teardown paths converge here, and a report that only `close()`
64
- * produced would be missing from the three ways a session ends that nobody
65
- * asked for. A session reaped on an idle timeout still has to be able to say
66
- * what it reached. */
67
- readonly reachability: ReachabilityReport;
68
- }
69
- export type OpenResult = {
70
- readonly opened: true;
71
- readonly entry: BrowserSessionEntry;
72
- } | {
73
- readonly opened: false;
74
- readonly kind: "atCapacity";
75
- readonly reason: string;
76
- } | ({
77
- readonly opened: false;
78
- readonly kind: "chromiumNotInstalled";
79
- } & ChromiumRefusal);
80
- export type UseResult = {
81
- readonly ok: true;
82
- readonly entry: BrowserSessionEntry;
83
- } | {
84
- readonly ok: false;
85
- readonly kind: "unknown";
86
- readonly reason: string;
87
- } | {
88
- readonly ok: false;
89
- readonly kind: "crashed" | "reaped";
90
- readonly reason: string;
91
- readonly reaped: ReapedSession;
92
- };
93
- export interface BrowserOpenOptions extends BrowserLaunchOptions {
94
- /** The environment profile this session runs under. Read, never invented — see `BrowserSafetyLevel`. */
95
- readonly profile?: {
96
- readonly name: string;
97
- readonly safetyLevel: BrowserSafetyLevel;
98
- } | null;
99
- }
100
- export interface BrowserSessionRegistryOptions {
101
- readonly now?: () => number;
102
- readonly maxSessions?: number;
103
- readonly idleTimeoutMs?: number;
104
- /** Runs the background idle sweep. True in production — an idle session needs a
105
- * timer since it will never trigger a lazy sweep on its own; timer is `unref`'d.
106
- * False in tests, which drive `sweepIdle()` against an injected clock. */
107
- readonly startSweeper?: boolean;
108
- }
109
- export interface BrowserSessionRegistry {
110
- readonly idleTimeoutMs: number;
111
- readonly maxSessions: number;
112
- open(driver: BrowserDriver, options: BrowserOpenOptions): Promise<OpenResult>;
113
- /** Looks up a session, touching its idle clock; detects a crash before returning.
114
- * Async because the crash path is a teardown, not a lookup — a sync version would
115
- * drop the dead page's evidence or (as the first draft did) flush it too late. */
116
- use(sessionId: string): Promise<UseResult>;
117
- close(sessionId: string): Promise<BrowserObservation>;
118
- sweepIdle(): Promise<readonly ReapedSession[]>;
119
- reapAll(reason: ReapReason): Promise<readonly ReapedSession[]>;
120
- reaped(sessionId: string): ReapedSession | undefined;
121
- openCount(): number;
122
- /** Stop the background sweeper. Called when the connection's `Session` is disposed. */
123
- stop(): void;
124
- }
125
- export declare function createBrowserSessionRegistry(options?: BrowserSessionRegistryOptions): BrowserSessionRegistry;
126
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/browser/registry.ts"],"names":[],"mappings":"AAAA;;;;2EAI2E;AAE3E,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEjF;;iDAEiD;AACjD,eAAO,MAAM,uBAAuB,QAAgB,CAAC;AAErD;;2DAE2D;AAC3D,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAItC,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,kBAAkB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEnF;;6DAE6D;AAC7D,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,OAAO,GAAG,yBAAyB,CAAC;AAElF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;4CAEwC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7F;;wBAEoB;IACpB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;uBAEmB;IACnB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;;;;;;;;OASG;IACH,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhD;;;;;;2BAMuB;IACvB,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;CAC3C;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChF,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAAG,eAAe,CAAC,CAAC;AAE1F,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAEzH,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,wGAAwG;IACxG,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/F;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;+EAE2E;IAC3E,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9E;;uFAEmF;IACnF,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACtD,SAAS,IAAI,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IACrD,SAAS,IAAI,MAAM,CAAC;IACpB,uFAAuF;IACvF,IAAI,IAAI,IAAI,CAAC;CACd;AAsBD,wBAAgB,4BAA4B,CAAC,OAAO,GAAE,6BAAkC,GAAG,sBAAsB,CAqIhH"}
@@ -1,177 +0,0 @@
1
- /** Live browser sessions belonging to one connection — `mcp-browser-tools.md` §4. Four
2
- * teardown paths (idle timeout, disconnect, crash, close) converge on one `reap` so a
3
- * session never stops being tracked without its browser closing and evidence being
4
- * flushed (kept, never dropped — rule 7). Per-connection, never global — a global
5
- * registry would let one client guess another's browser by session id. */
6
- import { EMPTY_OBSERVATION } from "./driver.js";
7
- import { withReachRecording } from "./reach-recording-session.js";
8
- /** How long a session may go untouched before torn down. Starting value, not a
9
- * measurement — 5 min balances agent-thinking time against leak size; matches the
10
- * action handshake's token TTL deliberately. */
11
- export const BROWSER_IDLE_TIMEOUT_MS = 5 * 60 * 1000;
12
- /** Max sessions per connection. Small on purpose — each is a real Chromium process;
13
- * 3 leaves room for comparing two states plus one opening, without a loop with a
14
- * missing `browser_close_session` filling the machine. */
15
- export const MAX_BROWSER_SESSIONS = 3;
16
- const SWEEP_INTERVAL_MS = 30_000;
17
- function originOf(url) {
18
- try {
19
- return new URL(url).origin;
20
- }
21
- catch {
22
- // Unparseable target already refused at the schema; return the raw string so
23
- // consent comparison stays total instead of throwing from a bookkeeping call.
24
- return url;
25
- }
26
- }
27
- export function createBrowserSessionRegistry(options = {}) {
28
- const now = options.now ?? Date.now;
29
- const maxSessions = options.maxSessions ?? MAX_BROWSER_SESSIONS;
30
- const idleTimeoutMs = options.idleTimeoutMs ?? BROWSER_IDLE_TIMEOUT_MS;
31
- const live = new Map();
32
- const reapedSessions = new Map();
33
- /** The one teardown; every path routes through here so "closed" and "evidence kept"
34
- * cannot come apart. `close()` on the port is idempotent, so even a crashed session
35
- * yields its last buffered evidence. */
36
- async function reap(sessionId, session, reason) {
37
- live.delete(sessionId);
38
- let observation = EMPTY_OBSERVATION;
39
- try {
40
- observation = await session.page.close();
41
- }
42
- catch {
43
- // Teardown that throws must not leave the session tracked or lose the record —
44
- // the browser may be gone already; this id is now unusable and says why.
45
- }
46
- // Read after `close()`, which is when the driver performs the write.
47
- const storageStateSaveFailure = session.page.storageStateSaveFailure?.() ?? null;
48
- // C3. The tail no tool call ever sees: everything produced after the last
49
- // drain arrives in this final observation, and three of the four teardown
50
- // paths have no reply to attach it to. A failure that the page explained
51
- // only in its last moments would otherwise stay `undetermined` in the one
52
- // report that gets read — `reachability` below is taken immediately after.
53
- session.reach.refineFailures(observation, session.consentedOrigin);
54
- const record = {
55
- sessionId,
56
- reason,
57
- observation,
58
- at: now(),
59
- storageStateSaveFailure,
60
- reachability: session.reach.report(),
61
- };
62
- reapedSessions.set(sessionId, record);
63
- return record;
64
- }
65
- const sweeper = options.startSweeper === false ? null : setInterval(() => void sweepIdle(), SWEEP_INTERVAL_MS);
66
- sweeper?.unref();
67
- async function sweepIdle() {
68
- const deadline = now() - idleTimeoutMs;
69
- const expired = [...live.entries()].filter(([, session]) => session.lastUsedAt < deadline);
70
- return Promise.all(expired.map(([sessionId, session]) => reap(sessionId, session, "idleTimeout")));
71
- }
72
- return {
73
- idleTimeoutMs,
74
- maxSessions,
75
- async open(driver, launchOptions) {
76
- if (live.size >= maxSessions) {
77
- return {
78
- opened: false,
79
- kind: "atCapacity",
80
- // Both numbers so the caller knows whether to close one or stop opening in a loop.
81
- reason: `This connection already has ${live.size} of ${maxSessions} browser sessions open. Close one with ` +
82
- "browser_close_session before starting another. The cap is per connection and exists because each " +
83
- "session is a real browser process.",
84
- };
85
- }
86
- const launch = await driver.launch(launchOptions);
87
- if (!launch.launched) {
88
- const { launched: _launched, ...refusal } = launch;
89
- return { opened: false, kind: "chromiumNotInstalled", ...refusal };
90
- }
91
- const at = now();
92
- const recorded = withReachRecording(launch.session);
93
- const session = {
94
- runId: `browser-${launch.session.sessionId}`,
95
- page: recorded.page,
96
- reach: recorded.reach,
97
- profile: launchOptions.profile ?? null,
98
- consentedOrigin: originOf(launchOptions.targetUrl),
99
- openedAt: at,
100
- lastUsedAt: at,
101
- };
102
- live.set(launch.session.sessionId, session);
103
- return { opened: true, entry: entryOf(launch.session.sessionId, session) };
104
- },
105
- async use(sessionId) {
106
- const session = live.get(sessionId);
107
- if (session === undefined) {
108
- const record = reapedSessions.get(sessionId);
109
- if (record !== undefined) {
110
- return { ok: false, kind: "reaped", reason: reasonFor(record), reaped: record };
111
- }
112
- return {
113
- ok: false,
114
- kind: "unknown",
115
- reason: `No browser session "${sessionId}" on this connection. Sessions are per connection and do not ` +
116
- "survive a reconnect; start one with browser_start_session.",
117
- };
118
- }
119
- if (!session.page.isUsable()) {
120
- // Same teardown as every other path, so the crash case can't skip the flush.
121
- const record = await reap(sessionId, session, "crashed");
122
- return { ok: false, kind: "crashed", reason: crashReason(sessionId), reaped: record };
123
- }
124
- session.lastUsedAt = now();
125
- return { ok: true, entry: entryOf(sessionId, session) };
126
- },
127
- async close(sessionId) {
128
- const session = live.get(sessionId);
129
- if (session === undefined)
130
- return reapedSessions.get(sessionId)?.observation ?? EMPTY_OBSERVATION;
131
- const record = await reap(sessionId, session, "closed");
132
- return record.observation;
133
- },
134
- sweepIdle,
135
- async reapAll(reason) {
136
- const all = [...live.entries()];
137
- return Promise.all(all.map(([sessionId, session]) => reap(sessionId, session, reason)));
138
- },
139
- reaped: (sessionId) => reapedSessions.get(sessionId),
140
- openCount: () => live.size,
141
- stop() {
142
- if (sweeper !== null)
143
- clearInterval(sweeper);
144
- },
145
- };
146
- }
147
- function entryOf(sessionId, session) {
148
- return {
149
- sessionId,
150
- runId: session.runId,
151
- page: session.page,
152
- reach: session.reach,
153
- profile: session.profile,
154
- consentedOrigin: session.consentedOrigin,
155
- openedAt: session.openedAt,
156
- lastUsedAt: session.lastUsedAt,
157
- };
158
- }
159
- function crashReason(sessionId) {
160
- return (`Browser session ${sessionId} crashed or its page closed. The session id is invalidated rather than ` +
161
- "reopened against a different browser, which would silently change what later evidence refers to. " +
162
- "Anything the page reported before it died is included here.");
163
- }
164
- function reasonFor(record) {
165
- switch (record.reason) {
166
- case "idleTimeout":
167
- return (`Browser session ${record.sessionId} was torn down after being idle. Its evidence was kept and is ` +
168
- "included here. Start a new session to continue.");
169
- case "clientDisconnect":
170
- return `Browser session ${record.sessionId} was reaped when the client disconnected.`;
171
- case "crashed":
172
- return crashReason(record.sessionId);
173
- case "closed":
174
- return `Browser session ${record.sessionId} was closed by browser_close_session.`;
175
- }
176
- }
177
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/browser/registry.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- /** Provenance matching for `browser_save_scenario` — DEC-NEXT (Part 13 of the UAT audit). A step
2
- * the session actually performed, in order, was necessarily resolvable at the moment it ran; that
3
- * is stronger evidence than re-resolving the same step against a LATER static snapshot, which is
4
- * exactly what fails for a UI that reveals controls progressively (the earlier steps' own targets
5
- * can mutate — a "Try it out" button that renames itself to "Cancel" — or the later steps' targets
6
- * can vanish again by the time save() looks, even though every one of them was just performed live,
7
- * successfully, moments before). This module answers one question only: for each step in a
8
- * scenario, does it match something this session's own action log says actually happened, in the
9
- * same relative order? It does not decide what to do with that answer — the caller
10
- * (`browser-save-scenario.ts`) still runs today's single-snapshot check for anything this says no
11
- * to, which is the fallback that still catches a fabricated or hand-edited scenario. */
12
- import type { PerformedStep } from "./driver.ts";
13
- import { type ScenarioStep } from "../scenarios/index.ts";
14
- /** For each of `steps`, in order: does it match an entry in `log`, without matching an earlier
15
- * step to a later log entry than a later step already claimed? A greedy in-order subsequence
16
- * match — each match consumes the log up to and including itself, so a match can never come
17
- * from *before* the previous step's own match, even though extra performed actions in between
18
- * (an explored dead end, a step the scenario doesn't include) are skipped over freely rather
19
- * than required to appear. `log` from a different or closed session, or a hand-constructed
20
- * scenario naming something that was never actually performed, matches nothing here — every
21
- * entry in `result` for it comes back `false`, leaving the fallback snapshot check to run. */
22
- export declare function matchByProvenance(steps: readonly ScenarioStep[], log: readonly PerformedStep[]): readonly boolean[];
23
- //# sourceMappingURL=scenario-provenance.d.ts.map