@e2edev/e2e 0.6.1 → 0.8.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 (283) hide show
  1. package/README.md +15 -11
  2. package/dist/agent/act-validation.d.ts +9 -3
  3. package/dist/agent/act-validation.d.ts.map +1 -1
  4. package/dist/agent/act-validation.js +23 -4
  5. package/dist/agent/act-validation.js.map +1 -1
  6. package/dist/agent/act.d.ts +2 -2
  7. package/dist/agent/act.d.ts.map +1 -1
  8. package/dist/agent/act.js +231 -41
  9. package/dist/agent/act.js.map +1 -1
  10. package/dist/agent/actions.d.ts +14 -14
  11. package/dist/agent/actions.d.ts.map +1 -1
  12. package/dist/agent/actions.js +12 -2
  13. package/dist/agent/actions.js.map +1 -1
  14. package/dist/agent/default-agent.d.ts +1 -1
  15. package/dist/agent/default-agent.d.ts.map +1 -1
  16. package/dist/agent/default-agent.js +19 -84
  17. package/dist/agent/default-agent.js.map +1 -1
  18. package/dist/agent/executor.d.ts +14 -0
  19. package/dist/agent/executor.d.ts.map +1 -1
  20. package/dist/agent/executor.js.map +1 -1
  21. package/dist/agent/index.d.ts.map +1 -1
  22. package/dist/agent/index.js +14 -6
  23. package/dist/agent/index.js.map +1 -1
  24. package/dist/agent/invocation.d.ts +1 -8
  25. package/dist/agent/invocation.d.ts.map +1 -1
  26. package/dist/agent/invocation.js +7 -51
  27. package/dist/agent/invocation.js.map +1 -1
  28. package/dist/agent/ledger.d.ts.map +1 -1
  29. package/dist/agent/ledger.js +10 -1
  30. package/dist/agent/ledger.js.map +1 -1
  31. package/dist/agent/loop-guards.d.ts +21 -0
  32. package/dist/agent/loop-guards.d.ts.map +1 -1
  33. package/dist/agent/loop-guards.js +48 -0
  34. package/dist/agent/loop-guards.js.map +1 -1
  35. package/dist/agent/model/sdk.d.ts +18 -0
  36. package/dist/agent/model/sdk.d.ts.map +1 -1
  37. package/dist/agent/model/sdk.js +10 -4
  38. package/dist/agent/model/sdk.js.map +1 -1
  39. package/dist/agent/observation-budget.d.ts +27 -0
  40. package/dist/agent/observation-budget.d.ts.map +1 -0
  41. package/dist/agent/observation-budget.js +43 -0
  42. package/dist/agent/observation-budget.js.map +1 -0
  43. package/dist/agent/observation.d.ts +40 -7
  44. package/dist/agent/observation.d.ts.map +1 -1
  45. package/dist/agent/observation.js +56 -11
  46. package/dist/agent/observation.js.map +1 -1
  47. package/dist/agent/phases.d.ts +1 -1
  48. package/dist/agent/phases.d.ts.map +1 -1
  49. package/dist/agent/phases.js +11 -13
  50. package/dist/agent/phases.js.map +1 -1
  51. package/dist/agent/primitives.d.ts +14 -2
  52. package/dist/agent/primitives.d.ts.map +1 -1
  53. package/dist/agent/primitives.js +98 -54
  54. package/dist/agent/primitives.js.map +1 -1
  55. package/dist/agent/screen-update.d.ts +47 -0
  56. package/dist/agent/screen-update.d.ts.map +1 -0
  57. package/dist/agent/screen-update.js +222 -0
  58. package/dist/agent/screen-update.js.map +1 -0
  59. package/dist/agent/step-cache.d.ts +46 -18
  60. package/dist/agent/step-cache.d.ts.map +1 -1
  61. package/dist/agent/step-cache.js +100 -60
  62. package/dist/agent/step-cache.js.map +1 -1
  63. package/dist/agent/tool-loop.d.ts.map +1 -1
  64. package/dist/agent/tool-loop.js +28 -4
  65. package/dist/agent/tool-loop.js.map +1 -1
  66. package/dist/cache/anchors.d.ts.map +1 -1
  67. package/dist/cache/anchors.js +21 -1
  68. package/dist/cache/anchors.js.map +1 -1
  69. package/dist/cache/decide.d.ts +13 -3
  70. package/dist/cache/decide.d.ts.map +1 -1
  71. package/dist/cache/decide.js +35 -0
  72. package/dist/cache/decide.js.map +1 -1
  73. package/dist/cache/relocate.d.ts +11 -1
  74. package/dist/cache/relocate.d.ts.map +1 -1
  75. package/dist/cache/relocate.js +48 -17
  76. package/dist/cache/relocate.js.map +1 -1
  77. package/dist/cache/store.d.ts.map +1 -1
  78. package/dist/cache/store.js +3 -14
  79. package/dist/cache/store.js.map +1 -1
  80. package/dist/cache/trace.d.ts +12 -0
  81. package/dist/cache/trace.d.ts.map +1 -1
  82. package/dist/cache/trace.js +21 -0
  83. package/dist/cache/trace.js.map +1 -1
  84. package/dist/cli/docs-url.d.ts +1 -1
  85. package/dist/cli/docs-url.d.ts.map +1 -1
  86. package/dist/cli/docs-url.js +1 -1
  87. package/dist/cli/docs-url.js.map +1 -1
  88. package/dist/cli/index.d.ts.map +1 -1
  89. package/dist/cli/index.js +60 -9
  90. package/dist/cli/index.js.map +1 -1
  91. package/dist/cli/init/engines.d.ts +2 -3
  92. package/dist/cli/init/engines.d.ts.map +1 -1
  93. package/dist/cli/init/engines.js +3 -4
  94. package/dist/cli/init/engines.js.map +1 -1
  95. package/dist/cli/init/scaffold.d.ts.map +1 -1
  96. package/dist/cli/init/scaffold.js +2 -0
  97. package/dist/cli/init/scaffold.js.map +1 -1
  98. package/dist/cli/signals.d.ts +3 -3
  99. package/dist/cli/signals.js +3 -3
  100. package/dist/cli/telemetry.d.ts +12 -0
  101. package/dist/cli/telemetry.d.ts.map +1 -0
  102. package/dist/cli/telemetry.js +40 -0
  103. package/dist/cli/telemetry.js.map +1 -0
  104. package/dist/collect/select.d.ts +2 -0
  105. package/dist/collect/select.d.ts.map +1 -1
  106. package/dist/collect/select.js +15 -11
  107. package/dist/collect/select.js.map +1 -1
  108. package/dist/config/agent.d.ts +6 -2
  109. package/dist/config/agent.d.ts.map +1 -1
  110. package/dist/config/agent.js +30 -3
  111. package/dist/config/agent.js.map +1 -1
  112. package/dist/config/diagnose.d.ts.map +1 -1
  113. package/dist/config/diagnose.js +1 -0
  114. package/dist/config/diagnose.js.map +1 -1
  115. package/dist/config/load.d.ts +2 -2
  116. package/dist/config/load.js +2 -2
  117. package/dist/config/resolve.d.ts +16 -4
  118. package/dist/config/resolve.d.ts.map +1 -1
  119. package/dist/config/resolve.js +107 -44
  120. package/dist/config/resolve.js.map +1 -1
  121. package/dist/engine/contract.d.ts +6 -1
  122. package/dist/engine/contract.d.ts.map +1 -1
  123. package/dist/engine/contract.js.map +1 -1
  124. package/dist/engine/index.d.ts +61 -6
  125. package/dist/engine/index.d.ts.map +1 -1
  126. package/dist/engine/index.js +25 -5
  127. package/dist/engine/index.js.map +1 -1
  128. package/dist/engine/session.d.ts.map +1 -1
  129. package/dist/engine/session.js +6 -0
  130. package/dist/engine/session.js.map +1 -1
  131. package/dist/engine/surface.d.ts +6 -2
  132. package/dist/engine/surface.d.ts.map +1 -1
  133. package/dist/index.d.ts +1 -1
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +1 -1
  136. package/dist/index.js.map +1 -1
  137. package/dist/internal/ai-trace.d.ts +1 -5
  138. package/dist/internal/ai-trace.d.ts.map +1 -1
  139. package/dist/internal/ai-trace.js +82 -11
  140. package/dist/internal/ai-trace.js.map +1 -1
  141. package/dist/internal/atomic-write.d.ts +17 -0
  142. package/dist/internal/atomic-write.d.ts.map +1 -0
  143. package/dist/internal/atomic-write.js +44 -0
  144. package/dist/internal/atomic-write.js.map +1 -0
  145. package/dist/internal/env.d.ts +6 -0
  146. package/dist/internal/env.d.ts.map +1 -0
  147. package/dist/internal/env.js +12 -0
  148. package/dist/internal/env.js.map +1 -0
  149. package/dist/internal/options.d.ts +9 -0
  150. package/dist/internal/options.d.ts.map +1 -0
  151. package/dist/internal/options.js +27 -0
  152. package/dist/internal/options.js.map +1 -0
  153. package/dist/locator/expression.js +1 -1
  154. package/dist/locator/expression.js.map +1 -1
  155. package/dist/locator/screen.d.ts.map +1 -1
  156. package/dist/locator/screen.js +4 -2
  157. package/dist/locator/screen.js.map +1 -1
  158. package/dist/report/build.d.ts +2 -1
  159. package/dist/report/build.d.ts.map +1 -1
  160. package/dist/report/build.js +11 -4
  161. package/dist/report/build.js.map +1 -1
  162. package/dist/report/list-model.d.ts +14 -5
  163. package/dist/report/list-model.d.ts.map +1 -1
  164. package/dist/report/list.d.ts +59 -5
  165. package/dist/report/list.d.ts.map +1 -1
  166. package/dist/report/list.js +171 -31
  167. package/dist/report/list.js.map +1 -1
  168. package/dist/report/running-tree.d.ts +7 -6
  169. package/dist/report/running-tree.d.ts.map +1 -1
  170. package/dist/report/running-tree.js +13 -8
  171. package/dist/report/running-tree.js.map +1 -1
  172. package/dist/report/write.d.ts +1 -1
  173. package/dist/report/write.d.ts.map +1 -1
  174. package/dist/report/write.js +3 -6
  175. package/dist/report/write.js.map +1 -1
  176. package/dist/run/artifacts.d.ts.map +1 -1
  177. package/dist/run/artifacts.js +20 -2
  178. package/dist/run/artifacts.js.map +1 -1
  179. package/dist/run/events.d.ts +73 -15
  180. package/dist/run/events.d.ts.map +1 -1
  181. package/dist/run/events.js +7 -7
  182. package/dist/run/events.js.map +1 -1
  183. package/dist/run/execute.d.ts +31 -5
  184. package/dist/run/execute.d.ts.map +1 -1
  185. package/dist/run/execute.js +73 -25
  186. package/dist/run/execute.js.map +1 -1
  187. package/dist/run/fixtures.d.ts +9 -1
  188. package/dist/run/fixtures.d.ts.map +1 -1
  189. package/dist/run/fixtures.js +5 -4
  190. package/dist/run/fixtures.js.map +1 -1
  191. package/dist/run/in-process.d.ts +1 -1
  192. package/dist/run/in-process.d.ts.map +1 -1
  193. package/dist/run/in-process.js +6 -3
  194. package/dist/run/in-process.js.map +1 -1
  195. package/dist/run/managed-process.d.ts +8 -2
  196. package/dist/run/managed-process.d.ts.map +1 -1
  197. package/dist/run/managed-process.js +12 -0
  198. package/dist/run/managed-process.js.map +1 -1
  199. package/dist/run/records.d.ts +15 -1
  200. package/dist/run/records.d.ts.map +1 -1
  201. package/dist/run/runner.d.ts +16 -7
  202. package/dist/run/runner.d.ts.map +1 -1
  203. package/dist/run/runner.js +182 -98
  204. package/dist/run/runner.js.map +1 -1
  205. package/dist/run/scheduler.d.ts +6 -6
  206. package/dist/run/scheduler.d.ts.map +1 -1
  207. package/dist/run/scheduler.js +54 -23
  208. package/dist/run/scheduler.js.map +1 -1
  209. package/dist/run/serial.d.ts +2 -4
  210. package/dist/run/serial.d.ts.map +1 -1
  211. package/dist/run/serial.js +4 -2
  212. package/dist/run/serial.js.map +1 -1
  213. package/dist/run/sessions.d.ts.map +1 -1
  214. package/dist/run/sessions.js +3 -4
  215. package/dist/run/sessions.js.map +1 -1
  216. package/dist/run/steps.d.ts +28 -1
  217. package/dist/run/steps.d.ts.map +1 -1
  218. package/dist/run/steps.js +14 -0
  219. package/dist/run/steps.js.map +1 -1
  220. package/dist/run/unit-runner.d.ts +7 -2
  221. package/dist/run/unit-runner.d.ts.map +1 -1
  222. package/dist/run/units.d.ts +8 -0
  223. package/dist/run/units.d.ts.map +1 -1
  224. package/dist/run/units.js +11 -0
  225. package/dist/run/units.js.map +1 -1
  226. package/dist/run/worker/entry.js +1 -0
  227. package/dist/run/worker/entry.js.map +1 -1
  228. package/dist/run/worker/handle.d.ts +1 -1
  229. package/dist/run/worker/handle.d.ts.map +1 -1
  230. package/dist/run/worker/handle.js +1 -1
  231. package/dist/run/worker/handle.js.map +1 -1
  232. package/dist/run/worker/protocol.d.ts +12 -1
  233. package/dist/run/worker/protocol.d.ts.map +1 -1
  234. package/dist/run/worker/protocol.js.map +1 -1
  235. package/dist/run/worker/session.d.ts +2 -0
  236. package/dist/run/worker/session.d.ts.map +1 -1
  237. package/dist/run/worker/session.js +5 -0
  238. package/dist/run/worker/session.js.map +1 -1
  239. package/dist/run/worker-models.d.ts +27 -0
  240. package/dist/run/worker-models.d.ts.map +1 -0
  241. package/dist/run/worker-models.js +49 -0
  242. package/dist/run/worker-models.js.map +1 -0
  243. package/dist/telemetry/environment.d.ts +33 -0
  244. package/dist/telemetry/environment.d.ts.map +1 -0
  245. package/dist/telemetry/environment.js +96 -0
  246. package/dist/telemetry/environment.js.map +1 -0
  247. package/dist/telemetry/events.d.ts +25 -0
  248. package/dist/telemetry/events.d.ts.map +1 -0
  249. package/dist/telemetry/events.js +107 -0
  250. package/dist/telemetry/events.js.map +1 -0
  251. package/dist/telemetry/posthog.d.ts +31 -0
  252. package/dist/telemetry/posthog.d.ts.map +1 -0
  253. package/dist/telemetry/posthog.js +29 -0
  254. package/dist/telemetry/posthog.js.map +1 -0
  255. package/dist/telemetry/project.d.ts +18 -0
  256. package/dist/telemetry/project.d.ts.map +1 -0
  257. package/dist/telemetry/project.js +55 -0
  258. package/dist/telemetry/project.js.map +1 -0
  259. package/dist/telemetry/store.d.ts +53 -0
  260. package/dist/telemetry/store.d.ts.map +1 -0
  261. package/dist/telemetry/store.js +153 -0
  262. package/dist/telemetry/store.js.map +1 -0
  263. package/dist/telemetry/telemetry.d.ts +89 -0
  264. package/dist/telemetry/telemetry.d.ts.map +1 -0
  265. package/dist/telemetry/telemetry.js +187 -0
  266. package/dist/telemetry/telemetry.js.map +1 -0
  267. package/dist/types.d.ts +103 -38
  268. package/dist/types.d.ts.map +1 -1
  269. package/package.json +2 -6
  270. package/skills/e2e/SKILL.md +0 -2
  271. package/skills/e2e/references/agent.md +33 -15
  272. package/skills/e2e/references/debugging.md +4 -2
  273. package/skills/e2e/references/running.md +7 -5
  274. package/skills/e2e/references/setup.md +16 -10
  275. package/skills/e2e/references/writing-tests.md +6 -5
  276. package/dist/internal/trace.d.ts +0 -18
  277. package/dist/internal/trace.d.ts.map +0 -1
  278. package/dist/internal/trace.js +0 -46
  279. package/dist/internal/trace.js.map +0 -1
  280. package/dist/run/public.d.ts +0 -19
  281. package/dist/run/public.d.ts.map +0 -1
  282. package/dist/run/public.js +0 -11
  283. package/dist/run/public.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e2edev/e2e",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "description": "SDK, runner, and CLI for agentic end-to-end testing",
