@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,512 @@
1
+ /**
2
+ * The run engine: dispatches file-target work units across workers (spec
3
+ * 11-lifecycle.md). Per target, setup units complete before ordinary units
4
+ * dispatch; a worker is bound to one target, runs one unit at a time, and is
5
+ * discarded after any failing unit or infrastructure fault.
6
+ *
7
+ * Workers are reached only through `SpawnUnitRunner`, so the same scheduling,
8
+ * gating, and reporting logic covers both child-process and in-process
9
+ * execution.
10
+ */
11
+ import { InfrastructureError, serializeError } from '../internal/errors.js';
12
+ import { timestamp, uuidv7 } from '../internal/ids.js';
13
+ import { buildWorkPlans, INTERRUPTED_BEFORE_START, nonRunResult, pairResult, setupFailedSkip, unstartedResult, } from './units.js';
14
+ import { decodeResult } from './worker/protocol.js';
15
+ /** Consecutive worker-boot failures per target before its units are failed. */
16
+ const MAX_INIT_FAILURES = 2;
17
+ /** How long a retiring or draining worker gets before it is force-killed. */
18
+ const SHUTDOWN_GRACE_MS = 10_000;
19
+ /** Runs every selected unit and streams records. */
20
+ export async function runUnits(options) {
21
+ await new Scheduler(options).run();
22
+ }
23
+ /**
24
+ * One worker and the unit it is executing. Owns its own lifecycle so the
25
+ * scheduler never has to keep a separate record in sync with the transport.
26
+ */
27
+ class SchedulerWorker {
28
+ targetName;
29
+ runner;
30
+ state = 'starting';
31
+ /** Unit handed over but not yet acknowledged, while the worker starts up. */
32
+ queued;
33
+ unit;
34
+ /** Test ids already reported for `unit`, used to synthesize crash results. */
35
+ reported = new Set();
36
+ inFlightTestId;
37
+ sawFailure = false;
38
+ becameReady = false;
39
+ killTimer;
40
+ constructor(targetName, spawn, onMessage, onExit) {
41
+ this.targetName = targetName;
42
+ this.runner = spawn(targetName, {
43
+ onMessage: (message) => onMessage(this, message),
44
+ onExit: (detail) => {
45
+ this.clearKillTimer();
46
+ onExit(this, detail);
47
+ },
48
+ });
49
+ }
50
+ /** Sends a unit and starts tracking it. */
51
+ dispatch(unit) {
52
+ this.state = 'busy';
53
+ this.unit = unit;
54
+ this.reported.clear();
55
+ this.inFlightTestId = undefined;
56
+ this.sawFailure = false;
57
+ const pairs = unit.pairs.map((pair) => ({
58
+ test: pair.test,
59
+ options: pair.options,
60
+ }));
61
+ this.runner.send({
62
+ type: 'run-unit',
63
+ unitId: unit.id,
64
+ kind: unit.kind,
65
+ file: unit.file,
66
+ absolutePath: unit.absolutePath,
67
+ pairs,
68
+ });
69
+ }
70
+ /** Asks for a graceful exit and force-kills if it takes too long. */
71
+ shutdown(graceMs) {
72
+ this.runner.send({ type: 'shutdown' });
73
+ this.killAfter(graceMs);
74
+ }
75
+ killAfter(graceMs) {
76
+ if (this.killTimer !== undefined || !this.runner.alive)
77
+ return;
78
+ this.killTimer = setTimeout(() => this.runner.kill(), graceMs);
79
+ this.killTimer.unref();
80
+ }
81
+ clearKillTimer() {
82
+ if (this.killTimer === undefined)
83
+ return;
84
+ clearTimeout(this.killTimer);
85
+ this.killTimer = undefined;
86
+ }
87
+ }
88
+ class Scheduler {
89
+ options;
90
+ targets = new Map();
91
+ /** Every worker that has not exited yet, retired ones included. */
92
+ workers = [];
93
+ wake;
94
+ interruptBroadcast = false;
95
+ constructor(options) {
96
+ this.options = options;
97
+ }
98
+ async run() {
99
+ const plans = buildWorkPlans(this.options.selection, this.options.collection, this.options.projectRoot);
100
+ for (const plan of plans) {
101
+ this.targets.set(plan.target.name, {
102
+ target: plan.target,
103
+ setupQueue: [...plan.setupUnits],
104
+ fileQueue: [...plan.fileUnits],
105
+ failedSessions: new Map(),
106
+ initFailures: 0,
107
+ failed: false,
108
+ });
109
+ if (!this.options.interruptSignal.aborted) {
110
+ for (const pair of plan.immediate)
111
+ this.options.events.onResult(nonRunResult(pair));
112
+ }
113
+ }
114
+ const onInterrupt = () => this.wakeUp();
115
+ this.options.interruptSignal.addEventListener('abort', onInterrupt, { once: true });
116
+ try {
117
+ for (;;) {
118
+ this.broadcastInterrupt();
119
+ this.dispatch();
120
+ if (this.isDone())
121
+ break;
122
+ await new Promise((resolve) => {
123
+ this.wake = resolve;
124
+ });
125
+ }
126
+ }
127
+ finally {
128
+ this.options.interruptSignal.removeEventListener('abort', onInterrupt);
129
+ await this.drain();
130
+ }
131
+ }
132
+ wakeUp() {
133
+ const resolve = this.wake;
134
+ this.wake = undefined;
135
+ resolve?.();
136
+ }
137
+ broadcastInterrupt() {
138
+ if (!this.options.interruptSignal.aborted || this.interruptBroadcast)
139
+ return;
140
+ this.interruptBroadcast = true;
141
+ for (const state of this.targets.values()) {
142
+ state.setupQueue.length = 0;
143
+ state.fileQueue.length = 0;
144
+ }
145
+ // Snapshot first: retiring a worker mutates `this.workers`, and iterating
146
+ // the live array would skip entries as they are spliced out.
147
+ const live = [...this.workers];
148
+ for (const worker of live) {
149
+ worker.runner.send({ type: 'interrupt' });
150
+ if (worker.state === 'busy')
151
+ worker.killAfter(this.options.interruptGraceMs);
152
+ else
153
+ this.retire(worker);
154
+ }
155
+ }
156
+ isDone() {
157
+ for (const state of this.targets.values()) {
158
+ if (state.setupQueue.length > 0 || state.fileQueue.length > 0)
159
+ return false;
160
+ }
161
+ return !this.workers.some((worker) => worker.state === 'busy' || worker.queued !== undefined);
162
+ }
163
+ // --- dispatch ---
164
+ /**
165
+ * Assigns as much work as capacity allows. A unit is always taken off its
166
+ * queue before a worker is acquired, so a spawn can never be left with
167
+ * nothing to do.
168
+ */
169
+ dispatch() {
170
+ if (this.options.interruptSignal.aborted)
171
+ return;
172
+ for (;;) {
173
+ const state = this.nextTarget();
174
+ if (state === undefined)
175
+ return;
176
+ const unit = this.takeUnit(state);
177
+ if (unit === undefined)
178
+ continue;
179
+ const worker = this.acquireWorker(state.target.name);
180
+ if (worker === undefined) {
181
+ // No capacity right now; put the unit back at the head of its queue.
182
+ this.returnUnit(state, unit);
183
+ return;
184
+ }
185
+ if (worker.state === 'idle')
186
+ worker.dispatch(unit);
187
+ else
188
+ worker.queued = unit;
189
+ }
190
+ }
191
+ /** The first target that has a dispatchable unit and could accept a worker. */
192
+ nextTarget() {
193
+ for (const state of this.targets.values()) {
194
+ if (this.peekUnit(state) === undefined)
195
+ continue;
196
+ if (this.canPlaceWork(state.target.name))
197
+ return state;
198
+ }
199
+ return undefined;
200
+ }
201
+ peekUnit(state) {
202
+ if (state.failed)
203
+ return undefined;
204
+ if (state.setupQueue.length > 0)
205
+ return state.setupQueue[0];
206
+ // Ordinary units wait until every setup for this target has finished.
207
+ if (this.hasPendingSetup(state))
208
+ return undefined;
209
+ return state.fileQueue[0];
210
+ }
211
+ /**
212
+ * Setup gating is derived, not counted: a target has pending setups while
213
+ * any setup unit is queued or in flight for it.
214
+ */
215
+ hasPendingSetup(state) {
216
+ if (state.setupQueue.length > 0)
217
+ return true;
218
+ return this.workers.some((worker) => worker.targetName === state.target.name &&
219
+ (worker.unit?.kind === 'setup' || worker.queued?.kind === 'setup'));
220
+ }
221
+ /** Pops the next unit, applying setup-failure gating; may complete it inline. */
222
+ takeUnit(state) {
223
+ for (;;) {
224
+ const unit = this.peekUnit(state);
225
+ if (unit === undefined)
226
+ return undefined;
227
+ if (unit.kind === 'setup')
228
+ state.setupQueue.shift();
229
+ else
230
+ state.fileQueue.shift();
231
+ const runnable = unit.pairs.filter((pair) => {
232
+ const skip = this.dependencySkip(state, pair);
233
+ if (skip === undefined)
234
+ return true;
235
+ this.options.events.onResult(pairResult(pair, { status: 'skipped', selected: true, skip, attempts: [] }));
236
+ return false;
237
+ });
238
+ if (runnable.length === 0)
239
+ continue;
240
+ return runnable.length === unit.pairs.length ? unit : { ...unit, pairs: runnable };
241
+ }
242
+ }
243
+ /** Puts an untaken unit back so capacity pressure never drops work. */
244
+ returnUnit(state, unit) {
245
+ if (unit.kind === 'setup')
246
+ state.setupQueue.unshift(unit);
247
+ else
248
+ state.fileQueue.unshift(unit);
249
+ }
250
+ /** Skip info when a pair's session was not produced by a passing setup. */
251
+ dependencySkip(state, pair) {
252
+ const session = pair.options.session;
253
+ if (session === undefined)
254
+ return undefined;
255
+ const failedSetup = state.failedSessions.get(session);
256
+ if (failedSetup === undefined)
257
+ return undefined;
258
+ return setupFailedSkip(session, failedSetup);
259
+ }
260
+ // --- workers ---
261
+ /** Whether a worker for `targetName` can be obtained without exceeding the cap. */
262
+ canPlaceWork(targetName) {
263
+ if (this.findAvailable(targetName) !== undefined)
264
+ return true;
265
+ if (this.workers.length < this.options.workers)
266
+ return true;
267
+ return this.findRetirableForeignWorker(targetName) !== undefined;
268
+ }
269
+ /**
270
+ * A worker for this target, spawning one if the cap allows. Retired workers
271
+ * keep counting against the cap until they are gone, so a discarded worker
272
+ * never doubles the number of live surfaces. At capacity this discards an
273
+ * idle worker bound to another target and returns nothing; its exit wakes
274
+ * the loop and dispatch retries with the freed slot.
275
+ */
276
+ acquireWorker(targetName) {
277
+ const available = this.findAvailable(targetName);
278
+ if (available !== undefined)
279
+ return available;
280
+ if (this.workers.length < this.options.workers)
281
+ return this.spawn(targetName);
282
+ const foreign = this.findRetirableForeignWorker(targetName);
283
+ if (foreign !== undefined)
284
+ this.retire(foreign);
285
+ return undefined;
286
+ }
287
+ findAvailable(targetName) {
288
+ return this.workers.find((worker) => worker.targetName === targetName &&
289
+ worker.queued === undefined &&
290
+ (worker.state === 'idle' || worker.state === 'starting'));
291
+ }
292
+ findRetirableForeignWorker(targetName) {
293
+ return this.workers.find((worker) => worker.state === 'idle' && worker.targetName !== targetName);
294
+ }
295
+ spawn(targetName) {
296
+ const worker = new SchedulerWorker(targetName, this.options.spawn, (target, message) => this.onMessage(target, message), (target, detail) => this.onExit(target, detail));
297
+ this.workers.push(worker);
298
+ return worker;
299
+ }
300
+ /**
301
+ * Discards a worker. It stays in `this.workers` (so it keeps counting
302
+ * against the cap) until its exit is observed.
303
+ */
304
+ retire(worker) {
305
+ if (worker.state === 'retired')
306
+ return;
307
+ worker.state = 'retired';
308
+ // Dropping rather than requeueing is only safe because the sole caller
309
+ // that can retire a worker still holding a unit is the interrupt
310
+ // broadcast, which clears the queues anyway. Requeueing here would strand
311
+ // the loop instead: `dispatch` stops once interrupted, so the unit would
312
+ // sit in a queue that `isDone` waits on forever. The other callers only
313
+ // ever retire idle workers, which never hold a queued unit.
314
+ worker.queued = undefined;
315
+ worker.shutdown(SHUTDOWN_GRACE_MS);
316
+ }
317
+ forget(worker) {
318
+ const index = this.workers.indexOf(worker);
319
+ if (index !== -1)
320
+ this.workers.splice(index, 1);
321
+ }
322
+ targetState(worker) {
323
+ const state = this.targets.get(worker.targetName);
324
+ if (state === undefined) {
325
+ throw new Error(`worker bound to unknown target "${worker.targetName}"`);
326
+ }
327
+ return state;
328
+ }
329
+ onMessage(worker, message) {
330
+ switch (message.type) {
331
+ case 'ready': {
332
+ worker.becameReady = true;
333
+ this.targetState(worker).initFailures = 0;
334
+ worker.state = 'idle';
335
+ const queued = worker.queued;
336
+ worker.queued = undefined;
337
+ if (queued !== undefined)
338
+ worker.dispatch(queued);
339
+ this.wakeUp();
340
+ break;
341
+ }
342
+ case 'pair-start': {
343
+ worker.inFlightTestId = message.testId;
344
+ this.options.events.onTestStart?.(message.testId, message.title, worker.targetName);
345
+ break;
346
+ }
347
+ case 'progress': {
348
+ this.options.events.onProgress?.(message.testId, worker.targetName, message.progress);
349
+ break;
350
+ }
351
+ case 'result': {
352
+ const state = this.targetState(worker);
353
+ const result = decodeResult(message.result, state.target);
354
+ worker.reported.add(result.test.id);
355
+ if (result.status !== 'passed' && result.status !== 'flaky' && result.status !== 'skipped') {
356
+ worker.sawFailure = true;
357
+ }
358
+ if (result.test.kind === 'setup')
359
+ this.recordSetupOutcome(state, result);
360
+ this.options.events.onResult(result);
361
+ break;
362
+ }
363
+ case 'serial-group': {
364
+ this.options.events.onSerialGroup(message.group);
365
+ break;
366
+ }
367
+ case 'unit-done': {
368
+ for (const runError of message.runErrors)
369
+ this.options.events.onRunError(runError);
370
+ if (message.debug !== undefined)
371
+ this.options.events.onDebug?.(message.debug);
372
+ if (message.aiTrace !== undefined)
373
+ this.options.events.onAiTrace?.(message.aiTrace);
374
+ const unit = worker.unit;
375
+ worker.unit = undefined;
376
+ worker.inFlightTestId = undefined;
377
+ if (unit !== undefined && unit.id !== message.unitId) {
378
+ this.options.events.onRunError({
379
+ error: serializeError(new InfrastructureError('WORKER_PROTOCOL', `worker reported unit "${message.unitId}" while running "${unit.id}"`)),
380
+ });
381
+ }
382
+ if (worker.state !== 'retired') {
383
+ // Spec 11-lifecycle.md: discard the worker after a failing unit.
384
+ if (worker.sawFailure)
385
+ this.retire(worker);
386
+ else
387
+ worker.state = 'idle';
388
+ }
389
+ this.wakeUp();
390
+ break;
391
+ }
392
+ case 'shutdown-done': {
393
+ for (const runError of message.runErrors)
394
+ this.options.events.onRunError(runError);
395
+ if (message.debug !== undefined)
396
+ this.options.events.onDebug?.(message.debug);
397
+ if (message.aiTrace !== undefined)
398
+ this.options.events.onAiTrace?.(message.aiTrace);
399
+ break;
400
+ }
401
+ case 'fatal': {
402
+ this.options.events.onRunError({ error: message.error });
403
+ worker.runner.kill();
404
+ break;
405
+ }
406
+ }
407
+ }
408
+ recordSetupOutcome(state, result) {
409
+ if (result.status === 'passed' || result.status === 'flaky')
410
+ return;
411
+ for (const session of result.test.sessions) {
412
+ state.failedSessions.set(session, result.test.id);
413
+ }
414
+ }
415
+ onExit(worker, detail) {
416
+ const tracked = this.workers.includes(worker);
417
+ this.forget(worker);
418
+ const state = this.targetState(worker);
419
+ const unit = worker.unit;
420
+ worker.unit = undefined;
421
+ // A queued unit never reached the worker. Requeue it before any handling
422
+ // below, so that failing the target drains it along with the rest.
423
+ if (worker.queued !== undefined) {
424
+ this.returnUnit(state, worker.queued);
425
+ worker.queued = undefined;
426
+ }
427
+ if (unit !== undefined) {
428
+ this.options.events.onRunError({
429
+ error: serializeError(new InfrastructureError('WORKER_EXIT', `worker for target "${worker.targetName}" exited unexpectedly (${detail}) during ${unit.id}`)),
430
+ });
431
+ this.synthesizeCrashResults(state, worker, unit);
432
+ }
433
+ else if (tracked && !worker.becameReady) {
434
+ state.initFailures += 1;
435
+ if (state.initFailures >= MAX_INIT_FAILURES)
436
+ this.failTarget(state);
437
+ }
438
+ this.wakeUp();
439
+ }
440
+ /** Emits records for a unit whose worker died before reporting it done. */
441
+ synthesizeCrashResults(state, worker, unit) {
442
+ const interrupted = this.options.interruptSignal.aborted;
443
+ for (const pair of unit.pairs) {
444
+ if (worker.reported.has(pair.test.id))
445
+ continue;
446
+ if (interrupted) {
447
+ this.options.events.onResult(unstartedResult(pair, INTERRUPTED_BEFORE_START));
448
+ continue;
449
+ }
450
+ // A crashed setup never persisted its sessions; dependents must skip.
451
+ if (pair.test.kind === 'setup') {
452
+ for (const session of pair.test.sessions) {
453
+ state.failedSessions.set(session, pair.test.id);
454
+ }
455
+ }
456
+ const wasRunning = pair.test.id === worker.inFlightTestId && pair.test.serialId === undefined;
457
+ if (!wasRunning) {
458
+ this.options.events.onResult(unstartedResult(pair, {
459
+ cause: 'infrastructure-unavailable',
460
+ reason: 'worker process exited before this test started',
461
+ }));
462
+ continue;
463
+ }
464
+ this.options.events.onResult(pairResult(pair, {
465
+ status: 'failed',
466
+ selected: true,
467
+ attempts: [
468
+ {
469
+ id: uuidv7(),
470
+ index: 0,
471
+ status: 'failed',
472
+ startedAt: timestamp(),
473
+ durationMs: 0,
474
+ steps: [],
475
+ artifacts: [],
476
+ error: serializeError(new InfrastructureError('WORKER_CRASH', 'worker process exited during this test')),
477
+ secondaryErrors: [],
478
+ cleanup: 'forced',
479
+ },
480
+ ],
481
+ }));
482
+ }
483
+ }
484
+ /** Fails a target whose workers cannot boot; drains its queues with skips. */
485
+ failTarget(state) {
486
+ state.failed = true;
487
+ this.options.events.onRunError({
488
+ error: serializeError(new InfrastructureError('WORKER_INIT_FAILED', `workers for target "${state.target.name}" failed to start ${MAX_INIT_FAILURES} times; remaining units skipped`)),
489
+ });
490
+ const units = [...state.setupQueue, ...state.fileQueue];
491
+ state.setupQueue.length = 0;
492
+ state.fileQueue.length = 0;
493
+ for (const unit of units) {
494
+ for (const pair of unit.pairs) {
495
+ this.options.events.onResult(unstartedResult(pair, {
496
+ cause: 'infrastructure-unavailable',
497
+ reason: 'worker process failed to start',
498
+ }));
499
+ }
500
+ }
501
+ }
502
+ /** Shuts every remaining worker down, force-killing stragglers. */
503
+ async drain() {
504
+ const remaining = [...this.workers];
505
+ for (const worker of remaining) {
506
+ if (worker.state !== 'retired' && worker.runner.alive)
507
+ worker.shutdown(SHUTDOWN_GRACE_MS);
508
+ }
509
+ await Promise.all(remaining.map((worker) => worker.runner.exit));
510
+ }
511
+ }
512
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/run/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /** Serial-group execution: one shared session per group attempt (spec 11-lifecycle.md). */
2
+ import type { TargetSession } from '../backend/surface.ts';
3
+ import { type SerializedError } from '../internal/errors.ts';
4
+ import { type RegisteredTest } from '../collect/registry.ts';
5
+ import type { TestTargetPair } from '../collect/select.ts';
6
+ import type { ResolvedTarget } from '../config/resolve.ts';
7
+ import type { ArtifactStore } from '../types.ts';
8
+ import type { AttemptContext } from './execute.ts';
9
+ import type { ArtifactSink } from './fixtures.ts';
10
+ import type { StepRecord } from './steps.ts';
11
+ import { type Realm, RealmManager } from './realm.ts';
12
+ import type { AttemptRecord, ResultRecord, SerialGroupRecord } from './records.ts';
13
+ /**
14
+ * One shared session for a serial-group attempt: members preserve app state,
15
+ * so a screen an earlier member reached stays current for later members.
16
+ */
17
+ export interface SharedSerialSession {
18
+ readonly session: TargetSession;
19
+ /**
20
+ * The group attempt's report id. Member artifacts are filed under this
21
+ * attempt in the report, so a member's store identity uses it rather than
22
+ * the member's own private attempt id.
23
+ */
24
+ readonly attemptId: string;
25
+ /**
26
+ * Report segments of the group attempt directory. The shared session writes
27
+ * every artifact there, so members resolve artifact paths against it rather
28
+ * than against their own attempt directory.
29
+ */
30
+ readonly artifactSegments: readonly string[];
31
+ /** Steps completed by earlier members, so later members see them as prior context. */
32
+ readonly priorSteps: StepRecord[];
33
+ }
34
+ /** Executor capabilities the serial runner borrows. */
35
+ export interface SerialHost {
36
+ readonly target: ResolvedTarget;
37
+ readonly artifactsRoot: string;
38
+ readonly runId: string;
39
+ /** The configured artifact store, so group-owned artifacts (the shared trace) upload like any other. */
40
+ readonly artifactStore: ArtifactStore | undefined;
41
+ readonly interruptSignal: AbortSignal;
42
+ readonly realms: RealmManager;
43
+ launchSession(pair: TestTargetPair, attemptId: string, artifactsDir: string, signal: AbortSignal): Promise<TargetSession>;
44
+ closeSession(session: TargetSession, attemptId: string, record: {
45
+ cleanup: 'complete' | 'failed' | 'forced';
46
+ }, sink: ArtifactSink, secondaryErrors: SerializedError[]): Promise<void>;
47
+ runAttempt(pair: TestTargetPair, registered: RegisteredTest, realm: Realm, attemptIndex: number, context: AttemptContext): Promise<AttemptRecord>;
48
+ emit(result: ResultRecord): void;
49
+ }
50
+ /** Runs one serial unit to completion and emits every member result. */
51
+ export declare function runSerialUnit(host: SerialHost, members: readonly TestTargetPair[], absolutePath: string): Promise<SerialGroupRecord>;
52
+ //# sourceMappingURL=serial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial.d.ts","sourceRoot":"","sources":["../../src/run/serial.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAkB,KAAK,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EAGZ,iBAAiB,EAElB,MAAM,cAAc,CAAC;AAItB;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,sFAAsF;IACtF,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;CACnC;AAED,uDAAuD;AACvD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wGAAwG;IACxG,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,aAAa,CACX,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,YAAY,CACV,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;QAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAA;KAAE,EACrD,IAAI,EAAE,YAAY,EAClB,eAAe,EAAE,eAAe,EAAE,GACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,UAAU,CACR,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CAClC;AAED,wEAAwE;AACxE,wBAAsB,aAAa,CACjC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAmE5B"}