@e2edev/e2e 0.11.0 → 0.13.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 (344) hide show
  1. package/README.md +7 -7
  2. package/dist/agent/act.d.ts +43 -9
  3. package/dist/agent/act.d.ts.map +1 -1
  4. package/dist/agent/act.js +126 -734
  5. package/dist/agent/act.js.map +1 -1
  6. package/dist/agent/action-dispatcher.d.ts +98 -0
  7. package/dist/agent/action-dispatcher.d.ts.map +1 -0
  8. package/dist/agent/action-dispatcher.js +319 -0
  9. package/dist/agent/action-dispatcher.js.map +1 -0
  10. package/dist/agent/actions.d.ts +16 -1
  11. package/dist/agent/actions.d.ts.map +1 -1
  12. package/dist/agent/actions.js +5 -1
  13. package/dist/agent/actions.js.map +1 -1
  14. package/dist/agent/default-agent.d.ts +17 -8
  15. package/dist/agent/default-agent.d.ts.map +1 -1
  16. package/dist/agent/default-agent.js +65 -43
  17. package/dist/agent/default-agent.js.map +1 -1
  18. package/dist/agent/executor.d.ts +30 -2
  19. package/dist/agent/executor.d.ts.map +1 -1
  20. package/dist/agent/executor.js.map +1 -1
  21. package/dist/agent/index.js +1 -1
  22. package/dist/agent/index.js.map +1 -1
  23. package/dist/agent/interactive-step.d.ts +38 -0
  24. package/dist/agent/interactive-step.d.ts.map +1 -0
  25. package/dist/agent/interactive-step.js +131 -0
  26. package/dist/agent/interactive-step.js.map +1 -0
  27. package/dist/agent/invocation.d.ts +4 -9
  28. package/dist/agent/invocation.d.ts.map +1 -1
  29. package/dist/agent/invocation.js +1 -6
  30. package/dist/agent/invocation.js.map +1 -1
  31. package/dist/agent/model/sdk.d.ts +1 -1
  32. package/dist/agent/model/sdk.js +1 -1
  33. package/dist/agent/model/tool-choice.d.ts +21 -0
  34. package/dist/agent/model/tool-choice.d.ts.map +1 -0
  35. package/dist/agent/model/tool-choice.js +49 -0
  36. package/dist/agent/model/tool-choice.js.map +1 -0
  37. package/dist/agent/observation-feed.d.ts +123 -0
  38. package/dist/agent/observation-feed.d.ts.map +1 -0
  39. package/dist/agent/observation-feed.js +281 -0
  40. package/dist/agent/observation-feed.js.map +1 -0
  41. package/dist/agent/observation.d.ts +14 -1
  42. package/dist/agent/observation.d.ts.map +1 -1
  43. package/dist/agent/observation.js +58 -2
  44. package/dist/agent/observation.js.map +1 -1
  45. package/dist/agent/operation-queue.d.ts +21 -0
  46. package/dist/agent/operation-queue.d.ts.map +1 -0
  47. package/dist/agent/operation-queue.js +27 -0
  48. package/dist/agent/operation-queue.js.map +1 -0
  49. package/dist/agent/pixels.d.ts +21 -0
  50. package/dist/agent/pixels.d.ts.map +1 -0
  51. package/dist/agent/pixels.js +85 -0
  52. package/dist/agent/pixels.js.map +1 -0
  53. package/dist/agent/point-tap.d.ts +52 -0
  54. package/dist/agent/point-tap.d.ts.map +1 -0
  55. package/dist/agent/point-tap.js +88 -0
  56. package/dist/agent/point-tap.js.map +1 -0
  57. package/dist/agent/primitives.d.ts +7 -1
  58. package/dist/agent/primitives.d.ts.map +1 -1
  59. package/dist/agent/primitives.js +96 -25
  60. package/dist/agent/primitives.js.map +1 -1
  61. package/dist/agent/replay.d.ts +8 -3
  62. package/dist/agent/replay.d.ts.map +1 -1
  63. package/dist/agent/replay.js +44 -15
  64. package/dist/agent/replay.js.map +1 -1
  65. package/dist/agent/screen-update.d.ts +50 -18
  66. package/dist/agent/screen-update.d.ts.map +1 -1
  67. package/dist/agent/screen-update.js +76 -94
  68. package/dist/agent/screen-update.js.map +1 -1
  69. package/dist/agent/step-accounting.d.ts +95 -0
  70. package/dist/agent/step-accounting.d.ts.map +1 -0
  71. package/dist/agent/step-accounting.js +201 -0
  72. package/dist/agent/step-accounting.js.map +1 -0
  73. package/dist/agent/step-cache.d.ts.map +1 -1
  74. package/dist/agent/step-cache.js +2 -2
  75. package/dist/agent/step-cache.js.map +1 -1
  76. package/dist/agent/tool-loop.d.ts +4 -4
  77. package/dist/agent/tool-loop.d.ts.map +1 -1
  78. package/dist/agent/tool-loop.js +109 -25
  79. package/dist/agent/tool-loop.js.map +1 -1
  80. package/dist/agent/transcript-compaction.d.ts +38 -0
  81. package/dist/agent/transcript-compaction.d.ts.map +1 -0
  82. package/dist/agent/transcript-compaction.js +165 -0
  83. package/dist/agent/transcript-compaction.js.map +1 -0
  84. package/dist/cache/recorder.d.ts.map +1 -1
  85. package/dist/cache/recorder.js +20 -0
  86. package/dist/cache/recorder.js.map +1 -1
  87. package/dist/cache/trace.d.ts +28 -1
  88. package/dist/cache/trace.d.ts.map +1 -1
  89. package/dist/cache/trace.js +44 -0
  90. package/dist/cache/trace.js.map +1 -1
  91. package/dist/cli/docs-url.d.ts +1 -1
  92. package/dist/cli/docs-url.d.ts.map +1 -1
  93. package/dist/cli/docs-url.js +1 -1
  94. package/dist/cli/docs-url.js.map +1 -1
  95. package/dist/cli/index.d.ts.map +1 -1
  96. package/dist/cli/index.js +71 -26
  97. package/dist/cli/index.js.map +1 -1
  98. package/dist/cli/init/engine-versions.json +1 -1
  99. package/dist/cli/init/engines.d.ts +26 -16
  100. package/dist/cli/init/engines.d.ts.map +1 -1
  101. package/dist/cli/init/engines.js +33 -24
  102. package/dist/cli/init/engines.js.map +1 -1
  103. package/dist/cli/init/gateways.js +3 -3
  104. package/dist/cli/init/mcp-config.d.ts +31 -0
  105. package/dist/cli/init/mcp-config.d.ts.map +1 -0
  106. package/dist/cli/init/mcp-config.js +72 -0
  107. package/dist/cli/init/mcp-config.js.map +1 -0
  108. package/dist/cli/init/scaffold.d.ts +1 -1
  109. package/dist/cli/init/scaffold.js +2 -2
  110. package/dist/cli/init/scaffold.js.map +1 -1
  111. package/dist/cli/init.d.ts.map +1 -1
  112. package/dist/cli/init.js +65 -29
  113. package/dist/cli/init.js.map +1 -1
  114. package/dist/cli/mcp.d.ts +15 -0
  115. package/dist/cli/mcp.d.ts.map +1 -0
  116. package/dist/cli/mcp.js +63 -0
  117. package/dist/cli/mcp.js.map +1 -0
  118. package/dist/collect/collect.d.ts +8 -3
  119. package/dist/collect/collect.d.ts.map +1 -1
  120. package/dist/collect/collect.js +29 -5
  121. package/dist/collect/collect.js.map +1 -1
  122. package/dist/collect/registry.d.ts +20 -5
  123. package/dist/collect/registry.d.ts.map +1 -1
  124. package/dist/collect/registry.js +162 -56
  125. package/dist/collect/registry.js.map +1 -1
  126. package/dist/collect/select.d.ts +9 -2
  127. package/dist/collect/select.d.ts.map +1 -1
  128. package/dist/collect/select.js +60 -12
  129. package/dist/collect/select.js.map +1 -1
  130. package/dist/config/agent.d.ts +1 -7
  131. package/dist/config/agent.d.ts.map +1 -1
  132. package/dist/config/agent.js +5 -8
  133. package/dist/config/agent.js.map +1 -1
  134. package/dist/config/app.d.ts +24 -2
  135. package/dist/config/app.d.ts.map +1 -1
  136. package/dist/config/app.js +82 -15
  137. package/dist/config/app.js.map +1 -1
  138. package/dist/config/resolve.d.ts +23 -6
  139. package/dist/config/resolve.d.ts.map +1 -1
  140. package/dist/config/resolve.js +34 -14
  141. package/dist/config/resolve.js.map +1 -1
  142. package/dist/credentials.d.ts +6 -0
  143. package/dist/credentials.d.ts.map +1 -1
  144. package/dist/credentials.js +9 -0
  145. package/dist/credentials.js.map +1 -1
  146. package/dist/engine/contract.d.ts +9 -2
  147. package/dist/engine/contract.d.ts.map +1 -1
  148. package/dist/engine/contract.js.map +1 -1
  149. package/dist/engine/index.d.ts +18 -4
  150. package/dist/engine/index.d.ts.map +1 -1
  151. package/dist/engine/index.js +8 -0
  152. package/dist/engine/index.js.map +1 -1
  153. package/dist/engine/session.d.ts.map +1 -1
  154. package/dist/engine/session.js +3 -0
  155. package/dist/engine/session.js.map +1 -1
  156. package/dist/engine/surface.d.ts +6 -2
  157. package/dist/engine/surface.d.ts.map +1 -1
  158. package/dist/engine/surface.js.map +1 -1
  159. package/dist/expect/attempt.d.ts +15 -0
  160. package/dist/expect/attempt.d.ts.map +1 -0
  161. package/dist/expect/attempt.js +33 -0
  162. package/dist/expect/attempt.js.map +1 -0
  163. package/dist/expect/index.d.ts +7 -5
  164. package/dist/expect/index.d.ts.map +1 -1
  165. package/dist/expect/index.js +8 -1
  166. package/dist/expect/index.js.map +1 -1
  167. package/dist/expect/poll.d.ts +5 -0
  168. package/dist/expect/poll.d.ts.map +1 -0
  169. package/dist/expect/poll.js +118 -0
  170. package/dist/expect/poll.js.map +1 -0
  171. package/dist/expect/values.d.ts.map +1 -1
  172. package/dist/expect/values.js +6 -1
  173. package/dist/expect/values.js.map +1 -1
  174. package/dist/explore/body.d.ts.map +1 -1
  175. package/dist/explore/body.js +2 -0
  176. package/dist/explore/body.js.map +1 -1
  177. package/dist/explore/executor.js +16 -11
  178. package/dist/explore/executor.js.map +1 -1
  179. package/dist/explore/index.d.ts +3 -2
  180. package/dist/explore/index.d.ts.map +1 -1
  181. package/dist/explore/index.js +11 -9
  182. package/dist/explore/index.js.map +1 -1
  183. package/dist/explore/plan.d.ts.map +1 -1
  184. package/dist/explore/plan.js +16 -5
  185. package/dist/explore/plan.js.map +1 -1
  186. package/dist/explore/progress.d.ts +43 -0
  187. package/dist/explore/progress.d.ts.map +1 -0
  188. package/dist/explore/progress.js +9 -0
  189. package/dist/explore/progress.js.map +1 -0
  190. package/dist/explore/state.d.ts +13 -12
  191. package/dist/explore/state.d.ts.map +1 -1
  192. package/dist/explore/state.js +28 -11
  193. package/dist/explore/state.js.map +1 -1
  194. package/dist/internal/ai-trace.d.ts +2 -0
  195. package/dist/internal/ai-trace.d.ts.map +1 -1
  196. package/dist/internal/ai-trace.js +3 -0
  197. package/dist/internal/ai-trace.js.map +1 -1
  198. package/dist/internal/brands.d.ts +2 -0
  199. package/dist/internal/brands.d.ts.map +1 -1
  200. package/dist/internal/brands.js +2 -0
  201. package/dist/internal/brands.js.map +1 -1
  202. package/dist/internal/geometry.d.ts +13 -0
  203. package/dist/internal/geometry.d.ts.map +1 -0
  204. package/dist/internal/geometry.js +16 -0
  205. package/dist/internal/geometry.js.map +1 -0
  206. package/dist/internal/ids.d.ts +2 -2
  207. package/dist/internal/ids.d.ts.map +1 -1
  208. package/dist/internal/ids.js +3 -3
  209. package/dist/internal/ids.js.map +1 -1
  210. package/dist/internal/package-manager.d.ts +4 -0
  211. package/dist/internal/package-manager.d.ts.map +1 -1
  212. package/dist/internal/package-manager.js +26 -0
  213. package/dist/internal/package-manager.js.map +1 -1
  214. package/dist/internal/urls.d.ts +6 -0
  215. package/dist/internal/urls.d.ts.map +1 -1
  216. package/dist/internal/urls.js +28 -0
  217. package/dist/internal/urls.js.map +1 -1
  218. package/dist/mcp/catalog.d.ts +51 -0
  219. package/dist/mcp/catalog.d.ts.map +1 -0
  220. package/dist/mcp/catalog.js +141 -0
  221. package/dist/mcp/catalog.js.map +1 -0
  222. package/dist/mcp/config.d.ts +11 -0
  223. package/dist/mcp/config.d.ts.map +1 -0
  224. package/dist/mcp/config.js +16 -0
  225. package/dist/mcp/config.js.map +1 -0
  226. package/dist/mcp/server.d.ts +29 -0
  227. package/dist/mcp/server.d.ts.map +1 -0
  228. package/dist/mcp/server.js +86 -0
  229. package/dist/mcp/server.js.map +1 -0
  230. package/dist/mcp/session.d.ts +68 -0
  231. package/dist/mcp/session.d.ts.map +1 -0
  232. package/dist/mcp/session.js +319 -0
  233. package/dist/mcp/session.js.map +1 -0
  234. package/dist/mcp/tools.d.ts +77 -0
  235. package/dist/mcp/tools.d.ts.map +1 -0
  236. package/dist/mcp/tools.js +179 -0
  237. package/dist/mcp/tools.js.map +1 -0
  238. package/dist/report/build.d.ts +8 -0
  239. package/dist/report/build.d.ts.map +1 -1
  240. package/dist/report/build.js +3 -1
  241. package/dist/report/build.js.map +1 -1
  242. package/dist/report/format.d.ts +19 -0
  243. package/dist/report/format.d.ts.map +1 -1
  244. package/dist/report/format.js +42 -0
  245. package/dist/report/format.js.map +1 -1
  246. package/dist/report/junit.d.ts.map +1 -1
  247. package/dist/report/junit.js +4 -1
  248. package/dist/report/junit.js.map +1 -1
  249. package/dist/report/list-explore.d.ts +109 -0
  250. package/dist/report/list-explore.d.ts.map +1 -0
  251. package/dist/report/list-explore.js +388 -0
  252. package/dist/report/list-explore.js.map +1 -0
  253. package/dist/report/list.d.ts +31 -1
  254. package/dist/report/list.d.ts.map +1 -1
  255. package/dist/report/list.js +114 -16
  256. package/dist/report/list.js.map +1 -1
  257. package/dist/report/running-tree.d.ts +7 -7
  258. package/dist/report/running-tree.d.ts.map +1 -1
  259. package/dist/report/running-tree.js +12 -13
  260. package/dist/report/running-tree.js.map +1 -1
  261. package/dist/run/app-ports.d.ts +17 -0
  262. package/dist/run/app-ports.d.ts.map +1 -0
  263. package/dist/run/app-ports.js +74 -0
  264. package/dist/run/app-ports.js.map +1 -0
  265. package/dist/run/events.d.ts +21 -7
  266. package/dist/run/events.d.ts.map +1 -1
  267. package/dist/run/events.js.map +1 -1
  268. package/dist/run/execute.d.ts +2 -2
  269. package/dist/run/execute.d.ts.map +1 -1
  270. package/dist/run/execute.js +42 -20
  271. package/dist/run/execute.js.map +1 -1
  272. package/dist/run/extended-fixtures.d.ts +33 -0
  273. package/dist/run/extended-fixtures.d.ts.map +1 -0
  274. package/dist/run/extended-fixtures.js +91 -0
  275. package/dist/run/extended-fixtures.js.map +1 -0
  276. package/dist/run/fixtures.d.ts +10 -4
  277. package/dist/run/fixtures.d.ts.map +1 -1
  278. package/dist/run/fixtures.js +40 -27
  279. package/dist/run/fixtures.js.map +1 -1
  280. package/dist/run/in-process.d.ts.map +1 -1
  281. package/dist/run/in-process.js +4 -3
  282. package/dist/run/in-process.js.map +1 -1
  283. package/dist/run/managed-process.d.ts +18 -0
  284. package/dist/run/managed-process.d.ts.map +1 -1
  285. package/dist/run/managed-process.js +101 -6
  286. package/dist/run/managed-process.js.map +1 -1
  287. package/dist/run/provision.d.ts +51 -0
  288. package/dist/run/provision.d.ts.map +1 -0
  289. package/dist/run/provision.js +94 -0
  290. package/dist/run/provision.js.map +1 -0
  291. package/dist/run/realm.d.ts +5 -4
  292. package/dist/run/realm.d.ts.map +1 -1
  293. package/dist/run/realm.js +8 -7
  294. package/dist/run/realm.js.map +1 -1
  295. package/dist/run/records.d.ts +4 -0
  296. package/dist/run/records.d.ts.map +1 -1
  297. package/dist/run/runner.d.ts +14 -5
  298. package/dist/run/runner.d.ts.map +1 -1
  299. package/dist/run/runner.js +28 -71
  300. package/dist/run/runner.js.map +1 -1
  301. package/dist/run/scheduler.d.ts +5 -2
  302. package/dist/run/scheduler.d.ts.map +1 -1
  303. package/dist/run/scheduler.js +13 -10
  304. package/dist/run/scheduler.js.map +1 -1
  305. package/dist/run/serial.d.ts +1 -1
  306. package/dist/run/serial.d.ts.map +1 -1
  307. package/dist/run/serial.js +7 -2
  308. package/dist/run/serial.js.map +1 -1
  309. package/dist/run/standalone.d.ts +63 -0
  310. package/dist/run/standalone.d.ts.map +1 -0
  311. package/dist/run/standalone.js +152 -0
  312. package/dist/run/standalone.js.map +1 -0
  313. package/dist/run/units.d.ts +6 -3
  314. package/dist/run/units.d.ts.map +1 -1
  315. package/dist/run/units.js +0 -0
  316. package/dist/run/units.js.map +1 -1
  317. package/dist/run/worker/entry.js +4 -3
  318. package/dist/run/worker/entry.js.map +1 -1
  319. package/dist/run/worker/protocol.d.ts +12 -1
  320. package/dist/run/worker/protocol.d.ts.map +1 -1
  321. package/dist/run/worker/protocol.js.map +1 -1
  322. package/dist/run/worker/session.d.ts +3 -4
  323. package/dist/run/worker/session.d.ts.map +1 -1
  324. package/dist/run/worker/session.js +5 -4
  325. package/dist/run/worker/session.js.map +1 -1
  326. package/dist/types.d.ts +77 -17
  327. package/dist/types.d.ts.map +1 -1
  328. package/package.json +11 -7
  329. package/skills/e2e/SKILL.md +9 -7
  330. package/skills/e2e/references/agent.md +27 -12
  331. package/skills/e2e/references/debugging.md +5 -5
  332. package/skills/e2e/references/explore.md +15 -9
  333. package/skills/e2e/references/mcp.md +88 -0
  334. package/skills/e2e/references/running.md +23 -18
  335. package/skills/e2e/references/setup.md +32 -18
  336. package/skills/e2e/references/writing-tests.md +12 -5
  337. package/dist/agent/model/router.d.ts +0 -36
  338. package/dist/agent/model/router.d.ts.map +0 -1
  339. package/dist/agent/model/router.js +0 -45
  340. package/dist/agent/model/router.js.map +0 -1
  341. package/dist/explore/reporter.d.ts +0 -11
  342. package/dist/explore/reporter.d.ts.map +0 -1
  343. package/dist/explore/reporter.js +0 -54
  344. package/dist/explore/reporter.js.map +0 -1