5
5
  "keywords": [
6
6
  "e2e",
@@ -41,10 +41,6 @@
41
41
  "./engine": {
42
42
  "types": "./dist/engine/index.d.ts",
43
43
  "default": "./dist/engine/index.js"
44
- },
45
- "./run": {
46
- "types": "./dist/run/public.d.ts",
47
- "default": "./dist/run/public.js"
48
44
  }
49
45
  },
50
46
  "bin": {
@@ -77,7 +73,7 @@
77
73
  "ajv-formats": "3.0.1",
78
74
  "typescript": "7.0.2",
79
75
  "vitest": "5.0.0",
80
- "@e2edev/playwright": "0.6.0"
76
+ "@e2edev/playwright": "0.7.0"
81
77
  },
82
78
  "engines": {
83
79
  "node": ">=22.12.0"
@@ -22,8 +22,6 @@ import { playwright } from '@e2edev/playwright';
22
22
  export default {
23
23
  targets: [
24
24
  {
25
- name: 'web',
26
- platform: 'web',
27
25
  engine: playwright({
28
26
  url: 'http://127.0.0.1:3000',
29
27
  command: { executable: 'pnpm', args: ['dev'], log: '.e2e/logs/app.log' },
@@ -38,8 +38,12 @@ E2E_MODEL=anthropic/claude-sonnet-4.5 E2E_MODEL_API_KEY=... npx --no-install e2e
38
38
  - `context` in the config and `agentContext` on a test or group add trusted
39
39
  project vocabulary to every prompt.
40
40
  - `visionModel` (or `E2E_VISION_MODEL`) serves the calls that send pixels.
41
- - Missing model or key: the `agent` fixture fails with `MODEL_UNAVAILABLE`
42
- (exit 2) at first use.
41
+ - The model passed to `createAgent({ model })` is the one model for every
42
+ `agent.*` call, `act` and the judgments alike, and outranks `E2E_MODEL`.
43
+ An `agent.model` naming a different model is `INVALID_CONFIG`.
44
+ - Missing model or key: checked once per run when the first test acquires
45
+ the `agent` fixture. One run-level `MODEL_UNAVAILABLE` (exit 2) stops the
46
+ run; the remaining tests are skipped, not failed one by one.
43
47
 
44
48
  ## act: one goal
45
49
 
@@ -47,17 +51,20 @@ E2E_MODEL=anthropic/claude-sonnet-4.5 E2E_MODEL_API_KEY=... npx --no-install e2e
47
51
  import { credentials } from '@e2edev/e2e';
48
52
 
49
53
  await agent.act('add a todo named "Buy milk" and mark it done');
50
- await agent.act('invite {email} as an editor', { email: 'ada@example.test' });
54
+ await agent.act('invite {email} as an editor', { params: { email: 'ada@example.test' } });
51
55
 
52
56
  const member = credentials.user('member');
53
57
  await agent.act('sign in with the given credentials', {
54
- username: member.username,
55
- password: member.password, // a Secret: the model sees its name, the runner fills the field
58
+ params: {
59
+ username: member.username,
60
+ password: member.password, // a Secret: the model sees its name, the runner fills the field
61
+ },
56
62
  });
57
63
  ```
58
64
 
59
- `act(instruction, params?, options?)` plans and performs a multi-action flow
60
- and ends in a verdict. Passed returns `{ ok: true }`. Failed or blocked
65
+ `act(instruction, options?)` plans and performs a multi-action flow and ends
66
+ in a verdict. Passed resolves with what the step did: `summary`, `modelCalls`,
67
+ `actions`, and `cache` (how the trace cache took part). Failed or blocked
61
68
  throws an `AgentError` whose `code` says why: `ACTION_FAILED` for a plain
62
69
  failure, `STEP_BUDGET_EXHAUSTED` or `STEP_TIMEOUT` when the budget or the
63
70
  clock ran out, and a blocked code (`AUTH_CREDENTIAL_UNAVAILABLE`,
@@ -65,10 +72,11 @@ clock ran out, and a blocked code (`AUTH_CREDENTIAL_UNAVAILABLE`,
65
72
  `AUTOMATION_UNSUPPORTED`) when something outside the product prevented a
66
73
  verdict.
67
74
 
68
- Options: `timeout` (default the test timeout), `maxSteps` (default 25
69
- actions), `maxModelCalls` (default 25). Per-call values can only lower the
70
- configured limits. `schema` and `vision` on `act` are not implemented and
71
- reject with `UNSUPPORTED_CAPABILITY`.
75
+ Options: `params` (the values the instruction refers to; a `Secret` is filled
76
+ by the runner), `timeout` (default the test timeout), `maxSteps` (default 25
77
+ actions), `maxModelCalls` (default 25). Per-call budgets can only lower the
78
+ configured limits. `act` takes no `schema` and no `vision`: structured output
79
+ is `extract({ schema })`, and `vision` belongs to the judgments.
72
80
 
73
81
  ## assert, waitFor, extract: one question
74
82
 
@@ -78,7 +86,7 @@ import { z } from 'zod';
78
86
  await agent.assert('the dashboard shows a trial badge'); // one look, one judgment
79
87
 
80
88
  await agent.waitFor('the export finished and a download link appeared', { // polls
81
- intervalMs: 500,
89
+ interval: 500,
82
90
  timeout: 120_000,
83
91
  });
84
92
 
@@ -91,7 +99,7 @@ expect(data.titles).toContain('Buy milk');
91
99
  - `assert` does not poll. A false judgment is `ASSERTION_FAILED` with the
92
100
  model's explanation and a screenshot in the report. Malformed output gets
93
101
  one repair round, then `MODEL_OUTPUT_INVALID`.
94
- - `waitFor` observes every `intervalMs` (default 3 s) and spends a judgment
102
+ - `waitFor` observes every `interval` (default 3 s) and spends a judgment
95
103
  only when the screen changed; `STEP_TIMEOUT` after `timeout` (default
96
104
  30 s).
97
105
  - `extract` accepts any Standard Schema validator (zod works). Invalid output
@@ -132,7 +140,11 @@ the end state may not), and it is what lets the trace cache record the step.
132
140
  ## What the model sees
133
141
 
134
142
  A redacted snapshot of the screen (roles, names, text, states), a summary of
135
- prior steps, and your context. Never raw HTML, cookies, headers, environment
143
+ prior steps, and your context. The first screen of a step arrives whole;
144
+ every action result after it reports what changed, keyed by node ids that
145
+ stay stable while an element exists, or the whole screen again when most of
146
+ it changed, and is read after the action's effect landed. Never raw HTML,
147
+ cookies, headers, environment
136
148
  values, or a `Secret`'s value; password fields arrive masked. Pixels only
137
149
  with `vision`, and only while no secret has been filled. Nothing the model
138
150
  returns runs as code or selectors: the runner validates and authorizes every
@@ -169,6 +181,8 @@ state is not on screen after the replay.
169
181
  - An entry is written only after a later verification step passes
170
182
  (`expect`, `locator.waitFor`, `agent.assert`, `agent.waitFor`). An `act`
171
183
  nothing checks is never replayed.
184
+ - A step that records no actions creates no entry and skips the cache's
185
+ end-state observation.
172
186
  - `e2e init` gitignores `.e2e/cache/`; committing entries is opt-in. Remove
173
187
  that line to share replays with CI and teammates (CI stays `read-only`
174
188
  unless `cache: 'read-write'` is set explicitly).
@@ -188,6 +202,10 @@ Never read `.e2e/ai-trace.json` directly; it is megabytes of resent context.
188
202
  Use `--no-cache` when the whole flow should be traced, since replayed steps
189
203
  make no model calls.
190
204
 
205
+ The trace replaces inline bytes and base64 in SDK image and file message
206
+ parts with decoded byte counts. URLs and text remain; encoded strings in
207
+ arbitrary tool result JSON or other fields are preserved.
208
+
191
209
  ## Beyond the built-in agent
192
210
 
193
211
  - `createAgent({ tools: { seedCart } })` adds AI SDK tools wrapped with
@@ -199,7 +217,7 @@ make no model calls.
199
217
  can be the `agent`; the runner still owns observations, actions, budgets,
200
218
  and the report.
201
219
 
202
- Full reference: https://e2e.docs.buildwithfern.com/agents
220
+ Full reference: https://e2e-docs.vercel.app/agents
203
221
 
204
222
  ## In CI
205
223
 
@@ -16,7 +16,8 @@ jq '.run.results[] | select(.status != "passed") | .attempts[-1]
16
16
 
17
17
  3. Artifacts named there live under `.e2e/artifacts/`: screenshots, a
18
18
  Playwright `trace.zip` per attempt (`npx playwright show-trace <file>`),
19
- downloads, and with `--debug` the transcript of every agent step.
19
+ downloads, with `--video` a `video/video.webm` per attempt, and with
20
+ `--debug` the transcript of every agent step.
20
21
 
21
22
  ## Error codes and what to do
22
23
 
@@ -35,7 +36,7 @@ jq '.run.results[] | select(.status != "passed") | .attempts[-1]
35
36
  | `ASSERTION_FAILED` | The expectation is wrong, or the state settles later than 5 s; for `agent.assert`, the judgment was false (explanation in the report) | Compare with the actual text in the report or screenshot; `{ timeout }` on the matcher; rewrite the question |
36
37
  | `ACTION_FAILED` | Element not actionable (covered, disabled, detached) or an operation timed out | Wait on the right condition with `expect` first; close overlays; check `actionTimeout` |
37
38
  | `TEST_TIMEOUT` | The attempt exceeded `timeout` (120 s) | Split the test, or raise `timeout` for slow flows and agent steps |
38
- | `MODEL_UNAVAILABLE` | No `E2E_MODEL`, no key, or an unknown provider | Export `E2E_MODEL=provider/model-id` and `E2E_MODEL_API_KEY`; confirm the model id |
39
+ | `MODEL_UNAVAILABLE` | No model (`createAgent({ model })`, `agent.model`, or `E2E_MODEL`), no key, or an unknown provider. Reported once for the run under `run.errors`; the run stops | Export `E2E_MODEL=provider/model-id` and `E2E_MODEL_API_KEY`, or pass a model to `createAgent`; confirm the model id |
39
40
  | `MODEL_PROVIDER_FAILED` | Network, 5xx, rate limit, or no credits after the transport retries | Check the key and the quota; retry; exit code 3 |
40
41
  | `STEP_TIMEOUT`, `STEP_BUDGET_EXHAUSTED` | The goal was too big or ambiguous, or the provider slow | Split the goal, use on-screen wording, add `context`, raise `timeout` and `actionTimeout`, `--debug` to read the transcript |
41
42
  | `POLICY_DENIED` | Navigation outside `allowedOrigins`; a `Secret` given to a sink that is not a password field; reading a secure field | Add the origin to `allowedOrigins`; fill secrets only into password inputs; assert the outcome instead of the value |
@@ -54,6 +55,7 @@ jq '.run.results[] | select(.status != "passed") | .attempts[-1]
54
55
  | `--no-cache` | Rule out a stale `agent.act` replay |
55
56
  | `--debug` | Read each agent step's duration, model calls, cost, and transcript |
56
57
  | `--ai-trace`, then `npx unbox-ai runs .e2e/ai-trace.json` | See exactly what the model was shown and called |
58
+ | `--video` | Watch the failed attempt; `step.startedAt` minus the video artifact's `startedAt` is the step's offset into it |
57
59
  | `command.log: '.e2e/logs/app.log'` | Read the app's own output when it never becomes ready or errors mid-test |
58
60
  | `await app.screenshot('before-submit')` | Attach evidence at a chosen point |
59
61
  | `CI=1 npx --no-install e2e run` | Reproduce CI-only behaviour: `ONLY_IN_CI`, read-only cache, `reuseExisting` ignored |
@@ -8,6 +8,7 @@ npx --no-install e2e list [files...] [options] # print what run would select, w
8
8
  npx --no-install e2e init [--yes] # scaffold a project, refresh the agent skill
9
9
  npx --no-install e2e guide [topic] # print this skill: setup, writing-tests, agent, running, debugging
10
10
  npx --no-install e2e cache ls|clear|stats # read or empty the trace cache
11
+ npx --no-install e2e telemetry [disable|enable] # anonymous usage telemetry: status, or the switch
11
12
  ```
12
13
 
13
14
  `run` flags:
@@ -16,7 +17,7 @@ npx --no-install e2e cache ls|clear|stats # read or empty the trace cache
16
17
  | --- | --- |
17
18
  | `[files...]` | Files, directories, or quoted globs relative to the project root. They narrow the config `tests` glob, never bypass it. |
18
19
  | `--config <path>` | Explicit config file. Default: `e2e.config.ts` or `.mts` found upward from the working directory. |
19
- | `--target <ids>` | Comma-separated target names. |
20
+ | `--target <ids>` | Comma-separated target names. Only selected targets start app commands and services; unknown names fail before startup. |
20
21
  | `--tag <tag>` | Repeatable tag filter; `--tag-mode all` requires every tag. |
21
22
  | `--headed` | Visible browser or simulator when the engine supports it. |
22
23
  | `--workers <n>`, `--retries <n>` | Override the resolved values. |
@@ -26,6 +27,7 @@ npx --no-install e2e cache ls|clear|stats # read or empty the trace cache
26
27
  | `--pass-with-no-tests` | Exit 0 when nothing matches instead of `NO_TESTS`. |
27
28
  | `--debug` | Phase timings and an agent step table on stderr; step transcripts saved as artifacts. |
28
29
  | `--ai-trace` | Record every model call to `.e2e/ai-trace.json`. |
30
+ | `--video` | Record every attempt (WebM on a browser engine, MP4 on a device engine) under its artifact directory; the failure recap names the file. Fails with `UNSUPPORTED_ARTIFACT` when the engine cannot record. |
29
31
 
30
32
  ```bash
31
33
  npx --no-install e2e run tests/signup.e2e.ts
@@ -67,7 +69,7 @@ recorded flow is stale — `--no-cache` only skips the cache for one run.
67
69
 
68
70
  - `list` (default): one line per file and target, a `Failed Tests` section
69
71
  with each error, its code, the failing line and a code frame, then a
70
- summary (`Test Files`, `Tests`, `AI`, `Duration`, `Report`).
72
+ summary (`Test Files`, `Tests`, `AI`, `Start at`, `Duration`, `Report`); setup steps (a first-run browser download, each service and app command) print above the tests and stay out of `Duration` or are split out of it as `(startup …)`.
71
73
  - `.e2e/report.json` is written on every run whatever the reporters:
72
74
  `run.status`, `run.exitCode`, `run.errors[]` (run-level failures such as
73
75
  `APP_UNREACHABLE`), and `run.results[]`, one per test and target, with
@@ -76,9 +78,9 @@ recorded flow is stale — `--no-cache` only skips the cache for one run.
76
78
  - `junit`: `.e2e/junit.xml` beside the report, for CI test summaries.
77
79
  Combine it with the terminal output: `--reporter list,junit`.
78
80
  - `json`: the report document on stdout.
79
- - Artifacts (screenshots, Playwright traces, `--debug` transcripts,
80
- downloads) live under `.e2e/artifacts/`; every path is recorded in the
81
- report.
81
+ - Artifacts (screenshots, Playwright traces, `--video` recordings, `--debug`
82
+ transcripts, downloads) live under `.e2e/artifacts/`; every path is
83
+ recorded in the report.
82
84
 
83
85
  ## Exit codes
84
86
 
@@ -62,8 +62,6 @@ export default {
62
62
  tests: 'tests/**/*.e2e.ts',
63
63
  targets: [
64
64
  {
65
- name: 'web',
66
- platform: 'web',
67
65
  engine: playwright({
68
66
  url: 'http://127.0.0.1:3000',
69
67
  command: { executable: 'pnpm', args: ['dev'], log: '.e2e/logs/app.log' },
@@ -80,19 +78,19 @@ export default {
80
78
 
81
79
  | Key | Default | Notes |
82
80
  | --- | --- | --- |
83
- | `targets` | required | Non-empty. Each target: `name` (used by `--target` and in reports), `platform` (`web`, `ios`, `android`, or any label), `engine`. |
81
+ | `targets` | required | Non-empty. Each target: `platform` (`web`, `ios`, `android`, or any label), `engine`, and an optional `name` (defaults to the platform; used by `--target` and in reports). |
84
82
  | `tests` | `'tests/**/*.e2e.ts'` | A glob or an array of globs, `/` separators. |
85
83
  | `timeout` | `120000` | Per test attempt, in ms. Also the default `agent.act` deadline. |
86
84
  | `actionTimeout` | `30000` | Every locator action and engine operation, including each observation inside an agent step. Raise it for slow model providers. |
87
85
  | `assertionTimeout` | `5000` | `expect` polling window. |
88
86
  | `retries` | `0`, `1` in CI | 0 to 10. |
89
- | `workers` | half the cores, `1` in CI | Test files run in parallel across workers. Use `1` for device targets. |
87
+ | `workers` | half the cores, `1` in CI | Test files run in parallel across workers, at most the `workers` the engine declares per target (a device target: one per device). |
90
88
  | `reporters` | `['list']` | `list`, `json`, `junit`. `json` excludes `list`. |
91
89
  | `cache` | `'read-write'`, `'read-only'` in CI | The trace cache for `agent.act`; `'off'` disables it. |
92
- | `agent` | unset | `createAgent(...)`, an options block `{ model, context, visionModel, maxSteps, maxModelCalls, vision, providerOptions }`, or a custom `StepExecutor`. Omitted, the built-in agent runs with `E2E_MODEL`. |
90
+ | `agent` | unset | `createAgent(...)`, an options block `{ model, context, visionModel, maxSteps, maxModelCalls, vision, providerOptions }`, or a custom `StepExecutor`. Omitted, the built-in agent runs with `E2E_MODEL`. A model passed to `createAgent({ model })` is the one model for `act` and the judgments, over `E2E_MODEL`. |
93
91
  | `credentials` | `{}` | Named `{ username, password, allowedOrigins? }` entries; `password` may be a function returning the value. |
94
92
  | `screen.testIdAttribute` | `'data-testid'` | Attribute read by `getByTestId`. |
95
- | `artifacts` | `['screenshot', 'trace']` | Kinds to keep, or `{ kinds, store }`. |
93
+ | `artifacts` | `['screenshot', 'trace']` | Kinds to keep (`screenshot`, `trace`, and the opt-in `video`), or `{ kinds, store, video }`; `video: { retain: 'on-failure' }` keeps only the recordings of attempts that did not pass. |
96
94
  | `projectId` | the package name | Report and cache identity. |
97
95
 
98
96
  ## The app under test
@@ -119,8 +117,8 @@ Two browsers are two targets sharing one app declaration:
119
117
  const app = { url: 'http://127.0.0.1:3000' };
120
118
  export default {
121
119
  targets: [
122
- { name: 'chromium', platform: 'web', engine: playwright(app) },
123
- { name: 'mobile-webkit', platform: 'web', engine: playwright({ ...app, browser: 'webkit', viewport: { width: 390, height: 844 } }) },
120
+ { name: 'chromium', engine: playwright(app) },
121
+ { name: 'mobile-webkit', engine: playwright({ ...app, browser: 'webkit', viewport: { width: 390, height: 844 } }) },
124
122
  ],
125
123
  } satisfies E2EConfig;
126
124
  ```
@@ -191,6 +189,7 @@ or read the address from the environment:
191
189
  | `E2E_VISION_MODEL` | Model for calls with `vision`; falls back to the main model. |
192
190
  | `E2E_USER_<NAME>_USERNAME`, `E2E_USER_<NAME>_PASSWORD` | Override `credentials.<name>`. `<NAME>` is the credential name uppercased, other characters as `_`. |
193
191
  | `CI` | Turns on CI defaults: `retries: 1`, `workers: 1`, `test.only` rejected, cache read-only, `reuseExisting` ignored. |
192
+ | `E2E_TELEMETRY_DISABLED`, `DO_NOT_TRACK` | Turn anonymous usage telemetry off; `e2e telemetry disable` saves the same choice. `E2E_TELEMETRY_DEBUG=1` prints each event instead of sending it. |
194
193
 
195
194
  ## Mobile targets
196
195
 
@@ -208,7 +207,7 @@ import { agentDeviceTools } from '@e2edev/agent-device/tools';
208
207
  const iphone = agentDevice({ platform: 'ios', app: 'com.example.app' });
209
208
 
210
209
  export default {
211
- targets: [{ name: 'ios', platform: 'ios', engine: iphone }],
210
+ targets: [{ engine: iphone }],
212
211
  workers: 1,
213
212
  agent: createAgent({ tools: agentDeviceTools(iphone) }),
214
213
  } satisfies E2EConfig;
@@ -217,7 +216,14 @@ export default {
217
216
  - `app` is a bundle id, package name, or display name opened fresh per
218
217
  attempt. `appPath` installs a `.app` or `.apk` once per worker; without
219
218
  `app`, the installed bundle is the one opened.
220
- - `workers: 1`: workers share one simulator.
219
+ - The engine declares one worker per device, so a single `device` target
220
+ runs one worker whatever `workers` says. To run on several at once, pass a
221
+ pool, `device: ['iPhone 17', 'iPhone 17 Pro']`; each worker slot drives one
222
+ entry and the test files spread across them. Devices boot in `prepare`,
223
+ before the run's clock starts.
224
+ - Cancelled device commands keep running; the next attempt waits for them.
225
+ Raw screenshot files are removed when capture finishes, including after
226
+ cancellation.
221
227
  - `screen`, `expect`, `app`, and `agent` work unchanged. Import `test` from
222
228
  `@e2edev/agent-device` to type the `device` fixture (`setAppearance`,
223
229
  `setNetwork`, `setPermission`, `installApp`, `locator('role=... id=...')`,
@@ -93,7 +93,6 @@ Fixtures are lazy; destructure them in the callback.
93
93
  | `back()` | One history step back. |
94
94
  | `restart()` | Recreates the context and keeps persisted state, including a restored session. |
95
95
  | `clearState()` | Clears cookies and storage, then relaunches. Not inside a serial group. |
96
- | `deepLink(url)` | Opens an allowed deep or universal link. |
97
96
  | `screenshot(label?)` | Saves a redacted screenshot as an artifact and returns its path. |
98
97
 
99
98
  ## Locators
@@ -104,7 +103,7 @@ subtree.
104
103
 
105
104
  | Query | Matches |
106
105
  | --- | --- |
107
- | `getByRole(role, { name?, exact?, checked?, disabled?, selected?, expanded?, hidden?, visible? })` | Semantic role, optionally by accessible name and state. First choice. |
106
+ | `getByRole(role, { name?, exact?, checked?, disabled?, selected?, expanded?, visible? })` | Semantic role, optionally by accessible name and state. First choice. |
108
107
  | `getByLabel(text, { exact?, visible? })` | Form controls by label. |
109
108
  | `getByPlaceholder(text)` | Inputs by placeholder. |
110
109
  | `getByText(text, { exact?, visible? })` | Visible text. |
@@ -118,7 +117,9 @@ Roles: `button`, `link`, `textbox`, `searchbox`, `combobox`, `listbox`,
118
117
  `contentinfo`, `complementary`, `region`. The union is closed; anything else
119
118
  is a type error.
120
119
 
121
- Text matching is exact by default after whitespace normalization.
120
+ Text matching is exact by default after whitespace normalization, and
121
+ `getByText` returns the innermost match: a container that echoes its child's
122
+ text (an iOS Text host view around its StaticText) does not count twice.
122
123
  `exact: false` is a case-insensitive substring match; a `RegExp` matches as
123
124
  written.
124
125
 
@@ -146,9 +147,9 @@ await screen.scrollUntilVisible(screen.getByRole('button', { name: 'Accept' }));
146
147
  Each action resolves one node, waits for it to be actionable within
147
148
  `config.actionTimeout` (30 s, or `{ timeout }`), and performs one operation.
148
149
 
149
- `tap()` (alias `click()`), `doubleTap()`, `longPress({ durationMs? })`,
150
+ `tap()` (alias `click()`), `doubleTap()`, `longPress({ duration? })`,
150
151
  `fill(value | Secret)`, `clear()`, `press(key)`, `check()`, `uncheck()`,
151
- `selectOption(label | { label } | { index })`, `focus()`, `hover()`,
152
+ `selectOption(label | { label } | { value } | { index })`, `focus()`, `hover()`,
152
153
  `setInputFiles(paths)` (relative to the project root), `dragTo(locator)`,
153
154
  `scrollIntoView()`, `swipe({ direction, momentum? })`.
154
155
 
@@ -1,18 +0,0 @@
1
- /**
2
- * Live agent tracing for iterating on agentic tests: `E2E_DEBUG=agent` streams
3
- * every invocation phase, model selection, and locate-candidate outcome to
4
- * stderr as it happens, from whichever process runs the attempt. This is a
5
- * debugging aid, not telemetry: the report stays the canonical record.
6
- */
7
- /**
8
- * Writes one bounded, sanitized trace line when agent tracing is on. Takes a
9
- * thunk so call sites in polling loops pay nothing while tracing is off.
10
- */
11
- export declare function agentTrace(message: () => string): void;
12
- /**
13
- * Dumps one full observation as the model will receive it. The text is
14
- * already redacted and size-bounded by the observation pipeline, so the dump
15
- * needs no further truncation to stay safe.
16
- */
17
- export declare function observationTrace(header: () => string, text: string): void;
18
- //# sourceMappingURL=trace.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/internal/trace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6BH;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,MAAM,GAAG,IAAI,CAGtD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGzE"}
@@ -1,46 +0,0 @@
1
- /**
2
- * Live agent tracing for iterating on agentic tests: `E2E_DEBUG=agent` streams
3
- * every invocation phase, model selection, and locate-candidate outcome to
4
- * stderr as it happens, from whichever process runs the attempt. This is a
5
- * debugging aid, not telemetry: the report stays the canonical record.
6
- */
7
- import { sanitizeText, truncateUtf8 } from './errors.js';
8
- /**
9
- * Parsed on first use, not at import, so tests and embedders can set
10
- * `E2E_DEBUG` after this module loads but before the first trace call.
11
- */
12
- let cachedFlags;
13
- function flags() {
14
- cachedFlags ??= new Set((process.env['E2E_DEBUG'] ?? '')
15
- .split(',')
16
- .map((flag) => flag.trim())
17
- .filter((flag) => flag !== ''));
18
- return cachedFlags;
19
- }
20
- function agentTraceEnabled() {
21
- return flags().has('agent') || flags().has('all');
22
- }
23
- /** `E2E_DEBUG=observations` additionally dumps every observation the model sees. */
24
- function observationTraceEnabled() {
25
- return flags().has('observations') || flags().has('all');
26
- }
27
- /**
28
- * Writes one bounded, sanitized trace line when agent tracing is on. Takes a
29
- * thunk so call sites in polling loops pay nothing while tracing is off.
30
- */
31
- export function agentTrace(message) {
32
- if (!agentTraceEnabled())
33
- return;
34
- process.stderr.write(`[e2e agent] ${truncateUtf8(sanitizeText(message()), 2_000)}\n`);
35
- }
36
- /**
37
- * Dumps one full observation as the model will receive it. The text is
38
- * already redacted and size-bounded by the observation pipeline, so the dump
39
- * needs no further truncation to stay safe.
40
- */
41
- export function observationTrace(header, text) {
42
- if (!observationTraceEnabled())
43
- return;
44
- process.stderr.write(`[e2e observation] ${header()}\n${text}\n[e2e observation] end\n`);
45
- }
46
- //# sourceMappingURL=trace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/internal/trace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD;;;GAGG;AACH,IAAI,WAA4C,CAAC;AAEjD,SAAS,KAAK;IACZ,WAAW,KAAK,IAAI,GAAG,CACrB,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;SAC7B,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CACjC,CAAC;IACF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,KAAK,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,oFAAoF;AACpF,SAAS,uBAAuB;IAC9B,OAAO,KAAK,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,IAAI,CAAC,iBAAiB,EAAE;QAAE,OAAO;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAoB,EAAE,IAAY;IACjE,IAAI,CAAC,uBAAuB,EAAE;QAAE,OAAO;IACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,MAAM,EAAE,KAAK,IAAI,2BAA2B,CAAC,CAAC;AAC1F,CAAC"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Programmatic host surface (`@e2edev/e2e/run`): run the runner in-process and stream
3
- * structured events, without shelling out to the CLI. This is how an
4
- * embedding host — a hosted platform, a CI wrapper, an IDE — drives runs.
5
- *
6
- * The CLI is a thin consumer of exactly this surface; nothing here is
7
- * CLI-only. The surface is host tooling, not part of sdk-0.1: it can grow in
8
- * minors, and `report.json` (report-1) stays the canonical record of a run.
9
- */
10
- export { run } from './runner.ts';
11
- export type { RunOptions, RunOutcome } from './runner.ts';
12
- export type { RunEvent, RunEventFact, RunEventHeader, RunEventOf, RunEventResult, RunEventSink, RunExitCode, } from './events.ts';
13
- export type { ArtifactProducer, ArtifactRecord, AttemptRecord, ResultRecord, ResultStatus, RunError, SerialAttemptRecord, SerialGroupRecord, SerialMemberRecord, } from './records.ts';
14
- export type { StepAgentDetails, StepCacheInfo, StepEvent, StepKind, StepMetrics, StepModelInfo, StepProgress, StepRecord, } from './steps.ts';
15
- export type { Report1Document } from '../report/build.ts';
16
- export type { ErrorCategory, ErrorPhase, SerializedError } from '../internal/errors.ts';
17
- export type { TestIdentity } from '../collect/collect.ts';
18
- export type { SkipInfo } from '../collect/select.ts';
19
- //# sourceMappingURL=public.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/run/public.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1D,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxF,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Programmatic host surface (`@e2edev/e2e/run`): run the runner in-process and stream
3
- * structured events, without shelling out to the CLI. This is how an
4
- * embedding host — a hosted platform, a CI wrapper, an IDE — drives runs.
5
- *
6
- * The CLI is a thin consumer of exactly this surface; nothing here is
7
- * CLI-only. The surface is host tooling, not part of sdk-0.1: it can grow in
8
- * minors, and `report.json` (report-1) stays the canonical record of a run.
9
- */
10
- export { run } from './runner.js';
11
- //# sourceMappingURL=public.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/run/public.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC"}