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,986 @@
1
+ ---
2
+ title: E2EConfig
3
+ description: Every configuration key, its default, its valid range, and the environment variables.
4
+ ---
5
+
6
+ Export an object from `e2e.config.ts` and use `satisfies E2EConfig` to check
7
+ its shape without widening its inferred types. The runner also validates the
8
+ config when it loads, including ranges and rules TypeScript cannot check.
9
+
10
+ ```ts title="e2e.config.ts"
11
+ import type { E2EConfig } from 'e2e';
12
+ import { web } from '@e2e-dev/web';
13
+
14
+ export default {
15
+ targets: [
16
+ {
17
+ name: 'web',
18
+ engine: web({ browser: 'chromium' }),
19
+ app: { url: process.env.APP_URL ?? 'http://localhost:3000' },
20
+ },
21
+ ],
22
+ } satisfies E2EConfig;
23
+ ```
24
+
25
+ Unknown keys are rejected with `INVALID_CONFIG` at every level. There is no
26
+ top-level `app` key: each target declares the app it tests (see
27
+ [the app under test](#the-app-under-test)).
28
+
29
+ An optional key takes a value or is left out; `undefined` is not a value, so
30
+ `store: process.env.CACHE_URL && createStore(...)` fails to compile. Spread a
31
+ key that depends on the environment in only when it has a value:
32
+
33
+ ```ts
34
+ export default {
35
+ targets: [{ engine: web(), app: { url: 'http://localhost:3000' } }],
36
+ ...(process.env.CACHE_URL === undefined ? {} : { cache: { store: createStore(process.env.CACHE_URL) } }),
37
+ } satisfies E2EConfig;
38
+ ```
39
+
40
+ ## Loading
41
+
42
+ `--config <path>` selects an explicit file. Otherwise the runner searches the
43
+ working directory and each parent for `e2e.config.ts` or `e2e.config.mts`,
44
+ stopping at the repository root. Both names in one directory is
45
+ `CONFIG_AMBIGUOUS`. The selected file's directory is the project root.
46
+
47
+ The `tests` globs select files relative to the project root. An entry that
48
+ starts with `!` excludes: `tests: ['tests/**/*.e2e.ts', '!tests/wip/**']`
49
+ selects every test file except those under `tests/wip/`. A file is selected
50
+ when an including glob matches it and no exclusion does, whatever the order of
51
+ the list, and a list of only exclusions is `INVALID_CONFIG`. A glob names
52
+ files, so an entry with no wildcard that names a directory (`'!tests/wip'`)
53
+ is `INVALID_GLOB` naming the glob to write (`'!tests/wip/**'`). A file
54
+ passed to `e2e run` that an exclusion takes out is `NO_TESTS` naming that
55
+ entry. Discovery visits
56
+ only directories that could match, never enters one an exclusion takes whole,
57
+ skips `node_modules`, and ignores symlinks. A dot directory is included only
58
+ when a glob segment explicitly starts with a dot.
59
+
60
+ e2e loads no `.env` file itself. Load one at the top of `e2e.config.ts` with
61
+ Node's `process.loadEnvFile()`; every worker imports the config again, so the
62
+ variables reach the workers too:
63
+
64
+ ```ts title="e2e.config.ts"
65
+ process.loadEnvFile('.env');
66
+ ```
67
+
68
+ It throws when the file is missing; guard it with `existsSync` from
69
+ `node:fs` when only some machines have one.
70
+
71
+ Config and test files run as ESM whatever the nearest `package.json` `type`
72
+ says, and so does the TypeScript they import: a helper by path, or a
73
+ workspace package that exports its `.ts` source by name. An installed package
74
+ imported by name keeps its own format. A config or test written with `require`
75
+ or `module.exports` fails to load.
76
+
77
+ ## Top level
78
+
79
+ ```ts
80
+ export interface E2EConfig {
81
+ /** Stable project id, 1 through 256 characters; defaults to the root `package.json` name. */
82
+ projectId?: string;
83
+ /** The surfaces tests run on; required, at least one, each naming its engine. */
84
+ targets: readonly Target[];
85
+ /** Test file globs relative to the project root (`*`, `?`, and a whole `**` segment; a leading `!` excludes); default every `*.e2e.ts` under `tests/`. */
86
+ tests?: string | readonly string[];
87
+ /** Test attempt deadline in milliseconds; default 120000. */
88
+ timeout?: number;
89
+ /** Engine init and attempt start budget in milliseconds; default 60000. */
90
+ launchTimeout?: number;
91
+ /** Budget of every engine operation in milliseconds; default 30000. */
92
+ actionTimeout?: number;
93
+ /** Default `expect` deadline in milliseconds; default 5000. */
94
+ assertionTimeout?: number;
95
+ /** Budget of each `afterEach` hook, fixture teardown, and engine cleanup in milliseconds; default 30000. */
96
+ cleanupTimeout?: number;
97
+ /** Retries per test, 0 through 10; default 1 in CI, else 0. */
98
+ retries?: number;
99
+ /** Parallel workers, 1 through 1024; default 1 in CI, else half the cores. An engine may cap it lower. */
100
+ workers?: number;
101
+ /** `{ store }` hands every artifact to a host store as it is produced. */
102
+ artifacts?: ArtifactsConfig;
103
+ /**
104
+ * Which attempts record a trace; default `on`, `on-first-retry` in CI. A
105
+ * target's `trace` wins over it, `--trace [mode]` over both, and a test's
106
+ * own `trace` over all. Applies to the targets whose engine can trace.
107
+ */
108
+ trace?: RecordingMode;
109
+ /**
110
+ * Which attempts record a video; default `off`. A target's `video` wins
111
+ * over it, `--video [mode]` over both, and a test's own `video` over all.
112
+ * Applies to the targets whose engine can record.
113
+ */
114
+ video?: RecordingMode;
115
+ /**
116
+ * The results directory, relative to the project root; default `.e2e`.
117
+ * `--output <dir>` overrides it for one run.
118
+ */
119
+ output?: string;
120
+ /**
121
+ * Output renderers and reporter objects. `junit` writes `<output>/junit.xml`,
122
+ * `markdown` writes `<output>/summary.md`, `json` prints the report and
123
+ * excludes `list`; a `Reporter` object runs
124
+ * beside them and `--reporter` never removes it.
125
+ */
126
+ reporters?: readonly (BuiltinReporter | Reporter)[];
127
+ /**
128
+ * Named agents, each one plain object: the built-in agent's options, or
129
+ * `{ executor }` for a custom brain. Tests use `default` unless selected
130
+ * otherwise. No agent inherits another's values. Each worker constructs
131
+ * its own agents from this config module.
132
+ */
133
+ agents?: Readonly<Record<string, AgentConfig>>;
134
+ /**
135
+ * Replay cache mode or options. Defaults to `read-write` locally and
136
+ * `read-only` in CI. An explicit mode overrides the default;
137
+ * `--no-cache` disables caching for the run.
138
+ */
139
+ cache?: CacheMode | CacheConfig;
140
+ /**
141
+ * Named accounts. `credentials.user(name).password` is the handle of a
142
+ * credential's password, a secret named `<name>.password`; `secrets.get()`
143
+ * never returns it, so a credential and a secret may share a name.
144
+ */
145
+ credentials?: Readonly<Record<string, CredentialConfig>>;
146
+ /**
147
+ * Named values the model must never see: API keys, tokens, anything sourced
148
+ * from the environment. `secrets.get(name)` hands a test the opaque handle;
149
+ * the value is filled by the runner, masked in every observation, and
150
+ * redacted from logs, traces, and the report.
151
+ */
152
+ secrets?: Readonly<Record<string, SecretConfig>>;
153
+ }
154
+ ```
155
+
156
+ Every numeric value must be a safe integer. `projectId` falls back to
157
+ `unportable-<sha256 of the project root, 32 hex>` when there is no
158
+ `package.json`. `workers` never exceeds what a target's engine declares. A
159
+ targeted agent action is bounded by the smaller of `actionTimeout` and 15 s.
160
+
161
+ ## targets
162
+
163
+ ```ts
164
+ /**
165
+ * One named test target: the app under test and the engine that drives it.
166
+ * Without an engine, the target supports agent tools only.
167
+ */
168
+ export interface Target {
169
+ /** Label in reports and for `--target`; defaults to the platform. */
170
+ name?: string;
171
+ /**
172
+ * Platform label, inherited from the engine when omitted. Required for a
173
+ * target without an engine; when both name one, they must agree.
174
+ */
175
+ platform?: string;
176
+ /** The engine driving the surface: `web(...)`, `mobile(...)`, or any `defineEngine` handle. */
177
+ engine?: EngineHandle;
178
+ /** The app under test: what it is, where it is served, and the command that starts it. */
179
+ app?: TargetApp;
180
+ /**
181
+ * Which attempts on this target record a trace, in place of the config's
182
+ * `trace`; `--trace` and a test's own `trace` win over it. A mode set here
183
+ * is required of the engine: one that cannot trace fails the run with
184
+ * `UNSUPPORTED_ARTIFACT`.
185
+ */
186
+ trace?: RecordingMode;
187
+ /**
188
+ * Which attempts on this target record a video, in place of the config's
189
+ * `video`; `--video` and a test's own `video` win over it. A mode set here
190
+ * is required of the engine: one that cannot record fails the run with
191
+ * `UNSUPPORTED_ARTIFACT`.
192
+ */
193
+ video?: RecordingMode;
194
+ }
195
+ ```
196
+
197
+ `name` is the id `--target`, reports, sessions, and artifact paths use:
198
+ ASCII letters, digits, `_`, `-`, `.`, not only dots (`.` and `..` are path
199
+ segments), unique across targets.
200
+
201
+ `{ engine: web(), app: { url } }` is a complete target. Two targets on one
202
+ platform need names. A target without an engine runs through agent tools
203
+ only. Tests whose `requires` names a capability the target lacks are skipped
204
+ for it; a `test.setup` a selected test depends on must be runnable there or
205
+ selection fails with `COLLECTION_ERROR`.
206
+
207
+ ## The app under test
208
+
209
+ A target declares the app it tests in `app`; the engine only drives it. A
210
+ browser target names the URL it opens, a device target the installed app or
211
+ the build it launches. The runner resolves `app` at config load.
212
+
213
+ ```ts title="e2e.config.ts"
214
+ targets: [
215
+ {
216
+ name: 'web',
217
+ engine: web({ viewport: { width: 1440, height: 900 } }),
218
+ app: {
219
+ url: 'http://localhost:3000',
220
+ command: { executable: 'npm', args: ['run', 'dev'] },
221
+ readyUrl: 'http://localhost:3000/health',
222
+ },
223
+ },
224
+ {
225
+ name: 'ios',
226
+ engine: mobile({ platform: 'ios' }),
227
+ app: {
228
+ bundleId: 'com.example.app',
229
+ appPath: './build/App.app',
230
+ launchArguments: ['-e2e', 'YES'],
231
+ permissions: { camera: 'grant' },
232
+ },
233
+ },
234
+ ],
235
+ ```
236
+
237
+ | Key | Targets | Meaning |
238
+ | --- | --- | --- |
239
+ | `url` | web | Base URL: `app.open()` opens it and relative navigation resolves against it. WHATWG-normalized; no userinfo, query, or fragment; a missing scheme becomes `https://`, or `http://` for a loopback host. Plain HTTP is accepted for loopback hosts only. Port `0` on `127.0.0.1` or `[::1]` asks for a [free port](#free-ports) |
240
+ | `bundleId` | mobile | The installed app a device launches: a bundle id, an Android package name, or a display name the device resolves (`Settings`). A link is `INVALID_CONFIG`: a test opens one with `device.openLink` |
241
+ | `appPath` | mobile | The build the suite runs against, an iOS `.app` bundle or an Android `.apk`, resolved against the project root. Without `bundleId`, the app it installs is the one launched. See [the device engine](/reference/mobile#engine) for when it is installed |
242
+ | `identity` | any | Stable identity keying replay cache and session entries. Defaults to the URL's origin and base path, else `bundleId`, else `appPath`. Set a stable value to reuse entries across preview URLs or versioned build paths. Different apps must have different identities to prevent replay across them |
243
+ | `environment` | any | `test`, `staging`, or `production`. Labels the target in the report and joins the cache and session identity digest; never gates a run. Defaults to `test` for loopback, `.localhost`, and `.test` hosts and for an app without a URL, `production` otherwise |
244
+ | `launchArguments` | mobile | Arguments every fresh launch passes the app: `app.open()`, `app.restart()`, and `app.clearState()`. Arguments that select a build mode change what the app is: give each mode its own `identity` |
245
+ | `permissions` | mobile | Permissions the app holds on every fresh launch, by name, each `grant`, `deny`, or `reset`; see [permissions](/reference/mobile#engine) |
246
+ | `command` | any | Process the runner starts before the first test and stops on every exit path (a dev server, Metro for a debug build); see [command](#command). Targets declaring the same command share one process, probed at the first declaring target's `readyUrl` |
247
+ | `readyUrl` | any | URL polled until `command` is ready (a 200-499 status); defaults to `url`, and is required without one. `{port}` in it is the port of `url` |
248
+
249
+ Each engine checks the keys at config load, with `INVALID_CONFIG` naming
250
+ the target. A `web()` target needs `app.url` and refuses `bundleId`,
251
+ `appPath`, `launchArguments`, and `permissions`. A `mobile()` target needs
252
+ `app.bundleId` or `app.appPath`; `app.url` on a mobile target is not
253
+ supported yet. An unknown key in `app` or `app.command` fails with a
254
+ did-you-mean. A target with `app` and no engine is
255
+ `INVALID_CONFIG`.
256
+
257
+ The old spellings are unknown keys and fail at config load with
258
+ `INVALID_CONFIG`: `web({ url })` and the other app options of `web()` and
259
+ `mobile()`, `mobile({ app })` (now `app.bundleId`), an app key directly on the
260
+ target, a top-level `app` or `url`, and `services` anywhere, which this
261
+ version does not have.
262
+
263
+ Port `0` on any host other than `127.0.0.1` or `[::1]`, `localhost`
264
+ included, is `INVALID_APP_URL`, and a port-0 `url` with nothing to start on
265
+ it (no `app.command`) is `INVALID_CONFIG`. An `app.command` with neither
266
+ `app.url` nor `app.readyUrl` is `APP_URL_REQUIRED` at config load.
267
+
268
+ ### The app's site
269
+
270
+ A test or the agent may open any http(s) URL; `file:`, `data:`, and
271
+ `javascript:` are `POLICY_DENIED`. The site of `url`, its registrable domain
272
+ (`app.example.com` and `auth.example.com` are one site), scopes two things:
273
+ the browser engine's [`headers`](/reference/web#options) reach the
274
+ site and no other host, and child frames off the site stay out of
275
+ observations.
276
+
277
+ ### Free ports
278
+
279
+ A `url` on a literal loopback address with port `0` (`http://127.0.0.1:0`,
280
+ `http://[::1]:0`) asks the run for a free TCP port. The runner picks one when
281
+ the config loads and substitutes it wherever the declaration used the port:
282
+ the base URL, the default `readyUrl`, and the report. The command must take
283
+ the port through `{port}` in `args` or `env`.
284
+
285
+ ```ts title="e2e.config.ts"
286
+ engine: web(),
287
+ app: {
288
+ url: 'http://127.0.0.1:0',
289
+ command: { executable: 'pnpm', args: ['dev', '--port', '{port}'], env: { PORT: '{port}' } },
290
+ },
291
+ ```
292
+
293
+ `localhost:0` is `INVALID_APP_URL`: it may resolve to an address other than
294
+ the one the command binds. Write the address the command will bind.
295
+
296
+ Each target asking for port `0` gets its own port and its own process; two
297
+ targets that declare the same command on a fixed port share one. `{port}` in
298
+ `app.command` and `app.readyUrl` is the port of `url`. The default `identity`
299
+ derives from the declared `:0`, so cache and session entries do not churn
300
+ with the port. Tests read the allocated URL from
301
+ [`app.baseUrl`](/reference/app).
302
+
303
+ ### command
304
+
305
+ ```ts
306
+ export interface CommandConfig {
307
+ /** Resolved with `PATH`; never shell-interpreted. */
308
+ executable: string;
309
+ /** Passed verbatim; `{port}` expands to the app's port. */
310
+ args?: readonly string[];
311
+ /** Working directory, resolved from the project root. */
312
+ cwd?: string;
313
+ /** Added to the inherited set; `{port}` expands in values. */
314
+ env?: Readonly<Record<string, string>>;
315
+ /** Ready-probe budget in milliseconds; default 60000. Expiry is `APP_UNREACHABLE`. */
316
+ startupTimeout?: number;
317
+ /** Grace period before force-kill in milliseconds; default 10000. */
318
+ shutdownTimeout?: number;
319
+ /** File that receives the process's stdout and stderr, appended, resolved from the project root. Omitted discards output. */
320
+ log?: string;
321
+ /**
322
+ * When the readiness URL already answers before the command starts, use that
323
+ * process instead of spawning: nothing is started and nothing is stopped.
324
+ * Off by default; CI ignores it and always starts the command. A URL on a
325
+ * free port (port 0) can never already answer, so the two together are
326
+ * `INVALID_CONFIG`.
327
+ */
328
+ reuseExisting?: boolean;
329
+ }
330
+ ```
331
+
332
+ `log` must stay inside the project root and holds the raw, unredacted
333
+ output, so keep it in an ignored directory. A startup failure quotes the last
334
+ 20 lines appended since the command started, with `command.env` values
335
+ replaced by `<secret:NAME>` markers. Without `reuseExisting`, a `readyUrl`
336
+ that already answers is `APP_ALREADY_RUNNING`. `reuseExisting` on an app
337
+ whose `app.url` asks for port 0 is `INVALID_CONFIG`: a process already
338
+ running cannot serve the port the run assigns.
339
+
340
+ The child inherits only `PATH`, `HOME`, the temp-directory variables, and
341
+ `command.env`, so pass what the app needs explicitly. Every `args` entry and
342
+ `env` value is a string; anything else, a number or a `secrets.get()` handle
343
+ included, is `INVALID_CONFIG`, except an `undefined` `env` value, which is
344
+ dropped. The runner never terminates a process it did not start.
345
+
346
+ ### services
347
+
348
+ <Note>
349
+ Dependency processes (a database, an API mock, a dev server several targets
350
+ share) are not started by this version, and `services` is an unknown key
351
+ wherever it appears. Start them before the run, or have `app.command` start
352
+ a script that brings them up and serves the app. A services API returns in a
353
+ later release.
354
+ </Note>
355
+
356
+ ## output
357
+
358
+ ```ts
359
+ output: 'test-results/e2e',
360
+ ```
361
+
362
+ Everything a run writes about itself goes under one directory, `.e2e` by
363
+ default, resolved from the project root. `--output <dir>` on
364
+ [`e2e run`](/reference/cli#e2e-run) and `e2e explore` overrides it for one
365
+ run.
366
+
367
+ | Path under the output | What |
368
+ | --- | --- |
369
+ | `report.json` | The canonical report; `--last-failed` reads the one here |
370
+ | `junit.xml`, `summary.md`, `failures/` | The `junit` and `markdown` reporters' files |
371
+ | `ai-trace.json` | `--ai-trace` |
372
+ | `artifacts/` | Screenshots, traces, videos, downloads, and logs, one directory per attempt. Cleared once a run's tests start, so it holds the latest run's evidence and nothing its report no longer names |
373
+ | `sessions/` | The run's encrypted `test.setup` sessions, deleted when it ends |
374
+ | `videos/<session>/` | [`e2e mcp`](/reference/mcp#recording) session recordings |
375
+
376
+ A run that stops before its tests start writes nothing here: a selection
377
+ that matches no test (`NO_TESTS`, a mistyped `--grep`), a collection error,
378
+ a target that cannot record what it asks for (`UNSUPPORTED_ARTIFACT`),
379
+ `NO_LAST_RUN`, an app or service that fails to start, or an interrupt
380
+ leaves the previous run's `report.json`, `ai-trace.json`, and `artifacts/`
381
+ as they were, so `--last-failed` still reads the last run that executed. An `e2e mcp` session writes its attempt's artifacts under the same
382
+ `artifacts/` and never clears it.
383
+
384
+ The replay cache is independent: [`cache.dir`](#cache) defaults to
385
+ `.e2e/cache` and resolves from the project root whatever `output` says, so
386
+ moving the results never moves the recordings. Because a run clears and
387
+ owns part of it, the output directory fails the config load with
388
+ `INVALID_CONFIG`, naming the reason, when it:
389
+
390
+ - is the project root, or outside it;
391
+ - is a file, or a path under one (a missing directory is created);
392
+ - is `cache.dir` or inside it, or would hold `cache.dir` under `artifacts/`,
393
+ `sessions/`, or `videos/`;
394
+ - holds a directory a `tests` glob scans (`output: 'tests'` with the default
395
+ `tests/**/*.e2e.ts`).
396
+
397
+ Paths are compared with symlinks resolved, so an absolute path spelled
398
+ through a symlink (`/tmp` for `/private/tmp` on macOS) names the same
399
+ directory as its target. A symlink whose target does not exist yet is
400
+ followed too: an output through one that points outside the project root is
401
+ refused.
402
+
403
+ `e2e init` writes `.gitignore` entries for the default `.e2e/` paths only.
404
+ With `output` set elsewhere, add that directory to `.gitignore` yourself.
405
+
406
+ The removed `--artifacts <dir>` flag fails with the `--output` it maps to:
407
+ the report used to go to the directory's parent, so `--artifacts
408
+ out/artifacts` is `--output out`. A parent an output cannot be (the project
409
+ root, or outside it) maps to `--output .e2e`.
410
+
411
+ ## artifacts
412
+
413
+ ```ts
414
+ artifacts: {
415
+ store: {
416
+ async put(artifact) {
417
+ const key = await bucket.upload(artifact.path, artifact.bytes);
418
+ return { ref: key };
419
+ },
420
+ },
421
+ },
422
+ ```
423
+
424
+ `artifacts` says where artifacts go, not which are made: [`trace` and
425
+ `video`](#recording) choose the recordings, and a failure's screenshot and
426
+ screen text are captured whenever the engine can (never after a secret
427
+ fill, see [Security](/security)). The removed forms fail with
428
+ `INVALID_CONFIG` naming what replaced them: a kinds list (`artifacts:
429
+ ['screenshot', 'trace']` or `artifacts.kinds`) names the `trace` mode it
430
+ meant, `artifacts.trace` names `trace: 'on-all-retries'` for `record:
431
+ 'retries'` (read together with a kinds list that holds `trace`, so the pair
432
+ still means retries only), and `artifacts.video` names the `video` option.
433
+
434
+ `store` receives every artifact once it is complete on disk and returns a
435
+ reference the report records as `ref` beside the local path. A failed `put`
436
+ never fails the run. Each worker constructs its own store from the config
437
+ module. `redaction` is the report's label: a store that exports only what
438
+ the runner vouches for keeps back an `incomplete` artifact, a video or a
439
+ download the runner did not rewrite.
440
+
441
+ A video a hosted service keeps (a [provider's own recording](#what-a-video-writes))
442
+ is a link with no bytes, so `put` never receives it. A store that implements
443
+ the optional `putLink` gets each one instead, once the attempt stopped the
444
+ recording, and its `ref` lands on the report's artifact beside `url`. A
445
+ passed attempt's link under `retain-on-failure` is never handed over, since
446
+ the report leaves it out too, and a failed `putLink` never fails the run.
447
+
448
+ ```ts
449
+ artifacts: {
450
+ store: {
451
+ async put(artifact) {
452
+ return { ref: await bucket.upload(artifact.path, artifact.bytes) };
453
+ },
454
+ async putLink(link) {
455
+ return { ref: await index.record(link.url, link.attemptId) };
456
+ },
457
+ },
458
+ },
459
+ ```
460
+
461
+ ```ts
462
+ export interface ArtifactsConfig {
463
+ /** Host store every produced artifact is handed to; omit it to keep files local only. */
464
+ store?: ArtifactStore;
465
+ }
466
+
467
+ export interface ArtifactStore {
468
+ put(artifact: StoredArtifact): Promise<{ readonly ref: string }>;
469
+ /** Receives a provider-hosted video as a link; optional. */
470
+ putLink?(link: StoredArtifactLink): Promise<{ readonly ref: string }>;
471
+ }
472
+
473
+ /** One produced artifact, handed to `store.put` once it is complete on disk. */
474
+ export interface StoredArtifact {
475
+ readonly kind: 'screenshot' | 'trace' | 'video' | 'download' | 'log';
476
+ readonly mediaType: string;
477
+ readonly bytes: Uint8Array;
478
+ readonly size: number;
479
+ readonly sha256: string;
480
+ /** Report-relative path with `/` separators, stable across runs of the same test. */
481
+ readonly path: string;
482
+ /** How much of the file the runner masked, as the report records it. */
483
+ readonly redaction: 'complete' | 'not-required' | 'incomplete';
484
+ readonly runId: string;
485
+ readonly testId: string;
486
+ readonly attemptId: string;
487
+ /** The step that produced it, when one was running. */
488
+ readonly stepId?: string;
489
+ /** When a time-based artifact (a video segment) began recording. */
490
+ readonly startedAt?: string;
491
+ }
492
+
493
+ /** One provider-hosted recording, handed to `store.putLink` once the attempt stopped it. */
494
+ export interface StoredArtifactLink {
495
+ readonly kind: 'video';
496
+ /** The `http(s)` URL the service serves the recording from. */
497
+ readonly url: string;
498
+ readonly mediaType: string;
499
+ /** A recording masks nothing, so a link is always `incomplete`. */
500
+ readonly redaction: 'incomplete';
501
+ readonly runId: string;
502
+ readonly testId: string;
503
+ readonly attemptId: string;
504
+ /** When the recording started, as an ISO timestamp. */
505
+ readonly startedAt: string;
506
+ /** The step that was running when the recording was registered, if any. */
507
+ readonly stepId?: string;
508
+ }
509
+ ```
510
+
511
+ ## Recording
512
+
513
+ ```ts
514
+ trace: 'on-first-retry',
515
+ video: 'retain-on-failure',
516
+ targets: [
517
+ { name: 'chromium', engine: web(), app: { url } },
518
+ { name: 'firefox', engine: web({ browser: 'firefox' }), app: { url }, video: 'on-first-retry' },
519
+ ],
520
+ ```
521
+
522
+ `trace` and `video` choose which attempts record, with one set of modes:
523
+
524
+ ```ts
525
+ /** Which attempts record a trace or a video, and which recordings are kept. */
526
+ export type RecordingMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry' | 'on-all-retries';
527
+ ```
528
+
529
+ | Mode | Records | Keeps |
530
+ | --- | --- | --- |
531
+ | `off` | nothing | nothing |
532
+ | `on` | every attempt | every recording |
533
+ | `retain-on-failure` | every attempt | the recordings of attempts that did not pass; a passed attempt's files are deleted once its verdict is in |
534
+ | `on-first-retry` | the first retry only, the second attempt | that recording. A test that passes first time records nothing |
535
+ | `on-all-retries` | every attempt after the first | every recording. A test that passes first time records nothing |
536
+
537
+ The names are Playwright's `use.trace` and `use.video` modes. Under a retry
538
+ mode a test with `retries: 0` records nothing, and neither does a failure the
539
+ runner does not retry, such as `LAUNCH_TIMEOUT`. When a test whose engine can
540
+ record runs that way, the run prints one notice per kind at plan time saying
541
+ no traces (or videos) will be recorded for it.
542
+
543
+ The old trace spellings fail with `INVALID_CONFIG` naming the mode they
544
+ meant, wherever a mode goes (the config, a target, a test, `--trace`):
545
+ `'all'` and `{ record: 'all' }` are `'on'`, and `'retries'` and `{ record:
546
+ 'retries' }` are `'on-all-retries'`.
547
+
548
+ Four places set a mode, lowest first, and each replaces the one before it.
549
+ The same rule holds for `trace` and `video`:
550
+
551
+ 1. `trace` or `video` at the top of the config.
552
+ 2. A target's `trace` or `video`.
553
+ 3. `--trace [mode]` or `--video [mode]` on [`e2e run`](/reference/cli#e2e-run),
554
+ over the config and every target. A bare flag is `on`.
555
+ 4. A test's or describe's own [`trace` or `video` option](/reference/test#options),
556
+ innermost wins: `test('checkout', { video: 'on' }, ...)`.
557
+
558
+ A serial group records one trace and one video per group attempt, so its
559
+ members cannot set `trace` or `video` (a `COLLECTION_ERROR`, like `retries`).
560
+ The value on the serial `describe`, or on a group around it, applies to every
561
+ member.
562
+
563
+ `e2e explore` and an `e2e mcp` session are one attempt each and use the
564
+ target's mode, `--trace` and `--video` included for `explore`, so a retry
565
+ mode records nothing there. That includes the CI default: `CI=1 e2e explore`
566
+ records no trace unless you pass `--trace on`, and its plan-time notice says
567
+ so. An `e2e mcp` session always closes as passed, so
568
+ it keeps a trace only under `on`. It never records video from the configured
569
+ mode: its recordings are the ones `start_recording` and `stop_recording`
570
+ make.
571
+
572
+ Neither `trace` nor `video`, at the top or on a target, enters the config
573
+ digest, and neither is part of a replay's
574
+ [cache key](/cache#what-must-match): turning one on or off never
575
+ invalidates cached replays.
576
+
577
+ ### trace
578
+
579
+ The default is `on` locally and `on-first-retry` in CI (the same `CI`
580
+ detection that makes `retries` default to 1 there). Recording a trace costs
581
+ CPU for the whole attempt: on a 141-test suite, every-attempt traces added
582
+ about a quarter to the run's wall time, which is why CI records only the
583
+ retry a flaky test leaves behind.
584
+
585
+ The web engine writes a Playwright trace per attempt, `trace/trace.zip` under
586
+ the attempt's artifact directory, which the runner redacts after a secret
587
+ fill; [Debugging](/debugging#artifacts) shows how to open it.
588
+
589
+ ### video
590
+
591
+ The default is `off`. A video costs more than a trace and holds what the
592
+ screen showed, secrets included, so it is always asked for.
593
+
594
+ ### Engines that cannot record
595
+
596
+ Before any test starts, the run grades every target. Where a mode was set
597
+ decides what an engine that cannot record that kind does:
598
+
599
+ - Set at the top of the config or with `--trace` / `--video`: the mode applies
600
+ to the targets whose engine can record it. The run prints one notice at
601
+ plan time naming the targets that cannot, and runs them without.
602
+ - Set on a target, or on a test that will run on that target: the mode is
603
+ required. A target whose engine cannot record it fails the run with
604
+ `UNSUPPORTED_ARTIFACT`, naming the target and, for a test's, the test.
605
+
606
+ Only a mode that records on some attempt counts: a run whose tests all
607
+ resolve to `off`, or to a retry mode with `retries: 0`, asks nothing of the
608
+ engine.
609
+
610
+ ### What a video writes
611
+
612
+ | Recorder | Files under the attempt's artifact directory |
613
+ | --- | --- |
614
+ | Browser engine, Playwright screencast | `video/video.webm`, one segment per page the attempt showed, later ones as `video/video-part<n>.webm`. [`web({ screencast })`](/reference/web#options) sets the frame size and quality |
615
+ | Mobile engine, agent-device | `video/video.mp4` |
616
+ | A provider's own recording ([`BrowserProvider.record`](/browser#recording-on-the-provider), [`DeviceProvider.record`](/mobile#hosted-devices)) | the file the provider wrote, as `video/<file>`: Kernel's is `video/replay.mp4`. Or a link to a recording the service keeps, recorded with `url` in place of `path`; the runner never downloads it |
617
+
618
+ Each segment carries `startedAt`, so `step.startedAt - artifact.startedAt` is
619
+ a step's offset into it.
620
+
621
+ A recording masks nothing and is recorded with `redaction: 'incomplete'`.
622
+ Under `retain-on-failure` a link is left out of the report of a passed
623
+ attempt, but the service still holds the recording.
624
+
625
+ ## agents
626
+
627
+ ```ts
628
+ /** A project tool as `defineTool` from `e2e/agent` returns it. */
629
+ export interface AgentTool {
630
+ readonly tool: object;
631
+ readonly annotations: { readonly mutates: boolean; readonly platforms?: readonly string[] };
632
+ }
633
+
634
+ /** The options every agent takes, whichever brain runs its `act` steps. */
635
+ export interface AgentOptions {
636
+ /** An AI SDK model instance; no implicit default. */
637
+ model?: ModelInstance;
638
+ /** Model for `assert`, `waitFor`, and `extract`; defaults to `model`. */
639
+ judge?: ModelInstance;
640
+ /**
641
+ * What the app calls things, told to every model call this agent makes,
642
+ * act turns and judgments alike. At most 16384 bytes.
643
+ */
644
+ context?: string;
645
+ /** Committed actions per agent call, 1 through 100; default 25. */
646
+ maxSteps?: number;
647
+ /** Model requests per agent call, 1 through 100; default 25. */
648
+ maxModelCalls?: number;
649
+ /** Deadline of one `assert`, `waitFor`, or `extract` call in milliseconds; default 30000. Raise it for a slow judge; engine operations keep `actionTimeout`. */
650
+ judgmentTimeout?: number;
651
+ /** Observation payload ceiling for act turns and judgments, 1024 through 16777216; default 262144. */
652
+ maxObservationBytes?: number;
653
+ /** Input tokens per model request, 1 through 1000000; default 64000. A dense screen is cut to fit under it. */
654
+ maxInputTokens?: number;
655
+ /**
656
+ * Provider options every model call carries, e.g. a reasoning effort.
657
+ * OpenAI and Azure OpenAI calls also carry `store: false` and a prompt
658
+ * cache key unless set here.
659
+ */
660
+ providerOptions?: ProviderOptions;
661
+ }
662
+
663
+ /** One entry of `agents`: the built-in agent with its options, or a custom brain under `executor`. */
664
+ export type AgentConfig = AgentOptions &
665
+ (
666
+ | {
667
+ /** How the acting agent should work, appended to the built-in rules; only the act loop reads it. */
668
+ system?: string;
669
+ /** Project tools from `defineTool`, offered beside the built-in toolset. */
670
+ tools?: Readonly<Record<string, AgentTool>>;
671
+ }
672
+ | {
673
+ /** A custom brain `agent.act()` dispatches to instead of the built-in agent. */
674
+ executor: StepExecutor;
675
+ }
676
+ );
677
+ ```
678
+
679
+ Tests use the `default` agent unless you select another with
680
+ `e2e run --agent <name>`, a test or group option, or an individual `agent.*`
681
+ call. A test with `{ agent: ['buyer', 'admin'] }` runs once for each agent.
682
+ `default` exists even when the config declares no agents, but has no model.
683
+
684
+ Names may contain ASCII letters, numbers, `_`, `-`, or `.`, and are never
685
+ only dots: a name is an artifact path segment. An unknown name
686
+ is `INVALID_CONFIG` on the CLI flag, `COLLECTION_ERROR` on a test or group,
687
+ and `INVALID_ARGUMENT` on a call. See [Agents and personas](/agents).
688
+
689
+ ```ts title="e2e.config.ts"
690
+ import type { E2EConfig } from 'e2e';
691
+ import { web } from '@e2e-dev/web';
692
+ import { gateway } from 'ai';
693
+ import { houseBrain } from './house-brain.ts';
694
+
695
+ export default {
696
+ targets: [{ engine: web(), app: { url: 'http://localhost:3000' } }],
697
+ agents: {
698
+ default: { model: gateway('openai/gpt-6-luna-fast') },
699
+ ux: { model: gateway('openai/gpt-6-luna-fast'), system: 'Check labels, contrast, and keyboard access.' },
700
+ thorough: { model: gateway('anthropic/claude-opus-5'), context: 'Verify every claim on screen.' },
701
+ buyer: {
702
+ model: gateway('openai/gpt-6-luna-fast'),
703
+ system: 'You are a first-time buyer.',
704
+ context: 'Plans are called tiers. Billing lives under Settings.',
705
+ maxSteps: 40,
706
+ },
707
+ house: { executor: houseBrain, model: gateway('openai/gpt-6-luna-fast'), maxModelCalls: 10 },
708
+ },
709
+ } satisfies E2EConfig;
710
+ ```
711
+
712
+ Every entry starts from the built-in defaults. Agents do not inherit from
713
+ each other: `ux` above gets no `context` from `default`, and a key left out of
714
+ an entry is the default value, never another entry's.
715
+
716
+ With `executor`, `model`, `judge`, `context`, and the budgets still apply
717
+ (judgments need a model), while `system` and `tools` are `INVALID_CONFIG`: the
718
+ executor brings its own prompt and tools. `maxModelCalls` bounds the model
719
+ turns of one step. A string in `model` is `INVALID_CONFIG` naming the
720
+ constructor to write, and so is a `model` or `judge` that differs from the one
721
+ the executor brought. See [Custom executors](/executors) and
722
+ [A judge of its own](/models#a-judge-of-its-own).
723
+
724
+ Loading the config fails with `INVALID_CONFIG` for an unknown key (naming the
725
+ nearest known one), a removed key, and a value in the old shapes:
726
+
727
+ | Written | Now |
728
+ | --- | --- |
729
+ | a bare `StepExecutor` as the entry | `{ executor }` |
730
+ | `timeout` | `judgmentTimeout` |
731
+ | `maxTurns` (on the entry or `createToolLoopExecutor`) | `maxModelCalls` |
732
+ | top-level `limits.maxModelTokensPerCall` | `maxInputTokens` on each agent |
733
+ | top-level `limits.maxAgentContextBytes`, `maxLedgerBytes`, `maxEventsPerStep` | removed; the runner fixes them at 16384 bytes, 8192 bytes, and 1000 events |
734
+
735
+ Judgments (`assert`, `waitFor`, `extract`) allow 8192 output tokens per call
736
+ and see the instruction and the current screen only.
737
+
738
+ ### model
739
+
740
+ ```ts
741
+ /**
742
+ * An AI SDK LanguageModelV2+ instance. Its provider handles transport
743
+ * and credentials.
744
+ */
745
+ export interface ModelInstance {
746
+ /** The AI SDK specification the instance implements. */
747
+ readonly specificationVersion: string;
748
+ /** Provider id, recorded per step in the report. */
749
+ readonly provider: string;
750
+ /** Model id, recorded per step in the report. */
751
+ readonly modelId: string;
752
+ /** The generate call every AI SDK language model implements; what tells a live instance from its three id strings. */
753
+ readonly doGenerate: (...args: never[]) => unknown;
754
+ }
755
+ ```
756
+
757
+ Construct the model in your config with an AI SDK provider. For subscription
758
+ sign-in, use the [`e2e/oauth/*` models](/subscriptions).
759
+
760
+ | Gateway | Constructor | Package | Reads |
761
+ | --- | --- | --- | --- |
762
+ | [Vercel AI Gateway](https://vercel.com/docs/ai-gateway) | `gateway('openai/gpt-6-luna-fast')` | `ai` | `AI_GATEWAY_API_KEY`, or a Vercel OIDC token without it |
763
+ | [OpenRouter](https://openrouter.ai/models) | `openrouter('openai/gpt-6-luna-fast')` | `@openrouter/ai-sdk-provider` | `OPENROUTER_API_KEY` |
764
+ | Any OpenAI-compatible endpoint | `createOpenAICompatible({ name, baseURL, apiKey? }).chatModel('llama3.2')` | `@ai-sdk/openai-compatible` | `apiKey`, when the endpoint needs one |
765
+ | A provider directly | `openai('gpt-6-luna')`, `anthropic(...)`, ... | `@ai-sdk/openai`, `@ai-sdk/anthropic`, ... | the provider's own variable |
766
+
767
+ Reports record `provider` and `modelId` per step. Each worker constructs its
768
+ own instance from the config module; a digest that differs between the
769
+ runner and a worker is `CONFIG_NOT_DETERMINISTIC`. See
770
+ [Models](/models).
771
+
772
+ ## credentials
773
+
774
+ ```ts
775
+ /** One `config.credentials` entry: an account whose password is a secret named `<entry>.password`. */
776
+ export interface CredentialConfig {
777
+ username: string;
778
+ password: string | SecretProvider;
779
+ }
780
+
781
+ type SecretProvider = () => string | Promise<string>;
782
+ ```
783
+
784
+ A `SecretProvider` is called on every authorized fill (a vault lookup, a
785
+ freshly computed TOTP) and recorded in the config digest by name only. An
786
+ `E2E_USER_*` override wins over it. A static password is at least 6
787
+ characters (code points), like a secret, or `INVALID_CONFIG`; a provider
788
+ returning fewer fails the fill with `AUTH_CREDENTIAL_UNAVAILABLE`.
789
+
790
+ `credentials.user(name)` resolves a configured entry into a `Credential`.
791
+ The username is a plain string; the password is an opaque `Secret` that test
792
+ code cannot read, accepted only by `locator.fill` and `agent.act` params. An
793
+ unconfigured name throws `AUTH_CREDENTIAL_UNAVAILABLE`.
794
+
795
+ Credentials and secrets are separate namespaces: `secrets.get(name)` returns a
796
+ `secrets` entry only, and a credential's password is reachable only as
797
+ `credentials.user(name).password`. The agent, the replay cache, and the
798
+ reports know that handle as `<name>.password` (`<secret:admin.password>`), so
799
+ `credentials.admin` and `secrets.admin` can both exist; a `secrets` entry
800
+ named exactly `admin.password` beside an `admin` credential is
801
+ `INVALID_CONFIG`.
802
+
803
+ ```ts
804
+ /** Named test identity. The password remains an opaque Secret. */
805
+ export interface Credential {
806
+ /** The entry's name in `credentials`. */
807
+ readonly name: string;
808
+ /** Plain username. */
809
+ readonly username: string;
810
+ /** Opaque; test code cannot read it. */
811
+ readonly password: Secret;
812
+ readonly [credentialBrand]: true;
813
+ }
814
+ ```
815
+
816
+ See [Signing in](/authentication).
817
+
818
+ ## secrets
819
+
820
+ ```ts
821
+ /** One `config.secrets` entry: the value itself, or a provider computing it at fill time. */
822
+ export type SecretConfig = string | SecretProvider;
823
+ ```
824
+
825
+ An entry is a static value, or a provider called on every authorized fill (a
826
+ vault lookup, a freshly computed TOTP). It is recorded in the config digest by
827
+ name only, and an `E2E_SECRET_<NAME>` override wins over both. Every entry
828
+ must resolve to a string of at least 6 characters (code points) or a
829
+ function; anything else is `INVALID_CONFIG`. The minimum exists for redaction: every occurrence
830
+ of a value becomes `<secret:name>`, and a shorter value would take ordinary
831
+ text in reports and output with it. A provider's value is held to the same
832
+ minimum at fill time, with `SECRET_UNAVAILABLE`.
833
+
834
+ `secrets.get(name)` returns the opaque `Secret` for a configured entry. It has
835
+ no plaintext accessor and is accepted only by `locator.fill` and `agent.act`
836
+ params; the runner fills the field, masks the value in every observation, and
837
+ redacts it from logs, traces, and the report. An unconfigured name throws
838
+ `SECRET_UNAVAILABLE`.
839
+
840
+ Called while `e2e.config.ts` evaluates, before any run exists, `secrets.get(name)`
841
+ returns a reference by name that an engine option can hold, such as
842
+ `web({ basicAuth: { username, password: secrets.get('previewPassword') } })`.
843
+ The engine declares it, the config load fails with `INVALID_CONFIG` when no
844
+ `secrets` entry has the name (a credential's password is not one: declare a
845
+ value an engine option needs under `secrets`), and the engine resolves the value
846
+ when each attempt starts (a provider runs again every time). The value joins
847
+ the attempt's redaction then, without the screenshot restrictions a fill
848
+ brings, since it goes to the engine rather than onto the page. The digest
849
+ records the name only. The reference is not the value: turned into a string
850
+ (a template literal, `String()`, `+`, `JSON.stringify`) it throws
851
+ `INVALID_CONFIG`, and so does one placed in an `args` entry or `env` value of
852
+ `app.command`, which takes strings and placeholders only. Read a value a string needs, such as an app's API
853
+ key, from `process.env` yourself.
854
+
855
+ ```ts
856
+ /**
857
+ * What a secret is for, which decides where it may be filled: a `password`
858
+ * goes only into a password field; a `generic-secret` (an API key, a token,
859
+ * any value from the environment) goes into any editable input.
860
+ */
861
+ export type SecretPurpose = 'password' | 'generic-secret';
862
+
863
+ /** Opaque host-side value accepted only by sensitive input sinks. */
864
+ export interface Secret {
865
+ /** The entry's name in `secrets`, or `<credential>.password` for a credential's password. */
866
+ readonly name: string;
867
+ /** Where the value may be filled. */
868
+ readonly purpose: SecretPurpose;
869
+ readonly [secretBrand]: true;
870
+ }
871
+ ```
872
+
873
+ See [Secrets that are not passwords](/authentication#secrets-that-are-not-passwords).
874
+
875
+ ## cache
876
+
877
+ In `read-write` mode the replay cache records an `agent.act()` only after a
878
+ later verification passes, such as a locator assertion or `agent.assert()`.
879
+ `read-only` replays existing entries and writes none; `off` disables both.
880
+ See [Caching agent steps](/cache).
881
+
882
+ ```ts
883
+ /**
884
+ * Replay cache options. Defaults to files under `.e2e/cache/`.
885
+ * A custom store replaces file storage; each worker constructs its own.
886
+ */
887
+ export interface CacheConfig {
888
+ /** Default `read-write`; `read-only` in CI when unset. */
889
+ mode?: CacheMode;
890
+ /** Custom entry store; omit it to use the file store at `dir`. */
891
+ store?: CacheStore;
892
+ /** File store directory, resolved against the project root; default `.e2e/cache`, whatever `output` says. */
893
+ dir?: string;
894
+ /** Fail a step whose recording no longer replays with `REPLAY_STALE`. Default `false`. */
895
+ strict?: boolean;
896
+ }
897
+
898
+ /** Where the replay cache keeps its entries: the file store by default, or a host's own through `cache.store`. */
899
+ export interface CacheStore {
900
+ readonly writable: boolean;
901
+ read(keyHash: string): Promise<CacheReadResult>;
902
+ /** Persists one trace, returning its size, or undefined when not written. */
903
+ write(keyHash: string, payload: ActionTrace): Promise<{ bytes: number } | undefined>;
904
+ /**
905
+ * Evicts one entry, best-effort. Called when a replayed or just-recorded
906
+ * flow is implicated in a failed attempt: the entry re-records on the next
907
+ * pass instead of replaying a poisoned flow forever. Optional: a store
908
+ * without eviction merely stays stale until the next confirmed write.
909
+ */
910
+ delete?(keyHash: string): Promise<void>;
911
+ }
912
+
913
+ export type CacheReadResult =
914
+ | { readonly status: 'hit'; readonly entry: TraceEntry; readonly bytes: number }
915
+ | { readonly status: 'miss' }
916
+ | { readonly status: 'invalid'; readonly reason: string; readonly bytes?: number };
917
+ ```
918
+
919
+ `CacheStore`, `CacheReadResult`, `TraceEntry`, and `ActionTrace` are
920
+ exported from `e2e`.
921
+
922
+ A bare string is shorthand for `{ mode }`. Set `'read-write'` explicitly when
923
+ CI restores the cache from its own cache service; `--no-cache` wins over
924
+ both. A custom `store` is exempt from the CI demotion and states its own
925
+ trust through `writable`. `strict` (or `--strict-cache` for one run) turns a
926
+ recording that exists but no longer replays into a `REPLAY_STALE` failure
927
+ instead of a hand-off to the agent; see
928
+ [Fail on a stale recording](/cache#fail-on-a-stale-recording).
929
+
930
+ ### Commit the replay cache
931
+
932
+ `e2e init` adds `.e2e/cache/` to `.gitignore`, so committing entries is
933
+ opt-in. Remove that line to share replays with CI and teammates; CI stays
934
+ `read-only` unless `cache: 'read-write'` is set. See
935
+ [Caching agent steps](/cache#commit-the-replay-cache).
936
+
937
+ ## Run limits
938
+
939
+ The report's `run.limits` block records the ceilings a run enforced. There is
940
+ no `limits` key: `maxObservationBytes` and `maxModelTokensPerCall` are the
941
+ largest `maxObservationBytes` and `maxInputTokens` any configured agent
942
+ sets, and the rest are fixed by the runner.
943
+
944
+ | Report field | Value |
945
+ | --- | --- |
946
+ | `maxAgentContextBytes` | 16384: an agent's `context` and a test's `agentContext` |
947
+ | `maxLedgerBytes` | 8192: the prior-step ledger an act step reads |
948
+ | `maxEventsPerStep` | 1000: events recorded per step |
949
+ | `maxObservationBytes` | the largest `agents.<name>.maxObservationBytes` |
950
+ | `maxModelTokensPerCall` | the largest `agents.<name>.maxInputTokens` |
951
+
952
+ Per-call options may only lower an agent's budgets.
953
+
954
+ ## Environment variables
955
+
956
+ The runner reads a closed set, listed on the
957
+ [Environment variables](/reference/environment) page. `E2E_USER_<NAME>_USERNAME`
958
+ and `E2E_USER_<NAME>_PASSWORD` override a credential, `E2E_SECRET_<NAME>` a
959
+ secret, and `CI` switches the defaults below.
960
+
961
+ ### Resolution order
962
+
963
+ | Setting | Order |
964
+ | --- | --- |
965
+ | Base URL | the target's `app.url`, else `APP_URL_REQUIRED` at the first navigation. The runner reads no `APP_URL`; the scaffolded config reads it itself |
966
+ | Built-in agent model | `agents.<name>.model`, then `MODEL_UNAVAILABLE` at `agent` acquisition; an agent never falls back to `default`'s model |
967
+ | Custom executor model | `agents.<name>.model`, else the model the executor brought; two different values is `INVALID_CONFIG` |
968
+ | Model credential | the provider package's own variable or the key passed at construction, read by the provider on the first model call |
969
+ | Credential username and password | the `E2E_USER_*` variable, then the config value |
970
+
971
+ The built-in agent checks for a missing model once per run, when the `agent`
972
+ fixture is first acquired, and stops the run with exit 2. A custom executor
973
+ can implement `act` and `assert` without a model. `waitFor` and `extract`
974
+ still require one.
975
+
976
+ ### CI
977
+
978
+ CI mode is on unless `CI` is unset, blank, `0`, or `false`.
979
+
980
+ | Setting | Local | CI |
981
+ | --- | --- | --- |
982
+ | `retries` | `0` | `1` |
983
+ | `workers` | `max(1, floor(availableParallelism() / 2))` | `1` |
984
+ | `cache` | `read-write` | `read-only` when unset |
985
+ | `test.only` | allowed | `ONLY_IN_CI`, exit code 2 |
986
+ | `command.reuseExisting` | honored | ignored, with a notice |