e2e 0.15.2 → 0.17.0

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 (1024) hide show
  1. package/dist/.build.json +1 -1
  2. package/dist/agent/act-validation.d.ts +10 -1
  3. package/dist/agent/act-validation.js +48 -1
  4. package/dist/agent/act.d.ts +1 -2
  5. package/dist/agent/act.js +29 -9
  6. package/dist/agent/action-dispatcher.d.ts +0 -1
  7. package/dist/agent/action-dispatcher.js +4 -6
  8. package/dist/agent/action-names.d.ts +0 -1
  9. package/dist/agent/action-names.js +0 -1
  10. package/dist/agent/actions.d.ts +32 -24
  11. package/dist/agent/actions.js +38 -25
  12. package/dist/agent/agent-brand.d.ts +0 -1
  13. package/dist/agent/agent-brand.js +0 -1
  14. package/dist/agent/ai-sdk.d.ts +7 -1
  15. package/dist/agent/ai-sdk.js +11 -1
  16. package/dist/agent/call-options.d.ts +0 -1
  17. package/dist/agent/call-options.js +0 -1
  18. package/dist/agent/default-agent.d.ts +0 -1
  19. package/dist/agent/default-agent.js +0 -1
  20. package/dist/agent/derived.d.ts +0 -1
  21. package/dist/agent/derived.js +0 -1
  22. package/dist/agent/error.d.ts +0 -1
  23. package/dist/agent/error.js +0 -1
  24. package/dist/agent/executor.d.ts +0 -1
  25. package/dist/agent/executor.js +0 -1
  26. package/dist/agent/index.d.ts +0 -1
  27. package/dist/agent/index.js +0 -1
  28. package/dist/agent/interactive-step.d.ts +0 -1
  29. package/dist/agent/interactive-step.js +0 -1
  30. package/dist/agent/invocation.d.ts +0 -1
  31. package/dist/agent/invocation.js +10 -5
  32. package/dist/agent/ledger.d.ts +0 -1
  33. package/dist/agent/ledger.js +0 -1
  34. package/dist/agent/loop-guards.d.ts +0 -1
  35. package/dist/agent/loop-guards.js +0 -1
  36. package/dist/agent/model/adapter.d.ts +0 -1
  37. package/dist/agent/model/adapter.js +0 -1
  38. package/dist/agent/model/overflow.d.ts +0 -1
  39. package/dist/agent/model/overflow.js +0 -1
  40. package/dist/agent/model/provider-hints.d.ts +0 -1
  41. package/dist/agent/model/provider-hints.js +0 -1
  42. package/dist/agent/model/schema.d.ts +0 -1
  43. package/dist/agent/model/schema.js +0 -1
  44. package/dist/agent/model/sdk.d.ts +0 -1
  45. package/dist/agent/model/sdk.js +2 -1
  46. package/dist/agent/model/stall.d.ts +0 -1
  47. package/dist/agent/model/stall.js +0 -1
  48. package/dist/agent/model/tool-choice.d.ts +0 -1
  49. package/dist/agent/model/tool-choice.js +0 -1
  50. package/dist/agent/observation-budget.d.ts +0 -1
  51. package/dist/agent/observation-budget.js +0 -1
  52. package/dist/agent/observation-feed.d.ts +5 -7
  53. package/dist/agent/observation-feed.js +5 -8
  54. package/dist/agent/observation.d.ts +40 -12
  55. package/dist/agent/observation.js +109 -60
  56. package/dist/agent/operation-queue.d.ts +0 -1
  57. package/dist/agent/operation-queue.js +0 -1
  58. package/dist/agent/phases.d.ts +0 -1
  59. package/dist/agent/phases.js +0 -1
  60. package/dist/agent/pixels.d.ts +0 -1
  61. package/dist/agent/pixels.js +0 -1
  62. package/dist/agent/point-tap.d.ts +8 -9
  63. package/dist/agent/point-tap.js +1 -2
  64. package/dist/agent/primitives.d.ts +6 -1
  65. package/dist/agent/primitives.js +4 -2
  66. package/dist/agent/prompts.d.ts +0 -1
  67. package/dist/agent/prompts.js +0 -1
  68. package/dist/agent/protocol.d.ts +0 -1
  69. package/dist/agent/protocol.js +0 -1
  70. package/dist/agent/public.d.ts +0 -1
  71. package/dist/agent/public.js +0 -1
  72. package/dist/agent/reading.d.ts +0 -1
  73. package/dist/agent/reading.js +0 -1
  74. package/dist/agent/replay.d.ts +19 -9
  75. package/dist/agent/replay.js +11 -15
  76. package/dist/agent/screen-update.d.ts +0 -1
  77. package/dist/agent/screen-update.js +0 -1
  78. package/dist/agent/scroll-target.d.ts +2 -4
  79. package/dist/agent/scroll-target.js +0 -1
  80. package/dist/agent/secrets.d.ts +0 -1
  81. package/dist/agent/secrets.js +0 -1
  82. package/dist/agent/settle-policy.d.ts +0 -1
  83. package/dist/agent/settle-policy.js +0 -1
  84. package/dist/agent/step-accounting.d.ts +0 -1
  85. package/dist/agent/step-accounting.js +0 -1
  86. package/dist/agent/step-cache.d.ts +41 -15
  87. package/dist/agent/step-cache.js +147 -63
  88. package/dist/agent/tool-loop.d.ts +0 -1
  89. package/dist/agent/tool-loop.js +2 -1
  90. package/dist/agent/tool-output.d.ts +0 -1
  91. package/dist/agent/tool-output.js +0 -1
  92. package/dist/agent/tool.d.ts +0 -1
  93. package/dist/agent/tool.js +0 -1
  94. package/dist/agent/transcript-compaction.d.ts +0 -1
  95. package/dist/agent/transcript-compaction.js +0 -1
  96. package/dist/agent/upload-paths.d.ts +0 -1
  97. package/dist/agent/upload-paths.js +0 -1
  98. package/dist/agent/usage.d.ts +0 -1
  99. package/dist/agent/usage.js +0 -1
  100. package/dist/cache/anchors.d.ts +72 -24
  101. package/dist/cache/anchors.js +233 -61
  102. package/dist/cache/context.d.ts +25 -15
  103. package/dist/cache/context.js +50 -9
  104. package/dist/cache/decide.d.ts +2 -3
  105. package/dist/cache/decide.js +4 -7
  106. package/dist/cache/identity.d.ts +18 -5
  107. package/dist/cache/identity.js +9 -5
  108. package/dist/cache/recorder.d.ts +15 -2
  109. package/dist/cache/recorder.js +36 -24
  110. package/dist/cache/rekeyed.d.ts +46 -0
  111. package/dist/cache/rekeyed.js +89 -0
  112. package/dist/cache/relocate.d.ts +14 -15
  113. package/dist/cache/relocate.js +33 -26
  114. package/dist/cache/route.d.ts +32 -34
  115. package/dist/cache/route.js +94 -51
  116. package/dist/cache/store.d.ts +6 -1
  117. package/dist/cache/store.js +21 -2
  118. package/dist/cache/template.d.ts +0 -1
  119. package/dist/cache/template.js +0 -1
  120. package/dist/cache/trace.d.ts +53 -15
  121. package/dist/cache/trace.js +70 -29
  122. package/dist/cli/bin.d.ts +0 -1
  123. package/dist/cli/bin.js +0 -1
  124. package/dist/cli/cache.d.ts +0 -1
  125. package/dist/cli/cache.js +0 -1
  126. package/dist/cli/docs-url.d.ts +0 -1
  127. package/dist/cli/docs-url.js +0 -1
  128. package/dist/cli/feedback.d.ts +0 -1
  129. package/dist/cli/feedback.js +0 -1
  130. package/dist/cli/guide.d.ts +0 -1
  131. package/dist/cli/guide.js +0 -1
  132. package/dist/cli/index.d.ts +0 -1
  133. package/dist/cli/index.js +10 -11
  134. package/dist/cli/init/agent-skill.d.ts +0 -1
  135. package/dist/cli/init/agent-skill.js +0 -1
  136. package/dist/cli/init/engines.d.ts +1 -4
  137. package/dist/cli/init/engines.js +2 -3
  138. package/dist/cli/init/gateways.d.ts +1 -2
  139. package/dist/cli/init/gateways.js +11 -2
  140. package/dist/cli/init/mcp-config.d.ts +0 -1
  141. package/dist/cli/init/mcp-config.js +0 -1
  142. package/dist/cli/init/package.d.ts +0 -1
  143. package/dist/cli/init/package.js +0 -1
  144. package/dist/cli/init/scaffold.d.ts +0 -1
  145. package/dist/cli/init/scaffold.js +0 -1
  146. package/dist/cli/init/sibling-versions.json +1 -1
  147. package/dist/cli/init/versions.d.ts +0 -9
  148. package/dist/cli/init/versions.js +1 -11
  149. package/dist/cli/init.d.ts +0 -1
  150. package/dist/cli/init.js +0 -1
  151. package/dist/cli/mcp.d.ts +9 -2
  152. package/dist/cli/mcp.js +14 -2
  153. package/dist/cli/signals.d.ts +0 -1
  154. package/dist/cli/signals.js +0 -1
  155. package/dist/cli/skill.d.ts +0 -1
  156. package/dist/cli/skill.js +0 -1
  157. package/dist/cli/telemetry.d.ts +0 -1
  158. package/dist/cli/telemetry.js +1 -2
  159. package/dist/cli/wordmark.d.ts +0 -1
  160. package/dist/cli/wordmark.js +0 -1
  161. package/dist/collect/collect.d.ts +0 -1
  162. package/dist/collect/collect.js +3 -2
  163. package/dist/collect/registry.d.ts +6 -3
  164. package/dist/collect/registry.js +31 -14
  165. package/dist/collect/select.d.ts +0 -1
  166. package/dist/collect/select.js +0 -1
  167. package/dist/config/agent.d.ts +0 -1
  168. package/dist/config/agent.js +0 -1
  169. package/dist/config/app.d.ts +0 -1
  170. package/dist/config/app.js +0 -1
  171. package/dist/config/command.d.ts +0 -1
  172. package/dist/config/command.js +0 -1
  173. package/dist/config/diagnose.d.ts +0 -1
  174. package/dist/config/diagnose.js +0 -1
  175. package/dist/config/esm-hooks.d.ts +0 -1
  176. package/dist/config/esm-hooks.js +0 -1
  177. package/dist/config/load.d.ts +0 -1
  178. package/dist/config/load.js +0 -1
  179. package/dist/config/resolve.d.ts +1 -1
  180. package/dist/config/resolve.js +33 -2
  181. package/dist/config/secrets.d.ts +0 -1
  182. package/dist/config/secrets.js +0 -1
  183. package/dist/config/targets.d.ts +0 -1
  184. package/dist/config/targets.js +0 -1
  185. package/dist/config/validate.d.ts +0 -1
  186. package/dist/config/validate.js +0 -1
  187. package/dist/engine/contract.d.ts +0 -1
  188. package/dist/engine/contract.js +0 -1
  189. package/dist/engine/index.d.ts +3 -4
  190. package/dist/engine/index.js +4 -4
  191. package/dist/engine/manifest.d.ts +0 -1
  192. package/dist/engine/manifest.js +0 -1
  193. package/dist/engine/recording.d.ts +0 -1
  194. package/dist/engine/recording.js +0 -1
  195. package/dist/engine/resolve.d.ts +0 -1
  196. package/dist/engine/resolve.js +0 -1
  197. package/dist/engine/session.d.ts +0 -1
  198. package/dist/engine/session.js +0 -1
  199. package/dist/engine/surface.d.ts +0 -1
  200. package/dist/engine/surface.js +0 -1
  201. package/dist/engine/timing.d.ts +0 -1
  202. package/dist/engine/timing.js +0 -1
  203. package/dist/expect/async.d.ts +0 -1
  204. package/dist/expect/async.js +101 -59
  205. package/dist/expect/attempt.d.ts +0 -1
  206. package/dist/expect/attempt.js +0 -1
  207. package/dist/expect/index.d.ts +0 -1
  208. package/dist/expect/index.js +0 -1
  209. package/dist/expect/poll-scope.d.ts +52 -0
  210. package/dist/expect/poll-scope.js +113 -0
  211. package/dist/expect/poll.d.ts +0 -1
  212. package/dist/expect/poll.js +31 -5
  213. package/dist/expect/soft.d.ts +0 -1
  214. package/dist/expect/soft.js +0 -1
  215. package/dist/expect/values.d.ts +0 -1
  216. package/dist/expect/values.js +11 -5
  217. package/dist/explore/body.d.ts +0 -1
  218. package/dist/explore/body.js +0 -1
  219. package/dist/explore/executor.d.ts +0 -1
  220. package/dist/explore/executor.js +0 -1
  221. package/dist/explore/index.d.ts +0 -1
  222. package/dist/explore/index.js +16 -2
  223. package/dist/explore/plan.d.ts +0 -1
  224. package/dist/explore/plan.js +0 -1
  225. package/dist/explore/progress.d.ts +0 -1
  226. package/dist/explore/progress.js +0 -1
  227. package/dist/explore/state.d.ts +0 -1
  228. package/dist/explore/state.js +0 -1
  229. package/dist/index.d.ts +0 -1
  230. package/dist/index.js +0 -1
  231. package/dist/internal/abandoned.d.ts +11 -0
  232. package/dist/internal/abandoned.js +23 -0
  233. package/dist/internal/ai-trace.d.ts +0 -1
  234. package/dist/internal/ai-trace.js +0 -1
  235. package/dist/internal/atomic-write.d.ts +0 -1
  236. package/dist/internal/atomic-write.js +0 -1
  237. package/dist/internal/brands.d.ts +2 -1
  238. package/dist/internal/brands.js +2 -1
  239. package/dist/internal/client-identity.d.ts +9 -0
  240. package/dist/internal/client-identity.js +14 -0
  241. package/dist/internal/debug.d.ts +0 -1
  242. package/dist/internal/debug.js +0 -1
  243. package/dist/internal/env.d.ts +0 -1
  244. package/dist/internal/env.js +0 -1
  245. package/dist/internal/errors.d.ts +0 -1
  246. package/dist/internal/errors.js +0 -1
  247. package/dist/internal/geometry.d.ts +0 -1
  248. package/dist/internal/geometry.js +0 -1
  249. package/dist/internal/git.d.ts +0 -1
  250. package/dist/internal/git.js +0 -1
  251. package/dist/internal/globs.d.ts +0 -1
  252. package/dist/internal/globs.js +0 -1
  253. package/dist/internal/ids.d.ts +0 -1
  254. package/dist/internal/ids.js +0 -1
  255. package/dist/internal/json-value.d.ts +0 -1
  256. package/dist/internal/json-value.js +0 -1
  257. package/dist/internal/keys.d.ts +0 -1
  258. package/dist/internal/keys.js +0 -1
  259. package/dist/internal/node-version.d.ts +0 -1
  260. package/dist/internal/node-version.js +0 -1
  261. package/dist/internal/objects.d.ts +0 -1
  262. package/dist/internal/objects.js +0 -1
  263. package/dist/internal/options.d.ts +0 -1
  264. package/dist/internal/options.js +0 -1
  265. package/dist/internal/package-manager.d.ts +0 -1
  266. package/dist/internal/package-manager.js +0 -1
  267. package/dist/internal/package-version.d.ts +0 -1
  268. package/dist/internal/package-version.js +0 -1
  269. package/dist/internal/paths.d.ts +0 -1
  270. package/dist/internal/paths.js +0 -1
  271. package/dist/internal/realm-slot.d.ts +0 -1
  272. package/dist/internal/realm-slot.js +0 -1
  273. package/dist/internal/recording-modes.d.ts +0 -1
  274. package/dist/internal/recording-modes.js +0 -1
  275. package/dist/internal/redact.d.ts +7 -5
  276. package/dist/internal/redact.js +116 -24
  277. package/dist/internal/regexp.d.ts +0 -1
  278. package/dist/internal/regexp.js +0 -1
  279. package/dist/internal/roles.d.ts +0 -1
  280. package/dist/internal/roles.js +0 -1
  281. package/dist/internal/skip.d.ts +0 -1
  282. package/dist/internal/skip.js +0 -1
  283. package/dist/internal/source.d.ts +0 -1
  284. package/dist/internal/source.js +0 -1
  285. package/dist/internal/standard-schema.d.ts +0 -1
  286. package/dist/internal/standard-schema.js +0 -1
  287. package/dist/internal/suggest.d.ts +0 -1
  288. package/dist/internal/suggest.js +0 -1
  289. package/dist/internal/text.d.ts +8 -1
  290. package/dist/internal/text.js +13 -2
  291. package/dist/internal/time.d.ts +6 -1
  292. package/dist/internal/time.js +25 -14
  293. package/dist/internal/urls.d.ts +9 -6
  294. package/dist/internal/urls.js +19 -11
  295. package/dist/internal/vcs.d.ts +0 -1
  296. package/dist/internal/vcs.js +0 -1
  297. package/dist/internal/zip.d.ts +0 -1
  298. package/dist/internal/zip.js +0 -1
  299. package/dist/locator/engine.d.ts +12 -3
  300. package/dist/locator/engine.js +8 -4
  301. package/dist/locator/expression.d.ts +0 -1
  302. package/dist/locator/expression.js +0 -1
  303. package/dist/locator/screen.d.ts +0 -1
  304. package/dist/locator/screen.js +28 -5
  305. package/dist/mcp/catalog.d.ts +7 -3
  306. package/dist/mcp/catalog.js +8 -9
  307. package/dist/mcp/config.d.ts +0 -1
  308. package/dist/mcp/config.js +0 -1
  309. package/dist/mcp/recording.d.ts +0 -1
  310. package/dist/mcp/recording.js +0 -1
  311. package/dist/mcp/server.d.ts +8 -1
  312. package/dist/mcp/server.js +8 -5
  313. package/dist/mcp/session.d.ts +4 -2
  314. package/dist/mcp/session.js +44 -22
  315. package/dist/mcp/sessions.d.ts +2 -1
  316. package/dist/mcp/sessions.js +5 -2
  317. package/dist/mcp/tools.d.ts +7 -6
  318. package/dist/mcp/tools.js +36 -11
  319. package/dist/mcp/usage.d.ts +61 -0
  320. package/dist/mcp/usage.js +73 -0
  321. package/dist/oauth/callback-server.d.ts +0 -1
  322. package/dist/oauth/callback-server.js +0 -1
  323. package/dist/oauth/chatgpt.d.ts +0 -1
  324. package/dist/oauth/chatgpt.js +3 -24
  325. package/dist/oauth/cli.d.ts +0 -1
  326. package/dist/oauth/cli.js +1 -1
  327. package/dist/oauth/copilot.d.ts +5 -5
  328. package/dist/oauth/copilot.js +80 -8
  329. package/dist/oauth/device-code.d.ts +0 -1
  330. package/dist/oauth/device-code.js +0 -1
  331. package/dist/oauth/errors.d.ts +0 -1
  332. package/dist/oauth/errors.js +0 -1
  333. package/dist/oauth/fetch.d.ts +0 -1
  334. package/dist/oauth/fetch.js +0 -1
  335. package/dist/oauth/grok.d.ts +0 -1
  336. package/dist/oauth/grok.js +2 -2
  337. package/dist/oauth/jwt.d.ts +0 -1
  338. package/dist/oauth/jwt.js +0 -1
  339. package/dist/oauth/login.d.ts +0 -1
  340. package/dist/oauth/login.js +0 -1
  341. package/dist/oauth/models.d.ts +0 -1
  342. package/dist/oauth/models.js +2 -2
  343. package/dist/oauth/opencode-console.d.ts +10 -0
  344. package/dist/oauth/opencode-console.js +133 -0
  345. package/dist/oauth/pkce.d.ts +0 -1
  346. package/dist/oauth/pkce.js +0 -1
  347. package/dist/oauth/providers/github-copilot.d.ts +12 -1
  348. package/dist/oauth/providers/github-copilot.js +80 -19
  349. package/dist/oauth/providers/openai.d.ts +0 -1
  350. package/dist/oauth/providers/openai.js +1 -2
  351. package/dist/oauth/providers/opencode-console.d.ts +31 -0
  352. package/dist/oauth/providers/opencode-console.js +148 -0
  353. package/dist/oauth/providers/xai.d.ts +0 -1
  354. package/dist/oauth/providers/xai.js +0 -1
  355. package/dist/oauth/providers.d.ts +2 -7
  356. package/dist/oauth/providers.js +3 -8
  357. package/dist/oauth/responses.d.ts +9 -0
  358. package/dist/oauth/responses.js +23 -0
  359. package/dist/oauth/sse.d.ts +0 -1
  360. package/dist/oauth/sse.js +0 -1
  361. package/dist/oauth/store.d.ts +0 -1
  362. package/dist/oauth/store.js +0 -1
  363. package/dist/oauth/token-endpoint.d.ts +0 -1
  364. package/dist/oauth/token-endpoint.js +0 -1
  365. package/dist/oauth/types.d.ts +0 -1
  366. package/dist/oauth/types.js +0 -1
  367. package/dist/params.d.ts +0 -1
  368. package/dist/params.js +0 -1
  369. package/dist/report/build.d.ts +26 -1
  370. package/dist/report/build.js +16 -9
  371. package/dist/report/builtin.d.ts +0 -1
  372. package/dist/report/builtin.js +0 -1
  373. package/dist/report/code-frame.d.ts +0 -1
  374. package/dist/report/code-frame.js +0 -1
  375. package/dist/report/debug-steps.d.ts +0 -1
  376. package/dist/report/debug-steps.js +0 -1
  377. package/dist/report/explore-text.d.ts +0 -1
  378. package/dist/report/explore-text.js +0 -1
  379. package/dist/report/failure-text.d.ts +6 -2
  380. package/dist/report/failure-text.js +14 -5
  381. package/dist/report/format.d.ts +10 -6
  382. package/dist/report/format.js +12 -6
  383. package/dist/report/json.d.ts +0 -1
  384. package/dist/report/json.js +0 -1
  385. package/dist/report/junit.d.ts +0 -1
  386. package/dist/report/junit.js +11 -13
  387. package/dist/report/list-explore.d.ts +0 -1
  388. package/dist/report/list-explore.js +0 -1
  389. package/dist/report/list-model.d.ts +0 -1
  390. package/dist/report/list-model.js +0 -1
  391. package/dist/report/list-steps.d.ts +0 -1
  392. package/dist/report/list-steps.js +0 -1
  393. package/dist/report/list.d.ts +1 -1
  394. package/dist/report/list.js +38 -19
  395. package/dist/report/live-window.d.ts +0 -1
  396. package/dist/report/live-window.js +0 -1
  397. package/dist/report/markdown-text.d.ts +0 -1
  398. package/dist/report/markdown-text.js +0 -1
  399. package/dist/report/markdown.d.ts +1 -2
  400. package/dist/report/markdown.js +37 -15
  401. package/dist/report/outcome.d.ts +0 -1
  402. package/dist/report/outcome.js +0 -1
  403. package/dist/report/repeats.d.ts +6 -2
  404. package/dist/report/repeats.js +12 -4
  405. package/dist/report/running-tree.d.ts +0 -1
  406. package/dist/report/running-tree.js +0 -1
  407. package/dist/report/write.d.ts +0 -1
  408. package/dist/report/write.js +0 -1
  409. package/dist/run/app-ports.d.ts +0 -1
  410. package/dist/run/app-ports.js +0 -1
  411. package/dist/run/artifacts.d.ts +18 -1
  412. package/dist/run/artifacts.js +68 -2
  413. package/dist/run/budget.d.ts +0 -1
  414. package/dist/run/budget.js +0 -1
  415. package/dist/run/declared-processes.d.ts +0 -1
  416. package/dist/run/declared-processes.js +0 -1
  417. package/dist/run/events.d.ts +0 -1
  418. package/dist/run/events.js +0 -1
  419. package/dist/run/execute.d.ts +9 -1
  420. package/dist/run/execute.js +55 -29
  421. package/dist/run/extended-fixtures.d.ts +0 -1
  422. package/dist/run/extended-fixtures.js +6 -3
  423. package/dist/run/failure-evidence.d.ts +0 -1
  424. package/dist/run/failure-evidence.js +4 -3
  425. package/dist/run/fixture-recording.d.ts +0 -1
  426. package/dist/run/fixture-recording.js +0 -1
  427. package/dist/run/fixtures.d.ts +0 -1
  428. package/dist/run/fixtures.js +6 -9
  429. package/dist/run/in-process.d.ts +2 -1
  430. package/dist/run/in-process.js +1 -1
  431. package/dist/run/last-run.d.ts +42 -9
  432. package/dist/run/last-run.js +121 -15
  433. package/dist/run/managed-process.d.ts +0 -1
  434. package/dist/run/managed-process.js +0 -1
  435. package/dist/run/output.d.ts +0 -1
  436. package/dist/run/output.js +0 -1
  437. package/dist/run/process-pool.d.ts +0 -1
  438. package/dist/run/process-pool.js +0 -1
  439. package/dist/run/provision.d.ts +0 -1
  440. package/dist/run/provision.js +0 -1
  441. package/dist/run/realm.d.ts +6 -2
  442. package/dist/run/realm.js +21 -8
  443. package/dist/run/records.d.ts +16 -1
  444. package/dist/run/records.js +26 -1
  445. package/dist/run/retry.d.ts +3 -2
  446. package/dist/run/retry.js +4 -3
  447. package/dist/run/runner.d.ts +3 -2
  448. package/dist/run/runner.js +70 -32
  449. package/dist/run/scheduler.d.ts +0 -1
  450. package/dist/run/scheduler.js +0 -1
  451. package/dist/run/secrecy.d.ts +15 -1
  452. package/dist/run/secrecy.js +27 -2
  453. package/dist/run/serial.d.ts +2 -1
  454. package/dist/run/serial.js +8 -6
  455. package/dist/run/sessions.d.ts +0 -1
  456. package/dist/run/sessions.js +0 -1
  457. package/dist/run/standalone.d.ts +0 -1
  458. package/dist/run/standalone.js +3 -3
  459. package/dist/run/steps.d.ts +2 -9
  460. package/dist/run/steps.js +7 -22
  461. package/dist/run/trace-redaction.d.ts +0 -1
  462. package/dist/run/trace-redaction.js +0 -1
  463. package/dist/run/unit-runner.d.ts +0 -1
  464. package/dist/run/unit-runner.js +0 -1
  465. package/dist/run/units.d.ts +0 -1
  466. package/dist/run/units.js +0 -1
  467. package/dist/run/worker/entry.d.ts +0 -1
  468. package/dist/run/worker/entry.js +7 -7
  469. package/dist/run/worker/handle.d.ts +0 -1
  470. package/dist/run/worker/handle.js +0 -1
  471. package/dist/run/worker/protocol.d.ts +2 -1
  472. package/dist/run/worker/protocol.js +0 -1
  473. package/dist/run/worker/session.d.ts +2 -1
  474. package/dist/run/worker/session.js +1 -1
  475. package/dist/run/worker-models.d.ts +0 -1
  476. package/dist/run/worker-models.js +0 -1
  477. package/dist/secrets.d.ts +0 -1
  478. package/dist/secrets.js +0 -1
  479. package/dist/telemetry/checkout.d.ts +0 -1
  480. package/dist/telemetry/checkout.js +0 -1
  481. package/dist/telemetry/environment.d.ts +0 -1
  482. package/dist/telemetry/environment.js +0 -1
  483. package/dist/telemetry/events.d.ts +26 -10
  484. package/dist/telemetry/events.js +108 -13
  485. package/dist/telemetry/failure-kind.d.ts +0 -1
  486. package/dist/telemetry/failure-kind.js +0 -1
  487. package/dist/telemetry/posthog.d.ts +0 -1
  488. package/dist/telemetry/posthog.js +0 -1
  489. package/dist/telemetry/project.d.ts +0 -1
  490. package/dist/telemetry/project.js +0 -1
  491. package/dist/telemetry/store.d.ts +0 -1
  492. package/dist/telemetry/store.js +0 -1
  493. package/dist/telemetry/telemetry.d.ts +19 -8
  494. package/dist/telemetry/telemetry.js +26 -9
  495. package/dist/telemetry/token.d.ts +0 -1
  496. package/dist/telemetry/token.js +0 -1
  497. package/dist/types.d.ts +34 -26
  498. package/dist/types.js +0 -1
  499. package/docs/agents.mdx +6 -3
  500. package/docs/assertions.mdx +94 -0
  501. package/docs/authentication.mdx +3 -1
  502. package/docs/browser.mdx +42 -6
  503. package/docs/cache.mdx +64 -18
  504. package/docs/ci.mdx +11 -7
  505. package/docs/debugging.mdx +6 -3
  506. package/docs/executors.mdx +5 -3
  507. package/docs/github.mdx +12 -4
  508. package/docs/{writing-tests.mdx → goals.mdx} +21 -101
  509. package/docs/index.mdx +4 -4
  510. package/docs/integrations/kernel.mdx +1 -1
  511. package/docs/locators.mdx +64 -0
  512. package/docs/migrate/cypress.mdx +2 -2
  513. package/docs/migrate/maestro.mdx +2 -2
  514. package/docs/migrate/playwright.mdx +22 -16
  515. package/docs/migrate/selenium.mdx +2 -2
  516. package/docs/mobile.mdx +61 -4
  517. package/docs/models.mdx +53 -7
  518. package/docs/physical-devices.mdx +76 -0
  519. package/docs/quickstart.mdx +4 -3
  520. package/docs/reference/app.mdx +1 -1
  521. package/docs/reference/cli.mdx +30 -11
  522. package/docs/reference/config.mdx +25 -7
  523. package/docs/reference/engine.mdx +4 -3
  524. package/docs/reference/environment.mdx +8 -1
  525. package/docs/reference/errors.mdx +5 -5
  526. package/docs/reference/expect.mdx +79 -24
  527. package/docs/reference/mcp.mdx +3 -0
  528. package/docs/reference/mobile.mdx +23 -13
  529. package/docs/reference/reporters.mdx +8 -2
  530. package/docs/reference/screen.mdx +30 -7
  531. package/docs/reference/test.mdx +11 -4
  532. package/docs/reference/web.mdx +131 -23
  533. package/docs/security.mdx +45 -19
  534. package/docs/subscriptions.mdx +97 -9
  535. package/docs/telemetry.mdx +48 -6
  536. package/package.json +18 -4
  537. package/schema/report-v1.schema.json +14 -1
  538. package/skills/e2e/SKILL.md +2 -2
  539. package/skills/e2e/references/agent.md +22 -11
  540. package/skills/e2e/references/debugging.md +4 -4
  541. package/skills/e2e/references/mcp.md +3 -0
  542. package/skills/e2e/references/running.md +13 -8
  543. package/skills/e2e/references/setup.md +42 -15
  544. package/skills/e2e/references/writing-tests.md +43 -15
  545. package/dist/agent/act-validation.d.ts.map +0 -1
  546. package/dist/agent/act-validation.js.map +0 -1
  547. package/dist/agent/act.d.ts.map +0 -1
  548. package/dist/agent/act.js.map +0 -1
  549. package/dist/agent/action-dispatcher.d.ts.map +0 -1
  550. package/dist/agent/action-dispatcher.js.map +0 -1
  551. package/dist/agent/action-names.d.ts.map +0 -1
  552. package/dist/agent/action-names.js.map +0 -1
  553. package/dist/agent/actions.d.ts.map +0 -1
  554. package/dist/agent/actions.js.map +0 -1
  555. package/dist/agent/agent-brand.d.ts.map +0 -1
  556. package/dist/agent/agent-brand.js.map +0 -1
  557. package/dist/agent/ai-sdk.d.ts.map +0 -1
  558. package/dist/agent/ai-sdk.js.map +0 -1
  559. package/dist/agent/call-options.d.ts.map +0 -1
  560. package/dist/agent/call-options.js.map +0 -1
  561. package/dist/agent/default-agent.d.ts.map +0 -1
  562. package/dist/agent/default-agent.js.map +0 -1
  563. package/dist/agent/derived.d.ts.map +0 -1
  564. package/dist/agent/derived.js.map +0 -1
  565. package/dist/agent/error.d.ts.map +0 -1
  566. package/dist/agent/error.js.map +0 -1
  567. package/dist/agent/executor.d.ts.map +0 -1
  568. package/dist/agent/executor.js.map +0 -1
  569. package/dist/agent/index.d.ts.map +0 -1
  570. package/dist/agent/index.js.map +0 -1
  571. package/dist/agent/interactive-step.d.ts.map +0 -1
  572. package/dist/agent/interactive-step.js.map +0 -1
  573. package/dist/agent/invocation.d.ts.map +0 -1
  574. package/dist/agent/invocation.js.map +0 -1
  575. package/dist/agent/ledger.d.ts.map +0 -1
  576. package/dist/agent/ledger.js.map +0 -1
  577. package/dist/agent/loop-guards.d.ts.map +0 -1
  578. package/dist/agent/loop-guards.js.map +0 -1
  579. package/dist/agent/model/adapter.d.ts.map +0 -1
  580. package/dist/agent/model/adapter.js.map +0 -1
  581. package/dist/agent/model/overflow.d.ts.map +0 -1
  582. package/dist/agent/model/overflow.js.map +0 -1
  583. package/dist/agent/model/provider-hints.d.ts.map +0 -1
  584. package/dist/agent/model/provider-hints.js.map +0 -1
  585. package/dist/agent/model/schema.d.ts.map +0 -1
  586. package/dist/agent/model/schema.js.map +0 -1
  587. package/dist/agent/model/sdk.d.ts.map +0 -1
  588. package/dist/agent/model/sdk.js.map +0 -1
  589. package/dist/agent/model/stall.d.ts.map +0 -1
  590. package/dist/agent/model/stall.js.map +0 -1
  591. package/dist/agent/model/tool-choice.d.ts.map +0 -1
  592. package/dist/agent/model/tool-choice.js.map +0 -1
  593. package/dist/agent/observation-budget.d.ts.map +0 -1
  594. package/dist/agent/observation-budget.js.map +0 -1
  595. package/dist/agent/observation-feed.d.ts.map +0 -1
  596. package/dist/agent/observation-feed.js.map +0 -1
  597. package/dist/agent/observation.d.ts.map +0 -1
  598. package/dist/agent/observation.js.map +0 -1
  599. package/dist/agent/operation-queue.d.ts.map +0 -1
  600. package/dist/agent/operation-queue.js.map +0 -1
  601. package/dist/agent/phases.d.ts.map +0 -1
  602. package/dist/agent/phases.js.map +0 -1
  603. package/dist/agent/pixels.d.ts.map +0 -1
  604. package/dist/agent/pixels.js.map +0 -1
  605. package/dist/agent/point-tap.d.ts.map +0 -1
  606. package/dist/agent/point-tap.js.map +0 -1
  607. package/dist/agent/primitives.d.ts.map +0 -1
  608. package/dist/agent/primitives.js.map +0 -1
  609. package/dist/agent/prompts.d.ts.map +0 -1
  610. package/dist/agent/prompts.js.map +0 -1
  611. package/dist/agent/protocol.d.ts.map +0 -1
  612. package/dist/agent/protocol.js.map +0 -1
  613. package/dist/agent/public.d.ts.map +0 -1
  614. package/dist/agent/public.js.map +0 -1
  615. package/dist/agent/reading.d.ts.map +0 -1
  616. package/dist/agent/reading.js.map +0 -1
  617. package/dist/agent/replay.d.ts.map +0 -1
  618. package/dist/agent/replay.js.map +0 -1
  619. package/dist/agent/screen-update.d.ts.map +0 -1
  620. package/dist/agent/screen-update.js.map +0 -1
  621. package/dist/agent/scroll-target.d.ts.map +0 -1
  622. package/dist/agent/scroll-target.js.map +0 -1
  623. package/dist/agent/secrets.d.ts.map +0 -1
  624. package/dist/agent/secrets.js.map +0 -1
  625. package/dist/agent/settle-policy.d.ts.map +0 -1
  626. package/dist/agent/settle-policy.js.map +0 -1
  627. package/dist/agent/step-accounting.d.ts.map +0 -1
  628. package/dist/agent/step-accounting.js.map +0 -1
  629. package/dist/agent/step-cache.d.ts.map +0 -1
  630. package/dist/agent/step-cache.js.map +0 -1
  631. package/dist/agent/tool-loop.d.ts.map +0 -1
  632. package/dist/agent/tool-loop.js.map +0 -1
  633. package/dist/agent/tool-output.d.ts.map +0 -1
  634. package/dist/agent/tool-output.js.map +0 -1
  635. package/dist/agent/tool.d.ts.map +0 -1
  636. package/dist/agent/tool.js.map +0 -1
  637. package/dist/agent/transcript-compaction.d.ts.map +0 -1
  638. package/dist/agent/transcript-compaction.js.map +0 -1
  639. package/dist/agent/upload-paths.d.ts.map +0 -1
  640. package/dist/agent/upload-paths.js.map +0 -1
  641. package/dist/agent/usage.d.ts.map +0 -1
  642. package/dist/agent/usage.js.map +0 -1
  643. package/dist/cache/anchors.d.ts.map +0 -1
  644. package/dist/cache/anchors.js.map +0 -1
  645. package/dist/cache/context.d.ts.map +0 -1
  646. package/dist/cache/context.js.map +0 -1
  647. package/dist/cache/decide.d.ts.map +0 -1
  648. package/dist/cache/decide.js.map +0 -1
  649. package/dist/cache/identity.d.ts.map +0 -1
  650. package/dist/cache/identity.js.map +0 -1
  651. package/dist/cache/recorder.d.ts.map +0 -1
  652. package/dist/cache/recorder.js.map +0 -1
  653. package/dist/cache/relocate.d.ts.map +0 -1
  654. package/dist/cache/relocate.js.map +0 -1
  655. package/dist/cache/route.d.ts.map +0 -1
  656. package/dist/cache/route.js.map +0 -1
  657. package/dist/cache/store.d.ts.map +0 -1
  658. package/dist/cache/store.js.map +0 -1
  659. package/dist/cache/template.d.ts.map +0 -1
  660. package/dist/cache/template.js.map +0 -1
  661. package/dist/cache/trace.d.ts.map +0 -1
  662. package/dist/cache/trace.js.map +0 -1
  663. package/dist/cli/bin.d.ts.map +0 -1
  664. package/dist/cli/bin.js.map +0 -1
  665. package/dist/cli/cache.d.ts.map +0 -1
  666. package/dist/cli/cache.js.map +0 -1
  667. package/dist/cli/docs-url.d.ts.map +0 -1
  668. package/dist/cli/docs-url.js.map +0 -1
  669. package/dist/cli/feedback.d.ts.map +0 -1
  670. package/dist/cli/feedback.js.map +0 -1
  671. package/dist/cli/guide.d.ts.map +0 -1
  672. package/dist/cli/guide.js.map +0 -1
  673. package/dist/cli/index.d.ts.map +0 -1
  674. package/dist/cli/index.js.map +0 -1
  675. package/dist/cli/init/agent-skill.d.ts.map +0 -1
  676. package/dist/cli/init/agent-skill.js.map +0 -1
  677. package/dist/cli/init/engines.d.ts.map +0 -1
  678. package/dist/cli/init/engines.js.map +0 -1
  679. package/dist/cli/init/gateways.d.ts.map +0 -1
  680. package/dist/cli/init/gateways.js.map +0 -1
  681. package/dist/cli/init/mcp-config.d.ts.map +0 -1
  682. package/dist/cli/init/mcp-config.js.map +0 -1
  683. package/dist/cli/init/package.d.ts.map +0 -1
  684. package/dist/cli/init/package.js.map +0 -1
  685. package/dist/cli/init/scaffold.d.ts.map +0 -1
  686. package/dist/cli/init/scaffold.js.map +0 -1
  687. package/dist/cli/init/versions.d.ts.map +0 -1
  688. package/dist/cli/init/versions.js.map +0 -1
  689. package/dist/cli/init.d.ts.map +0 -1
  690. package/dist/cli/init.js.map +0 -1
  691. package/dist/cli/mcp.d.ts.map +0 -1
  692. package/dist/cli/mcp.js.map +0 -1
  693. package/dist/cli/signals.d.ts.map +0 -1
  694. package/dist/cli/signals.js.map +0 -1
  695. package/dist/cli/skill.d.ts.map +0 -1
  696. package/dist/cli/skill.js.map +0 -1
  697. package/dist/cli/telemetry.d.ts.map +0 -1
  698. package/dist/cli/telemetry.js.map +0 -1
  699. package/dist/cli/wordmark.d.ts.map +0 -1
  700. package/dist/cli/wordmark.js.map +0 -1
  701. package/dist/collect/collect.d.ts.map +0 -1
  702. package/dist/collect/collect.js.map +0 -1
  703. package/dist/collect/registry.d.ts.map +0 -1
  704. package/dist/collect/registry.js.map +0 -1
  705. package/dist/collect/select.d.ts.map +0 -1
  706. package/dist/collect/select.js.map +0 -1
  707. package/dist/config/agent.d.ts.map +0 -1
  708. package/dist/config/agent.js.map +0 -1
  709. package/dist/config/app.d.ts.map +0 -1
  710. package/dist/config/app.js.map +0 -1
  711. package/dist/config/command.d.ts.map +0 -1
  712. package/dist/config/command.js.map +0 -1
  713. package/dist/config/diagnose.d.ts.map +0 -1
  714. package/dist/config/diagnose.js.map +0 -1
  715. package/dist/config/esm-hooks.d.ts.map +0 -1
  716. package/dist/config/esm-hooks.js.map +0 -1
  717. package/dist/config/load.d.ts.map +0 -1
  718. package/dist/config/load.js.map +0 -1
  719. package/dist/config/resolve.d.ts.map +0 -1
  720. package/dist/config/resolve.js.map +0 -1
  721. package/dist/config/secrets.d.ts.map +0 -1
  722. package/dist/config/secrets.js.map +0 -1
  723. package/dist/config/targets.d.ts.map +0 -1
  724. package/dist/config/targets.js.map +0 -1
  725. package/dist/config/validate.d.ts.map +0 -1
  726. package/dist/config/validate.js.map +0 -1
  727. package/dist/engine/contract.d.ts.map +0 -1
  728. package/dist/engine/contract.js.map +0 -1
  729. package/dist/engine/index.d.ts.map +0 -1
  730. package/dist/engine/index.js.map +0 -1
  731. package/dist/engine/manifest.d.ts.map +0 -1
  732. package/dist/engine/manifest.js.map +0 -1
  733. package/dist/engine/recording.d.ts.map +0 -1
  734. package/dist/engine/recording.js.map +0 -1
  735. package/dist/engine/resolve.d.ts.map +0 -1
  736. package/dist/engine/resolve.js.map +0 -1
  737. package/dist/engine/session.d.ts.map +0 -1
  738. package/dist/engine/session.js.map +0 -1
  739. package/dist/engine/surface.d.ts.map +0 -1
  740. package/dist/engine/surface.js.map +0 -1
  741. package/dist/engine/timing.d.ts.map +0 -1
  742. package/dist/engine/timing.js.map +0 -1
  743. package/dist/expect/async.d.ts.map +0 -1
  744. package/dist/expect/async.js.map +0 -1
  745. package/dist/expect/attempt.d.ts.map +0 -1
  746. package/dist/expect/attempt.js.map +0 -1
  747. package/dist/expect/index.d.ts.map +0 -1
  748. package/dist/expect/index.js.map +0 -1
  749. package/dist/expect/poll.d.ts.map +0 -1
  750. package/dist/expect/poll.js.map +0 -1
  751. package/dist/expect/soft.d.ts.map +0 -1
  752. package/dist/expect/soft.js.map +0 -1
  753. package/dist/expect/values.d.ts.map +0 -1
  754. package/dist/expect/values.js.map +0 -1
  755. package/dist/explore/body.d.ts.map +0 -1
  756. package/dist/explore/body.js.map +0 -1
  757. package/dist/explore/executor.d.ts.map +0 -1
  758. package/dist/explore/executor.js.map +0 -1
  759. package/dist/explore/index.d.ts.map +0 -1
  760. package/dist/explore/index.js.map +0 -1
  761. package/dist/explore/plan.d.ts.map +0 -1
  762. package/dist/explore/plan.js.map +0 -1
  763. package/dist/explore/progress.d.ts.map +0 -1
  764. package/dist/explore/progress.js.map +0 -1
  765. package/dist/explore/state.d.ts.map +0 -1
  766. package/dist/explore/state.js.map +0 -1
  767. package/dist/index.d.ts.map +0 -1
  768. package/dist/index.js.map +0 -1
  769. package/dist/internal/ai-trace.d.ts.map +0 -1
  770. package/dist/internal/ai-trace.js.map +0 -1
  771. package/dist/internal/atomic-write.d.ts.map +0 -1
  772. package/dist/internal/atomic-write.js.map +0 -1
  773. package/dist/internal/brands.d.ts.map +0 -1
  774. package/dist/internal/brands.js.map +0 -1
  775. package/dist/internal/debug.d.ts.map +0 -1
  776. package/dist/internal/debug.js.map +0 -1
  777. package/dist/internal/env.d.ts.map +0 -1
  778. package/dist/internal/env.js.map +0 -1
  779. package/dist/internal/errors.d.ts.map +0 -1
  780. package/dist/internal/errors.js.map +0 -1
  781. package/dist/internal/geometry.d.ts.map +0 -1
  782. package/dist/internal/geometry.js.map +0 -1
  783. package/dist/internal/git.d.ts.map +0 -1
  784. package/dist/internal/git.js.map +0 -1
  785. package/dist/internal/globs.d.ts.map +0 -1
  786. package/dist/internal/globs.js.map +0 -1
  787. package/dist/internal/ids.d.ts.map +0 -1
  788. package/dist/internal/ids.js.map +0 -1
  789. package/dist/internal/json-value.d.ts.map +0 -1
  790. package/dist/internal/json-value.js.map +0 -1
  791. package/dist/internal/keys.d.ts.map +0 -1
  792. package/dist/internal/keys.js.map +0 -1
  793. package/dist/internal/node-version.d.ts.map +0 -1
  794. package/dist/internal/node-version.js.map +0 -1
  795. package/dist/internal/objects.d.ts.map +0 -1
  796. package/dist/internal/objects.js.map +0 -1
  797. package/dist/internal/options.d.ts.map +0 -1
  798. package/dist/internal/options.js.map +0 -1
  799. package/dist/internal/package-manager.d.ts.map +0 -1
  800. package/dist/internal/package-manager.js.map +0 -1
  801. package/dist/internal/package-version.d.ts.map +0 -1
  802. package/dist/internal/package-version.js.map +0 -1
  803. package/dist/internal/paths.d.ts.map +0 -1
  804. package/dist/internal/paths.js.map +0 -1
  805. package/dist/internal/realm-slot.d.ts.map +0 -1
  806. package/dist/internal/realm-slot.js.map +0 -1
  807. package/dist/internal/recording-modes.d.ts.map +0 -1
  808. package/dist/internal/recording-modes.js.map +0 -1
  809. package/dist/internal/redact.d.ts.map +0 -1
  810. package/dist/internal/redact.js.map +0 -1
  811. package/dist/internal/regexp.d.ts.map +0 -1
  812. package/dist/internal/regexp.js.map +0 -1
  813. package/dist/internal/roles.d.ts.map +0 -1
  814. package/dist/internal/roles.js.map +0 -1
  815. package/dist/internal/skip.d.ts.map +0 -1
  816. package/dist/internal/skip.js.map +0 -1
  817. package/dist/internal/source.d.ts.map +0 -1
  818. package/dist/internal/source.js.map +0 -1
  819. package/dist/internal/standard-schema.d.ts.map +0 -1
  820. package/dist/internal/standard-schema.js.map +0 -1
  821. package/dist/internal/suggest.d.ts.map +0 -1
  822. package/dist/internal/suggest.js.map +0 -1
  823. package/dist/internal/text.d.ts.map +0 -1
  824. package/dist/internal/text.js.map +0 -1
  825. package/dist/internal/time.d.ts.map +0 -1
  826. package/dist/internal/time.js.map +0 -1
  827. package/dist/internal/urls.d.ts.map +0 -1
  828. package/dist/internal/urls.js.map +0 -1
  829. package/dist/internal/vcs.d.ts.map +0 -1
  830. package/dist/internal/vcs.js.map +0 -1
  831. package/dist/internal/zip.d.ts.map +0 -1
  832. package/dist/internal/zip.js.map +0 -1
  833. package/dist/locator/engine.d.ts.map +0 -1
  834. package/dist/locator/engine.js.map +0 -1
  835. package/dist/locator/expression.d.ts.map +0 -1
  836. package/dist/locator/expression.js.map +0 -1
  837. package/dist/locator/screen.d.ts.map +0 -1
  838. package/dist/locator/screen.js.map +0 -1
  839. package/dist/mcp/catalog.d.ts.map +0 -1
  840. package/dist/mcp/catalog.js.map +0 -1
  841. package/dist/mcp/config.d.ts.map +0 -1
  842. package/dist/mcp/config.js.map +0 -1
  843. package/dist/mcp/recording.d.ts.map +0 -1
  844. package/dist/mcp/recording.js.map +0 -1
  845. package/dist/mcp/server.d.ts.map +0 -1
  846. package/dist/mcp/server.js.map +0 -1
  847. package/dist/mcp/session.d.ts.map +0 -1
  848. package/dist/mcp/session.js.map +0 -1
  849. package/dist/mcp/sessions.d.ts.map +0 -1
  850. package/dist/mcp/sessions.js.map +0 -1
  851. package/dist/mcp/tools.d.ts.map +0 -1
  852. package/dist/mcp/tools.js.map +0 -1
  853. package/dist/oauth/callback-server.d.ts.map +0 -1
  854. package/dist/oauth/callback-server.js.map +0 -1
  855. package/dist/oauth/chatgpt.d.ts.map +0 -1
  856. package/dist/oauth/chatgpt.js.map +0 -1
  857. package/dist/oauth/cli.d.ts.map +0 -1
  858. package/dist/oauth/cli.js.map +0 -1
  859. package/dist/oauth/copilot.d.ts.map +0 -1
  860. package/dist/oauth/copilot.js.map +0 -1
  861. package/dist/oauth/device-code.d.ts.map +0 -1
  862. package/dist/oauth/device-code.js.map +0 -1
  863. package/dist/oauth/errors.d.ts.map +0 -1
  864. package/dist/oauth/errors.js.map +0 -1
  865. package/dist/oauth/fetch.d.ts.map +0 -1
  866. package/dist/oauth/fetch.js.map +0 -1
  867. package/dist/oauth/grok.d.ts.map +0 -1
  868. package/dist/oauth/grok.js.map +0 -1
  869. package/dist/oauth/jwt.d.ts.map +0 -1
  870. package/dist/oauth/jwt.js.map +0 -1
  871. package/dist/oauth/login.d.ts.map +0 -1
  872. package/dist/oauth/login.js.map +0 -1
  873. package/dist/oauth/models.d.ts.map +0 -1
  874. package/dist/oauth/models.js.map +0 -1
  875. package/dist/oauth/pkce.d.ts.map +0 -1
  876. package/dist/oauth/pkce.js.map +0 -1
  877. package/dist/oauth/providers/github-copilot.d.ts.map +0 -1
  878. package/dist/oauth/providers/github-copilot.js.map +0 -1
  879. package/dist/oauth/providers/openai.d.ts.map +0 -1
  880. package/dist/oauth/providers/openai.js.map +0 -1
  881. package/dist/oauth/providers/xai.d.ts.map +0 -1
  882. package/dist/oauth/providers/xai.js.map +0 -1
  883. package/dist/oauth/providers.d.ts.map +0 -1
  884. package/dist/oauth/providers.js.map +0 -1
  885. package/dist/oauth/sse.d.ts.map +0 -1
  886. package/dist/oauth/sse.js.map +0 -1
  887. package/dist/oauth/store.d.ts.map +0 -1
  888. package/dist/oauth/store.js.map +0 -1
  889. package/dist/oauth/token-endpoint.d.ts.map +0 -1
  890. package/dist/oauth/token-endpoint.js.map +0 -1
  891. package/dist/oauth/types.d.ts.map +0 -1
  892. package/dist/oauth/types.js.map +0 -1
  893. package/dist/params.d.ts.map +0 -1
  894. package/dist/params.js.map +0 -1
  895. package/dist/report/build.d.ts.map +0 -1
  896. package/dist/report/build.js.map +0 -1
  897. package/dist/report/builtin.d.ts.map +0 -1
  898. package/dist/report/builtin.js.map +0 -1
  899. package/dist/report/code-frame.d.ts.map +0 -1
  900. package/dist/report/code-frame.js.map +0 -1
  901. package/dist/report/debug-steps.d.ts.map +0 -1
  902. package/dist/report/debug-steps.js.map +0 -1
  903. package/dist/report/explore-text.d.ts.map +0 -1
  904. package/dist/report/explore-text.js.map +0 -1
  905. package/dist/report/failure-text.d.ts.map +0 -1
  906. package/dist/report/failure-text.js.map +0 -1
  907. package/dist/report/format.d.ts.map +0 -1
  908. package/dist/report/format.js.map +0 -1
  909. package/dist/report/json.d.ts.map +0 -1
  910. package/dist/report/json.js.map +0 -1
  911. package/dist/report/junit.d.ts.map +0 -1
  912. package/dist/report/junit.js.map +0 -1
  913. package/dist/report/list-explore.d.ts.map +0 -1
  914. package/dist/report/list-explore.js.map +0 -1
  915. package/dist/report/list-model.d.ts.map +0 -1
  916. package/dist/report/list-model.js.map +0 -1
  917. package/dist/report/list-steps.d.ts.map +0 -1
  918. package/dist/report/list-steps.js.map +0 -1
  919. package/dist/report/list.d.ts.map +0 -1
  920. package/dist/report/list.js.map +0 -1
  921. package/dist/report/live-window.d.ts.map +0 -1
  922. package/dist/report/live-window.js.map +0 -1
  923. package/dist/report/markdown-text.d.ts.map +0 -1
  924. package/dist/report/markdown-text.js.map +0 -1
  925. package/dist/report/markdown.d.ts.map +0 -1
  926. package/dist/report/markdown.js.map +0 -1
  927. package/dist/report/outcome.d.ts.map +0 -1
  928. package/dist/report/outcome.js.map +0 -1
  929. package/dist/report/repeats.d.ts.map +0 -1
  930. package/dist/report/repeats.js.map +0 -1
  931. package/dist/report/running-tree.d.ts.map +0 -1
  932. package/dist/report/running-tree.js.map +0 -1
  933. package/dist/report/write.d.ts.map +0 -1
  934. package/dist/report/write.js.map +0 -1
  935. package/dist/run/app-ports.d.ts.map +0 -1
  936. package/dist/run/app-ports.js.map +0 -1
  937. package/dist/run/artifacts.d.ts.map +0 -1
  938. package/dist/run/artifacts.js.map +0 -1
  939. package/dist/run/budget.d.ts.map +0 -1
  940. package/dist/run/budget.js.map +0 -1
  941. package/dist/run/declared-processes.d.ts.map +0 -1
  942. package/dist/run/declared-processes.js.map +0 -1
  943. package/dist/run/events.d.ts.map +0 -1
  944. package/dist/run/events.js.map +0 -1
  945. package/dist/run/execute.d.ts.map +0 -1
  946. package/dist/run/execute.js.map +0 -1
  947. package/dist/run/extended-fixtures.d.ts.map +0 -1
  948. package/dist/run/extended-fixtures.js.map +0 -1
  949. package/dist/run/failure-evidence.d.ts.map +0 -1
  950. package/dist/run/failure-evidence.js.map +0 -1
  951. package/dist/run/fixture-recording.d.ts.map +0 -1
  952. package/dist/run/fixture-recording.js.map +0 -1
  953. package/dist/run/fixtures.d.ts.map +0 -1
  954. package/dist/run/fixtures.js.map +0 -1
  955. package/dist/run/in-process.d.ts.map +0 -1
  956. package/dist/run/in-process.js.map +0 -1
  957. package/dist/run/last-run.d.ts.map +0 -1
  958. package/dist/run/last-run.js.map +0 -1
  959. package/dist/run/managed-process.d.ts.map +0 -1
  960. package/dist/run/managed-process.js.map +0 -1
  961. package/dist/run/output.d.ts.map +0 -1
  962. package/dist/run/output.js.map +0 -1
  963. package/dist/run/process-pool.d.ts.map +0 -1
  964. package/dist/run/process-pool.js.map +0 -1
  965. package/dist/run/provision.d.ts.map +0 -1
  966. package/dist/run/provision.js.map +0 -1
  967. package/dist/run/realm.d.ts.map +0 -1
  968. package/dist/run/realm.js.map +0 -1
  969. package/dist/run/records.d.ts.map +0 -1
  970. package/dist/run/records.js.map +0 -1
  971. package/dist/run/retry.d.ts.map +0 -1
  972. package/dist/run/retry.js.map +0 -1
  973. package/dist/run/runner.d.ts.map +0 -1
  974. package/dist/run/runner.js.map +0 -1
  975. package/dist/run/scheduler.d.ts.map +0 -1
  976. package/dist/run/scheduler.js.map +0 -1
  977. package/dist/run/secrecy.d.ts.map +0 -1
  978. package/dist/run/secrecy.js.map +0 -1
  979. package/dist/run/serial.d.ts.map +0 -1
  980. package/dist/run/serial.js.map +0 -1
  981. package/dist/run/sessions.d.ts.map +0 -1
  982. package/dist/run/sessions.js.map +0 -1
  983. package/dist/run/standalone.d.ts.map +0 -1
  984. package/dist/run/standalone.js.map +0 -1
  985. package/dist/run/steps.d.ts.map +0 -1
  986. package/dist/run/steps.js.map +0 -1
  987. package/dist/run/trace-redaction.d.ts.map +0 -1
  988. package/dist/run/trace-redaction.js.map +0 -1
  989. package/dist/run/unit-runner.d.ts.map +0 -1
  990. package/dist/run/unit-runner.js.map +0 -1
  991. package/dist/run/units.d.ts.map +0 -1
  992. package/dist/run/units.js.map +0 -1
  993. package/dist/run/worker/entry.d.ts.map +0 -1
  994. package/dist/run/worker/entry.js.map +0 -1
  995. package/dist/run/worker/handle.d.ts.map +0 -1
  996. package/dist/run/worker/handle.js.map +0 -1
  997. package/dist/run/worker/protocol.d.ts.map +0 -1
  998. package/dist/run/worker/protocol.js.map +0 -1
  999. package/dist/run/worker/session.d.ts.map +0 -1
  1000. package/dist/run/worker/session.js.map +0 -1
  1001. package/dist/run/worker-models.d.ts.map +0 -1
  1002. package/dist/run/worker-models.js.map +0 -1
  1003. package/dist/secrets.d.ts.map +0 -1
  1004. package/dist/secrets.js.map +0 -1
  1005. package/dist/telemetry/checkout.d.ts.map +0 -1
  1006. package/dist/telemetry/checkout.js.map +0 -1
  1007. package/dist/telemetry/environment.d.ts.map +0 -1
  1008. package/dist/telemetry/environment.js.map +0 -1
  1009. package/dist/telemetry/events.d.ts.map +0 -1
  1010. package/dist/telemetry/events.js.map +0 -1
  1011. package/dist/telemetry/failure-kind.d.ts.map +0 -1
  1012. package/dist/telemetry/failure-kind.js.map +0 -1
  1013. package/dist/telemetry/posthog.d.ts.map +0 -1
  1014. package/dist/telemetry/posthog.js.map +0 -1
  1015. package/dist/telemetry/project.d.ts.map +0 -1
  1016. package/dist/telemetry/project.js.map +0 -1
  1017. package/dist/telemetry/store.d.ts.map +0 -1
  1018. package/dist/telemetry/store.js.map +0 -1
  1019. package/dist/telemetry/telemetry.d.ts.map +0 -1
  1020. package/dist/telemetry/telemetry.js.map +0 -1
  1021. package/dist/telemetry/token.d.ts.map +0 -1
  1022. package/dist/telemetry/token.js.map +0 -1
  1023. package/dist/types.d.ts.map +0 -1
  1024. package/dist/types.js.map +0 -1
