e2e 0.15.1 → 0.16.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 (1019) hide show
  1. package/README.md +51 -24
  2. package/dist/.build.json +1 -1
  3. package/dist/agent/act-validation.d.ts +10 -1
  4. package/dist/agent/act-validation.js +48 -1
  5. package/dist/agent/act.d.ts +1 -2
  6. package/dist/agent/act.js +25 -8
  7. package/dist/agent/action-dispatcher.d.ts +0 -1
  8. package/dist/agent/action-dispatcher.js +0 -1
  9. package/dist/agent/action-names.d.ts +0 -1
  10. package/dist/agent/action-names.js +0 -1
  11. package/dist/agent/actions.d.ts +0 -1
  12. package/dist/agent/actions.js +0 -1
  13. package/dist/agent/agent-brand.d.ts +0 -1
  14. package/dist/agent/agent-brand.js +0 -1
  15. package/dist/agent/ai-sdk.d.ts +7 -1
  16. package/dist/agent/ai-sdk.js +11 -1
  17. package/dist/agent/call-options.d.ts +0 -1
  18. package/dist/agent/call-options.js +0 -1
  19. package/dist/agent/default-agent.d.ts +0 -1
  20. package/dist/agent/default-agent.js +0 -1
  21. package/dist/agent/derived.d.ts +0 -1
  22. package/dist/agent/derived.js +0 -1
  23. package/dist/agent/error.d.ts +16 -4
  24. package/dist/agent/error.js +25 -7
  25. package/dist/agent/executor.d.ts +0 -1
  26. package/dist/agent/executor.js +0 -1
  27. package/dist/agent/index.d.ts +0 -1
  28. package/dist/agent/index.js +0 -1
  29. package/dist/agent/interactive-step.d.ts +0 -1
  30. package/dist/agent/interactive-step.js +0 -1
  31. package/dist/agent/invocation.d.ts +0 -1
  32. package/dist/agent/invocation.js +10 -5
  33. package/dist/agent/ledger.d.ts +0 -1
  34. package/dist/agent/ledger.js +0 -1
  35. package/dist/agent/loop-guards.d.ts +0 -1
  36. package/dist/agent/loop-guards.js +0 -1
  37. package/dist/agent/model/adapter.d.ts +0 -1
  38. package/dist/agent/model/adapter.js +0 -1
  39. package/dist/agent/model/overflow.d.ts +0 -1
  40. package/dist/agent/model/overflow.js +0 -1
  41. package/dist/agent/model/provider-hints.d.ts +0 -1
  42. package/dist/agent/model/provider-hints.js +0 -1
  43. package/dist/agent/model/schema.d.ts +0 -1
  44. package/dist/agent/model/schema.js +0 -1
  45. package/dist/agent/model/sdk.d.ts +0 -1
  46. package/dist/agent/model/sdk.js +0 -1
  47. package/dist/agent/model/stall.d.ts +0 -1
  48. package/dist/agent/model/stall.js +0 -1
  49. package/dist/agent/model/tool-choice.d.ts +24 -2
  50. package/dist/agent/model/tool-choice.js +27 -2
  51. package/dist/agent/observation-budget.d.ts +0 -1
  52. package/dist/agent/observation-budget.js +0 -1
  53. package/dist/agent/observation-feed.d.ts +0 -1
  54. package/dist/agent/observation-feed.js +0 -1
  55. package/dist/agent/observation.d.ts +0 -1
  56. package/dist/agent/observation.js +0 -1
  57. package/dist/agent/operation-queue.d.ts +0 -1
  58. package/dist/agent/operation-queue.js +0 -1
  59. package/dist/agent/phases.d.ts +0 -1
  60. package/dist/agent/phases.js +0 -1
  61. package/dist/agent/pixels.d.ts +0 -1
  62. package/dist/agent/pixels.js +0 -1
  63. package/dist/agent/point-tap.d.ts +0 -1
  64. package/dist/agent/point-tap.js +0 -1
  65. package/dist/agent/primitives.d.ts +6 -1
  66. package/dist/agent/primitives.js +4 -2
  67. package/dist/agent/prompts.d.ts +0 -1
  68. package/dist/agent/prompts.js +0 -1
  69. package/dist/agent/protocol.d.ts +0 -1
  70. package/dist/agent/protocol.js +0 -1
  71. package/dist/agent/public.d.ts +0 -1
  72. package/dist/agent/public.js +0 -1
  73. package/dist/agent/reading.d.ts +0 -1
  74. package/dist/agent/reading.js +0 -1
  75. package/dist/agent/replay.d.ts +0 -1
  76. package/dist/agent/replay.js +0 -1
  77. package/dist/agent/screen-update.d.ts +0 -1
  78. package/dist/agent/screen-update.js +0 -1
  79. package/dist/agent/scroll-target.d.ts +0 -1
  80. package/dist/agent/scroll-target.js +0 -1
  81. package/dist/agent/secrets.d.ts +0 -1
  82. package/dist/agent/secrets.js +0 -1
  83. package/dist/agent/settle-policy.d.ts +0 -1
  84. package/dist/agent/settle-policy.js +0 -1
  85. package/dist/agent/step-accounting.d.ts +0 -1
  86. package/dist/agent/step-accounting.js +0 -1
  87. package/dist/agent/step-cache.d.ts +14 -4
  88. package/dist/agent/step-cache.js +13 -4
  89. package/dist/agent/tool-loop.d.ts +0 -1
  90. package/dist/agent/tool-loop.js +62 -10
  91. package/dist/agent/tool-output.d.ts +0 -1
  92. package/dist/agent/tool-output.js +0 -1
  93. package/dist/agent/tool.d.ts +0 -1
  94. package/dist/agent/tool.js +0 -1
  95. package/dist/agent/transcript-compaction.d.ts +0 -1
  96. package/dist/agent/transcript-compaction.js +0 -1
  97. package/dist/agent/upload-paths.d.ts +0 -1
  98. package/dist/agent/upload-paths.js +0 -1
  99. package/dist/agent/usage.d.ts +0 -1
  100. package/dist/agent/usage.js +0 -1
  101. package/dist/cache/anchors.d.ts +0 -1
  102. package/dist/cache/anchors.js +0 -1
  103. package/dist/cache/context.d.ts +19 -7
  104. package/dist/cache/context.js +15 -22
  105. package/dist/cache/decide.d.ts +0 -1
  106. package/dist/cache/decide.js +0 -1
  107. package/dist/cache/identity.d.ts +0 -1
  108. package/dist/cache/identity.js +0 -1
  109. package/dist/cache/recorder.d.ts +0 -1
  110. package/dist/cache/recorder.js +0 -1
  111. package/dist/cache/relocate.d.ts +0 -1
  112. package/dist/cache/relocate.js +0 -1
  113. package/dist/cache/route.d.ts +0 -1
  114. package/dist/cache/route.js +0 -1
  115. package/dist/cache/store.d.ts +0 -1
  116. package/dist/cache/store.js +0 -1
  117. package/dist/cache/template.d.ts +0 -1
  118. package/dist/cache/template.js +0 -1
  119. package/dist/cache/trace.d.ts +0 -1
  120. package/dist/cache/trace.js +0 -1
  121. package/dist/cli/bin.d.ts +0 -1
  122. package/dist/cli/bin.js +0 -1
  123. package/dist/cli/cache.d.ts +0 -1
  124. package/dist/cli/cache.js +0 -1
  125. package/dist/cli/docs-url.d.ts +0 -1
  126. package/dist/cli/docs-url.js +0 -1
  127. package/dist/cli/feedback.d.ts +0 -1
  128. package/dist/cli/feedback.js +0 -1
  129. package/dist/cli/guide.d.ts +0 -1
  130. package/dist/cli/guide.js +0 -1
  131. package/dist/cli/index.d.ts +0 -1
  132. package/dist/cli/index.js +2 -3
  133. package/dist/cli/init/agent-skill.d.ts +0 -1
  134. package/dist/cli/init/agent-skill.js +0 -1
  135. package/dist/cli/init/engines.d.ts +0 -1
  136. package/dist/cli/init/engines.js +0 -1
  137. package/dist/cli/init/gateways.d.ts +0 -1
  138. package/dist/cli/init/gateways.js +0 -1
  139. package/dist/cli/init/mcp-config.d.ts +0 -1
  140. package/dist/cli/init/mcp-config.js +0 -1
  141. package/dist/cli/init/package.d.ts +0 -1
  142. package/dist/cli/init/package.js +0 -1
  143. package/dist/cli/init/scaffold.d.ts +1 -1
  144. package/dist/cli/init/scaffold.js +2 -2
  145. package/dist/cli/init/sibling-versions.json +1 -1
  146. package/dist/cli/init/versions.d.ts +0 -1
  147. package/dist/cli/init/versions.js +0 -1
  148. package/dist/cli/init.d.ts +0 -1
  149. package/dist/cli/init.js +0 -1
  150. package/dist/cli/mcp.d.ts +9 -2
  151. package/dist/cli/mcp.js +14 -2
  152. package/dist/cli/signals.d.ts +0 -1
  153. package/dist/cli/signals.js +0 -1
  154. package/dist/cli/skill.d.ts +0 -1
  155. package/dist/cli/skill.js +0 -1
  156. package/dist/cli/telemetry.d.ts +0 -1
  157. package/dist/cli/telemetry.js +1 -2
  158. package/dist/cli/wordmark.d.ts +0 -1
  159. package/dist/cli/wordmark.js +0 -1
  160. package/dist/collect/collect.d.ts +0 -1
  161. package/dist/collect/collect.js +3 -2
  162. package/dist/collect/registry.d.ts +6 -3
  163. package/dist/collect/registry.js +31 -14
  164. package/dist/collect/select.d.ts +0 -1
  165. package/dist/collect/select.js +0 -1
  166. package/dist/config/agent.d.ts +0 -1
  167. package/dist/config/agent.js +0 -1
  168. package/dist/config/app.d.ts +0 -1
  169. package/dist/config/app.js +0 -1
  170. package/dist/config/command.d.ts +0 -1
  171. package/dist/config/command.js +0 -1
  172. package/dist/config/diagnose.d.ts +0 -1
  173. package/dist/config/diagnose.js +0 -1
  174. package/dist/config/esm-hooks.d.ts +0 -1
  175. package/dist/config/esm-hooks.js +0 -1
  176. package/dist/config/load.d.ts +0 -1
  177. package/dist/config/load.js +0 -1
  178. package/dist/config/resolve.d.ts +0 -1
  179. package/dist/config/resolve.js +0 -1
  180. package/dist/config/secrets.d.ts +0 -1
  181. package/dist/config/secrets.js +0 -1
  182. package/dist/config/targets.d.ts +0 -1
  183. package/dist/config/targets.js +0 -1
  184. package/dist/config/validate.d.ts +0 -1
  185. package/dist/config/validate.js +0 -1
  186. package/dist/engine/contract.d.ts +0 -1
  187. package/dist/engine/contract.js +0 -1
  188. package/dist/engine/index.d.ts +1 -2
  189. package/dist/engine/index.js +4 -4
  190. package/dist/engine/manifest.d.ts +0 -1
  191. package/dist/engine/manifest.js +0 -1
  192. package/dist/engine/recording.d.ts +0 -1
  193. package/dist/engine/recording.js +0 -1
  194. package/dist/engine/resolve.d.ts +0 -1
  195. package/dist/engine/resolve.js +0 -1
  196. package/dist/engine/session.d.ts +0 -1
  197. package/dist/engine/session.js +0 -1
  198. package/dist/engine/surface.d.ts +0 -1
  199. package/dist/engine/surface.js +0 -1
  200. package/dist/engine/timing.d.ts +0 -1
  201. package/dist/engine/timing.js +0 -1
  202. package/dist/expect/async.d.ts +0 -1
  203. package/dist/expect/async.js +99 -58
  204. package/dist/expect/attempt.d.ts +0 -1
  205. package/dist/expect/attempt.js +0 -1
  206. package/dist/expect/index.d.ts +0 -1
  207. package/dist/expect/index.js +0 -1
  208. package/dist/expect/poll.d.ts +0 -1
  209. package/dist/expect/poll.js +0 -1
  210. package/dist/expect/soft.d.ts +0 -1
  211. package/dist/expect/soft.js +0 -1
  212. package/dist/expect/values.d.ts +0 -1
  213. package/dist/expect/values.js +1 -2
  214. package/dist/explore/body.d.ts +0 -1
  215. package/dist/explore/body.js +0 -1
  216. package/dist/explore/executor.d.ts +0 -1
  217. package/dist/explore/executor.js +0 -1
  218. package/dist/explore/index.d.ts +0 -1
  219. package/dist/explore/index.js +16 -2
  220. package/dist/explore/plan.d.ts +0 -1
  221. package/dist/explore/plan.js +0 -1
  222. package/dist/explore/progress.d.ts +0 -1
  223. package/dist/explore/progress.js +0 -1
  224. package/dist/explore/state.d.ts +0 -1
  225. package/dist/explore/state.js +0 -1
  226. package/dist/index.d.ts +0 -1
  227. package/dist/index.js +0 -1
  228. package/dist/internal/ai-trace.d.ts +0 -1
  229. package/dist/internal/ai-trace.js +0 -1
  230. package/dist/internal/atomic-write.d.ts +0 -1
  231. package/dist/internal/atomic-write.js +0 -1
  232. package/dist/internal/brands.d.ts +0 -1
  233. package/dist/internal/brands.js +0 -1
  234. package/dist/internal/debug.d.ts +0 -1
  235. package/dist/internal/debug.js +0 -1
  236. package/dist/internal/env.d.ts +0 -1
  237. package/dist/internal/env.js +0 -1
  238. package/dist/internal/errors.d.ts +0 -1
  239. package/dist/internal/errors.js +0 -1
  240. package/dist/internal/geometry.d.ts +0 -1
  241. package/dist/internal/geometry.js +0 -1
  242. package/dist/internal/git.d.ts +0 -1
  243. package/dist/internal/git.js +0 -1
  244. package/dist/internal/globs.d.ts +0 -1
  245. package/dist/internal/globs.js +0 -1
  246. package/dist/internal/ids.d.ts +0 -1
  247. package/dist/internal/ids.js +0 -1
  248. package/dist/internal/json-value.d.ts +0 -1
  249. package/dist/internal/json-value.js +0 -1
  250. package/dist/internal/keys.d.ts +0 -1
  251. package/dist/internal/keys.js +0 -1
  252. package/dist/internal/node-version.d.ts +0 -1
  253. package/dist/internal/node-version.js +0 -1
  254. package/dist/internal/objects.d.ts +0 -1
  255. package/dist/internal/objects.js +0 -1
  256. package/dist/internal/options.d.ts +0 -1
  257. package/dist/internal/options.js +0 -1
  258. package/dist/internal/package-manager.d.ts +0 -1
  259. package/dist/internal/package-manager.js +0 -1
  260. package/dist/internal/package-version.d.ts +0 -1
  261. package/dist/internal/package-version.js +0 -1
  262. package/dist/internal/paths.d.ts +0 -1
  263. package/dist/internal/paths.js +0 -1
  264. package/dist/internal/realm-slot.d.ts +0 -1
  265. package/dist/internal/realm-slot.js +0 -1
  266. package/dist/internal/recording-modes.d.ts +0 -1
  267. package/dist/internal/recording-modes.js +0 -1
  268. package/dist/internal/redact.d.ts +0 -1
  269. package/dist/internal/redact.js +0 -1
  270. package/dist/internal/regexp.d.ts +0 -1
  271. package/dist/internal/regexp.js +0 -1
  272. package/dist/internal/roles.d.ts +0 -1
  273. package/dist/internal/roles.js +0 -1
  274. package/dist/internal/skip.d.ts +0 -1
  275. package/dist/internal/skip.js +0 -1
  276. package/dist/internal/source.d.ts +0 -1
  277. package/dist/internal/source.js +0 -1
  278. package/dist/internal/standard-schema.d.ts +0 -1
  279. package/dist/internal/standard-schema.js +0 -1
  280. package/dist/internal/suggest.d.ts +0 -1
  281. package/dist/internal/suggest.js +0 -1
  282. package/dist/internal/text.d.ts +8 -1
  283. package/dist/internal/text.js +13 -2
  284. package/dist/internal/time.d.ts +0 -1
  285. package/dist/internal/time.js +0 -1
  286. package/dist/internal/urls.d.ts +0 -1
  287. package/dist/internal/urls.js +0 -1
  288. package/dist/internal/vcs.d.ts +0 -1
  289. package/dist/internal/vcs.js +0 -1
  290. package/dist/internal/zip.d.ts +0 -1
  291. package/dist/internal/zip.js +0 -1
  292. package/dist/locator/engine.d.ts +0 -1
  293. package/dist/locator/engine.js +0 -1
  294. package/dist/locator/expression.d.ts +0 -1
  295. package/dist/locator/expression.js +0 -1
  296. package/dist/locator/screen.d.ts +0 -1
  297. package/dist/locator/screen.js +0 -1
  298. package/dist/mcp/catalog.d.ts +4 -1
  299. package/dist/mcp/catalog.js +2 -3
  300. package/dist/mcp/config.d.ts +0 -1
  301. package/dist/mcp/config.js +0 -1
  302. package/dist/mcp/recording.d.ts +0 -1
  303. package/dist/mcp/recording.js +0 -1
  304. package/dist/mcp/server.d.ts +8 -1
  305. package/dist/mcp/server.js +8 -5
  306. package/dist/mcp/session.d.ts +4 -2
  307. package/dist/mcp/session.js +43 -21
  308. package/dist/mcp/sessions.d.ts +2 -1
  309. package/dist/mcp/sessions.js +5 -2
  310. package/dist/mcp/tools.d.ts +7 -6
  311. package/dist/mcp/tools.js +36 -11
  312. package/dist/mcp/usage.d.ts +61 -0
  313. package/dist/mcp/usage.js +73 -0
  314. package/dist/oauth/callback-server.d.ts +0 -1
  315. package/dist/oauth/callback-server.js +0 -1
  316. package/dist/oauth/chatgpt.d.ts +0 -1
  317. package/dist/oauth/chatgpt.js +0 -1
  318. package/dist/oauth/cli.d.ts +0 -1
  319. package/dist/oauth/cli.js +0 -1
  320. package/dist/oauth/copilot.d.ts +0 -1
  321. package/dist/oauth/copilot.js +0 -1
  322. package/dist/oauth/device-code.d.ts +0 -1
  323. package/dist/oauth/device-code.js +0 -1
  324. package/dist/oauth/errors.d.ts +0 -1
  325. package/dist/oauth/errors.js +0 -1
  326. package/dist/oauth/fetch.d.ts +0 -1
  327. package/dist/oauth/fetch.js +0 -1
  328. package/dist/oauth/grok.d.ts +0 -1
  329. package/dist/oauth/grok.js +0 -1
  330. package/dist/oauth/jwt.d.ts +0 -1
  331. package/dist/oauth/jwt.js +0 -1
  332. package/dist/oauth/login.d.ts +0 -1
  333. package/dist/oauth/login.js +0 -1
  334. package/dist/oauth/models.d.ts +0 -1
  335. package/dist/oauth/models.js +0 -1
  336. package/dist/oauth/pkce.d.ts +0 -1
  337. package/dist/oauth/pkce.js +0 -1
  338. package/dist/oauth/providers/github-copilot.d.ts +0 -1
  339. package/dist/oauth/providers/github-copilot.js +10 -3
  340. package/dist/oauth/providers/openai.d.ts +0 -1
  341. package/dist/oauth/providers/openai.js +1 -2
  342. package/dist/oauth/providers/xai.d.ts +0 -1
  343. package/dist/oauth/providers/xai.js +0 -1
  344. package/dist/oauth/providers.d.ts +0 -1
  345. package/dist/oauth/providers.js +0 -1
  346. package/dist/oauth/sse.d.ts +0 -1
  347. package/dist/oauth/sse.js +0 -1
  348. package/dist/oauth/store.d.ts +0 -1
  349. package/dist/oauth/store.js +0 -1
  350. package/dist/oauth/token-endpoint.d.ts +0 -1
  351. package/dist/oauth/token-endpoint.js +0 -1
  352. package/dist/oauth/types.d.ts +0 -1
  353. package/dist/oauth/types.js +0 -1
  354. package/dist/params.d.ts +0 -1
  355. package/dist/params.js +0 -1
  356. package/dist/report/build.d.ts +0 -1
  357. package/dist/report/build.js +0 -1
  358. package/dist/report/builtin.d.ts +0 -1
  359. package/dist/report/builtin.js +0 -1
  360. package/dist/report/code-frame.d.ts +0 -1
  361. package/dist/report/code-frame.js +0 -1
  362. package/dist/report/debug-steps.d.ts +0 -1
  363. package/dist/report/debug-steps.js +0 -1
  364. package/dist/report/explore-text.d.ts +0 -1
  365. package/dist/report/explore-text.js +0 -1
  366. package/dist/report/failure-text.d.ts +0 -1
  367. package/dist/report/failure-text.js +0 -1
  368. package/dist/report/format.d.ts +0 -1
  369. package/dist/report/format.js +0 -1
  370. package/dist/report/json.d.ts +0 -1
  371. package/dist/report/json.js +0 -1
  372. package/dist/report/junit.d.ts +0 -1
  373. package/dist/report/junit.js +0 -1
  374. package/dist/report/list-explore.d.ts +0 -1
  375. package/dist/report/list-explore.js +0 -1
  376. package/dist/report/list-model.d.ts +0 -1
  377. package/dist/report/list-model.js +0 -1
  378. package/dist/report/list-steps.d.ts +0 -1
  379. package/dist/report/list-steps.js +0 -1
  380. package/dist/report/list.d.ts +0 -1
  381. package/dist/report/list.js +0 -1
  382. package/dist/report/live-window.d.ts +0 -1
  383. package/dist/report/live-window.js +0 -1
  384. package/dist/report/markdown-text.d.ts +0 -1
  385. package/dist/report/markdown-text.js +0 -1
  386. package/dist/report/markdown.d.ts +0 -1
  387. package/dist/report/markdown.js +0 -1
  388. package/dist/report/outcome.d.ts +0 -1
  389. package/dist/report/outcome.js +0 -1
  390. package/dist/report/repeats.d.ts +0 -1
  391. package/dist/report/repeats.js +0 -1
  392. package/dist/report/running-tree.d.ts +0 -1
  393. package/dist/report/running-tree.js +0 -1
  394. package/dist/report/write.d.ts +0 -1
  395. package/dist/report/write.js +0 -1
  396. package/dist/run/app-ports.d.ts +0 -1
  397. package/dist/run/app-ports.js +0 -1
  398. package/dist/run/artifacts.d.ts +0 -1
  399. package/dist/run/artifacts.js +0 -1
  400. package/dist/run/budget.d.ts +0 -1
  401. package/dist/run/budget.js +0 -1
  402. package/dist/run/declared-processes.d.ts +0 -1
  403. package/dist/run/declared-processes.js +0 -1
  404. package/dist/run/events.d.ts +0 -1
  405. package/dist/run/events.js +0 -1
  406. package/dist/run/execute.d.ts +0 -1
  407. package/dist/run/execute.js +27 -13
  408. package/dist/run/extended-fixtures.d.ts +0 -1
  409. package/dist/run/extended-fixtures.js +0 -1
  410. package/dist/run/failure-evidence.d.ts +0 -1
  411. package/dist/run/failure-evidence.js +0 -1
  412. package/dist/run/fixture-recording.d.ts +0 -1
  413. package/dist/run/fixture-recording.js +0 -1
  414. package/dist/run/fixtures.d.ts +0 -1
  415. package/dist/run/fixtures.js +0 -1
  416. package/dist/run/in-process.d.ts +0 -1
  417. package/dist/run/in-process.js +0 -1
  418. package/dist/run/last-run.d.ts +0 -1
  419. package/dist/run/last-run.js +0 -1
  420. package/dist/run/managed-process.d.ts +0 -1
  421. package/dist/run/managed-process.js +0 -1
  422. package/dist/run/output.d.ts +0 -1
  423. package/dist/run/output.js +0 -1
  424. package/dist/run/process-pool.d.ts +0 -1
  425. package/dist/run/process-pool.js +0 -1
  426. package/dist/run/provision.d.ts +0 -1
  427. package/dist/run/provision.js +0 -1
  428. package/dist/run/realm.d.ts +2 -1
  429. package/dist/run/realm.js +1 -2
  430. package/dist/run/records.d.ts +0 -1
  431. package/dist/run/records.js +0 -1
  432. package/dist/run/retry.d.ts +0 -1
  433. package/dist/run/retry.js +0 -1
  434. package/dist/run/runner.d.ts +2 -1
  435. package/dist/run/runner.js +1 -2
  436. package/dist/run/scheduler.d.ts +0 -1
  437. package/dist/run/scheduler.js +0 -1
  438. package/dist/run/secrecy.d.ts +15 -1
  439. package/dist/run/secrecy.js +27 -2
  440. package/dist/run/serial.d.ts +0 -1
  441. package/dist/run/serial.js +0 -1
  442. package/dist/run/sessions.d.ts +0 -1
  443. package/dist/run/sessions.js +0 -1
  444. package/dist/run/standalone.d.ts +0 -1
  445. package/dist/run/standalone.js +3 -3
  446. package/dist/run/steps.d.ts +2 -3
  447. package/dist/run/steps.js +4 -2
  448. package/dist/run/trace-redaction.d.ts +0 -1
  449. package/dist/run/trace-redaction.js +0 -1
  450. package/dist/run/unit-runner.d.ts +0 -1
  451. package/dist/run/unit-runner.js +0 -1
  452. package/dist/run/units.d.ts +0 -1
  453. package/dist/run/units.js +0 -1
  454. package/dist/run/worker/entry.d.ts +0 -1
  455. package/dist/run/worker/entry.js +2 -3
  456. package/dist/run/worker/handle.d.ts +0 -1
  457. package/dist/run/worker/handle.js +0 -1
  458. package/dist/run/worker/protocol.d.ts +0 -1
  459. package/dist/run/worker/protocol.js +0 -1
  460. package/dist/run/worker/session.d.ts +0 -1
  461. package/dist/run/worker/session.js +0 -1
  462. package/dist/run/worker-models.d.ts +0 -1
  463. package/dist/run/worker-models.js +0 -1
  464. package/dist/secrets.d.ts +0 -1
  465. package/dist/secrets.js +0 -1
  466. package/dist/telemetry/checkout.d.ts +0 -1
  467. package/dist/telemetry/checkout.js +0 -1
  468. package/dist/telemetry/environment.d.ts +0 -1
  469. package/dist/telemetry/environment.js +0 -1
  470. package/dist/telemetry/events.d.ts +26 -10
  471. package/dist/telemetry/events.js +107 -13
  472. package/dist/telemetry/failure-kind.d.ts +0 -1
  473. package/dist/telemetry/failure-kind.js +0 -1
  474. package/dist/telemetry/posthog.d.ts +0 -1
  475. package/dist/telemetry/posthog.js +0 -1
  476. package/dist/telemetry/project.d.ts +0 -1
  477. package/dist/telemetry/project.js +0 -1
  478. package/dist/telemetry/store.d.ts +0 -1
  479. package/dist/telemetry/store.js +0 -1
  480. package/dist/telemetry/telemetry.d.ts +19 -8
  481. package/dist/telemetry/telemetry.js +26 -9
  482. package/dist/telemetry/token.d.ts +0 -1
  483. package/dist/telemetry/token.js +0 -1
  484. package/dist/types.d.ts +26 -24
  485. package/dist/types.js +0 -1
  486. package/docs/agent-steps.mdx +126 -0
  487. package/docs/agents.mdx +217 -0
  488. package/docs/api-testing.mdx +65 -0
  489. package/docs/authentication.mdx +345 -0
  490. package/docs/browser.mdx +440 -0
  491. package/docs/bug-bash.mdx +90 -0
  492. package/docs/cache.mdx +306 -0
  493. package/docs/ci.mdx +210 -0
  494. package/docs/coding-agents.mdx +183 -0
  495. package/docs/debugging.mdx +291 -0
  496. package/docs/executors.mdx +243 -0
  497. package/docs/explore.mdx +174 -0
  498. package/docs/github.mdx +184 -0
  499. package/docs/index.mdx +82 -0
  500. package/docs/integrations/eas.mdx +216 -0
  501. package/docs/integrations/index.mdx +24 -0
  502. package/docs/integrations/kernel.mdx +163 -0
  503. package/docs/migrate/cypress.mdx +124 -0
  504. package/docs/migrate/detox.mdx +140 -0
  505. package/docs/migrate/maestro.mdx +229 -0
  506. package/docs/migrate/playwright.mdx +430 -0
  507. package/docs/migrate/selenium.mdx +110 -0
  508. package/docs/mobile-ci.mdx +567 -0
  509. package/docs/mobile.mdx +595 -0
  510. package/docs/models.mdx +241 -0
  511. package/docs/quickstart.mdx +260 -0
  512. package/docs/reference/agent.mdx +524 -0
  513. package/docs/reference/app.mdx +72 -0
  514. package/docs/reference/cli.mdx +819 -0
  515. package/docs/reference/config.mdx +986 -0
  516. package/docs/reference/engine.mdx +1363 -0
  517. package/docs/reference/environment.mdx +113 -0
  518. package/docs/reference/errors.mdx +143 -0
  519. package/docs/reference/expect.mdx +546 -0
  520. package/docs/reference/mcp.mdx +205 -0
  521. package/docs/reference/mobile.mdx +522 -0
  522. package/docs/reference/reporters.mdx +216 -0
  523. package/docs/reference/screen.mdx +688 -0
  524. package/docs/reference/test.mdx +449 -0
  525. package/docs/reference/web.mdx +615 -0
  526. package/docs/security.mdx +308 -0
  527. package/docs/starting-your-app.mdx +231 -0
  528. package/docs/subscriptions.mdx +166 -0
  529. package/docs/telemetry.mdx +227 -0
  530. package/docs/tools.mdx +150 -0
  531. package/docs/viewports.mdx +146 -0
  532. package/docs/writing-an-engine.mdx +316 -0
  533. package/docs/writing-tests.mdx +256 -0
  534. package/package.json +5 -3
  535. package/skills/e2e/SKILL.md +4 -1
  536. package/skills/e2e/references/agent.md +3 -1
  537. package/skills/e2e/references/mcp.md +3 -0
  538. package/skills/e2e/references/setup.md +19 -4
  539. package/skills/e2e/references/writing-tests.md +11 -0
  540. package/dist/agent/act-validation.d.ts.map +0 -1
  541. package/dist/agent/act-validation.js.map +0 -1
  542. package/dist/agent/act.d.ts.map +0 -1
  543. package/dist/agent/act.js.map +0 -1
  544. package/dist/agent/action-dispatcher.d.ts.map +0 -1
  545. package/dist/agent/action-dispatcher.js.map +0 -1
  546. package/dist/agent/action-names.d.ts.map +0 -1
  547. package/dist/agent/action-names.js.map +0 -1
  548. package/dist/agent/actions.d.ts.map +0 -1
  549. package/dist/agent/actions.js.map +0 -1
  550. package/dist/agent/agent-brand.d.ts.map +0 -1
  551. package/dist/agent/agent-brand.js.map +0 -1
  552. package/dist/agent/ai-sdk.d.ts.map +0 -1
  553. package/dist/agent/ai-sdk.js.map +0 -1
  554. package/dist/agent/call-options.d.ts.map +0 -1
  555. package/dist/agent/call-options.js.map +0 -1
  556. package/dist/agent/default-agent.d.ts.map +0 -1
  557. package/dist/agent/default-agent.js.map +0 -1
  558. package/dist/agent/derived.d.ts.map +0 -1
  559. package/dist/agent/derived.js.map +0 -1
  560. package/dist/agent/error.d.ts.map +0 -1
  561. package/dist/agent/error.js.map +0 -1
  562. package/dist/agent/executor.d.ts.map +0 -1
  563. package/dist/agent/executor.js.map +0 -1
  564. package/dist/agent/index.d.ts.map +0 -1
  565. package/dist/agent/index.js.map +0 -1
  566. package/dist/agent/interactive-step.d.ts.map +0 -1
  567. package/dist/agent/interactive-step.js.map +0 -1
  568. package/dist/agent/invocation.d.ts.map +0 -1
  569. package/dist/agent/invocation.js.map +0 -1
  570. package/dist/agent/ledger.d.ts.map +0 -1
  571. package/dist/agent/ledger.js.map +0 -1
  572. package/dist/agent/loop-guards.d.ts.map +0 -1
  573. package/dist/agent/loop-guards.js.map +0 -1
  574. package/dist/agent/model/adapter.d.ts.map +0 -1
  575. package/dist/agent/model/adapter.js.map +0 -1
  576. package/dist/agent/model/overflow.d.ts.map +0 -1
  577. package/dist/agent/model/overflow.js.map +0 -1
  578. package/dist/agent/model/provider-hints.d.ts.map +0 -1
  579. package/dist/agent/model/provider-hints.js.map +0 -1
  580. package/dist/agent/model/schema.d.ts.map +0 -1
  581. package/dist/agent/model/schema.js.map +0 -1
  582. package/dist/agent/model/sdk.d.ts.map +0 -1
  583. package/dist/agent/model/sdk.js.map +0 -1
  584. package/dist/agent/model/stall.d.ts.map +0 -1
  585. package/dist/agent/model/stall.js.map +0 -1
  586. package/dist/agent/model/tool-choice.d.ts.map +0 -1
  587. package/dist/agent/model/tool-choice.js.map +0 -1
  588. package/dist/agent/observation-budget.d.ts.map +0 -1
  589. package/dist/agent/observation-budget.js.map +0 -1
  590. package/dist/agent/observation-feed.d.ts.map +0 -1
  591. package/dist/agent/observation-feed.js.map +0 -1
  592. package/dist/agent/observation.d.ts.map +0 -1
  593. package/dist/agent/observation.js.map +0 -1
  594. package/dist/agent/operation-queue.d.ts.map +0 -1
  595. package/dist/agent/operation-queue.js.map +0 -1
  596. package/dist/agent/phases.d.ts.map +0 -1
  597. package/dist/agent/phases.js.map +0 -1
  598. package/dist/agent/pixels.d.ts.map +0 -1
  599. package/dist/agent/pixels.js.map +0 -1
  600. package/dist/agent/point-tap.d.ts.map +0 -1
  601. package/dist/agent/point-tap.js.map +0 -1
  602. package/dist/agent/primitives.d.ts.map +0 -1
  603. package/dist/agent/primitives.js.map +0 -1
  604. package/dist/agent/prompts.d.ts.map +0 -1
  605. package/dist/agent/prompts.js.map +0 -1
  606. package/dist/agent/protocol.d.ts.map +0 -1
  607. package/dist/agent/protocol.js.map +0 -1
  608. package/dist/agent/public.d.ts.map +0 -1
  609. package/dist/agent/public.js.map +0 -1
  610. package/dist/agent/reading.d.ts.map +0 -1
  611. package/dist/agent/reading.js.map +0 -1
  612. package/dist/agent/replay.d.ts.map +0 -1
  613. package/dist/agent/replay.js.map +0 -1
  614. package/dist/agent/screen-update.d.ts.map +0 -1
  615. package/dist/agent/screen-update.js.map +0 -1
  616. package/dist/agent/scroll-target.d.ts.map +0 -1
  617. package/dist/agent/scroll-target.js.map +0 -1
  618. package/dist/agent/secrets.d.ts.map +0 -1
  619. package/dist/agent/secrets.js.map +0 -1
  620. package/dist/agent/settle-policy.d.ts.map +0 -1
  621. package/dist/agent/settle-policy.js.map +0 -1
  622. package/dist/agent/step-accounting.d.ts.map +0 -1
  623. package/dist/agent/step-accounting.js.map +0 -1
  624. package/dist/agent/step-cache.d.ts.map +0 -1
  625. package/dist/agent/step-cache.js.map +0 -1
  626. package/dist/agent/tool-loop.d.ts.map +0 -1
  627. package/dist/agent/tool-loop.js.map +0 -1
  628. package/dist/agent/tool-output.d.ts.map +0 -1
  629. package/dist/agent/tool-output.js.map +0 -1
  630. package/dist/agent/tool.d.ts.map +0 -1
  631. package/dist/agent/tool.js.map +0 -1
  632. package/dist/agent/transcript-compaction.d.ts.map +0 -1
  633. package/dist/agent/transcript-compaction.js.map +0 -1
  634. package/dist/agent/upload-paths.d.ts.map +0 -1
  635. package/dist/agent/upload-paths.js.map +0 -1
  636. package/dist/agent/usage.d.ts.map +0 -1
  637. package/dist/agent/usage.js.map +0 -1
  638. package/dist/cache/anchors.d.ts.map +0 -1
  639. package/dist/cache/anchors.js.map +0 -1
  640. package/dist/cache/context.d.ts.map +0 -1
  641. package/dist/cache/context.js.map +0 -1
  642. package/dist/cache/decide.d.ts.map +0 -1
  643. package/dist/cache/decide.js.map +0 -1
  644. package/dist/cache/identity.d.ts.map +0 -1
  645. package/dist/cache/identity.js.map +0 -1
  646. package/dist/cache/recorder.d.ts.map +0 -1
  647. package/dist/cache/recorder.js.map +0 -1
  648. package/dist/cache/relocate.d.ts.map +0 -1
  649. package/dist/cache/relocate.js.map +0 -1
  650. package/dist/cache/route.d.ts.map +0 -1
  651. package/dist/cache/route.js.map +0 -1
  652. package/dist/cache/store.d.ts.map +0 -1
  653. package/dist/cache/store.js.map +0 -1
  654. package/dist/cache/template.d.ts.map +0 -1
  655. package/dist/cache/template.js.map +0 -1
  656. package/dist/cache/trace.d.ts.map +0 -1
  657. package/dist/cache/trace.js.map +0 -1
  658. package/dist/cli/bin.d.ts.map +0 -1
  659. package/dist/cli/bin.js.map +0 -1
  660. package/dist/cli/cache.d.ts.map +0 -1
  661. package/dist/cli/cache.js.map +0 -1
  662. package/dist/cli/docs-url.d.ts.map +0 -1
  663. package/dist/cli/docs-url.js.map +0 -1
  664. package/dist/cli/feedback.d.ts.map +0 -1
  665. package/dist/cli/feedback.js.map +0 -1
  666. package/dist/cli/guide.d.ts.map +0 -1
  667. package/dist/cli/guide.js.map +0 -1
  668. package/dist/cli/index.d.ts.map +0 -1
  669. package/dist/cli/index.js.map +0 -1
  670. package/dist/cli/init/agent-skill.d.ts.map +0 -1
  671. package/dist/cli/init/agent-skill.js.map +0 -1
  672. package/dist/cli/init/engines.d.ts.map +0 -1
  673. package/dist/cli/init/engines.js.map +0 -1
  674. package/dist/cli/init/gateways.d.ts.map +0 -1
  675. package/dist/cli/init/gateways.js.map +0 -1
  676. package/dist/cli/init/mcp-config.d.ts.map +0 -1
  677. package/dist/cli/init/mcp-config.js.map +0 -1
  678. package/dist/cli/init/package.d.ts.map +0 -1
  679. package/dist/cli/init/package.js.map +0 -1
  680. package/dist/cli/init/scaffold.d.ts.map +0 -1
  681. package/dist/cli/init/scaffold.js.map +0 -1
  682. package/dist/cli/init/versions.d.ts.map +0 -1
  683. package/dist/cli/init/versions.js.map +0 -1
  684. package/dist/cli/init.d.ts.map +0 -1
  685. package/dist/cli/init.js.map +0 -1
  686. package/dist/cli/mcp.d.ts.map +0 -1
  687. package/dist/cli/mcp.js.map +0 -1
  688. package/dist/cli/signals.d.ts.map +0 -1
  689. package/dist/cli/signals.js.map +0 -1
  690. package/dist/cli/skill.d.ts.map +0 -1
  691. package/dist/cli/skill.js.map +0 -1
  692. package/dist/cli/telemetry.d.ts.map +0 -1
  693. package/dist/cli/telemetry.js.map +0 -1
  694. package/dist/cli/wordmark.d.ts.map +0 -1
  695. package/dist/cli/wordmark.js.map +0 -1
  696. package/dist/collect/collect.d.ts.map +0 -1
  697. package/dist/collect/collect.js.map +0 -1
  698. package/dist/collect/registry.d.ts.map +0 -1
  699. package/dist/collect/registry.js.map +0 -1
  700. package/dist/collect/select.d.ts.map +0 -1
  701. package/dist/collect/select.js.map +0 -1
  702. package/dist/config/agent.d.ts.map +0 -1
  703. package/dist/config/agent.js.map +0 -1
  704. package/dist/config/app.d.ts.map +0 -1
  705. package/dist/config/app.js.map +0 -1
  706. package/dist/config/command.d.ts.map +0 -1
  707. package/dist/config/command.js.map +0 -1
  708. package/dist/config/diagnose.d.ts.map +0 -1
  709. package/dist/config/diagnose.js.map +0 -1
  710. package/dist/config/esm-hooks.d.ts.map +0 -1
  711. package/dist/config/esm-hooks.js.map +0 -1
  712. package/dist/config/load.d.ts.map +0 -1
  713. package/dist/config/load.js.map +0 -1
  714. package/dist/config/resolve.d.ts.map +0 -1
  715. package/dist/config/resolve.js.map +0 -1
  716. package/dist/config/secrets.d.ts.map +0 -1
  717. package/dist/config/secrets.js.map +0 -1
  718. package/dist/config/targets.d.ts.map +0 -1
  719. package/dist/config/targets.js.map +0 -1
  720. package/dist/config/validate.d.ts.map +0 -1
  721. package/dist/config/validate.js.map +0 -1
  722. package/dist/engine/contract.d.ts.map +0 -1
  723. package/dist/engine/contract.js.map +0 -1
  724. package/dist/engine/index.d.ts.map +0 -1
  725. package/dist/engine/index.js.map +0 -1
  726. package/dist/engine/manifest.d.ts.map +0 -1
  727. package/dist/engine/manifest.js.map +0 -1
  728. package/dist/engine/recording.d.ts.map +0 -1
  729. package/dist/engine/recording.js.map +0 -1
  730. package/dist/engine/resolve.d.ts.map +0 -1
  731. package/dist/engine/resolve.js.map +0 -1
  732. package/dist/engine/session.d.ts.map +0 -1
  733. package/dist/engine/session.js.map +0 -1
  734. package/dist/engine/surface.d.ts.map +0 -1
  735. package/dist/engine/surface.js.map +0 -1
  736. package/dist/engine/timing.d.ts.map +0 -1
  737. package/dist/engine/timing.js.map +0 -1
  738. package/dist/expect/async.d.ts.map +0 -1
  739. package/dist/expect/async.js.map +0 -1
  740. package/dist/expect/attempt.d.ts.map +0 -1
  741. package/dist/expect/attempt.js.map +0 -1
  742. package/dist/expect/index.d.ts.map +0 -1
  743. package/dist/expect/index.js.map +0 -1
  744. package/dist/expect/poll.d.ts.map +0 -1
  745. package/dist/expect/poll.js.map +0 -1
  746. package/dist/expect/soft.d.ts.map +0 -1
  747. package/dist/expect/soft.js.map +0 -1
  748. package/dist/expect/values.d.ts.map +0 -1
  749. package/dist/expect/values.js.map +0 -1
  750. package/dist/explore/body.d.ts.map +0 -1
  751. package/dist/explore/body.js.map +0 -1
  752. package/dist/explore/executor.d.ts.map +0 -1
  753. package/dist/explore/executor.js.map +0 -1
  754. package/dist/explore/index.d.ts.map +0 -1
  755. package/dist/explore/index.js.map +0 -1
  756. package/dist/explore/plan.d.ts.map +0 -1
  757. package/dist/explore/plan.js.map +0 -1
  758. package/dist/explore/progress.d.ts.map +0 -1
  759. package/dist/explore/progress.js.map +0 -1
  760. package/dist/explore/state.d.ts.map +0 -1
  761. package/dist/explore/state.js.map +0 -1
  762. package/dist/index.d.ts.map +0 -1
  763. package/dist/index.js.map +0 -1
  764. package/dist/internal/ai-trace.d.ts.map +0 -1
  765. package/dist/internal/ai-trace.js.map +0 -1
  766. package/dist/internal/atomic-write.d.ts.map +0 -1
  767. package/dist/internal/atomic-write.js.map +0 -1
  768. package/dist/internal/brands.d.ts.map +0 -1
  769. package/dist/internal/brands.js.map +0 -1
  770. package/dist/internal/debug.d.ts.map +0 -1
  771. package/dist/internal/debug.js.map +0 -1
  772. package/dist/internal/env.d.ts.map +0 -1
  773. package/dist/internal/env.js.map +0 -1
  774. package/dist/internal/errors.d.ts.map +0 -1
  775. package/dist/internal/errors.js.map +0 -1
  776. package/dist/internal/geometry.d.ts.map +0 -1
  777. package/dist/internal/geometry.js.map +0 -1
  778. package/dist/internal/git.d.ts.map +0 -1
  779. package/dist/internal/git.js.map +0 -1
  780. package/dist/internal/globs.d.ts.map +0 -1
  781. package/dist/internal/globs.js.map +0 -1
  782. package/dist/internal/ids.d.ts.map +0 -1
  783. package/dist/internal/ids.js.map +0 -1
  784. package/dist/internal/json-value.d.ts.map +0 -1
  785. package/dist/internal/json-value.js.map +0 -1
  786. package/dist/internal/keys.d.ts.map +0 -1
  787. package/dist/internal/keys.js.map +0 -1
  788. package/dist/internal/node-version.d.ts.map +0 -1
  789. package/dist/internal/node-version.js.map +0 -1
  790. package/dist/internal/objects.d.ts.map +0 -1
  791. package/dist/internal/objects.js.map +0 -1
  792. package/dist/internal/options.d.ts.map +0 -1
  793. package/dist/internal/options.js.map +0 -1
  794. package/dist/internal/package-manager.d.ts.map +0 -1
  795. package/dist/internal/package-manager.js.map +0 -1
  796. package/dist/internal/package-version.d.ts.map +0 -1
  797. package/dist/internal/package-version.js.map +0 -1
  798. package/dist/internal/paths.d.ts.map +0 -1
  799. package/dist/internal/paths.js.map +0 -1
  800. package/dist/internal/realm-slot.d.ts.map +0 -1
  801. package/dist/internal/realm-slot.js.map +0 -1
  802. package/dist/internal/recording-modes.d.ts.map +0 -1
  803. package/dist/internal/recording-modes.js.map +0 -1
  804. package/dist/internal/redact.d.ts.map +0 -1
  805. package/dist/internal/redact.js.map +0 -1
  806. package/dist/internal/regexp.d.ts.map +0 -1
  807. package/dist/internal/regexp.js.map +0 -1
  808. package/dist/internal/roles.d.ts.map +0 -1
  809. package/dist/internal/roles.js.map +0 -1
  810. package/dist/internal/skip.d.ts.map +0 -1
  811. package/dist/internal/skip.js.map +0 -1
  812. package/dist/internal/source.d.ts.map +0 -1
  813. package/dist/internal/source.js.map +0 -1
  814. package/dist/internal/standard-schema.d.ts.map +0 -1
  815. package/dist/internal/standard-schema.js.map +0 -1
  816. package/dist/internal/suggest.d.ts.map +0 -1
  817. package/dist/internal/suggest.js.map +0 -1
  818. package/dist/internal/text.d.ts.map +0 -1
  819. package/dist/internal/text.js.map +0 -1
  820. package/dist/internal/time.d.ts.map +0 -1
  821. package/dist/internal/time.js.map +0 -1
  822. package/dist/internal/urls.d.ts.map +0 -1
  823. package/dist/internal/urls.js.map +0 -1
  824. package/dist/internal/vcs.d.ts.map +0 -1
  825. package/dist/internal/vcs.js.map +0 -1
  826. package/dist/internal/zip.d.ts.map +0 -1
  827. package/dist/internal/zip.js.map +0 -1
  828. package/dist/locator/engine.d.ts.map +0 -1
  829. package/dist/locator/engine.js.map +0 -1
  830. package/dist/locator/expression.d.ts.map +0 -1
  831. package/dist/locator/expression.js.map +0 -1
  832. package/dist/locator/screen.d.ts.map +0 -1
  833. package/dist/locator/screen.js.map +0 -1
  834. package/dist/mcp/catalog.d.ts.map +0 -1
  835. package/dist/mcp/catalog.js.map +0 -1
  836. package/dist/mcp/config.d.ts.map +0 -1
  837. package/dist/mcp/config.js.map +0 -1
  838. package/dist/mcp/recording.d.ts.map +0 -1
  839. package/dist/mcp/recording.js.map +0 -1
  840. package/dist/mcp/server.d.ts.map +0 -1
  841. package/dist/mcp/server.js.map +0 -1
  842. package/dist/mcp/session.d.ts.map +0 -1
  843. package/dist/mcp/session.js.map +0 -1
  844. package/dist/mcp/sessions.d.ts.map +0 -1
  845. package/dist/mcp/sessions.js.map +0 -1
  846. package/dist/mcp/tools.d.ts.map +0 -1
  847. package/dist/mcp/tools.js.map +0 -1
  848. package/dist/oauth/callback-server.d.ts.map +0 -1
  849. package/dist/oauth/callback-server.js.map +0 -1
  850. package/dist/oauth/chatgpt.d.ts.map +0 -1
  851. package/dist/oauth/chatgpt.js.map +0 -1
  852. package/dist/oauth/cli.d.ts.map +0 -1
  853. package/dist/oauth/cli.js.map +0 -1
  854. package/dist/oauth/copilot.d.ts.map +0 -1
  855. package/dist/oauth/copilot.js.map +0 -1
  856. package/dist/oauth/device-code.d.ts.map +0 -1
  857. package/dist/oauth/device-code.js.map +0 -1
  858. package/dist/oauth/errors.d.ts.map +0 -1
  859. package/dist/oauth/errors.js.map +0 -1
  860. package/dist/oauth/fetch.d.ts.map +0 -1
  861. package/dist/oauth/fetch.js.map +0 -1
  862. package/dist/oauth/grok.d.ts.map +0 -1
  863. package/dist/oauth/grok.js.map +0 -1
  864. package/dist/oauth/jwt.d.ts.map +0 -1
  865. package/dist/oauth/jwt.js.map +0 -1
  866. package/dist/oauth/login.d.ts.map +0 -1
  867. package/dist/oauth/login.js.map +0 -1
  868. package/dist/oauth/models.d.ts.map +0 -1
  869. package/dist/oauth/models.js.map +0 -1
  870. package/dist/oauth/pkce.d.ts.map +0 -1
  871. package/dist/oauth/pkce.js.map +0 -1
  872. package/dist/oauth/providers/github-copilot.d.ts.map +0 -1
  873. package/dist/oauth/providers/github-copilot.js.map +0 -1
  874. package/dist/oauth/providers/openai.d.ts.map +0 -1
  875. package/dist/oauth/providers/openai.js.map +0 -1
  876. package/dist/oauth/providers/xai.d.ts.map +0 -1
  877. package/dist/oauth/providers/xai.js.map +0 -1
  878. package/dist/oauth/providers.d.ts.map +0 -1
  879. package/dist/oauth/providers.js.map +0 -1
  880. package/dist/oauth/sse.d.ts.map +0 -1
  881. package/dist/oauth/sse.js.map +0 -1
  882. package/dist/oauth/store.d.ts.map +0 -1
  883. package/dist/oauth/store.js.map +0 -1
  884. package/dist/oauth/token-endpoint.d.ts.map +0 -1
  885. package/dist/oauth/token-endpoint.js.map +0 -1
  886. package/dist/oauth/types.d.ts.map +0 -1
  887. package/dist/oauth/types.js.map +0 -1
  888. package/dist/params.d.ts.map +0 -1
  889. package/dist/params.js.map +0 -1
  890. package/dist/report/build.d.ts.map +0 -1
  891. package/dist/report/build.js.map +0 -1
  892. package/dist/report/builtin.d.ts.map +0 -1
  893. package/dist/report/builtin.js.map +0 -1
  894. package/dist/report/code-frame.d.ts.map +0 -1
  895. package/dist/report/code-frame.js.map +0 -1
  896. package/dist/report/debug-steps.d.ts.map +0 -1
  897. package/dist/report/debug-steps.js.map +0 -1
  898. package/dist/report/explore-text.d.ts.map +0 -1
  899. package/dist/report/explore-text.js.map +0 -1
  900. package/dist/report/failure-text.d.ts.map +0 -1
  901. package/dist/report/failure-text.js.map +0 -1
  902. package/dist/report/format.d.ts.map +0 -1
  903. package/dist/report/format.js.map +0 -1
  904. package/dist/report/json.d.ts.map +0 -1
  905. package/dist/report/json.js.map +0 -1
  906. package/dist/report/junit.d.ts.map +0 -1
  907. package/dist/report/junit.js.map +0 -1
  908. package/dist/report/list-explore.d.ts.map +0 -1
  909. package/dist/report/list-explore.js.map +0 -1
  910. package/dist/report/list-model.d.ts.map +0 -1
  911. package/dist/report/list-model.js.map +0 -1
  912. package/dist/report/list-steps.d.ts.map +0 -1
  913. package/dist/report/list-steps.js.map +0 -1
  914. package/dist/report/list.d.ts.map +0 -1
  915. package/dist/report/list.js.map +0 -1
  916. package/dist/report/live-window.d.ts.map +0 -1
  917. package/dist/report/live-window.js.map +0 -1
  918. package/dist/report/markdown-text.d.ts.map +0 -1
  919. package/dist/report/markdown-text.js.map +0 -1
  920. package/dist/report/markdown.d.ts.map +0 -1
  921. package/dist/report/markdown.js.map +0 -1
  922. package/dist/report/outcome.d.ts.map +0 -1
  923. package/dist/report/outcome.js.map +0 -1
  924. package/dist/report/repeats.d.ts.map +0 -1
  925. package/dist/report/repeats.js.map +0 -1
  926. package/dist/report/running-tree.d.ts.map +0 -1
  927. package/dist/report/running-tree.js.map +0 -1
  928. package/dist/report/write.d.ts.map +0 -1
  929. package/dist/report/write.js.map +0 -1
  930. package/dist/run/app-ports.d.ts.map +0 -1
  931. package/dist/run/app-ports.js.map +0 -1
  932. package/dist/run/artifacts.d.ts.map +0 -1
  933. package/dist/run/artifacts.js.map +0 -1
  934. package/dist/run/budget.d.ts.map +0 -1
  935. package/dist/run/budget.js.map +0 -1
  936. package/dist/run/declared-processes.d.ts.map +0 -1
  937. package/dist/run/declared-processes.js.map +0 -1
  938. package/dist/run/events.d.ts.map +0 -1
  939. package/dist/run/events.js.map +0 -1
  940. package/dist/run/execute.d.ts.map +0 -1
  941. package/dist/run/execute.js.map +0 -1
  942. package/dist/run/extended-fixtures.d.ts.map +0 -1
  943. package/dist/run/extended-fixtures.js.map +0 -1
  944. package/dist/run/failure-evidence.d.ts.map +0 -1
  945. package/dist/run/failure-evidence.js.map +0 -1
  946. package/dist/run/fixture-recording.d.ts.map +0 -1
  947. package/dist/run/fixture-recording.js.map +0 -1
  948. package/dist/run/fixtures.d.ts.map +0 -1
  949. package/dist/run/fixtures.js.map +0 -1
  950. package/dist/run/in-process.d.ts.map +0 -1
  951. package/dist/run/in-process.js.map +0 -1
  952. package/dist/run/last-run.d.ts.map +0 -1
  953. package/dist/run/last-run.js.map +0 -1
  954. package/dist/run/managed-process.d.ts.map +0 -1
  955. package/dist/run/managed-process.js.map +0 -1
  956. package/dist/run/output.d.ts.map +0 -1
  957. package/dist/run/output.js.map +0 -1
  958. package/dist/run/process-pool.d.ts.map +0 -1
  959. package/dist/run/process-pool.js.map +0 -1
  960. package/dist/run/provision.d.ts.map +0 -1
  961. package/dist/run/provision.js.map +0 -1
  962. package/dist/run/realm.d.ts.map +0 -1
  963. package/dist/run/realm.js.map +0 -1
  964. package/dist/run/records.d.ts.map +0 -1
  965. package/dist/run/records.js.map +0 -1
  966. package/dist/run/retry.d.ts.map +0 -1
  967. package/dist/run/retry.js.map +0 -1
  968. package/dist/run/runner.d.ts.map +0 -1
  969. package/dist/run/runner.js.map +0 -1
  970. package/dist/run/scheduler.d.ts.map +0 -1
  971. package/dist/run/scheduler.js.map +0 -1
  972. package/dist/run/secrecy.d.ts.map +0 -1
  973. package/dist/run/secrecy.js.map +0 -1
  974. package/dist/run/serial.d.ts.map +0 -1
  975. package/dist/run/serial.js.map +0 -1
  976. package/dist/run/sessions.d.ts.map +0 -1
  977. package/dist/run/sessions.js.map +0 -1
  978. package/dist/run/standalone.d.ts.map +0 -1
  979. package/dist/run/standalone.js.map +0 -1
  980. package/dist/run/steps.d.ts.map +0 -1
  981. package/dist/run/steps.js.map +0 -1
  982. package/dist/run/trace-redaction.d.ts.map +0 -1
  983. package/dist/run/trace-redaction.js.map +0 -1
  984. package/dist/run/unit-runner.d.ts.map +0 -1
  985. package/dist/run/unit-runner.js.map +0 -1
  986. package/dist/run/units.d.ts.map +0 -1
  987. package/dist/run/units.js.map +0 -1
  988. package/dist/run/worker/entry.d.ts.map +0 -1
  989. package/dist/run/worker/entry.js.map +0 -1
  990. package/dist/run/worker/handle.d.ts.map +0 -1
  991. package/dist/run/worker/handle.js.map +0 -1
  992. package/dist/run/worker/protocol.d.ts.map +0 -1
  993. package/dist/run/worker/protocol.js.map +0 -1
  994. package/dist/run/worker/session.d.ts.map +0 -1
  995. package/dist/run/worker/session.js.map +0 -1
  996. package/dist/run/worker-models.d.ts.map +0 -1
  997. package/dist/run/worker-models.js.map +0 -1
  998. package/dist/secrets.d.ts.map +0 -1
  999. package/dist/secrets.js.map +0 -1
  1000. package/dist/telemetry/checkout.d.ts.map +0 -1
  1001. package/dist/telemetry/checkout.js.map +0 -1
  1002. package/dist/telemetry/environment.d.ts.map +0 -1
  1003. package/dist/telemetry/environment.js.map +0 -1
  1004. package/dist/telemetry/events.d.ts.map +0 -1
  1005. package/dist/telemetry/events.js.map +0 -1
  1006. package/dist/telemetry/failure-kind.d.ts.map +0 -1
  1007. package/dist/telemetry/failure-kind.js.map +0 -1
  1008. package/dist/telemetry/posthog.d.ts.map +0 -1
  1009. package/dist/telemetry/posthog.js.map +0 -1
  1010. package/dist/telemetry/project.d.ts.map +0 -1
  1011. package/dist/telemetry/project.js.map +0 -1
  1012. package/dist/telemetry/store.d.ts.map +0 -1
  1013. package/dist/telemetry/store.js.map +0 -1
  1014. package/dist/telemetry/telemetry.d.ts.map +0 -1
  1015. package/dist/telemetry/telemetry.js.map +0 -1
  1016. package/dist/telemetry/token.d.ts.map +0 -1
  1017. package/dist/telemetry/token.js.map +0 -1
  1018. package/dist/types.d.ts.map +0 -1
  1019. package/dist/types.js.map +0 -1
