@e2edev/e2e 0.2.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 (399) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +104 -0
  3. package/dist/agent/act-validation.d.ts +27 -0
  4. package/dist/agent/act-validation.d.ts.map +1 -0
  5. package/dist/agent/act-validation.js +121 -0
  6. package/dist/agent/act-validation.js.map +1 -0
  7. package/dist/agent/act.d.ts +27 -0
  8. package/dist/agent/act.d.ts.map +1 -0
  9. package/dist/agent/act.js +775 -0
  10. package/dist/agent/act.js.map +1 -0
  11. package/dist/agent/actions.d.ts +66 -0
  12. package/dist/agent/actions.d.ts.map +1 -0
  13. package/dist/agent/actions.js +82 -0
  14. package/dist/agent/actions.js.map +1 -0
  15. package/dist/agent/ai-sdk.d.ts +16 -0
  16. package/dist/agent/ai-sdk.d.ts.map +1 -0
  17. package/dist/agent/ai-sdk.js +59 -0
  18. package/dist/agent/ai-sdk.js.map +1 -0
  19. package/dist/agent/call-options.d.ts +10 -0
  20. package/dist/agent/call-options.d.ts.map +1 -0
  21. package/dist/agent/call-options.js +28 -0
  22. package/dist/agent/call-options.js.map +1 -0
  23. package/dist/agent/default-agent.d.ts +22 -0
  24. package/dist/agent/default-agent.d.ts.map +1 -0
  25. package/dist/agent/default-agent.js +354 -0
  26. package/dist/agent/default-agent.js.map +1 -0
  27. package/dist/agent/error.d.ts +53 -0
  28. package/dist/agent/error.d.ts.map +1 -0
  29. package/dist/agent/error.js +94 -0
  30. package/dist/agent/error.js.map +1 -0
  31. package/dist/agent/executor.d.ts +238 -0
  32. package/dist/agent/executor.d.ts.map +1 -0
  33. package/dist/agent/executor.js +56 -0
  34. package/dist/agent/executor.js.map +1 -0
  35. package/dist/agent/index.d.ts +15 -0
  36. package/dist/agent/index.d.ts.map +1 -0
  37. package/dist/agent/index.js +304 -0
  38. package/dist/agent/index.js.map +1 -0
  39. package/dist/agent/invocation.d.ts +194 -0
  40. package/dist/agent/invocation.d.ts.map +1 -0
  41. package/dist/agent/invocation.js +389 -0
  42. package/dist/agent/invocation.js.map +1 -0
  43. package/dist/agent/ledger.d.ts +24 -0
  44. package/dist/agent/ledger.d.ts.map +1 -0
  45. package/dist/agent/ledger.js +48 -0
  46. package/dist/agent/ledger.js.map +1 -0
  47. package/dist/agent/loop-guards.d.ts +35 -0
  48. package/dist/agent/loop-guards.d.ts.map +1 -0
  49. package/dist/agent/loop-guards.js +110 -0
  50. package/dist/agent/loop-guards.js.map +1 -0
  51. package/dist/agent/model/adapter.d.ts +97 -0
  52. package/dist/agent/model/adapter.d.ts.map +1 -0
  53. package/dist/agent/model/adapter.js +40 -0
  54. package/dist/agent/model/adapter.js.map +1 -0
  55. package/dist/agent/model/router.d.ts +36 -0
  56. package/dist/agent/model/router.d.ts.map +1 -0
  57. package/dist/agent/model/router.js +45 -0
  58. package/dist/agent/model/router.js.map +1 -0
  59. package/dist/agent/model/schema.d.ts +16 -0
  60. package/dist/agent/model/schema.d.ts.map +1 -0
  61. package/dist/agent/model/schema.js +37 -0
  62. package/dist/agent/model/schema.js.map +1 -0
  63. package/dist/agent/model/sdk.d.ts +28 -0
  64. package/dist/agent/model/sdk.d.ts.map +1 -0
  65. package/dist/agent/model/sdk.js +258 -0
  66. package/dist/agent/model/sdk.js.map +1 -0
  67. package/dist/agent/observation.d.ts +70 -0
  68. package/dist/agent/observation.d.ts.map +1 -0
  69. package/dist/agent/observation.js +174 -0
  70. package/dist/agent/observation.js.map +1 -0
  71. package/dist/agent/phases.d.ts +71 -0
  72. package/dist/agent/phases.d.ts.map +1 -0
  73. package/dist/agent/phases.js +124 -0
  74. package/dist/agent/phases.js.map +1 -0
  75. package/dist/agent/prompts.d.ts +40 -0
  76. package/dist/agent/prompts.d.ts.map +1 -0
  77. package/dist/agent/prompts.js +104 -0
  78. package/dist/agent/prompts.js.map +1 -0
  79. package/dist/agent/protocol.d.ts +31 -0
  80. package/dist/agent/protocol.d.ts.map +1 -0
  81. package/dist/agent/protocol.js +67 -0
  82. package/dist/agent/protocol.js.map +1 -0
  83. package/dist/agent/public.d.ts +12 -0
  84. package/dist/agent/public.d.ts.map +1 -0
  85. package/dist/agent/public.js +12 -0
  86. package/dist/agent/public.js.map +1 -0
  87. package/dist/agent/replay.d.ts +61 -0
  88. package/dist/agent/replay.d.ts.map +1 -0
  89. package/dist/agent/replay.js +185 -0
  90. package/dist/agent/replay.js.map +1 -0
  91. package/dist/agent/secrets.d.ts +22 -0
  92. package/dist/agent/secrets.d.ts.map +1 -0
  93. package/dist/agent/secrets.js +63 -0
  94. package/dist/agent/secrets.js.map +1 -0
  95. package/dist/agent/step-cache.d.ts +156 -0
  96. package/dist/agent/step-cache.d.ts.map +1 -0
  97. package/dist/agent/step-cache.js +301 -0
  98. package/dist/agent/step-cache.js.map +1 -0
  99. package/dist/agent/tool-loop.d.ts +51 -0
  100. package/dist/agent/tool-loop.d.ts.map +1 -0
  101. package/dist/agent/tool-loop.js +331 -0
  102. package/dist/agent/tool-loop.js.map +1 -0
  103. package/dist/agent/tool.d.ts +39 -0
  104. package/dist/agent/tool.d.ts.map +1 -0
  105. package/dist/agent/tool.js +52 -0
  106. package/dist/agent/tool.js.map +1 -0
  107. package/dist/backend/contract.d.ts +186 -0
  108. package/dist/backend/contract.d.ts.map +1 -0
  109. package/dist/backend/contract.js +65 -0
  110. package/dist/backend/contract.js.map +1 -0
  111. package/dist/backend/index.d.ts +316 -0
  112. package/dist/backend/index.d.ts.map +1 -0
  113. package/dist/backend/index.js +219 -0
  114. package/dist/backend/index.js.map +1 -0
  115. package/dist/backend/session.d.ts +23 -0
  116. package/dist/backend/session.d.ts.map +1 -0
  117. package/dist/backend/session.js +213 -0
  118. package/dist/backend/session.js.map +1 -0
  119. package/dist/backend/surface.d.ts +83 -0
  120. package/dist/backend/surface.d.ts.map +1 -0
  121. package/dist/backend/surface.js +11 -0
  122. package/dist/backend/surface.js.map +1 -0
  123. package/dist/cache/anchors.d.ts +37 -0
  124. package/dist/cache/anchors.d.ts.map +1 -0
  125. package/dist/cache/anchors.js +89 -0
  126. package/dist/cache/anchors.js.map +1 -0
  127. package/dist/cache/context.d.ts +74 -0
  128. package/dist/cache/context.d.ts.map +1 -0
  129. package/dist/cache/context.js +82 -0
  130. package/dist/cache/context.js.map +1 -0
  131. package/dist/cache/decide.d.ts +42 -0
  132. package/dist/cache/decide.d.ts.map +1 -0
  133. package/dist/cache/decide.js +47 -0
  134. package/dist/cache/decide.js.map +1 -0
  135. package/dist/cache/identity.d.ts +113 -0
  136. package/dist/cache/identity.d.ts.map +1 -0
  137. package/dist/cache/identity.js +109 -0
  138. package/dist/cache/identity.js.map +1 -0
  139. package/dist/cache/recorder.d.ts +76 -0
  140. package/dist/cache/recorder.d.ts.map +1 -0
  141. package/dist/cache/recorder.js +143 -0
  142. package/dist/cache/recorder.js.map +1 -0
  143. package/dist/cache/relocate.d.ts +69 -0
  144. package/dist/cache/relocate.d.ts.map +1 -0
  145. package/dist/cache/relocate.js +125 -0
  146. package/dist/cache/relocate.js.map +1 -0
  147. package/dist/cache/store.d.ts +68 -0
  148. package/dist/cache/store.d.ts.map +1 -0
  149. package/dist/cache/store.js +106 -0
  150. package/dist/cache/store.js.map +1 -0
  151. package/dist/cache/trace.d.ts +146 -0
  152. package/dist/cache/trace.d.ts.map +1 -0
  153. package/dist/cache/trace.js +249 -0
  154. package/dist/cache/trace.js.map +1 -0
  155. package/dist/cli/bin.d.ts +3 -0
  156. package/dist/cli/bin.d.ts.map +1 -0
  157. package/dist/cli/bin.js +4 -0
  158. package/dist/cli/bin.js.map +1 -0
  159. package/dist/cli/index.d.ts +4 -0
  160. package/dist/cli/index.d.ts.map +1 -0
  161. package/dist/cli/index.js +108 -0
  162. package/dist/cli/index.js.map +1 -0
  163. package/dist/cli/init.d.ts +6 -0
  164. package/dist/cli/init.d.ts.map +1 -0
  165. package/dist/cli/init.js +101 -0
  166. package/dist/cli/init.js.map +1 -0
  167. package/dist/collect/collect.d.ts +44 -0
  168. package/dist/collect/collect.d.ts.map +1 -0
  169. package/dist/collect/collect.js +89 -0
  170. package/dist/collect/collect.js.map +1 -0
  171. package/dist/collect/registry.d.ts +47 -0
  172. package/dist/collect/registry.d.ts.map +1 -0
  173. package/dist/collect/registry.js +262 -0
  174. package/dist/collect/registry.js.map +1 -0
  175. package/dist/collect/select.d.ts +54 -0
  176. package/dist/collect/select.d.ts.map +1 -0
  177. package/dist/collect/select.js +230 -0
  178. package/dist/collect/select.js.map +1 -0
  179. package/dist/config/agent.d.ts +91 -0
  180. package/dist/config/agent.d.ts.map +1 -0
  181. package/dist/config/agent.js +232 -0
  182. package/dist/config/agent.js.map +1 -0
  183. package/dist/config/load.d.ts +23 -0
  184. package/dist/config/load.d.ts.map +1 -0
  185. package/dist/config/load.js +75 -0
  186. package/dist/config/load.js.map +1 -0
  187. package/dist/config/resolve.d.ts +94 -0
  188. package/dist/config/resolve.d.ts.map +1 -0
  189. package/dist/config/resolve.js +500 -0
  190. package/dist/config/resolve.js.map +1 -0
  191. package/dist/config/validate.d.ts +6 -0
  192. package/dist/config/validate.d.ts.map +1 -0
  193. package/dist/config/validate.js +21 -0
  194. package/dist/config/validate.js.map +1 -0
  195. package/dist/credentials.d.ts +7 -0
  196. package/dist/credentials.d.ts.map +1 -0
  197. package/dist/credentials.js +42 -0
  198. package/dist/credentials.js.map +1 -0
  199. package/dist/expect/async.d.ts +5 -0
  200. package/dist/expect/async.d.ts.map +1 -0
  201. package/dist/expect/async.js +186 -0
  202. package/dist/expect/async.js.map +1 -0
  203. package/dist/expect/index.d.ts +7 -0
  204. package/dist/expect/index.d.ts.map +1 -0
  205. package/dist/expect/index.js +23 -0
  206. package/dist/expect/index.js.map +1 -0
  207. package/dist/expect/values.d.ts +4 -0
  208. package/dist/expect/values.d.ts.map +1 -0
  209. package/dist/expect/values.js +108 -0
  210. package/dist/expect/values.js.map +1 -0
  211. package/dist/index.d.ts +13 -0
  212. package/dist/index.d.ts.map +1 -0
  213. package/dist/index.js +15 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/internal/ai-trace.d.ts +151 -0
  216. package/dist/internal/ai-trace.d.ts.map +1 -0
  217. package/dist/internal/ai-trace.js +360 -0
  218. package/dist/internal/ai-trace.js.map +1 -0
  219. package/dist/internal/brands.d.ts +9 -0
  220. package/dist/internal/brands.d.ts.map +1 -0
  221. package/dist/internal/brands.js +9 -0
  222. package/dist/internal/brands.js.map +1 -0
  223. package/dist/internal/debug.d.ts +43 -0
  224. package/dist/internal/debug.d.ts.map +1 -0
  225. package/dist/internal/debug.js +102 -0
  226. package/dist/internal/debug.js.map +1 -0
  227. package/dist/internal/errors.d.ts +98 -0
  228. package/dist/internal/errors.d.ts.map +1 -0
  229. package/dist/internal/errors.js +212 -0
  230. package/dist/internal/errors.js.map +1 -0
  231. package/dist/internal/globs.d.ts +29 -0
  232. package/dist/internal/globs.d.ts.map +1 -0
  233. package/dist/internal/globs.js +126 -0
  234. package/dist/internal/globs.js.map +1 -0
  235. package/dist/internal/ids.d.ts +32 -0
  236. package/dist/internal/ids.d.ts.map +1 -0
  237. package/dist/internal/ids.js +124 -0
  238. package/dist/internal/ids.js.map +1 -0
  239. package/dist/internal/json-value.d.ts +15 -0
  240. package/dist/internal/json-value.d.ts.map +1 -0
  241. package/dist/internal/json-value.js +61 -0
  242. package/dist/internal/json-value.js.map +1 -0
  243. package/dist/internal/package-version.d.ts +6 -0
  244. package/dist/internal/package-version.d.ts.map +1 -0
  245. package/dist/internal/package-version.js +14 -0
  246. package/dist/internal/package-version.js.map +1 -0
  247. package/dist/internal/realm-slot.d.ts +13 -0
  248. package/dist/internal/realm-slot.d.ts.map +1 -0
  249. package/dist/internal/realm-slot.js +23 -0
  250. package/dist/internal/realm-slot.js.map +1 -0
  251. package/dist/internal/redact.d.ts +33 -0
  252. package/dist/internal/redact.d.ts.map +1 -0
  253. package/dist/internal/redact.js +56 -0
  254. package/dist/internal/redact.js.map +1 -0
  255. package/dist/internal/regexp.d.ts +10 -0
  256. package/dist/internal/regexp.d.ts.map +1 -0
  257. package/dist/internal/regexp.js +27 -0
  258. package/dist/internal/regexp.js.map +1 -0
  259. package/dist/internal/text.d.ts +39 -0
  260. package/dist/internal/text.d.ts.map +1 -0
  261. package/dist/internal/text.js +66 -0
  262. package/dist/internal/text.js.map +1 -0
  263. package/dist/internal/time.d.ts +37 -0
  264. package/dist/internal/time.d.ts.map +1 -0
  265. package/dist/internal/time.js +91 -0
  266. package/dist/internal/time.js.map +1 -0
  267. package/dist/internal/trace.d.ts +18 -0
  268. package/dist/internal/trace.d.ts.map +1 -0
  269. package/dist/internal/trace.js +46 -0
  270. package/dist/internal/trace.js.map +1 -0
  271. package/dist/internal/urls.d.ts +31 -0
  272. package/dist/internal/urls.d.ts.map +1 -0
  273. package/dist/internal/urls.js +95 -0
  274. package/dist/internal/urls.js.map +1 -0
  275. package/dist/locator/engine.d.ts +65 -0
  276. package/dist/locator/engine.d.ts.map +1 -0
  277. package/dist/locator/engine.js +164 -0
  278. package/dist/locator/engine.js.map +1 -0
  279. package/dist/locator/expression.d.ts +19 -0
  280. package/dist/locator/expression.d.ts.map +1 -0
  281. package/dist/locator/expression.js +85 -0
  282. package/dist/locator/expression.js.map +1 -0
  283. package/dist/locator/screen.d.ts +36 -0
  284. package/dist/locator/screen.d.ts.map +1 -0
  285. package/dist/locator/screen.js +281 -0
  286. package/dist/locator/screen.js.map +1 -0
  287. package/dist/report/build.d.ts +214 -0
  288. package/dist/report/build.d.ts.map +1 -0
  289. package/dist/report/build.js +346 -0
  290. package/dist/report/build.js.map +1 -0
  291. package/dist/report/code-frame.d.ts +20 -0
  292. package/dist/report/code-frame.d.ts.map +1 -0
  293. package/dist/report/code-frame.js +73 -0
  294. package/dist/report/code-frame.js.map +1 -0
  295. package/dist/report/debug-steps.d.ts +14 -0
  296. package/dist/report/debug-steps.d.ts.map +1 -0
  297. package/dist/report/debug-steps.js +85 -0
  298. package/dist/report/debug-steps.js.map +1 -0
  299. package/dist/report/list.d.ts +80 -0
  300. package/dist/report/list.d.ts.map +1 -0
  301. package/dist/report/list.js +372 -0
  302. package/dist/report/list.js.map +1 -0
  303. package/dist/report/live-status.d.ts +51 -0
  304. package/dist/report/live-status.d.ts.map +1 -0
  305. package/dist/report/live-status.js +162 -0
  306. package/dist/report/live-status.js.map +1 -0
  307. package/dist/report/write.d.ts +4 -0
  308. package/dist/report/write.d.ts.map +1 -0
  309. package/dist/report/write.js +13 -0
  310. package/dist/report/write.js.map +1 -0
  311. package/dist/run/app-process.d.ts +18 -0
  312. package/dist/run/app-process.d.ts.map +1 -0
  313. package/dist/run/app-process.js +112 -0
  314. package/dist/run/app-process.js.map +1 -0
  315. package/dist/run/artifacts.d.ts +51 -0
  316. package/dist/run/artifacts.d.ts.map +1 -0
  317. package/dist/run/artifacts.js +114 -0
  318. package/dist/run/artifacts.js.map +1 -0
  319. package/dist/run/events.d.ts +100 -0
  320. package/dist/run/events.d.ts.map +1 -0
  321. package/dist/run/events.js +59 -0
  322. package/dist/run/events.js.map +1 -0
  323. package/dist/run/execute.d.ts +119 -0
  324. package/dist/run/execute.d.ts.map +1 -0
  325. package/dist/run/execute.js +555 -0
  326. package/dist/run/execute.js.map +1 -0
  327. package/dist/run/fixtures.d.ts +40 -0
  328. package/dist/run/fixtures.d.ts.map +1 -0
  329. package/dist/run/fixtures.js +408 -0
  330. package/dist/run/fixtures.js.map +1 -0
  331. package/dist/run/in-process.d.ts +24 -0
  332. package/dist/run/in-process.d.ts.map +1 -0
  333. package/dist/run/in-process.js +120 -0
  334. package/dist/run/in-process.js.map +1 -0
  335. package/dist/run/public.d.ts +19 -0
  336. package/dist/run/public.d.ts.map +1 -0
  337. package/dist/run/public.js +11 -0
  338. package/dist/run/public.js.map +1 -0
  339. package/dist/run/realm.d.ts +52 -0
  340. package/dist/run/realm.d.ts.map +1 -0
  341. package/dist/run/realm.js +101 -0
  342. package/dist/run/realm.js.map +1 -0
  343. package/dist/run/records.d.ts +87 -0
  344. package/dist/run/records.d.ts.map +1 -0
  345. package/dist/run/records.js +3 -0
  346. package/dist/run/records.js.map +1 -0
  347. package/dist/run/retry.d.ts +18 -0
  348. package/dist/run/retry.d.ts.map +1 -0
  349. package/dist/run/retry.js +33 -0
  350. package/dist/run/retry.js.map +1 -0
  351. package/dist/run/runner.d.ts +49 -0
  352. package/dist/run/runner.d.ts.map +1 -0
  353. package/dist/run/runner.js +375 -0
  354. package/dist/run/runner.js.map +1 -0
  355. package/dist/run/scheduler.d.ts +45 -0
  356. package/dist/run/scheduler.d.ts.map +1 -0
  357. package/dist/run/scheduler.js +512 -0
  358. package/dist/run/scheduler.js.map +1 -0
  359. package/dist/run/serial.d.ts +52 -0
  360. package/dist/run/serial.d.ts.map +1 -0
  361. package/dist/run/serial.js +247 -0
  362. package/dist/run/serial.js.map +1 -0
  363. package/dist/run/sessions.d.ts +54 -0
  364. package/dist/run/sessions.d.ts.map +1 -0
  365. package/dist/run/sessions.js +221 -0
  366. package/dist/run/sessions.js.map +1 -0
  367. package/dist/run/steps.d.ts +196 -0
  368. package/dist/run/steps.d.ts.map +1 -0
  369. package/dist/run/steps.js +151 -0
  370. package/dist/run/steps.js.map +1 -0
  371. package/dist/run/unit-runner.d.ts +30 -0
  372. package/dist/run/unit-runner.d.ts.map +1 -0
  373. package/dist/run/unit-runner.js +11 -0
  374. package/dist/run/unit-runner.js.map +1 -0
  375. package/dist/run/units.d.ts +50 -0
  376. package/dist/run/units.d.ts.map +1 -0
  377. package/dist/run/units.js +103 -0
  378. package/dist/run/units.js.map +1 -0
  379. package/dist/run/worker/entry.d.ts +8 -0
  380. package/dist/run/worker/entry.d.ts.map +1 -0
  381. package/dist/run/worker/entry.js +137 -0
  382. package/dist/run/worker/entry.js.map +1 -0
  383. package/dist/run/worker/handle.d.ts +10 -0
  384. package/dist/run/worker/handle.d.ts.map +1 -0
  385. package/dist/run/worker/handle.js +74 -0
  386. package/dist/run/worker/handle.js.map +1 -0
  387. package/dist/run/worker/protocol.d.ts +129 -0
  388. package/dist/run/worker/protocol.d.ts.map +1 -0
  389. package/dist/run/worker/protocol.js +18 -0
  390. package/dist/run/worker/protocol.js.map +1 -0
  391. package/dist/run/worker/session.d.ts +69 -0
  392. package/dist/run/worker/session.d.ts.map +1 -0
  393. package/dist/run/worker/session.js +123 -0
  394. package/dist/run/worker/session.js.map +1 -0
  395. package/dist/types.d.ts +630 -0
  396. package/dist/types.d.ts.map +1 -0
  397. package/dist/types.js +6 -0
  398. package/dist/types.js.map +1 -0
  399. package/package.json +91 -0