@@ -1,20 +1,31 @@
1
1
  /**
2
- * End anchors.
2
+ * Anchors: the step's recorded delta.
3
3
  *
4
4
  * A recording run does not end when its last action commits; it ends when the
5
5
  * executor looks at the screen and judges the step done. The trace used to
6
6
  * keep only the actions and drop that look, so a replay could run every
7
7
  * recorded action mechanically — a fill that never committed, a save that
8
8
  * produced an unnamed record — and self-finalize with nothing checking the
9
- * effect. Anchors restore the check as data: the descriptors of nodes that
10
- * were on screen when the step passed and were not there when it began. They
11
- * are the step's own delta, checked by the relocation vocabulary
12
- * (`relocate.ts`) with two deliberate differences: every recorded field must
13
- * be equal, text included, and presence is enough — uniqueness is not asked.
9
+ * effect. Anchors restore the check as data: the descriptors of nodes the
10
+ * step made appear (`endAnchors`) and of nodes it made vanish
11
+ * (`goneAnchors`), each with the states a step sets on a control it leaves
12
+ * on screen (a switch turned on, a field typed into). They are checked by
13
+ * the relocation vocabulary (`relocate.ts`) with two deliberate differences:
14
+ * every recorded field must be equal, text, value, and states included, and
15
+ * presence is enough, uniqueness is not asked.
16
+ *
17
+ * A replay passes on its own only when the delta happened again: everything
18
+ * that appeared is there, everything that vanished is gone, and at least one
19
+ * of those changes, or the route, actually moved during the replay
20
+ * (`deltaEvidenced`), so a status that already read "Submitted" before a
21
+ * submit that did nothing is no proof. An alert the replay raised that the
22
+ * recording never saw is an outcome the recording did not have, whatever
23
+ * else matched (`deltaHolds`).
14
24
  */