@@ -0,0 +1,316 @@
1
+ ---
2
+ title: Writing an engine
3
+ description: Implement the e2e engine contract for another UI platform.
4
+ ---
5
+
6
+ An engine connects `screen`, `app`, and agent calls to a UI platform through
7
+ the `e2e/engine` contract. Use it to support a desktop app, a TV, or another
8
+ platform.
9
+
10
+ The existing `@e2e-dev/web` and `@e2e-dev/mobile` packages use the
11
+ same public `defineEngine` API. Read their implementations alongside this
12
+ guide for complete examples.
13
+
14
+ ## The ownership boundary
15
+
16
+ The runner manages tests and policy. The engine observes and controls the UI.
17
+
18
+ | Concern | Owner |
19
+ | --- | --- |
20
+ | Collection, targets, retries, hooks, sessions | runner |
21
+ | Query polling and strict single-match cardinality | runner |
22
+ | Assertion polling, step recording, timeouts | runner |
23
+ | One immediate query, one node read | engine |
24
+ | One node's actionability and input dispatch | engine |
25
+ | Agent planning, prompts, budgets, ledger | runner |
26
+ | Tool authorization and secret resolution | runner |
27
+ | Process, page, and device mechanics | engine |
28
+ | Source masking of secure observations | engine |
29
+ | Defense-in-depth redaction | runner |
30
+
31
+ `locate` must return the current matches immediately, including an empty
32
+ array when nothing matches. Do not add query retries or reject multiple
33
+ matches. The runner handles polling and single-match checks.
34
+
35
+ ## The shape of an engine
36
+
37
+ Return a handle from `defineEngine`. It validates the manifest and determines
38
+ the engine's capabilities when the config loads.
39
+
40
+ This skeleton assumes a `createClient` adapter for your platform. Its nodes
41
+ must follow the semantic tree contract described below.
42
+
43
+ ```ts title="src/index.ts"
44
+ import { ConfigurationError, defineEngine, resolveExpression, type EngineHandle } from 'e2e/engine';
45
+
46
+ export function hyperdrive(options: { device: string }): EngineHandle {
47
+ const client = createClient(options);
48
+ let bundleId = '';
49
+ return defineEngine({
50
+ name: 'hyperdrive',
51
+ version: '1.0.0',
52
+ spiVersion: 1,
53
+ platform: 'ios',
54
+ validateApp(app, { targetName }) {
55
+ if (app.bundleId === undefined) {
56
+ throw new ConfigurationError('INVALID_CONFIG', `target "${targetName}" needs app.bundleId`);
57
+ }
58
+ },
59
+ async init(info) {
60
+ bundleId = info.app.bundleId!;
61
+ await client.boot();
62
+ },
63
+ async dispose(context) { await client.shutdown({ signal: context.signal }); },
64
+ async observe() {
65
+ const screen = await client.snapshot();
66
+ return {
67
+ location: screen.title,
68
+ // One root with a stable id: `perform(root, swipe)` is the viewport swipe.
69
+ root: { ref: { id: 'root', revision: '' }, role: 'window', children: screen.nodes },
70
+ viewport: screen.viewport,
71
+ };
72
+ },
73
+ async locate(expression) {
74
+ const screen = await client.snapshot();
75
+ return resolveExpression(expression, screen.nodes);
76
+ },
77
+ actions: ['tap', 'fill', 'swipe'],
78
+ async perform(ref, action) {
79
+ switch (action.kind) {
80
+ case 'tap': return client.tap(ref.id);
81
+ case 'fill': return client.type(ref.id, action.value);
82
+ case 'swipe': return client.scroll(ref.id === 'root' ? undefined : ref.id, action.direction);
83
+ }
84
+ },
85
+ session: {
86
+ async back() { await client.back(); },
87
+ async restart() { await client.relaunch(bundleId); },
88
+ },
89
+ });
90
+ }
91
+ ```
92
+
93
+ ```ts title="e2e.config.ts"
94
+ targets: [{ name: 'phone', engine: hyperdrive({ device: 'iPhone 16' }), app: { bundleId: 'com.example.app' } }],
95
+ ```
96
+
97
+ `version` is required and forms part of the replay cache key. Change it when
98
+ engine behavior changes. With `perform`, also declare `actions` to list the
99
+ supported action kinds. `locate` answers `screen` queries; the exported
100
+ `resolveExpression` applies the standard query rules to a semantic tree.
101
+ The app under test is the target's `app`, not an engine option:
102
+ `validateApp` checks it at config load, and `prepare` and `init` receive it
103
+ as `info.app`. `session` provides methods to open or
104
+ restart it.
105
+
106
+ ## What an engine is not
107
+
108
+ Engines drive user interfaces. Use fixtures for supporting services such as
109
+ an inbox, a database, or a test API. Add those through
110
+ [`test.extend`](/reference/test#your-own-fixtures).
111
+
112
+ <Note>
113
+ Import shared types and helpers from `e2e/engine`, and declare `e2e` as a
114
+ peer dependency so the engine and runner share their error classes.
115
+ The public exports include errors, text and URL matching, assertion polling,
116
+ JSON validation, and cancellation helpers. There is no internal subpath.
117
+ </Note>
118
+
119
+ ## Capabilities
120
+
121
+ Implement the optional methods your platform supports. Their presence
122
+ determines the available capabilities. Calls to unsupported capabilities
123
+ fail with `UNSUPPORTED_CAPABILITY`. A useful engine starts with these:
124
+
125
+ | Member | Unlocks |
126
+ | --- | --- |
127
+ | `observe(context, options?)` | Agent observations and the replay cache |
128
+ | `perform(ref, action, context)` + `actions` | Node actions of the declared kinds, including viewport scrolling through `swipe` |
129
+ | `locate(expression, context)` | `screen`, `Locator`, and `expect(locator)` |
130
+ | `validateApp(app, info)` | A config-load check of the target's `app`: throw `INVALID_CONFIG` naming `info.targetName` for a field the platform needs or cannot drive. [Reference](/reference/engine#app) |
131
+ | `session.{open?,back?,restart?,reset?}` | `app.open()`, `app.back()`, `app.restart()`, `app.clearState()`, and the agent's `navigate` and `back` verbs |
132
+
133
+ Pointer actions, the keyboard, saved state, artifacts, and contributed
134
+ fixtures are optional capabilities of their own; the
135
+ [engine reference](/reference/engine#capabilities) lists every member.
136
+
137
+ `actions`, `location`, `pointer`, and `keyboard` require `observe`. The agent
138
+ receives only tools supported by the engine and the step's declared
139
+ credentials: each action kind you declare unlocks its verb (`hover` the
140
+ `hover` tool, `dragTo` the `drag` tool, `setInputFiles` the `upload` tool,
141
+ `check` with `uncheck` the `check` tool, and so on; the
142
+ [engine reference](/reference/engine#capabilities) lists the mapping).
143
+ Agent and locator actions both reach `perform` as a
144
+ `LocatorAction`. Throw `UNSUPPORTED_CAPABILITY` if a particular node cannot
145
+ support an otherwise declared action.
146
+
147
+ The agent's `scroll` and `screen.swipe()` call
148
+ `perform(root, { kind: 'swipe' })`. Keep the root id stable across observations.
149
+ A swipe on another node scrolls within that node.
150
+
151
+ Use the exported `parseKey` to interpret `press` keys such as `Enter` or
152
+ `ControlOrMeta+a`. The runner rejects invalid spellings with `INVALID_ARGUMENT`.
153
+ Map valid keys to your platform and throw `UNSUPPORTED_CAPABILITY` for keys
154
+ it cannot send. See the [key grammar](/reference/engine#keys).
155
+
156
+ An observation may include `location`, such as a URL, screen title, or window
157
+ name. The runner anchors replay cache entries on it and applies origin
158
+ checks when it parses as a URL.
159
+
160
+ `session.open` receives a URL already resolved by the runner. After `restart`
161
+ or `reset`, the runner reopens the configured address through `open`. If your
162
+ engine has no `open` method, relaunch the app within those hooks.
163
+
164
+ There is no separate secure-fill capability flag. Before dispatching a
165
+ secret fill, the runner checks the declared credential, current
166
+ observation, and compatible editable field. The engine receives a
167
+ `fill` action with `sensitive: true` and must handle it securely or throw
168
+ `UNSUPPORTED_CAPABILITY`. The runner then stops taking screenshots; see
169
+ [screenshots after a secret fill](/security#screenshots-after-a-secret-fill).
170
+
171
+ An engine option can take a secret too, such as a password the engine sends
172
+ the app. Accept `string | Secret` (tell them apart with `isSecret` from
173
+ `e2e/engine`), list each handle in the engine's `secrets`, and read the value
174
+ in `startAttempt` through `context.resolveSecret(secret)`. The config load
175
+ rejects a name no secret has, and the runner redacts the value from the
176
+ moment it resolves. When the app sees the value in another form (a header
177
+ that encodes it), return that form from `resolveSecret(secret, { derived })`
178
+ so it is redacted under the same name. The protection is text only: a
179
+ session whose engine resolved a secret keeps its screenshots and pixels. A config calls `secrets.get()` before any run exists, so
180
+ the handle is a reference by name until then.
181
+
182
+ ### Lifecycle
183
+
184
+ In the order they run:
185
+
186
+ - `prepare`: once per target in the runner process. Install runtimes here;
187
+ the `env` it returns reaches every worker.
188
+ - `init`: once per worker before its first attempt. Boot devices here.
189
+ - `startAttempt`: before each attempt. Create the test's UI.
190
+ - `settleAttempt`: after the body and again after teardown. Throw the error
191
+ of a test callback no step awaited, such as a dialog handler.
192
+ - `endAttempt`: after each attempt. Clean up the test's UI; it also runs
193
+ after a failed start, so make it idempotent.
194
+ - `dispose`: at worker shutdown, even if `init` never ran.
195
+ - `finish`: once per target after the last worker is gone, whenever
196
+ `prepare` ran. Release what `prepare` acquired.
197
+
198
+ Use `info.env` for spawned processes and `info.log` to report progress. The
199
+ [engine reference](/reference/engine#lifecycle) has each hook's arguments and
200
+ budgets.
201
+
202
+ ### Nodes and refs
203
+
204
+ `observe` returns a `SemanticNode` tree. `locate` returns the nodes matching
205
+ an expression. Assign ids that stay unique for the UI's lifetime and keep
206
+ the root id stable. The runner assigns revisions and checks staleness.
207
+ When `perform` receives `{ id, revision }`, look up the id and throw
208
+ `NODE_STALE` if the node no longer exists. When a match leaves the UI while
209
+ `locate` reads it, throw a retryable `NODE_STALE` too, never a node read from
210
+ what is gone: a removed element reports no size, and a node read from it would
211
+ pass `toBeHidden` while its replacement is on screen. The runner re-resolves
212
+ within the caller's deadline.
213
+
214
+ Limit snapshot size if the platform can return an unbounded tree. Set
215
+ `truncated` when the limit cuts off nodes so the runner knows the listing
216
+ is incomplete. Use the platform's accessible names for nodes.
217
+
218
+ Put test identifiers in `testId`, whether they come from a document attribute,
219
+ an iOS accessibility identifier, an Android resource id, or a desktop
220
+ automation id. The `testId` query matches only that field.
221
+
222
+ ### Vision-only surfaces
223
+
224
+ For a UI without a semantic tree, return a childless `root` and `pixels`
225
+ from `observe`. Implement `performAt` and declare the supported kinds in
226
+ `pointerActions`.
227
+
228
+ The agent receives the screenshot and can act through tools such as `tap_at`.
229
+ The runner passes points to `performAt` when no listed node occupies them.
230
+ Coordinate actions replay only at the recorded viewport size, and the runner
231
+ checks the recorded end state before accepting a replay.
232
+
233
+ ### Keyboard
234
+
235
+ Implement `keyboard` to type into a control after the agent focuses it.
236
+ `keyboard.type` must deliver the text as a person typing would, through the
237
+ platform's keyboard path, so that key events reach the app where the platform
238
+ has them: a browser engine dispatches `keydown`, `keypress`, `input`, and
239
+ `keyup` per character; a device engine sends the text through the device
240
+ keyboard. Inserting the value without keystrokes is not a compliant
241
+ implementation. It must throw `NOT_ACTIONABLE` when no editable control has
242
+ focus. Omit `dismiss` on platforms without an on-screen keyboard. The same
243
+ hook, after the `focus` action, is what `locator.pressSequentially` types
244
+ through; the harness composes the two and asks nothing more of the engine.
245
+
246
+ ### State is a credential
247
+
248
+ A `state` snapshot can contain authentication data such as cookies and tokens.
249
+ The runner encrypts it with a per-run key, binds it to the run, target,
250
+ engine, and app identity, and deletes it after the run.
251
+
252
+ Do not persist, cache, log, or include snapshots in errors. `restore` must
253
+ replace the app's entire persisted state instead of merging into it.
254
+
255
+ ### Errors
256
+
257
+ Throw `EngineError` with a code from the
258
+ [engine reference](/reference/engine). Only `NODE_STALE` and `FRAME_NOT_FOUND`
259
+ can be retryable. Use `ACTION_MAY_HAVE_COMMITTED` when an action may already
260
+ have taken effect so the runner does not repeat it.
261
+
262
+ `INVALID_STATE` maps to `APP_NOT_OPEN`, and `UNSUPPORTED_CAPABILITY` is a
263
+ configuration error. Unknown errors become infrastructure failures.
264
+
265
+ ## Contributed fixtures
266
+
267
+ Engines can contribute fixtures such as `browser` or `device`. Wrap their methods
268
+ with `context.fixture` to record calls as `<fixture>.<method>` steps with
269
+ their own artifacts and failures.
270
+
271
+ ```ts
272
+ fixtures: {
273
+ device: (context) => context.fixture('device', {
274
+ async setNetwork(state: 'online' | 'offline') { await client.network(state); },
275
+ async home() { await client.home(); },
276
+ }, {
277
+ setNetwork: { kind: 'resource', label: (state) => state },
278
+ home: { kind: 'resource' },
279
+ }),
280
+ },
281
+ ```
282
+
283
+ ```ts title="tests/fixtures.ts"
284
+ import { test as base } from 'e2e';
285
+ import type { Device } from 'e2e-engine-hyperdrive';
286
+
287
+ export const test = base.extend<{ device: Device }>();
288
+ ```
289
+
290
+ The fixture context provides URL policy checks, timeouts, operation budgets,
291
+ artifact attachment, and factories for locators and assertions. For example,
292
+ `expectable(target, factory)` adds matchers for `expect(fixture)`. See the
293
+ [engine reference](/reference/engine) for the full context.
294
+
295
+ ## Ship a tool pack
296
+
297
+ Platform operations the action vocabulary lacks can ship as a pack of
298
+ [project tools](/tools) built with `defineTool`, with `platforms` set so each
299
+ tool is offered only on compatible targets. `@e2e-dev/mobile/tools` is one
300
+ example.
301
+
302
+ ## Verify it
303
+
304
+ Run a test file against your engine. Check lifecycle order, observations,
305
+ actions, errors, and unsupported capabilities.
306
+ [`engine-contract.test.ts`](https://github.com/tester-army/e2e/blob/main/packages/e2e/tests/integration/engine-contract.test.ts)
307
+ demonstrates the runner's contract and provides examples for these checks.
308
+
309
+ <CardGroup cols={2}>
310
+ <Card title="Engine contract" icon="gear" href="/reference/engine">
311
+ Every type and hook of `e2e/engine`.
312
+ </Card>
313
+ <Card title="Mobile engine reference" icon="mobile-screen" href="/reference/mobile">
314
+ A complete device engine to read alongside.
315
+ </Card>
316
+ </CardGroup>
@@ -0,0 +1,256 @@
1
+ ---
2
+ title: Writing tests
3
+ description: Goals, checks, extraction, and the deterministic APIs.
4
+ ---
5
+
6
+ Use agent calls for goals and questions about the screen. Use `screen` and
7
+ `expect` when you know the exact action or value to check. A test can freely mix both.
8
+
9
+ ```ts title="tests/todos.e2e.ts"
10
+ import { test, expect } from 'e2e';
11
+
12
+ test('todos survive a filter round-trip', async ({ app, agent, screen }) => {
13
+ await app.open('/todos');
14
+
15
+ await agent.act('add todos "Buy milk" and "Walk the dog", complete the first');
16
+ await agent.assert('only one todo remains open');
17
+
18
+ await screen.getByRole('tab', 'Done').tap();
19
+ await expect(screen.getByTestId('todo')).toHaveCount(1);
20
+ });
21
+ ```
22
+
23
+ ## Goals: `agent.act`
24
+
25
+ Give `act` one goal. The agent chooses and performs the actions, then returns
26
+ when the goal passes or throws when it fails.
27
+
28
+ ```ts
29
+ await agent.act('complete checkout with the test card');
30
+ await agent.act('invite {email} as an editor', { params: { email: 'ada@example.test' } });
31
+ ```
32
+
33
+ Pass values through `params` so the agent uses your test data. For passwords,
34
+ use a `Secret`, this prevents the model from seeing your secrets. See [Signing in](/authentication).
35
+
36
+ ```ts
37
+ import { credentials } from 'e2e';
38
+
39
+ const member = credentials.user('member');
40
+ await agent.act('Sign in', {
41
+ params: { username: member.username, password: member.password },
42
+ });
43
+ ```
44
+
45
+ <Tip>
46
+ **Write instructions as you would say them out loud**
47
+
48
+ Name what is visible and prefer the exact wording on screen. One goal per
49
+ call. The flow inside a goal is the model's job; the order of goals is yours.
50
+ </Tip>
51
+
52
+ For a value that changes on every run, wrap it in `unique()` so the
53
+ [replay cache](/cache#what-must-match) can still replay the step:
54
+
55
+ ```ts
56
+ import { expect, unique } from 'e2e';
57
+
58
+ const email = `ada+${Date.now()}@example.test`;
59
+ await agent.act('sign up with email {email}', { params: { email: unique(email) } });
60
+ await expect(screen.getByText(email)).toBeVisible();
61
+ ```
62
+
63
+ If a goal fails, check the report and make the instruction more specific.
64
+ Use the labels on screen. Put vocabulary shared by several goals in the
65
+ agent's `context`; see [Agents and personas](/agents).
66
+
67
+ A step can pass, fail, or be blocked by something such as missing credentials.
68
+ [How agent steps work](/agent-steps#how-a-step-ends) explains the verdicts and
69
+ exit codes.
70
+
71
+ ## Checks: `assert`, `waitFor`, `extract`
72
+
73
+ `assert` checks a statement against the current screen. A false statement
74
+ fails with `ASSERTION_FAILED`. If the screen does not provide enough evidence,
75
+ it fails with `ASSERTION_INCONCLUSIVE`.
76
+
77
+ The judging model sees the statement and the current screen. It does not see
78
+ earlier steps or the acting agent's summaries.
79
+
80
+ ```ts
81
+ await agent.assert('the dashboard shows a trial badge');
82
+ ```
83
+
84
+ `assert` checks the screen now. Use `waitFor` when the condition may become true
85
+ later. It polls the screen and only calls the model when the observation changes.
86
+
87
+ ```ts
88
+ await agent.waitFor('the export finishes and a download link appears', {
89
+ interval: 500,
90
+ timeout: 120_000,
91
+ });
92
+ ```
93
+
94
+ `extract` reads structured data from the screen. Provide a
95
+ [Standard Schema](https://standardschema.dev) validator, such as Zod, to define
96
+ the result.
97
+
98
+ ```ts
99
+ import { z } from 'zod';
100
+
101
+ const data = await agent.extract('every todo title and how many remain', {
102
+ schema: z.object({ titles: z.array(z.string()), remaining: z.number().int() }),
103
+ });
104
+ expect(data.titles).toContain('Buy milk');
105
+ ```
106
+
107
+ <Tip>
108
+ For model-generated descriptions, check the relevant meaning rather than the
109
+ entire sentence. Use a locator assertion when the exact text matters.
110
+ </Tip>
111
+
112
+ ### Judging pixels
113
+
114
+ By default, judgments read a redacted text snapshot of the screen. Add
115
+ `vision: true` for visual checks, such as charts or layout. Use
116
+ `vision: 'only'` to judge the screenshot alone.
117
+
118
+ ```ts
119
+ await agent.assert('the chart trends upward', { vision: true });
120
+ await agent.assert('the search form is not covered by a banner', { vision: 'only' });
121
+ ```
122
+
123
+ `act` requests screenshots itself when it needs them, so it has no `vision`
124
+ option. On supported engines, it can tap and type at points in the image:
125
+
126
+ ```ts
127
+ await agent.act('enter the code 3141 on the drawn keypad and press OK');
128
+ ```
129
+
130
+ Images add input tokens. Screenshots are withheld for the rest of an attempt
131
+ after a secret is filled. The [agent reference](/reference/agent#vision)
132
+ lists the modes and restrictions.
133
+
134
+ ## Deterministic APIs: `screen` and `expect`
135
+
136
+ Use locators to interact with known controls and check exact values.
137
+ An `expect` after `act` checks the exact result. It is also what lets the
138
+ [replay cache](/cache) record the step and keep it.
139
+
140
+ ```ts
141
+ // Semantic queries: role and name first, label second, test ID last.
142
+ await screen.getByRole('button', 'Sign in').tap();
143
+ await screen.getByLabel('Email').fill('ada@example.test');
144
+ await screen.getByTestId('todo').first().tap();
145
+
146
+ // Scope into a row, gesture like a user:
147
+ const row = screen.getByRole('listitem').filter({ hasText: 'Design review' });
148
+ await row.getByRole('button', 'Archive').tap();
149
+ await screen.swipe({ direction: 'up', momentum: 'fast' });
150
+
151
+ // Coordinates, for what the tree does not list:
152
+ await screen.getByRole('image', 'Seat map').tap({ position: { x: 120, y: 48 } });
153
+ await screen.swipe({ from: { x: 300, y: 400 }, to: { x: 40, y: 400 } });
154
+
155
+ // Polling assertions:
156
+ await expect(screen.getByRole('status')).toHaveText('2 remaining');
157
+ await expect(screen.getByRole('heading', 'Dashboard')).toBeVisible();
158
+ ```
159
+
160
+ Actions and single-node reads or assertions fail when a query matches more
161
+ than one node. Narrow it with `.filter()`, `.first()`, or `.nth()`.
162
+ Locator assertions retry until they pass or time out. Direct reads such as
163
+ `textContent()` do not retry a mismatched value.
164
+
165
+ Use the `browser` fixture for browser features such as routes, cookies, dialogs,
166
+ frames, and downloads; see [Working with the browser](/browser). The
167
+ [screen reference](/reference/screen) lists every query and action.
168
+
169
+ Share setup and cleanup through `test.extend`. A fixture can create a test
170
+ workspace before the test and delete it afterward, including when the test
171
+ fails. See [Your own fixtures](/reference/test#your-own-fixtures).
172
+
173
+ ## Tests without a screen
174
+
175
+ A test that takes only `app` calls no model and drives no screen. Use it to
176
+ check your API with `fetch` in the same run as UI tests. See
177
+ [Testing APIs](/api-testing).
178
+
179
+ ## Structure
180
+
181
+ ```ts
182
+ import { beforeEach, describe, test } from 'e2e';
183
+
184
+ describe('billing', { tags: ['billing'] }, () => {
185
+ beforeEach(async ({ app }) => { await app.open('/billing'); });
186
+
187
+ test('upgrades', { retries: 2, timeout: 60_000 }, async ({ agent }) => {
188
+ await agent.act('upgrade to Pro');
189
+ });
190
+ });
191
+
192
+ test.skip('not ready yet', async () => {});
193
+ test.only('just this one while I work', async () => {}); // rejected in CI
194
+
195
+ test('needs two organizations', async ({ app }) => {
196
+ test.skip((await countOrganizations()) < 2, 'one organization: nothing to switch to');
197
+ await app.open('/organizations');
198
+ });
199
+ ```
200
+
201
+ `test.skip(condition, reason)` inside a body throws when the condition holds:
202
+ the test stops at that line and is reported `skipped`, as in Playwright. Call
203
+ it before the first step when it guards a precondition.
204
+
205
+ `describe` and the hooks are also `test.describe`, `test.beforeEach`, and so
206
+ on. A `beforeEach` imported from `e2e` sees the core fixtures; import
207
+ `test`, `describe`, and the hooks from `@e2e-dev/web` (or `@e2e-dev/mobile`)
208
+ to have `browser` (or `device`) typed from one import, and use
209
+ `test.beforeEach` on a `test` you extended with your own fixtures.
210
+
211
+ Common options include `timeout`, `retries`, and `tags`. Use `session` for
212
+ state from a setup test, `agentContext` for extra instructions, and `agent`
213
+ to choose a configured [agent](/agents). `trace` and `video` record one test
214
+ without recording the suite; see [Watch it happen](/debugging#watch-it-happen).
215
+ Group options apply to their tests. The [test reference](/reference/test)
216
+ lists all options and defaults.
217
+
218
+ Each test runs in its own attempt. Prepare the app data it needs through
219
+ fixtures or hooks. When a flow must span several tests, mark the group
220
+ `{ serial: true }`. Members share app state, run in order on one worker,
221
+ and retry as a whole.
222
+
223
+ ## Run one test
224
+
225
+ <CodeGroup>
226
+ ```bash npm
227
+ npx e2e run tests/signup.e2e.ts:12 # the test declared at line 12
228
+ npx e2e run --grep checkout # tests whose title matches
229
+ npx e2e run --target web # one target, by name
230
+ ```
231
+
232
+ ```bash pnpm
233
+ pnpm exec e2e run tests/signup.e2e.ts:12 # the test declared at line 12
234
+ pnpm exec e2e run --grep checkout # tests whose title matches
235
+ pnpm exec e2e run --target web # one target, by name
236
+ ```
237
+
238
+ ```bash bun
239
+ bunx e2e run tests/signup.e2e.ts:12 # the test declared at line 12
240
+ bunx e2e run --grep checkout # tests whose title matches
241
+ bunx e2e run --target web # one target, by name
242
+ ```
243
+ </CodeGroup>
244
+
245
+ The [CLI reference](/reference/cli#e2e-run) lists every flag.
246
+
247
+ ## Next
248
+
249
+ <CardGroup cols={2}>
250
+ <Card title="Signing in" icon="key" href="/authentication">
251
+ Sessions and secrets.
252
+ </Card>
253
+ <Card title="Agents and personas" icon="users" href="/agents">
254
+ Several agents in one suite, and running a flow as each of them.
255
+ </Card>
256
+ </CardGroup>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "e2e",
3
- "version": "0.15.1",
3
+ "version": "0.16.0",
4
4
  "description": "SDK, runner, and CLI for agentic end-to-end testing",
5
5
  "keywords": [
6
6
  "e2e",
@@ -69,6 +69,7 @@
69
69
  },
70
70
  "files": [
71
71
  "dist",
72
+ "docs",
72
73
  "schema/*.schema.json",
73
74
  "skills",
74
75
  "NOTICE"
@@ -76,7 +77,7 @@
76
77
  "dependencies": {
77
78
  "@ai-sdk/provider": "4.0.18",
78
79
  "@clack/prompts": "1.8.1",
79
- "@modelcontextprotocol/sdk": "1.30.1",
80
+ "@modelcontextprotocol/server": "2.2.0",
80
81
  "@vitest/expect": "5.0.2",
81
82
  "commander": "15.0.0",
82
83
  "picocolors": "1.1.1",
@@ -108,7 +109,8 @@
108
109
  "@ai-sdk/openai": "4.0.71",
109
110
  "@ai-sdk/openai-compatible": "3.0.53",
110
111
  "@ai-sdk/xai": "5.0.4",
111
- "@e2e-dev/web": "0.11.1",
112
+ "@e2e-dev/web": "0.11.2",
113
+ "@modelcontextprotocol/client": "2.2.0",
112
114
  "@openrouter/ai-sdk-provider": "3.1.0",
113
115
  "@types/node": "26.6.2",
114
116
  "@types/pngjs": "6.0.5",
@@ -58,7 +58,10 @@ test('a member upgrades to Pro', async ({ app, agent, screen, browser }) => {
58
58
 
59
59
  Read the topic for the job before writing code. The files sit next to this
60
60
  one; the installed CLI prints the same text with `npx e2e guide <topic>`
61
- (`e2e guide` alone prints this page).
61
+ (`e2e guide` alone prints this page). For anything the topics do not cover,
62
+ the full documentation ships in the `docs/` directory of the installed `e2e`
63
+ package (`node_modules/e2e/docs` in a single-package project); a link such as
64
+ `/reference/cli` is `docs/reference/cli.mdx`.
62
65
 
63
66
  | Topic | File | Read it when |
64
67
  | --- | --- | --- |
@@ -250,7 +250,9 @@ matches. Misses and hand-offs use the model; `agent.assert`,
250
250
  and share replays with CI and teammates (CI stays `read-only` unless
251
251
  `cache: 'read-write'` is set).
252
252
  - A failing run evicts the entries it implicates; `--no-cache` rules the
253
- cache out of a failure.
253
+ cache out of a failure. A cancelled run and a failure where no model
254
+ answered (`MODEL_PROVIDER_FAILED`, `MODEL_UNAVAILABLE`) implicate nothing
255
+ and evict nothing.
254
256
  - With committed recordings, `--strict-cache` in CI fails a recording that
255
257
  no longer replays with `REPLAY_STALE` instead of quietly spending model
256
258
  calls every run; re-record locally and commit. Unrecorded steps still run
@@ -20,6 +20,9 @@ Or declare it in the client's project config (`.mcp.json` for Claude Code,
20
20
  { "mcpServers": { "e2e": { "command": "npx", "args": ["e2e", "mcp"] } } }
21
21
  ```
22
22
 
23
+ No model is needed: without the optional `ai` package, sessions open and the
24
+ deterministic tools work.
25
+
23
26
  Flags: `--config <path>` names the default config file, `--target <name>`
24
27
  fixes the target every session opens on, `--headless` hides the browser or
25
28
  simulator (sessions are headed by default outside CI), `--max-sessions <n>`