@@ -0,0 +1,94 @@
1
+ /**
2
+ * What a run and a standalone attempt both do before the first engine
3
+ * session: grade each target against its engine declaration, run the
4
+ * engines' `prepare` hooks, and start the app processes the engines declare.
5
+ * One owner, so the dev-loop session (`e2e mcp`) and a test run can never
6
+ * provision differently.
7
+ */
8
+ import { ConfigurationError, translateProvisioningError } from '../internal/errors.js';
9
+ import { describeTarget } from '../report/build.js';
10
+ import { declaredProcesses } from './declared-processes.js';
11
+ import { ManagedProcess, ServiceStack } from './managed-process.js';
12
+ /**
13
+ * Grades one target from its engine declaration and validates the configured
14
+ * artifacts against it; returns the report provenance.
15
+ */
16
+ export function validateEngine(target, config) {
17
+ const provenance = describeTarget(target);
18
+ // A best-effort kind is captured when the engine can; a required one is a
19
+ // contract the engine must be able to honour before any test starts.
20
+ for (const [artifact, policy] of config.artifacts) {
21
+ if (policy === 'required' && !provenance.artifactCapabilities.includes(artifact)) {
22
+ throw new ConfigurationError('UNSUPPORTED_ARTIFACT', `target "${target.name}" (engine ${provenance.engine.name}) does not support the configured "${artifact}" artifact`);
23
+ }
24
+ }
25
+ return provenance;
26
+ }
27
+ /**
28
+ * Runs one target's `prepare` hook for `slots` worker slots, streaming its
29
+ * progress lines to `log`. Resolves to nothing when the engine declares no
30
+ * hook. Callers run targets in turn: two engines provisioning the same
31
+ * toolchain would race, and the notices of one download read better than
32
+ * two interleaved.
33
+ */
34
+ export async function prepareEngine(target, slots, scope, log) {
35
+ const engine = target.engine;
36
+ if (engine?.prepare === undefined)
37
+ return;
38
+ try {
39
+ return await engine.prepare({ runId: scope.runId, targetName: target.name, slots, env: scope.env, signal: scope.signal, log });
40
+ }
41
+ catch (cause) {
42
+ throw translateProvisioningError(cause, ` while preparing engine ${engine.name} for target "${target.name}"`);
43
+ }
44
+ }
45
+ /**
46
+ * Starts what the targets' engines declare: the dependency services first,
47
+ * then every distinct app command. Declarations are deduplicated across
48
+ * targets (two browsers on one dev server share one process), and every
49
+ * service is ready before the first app command starts. Nothing spawns once
50
+ * `signal` aborted; what did start is returned for teardown either way.
51
+ */
52
+ export async function startDeclaredProcesses(targets, projectRoot, hooks, signal, debug) {
53
+ const declared = declaredProcesses(targets);
54
+ let services;
55
+ const apps = [];
56
+ const processes = {
57
+ async stop(onFailure) {
58
+ for (const app of apps.splice(0).toReversed()) {
59
+ try {
60
+ await app.stop();
61
+ }
62
+ catch (cause) {
63
+ onFailure(cause);
64
+ }
65
+ }
66
+ await services?.stop(onFailure);
67
+ },
68
+ };
69
+ try {
70
+ if (declared.services.length > 0) {
71
+ const stack = new ServiceStack(declared.services, projectRoot, hooks('service'));
72
+ services = stack;
73
+ await debug.time('app.services.start', () => stack.start(signal));
74
+ if (signal.aborted)
75
+ return processes;
76
+ }
77
+ for (const { label, command, readyUrl } of declared.commands) {
78
+ const app = new ManagedProcess(label, command, projectRoot, { readyUrl }, hooks('app'));
79
+ apps.push(app);
80
+ await debug.time(`app.start(${label})`, () => app.start(signal));
81
+ if (signal.aborted)
82
+ return processes;
83
+ }
84
+ return processes;
85
+ }
86
+ catch (cause) {
87
+ // A service or command that failed to start must not leave the earlier
88
+ // ones running; the startup failure is the one reported, so a cleanup
89
+ // failure here is a notice at most.
90
+ await processes.stop((failure) => hooks('app').notice?.(`cleanup after a failed start: ${String(failure)}`));
91
+ throw cause;
92
+ }
93
+ }
94
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/run/provision.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  import { type SerializedError } from '../internal/errors.ts';
3
3
  import { DebugTrace } from '../internal/debug.ts';