15
25
  import { describeTarget } from '../agent/actions.js';
16
- import { describeNodes, descriptorTiers, fieldsEqual, } from './relocate.js';
17
- import { MAX_TRACE_ANCHORS } from './trace.js';
26
+ import { collapseText } from '../internal/text.js';
27
+ import { descriptorTiers, fieldsEqual } from './relocate.js';
28
+ import { bound, MAX_TRACE_ANCHORS, MAX_TRACE_DESCRIPTOR_CHARS, TRACE_ANCHOR_STATES, } from './trace.js';
18
29
  /**
19
30
  * Every field an anchor records. Unlike target relocation, text is never
20
31
  * optional here: for a target, text is a fallback identity and a relabeled
@@ -25,57 +36,95 @@ import { MAX_TRACE_ANCHORS } from './trace.js';
25
36
  */
26
37
  const ANCHOR_FIELDS = ['role', 'name', 'text', 'testId', 'placeholder', 'inputPurpose'];
27
38
  /**
28
- * Derives the end anchors of one step: relocatable descriptors present in the
29
- * passing observation and absent from the starting one, deduplicated, capped.
30
- * Leaves come first, then containers, each in document order: a container's
31
- * accessible name is usually the concatenation of its children's, so it
32
- * repeats what the leaves already say — and on a list-heavy screen those
33
- * repeats would crowd the one status line that names the effect out of the
34
- * cap.
39
+ * Roles an app announces an outcome in: the ARIA live regions a screen
40
+ * reader reads out on change, and the alert dialog. The app itself says
41
+ * this text reports what just happened, so these are recorded before any
42
+ * other anchor and the cap never crowds them out.
35
43
  */