@@ -0,0 +1,247 @@
1
+ /** Serial-group execution: one shared session per group attempt (spec 11-lifecycle.md). */
2
+ import { classifyError, ConfigurationError, serializeError, } from '../internal/errors.js';
3
+ import { canonicalDigest, timestamp, uuidv7 } from '../internal/ids.js';
4
+ import { groupTitles } from '../collect/registry.js';
5
+ import { createAttemptArtifacts, sanitizePathSegment } from './artifacts.js';
6
+ import { findRegistered, RealmManager } from './realm.js';
7
+ import { runWithRetries } from './retry.js';
8
+ import { INTERRUPTED_BEFORE_START, pairResult } from './units.js';
9
+ /** Runs one serial unit to completion and emits every member result. */
10
+ export async function runSerialUnit(host, members, absolutePath) {
11
+ const first = members[0];
12
+ const serialId = first.test.serialId;
13
+ const groupRecordId = canonicalDigest({ serialId, targetId: host.target.name });
14
+ const group = {
15
+ id: groupRecordId,
16
+ serialId,
17
+ declarationIndex: first.test.declarationIndex,
18
+ file: first.test.file,
19
+ titlePath: serialTitlePath(first.test),
20
+ targetId: host.target.name,
21
+ platform: host.target.platform,
22
+ memberTestIds: members.map((member) => member.test.id),
23
+ status: 'failed',
24
+ attempts: [],
25
+ };
26
+ const memberFinalStatus = new Map();
27
+ const finalStatus = await runWithRetries(first.options.retries + 1, host.interruptSignal, async (attemptIndex) => {
28
+ const attempt = await runSerialAttempt(host, members, absolutePath, attemptIndex);
29
+ group.attempts.push(attempt);
30
+ for (const member of attempt.members)
31
+ memberFinalStatus.set(member.testId, member);
32
+ // A beforeAll failure is not retry-eligible (spec 11-lifecycle.md): the
33
+ // attempt stands as recorded and the retry loop stops here.
34
+ if (attempt.error?.code === 'HOOK_FAILED')
35
+ return undefined;
36
+ return attempt;
37
+ });
38
+ if (group.attempts.length === 0) {
39
+ group.status = 'skipped';
40
+ group.skip = INTERRUPTED_BEFORE_START;
41
+ }
42
+ else {
43
+ group.status = finalStatus;
44
+ }
45
+ for (const member of members) {
46
+ const memberRecord = memberFinalStatus.get(member.test.id);
47
+ let status;
48
+ let skip;
49
+ if (group.status === 'passed' || group.status === 'flaky') {
50
+ status = group.status;
51
+ }
52
+ else if (memberRecord === undefined) {
53
+ status = 'skipped';
54
+ skip = { cause: 'serial-predecessor-failed', reason: 'group attempt did not reach this member' };
55
+ }
56
+ else if (memberRecord.status === 'skipped') {
57
+ status = 'skipped';
58
+ skip = memberRecord.skip;
59
+ }
60
+ else {
61
+ status = memberRecord.status;
62
+ }
63
+ host.emit(pairResult(member, {
64
+ status,
65
+ selected: true,
66
+ ...(skip !== undefined ? { skip } : {}),
67
+ attempts: [],
68
+ serialGroupId: groupRecordId,
69
+ }));
70
+ }
71
+ return group;
72
+ }
73
+ async function runSerialAttempt(host, members, absolutePath, attemptIndex) {
74
+ const attemptId = uuidv7();
75
+ const startedAt = timestamp();
76
+ const startedMs = Date.now();
77
+ const memberRecords = [];
78
+ const first = members[0];
79
+ const artifactSegments = [
80
+ host.target.name,
81
+ sanitizePathSegment(first.test.serialId ?? first.test.id),
82
+ `attempt-${attemptIndex}`,
83
+ ];
84
+ const artifacts = createAttemptArtifacts({
85
+ artifactsRoot: host.artifactsRoot,
86
+ segments: artifactSegments,
87
+ attemptId,
88
+ ...(host.artifactStore === undefined ? {} : { store: host.artifactStore }),
89
+ // A group-owned artifact (the shared trace) is identified by the group,
90
+ // the same identity its report path uses.
91
+ identity: { runId: host.runId, testId: first.test.serialId ?? first.test.id, attemptId },
92
+ });
93
+ const record = {
94
+ id: attemptId,
95
+ index: attemptIndex,
96
+ status: 'passed',
97
+ startedAt,
98
+ durationMs: 0,
99
+ members: memberRecords,
100
+ artifacts: artifacts.records,
101
+ secondaryErrors: [],
102
+ cleanup: 'complete',
103
+ };
104
+ let realm;
105
+ try {
106
+ realm = await host.realms.create(absolutePath);
107
+ }
108
+ catch (cause) {
109
+ record.status = 'failed';
110
+ record.error = serializeError(classifyError(cause), { phase: 'collection' });
111
+ record.durationMs = Date.now() - startedMs;
112
+ return record;
113
+ }
114
+ let shared;
115
+ try {
116
+ shared = {
117
+ session: await host.launchSession(first, attemptId, artifacts.dir, host.interruptSignal),
118
+ attemptId,
119
+ artifactSegments,
120
+ priorSteps: [],
121
+ };
122
+ }
123
+ catch (cause) {
124
+ const error = classifyError(cause);
125
+ record.status = 'failed';
126
+ record.error = serializeError(error, { phase: 'launch' });
127
+ for (let memberIndex = 0; memberIndex < members.length; memberIndex += 1) {
128
+ memberRecords.push(skippedMember(attemptId, memberIndex, members[memberIndex].test.id, {
129
+ cause: 'infrastructure-unavailable',
130
+ reason: error.message,
131
+ }));
132
+ }
133
+ record.durationMs = Date.now() - startedMs;
134
+ await host.realms.leave(realm);
135
+ return record;
136
+ }
137
+ let skipRemaining;
138
+ let hookFailure;
139
+ for (let memberIndex = 0; memberIndex < members.length; memberIndex += 1) {
140
+ const member = members[memberIndex];
141
+ const memberId = `${attemptId}:member:${memberIndex}`;
142
+ if (skipRemaining === undefined && host.interruptSignal.aborted) {
143
+ skipRemaining = {
144
+ cause: 'infrastructure-unavailable',
145
+ reason: 'run interrupted during this group attempt',
146
+ };
147
+ }
148
+ if (skipRemaining !== undefined) {
149
+ memberRecords.push(skippedMember(attemptId, memberIndex, member.test.id, skipRemaining));
150
+ continue;
151
+ }
152
+ const registered = findRegistered(realm, member.test);
153
+ if (registered === undefined) {
154
+ memberRecords.push({
155
+ id: memberId,
156
+ index: memberIndex,
157
+ testId: member.test.id,
158
+ status: 'failed',
159
+ startedAt: timestamp(),
160
+ durationMs: 0,
161
+ steps: [],
162
+ error: serializeError(new ConfigurationError('COLLECTION_ERROR', 'member disappeared on re-import')),
163
+ secondaryErrors: [],
164
+ });
165
+ skipRemaining = predecessorFailed(memberIndex);
166
+ continue;
167
+ }
168
+ // Suite scopes enter per member, exactly as for ordinary tests: a
169
+ // beforeAll failure skips this member and, since later members build on
170
+ // its screen, every member after it (spec 11-lifecycle.md).
171
+ hookFailure = await host.realms.enterScopes(realm, registered);
172
+ if (hookFailure !== undefined) {
173
+ skipRemaining = { cause: 'hook-failed', reason: hookFailure.message };
174
+ memberRecords.push(skippedMember(attemptId, memberIndex, member.test.id, skipRemaining));
175
+ continue;
176
+ }
177
+ const memberAttempt = await host.runAttempt(member, registered, realm, attemptIndex, {
178
+ kind: 'serial',
179
+ shared,
180
+ });
181
+ shared.priorSteps.push(...memberAttempt.steps);
182
+ memberRecords.push({
183
+ id: memberId,
184
+ index: memberIndex,
185
+ testId: member.test.id,
186
+ status: memberAttempt.status,
187
+ startedAt: memberAttempt.startedAt,
188
+ durationMs: memberAttempt.durationMs,
189
+ steps: memberAttempt.steps,
190
+ ...(memberAttempt.error !== undefined ? { error: memberAttempt.error } : {}),
191
+ secondaryErrors: memberAttempt.secondaryErrors,
192
+ });
193
+ record.artifacts.push(...memberAttempt.artifacts);
194
+ if (memberAttempt.status !== 'passed')
195
+ skipRemaining = predecessorFailed(memberIndex);
196
+ }
197
+ await host.realms.leave(realm);
198
+ await host.closeSession(shared.session, attemptId, record, artifacts.sink, record.secondaryErrors);
199
+ await artifacts.settle();
200
+ const failedMember = memberRecords.find(isFailedMember);
201
+ if (host.interruptSignal.aborted) {
202
+ record.status = 'interrupted';
203
+ }
204
+ else if (failedMember === undefined && hookFailure !== undefined) {
205
+ // No member failed, but a suite hook did: the attempt is a failure the
206
+ // hook explains, never a pass over skipped members.
207
+ record.status = 'failed';
208
+ record.error = hookFailure;
209
+ }
210
+ else if (failedMember === undefined) {
211
+ record.status = 'passed';
212
+ }
213
+ else {
214
+ record.status = failedMember.status;
215
+ if (failedMember.error !== undefined)
216
+ record.error = failedMember.error;
217
+ }
218
+ record.durationMs = Date.now() - startedMs;
219
+ return record;
220
+ }
221
+ function isFailedMember(member) {
222
+ return member.status !== 'passed' && member.status !== 'skipped';
223
+ }
224
+ function predecessorFailed(memberIndex) {
225
+ return {
226
+ cause: 'serial-predecessor-failed',
227
+ reason: `member ${memberIndex} failed in this group attempt`,
228
+ };
229
+ }
230
+ function skippedMember(attemptId, index, testId, skip) {
231
+ return {
232
+ id: `${attemptId}:member:${index}`,
233
+ index,
234
+ testId,
235
+ status: 'skipped',
236
+ startedAt: timestamp(),
237
+ durationMs: 0,
238
+ steps: [],
239
+ skip,
240
+ secondaryErrors: [],
241
+ };
242
+ }
243
+ function serialTitlePath(test) {
244
+ const titles = groupTitles(test.serialRoot);
245
+ return titles.length === 0 ? [test.title] : titles;
246
+ }
247
+ //# sourceMappingURL=serial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial.js","sourceRoot":"","sources":["../../src/run/serial.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /** Per-run encrypted session store (spec 11-lifecycle.md, 13-reporting.md). */
2
+ import type { BackendSpiVersion, BackendState } from '../backend/surface.ts';
3
+ export interface SessionIdentity {
4
+ readonly targetId: string;
5
+ readonly backendName: string;
6
+ readonly backendVersion: string;
7
+ readonly spiVersion: BackendSpiVersion;
8
+ readonly platform: string;
9
+ readonly appIdentity: string;
10
+ }
11
+ /**
12
+ * Collects states saved by one setup attempt and owns the setup session
13
+ * contract: each declared name saved exactly once, nothing undeclared.
14
+ */
15
+ export declare class SessionStaging {
16
+ private readonly declared;
17
+ private readonly staged;
18
+ constructor(declared: readonly string[]);
19
+ /** Stages one captured state, rejecting duplicate or undeclared names. */
20
+ stage(name: string, state: BackendState): void;
21
+ /** Declared names the attempt finished without saving. */
22
+ missing(): string[];
23
+ entries(): IterableIterator<[string, BackendState]>;
24
+ }
25
+ /** Holds the per-run AES-256-GCM key in memory and owns the session directory. */
26
+ export declare class SessionStore {
27
+ private readonly runId;
28
+ private readonly key;
29
+ private readonly directory;
30
+ /** Decrypted states by target and name; see `load`. */
31
+ private readonly loaded;
32
+ private constructor();
33
+ /** Opens the store for a new run, generating its key. */
34
+ static create(runId: string, sessionsRoot: string): SessionStore;
35
+ /** Opens the store in a worker, reusing the key the runner generated. */
36
+ static forWorker(runId: string, sessionsRoot: string, key: Buffer): SessionStore;
37
+ /** Base64 key for transfer to worker processes over IPC (never disk/env). */
38
+ exportKeyForWorker(): string;
39
+ private ensureDirectory;
40
+ private filePath;
41
+ /** Encrypts and atomically persists one captured backend state. */
42
+ save(name: string, identity: SessionIdentity, state: BackendState): Promise<void>;
43
+ /**
44
+ * Validates identity and expiry, then decrypts one session state. A
45
+ * session is immutable for the life of the run that produced it, so the
46
+ * decrypted state is memoized per store: a worker running many consumers
47
+ * of one session reads and decrypts its file once.
48
+ */
49
+ load(name: string, identity: SessionIdentity): Promise<BackendState>;
50
+ private loadUncached;
51
+ /** Deletes the run's session directory. */
52
+ cleanup(): void;
53
+ }
54
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/run/sessions.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAM/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAM7E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAsBD;;;GAGG;AACH,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAE1D,YAA6B,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAI;IAE5D,0EAA0E;IAC1E,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAY7C;IAED,0DAA0D;IAC1D,OAAO,IAAI,MAAM,EAAE,CAElB;IAED,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAElD;CACF;AAED,kFAAkF;AAClF,qBAAa,YAAY;IAOrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IAEnE,OAAO,eAON;IAED,yDAAyD;IACzD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CAE/D;IAED,yEAAyE;IACzE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAK/E;IAED,6EAA6E;IAC7E,kBAAkB,IAAI,MAAM,CAE3B;IAED,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,QAAQ;IAIhB,mEAAmE;IAC7D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDtF;IAED;;;;;OAKG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAYzE;YAEa,YAAY;IA0D1B,2CAA2C;IAC3C,OAAO,IAAI,IAAI,CAEd;CACF"}
@@ -0,0 +1,221 @@
1
+ /** Per-run encrypted session store (spec 11-lifecycle.md, 13-reporting.md). */
2
+ import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';
3
+ import { mkdirSync, rmSync } from 'node:fs';
4
+ import { readFile, writeFile, rename } from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ import { ConfigurationError, E2EError } from '../internal/errors.js';
7
+ import { canonicalJson, timestamp } from '../internal/ids.js';
8
+ const MAX_SESSION_AGE_MS = 24 * 60 * 60 * 1000;
9
+ /**
10
+ * Collects states saved by one setup attempt and owns the setup session
11
+ * contract: each declared name saved exactly once, nothing undeclared.
12
+ */
13
+ export class SessionStaging {
14
+ declared;
15
+ staged = new Map();
16
+ constructor(declared) {
17
+ this.declared = declared;
18
+ }
19
+ /** Stages one captured state, rejecting duplicate or undeclared names. */
20
+ stage(name, state) {
21
+ if (this.staged.has(name)) {
22
+ throw new E2EError('test', 'SESSION_CONTRACT', `session "${name}" saved twice`);
23
+ }
24
+ if (!this.declared.includes(name)) {
25
+ throw new E2EError('test', 'SESSION_CONTRACT', `session "${name}" was not declared by this setup test`);
26
+ }
27
+ this.staged.set(name, state);
28
+ }
29
+ /** Declared names the attempt finished without saving. */
30
+ missing() {
31
+ return this.declared.filter((name) => !this.staged.has(name));
32
+ }
33
+ entries() {
34
+ return this.staged.entries();
35
+ }
36
+ }
37
+ /** Holds the per-run AES-256-GCM key in memory and owns the session directory. */
38
+ export class SessionStore {
39
+ runId;
40
+ key;
41
+ directory;
42
+ /** Decrypted states by target and name; see `load`. */
43
+ loaded = new Map();
44
+ constructor(runId, sessionsRoot, key) {
45
+ this.runId = runId;
46
+ this.key = key;
47
+ this.directory = path.join(sessionsRoot, runId);
48
+ }
49
+ /** Opens the store for a new run, generating its key. */
50
+ static create(runId, sessionsRoot) {
51
+ return new SessionStore(runId, sessionsRoot, randomBytes(32));
52
+ }
53
+ /** Opens the store in a worker, reusing the key the runner generated. */
54
+ static forWorker(runId, sessionsRoot, key) {
55
+ if (key.length !== 32) {
56
+ throw new E2EError('infrastructure', 'SESSION_KEY_INVALID', 'session key must be 32 bytes');
57
+ }
58
+ return new SessionStore(runId, sessionsRoot, key);
59
+ }
60
+ /** Base64 key for transfer to worker processes over IPC (never disk/env). */
61
+ exportKeyForWorker() {
62
+ return this.key.toString('base64');
63
+ }
64
+ ensureDirectory() {
65
+ mkdirSync(this.directory, { recursive: true, mode: 0o700 });
66
+ }
67
+ filePath(targetId, name) {
68
+ return path.join(this.directory, `${targetId}--${name}.json`);
69
+ }
70
+ /** Encrypts and atomically persists one captured backend state. */
71
+ async save(name, identity, state) {
72
+ this.ensureDirectory();
73
+ const createdAt = timestamp();
74
+ let expiresAt = new Date(Date.now() + MAX_SESSION_AGE_MS).toISOString();
75
+ if (state.expiresAt !== undefined) {
76
+ const stateExpiry = Date.parse(state.expiresAt);
77
+ if (Number.isNaN(stateExpiry) || stateExpiry <= Date.now()) {
78
+ throw new E2EError('test', 'SESSION_EXPIRED', 'state expiry is at or before creation');
79
+ }
80
+ if (stateExpiry < Date.parse(expiresAt))
81
+ expiresAt = new Date(stateExpiry).toISOString();
82
+ }
83
+ const iv = randomBytes(12);
84
+ const ivBase64 = iv.toString('base64');
85
+ const envelopeWithoutCipher = {
86
+ schemaVersion: 'session-1',
87
+ runId: this.runId,
88
+ name,
89
+ targetId: identity.targetId,
90
+ backend: {
91
+ name: identity.backendName,
92
+ version: identity.backendVersion,
93
+ spiVersion: identity.spiVersion,
94
+ },
95
+ platform: identity.platform,
96
+ appIdentity: identity.appIdentity,
97
+ createdAt,
98
+ expiresAt,
99
+ state: {
100
+ format: state.format,
101
+ version: state.version,
102
+ algorithm: 'A256GCM',
103
+ iv: ivBase64,
104
+ },
105
+ };
106
+ const aad = Buffer.from(canonicalJson(envelopeWithoutCipher), 'utf8');
107
+ const cipher = createCipheriv('aes-256-gcm', this.key, iv);
108
+ cipher.setAAD(aad);
109
+ const plaintext = Buffer.from(JSON.stringify(state.data), 'utf8');
110
+ const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
111
+ const tag = cipher.getAuthTag();
112
+ const envelope = {
113
+ ...envelopeWithoutCipher,
114
+ state: {
115
+ ...envelopeWithoutCipher.state,
116
+ tag: tag.toString('base64'),
117
+ ciphertext: ciphertext.toString('base64'),
118
+ },
119
+ };
120
+ const target = this.filePath(identity.targetId, name);
121
+ const temporary = `${target}.tmp-${randomBytes(4).toString('hex')}`;
122
+ await writeFile(temporary, `${JSON.stringify(envelope, null, 2)}\n`, { mode: 0o600 });
123
+ await rename(temporary, target);
124
+ }
125
+ /**
126
+ * Validates identity and expiry, then decrypts one session state. A
127
+ * session is immutable for the life of the run that produced it, so the
128
+ * decrypted state is memoized per store: a worker running many consumers
129
+ * of one session reads and decrypts its file once.
130
+ */
131
+ async load(name, identity) {
132
+ const memoKey = `${identity.targetId}\u0000${name}`;
133
+ const cached = this.loaded.get(memoKey);
134
+ if (cached !== undefined)
135
+ return cached;
136
+ const loading = this.loadUncached(name, identity);
137
+ this.loaded.set(memoKey, loading);
138
+ try {
139
+ return await loading;
140
+ }
141
+ catch (cause) {
142
+ this.loaded.delete(memoKey);
143
+ throw cause;
144
+ }
145
+ }
146
+ async loadUncached(name, identity) {
147
+ let rawText;
148
+ try {
149
+ rawText = await readFile(this.filePath(identity.targetId, name), 'utf8');
150
+ }
151
+ catch (cause) {
152
+ throw new ConfigurationError('SESSION_UNAVAILABLE', `session "${name}" was not produced`, {
153
+ cause,
154
+ });
155
+ }
156
+ const envelope = parseEnvelope(rawText, name);
157
+ if (envelope.schemaVersion !== 'session-1' ||
158
+ envelope.runId !== this.runId ||
159
+ envelope.targetId !== identity.targetId ||
160
+ envelope.backend.name !== identity.backendName ||
161
+ envelope.backend.version !== identity.backendVersion ||
162
+ envelope.backend.spiVersion !== identity.spiVersion ||
163
+ envelope.platform !== identity.platform ||
164
+ envelope.appIdentity !== identity.appIdentity) {
165
+ throw new ConfigurationError('SESSION_MISMATCH', `session "${name}" does not match the current run/target/backend identity`);
166
+ }
167
+ if (Date.parse(envelope.expiresAt) <= Date.now()) {
168
+ throw new ConfigurationError('SESSION_EXPIRED', `session "${name}" is expired`);
169
+ }
170
+ const { tag, ciphertext, ...aadState } = envelope.state;
171
+ const aadEnvelope = { ...envelope, state: aadState };
172
+ const aad = Buffer.from(canonicalJson(aadEnvelope), 'utf8');
173
+ const decipher = createDecipheriv('aes-256-gcm', this.key, Buffer.from(envelope.state.iv, 'base64'));
174
+ decipher.setAAD(aad);
175
+ decipher.setAuthTag(Buffer.from(tag, 'base64'));
176
+ let plaintext;
177
+ try {
178
+ plaintext = Buffer.concat([
179
+ decipher.update(Buffer.from(ciphertext, 'base64')),
180
+ decipher.final(),
181
+ ]);
182
+ }
183
+ catch (cause) {
184
+ throw new ConfigurationError('SESSION_INVALID', `session "${name}" failed authentication`, {
185
+ cause,
186
+ });
187
+ }
188
+ return {
189
+ format: envelope.state.format,
190
+ version: envelope.state.version,
191
+ data: JSON.parse(plaintext.toString('utf8')),
192
+ expiresAt: envelope.expiresAt,
193
+ };
194
+ }
195
+ /** Deletes the run's session directory. */
196
+ cleanup() {
197
+ rmSync(this.directory, { recursive: true, force: true });
198
+ }
199
+ }
200
+ /** Parses an envelope file, classifying a corrupt or truncated one as SESSION_INVALID. */
201
+ function parseEnvelope(rawText, name) {
202
+ let parsed;
203
+ try {
204
+ parsed = JSON.parse(rawText);
205
+ }
206
+ catch (cause) {
207
+ throw new ConfigurationError('SESSION_INVALID', `session "${name}" is not valid JSON`, {
208
+ cause,
209
+ });
210
+ }
211
+ if (typeof parsed !== 'object' ||
212
+ parsed === null ||
213
+ typeof parsed.state !== 'object' ||
214
+ parsed.state === null ||
215
+ typeof parsed.backend !== 'object' ||
216
+ parsed.backend === null) {
217
+ throw new ConfigurationError('SESSION_INVALID', `session "${name}" has an unexpected shape`);
218
+ }
219
+ return parsed;
220
+ }
221
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/run/sessions.ts"],"names":[],"mappings":"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"}