4
4
  import type { CollectedTest } from '../collect/collect.ts';
5
- import { type GroupNode, type HookKind, type ModuleRegistration, type RegisteredTest, type TestHook } from '../collect/registry.ts';
5
+ import { type GroupNode, type ModuleRegistration, type RegisteredTest, type TestHook } from '../collect/registry.ts';
6
6
  import type { TestTargetPair } from '../collect/select.ts';
7
7
  import type { Platform } from '../types.ts';
8
8
  import type { RunError } from './records.ts';
@@ -28,10 +28,11 @@ export interface Realm {
28
28
  /** Finds a registered test in a re-imported realm by its exact title path. */
29
29
  export declare function findRegistered(realm: Realm, test: CollectedTest): RegisteredTest | undefined;
30
30
  /**
31
- * Runs one hook within its budget. A hook that overruns fails with the
32
- * runner's timeout error; `onTimeout` lets the caller cancel what it started.
31
+ * Runs one hook, or a fixture teardown, within its budget. One that overruns
32
+ * fails with the runner's timeout error naming `label`; `onTimeout` lets the
33
+ * caller cancel what it started.
33
34
  */
34
- export declare function runHook(kind: HookKind, run: () => void | Promise<void>, timeoutMs: number, onTimeout?: () => void): Promise<void>;
35
+ export declare function runHook(label: string, run: () => void | Promise<void>, timeoutMs: number, onTimeout?: () => void): Promise<void>;
35
36
  export interface RealmManagerOptions {
36
37
  readonly targetName: string;
37
38
  readonly platform: Platform;
@@ -1 +1 @@
1
- {"version":3,"file":"realm.d.ts","sourceRoot":"","sources":["../../src/run/realm.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAGlF,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,kBAAkB,EAEvB,KAAK,cAAc,EAEnB,KAAK,QAAQ,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C;;;;GAIG;AACH,KAAK,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnC,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,kBAAkB,CAAC;IACjC,kEAAkE;IAClE,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAChD;;;;OAIG;IACH,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAE5F;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,+EAA+E;AAC/E,qBAAa,YAAY;IAIX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IAEnC,YAA6B,OAAO,EAAE,mBAAmB,EAExD;IAED,mDAAmD;IAC7C,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAQjD;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,EAAE,kBAAkB,GAAG,KAAK,CAI7C;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAK/E;IAED,uEAAuE;IACjE,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAyB1F;IAED;;;;;;;;;;OAUG;IACG,aAAa,CACjB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA0BtC;IAED,uDAAuD;IACjD,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvC;IAED,2DAA2D;IAC3D,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;CAGtB"}
1
+ {"version":3,"file":"realm.d.ts","sourceRoot":"","sources":["../../src/run/realm.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAGlF,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,kBAAkB,EAEvB,KAAK,cAAc,EAEnB,KAAK,QAAQ,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C;;;;GAIG;AACH,KAAK,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnC,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,kBAAkB,CAAC;IACjC,kEAAkE;IAClE,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAChD;;;;OAIG;IACH,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAE5F;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,+EAA+E;AAC/E,qBAAa,YAAY;IAIX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IAEnC,YAA6B,OAAO,EAAE,mBAAmB,EAExD;IAED,mDAAmD;IAC7C,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CASjD;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,EAAE,kBAAkB,GAAG,KAAK,CAI7C;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAK/E;IAED,uEAAuE;IACjE,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAyB1F;IAED;;;;;;;;;;OAUG;IACG,aAAa,CACjB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA0BtC;IAED,uDAAuD;IACjD,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvC;IAED,2DAA2D;IAC3D,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;CAGtB"}
package/dist/run/realm.js CHANGED
@@ -10,13 +10,14 @@ export function findRegistered(realm, test) {
10
10
  return realm.testsByKey.get(titlePathKey(test.titlePath));
11
11
  }
12
12
  /**
13
- * Runs one hook within its budget. A hook that overruns fails with the
14
- * runner's timeout error; `onTimeout` lets the caller cancel what it started.
13
+ * Runs one hook, or a fixture teardown, within its budget. One that overruns
14
+ * fails with the runner's timeout error naming `label`; `onTimeout` lets the
15
+ * caller cancel what it started.
15
16
  */
16
- export function runHook(kind, run, timeoutMs, onTimeout) {
17
+ export function runHook(label, run, timeoutMs, onTimeout) {
17
18
  return withTimeout(Promise.resolve().then(run), timeoutMs, () => {
18
19
  onTimeout?.();
19
- return new TestTimeoutError(`${kind} hook timed out`);
20
+ return new TestTimeoutError(`${label} timed out`);
20
21
  });
21
22
  }
22
23
  /** Creates realms and runs suite-scope hooks with per-realm entry tracking. */
@@ -31,7 +32,7 @@ export class RealmManager {
31
32
  /** Re-imports one test module in a fresh realm. */
32
33
  async create(absolutePath) {
33
34
  this.realmCounter += 1;
34
- const registration = await this.debug.time('realm.import', () => collectModule(() => importModule(absolutePath, `${this.options.targetName}-${this.realmCounter}`)));
35
+ const registration = await this.debug.time('realm.import', () => collectModule(() => importModule(absolutePath, `${this.options.targetName}-${this.realmCounter}`), absolutePath));
35
36
  return this.adopt(registration);
36
37
  }
37
38
  /**
@@ -68,7 +69,7 @@ export class RealmManager {
68
69
  let failed;
69
70
  for (const hook of this.scopeHooks(realm, scope, 'beforeAll')) {
70
71
  try {
71
- await runHook(hook.kind, () => hook.fn(this.suiteFixtures()), this.options.timeout);
72
+ await runHook(`${hook.kind} hook`, () => hook.fn(this.suiteFixtures()), this.options.timeout);
72
73
  }
73
74
  catch (cause) {
74
75
  const error = classifyError(cause);
@@ -110,7 +111,7 @@ export class RealmManager {
110
111
  realm.entered.delete(scope);
111
112
  for (const hook of this.scopeHooks(realm, scope, 'afterAll').toReversed()) {
112
113
  try {
113
- await runHook(hook.kind, () => hook.fn(this.suiteFixtures()), this.options.cleanupTimeout);
114
+ await runHook(`${hook.kind} hook`, () => hook.fn(this.suiteFixtures()), this.options.cleanupTimeout);
114
115
  }
115
116
  catch (cause) {
116
117
  const error = classifyError(cause);
@@ -1 +1 @@
1
- {"version":3,"file":"realm.js","sourceRoot":"","sources":["../../src/run/realm.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,aAAa,EACb,QAAQ,EACR,cAAc,EACd,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EACL,aAAa,EACb,UAAU,EACV,WAAW,GAQZ,MAAM,wBAAwB,CAAC;AAwBhC,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,IAAmB;IAC9D,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CACrB,IAAc,EACd,GAA+B,EAC/B,SAAiB,EACjB,SAAsB;IAEtB,OAAO,WAAW,CAChB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAC3B,SAAS,EACT,GAAG,EAAE;QACH,SAAS,EAAE,EAAE,CAAC;QACd,OAAO,IAAI,gBAAgB,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;IACxD,CAAC,CACF,CAAC;AACJ,CAAC;AAYD,+EAA+E;AAC/E,MAAM,OAAO,YAAY;IAIM,OAAO;IAH5B,YAAY,GAAG,CAAC,CAAC;IACR,KAAK,CAAa;IAEnC,YAA6B,OAA4B;uBAA5B,OAAO;QAClC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC/B,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QACvB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAC9D,aAAa,CAAC,GAAG,EAAE,CACjB,YAAY,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAC9E,CACF,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAgC;QACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;QACrD,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK;YAAE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1F,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,KAAY,EAAE,IAAoB,EAAE,IAAsB;QACjE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACpD,IAAI,CAAC,UAAU,CAAW,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAC9C,CAAC;QACF,OAAO,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IAChE,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,WAAW,CAAC,KAAY,EAAE,IAAoB;QAClD,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,OAAO,CAAC,MAAM,CAAC;gBACxD,SAAS;YACX,CAAC;YACD,IAAI,MAAmC,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAY,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;gBACzE,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACtF,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;oBACnC,MAAM,GAAG,cAAc,CACrB,IAAI,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,qBAAqB,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EACpF,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAChD,CAAC;oBACF,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC/C,MAAM;gBACR,CAAC;YACH,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;QAC1C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,aAAa,CACjB,KAAY,EACZ,SAAoC;QAEpC,IAAI,OAAoC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAS,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,0EAA0E;YAC1E,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,UAAU,KAAK,SAAS;gBAAE,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,UAAU,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjG,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;YAC3D,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YAChC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAY,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;gBACrF,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAC7F,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;oBACnC,MAAM,MAAM,GAAG,cAAc,CAC3B,IAAI,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,oBAAoB,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EACnF,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAC/C,CAAC;oBACF,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC/C,OAAO,KAAK,MAAM,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,KAAK,CAAC,KAAY;QACtB,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,2DAA2D;IACnD,UAAU,CAChB,KAAY,EACZ,KAAY,EACZ,IAAkB;QAElB,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CACpC,CAAC,IAAI,EAAgB,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CACnE,CAAC;IACJ,CAAC;IAEO,aAAa;QACnB,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC7C,CAAC;CACF;AAED,iFAAiF;AACjF,SAAS,OAAO,CAAC,KAAY;IAC3B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAC,IAAoB;IACzC,OAAO,CAAC,SAAS,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"realm.js","sourceRoot":"","sources":["../../src/run/realm.ts"],"names":[],"mappings":"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"}
@@ -82,6 +82,8 @@ export interface SerialGroupRecord {
82
82
  titlePath: string[];
83
83
  targetId: string;
84
84
  platform: string;
85
+ /** The configured agent this variant of the group ran as. */
86
+ agent: string;
85
87
  memberTestIds: string[];
86
88
  status: 'passed' | 'flaky' | 'failed' | 'timed-out' | 'interrupted' | 'skipped';
87
89
  skip?: SkipInfo;
@@ -91,6 +93,8 @@ export type ResultStatus = 'passed' | 'flaky' | 'failed' | 'timed-out' | 'interr
91
93
  export interface ResultRecord {
92
94
  test: TestIdentity;
93
95
  target: ResolvedTarget;
96
+ /** The configured agent the test ran as; with a test run as several, one record each. */
97
+ agent: string;
94
98
  status: ResultStatus;
95
99
  selected: boolean;
96
100
  skip?: SkipInfo | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/run/records.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/run/records.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  /** Run orchestration: config, collection, selection, execution, reporting. */
2
2
  import type { ModuleRegistration } from '../collect/registry.ts';
3
+ import type { ExploreProgress } from '../explore/progress.ts';
3
4
  import { type Report1Document, type ReportExplore } from '../report/build.ts';
4
5
  import { type RunEventSink, type RunExitCode, type RunStatus } from './events.ts';
5
6
  import type { ResultRecord } from './records.ts';
@@ -19,8 +20,11 @@ export interface RunOptions {
19
20
  passWithNoTests?: boolean | undefined;
20
21
  /** Runs with the trace cache off (`--no-cache`), overriding the config. */
21
22
  noCache?: boolean | undefined;
22
- /** The configured agent to run with (`--agent`), instead of `agents.default`. */
23
- agent?: string | undefined;
23
+ /**
24
+ * The configured agents unpinned tests run as (`--agent`), instead of
25
+ * `agents.default`. Several names run every such test once per agent.
26
+ */
27
+ agent?: string | readonly string[] | undefined;
24
28
  /** Prints aggregated phase timings to stderr after the run. */
25
29
  debug?: boolean | undefined;
26
30
  /** Records every model call to `.e2e/ai-trace.json` (`--ai-trace`). */
@@ -69,10 +73,15 @@ export interface InMemoryTests {
69
73
  readonly file: string;
70
74
  readonly registration: ModuleRegistration;
71
75
  /**
72
- * The exploration record `e2e explore` adds to the report as `run.explore`,
73
- * read once the run is over so it carries the final steps and findings.
76
+ * The exploration behind `e2e explore`: its progress becomes `explore` run
77
+ * events, and its record is read once the run is over, as `run.explore`.
74
78
  */
75
- readonly explore?: (() => ReportExplore) | undefined;
79
+ readonly explore?: InMemoryExplore | undefined;
80
+ }
81
+ /** What the runner needs from an exploration: its moments as they happen, and its record at the end. */
82
+ export interface InMemoryExplore {
83
+ snapshot(): ReportExplore;
84
+ subscribe(listener: (progress: ExploreProgress) => void): void;
76
85
  }
77
86
  /** The selection flags of `run`, without anything that would start a process. */
78
87
  export type ListOptions = Pick<RunOptions, 'cwd' | 'configPath' | 'files' | 'tags' | 'tagMode' | 'targetIds' | 'passWithNoTests' | 'rawConfig' | 'env'>;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/run/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/run/runner.ts"],"names":[],"mappings":"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"}
@@ -4,19 +4,19 @@ import { discoverConfig, loadConfigModule, missingConfigError } from '../config/
4
4
  import { isCiMode, resolveConfig, } from '../config/resolve.js';
5
5
  import { collect, collectInMemory } from '../collect/collect.js';
6
6
  import { select, selectTargets } from '../collect/select.js';
7
- import { classifyError, combineExitCodes, ConfigurationError, InfrastructureError, E2EError, errorMessage, exitCodeForCategory, serializeError, translateProvisioningError, } from '../internal/errors.js';
7
+ import { classifyError, combineExitCodes, InfrastructureError, E2EError, errorMessage, exitCodeForCategory, serializeError, } from '../internal/errors.js';
8
8
  import { loadAiSdk } from '../agent/ai-sdk.js';
9
9
  import { AiTraceCollector, AiTraceRecorder, registerAiTraceRecorder } from '../internal/ai-trace.js';
10
10
  import { DebugTrace } from '../internal/debug.js';
11
11
  import { timestamp, uuidv7 } from '../internal/ids.js';
12
- import { buildReport, describeTarget } from '../report/build.js';
12
+ import { buildReport } from '../report/build.js';
13
13
  import { agentStepTable } from '../report/debug-steps.js';
14
14
  import { jsonReporter } from '../report/json.js';
15
15
  import { junitReporter } from '../report/junit.js';
16
16
  import { ListReporter } from '../report/list.js';
17
17
  import { writeJsonReport } from '../report/write.js';
18
- import { ManagedProcess, ServiceStack } from './managed-process.js';
19
18
  import { createRunEventEmitter, toEventResult } from './events.js';
19
+ import { allocateAppPorts, assignedPorts } from './app-ports.js';
20
20
  import { inProcessSpawner } from './in-process.js';
21
21
  import { runUnits } from './scheduler.js';
22
22
  import { buildWorkPlans, plannedSlots } from './units.js';
@@ -25,7 +25,7 @@ import { childProcessSpawner } from './worker/handle.js';
25
25
  import { setCredentialRegistry } from '../credentials.js';
26
26
  import { withAbort } from '../internal/time.js';
27
27
  import { modelLabel } from '../config/agent.js';
28
- import { declaredProcesses } from './declared-processes.js';
28
+ import { prepareEngine, startDeclaredProcesses, validateEngine } from './provision.js';
29
29
  /** How long a reporter's `onRunFinished` may take before the run stops waiting for it. */
30
30
  const REPORTER_TIMEOUT_MS = 60_000;
31
31
  /**
@@ -85,10 +85,8 @@ export async function run(options = {}) {
85
85
  const results = [];
86
86
  const serialGroups = [];
87
87
  const targetProvenance = new Map();
88
- /** Dependency processes declared by the targets' engines, deduplicated, started before any app command. */
89
- let services;
90
- /** App processes started for this run, one per distinct declared command. */
91
- const appProcesses = [];
88
+ /** The services and app commands the targets' engines declared, once started. */
89
+ let processes;
92
90
  let sessionStore;
93
91
  // Hoisted: workers re-resolve the same config file and need these overrides,
94
92
  // or a flag would apply in the runner and be dropped in every worker.
@@ -104,13 +102,18 @@ export async function run(options = {}) {
104
102
  if (options.video === true)
105
103
  cli.video = true;
106
104
  if (options.agent !== undefined)
107
- cli.agent = options.agent;
105
+ cli.agents = typeof options.agent === 'string' ? [options.agent] : options.agent;
108
106
  // Config resolves before anything is emitted, and its failure is kept rather
109
107
  // than thrown: the reporter set is config truth (CLI overrides merge during
110
108
  // resolution), so the emitter below is built exactly once from the set
111
109
  // actually in force. When config itself failed, the CLI's own value is the
112
110
  // best available, and the failure still renders through it.
113
- const loaded = await debug.time('config.load', () => loadRunConfig(options, cwd, env, cli)).then((config) => ({ config, error: undefined }), (cause) => ({ config: undefined, error: classifyError(cause) }));
111
+ //
112
+ // Free ports for URLs declared with port 0 are chosen here, once: workers
113
+ // re-resolve the config and get the assignments in their bootstrap.
114
+ const loaded = await debug
115
+ .time('config.load', () => loadRunConfig(options, cwd, env, cli).then(allocateAppPorts))
116
+ .then((config) => ({ config, error: undefined }), (cause) => ({ config: undefined, error: classifyError(cause) }));
114
117
  // Every reporter, built-in or configured, is one `Reporter` on one spine:
115
118
  // the ids name the shipped ones, and a config failure still leaves the ids
116
119
  // the CLI asked for, so the failure renders through them.
@@ -170,7 +173,7 @@ export async function run(options = {}) {
170
173
  serialGroups,
171
174
  runErrors,
172
175
  targetProvenance,
173
- explore: options.tests?.explore?.(),
176
+ explore: options.tests?.explore?.snapshot(),
174
177
  });
175
178
  /**
176
179
  * Writes the canonical report and returns its path only once the file
@@ -273,9 +276,9 @@ export async function run(options = {}) {
273
276
  artifactsRoot: resolveArtifactsRoot(config, options.artifactsDir),
274
277
  ci: isCiMode(env),
275
278
  targets: config.targets.map((target) => target.name),
276
- ...(config.agentName === 'default' ? {} : { agent: config.agentName }),
277
- ...(config.agent.model === undefined ? {} : { model: modelLabel(config.agent.model) }),
278
- ...(config.agent.visionModel === undefined ? {} : { visionModel: modelLabel(config.agent.visionModel) }),
279
+ ...(config.agentNames.length === 1 && config.agentNames[0] === 'default' ? {} : { agents: config.agentNames }),
280
+ // Several run agents have no one model to name; each step names its own.
281
+ ...(config.agentNames.length !== 1 || config.agent.model === undefined ? {} : { model: modelLabel(config.agent.model) }),
279
282
  });
280
283
  const executeRun = async () => {
281
284
  const interrupted = interruptController.signal;
@@ -293,12 +296,6 @@ export async function run(options = {}) {
293
296
  recordFailure(cause, 'collection');
294
297
  return;
295
298
  }
296
- // Each selected engine declares the app it drives: the dependency
297
- // processes it needs and the command that starts it. Declarations are
298
- // deduplicated across targets (two browsers on one dev server share one
299
- // process) and checked for consistency here, first; the processes start
300
- // only after the plan, and only for the selected targets.
301
- const declared = declaredProcesses(targets);
302
299
  /**
303
300
  * Narrates and times one setup step on the event spine. A step that
304
301
  * throws ends as a run error, and a step the interrupt cut short reports
@@ -369,9 +366,12 @@ export async function run(options = {}) {
369
366
  // is on the clock and a one-off download is not.
370
367
  startedAt = timestamp();
371
368
  emit({ type: 'plan', total: selection.pairs.length, files: plannedFiles(selection) });
372
- // Every service is ready before the first app command starts. Nothing
373
- // spawns once the run was interrupted. Each process is one setup step; a
374
- // reused process or an ignored `reuseExisting` narrates as a run notice.
369
+ options.tests?.explore?.subscribe((progress) => emit({ type: 'explore', progress }));
370
+ // Each selected engine declares the app it drives: the dependency
371
+ // processes it needs and the command that starts it. Every service is
372
+ // ready before the first app command starts, and nothing spawns once the
373
+ // run was interrupted. Each process is one setup step; a reused process
374
+ // or an ignored `reuseExisting` narrates as a run notice.
375
375
  const processHooks = (kind) => ({
376
376
  ci: isCiMode(env),
377
377
  notice: (message) => emit({ type: 'notice', target: 'app', message }),
@@ -384,20 +384,7 @@ export async function run(options = {}) {
384
384
  ...(reused ? { outcome: 'reused' } : {}),
385
385
  }),
386
386
  });
387
- if (declared.services.length > 0) {
388
- const stack = new ServiceStack(declared.services, config.projectRoot, processHooks('service'));
389
- services = stack;
390
- await debug.time('app.services.start', () => stack.start(interrupted));
391
- if (interrupted.aborted)
392
- return;
393
- }
394
- for (const { label, command, readyUrl } of declared.commands) {
395
- const app = new ManagedProcess(label, command, config.projectRoot, { readyUrl }, processHooks('app'));
396
- appProcesses.push(app);
397
- await debug.time(`app.start(${label})`, () => app.start(interrupted));
398
- if (interrupted.aborted)
399
- return;
400
- }
387
+ processes = await startDeclaredProcesses(targets, config.projectRoot, processHooks, interrupted, debug);
401
388
  // A run cancelled while the app was starting runs no test: the interrupt
402
389
  // alone decides the outcome.
403
390
  if (interrupted.aborted)
@@ -430,6 +417,7 @@ export async function run(options = {}) {
430
417
  projectRoot: config.projectRoot,
431
418
  configDigest: config.configDigest,
432
419
  cli,
420
+ ports: assignedPorts(config),
433
421
  runId,
434
422
  artifactsRoot,
435
423
  headed: options.headed ?? false,
@@ -459,7 +447,7 @@ export async function run(options = {}) {
459
447
  onRunError: recordRunError,
460
448
  onRunAbort: abortRun,
461
449
  onTestStart: (start, targetName) => emit({ type: 'test-started', ...start, target: targetName }),
462
- onProgress: (testId, targetName, progress) => emit({ type: 'step', testId, target: targetName, progress }),
450
+ onProgress: (pair, targetName, progress) => emit({ type: 'step', testId: pair.testId, agent: pair.agent, target: targetName, progress }),
463
451
  onDebug: (snapshot) => debug.merge(snapshot),
464
452
  onAiTrace: (snapshot) => aiTrace?.merge(snapshot),
465
453
  },
@@ -505,8 +493,7 @@ export async function run(options = {}) {
505
493
  // teardown command is a cleanup error of the run, not a crash.
506
494
  for (const teardown of [
507
495
  () => sessionStore?.cleanup(),
508
- ...appProcesses.map((app) => () => app.stop()),
509
- () => services?.stop((cause) => recordFailure(cause, 'cleanup')),
496
+ () => processes?.stop((cause) => recordFailure(cause, 'cleanup')),
510
497
  ]) {
511
498
  try {
512
499
  await teardown();
@@ -542,22 +529,7 @@ async function prepareEngines(plans, runWorkers, scope, emit) {
542
529
  emit({ type: 'setup', step, state: 'started' });
543
530
  const startedMs = Date.now();
544
531
  const slots = plannedSlots(plan, runWorkers);
545
- let result;
546
- try {
547
- // The same `env` the workers are started with: what prepare provisions
548
- // must be where a worker's launch will look for it.
549
- result = await engine.prepare({
550
- runId: scope.runId,
551
- targetName: target.name,
552
- slots,
553
- env: scope.env,
554
- signal: scope.signal,
555
- log: (line) => emit({ type: 'notice', target: target.name, message: line }),
556
- });
557
- }
558
- catch (cause) {
559
- throw translateProvisioningError(cause, ` while preparing engine ${engine.name} for target "${target.name}"`);
560
- }
532
+ const result = await prepareEngine(target, slots, scope, (line) => emit({ type: 'notice', target: target.name, message: line }));
561
533
  prepared.push(withPreparedWorkers(plan, engine.name, slots, result));
562
534
  if (!scope.signal.aborted) {
563
535
  emit({ type: 'setup', step, state: 'finished', durationMs: Date.now() - startedMs });
@@ -629,21 +601,6 @@ function plannedFiles(selection) {
629
601
  function statusOf(exitCode) {
630
602
  return exitCode === 0 ? 'passed' : exitCode === 1 ? 'failed' : exitCode === 130 ? 'interrupted' : 'error';
631
603
  }
632
- /**
633
- * Grades one target from its engine declaration and validates the configured
634
- * artifacts against it; returns the report provenance.
635
- */
636
- function validateEngine(target, config) {
637
- const provenance = describeTarget(target);
638
- // A best-effort kind is captured when the engine can; a required one is a
639
- // contract the engine must be able to honour before any test starts.
640
- for (const [artifact, policy] of config.artifacts) {
641
- if (policy === 'required' && !provenance.artifactCapabilities.includes(artifact)) {
642
- throw new ConfigurationError('UNSUPPORTED_ARTIFACT', `target "${target.name}" (engine ${provenance.engine.name}) does not support the configured "${artifact}" artifact`);
643
- }
644
- }
645
- return provenance;
646
- }
647
604
  function resultExitCodes(results) {
648
605
  const codes = [0];
649
606
  for (const result of results) {