36
- export function describeAnchors(startNodes, endNodes, options) {
37
- const before = new Set();
38
- for (const node of startNodes.values()) {
39
- const descriptor = anchorDescriptor(node, options);
40
- if (descriptor !== undefined)
41
- before.add(anchorKey(descriptor));
42
- }
44
+ const ANNOUNCEMENT_ROLES = new Set(['alert', 'alertdialog', 'status']);
45
+ /**
46
+ * The announcements that interrupt: an error, a warning, a confirmation the
47
+ * user must answer. A replay that raises one the recording never saw has
48
+ * another outcome than the recording, so every one that appears is recorded
49
+ * whatever its text, and checked both ways.
50
+ */
51
+ const ALERT_ROLES = new Set(['alert', 'alertdialog']);
52
+ /**
53
+ * Derives one step's delta between its starting observation and its passing
54
+ * one. Each side is ordered announcements first, then leaves, then
55
+ * containers, each in document order: a container's accessible name is
56
+ * usually the concatenation of its children's, so it repeats what the
57
+ * leaves already say, and on a list-heavy screen those repeats would crowd
58
+ * the one status line that names the effect out of the cap. `routeMoved`
59
+ * says the step ended on another route than it began on, whose counts are
60
+ * that screen's data rather than the step's result (`COUNT_TEXT`).
61
+ *
62
+ * A node counts as gone only when no end node matches its anchor the way
63
+ * `deltaHolds` checks one, on the recorded fields alone: a radio label
64
+ * "Express" the pick replaced with a status reading "Express" vanished, but
65
+ * an anchor of that text would still match the status, and the recording
66
+ * would fail its own check on every replay.
67
+ */
68
+ export function describeDelta(startNodes, endNodes, routeMoved) {
69
+ const start = projectAnchors(startNodes);
70
+ const end = projectAnchors(endNodes);
71
+ const startKeys = new Set(start.map((anchor) => anchor.key));
72
+ const endKeys = new Set(end.map((anchor) => anchor.key));
73
+ return {
74
+ appeared: deltaSide(end, start, (anchor) => startKeys.has(anchor.key), routeMoved),
75
+ gone: deltaSide(start, end, (anchor) => endKeys.has(anchor.key) || anchorIn(anchor.descriptor, end), routeMoved),
76
+ };
77
+ }
78
+ /** The side of the delta `nodes` holds and `other` does not (`inOther`), ordered and capped. */
79
+ function deltaSide(nodes, other, inOther, routeMoved) {
80
+ const otherShapes = new Set(other.map((anchor) => countShape(anchor.descriptor)));
81
+ const volatile = (anchor) => isVolatileAnchor(anchor, (count) => routeMoved || otherShapes.has(countShape(count)));
43
82
  const seen = new Set();
83
+ const announcements = [];
44
84
  const leaves = [];
45
85
  const containers = [];
46
- for (const node of endNodes.values()) {
47
- const descriptor = anchorDescriptor(node, options);
48
- if (descriptor === undefined)
49
- continue;
50
- const key = anchorKey(descriptor);
51
- if (before.has(key) || seen.has(key))
86
+ for (const anchor of nodes) {
87
+ if (seen.has(anchor.key) || inOther(anchor))
52
88
  continue;
53
- seen.add(key);
54
- (node.children === undefined || node.children.length === 0 ? leaves : containers).push(descriptor);
89
+ seen.add(anchor.key);
90
+ const role = anchor.descriptor.role ?? '';
91
+ (ANNOUNCEMENT_ROLES.has(role) ? announcements : anchor.leaf ? leaves : containers).push(anchor);
55
92
  }
56
- const all = [...leaves, ...containers];
57
- const stable = all.filter((anchor) => !isVolatileAnchor(anchor));
58
- return (stable.length > 0 ? stable : all).slice(0, MAX_TRACE_ANCHORS);
93
+ const all = [...announcements, ...leaves, ...containers];
94
+ const stable = all.filter((anchor) => isAlert(anchor.descriptor) || !volatile(anchor.descriptor));
95
+ return (stable.length > 0 ? stable : all).slice(0, MAX_TRACE_ANCHORS).map((anchor) => anchor.descriptor);
59
96
  }
60
97
  /**
61
98
  * Text that cannot read the same on the next run: a minted key prefix or id,
62
- * a countdown or age, a date, a clock time, a timing in milliseconds, a
63
- * pagination range or record count that grows with the data every run
64
- * leaves behind. An anchor made of it hands every replay off, so it is
65
- * skipped while some stable anchor exists; with nothing else, the volatile
66
- * ones stay, because a replay that always hands off is still safer than
67
- * one that passes on mechanics alone.
99
+ * a countdown or age, a date, a clock time, a timing in milliseconds. An
100
+ * anchor made of it hands every replay off, so it is skipped while some
101
+ * stable anchor exists; with nothing else, the volatile ones stay, because a
102
+ * replay that always hands off is still safer than one that passes on
103
+ * mechanics alone. An alert keeps it, and is compared with these parts read
104
+ * as placeholders (`alertShape`).
68
105
  */
69
106
  const VOLATILE_TEXT = [
70
107
  /\b(?=[A-Za-z0-9_-]*\d)(?=[A-Za-z0-9_-]*[A-Za-z])[A-Za-z0-9_-]{12,}\b/,
71
108
  /\b\d+\s*(?:ms|s|secs?|seconds?|m|mins?|minutes?|h|hrs?|hours?|d|days?|weeks?|months?|years?)\b/i,
72
- /\b\d+\s*(?:to|-|\u2013)\s*\d+\s+of\s+\d+\b/i,
73
- /\b\d+\s+(?:results?|items?|rows?|entries|records?|matches|total)\b/i,
74
109
  /\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|sept|oct|nov|dec)[a-z]*\.?\s+\d{1,2}(?:,?\s+\d{4})?\b/i,
75
110
  /\b\d{1,2}\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|sept|oct|nov|dec)[a-z]*\.?(?:\s+\d{4})?\b/i,
76
111
  /\b\d{4}-\d{2}-\d{2}\b/,
77
112
  /\b\d{1,2}:\d{2}(?::\d{2})?\b/,
78
113
  ];
114
+ /**
115
+ * A count that names what it counts: a pagination range, `12 items`, `3
116
+ * records imported`. Such a count is the step's own result when the step
117
+ * made it appear on the screen it acted on, and must read the same again:
118
+ * `0 records imported` is not the import the recording saw. It is the data
119
+ * instead, which the next run, with what an earlier run left behind, reads
120
+ * differently, when the other side of the delta already showed the same
121
+ * text with other numbers (`41 items` became `42 items`), or when the step
122
+ * moved to another route and the count is part of the screen it opened.
123
+ */
124
+ const COUNT_TEXT = [
125
+ /\b\d+\s*(?:to|-|\u2013)\s*\d+\s+of\s+\d+\b/i,
126
+ /\b\d+\s+(?:results?|items?|rows?|entries|records?|matches|total)\b/i,
127
+ ];
79
128
  /**
80
129
  * A bare number is a badge or a tally, `11` unread, and reads differently
81
130
  * once the data changes; it is volatile when it is all the anchor has to say.
@@ -86,39 +135,162 @@ function isBareNumber(anchor) {
86
135
  const label = anchor.name ?? anchor.text;
87
136
  return label !== undefined && /^\d+$/.test(label) && anchor.testId === undefined && (anchor.name === undefined || anchor.text === undefined || anchor.name === anchor.text);
88
137
  }
89
- function isVolatileAnchor(anchor) {
90
- return (isBareNumber(anchor) ||
91
- [anchor.text, anchor.name].some((value) => value !== undefined && VOLATILE_TEXT.some((pattern) => pattern.test(value))));
138
+ /** Whether an anchor's text cannot read the same on the next run; `countIsData` decides an anchor holding a count. */
139
+ function isVolatileAnchor(anchor, countIsData) {
140
+ const texts = [anchor.text, anchor.name, anchor.value].filter((value) => value !== undefined);
141
+ if (isBareNumber(anchor) || texts.some((value) => VOLATILE_TEXT.some((pattern) => pattern.test(value))))
142
+ return true;
143
+ return texts.some((value) => COUNT_TEXT.some((pattern) => pattern.test(value))) && countIsData(anchor);
144
+ }
145
+ /** An anchor with every digit run read as one placeholder: the text a running count keeps while its numbers move. */
146
+ function countShape(anchor) {
147
+ return anchorKey({ ...anchor, ...digitless('name', anchor.name), ...digitless('text', anchor.text), ...digitless('value', anchor.value) });
148
+ }
149
+ function digitless(field, value) {
150
+ return value === undefined ? {} : { [field]: value.replace(/\d+/g, '#') };
151
+ }
152
+ function isAlert(anchor) {
153
+ return anchor.role !== undefined && ALERT_ROLES.has(anchor.role);
154
+ }
155
+ const VOLATILE_SPANS = VOLATILE_TEXT.map((pattern) => new RegExp(pattern.source, `${pattern.flags}g`));
156
+ /**
157
+ * An alert with its volatile parts read as one placeholder each: `Session
158
+ * expires at 17:42` and `Session expires at 17:45` are the same alert, which
159
+ * a replay must neither miss nor mistake for one the recording never saw.
160
+ */
161
+ function alertShape(anchor) {
162
+ const mask = (text) => VOLATILE_SPANS.reduce((masked, span) => masked.replace(span, '#'), text);
163
+ return {
164
+ ...anchor,
165
+ ...(anchor.name === undefined ? {} : { name: mask(anchor.name) }),
166
+ ...(anchor.text === undefined ? {} : { text: mask(anchor.text) }),
167
+ };
168
+ }
169
+ /**
170
+ * Whether the recorded end state holds on a fresh observation: every
171
+ * appeared anchor present (some tier of it, `descriptorTiers`, so a test id
172
+ * that churned per render is forgiven when the remaining fields still
173
+ * identify the node, equal on every anchor field and state), no gone anchor
174
+ * present, and no alert on screen that was not on `beforeNodes` and is not
175
+ * one the recording saw appear. Two nodes matching one anchor are the effect
176
+ * twice over, not an ambiguity.
177
+ */
178
+ export function deltaHolds(delta, nodes, beforeNodes) {
179
+ const live = projectAnchors(nodes);
180
+ const appeared = delta.endAnchors ?? [];
181
+ if (!appeared.every((anchor) => anchorIn(anchor, live)))
182
+ return false;
183
+ if ((delta.goneAnchors ?? []).some((anchor) => anchorIn(anchor, live)))
184
+ return false;
185
+ const before = projectAnchors(beforeNodes).filter((anchor) => isAlert(anchor.descriptor));
186
+ return live.every((anchor) => !isAlert(anchor.descriptor) ||
187
+ before.some((earlier) => anchorIn(anchor.descriptor, [earlier])) ||
188
+ appeared.some((recorded) => anchorIn(recorded, [anchor])));
92
189
  }
93
190
  /**
94
- * Whether every anchor is present in a fresh observation: some tier of the
95
- * anchor (`descriptorTiers` — so a test id that churned per render is
96
- * forgiven when the remaining fields still identify the node) equals some
97
- * candidate on every anchor field. Two matching nodes are the effect twice
98
- * over, not an ambiguity.
191
+ * Whether the replay itself produced some of the recorded delta, measured
192
+ * from `baselineNodes`, the first screen the replay saw on the route it
193
+ * ended on: an anchor that appeared was absent there, or a gone one was
194
+ * there. Without that, every check `deltaHolds` makes could have held before
195
+ * the actions that should have produced it: the screen already read the
196
+ * outcome, and nothing the replay did is proven to have done anything. A
197
+ * recording with no delta at all is never evidence. Undefined `baselineNodes`
198
+ * means the replay saw no screen on that route before its last action, so
199
+ * that action moved the route, which is the evidence.
200
+ *
201
+ * A control one of the trace's own actions targeted (`inputTargets`) that
202
+ * shows on both sides of the delta, a field typed into or a switch flipped,
203
+ * echoes the input: the replay typed, so the value is there, whatever the
204
+ * step was for. Such echoes are evidence only when the delta holds nothing
205
+ * else; otherwise the rest of the delta must have moved, so a subscribe
206
+ * form typed into on a page that already read "You're subscribed" proves
207
+ * nothing.
99
208
  */
100
- export function anchorsPresent(anchors, nodes, options) {
101
- const candidates = describeNodes(nodes, options).map((node) => node.descriptor);
102
- return anchors.every((anchor) => descriptorTiers(anchor).some((tier) => candidates.some((candidate) => fieldsEqual(tier, candidate, ANCHOR_FIELDS))));
209
+ export function deltaEvidenced(delta, baselineNodes, inputTargets) {
210
+ if (baselineNodes === undefined)
211
+ return true;
212
+ const appeared = delta.endAnchors ?? [];
213
+ const gone = delta.goneAnchors ?? [];
214
+ const targets = new Set(inputTargets.map(identityKey));
215
+ const changed = new Set(appeared.map(identityKey).filter((key) => gone.some((anchor) => identityKey(anchor) === key)));
216
+ const echoes = (anchor) => changed.has(identityKey(anchor)) && targets.has(identityKey(anchor));
217
+ const outcome = [...appeared, ...gone].some((anchor) => !echoes(anchor));
218
+ const counted = (anchor) => !outcome || !echoes(anchor);
219
+ const baseline = projectAnchors(baselineNodes);
220
+ return (appeared.some((anchor) => counted(anchor) && !anchorIn(anchor, baseline)) ||
221
+ gone.some((anchor) => counted(anchor) && anchorIn(anchor, baseline)));
222
+ }
223
+ /** A control's key without what a step sets on it, its value and states: the same control before and after. */
224
+ function identityKey(descriptor) {
225
+ const { value: _value, states: _states, ...control } = descriptor;
226
+ return anchorKey(control);
227
+ }
228
+ /**
229
+ * Whether some tier of a recorded anchor equals some projected node on every
230
+ * anchor field, and on its value and states exactly: an empty field is not
231
+ * the field filled in, nor an unchecked switch the switch turned on. An
232
+ * alert is compared by its shape (`alertShape`).
233
+ */
234
+ function anchorIn(anchor, nodes) {
235
+ const states = statesKey(anchor.states);
236
+ const shape = isAlert(anchor) ? alertShape : (descriptor) => descriptor;
237
+ return descriptorTiers(anchor).some((tier) => nodes.some((node) => node.descriptor.value === anchor.value &&
238
+ statesKey(node.descriptor.states) === states &&
239
+ fieldsEqual(shape(tier), shape(node.descriptor), ANCHOR_FIELDS)));
240
+ }
241
+ /**
242
+ * Anchor projections per observation: a replay checks the same end screen
243
+ * once per poll and the start screen for every check, while the projection
244
+ * of a node is a pure function of the node.
245
+ */
246
+ const projections = new WeakMap();
247
+ /** Every node of an observation that can serve as an anchor, in document order. */
248
+ function projectAnchors(nodes) {
249
+ const cached = projections.get(nodes);
250
+ if (cached !== undefined)
251
+ return cached;
252
+ const anchors = [];
253
+ for (const node of nodes.values()) {
254
+ const descriptor = anchorDescriptor(node);
255
+ if (descriptor === undefined)
256
+ continue;
257
+ // An alert keyed by its shape: one whose countdown ticked while the step
258
+ // ran stayed on screen, and is on neither side of the delta.
259
+ const key = anchorKey(isAlert(descriptor) ? alertShape(descriptor) : descriptor);
260
+ anchors.push({ descriptor, key, leaf: node.children === undefined || node.children.length === 0 });
261
+ }
262
+ projections.set(nodes, anchors);
263
+ return anchors;
103
264
  }
104
265
  /** One node's anchor projection, or undefined when it could identify nothing. */
105
- function anchorDescriptor(node, options) {
106
- const described = describeTarget(node, options.redact);
266
+ function anchorDescriptor(node) {
267
+ const described = describeTarget(node);
107
268
  if (described === undefined || descriptorTiers(described).length === 0)
108
269
  return undefined;
109
270
  const { selector: _selector, ...anchor } = described;
110
- return anchor;
271
+ const states = TRACE_ANCHOR_STATES.filter((state) => node.states?.[state] === true);
272
+ const value = node.value === undefined || node.states?.secure === true ? '' : collapseText(node.value);
273
+ return {
274
+ ...anchor,
275
+ ...(value === '' ? {} : { value: bound(value, MAX_TRACE_DESCRIPTOR_CHARS) }),
276
+ ...(states.length === 0 ? {} : { states }),
277
+ };
278
+ }
279
+ function statesKey(states) {
280
+ return states === undefined ? '' : states.join(',');
111
281
  }
112
282
  /**
113
283
  * Set key for one descriptor: its loosest identifying tier over the anchor
114
- * fields, in fixed order. Keying on the semantic tier whenever it identifies
115
- * the node means an app that mints test ids per render cannot make every
116
- * unchanged control look new after a re-render and crowd the real effect out
117
- * of the capped list; a node only a test id identifies keeps it.
284
+ * fields, in fixed order, and its states. Keying on the semantic tier
285
+ * whenever it identifies the node means an app that mints test ids per
286
+ * render cannot make every unchanged control look new after a re-render and
287
+ * crowd the real effect out of the capped list; a node only a test id
288
+ * identifies keeps it. The states make a control that changed state a node
289
+ * of the delta on both sides: the switch as it was, gone, and as it is,
290
+ * appeared; the value does the same for a field typed into.
118
291
  */
119
292
  function anchorKey(descriptor) {
120
293
  const tiers = descriptorTiers(descriptor);
121
294
  const loosest = tiers[tiers.length - 1] ?? descriptor;
122
- return JSON.stringify(ANCHOR_FIELDS.map((field) => loosest[field]));
295
+ return JSON.stringify([...ANCHOR_FIELDS.map((field) => loosest[field]), descriptor.value, statesKey(descriptor.states)]);
123
296
  }
124
- //# sourceMappingURL=anchors.js.map
@@ -8,9 +8,10 @@
8
8
  * re-records.
9
9
  */
10
10
  import type { ResolvedCacheConfig } from '../config/resolve.ts';
11
- import { type CacheTargetIdentity, type TraceCacheKind } from './identity.ts';
11
+ import { type CacheAgentIdentity, type CacheTargetIdentity, type TraceCacheKind } from './identity.ts';
12
+ import type { StoredRecordings } from './rekeyed.ts';
12
13
  import { type CacheStore } from './store.ts';
13
- import type { ActionTrace } from './trace.ts';
14
+ import type { ActionTrace, TraceProvenance } from './trace.ts';
14
15
  import type { JsonValue } from '../types.ts';
15
16
  /**
16
17
  * One cache entry held back until the attempt confirms or implicates it: a
@@ -18,7 +19,9 @@ import type { JsonValue } from '../types.ts';
18
19
  * stands. A kept entry carries no payload, so the replay's expansion of it
19
20
  * (every `unique()` slot filled with this run's value) can never be written;
20
21
  * confirmed, the file keeps its bytes and `createdAt`, and a committed cache
21
- * directory stays clean. Unconfirmed, both kinds are evicted alike.
22
+ * directory stays clean, unless its provenance predates the step's
23
+ * occurrence fields (`recordedFor`, as stored), which the replay proved and
24
+ * are then written in. Unconfirmed, both kinds are evicted alike.
22
25
  */
23
26
  export type StagedTrace = {
24
27
  readonly keyHash: string;
@@ -29,34 +32,40 @@ export type StagedTrace = {
29
32
  readonly trace: ActionTrace;
30
33
  } | {
31
34
  readonly kind: 'keep';
35
+ readonly recordedFor: TraceProvenance;
32
36
  });
37
+ /** One step's claimed key: its hash, and the step it names as an entry records it. */
38
+ export interface ClaimedKey {
39
+ readonly keyHash: string;
40
+ /** The step's identity before redaction; the recorder redacts it on the way to disk. */
41
+ readonly step: TraceProvenance;
42
+ }
33
43
  export interface AgentCacheContext {
34
44
  readonly mode: 'read-only' | 'read-write';
35
45
  readonly store: CacheStore;
36
- /** Test and target a write is recorded for, as `e2e cache ls` prints them. */
37
- readonly identity: {
38
- readonly testId: string;
39
- readonly targetId: string;
40
- };
41
46
  /** Whether this attempt may replay; writes are governed by `mode` alone. */
42
47
  readonly replayEligible: boolean;
43
48
  /**
44
49
  * A recording that no longer replays fails its step (`REPLAY_STALE`)
45
50
  * instead of handing it to the executor, with `advice` on how to re-record
46
- * it: the knobs to turn off and where the entry lives.
51
+ * it: the knobs to turn off and where the entry lives. `recordings`, set
52
+ * when the store can be listed, finds the recording of a step whose key
53
+ * changed under it, which is stale too rather than missing.
47
54
  */
48
55
  readonly strict: false | {
49
56
  readonly advice: string;
57
+ readonly recordings?: StoredRecordings;
50
58
  };
51
59
  /**
52
- * Claims one step's key hash. Not a pure derivation: each claim advances
53
- * the per-attempt occurrence index for its signature, which is what lets a
54
- * test repeat the same instruction and cache each occurrence separately.
60
+ * Claims one step's key. Not a pure derivation: each claim advances
61
+ * the per-attempt occurrence index for its agent and signature, which is
62
+ * what lets a test repeat the same instruction and cache each occurrence
63
+ * separately.
55
64
  * Exactly one claim per dispatched step, in execution order — the
56
65
  * `StepTraceSession` constructor is the sole caller and owns that
57
66
  * invariant structurally.
58
67
  */
59
- claimKeyHash(kind: TraceCacheKind, instruction: string, params: Readonly<Record<string, JsonValue>> | undefined): string;
68
+ claimKey(kind: TraceCacheKind, instruction: string, params: Readonly<Record<string, JsonValue>> | undefined, agent: CacheAgentIdentity): ClaimedKey;
60
69
  /**
61
70
  * Trace writes staged during the attempt. A trace is not trusted the moment
62
71
  * its own step passes — the verification step after it is what proves the
@@ -93,7 +102,7 @@ export interface AttemptSettlement {
93
102
  * for an interrupted attempt: interruption implicates nothing, so it writes
94
103
  * nothing and evicts nothing. An entry a step replayed whole is staged too,
95
104
  * so the same rule evicts it when nothing confirmed it; when something did,
96
- * it is left exactly as it was found.
105
+ * it is left exactly as it was found, but for provenance it lacked.
97
106
  */
98
107
  export declare function flushStagedTraces(context: AgentCacheContext, settlement: AttemptSettlement): Promise<void>;
99
108
  /**
@@ -110,5 +119,6 @@ export declare function createAgentCacheContext(options: {
110
119
  readonly testId: string;
111
120
  readonly target: CacheTargetIdentity;
112
121
  readonly attemptIndex: number;
122
+ /** The file store's listing under `cache.strict`, shared by the attempts of one worker and target (`storedRecordingsFor`). */
123
+ readonly recordings?: StoredRecordings | undefined;
113
124
  }): AgentCacheContext | undefined;
114
- //# sourceMappingURL=context.d.ts.map
@@ -38,6 +38,18 @@ function flowOf(trace) {
38
38
  }),
39
39
  });
40
40
  }
41
+ /**
42
+ * Writes the step's full provenance into a kept entry recorded before the
43
+ * occurrence fields were, leaving every other entry untouched. Its replay
44
+ * proved which step it belongs to, and `cache.strict` matches only entries
45
+ * that say so exactly (`rekeyed.ts`).
46
+ */
47
+ async function completeProvenance(store, keyHash, recordedFor) {
48
+ const existing = await store.read(keyHash);
49
+ if (existing.status !== 'hit' || existing.entry.payload.recordedFor?.callIndex !== undefined)
50
+ return;
51
+ await store.write(keyHash, { ...existing.entry.payload, recordedFor });
52
+ }
41
53
  /**
42
54
  * Settles the attempt's staged trace writes. A staged trace is confirmed only
43
55
  * when a verification step — a deterministic assertion or an agent judgment
@@ -54,7 +66,7 @@ function flowOf(trace) {
54
66
  * for an interrupted attempt: interruption implicates nothing, so it writes
55
67
  * nothing and evicts nothing. An entry a step replayed whole is staged too,
56
68
  * so the same rule evicts it when nothing confirmed it; when something did,
57
- * it is left exactly as it was found.
69
+ * it is left exactly as it was found, but for provenance it lacked.
58
70
  */
59
71
  export async function flushStagedTraces(context, settlement) {
60
72
  const staged = context.staged.splice(0);
@@ -68,7 +80,11 @@ export async function flushStagedTraces(context, settlement) {
68
80
  await context.store.delete?.(entry.keyHash);
69
81
  continue;
70
82
  }
71
- if (entry.kind === 'keep' || (await holdsSameFlow(context.store, entry.keyHash, entry.trace)))
83
+ if (entry.kind === 'keep') {
84
+ await completeProvenance(context.store, entry.keyHash, entry.recordedFor);
85
+ continue;
86
+ }
87
+ if (await holdsSameFlow(context.store, entry.keyHash, entry.trace))
72
88
  continue;
73
89
  await context.store.write(entry.keyHash, entry.trace);
74
90
  }
@@ -95,23 +111,49 @@ export function createAgentCacheContext(options) {
95
111
  writable: mode === 'read-write',
96
112
  });
97
113
  const project = projectIdentity(options.projectId);
98
- const nextCallIndex = createCallIndexer();
114
+ // One occurrence count per agent: the agent is part of the key, so another
115
+ // agent's call of the same instruction must not renumber this one's.
116
+ const indexers = new Map();
117
+ const nextCallIndex = (agent, signature) => {
118
+ // Folded like the key folds it (`buildTraceCacheKey`): no context is the empty one.
119
+ const agentKey = canonicalJson([agent.name, agent.context ?? '']);
120
+ const indexer = indexers.get(agentKey) ?? createCallIndexer();
121
+ indexers.set(agentKey, indexer);
122
+ return indexer(signature);
123
+ };
99
124
  return {
100
125
  mode,
101
126
  store,
102
- identity: { testId: options.testId, targetId: options.target.targetId },
103
127
  replayEligible: options.attemptIndex === 0,
104
- strict: options.cache.strict === false ? false : { advice: staleAdvice(options.cache, options.cache.strict, options.projectRoot) },
105
- claimKeyHash: (kind, instruction, params) => {
128
+ strict: options.cache.strict === false
129
+ ? false
130
+ : {
131
+ advice: staleAdvice(options.cache, options.cache.strict, options.projectRoot),
132
+ ...(options.recordings === undefined ? {} : { recordings: options.recordings }),
133
+ },
134
+ claimKey: (kind, instruction, params, agent) => {
106
135
  const signature = traceCallSignature(kind, instruction, params);
107
- return traceCacheKeyHash(buildTraceCacheKey({
136
+ const callIndex = nextCallIndex(agent, signature);
137
+ const keyHash = traceCacheKeyHash(buildTraceCacheKey({
108
138
  project,
109
139
  testId: options.testId,
110
140
  target: options.target,
111
141
  signature,
112
- callIndex: nextCallIndex(signature),
142
+ callIndex,
143
+ agent,
113
144
  policyVersion: REPLAY_POLICY_VERSION,
114
145
  }));
146
+ return {
147
+ keyHash,
148
+ step: {
149
+ testId: options.testId,
150
+ targetId: options.target.targetId,
151
+ instructionDigest: signature.instructionDigest,
152
+ paramsDigest: signature.paramsDigest,
153
+ callIndex,
154
+ agent: agent.name,
155
+ },
156
+ };
115
157
  },
116
158
  staged: [],
117
159
  };
@@ -133,4 +175,3 @@ function staleAdvice(cache, source, projectRoot) {
133
175
  const where = relative === '' || relative.startsWith('..') || path.isAbsolute(relative) ? cache.dir : relative;
134
176
  return `${run} and commit the changed entry under ${where.split(path.sep).join('/')}`;
135
177
  }
136
- //# sourceMappingURL=context.js.map
@@ -31,8 +31,7 @@ export type TraceReplayDecision = {
31
31
  * not open with a navigate carries a start precondition: the app must be on
32
32
  * the screen where the recording began, or the recorded actions would run
33
33
  * against a different screen than they were proven on. The screen is its
34
- * route (`routeOf`), not its URL; a route the path leaves undecided is a
35
- * miss, since nothing recorded at the start is specific enough to settle it.
34
+ * route (`cache/route.ts`), not its URL: the same origin, path, and query,
35
+ * whatever the ids in them.
36
36
  */
37
37
  export declare function decideTraceReplay(entry: TraceEntry, currentPath: string | undefined): TraceReplayDecision;
38
- //# sourceMappingURL=decide.d.ts.map
@@ -7,7 +7,7 @@
7
7
  * decision takes an already-trusted entry and answers only the questions the
8
8
  * entry alone cannot: is it whole, and is the app where the recording began?
9
9
  */
10
- import { compareRoutes, routeOf } from './route.js';
10
+ import { sameRoute } from './route.js';
11
11
  /**
12
12
  * Whether a trace establishes its own starting point by navigating first.
13
13
  * Such a trace needs no start-path precondition — and a trace with neither
@@ -21,8 +21,8 @@ export function opensWithNavigate(trace) {
21
21
  * not open with a navigate carries a start precondition: the app must be on
22
22
  * the screen where the recording began, or the recorded actions would run
23
23
  * against a different screen than they were proven on. The screen is its
24
- * route (`routeOf`), not its URL; a route the path leaves undecided is a
25
- * miss, since nothing recorded at the start is specific enough to settle it.
24
+ * route (`cache/route.ts`), not its URL: the same origin, path, and query,
25
+ * whatever the ids in them.
26
26
  */
27
27
  export function decideTraceReplay(entry, currentPath) {
28
28
  const trace = entry.payload;
@@ -32,8 +32,5 @@ export function decideTraceReplay(entry, currentPath) {
32
32
  return { action: 'replay' };
33
33
  if (trace.startPath === undefined || currentPath === undefined)
34
34
  return { action: 'miss', reason: 'wrong-context' };
35
- return compareRoutes(routeOf(trace.startPath), routeOf(currentPath)) === 'same'
36
- ? { action: 'replay' }
37
- : { action: 'miss', reason: 'wrong-context' };
35
+ return sameRoute(trace.startPath, currentPath) ? { action: 'replay' } : { action: 'miss', reason: 'wrong-context' };
38
36
  }
39
- //# sourceMappingURL=decide.js.map
@@ -7,10 +7,13 @@
7
7
  * contributes only its stable name and purpose, exactly as the executor sees
8
8
  * it in the projected params.
9
9
  *
10
- * Executor identity is deliberately absent (OQ10's conservative default):
11
- * entries are shared across roster members and carry their producer as
12
- * provenance on the entry, so a future ReplayPolicy can reject foreign traces
13
- * without a re-key.
10
+ * The agent a step runs with is part of the key: its configured name, since
11
+ * two agents of one test (`agent: ['buyer', 'admin']`) act as different
12
+ * people, and a digest of the context it reads, since a test's
13
+ * `agentContext` decides what the step does. The context is digested after
14
+ * redaction, so a registered secret in it contributes its name only. The
15
+ * executor that produced a trace stays provenance on the entry: the agent's
16
+ * name already keeps two configured agents apart.
14
17
  */
15
18
  import type { JsonValue } from '../types.ts';
16
19
  import { TRACE_SCHEMA_VERSION } from './trace.ts';
@@ -37,8 +40,18 @@ export interface TraceCacheKey {
37
40
  readonly instructionDigest: string;
38
41
  readonly paramsDigest: string;
39
42
  readonly appIdentity: string;
43
+ /** Name of the configured agent the step ran with. */
44
+ readonly agent: string;
45
+ /** SHA-256 of the agent's redacted context (its `context` then the test's `agentContext`), or of the empty string. */
46
+ readonly agentContextDigest: string;
40
47
  readonly policyVersion: string;
41
48
  }
49
+ /** The agent a step runs with, as the key sees it. */
50
+ export interface CacheAgentIdentity {
51
+ readonly name: string;
52
+ /** The context the agent reads, already redacted. */
53
+ readonly context: string | undefined;
54
+ }
42
55
  /** Identity of the target/engine/app a trace was recorded against. */
43
56
  export interface CacheTargetIdentity {
44
57
  readonly targetId: string;
@@ -106,8 +119,8 @@ export declare function buildTraceCacheKey(parts: {
106
119
  readonly target: CacheTargetIdentity;
107
120
  readonly signature: TraceCallSignature;
108
121
  readonly callIndex: number;
122
+ readonly agent: CacheAgentIdentity;
109
123
  readonly policyVersion: string;
110
124
  }): TraceCacheKey;
111
125
  /** SHA-256/JCS of one key, used as both the entry digest and its file name. */
112
126
  export declare function traceCacheKeyHash(key: TraceCacheKey): string;
113
- //# sourceMappingURL=identity.d.ts.map