@elaraai/e3-rack 0.0.0-bootstrap.0 → 1.0.94

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 (306) hide show
  1. package/README.md +407 -2
  2. package/dist/src/client/client.spec.d.ts +6 -0
  3. package/dist/src/client/client.spec.d.ts.map +1 -0
  4. package/dist/src/client/client.spec.js +150 -0
  5. package/dist/src/client/client.spec.js.map +1 -0
  6. package/dist/src/client/connect.d.ts +52 -0
  7. package/dist/src/client/connect.d.ts.map +1 -0
  8. package/dist/src/client/connect.js +112 -0
  9. package/dist/src/client/connect.js.map +1 -0
  10. package/dist/src/client/hub-client.d.ts +57 -0
  11. package/dist/src/client/hub-client.d.ts.map +1 -0
  12. package/dist/src/client/hub-client.js +87 -0
  13. package/dist/src/client/hub-client.js.map +1 -0
  14. package/dist/src/client/local-http.d.ts +78 -0
  15. package/dist/src/client/local-http.d.ts.map +1 -0
  16. package/dist/src/client/local-http.js +149 -0
  17. package/dist/src/client/local-http.js.map +1 -0
  18. package/dist/src/client/session-attempts.d.ts +20 -0
  19. package/dist/src/client/session-attempts.d.ts.map +1 -0
  20. package/dist/src/client/session-attempts.js +88 -0
  21. package/dist/src/client/session-attempts.js.map +1 -0
  22. package/dist/src/client/session-data-server.d.ts +37 -0
  23. package/dist/src/client/session-data-server.d.ts.map +1 -0
  24. package/dist/src/client/session-data-server.js +280 -0
  25. package/dist/src/client/session-data-server.js.map +1 -0
  26. package/dist/src/client/session-data-server.spec.d.ts +6 -0
  27. package/dist/src/client/session-data-server.spec.d.ts.map +1 -0
  28. package/dist/src/client/session-data-server.spec.js +192 -0
  29. package/dist/src/client/session-data-server.spec.js.map +1 -0
  30. package/dist/src/client/session.d.ts +119 -0
  31. package/dist/src/client/session.d.ts.map +1 -0
  32. package/dist/src/client/session.js +290 -0
  33. package/dist/src/client/session.js.map +1 -0
  34. package/dist/src/hub/config.d.ts +74 -0
  35. package/dist/src/hub/config.d.ts.map +1 -0
  36. package/dist/src/hub/config.js +159 -0
  37. package/dist/src/hub/config.js.map +1 -0
  38. package/dist/src/hub/fair-lease-store.d.ts +36 -0
  39. package/dist/src/hub/fair-lease-store.d.ts.map +1 -0
  40. package/dist/src/hub/fair-lease-store.js +73 -0
  41. package/dist/src/hub/fair-lease-store.js.map +1 -0
  42. package/dist/src/hub/hub.d.ts +91 -0
  43. package/dist/src/hub/hub.d.ts.map +1 -0
  44. package/dist/src/hub/hub.js +641 -0
  45. package/dist/src/hub/hub.js.map +1 -0
  46. package/dist/src/hub/hub.spec.d.ts +6 -0
  47. package/dist/src/hub/hub.spec.d.ts.map +1 -0
  48. package/dist/src/hub/hub.spec.js +363 -0
  49. package/dist/src/hub/hub.spec.js.map +1 -0
  50. package/dist/src/hub/infrastructure.spec.d.ts +6 -0
  51. package/dist/src/hub/infrastructure.spec.d.ts.map +1 -0
  52. package/dist/src/hub/infrastructure.spec.js +211 -0
  53. package/dist/src/hub/infrastructure.spec.js.map +1 -0
  54. package/dist/src/hub/lock.d.ts +62 -0
  55. package/dist/src/hub/lock.d.ts.map +1 -0
  56. package/dist/src/hub/lock.js +165 -0
  57. package/dist/src/hub/lock.js.map +1 -0
  58. package/dist/src/hub/main.d.ts +16 -0
  59. package/dist/src/hub/main.d.ts.map +1 -0
  60. package/dist/src/hub/main.js +56 -0
  61. package/dist/src/hub/main.js.map +1 -0
  62. package/dist/src/hub/session-bridge.d.ts +116 -0
  63. package/dist/src/hub/session-bridge.d.ts.map +1 -0
  64. package/dist/src/hub/session-bridge.js +336 -0
  65. package/dist/src/hub/session-bridge.js.map +1 -0
  66. package/dist/src/identity/file-identity-store.d.ts +18 -0
  67. package/dist/src/identity/file-identity-store.d.ts.map +1 -0
  68. package/dist/src/identity/file-identity-store.js +34 -0
  69. package/dist/src/identity/file-identity-store.js.map +1 -0
  70. package/dist/src/identity/file-identity-store.spec.d.ts +6 -0
  71. package/dist/src/identity/file-identity-store.spec.d.ts.map +1 -0
  72. package/dist/src/identity/file-identity-store.spec.js +59 -0
  73. package/dist/src/identity/file-identity-store.spec.js.map +1 -0
  74. package/dist/src/identity/in-memory-identity-store.d.ts +48 -0
  75. package/dist/src/identity/in-memory-identity-store.d.ts.map +1 -0
  76. package/dist/src/identity/in-memory-identity-store.js +102 -0
  77. package/dist/src/identity/in-memory-identity-store.js.map +1 -0
  78. package/dist/src/identity/machine-identity.d.ts +134 -0
  79. package/dist/src/identity/machine-identity.d.ts.map +1 -0
  80. package/dist/src/identity/machine-identity.js +65 -0
  81. package/dist/src/identity/machine-identity.js.map +1 -0
  82. package/dist/src/index.d.ts +34 -0
  83. package/dist/src/index.d.ts.map +1 -0
  84. package/dist/src/index.js +34 -0
  85. package/dist/src/index.js.map +1 -0
  86. package/dist/src/lease/closure.d.ts +96 -0
  87. package/dist/src/lease/closure.d.ts.map +1 -0
  88. package/dist/src/lease/closure.js +192 -0
  89. package/dist/src/lease/closure.js.map +1 -0
  90. package/dist/src/lease/closure.spec.d.ts +6 -0
  91. package/dist/src/lease/closure.spec.d.ts.map +1 -0
  92. package/dist/src/lease/closure.spec.js +35 -0
  93. package/dist/src/lease/closure.spec.js.map +1 -0
  94. package/dist/src/lease/coordinator.d.ts +34 -0
  95. package/dist/src/lease/coordinator.d.ts.map +1 -0
  96. package/dist/src/lease/coordinator.js +42 -0
  97. package/dist/src/lease/coordinator.js.map +1 -0
  98. package/dist/src/lease/in-memory-lease-store.d.ts +58 -0
  99. package/dist/src/lease/in-memory-lease-store.d.ts.map +1 -0
  100. package/dist/src/lease/in-memory-lease-store.js +132 -0
  101. package/dist/src/lease/in-memory-lease-store.js.map +1 -0
  102. package/dist/src/lease/lease-store.d.ts +169 -0
  103. package/dist/src/lease/lease-store.d.ts.map +1 -0
  104. package/dist/src/lease/lease-store.js +94 -0
  105. package/dist/src/lease/lease-store.js.map +1 -0
  106. package/dist/src/lease/lease-store.spec.d.ts +6 -0
  107. package/dist/src/lease/lease-store.spec.d.ts.map +1 -0
  108. package/dist/src/lease/lease-store.spec.js +8 -0
  109. package/dist/src/lease/lease-store.spec.js.map +1 -0
  110. package/dist/src/lease/rack-dispatch.d.ts +105 -0
  111. package/dist/src/lease/rack-dispatch.d.ts.map +1 -0
  112. package/dist/src/lease/rack-dispatch.js +6 -0
  113. package/dist/src/lease/rack-dispatch.js.map +1 -0
  114. package/dist/src/mutation-queue.d.ts +13 -0
  115. package/dist/src/mutation-queue.d.ts.map +1 -0
  116. package/dist/src/mutation-queue.js +17 -0
  117. package/dist/src/mutation-queue.js.map +1 -0
  118. package/dist/src/paths.d.ts +56 -0
  119. package/dist/src/paths.d.ts.map +1 -0
  120. package/dist/src/paths.js +82 -0
  121. package/dist/src/paths.js.map +1 -0
  122. package/dist/src/protocol/control.d.ts +295 -0
  123. package/dist/src/protocol/control.d.ts.map +1 -0
  124. package/dist/src/protocol/control.js +74 -0
  125. package/dist/src/protocol/control.js.map +1 -0
  126. package/dist/src/protocol/index.d.ts +9 -0
  127. package/dist/src/protocol/index.d.ts.map +1 -0
  128. package/dist/src/protocol/index.js +9 -0
  129. package/dist/src/protocol/index.js.map +1 -0
  130. package/dist/src/protocol/rack-wire.d.ts +357 -0
  131. package/dist/src/protocol/rack-wire.d.ts.map +1 -0
  132. package/dist/src/protocol/rack-wire.js +262 -0
  133. package/dist/src/protocol/rack-wire.js.map +1 -0
  134. package/dist/src/protocol/rack-wire.spec.d.ts +6 -0
  135. package/dist/src/protocol/rack-wire.spec.d.ts.map +1 -0
  136. package/dist/src/protocol/rack-wire.spec.js +14 -0
  137. package/dist/src/protocol/rack-wire.spec.js.map +1 -0
  138. package/dist/src/protocol/registration.d.ts +70 -0
  139. package/dist/src/protocol/registration.d.ts.map +1 -0
  140. package/dist/src/protocol/registration.js +67 -0
  141. package/dist/src/protocol/registration.js.map +1 -0
  142. package/dist/src/protocol/session-data.d.ts +69 -0
  143. package/dist/src/protocol/session-data.d.ts.map +1 -0
  144. package/dist/src/protocol/session-data.js +26 -0
  145. package/dist/src/protocol/session-data.js.map +1 -0
  146. package/dist/src/protocol/task-envelope.d.ts +198 -0
  147. package/dist/src/protocol/task-envelope.d.ts.map +1 -0
  148. package/dist/src/protocol/task-envelope.js +93 -0
  149. package/dist/src/protocol/task-envelope.js.map +1 -0
  150. package/dist/src/protocol/wire-golden.d.ts +8 -0
  151. package/dist/src/protocol/wire-golden.d.ts.map +1 -0
  152. package/dist/src/protocol/wire-golden.js +34 -0
  153. package/dist/src/protocol/wire-golden.js.map +1 -0
  154. package/dist/src/protocol/wire-samples.d.ts +11 -0
  155. package/dist/src/protocol/wire-samples.d.ts.map +1 -0
  156. package/dist/src/protocol/wire-samples.js +52 -0
  157. package/dist/src/protocol/wire-samples.js.map +1 -0
  158. package/dist/src/registry/file-rack-registry.d.ts +68 -0
  159. package/dist/src/registry/file-rack-registry.d.ts.map +1 -0
  160. package/dist/src/registry/file-rack-registry.js +138 -0
  161. package/dist/src/registry/file-rack-registry.js.map +1 -0
  162. package/dist/src/registry/file-rack-registry.spec.d.ts +6 -0
  163. package/dist/src/registry/file-rack-registry.spec.d.ts.map +1 -0
  164. package/dist/src/registry/file-rack-registry.spec.js +50 -0
  165. package/dist/src/registry/file-rack-registry.spec.js.map +1 -0
  166. package/dist/src/registry/rack-registry.d.ts +64 -0
  167. package/dist/src/registry/rack-registry.d.ts.map +1 -0
  168. package/dist/src/registry/rack-registry.js +65 -0
  169. package/dist/src/registry/rack-registry.js.map +1 -0
  170. package/dist/src/registry/rack-registry.spec.d.ts +6 -0
  171. package/dist/src/registry/rack-registry.spec.d.ts.map +1 -0
  172. package/dist/src/registry/rack-registry.spec.js +8 -0
  173. package/dist/src/registry/rack-registry.spec.js.map +1 -0
  174. package/dist/src/routing/eligibility.d.ts +38 -0
  175. package/dist/src/routing/eligibility.d.ts.map +1 -0
  176. package/dist/src/routing/eligibility.js +78 -0
  177. package/dist/src/routing/eligibility.js.map +1 -0
  178. package/dist/src/routing/host-coupling.d.ts +26 -0
  179. package/dist/src/routing/host-coupling.d.ts.map +1 -0
  180. package/dist/src/routing/host-coupling.js +62 -0
  181. package/dist/src/routing/host-coupling.js.map +1 -0
  182. package/dist/src/routing/policy.d.ts +188 -0
  183. package/dist/src/routing/policy.d.ts.map +1 -0
  184. package/dist/src/routing/policy.js +212 -0
  185. package/dist/src/routing/policy.js.map +1 -0
  186. package/dist/src/routing/routing.spec.d.ts +6 -0
  187. package/dist/src/routing/routing.spec.d.ts.map +1 -0
  188. package/dist/src/routing/routing.spec.js +100 -0
  189. package/dist/src/routing/routing.spec.js.map +1 -0
  190. package/dist/src/routing/tiers.d.ts +22 -0
  191. package/dist/src/routing/tiers.d.ts.map +1 -0
  192. package/dist/src/routing/tiers.js +26 -0
  193. package/dist/src/routing/tiers.js.map +1 -0
  194. package/dist/src/runner/api-server.d.ts +45 -0
  195. package/dist/src/runner/api-server.d.ts.map +1 -0
  196. package/dist/src/runner/api-server.js +21 -0
  197. package/dist/src/runner/api-server.js.map +1 -0
  198. package/dist/src/runner/capacity.d.ts +13 -0
  199. package/dist/src/runner/capacity.d.ts.map +1 -0
  200. package/dist/src/runner/capacity.js +18 -0
  201. package/dist/src/runner/capacity.js.map +1 -0
  202. package/dist/src/runner/rack-body.d.ts +43 -0
  203. package/dist/src/runner/rack-body.d.ts.map +1 -0
  204. package/dist/src/runner/rack-body.js +208 -0
  205. package/dist/src/runner/rack-body.js.map +1 -0
  206. package/dist/src/runner/rack-runner.d.ts +62 -0
  207. package/dist/src/runner/rack-runner.d.ts.map +1 -0
  208. package/dist/src/runner/rack-runner.js +75 -0
  209. package/dist/src/runner/rack-runner.js.map +1 -0
  210. package/dist/src/runner/rack-runner.spec.d.ts +6 -0
  211. package/dist/src/runner/rack-runner.spec.d.ts.map +1 -0
  212. package/dist/src/runner/rack-runner.spec.js +302 -0
  213. package/dist/src/runner/rack-runner.spec.js.map +1 -0
  214. package/dist/src/runner/split.spec.d.ts +6 -0
  215. package/dist/src/runner/split.spec.d.ts.map +1 -0
  216. package/dist/src/runner/split.spec.js +188 -0
  217. package/dist/src/runner/split.spec.js.map +1 -0
  218. package/dist/src/runner-event.d.ts +261 -0
  219. package/dist/src/runner-event.d.ts.map +1 -0
  220. package/dist/src/runner-event.js +332 -0
  221. package/dist/src/runner-event.js.map +1 -0
  222. package/dist/src/server/beast2.d.ts +19 -0
  223. package/dist/src/server/beast2.d.ts.map +1 -0
  224. package/dist/src/server/beast2.js +18 -0
  225. package/dist/src/server/beast2.js.map +1 -0
  226. package/dist/src/server/body-limit.d.ts +16 -0
  227. package/dist/src/server/body-limit.d.ts.map +1 -0
  228. package/dist/src/server/body-limit.js +53 -0
  229. package/dist/src/server/body-limit.js.map +1 -0
  230. package/dist/src/server/body-limit.spec.d.ts +2 -0
  231. package/dist/src/server/body-limit.spec.d.ts.map +1 -0
  232. package/dist/src/server/body-limit.spec.js +32 -0
  233. package/dist/src/server/body-limit.spec.js.map +1 -0
  234. package/dist/src/server/bounded.d.ts +16 -0
  235. package/dist/src/server/bounded.d.ts.map +1 -0
  236. package/dist/src/server/bounded.js +39 -0
  237. package/dist/src/server/bounded.js.map +1 -0
  238. package/dist/src/server/dispatch.d.ts +137 -0
  239. package/dist/src/server/dispatch.d.ts.map +1 -0
  240. package/dist/src/server/dispatch.js +267 -0
  241. package/dist/src/server/dispatch.js.map +1 -0
  242. package/dist/src/server/env-publication.d.ts +45 -0
  243. package/dist/src/server/env-publication.d.ts.map +1 -0
  244. package/dist/src/server/env-publication.js +10 -0
  245. package/dist/src/server/env-publication.js.map +1 -0
  246. package/dist/src/server/index.d.ts +16 -0
  247. package/dist/src/server/index.d.ts.map +1 -0
  248. package/dist/src/server/index.js +17 -0
  249. package/dist/src/server/index.js.map +1 -0
  250. package/dist/src/server/protocol.spec.d.ts +6 -0
  251. package/dist/src/server/protocol.spec.d.ts.map +1 -0
  252. package/dist/src/server/protocol.spec.js +78 -0
  253. package/dist/src/server/protocol.spec.js.map +1 -0
  254. package/dist/src/server/rack-routes.d.ts +175 -0
  255. package/dist/src/server/rack-routes.d.ts.map +1 -0
  256. package/dist/src/server/rack-routes.js +755 -0
  257. package/dist/src/server/rack-routes.js.map +1 -0
  258. package/dist/src/server/rack-routes.spec.d.ts +6 -0
  259. package/dist/src/server/rack-routes.spec.d.ts.map +1 -0
  260. package/dist/src/server/rack-routes.spec.js +477 -0
  261. package/dist/src/server/rack-routes.spec.js.map +1 -0
  262. package/dist/src/server/storage-bridge.d.ts +140 -0
  263. package/dist/src/server/storage-bridge.d.ts.map +1 -0
  264. package/dist/src/server/storage-bridge.js +6 -0
  265. package/dist/src/server/storage-bridge.js.map +1 -0
  266. package/dist/src/state-file.d.ts +10 -0
  267. package/dist/src/state-file.d.ts.map +1 -0
  268. package/dist/src/state-file.js +38 -0
  269. package/dist/src/state-file.js.map +1 -0
  270. package/dist/src/testing/in-memory.d.ts +116 -0
  271. package/dist/src/testing/in-memory.d.ts.map +1 -0
  272. package/dist/src/testing/in-memory.js +193 -0
  273. package/dist/src/testing/in-memory.js.map +1 -0
  274. package/dist/src/testing/index.d.ts +14 -0
  275. package/dist/src/testing/index.d.ts.map +1 -0
  276. package/dist/src/testing/index.js +14 -0
  277. package/dist/src/testing/index.js.map +1 -0
  278. package/dist/src/testing/lease-store-contract.d.ts +14 -0
  279. package/dist/src/testing/lease-store-contract.d.ts.map +1 -0
  280. package/dist/src/testing/lease-store-contract.js +78 -0
  281. package/dist/src/testing/lease-store-contract.js.map +1 -0
  282. package/dist/src/testing/protocol-suite.d.ts +38 -0
  283. package/dist/src/testing/protocol-suite.d.ts.map +1 -0
  284. package/dist/src/testing/protocol-suite.js +207 -0
  285. package/dist/src/testing/protocol-suite.js.map +1 -0
  286. package/dist/src/testing/rack-registry-contract.d.ts +15 -0
  287. package/dist/src/testing/rack-registry-contract.d.ts.map +1 -0
  288. package/dist/src/testing/rack-registry-contract.js +106 -0
  289. package/dist/src/testing/rack-registry-contract.js.map +1 -0
  290. package/dist/src/testing/test-rack-agent.d.ts +121 -0
  291. package/dist/src/testing/test-rack-agent.d.ts.map +1 -0
  292. package/dist/src/testing/test-rack-agent.js +316 -0
  293. package/dist/src/testing/test-rack-agent.js.map +1 -0
  294. package/dist/src/tls/tls.d.ts +67 -0
  295. package/dist/src/tls/tls.d.ts.map +1 -0
  296. package/dist/src/tls/tls.js +200 -0
  297. package/dist/src/tls/tls.js.map +1 -0
  298. package/dist/src/tls/tls.spec.d.ts +6 -0
  299. package/dist/src/tls/tls.spec.d.ts.map +1 -0
  300. package/dist/src/tls/tls.spec.js +101 -0
  301. package/dist/src/tls/tls.spec.js.map +1 -0
  302. package/dist/src/version.d.ts +9 -0
  303. package/dist/src/version.d.ts.map +1 -0
  304. package/dist/src/version.js +10 -0
  305. package/dist/src/version.js.map +1 -0
  306. package/package.json +67 -7
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ import { type Budget, type LocalTaskRunnerOptions, type StorageBackend, type TaskRunner } from '@elaraai/e3-core';
6
+ import { type RackPolicy } from '../routing/policy.js';
7
+ import { type RackPlacementEvent } from './rack-body.js';
8
+ /** Configures rack delegation for one run or one watch session. */
9
+ export interface OpenRackRunnerOptions {
10
+ /** Local repository path. */
11
+ repoPath: string;
12
+ /** Workspace being run. */
13
+ workspace: string;
14
+ /** The run's repository backend. */
15
+ storage: StorageBackend;
16
+ /** Human-readable session label for rack status. */
17
+ label: string;
18
+ /** Policy snapshot, otherwise loaded from the repository. */
19
+ policy?: RackPolicy;
20
+ /** Keeps eligible work queued when capacity is busy. */
21
+ rackOnly?: boolean;
22
+ /** Milliseconds to await a healthy compatible rack; defaults to ten seconds. */
23
+ waitForRackMs?: number;
24
+ /** Receives task/unit placement notifications. */
25
+ onPlacement?: (event: RackPlacementEvent) => void;
26
+ /** The process's existing budget, preserved for every local body. */
27
+ budget?: Budget;
28
+ /** Settings preserved for every local process and detached call. */
29
+ settings?: Omit<LocalTaskRunnerOptions, 'body'>;
30
+ /** Overrides the user-wide private state home for an isolated deployment. */
31
+ home?: string;
32
+ /** Ends the wait for the hub and for capacity when the run is aborted. */
33
+ signal?: AbortSignal;
34
+ /** Receives hub startup messages. */
35
+ log?: (line: string) => void;
36
+ }
37
+ /** Owns the runner's session and reports capacity for the local orchestrator. */
38
+ export interface RackRunnerHandle {
39
+ /** Core's LocalTaskRunner, with the delegation body when connected. */
40
+ readonly runner: TaskRunner;
41
+ /** Total compatible rack capacity in the latest snapshot. */
42
+ readonly rackSlots: number;
43
+ /** Describes usable racks or why work will run locally. */
44
+ describe(): string;
45
+ /** Refreshes capacity before a watch run without replacing its session. */
46
+ refreshSlots(): Promise<number>;
47
+ /** Unsubscribes from shared work and closes the private data socket. */
48
+ close(): Promise<void>;
49
+ }
50
+ /**
51
+ * Opens a run's rack attachment, falling back to the standard local runner
52
+ * for unavailable service or incompatible agents. Local settings and budget
53
+ * are preserved in either case; a rack problem never prevents a local run.
54
+ * @param options - Repository, policy and the host's runtime collaborators
55
+ * @returns The runner and a session handle the caller closes in finally
56
+ * @example
57
+ * const rack = await openRackRunner({ repoPath, workspace: 'dev', storage, label: 'run dev', budget });
58
+ * try { await rack.runner.execute(storage, taskHash, inputs, { taskName: 'train_model' }); }
59
+ * finally { await rack.close(); }
60
+ */
61
+ export declare function openRackRunner(options: OpenRackRunnerOptions): Promise<RackRunnerHandle>;
62
+ //# sourceMappingURL=rack-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rack-runner.d.ts","sourceRoot":"","sources":["../../../src/runner/rack-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAmB,KAAK,MAAM,EAAE,KAAK,sBAAsB,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnI,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzE,mEAAmE;AACnE,MAAM,WAAW,qBAAqB;IACpC,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,OAAO,EAAE,cAAc,CAAC;IACxB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAClD,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAChD,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qCAAqC;IACrC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,IAAI,MAAM,CAAC;IACnB,2EAA2E;IAC3E,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,wEAAwE;IACxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4C9F"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ import { setTimeout as delay } from 'node:timers/promises';
6
+ import { LocalTaskRunner } from '@elaraai/e3-core';
7
+ import { connectHub } from '../client/connect.js';
8
+ import { RackSession } from '../client/session.js';
9
+ import { loadPolicy, policyTargetsRack } from '../routing/policy.js';
10
+ import { compatibleRacks } from './capacity.js';
11
+ import { createRackBody } from './rack-body.js';
12
+ /**
13
+ * Opens a run's rack attachment, falling back to the standard local runner
14
+ * for unavailable service or incompatible agents. Local settings and budget
15
+ * are preserved in either case; a rack problem never prevents a local run.
16
+ * @param options - Repository, policy and the host's runtime collaborators
17
+ * @returns The runner and a session handle the caller closes in finally
18
+ * @example
19
+ * const rack = await openRackRunner({ repoPath, workspace: 'dev', storage, label: 'run dev', budget });
20
+ * try { await rack.runner.execute(storage, taskHash, inputs, { taskName: 'train_model' }); }
21
+ * finally { await rack.close(); }
22
+ */
23
+ export async function openRackRunner(options) {
24
+ const local = new LocalTaskRunner(options.repoPath, options.budget, options.settings);
25
+ let session;
26
+ let slots = 0;
27
+ let description = 'No healthy compatible rack; running locally';
28
+ try {
29
+ const policy = options.policy ?? await loadPolicy(options.repoPath);
30
+ // A policy that selects no task for a rack needs no session: nothing it
31
+ // routes would wait for one.
32
+ if (!policyTargetsRack(policy)) {
33
+ return { runner: local, rackSlots: 0, describe: () => 'Rack policy selects no task for a rack; running locally', refreshSlots: () => Promise.resolve(0), close: () => Promise.resolve() };
34
+ }
35
+ const client = await connectHub({ home: options.home, log: options.log, signal: options.signal });
36
+ session = await RackSession.open(client, options);
37
+ const attached = session;
38
+ let enrolled = 0;
39
+ const refreshSlots = async () => {
40
+ try {
41
+ const capacity = await attached.refreshCapacity();
42
+ const racks = compatibleRacks(capacity);
43
+ enrolled = capacity.racks.length;
44
+ slots = racks.reduce((sum, rack) => sum + Number(rack.capacity), 0);
45
+ description = racks.length > 0 ? racks.map((rack) => `${rack.label} (${Number(rack.capacity)} slots, e3 ${rack.bundledE3.type === 'some' ? rack.bundledE3.value : 'unknown'})`).join(', ')
46
+ : capacity.racks.length === 0 ? 'No connected rack; running locally'
47
+ : `No healthy compatible rack; running locally (${capacity.racks.map((rack) => `${rack.label}: ${rack.pendingApproval ? 'boot needs approval' : !rack.healthy ? 'unhealthy' : rack.bundledE3.type === 'none' ? 'bundled e3 version missing' : `e3 ${rack.bundledE3.value} is incompatible`}`).join(', ')})`;
48
+ }
49
+ catch (error) {
50
+ slots = 0;
51
+ enrolled = 0;
52
+ description = `Rack unavailable: ${error instanceof Error ? error.message : String(error)}; running locally`;
53
+ }
54
+ return slots;
55
+ };
56
+ // Waits for an enrolled rack to report healthy, up to the deadline. With
57
+ // none enrolled there is nothing to wait for: one appears by enrollment.
58
+ const deadline = Date.now() + Math.max(0, options.waitForRackMs ?? 10000);
59
+ do {
60
+ await refreshSlots();
61
+ if (slots > 0 || enrolled === 0 || attached.hubLost || options.signal?.aborted === true || Date.now() >= deadline)
62
+ break;
63
+ await delay(Math.min(250, deadline - Date.now()), undefined, { signal: options.signal }).catch(() => { });
64
+ } while (Date.now() <= deadline);
65
+ const runner = new LocalTaskRunner(options.repoPath, options.budget, { ...options.settings,
66
+ body: createRackBody({ session: attached, policy, workspace: options.workspace, rackOnly: options.rackOnly, onPlacement: options.onPlacement }) });
67
+ return { runner, get rackSlots() { return slots; }, describe: () => description, refreshSlots, close: () => attached.close() };
68
+ }
69
+ catch (error) {
70
+ await session?.close().catch(() => { });
71
+ description = `${error instanceof Error ? error.message : String(error)}; running locally`;
72
+ return { runner: local, rackSlots: 0, describe: () => description, refreshSlots: () => Promise.resolve(0), close: () => Promise.resolve() };
73
+ }
74
+ }
75
+ //# sourceMappingURL=rack-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rack-runner.js","sourceRoot":"","sources":["../../../src/runner/rack-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=rack-runner.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rack-runner.spec.d.ts","sourceRoot":"","sources":["../../../src/runner/rack-runner.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ import { afterEach, it } from 'node:test';
6
+ import assert from 'node:assert/strict';
7
+ import { mkdtemp, rm } from 'node:fs/promises';
8
+ import { tmpdir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { setTimeout as delay } from 'node:timers/promises';
11
+ import { East, IntegerType, StringType, some, variant } from '@elaraai/east';
12
+ import e3 from '@elaraai/e3';
13
+ import { Budget, InMemoryStateStore, LocalOrchestrator, LocalStorage, LocalTaskRunner, datasetWrite, inputsHash, packageImport, packageRead, repoInit, workspaceCreate, workspaceDeploy } from '@elaraai/e3-core';
14
+ import { RackHub } from '../hub/hub.js';
15
+ import { defaultHubConfig, saveHubConfig } from '../hub/config.js';
16
+ import { HubClient } from '../client/hub-client.js';
17
+ import { TestRackAgent } from '../testing/test-rack-agent.js';
18
+ import { pinnedFetch } from '../tls/tls.js';
19
+ import { DEFAULT_RACK_POLICY, setMode, setRule } from '../routing/policy.js';
20
+ import { openRackRunner } from './rack-runner.js';
21
+ const cleanup = [];
22
+ afterEach(async () => { for (const close of cleanup.splice(0).reverse())
23
+ await close(); });
24
+ async function fixture(options = {}) {
25
+ const home = await mkdtemp(join(tmpdir(), 'e3r-'));
26
+ cleanup.push(() => rm(home, { recursive: true, force: true }));
27
+ await saveHubConfig({ ...defaultHubConfig(), listen: some({ host: '127.0.0.1', port: 0n }) }, home);
28
+ const hub = new RackHub({ foreground: true, home, ...options });
29
+ assert(await hub.start());
30
+ cleanup.push(() => hub.stop());
31
+ const client = new HubClient(home);
32
+ const repo = join(home, 'repo');
33
+ assert(repoInit(repo).success);
34
+ const storage = new LocalStorage();
35
+ const input = e3.input('text', StringType, variant('value', 'four'));
36
+ const task = e3.task('length', [input], East.function([StringType], IntegerType, (_$, text) => text.length()));
37
+ const zip = join(home, 'package.zip');
38
+ await e3.export(e3.package('rack', '1.0.0', task), zip);
39
+ await packageImport(storage, repo, zip);
40
+ await workspaceCreate(storage, repo, 'dev');
41
+ await workspaceDeploy(storage, repo, 'dev', 'rack', '1.0.0');
42
+ const hash = (await packageRead(storage, repo, 'rack', '1.0.0')).tasks.get('length');
43
+ const inputs = [await datasetWrite(storage, repo, 'four', StringType)];
44
+ const budget = new Budget({ cores: 1, memory: 512 * 1024 ** 2 }, { sampler: null });
45
+ const placements = [];
46
+ const policy = setMode({ ...DEFAULT_RACK_POLICY, enabled: true }, 'auto');
47
+ const open = async (options = {}) => {
48
+ const rack = await openRackRunner({ repoPath: repo, workspace: 'dev', storage, label: 'runner test', budget,
49
+ policy, home, waitForRackMs: 0, onPlacement: (event) => { placements.push(event); }, ...options });
50
+ cleanup.push(() => rack.close());
51
+ return rack;
52
+ };
53
+ const agent = async () => {
54
+ const mint = await client.enroll();
55
+ const peer = await TestRackAgent.enroll(mint.apiUrl, mint.enrollmentToken, { certificateSha256: mint.certificateSha256.type === 'some' ? mint.certificateSha256.value : undefined });
56
+ cleanup.push(() => peer.close());
57
+ return peer;
58
+ };
59
+ return { home, hub, client, repo, storage, hash, inputs, budget, placements, policy, open, agent };
60
+ }
61
+ async function until(check) {
62
+ for (let i = 0; i < 200; i++) {
63
+ if (await check())
64
+ return;
65
+ await delay(10);
66
+ }
67
+ assert.fail('Timed out waiting for rack state');
68
+ }
69
+ it('runs a real dataflow on the rack with no local grant, caches it, and matches a local run', async () => {
70
+ const f = await fixture();
71
+ const agent = await f.agent();
72
+ const rack = await f.open();
73
+ assert.equal(rack.rackSlots, 1);
74
+ assert.match(rack.describe(), /test rack.*1 slots/);
75
+ const orchestrator = new LocalOrchestrator(new InMemoryStateStore());
76
+ const run = await orchestrator.start(f.storage, f.repo, 'dev', { runner: rack.runner, width: f.budget.cores + rack.rackSlots });
77
+ const grant = await agent.claim();
78
+ assert(grant);
79
+ assert.equal(f.budget.inFlight, 0);
80
+ const remote = await agent.execute(grant);
81
+ assert.equal(remote.status, 'success', remote.error);
82
+ await orchestrator.wait(run);
83
+ assert.equal((await orchestrator.getStatus(run)).state, 'completed');
84
+ assert.equal(f.budget.peak, 0);
85
+ const record = await f.storage.refs.executionGetLatest(f.repo, f.hash, inputsHash(f.inputs));
86
+ assert(record?.type === 'success');
87
+ assert.match((await f.storage.logs.read(f.repo, f.hash, inputsHash(f.inputs), record.value.executionId, 'stdout')).data, /e3: running on rack test rack/);
88
+ const cached = await rack.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' });
89
+ assert.equal(cached.cached, true);
90
+ assert.equal(cached.executionId, record.value.executionId);
91
+ assert.equal(f.placements.filter((event) => event.where === 'rack').length, 1);
92
+ const local = await new LocalTaskRunner(f.repo, f.budget).execute(f.storage, f.hash, f.inputs, { force: true });
93
+ assert.equal(local.state, 'success', local.error);
94
+ assert.equal(local.outputHash, remote.outputHash);
95
+ });
96
+ it('keeps unselected tasks local and refreshes a previously empty fleet', async () => {
97
+ const f = await fixture();
98
+ const started = Date.now();
99
+ const rack = await f.open({ waitForRackMs: 25 });
100
+ assert(Date.now() - started < 1000);
101
+ assert.equal(rack.rackSlots, 0);
102
+ assert.equal((await rack.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' })).state, 'success');
103
+ assert(f.placements.some((event) => event.where === 'local' && event.reason === 'no-rack-for-tier:node'));
104
+ await f.agent();
105
+ assert.equal(await rack.refreshSlots(), 1);
106
+ const unselected = await f.open({ policy: setRule(DEFAULT_RACK_POLICY, 'other_*', 'rack') });
107
+ assert.equal((await unselected.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length', force: true })).state, 'success');
108
+ assert(f.placements.some((event) => event.where === 'local' && event.reason === 'not-selected'));
109
+ });
110
+ it('starts at once with no rack enrolled, and opens no session under a policy that selects no task for a rack', async () => {
111
+ const f = await fixture();
112
+ const started = Date.now();
113
+ const unenrolled = await f.open({ waitForRackMs: 5000 });
114
+ assert(Date.now() - started < 1000, 'nothing to wait for without an enrolled rack');
115
+ assert.equal(unenrolled.rackSlots, 0);
116
+ assert.match(unenrolled.describe(), /No connected rack/);
117
+ const unselected = await f.open({ policy: DEFAULT_RACK_POLICY, waitForRackMs: 5000 });
118
+ assert(Date.now() - started < 1000);
119
+ assert.match(unselected.describe(), /selects no task for a rack/);
120
+ assert.equal((await f.client.status()).sessions.length, 1, 'the unselected policy opened no session');
121
+ assert.equal((await unselected.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' })).state, 'success');
122
+ assert.equal(f.budget.peak, 1);
123
+ });
124
+ for (const failure of [
125
+ { state: 'error', exitCode: -1, error: 'VM boot failed', retry: false, expected: 'success' },
126
+ { state: 'failed', exitCode: 7, error: 'task refused input', retry: false, expected: 'failed' },
127
+ { state: 'failed', exitCode: -1, error: 'runner killed by signal', retry: false, expected: 'failed' },
128
+ { state: 'failed', exitCode: 7, error: 'task refused input', retry: true, expected: 'success' },
129
+ { state: 'error', exitCode: -1, error: 'timed out: e3 stopped the runner', retry: true, expected: 'error' },
130
+ // An infrastructure error that mentions a timeout is the rack's, not the task's time used up
131
+ { state: 'error', exitCode: -1, error: 'connect ETIMEDOUT 10.0.0.2:7331', retry: false, expected: 'success' },
132
+ // A task's own failure is its verdict whatever its message mentions, unless the policy retries failures locally
133
+ { state: 'failed', exitCode: 1, error: 'fetch timed out after 30 s', retry: false, expected: 'failed' },
134
+ { state: 'failed', exitCode: 1, error: 'fetch timed out after 30 s', retry: true, expected: 'success' },
135
+ ])
136
+ it(`classifies ${failure.error} (retry=${failure.retry}) as ${failure.expected}`, async () => {
137
+ const f = await fixture();
138
+ const agent = await f.agent();
139
+ const policy = { ...f.policy, retryTaskFailuresLocally: failure.retry };
140
+ const rack = await f.open({ policy });
141
+ const running = rack.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' });
142
+ const grant = await agent.claim();
143
+ assert(grant);
144
+ await agent.complete(grant, { taskName: 'length', status: 'failed', state: failure.state, exitCode: failure.exitCode, error: failure.error });
145
+ const result = await running;
146
+ assert.equal(result.state, failure.expected, result.error);
147
+ if (result.state === 'success') {
148
+ assert.equal(f.budget.peak, 1);
149
+ assert.match((await f.storage.logs.read(f.repo, f.hash, inputsHash(f.inputs), result.executionId, 'stderr')).data, /rack attempt failed.*running locally/);
150
+ // The retry must sort AFTER the remote attempt or the execution cache
151
+ // would keep serving its failure as the latest execution forever.
152
+ assert.equal((await rack.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' })).cached, true);
153
+ assert.equal((await f.storage.refs.executionListIds(f.repo, f.hash, inputsHash(f.inputs))).length, 2);
154
+ }
155
+ else {
156
+ assert.equal(f.budget.peak, 0);
157
+ if (result.state === 'failed')
158
+ assert.equal(result.exitCode, failure.exitCode);
159
+ }
160
+ });
161
+ it('shares one claimed execution across sessions even when the rack has no free slot', async () => {
162
+ const f = await fixture();
163
+ const agent = await f.agent();
164
+ const first = await f.open();
165
+ const firstRun = first.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' });
166
+ const grant = await agent.claim();
167
+ assert(grant);
168
+ const second = await f.open();
169
+ const secondRun = second.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' });
170
+ await until(async () => f.placements.filter((event) => event.where === 'rack').length === 2);
171
+ assert.equal((await f.client.status()).capacity.racks[0].busy, 1n);
172
+ await agent.execute(grant);
173
+ const [a, b] = await Promise.all([firstRun, secondRun]);
174
+ assert.equal(a.state, 'success', a.error);
175
+ assert.equal(b.state, 'success', b.error);
176
+ assert.equal(a.executionId, b.executionId);
177
+ assert.equal(f.budget.peak, 0);
178
+ });
179
+ it('spills distinct work locally when full, while rackOnly waits for the same rack', async () => {
180
+ const f = await fixture();
181
+ const agent = await f.agent();
182
+ const first = await f.open();
183
+ const firstRun = first.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' });
184
+ const grant = await agent.claim();
185
+ assert(grant);
186
+ const extra = [await datasetWrite(f.storage, f.repo, 'another', StringType)];
187
+ const spilling = await f.open();
188
+ assert.equal((await spilling.runner.execute(f.storage, f.hash, extra, { taskName: 'length' })).state, 'success');
189
+ assert(f.placements.some((event) => event.where === 'local' && event.reason === 'spill'));
190
+ assert.equal((await f.client.status()).capacity.queued, 0n, 'a spill queues no lease a rack could claim first');
191
+ const waiting = await f.open({ rackOnly: true });
192
+ let finished = false;
193
+ const pending = waiting.runner.execute(f.storage, f.hash, extra, { taskName: 'length', force: true }).then((value) => { finished = true; return value; });
194
+ await until(async () => (await f.client.status()).capacity.queued === 1n);
195
+ assert.equal(finished, false);
196
+ await agent.execute(grant);
197
+ assert.equal((await firstRun).state, 'success');
198
+ assert.equal((await agent.runOne())?.status, 'success');
199
+ assert.equal((await pending).state, 'success');
200
+ });
201
+ it('runs locally when the rack stops an attempt the run did not abort, instead of launching it again', async () => {
202
+ const f = await fixture();
203
+ const agent = await f.agent();
204
+ const rack = await f.open();
205
+ const orchestrator = new LocalOrchestrator(new InMemoryStateStore());
206
+ const run = await orchestrator.start(f.storage, f.repo, 'dev', { runner: rack.runner, width: f.budget.cores + rack.rackSlots });
207
+ const grant = await agent.claim();
208
+ assert(grant);
209
+ await agent.complete(grant, { taskName: 'length', status: 'failed', state: 'error', cancelled: true, error: 'the agent is draining' });
210
+ await orchestrator.wait(run);
211
+ assert.equal((await orchestrator.getStatus(run)).state, 'completed');
212
+ assert.equal(f.placements.filter((event) => event.where === 'rack').length, 1, 'offered to the rack once, not again after its stop');
213
+ assert(f.placements.some((event) => event.where === 'local' && event.reason.includes('draining')));
214
+ assert.equal(f.budget.peak, 1);
215
+ });
216
+ it('cancels a claimed dataflow and makes the next heartbeat stop its rack execution', async () => {
217
+ const f = await fixture();
218
+ const agent = await f.agent();
219
+ const rack = await f.open();
220
+ const abort = new AbortController();
221
+ const orchestrator = new LocalOrchestrator(new InMemoryStateStore());
222
+ const run = await orchestrator.start(f.storage, f.repo, 'dev', { runner: rack.runner, signal: abort.signal });
223
+ const grant = await agent.claim();
224
+ assert(grant);
225
+ abort.abort();
226
+ await assert.rejects(orchestrator.wait(run), /aborted/);
227
+ assert.equal((await orchestrator.getStatus(run)).state, 'cancelled');
228
+ assert.equal(f.budget.peak, 0);
229
+ assert.deepEqual((await agent.heartbeat([grant])).stop, [{ repo: grant.repo, leaseId: grant.leaseId }]);
230
+ });
231
+ it('falls back after a lost lease and keeps the interrupted attempt in history', async () => {
232
+ let time = Date.now();
233
+ const f = await fixture({ now: () => time, visibilityMs: 100 });
234
+ const agent = await f.agent();
235
+ const rack = await f.open();
236
+ const running = rack.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' });
237
+ assert(await agent.claim());
238
+ time += 201;
239
+ await f.hub.sweep();
240
+ const result = await running;
241
+ assert.equal(result.state, 'success', result.error);
242
+ const attempts = await f.storage.refs.executionListAttempts(f.repo, f.hash, inputsHash(f.inputs));
243
+ assert.deepEqual(attempts.map((attempt) => attempt.status?.type), ['interrupted', 'success']);
244
+ });
245
+ it('automatically polls with an injected transport and drains concurrent real executions', async () => {
246
+ const f = await fixture();
247
+ const enrollment = await f.client.enroll();
248
+ assert(enrollment.certificateSha256.type === 'some');
249
+ const pinned = pinnedFetch(enrollment.certificateSha256.value);
250
+ let requests = 0;
251
+ const agent = new TestRackAgent({ apiUrl: enrollment.apiUrl, workDir: join(f.home, 'peer'), capacity: 2,
252
+ timings: { heartbeatMs: 20, extendMs: 20 }, faults: { claimDelayMs: 5 },
253
+ fetch: (input, init) => { requests++; return pinned(input, init); } });
254
+ cleanup.push(() => agent.close());
255
+ await agent.enroll(enrollment.enrollmentToken);
256
+ const rack = await f.open();
257
+ assert.equal(rack.rackSlots, 2);
258
+ agent.start();
259
+ const other = [await datasetWrite(f.storage, f.repo, 'longer input', StringType)];
260
+ const outcomes = await Promise.all([f.inputs, other].map((inputs) => rack.runner.execute(f.storage, f.hash, inputs, { taskName: 'length' })));
261
+ assert(outcomes.every((outcome) => outcome.state === 'success'));
262
+ assert.notEqual(outcomes[0].outputHash, outcomes[1].outputHash);
263
+ assert.equal(f.budget.peak, 0);
264
+ assert(requests > 10);
265
+ await agent.stop();
266
+ });
267
+ for (const fault of ['infraFailNext', 'taskFailNext', 'hangNext', 'dropCompletionNext']) {
268
+ it(`injects ${fault} through the real test agent`, async () => {
269
+ let time = Date.now();
270
+ const f = await fixture({ now: () => time, visibilityMs: 100 });
271
+ const enrollment = await f.client.enroll();
272
+ const agent = await TestRackAgent.enroll(enrollment.apiUrl, enrollment.enrollmentToken, { faults: { [fault]: 1 },
273
+ certificateSha256: enrollment.certificateSha256.type === 'some' ? enrollment.certificateSha256.value : undefined });
274
+ cleanup.push(() => agent.close());
275
+ const rack = await f.open();
276
+ let finished = false;
277
+ const running = rack.runner.execute(f.storage, f.hash, f.inputs, { taskName: 'length' }).then((result) => { finished = true; return result; });
278
+ const lease = await agent.claim();
279
+ assert(lease);
280
+ const execution = agent.execute(lease);
281
+ if (fault === 'hangNext' || fault === 'dropCompletionNext') {
282
+ if (fault === 'dropCompletionNext')
283
+ assert.equal((await execution).state, 'success');
284
+ else
285
+ await delay(30);
286
+ assert.equal(finished, false);
287
+ time += 201;
288
+ await f.hub.sweep();
289
+ }
290
+ else {
291
+ const result = await execution;
292
+ assert.equal(result.exitCode, fault === 'taskFailNext' ? 1 : undefined);
293
+ }
294
+ const outcome = await running;
295
+ assert.equal(outcome.state, fault === 'taskFailNext' ? 'failed' : 'success', outcome.error);
296
+ assert.equal(f.budget.peak, fault === 'taskFailNext' ? 0 : 1);
297
+ await agent.stop();
298
+ await execution;
299
+ assert.equal(agent.faults[fault], 0);
300
+ });
301
+ }
302
+ //# sourceMappingURL=rack-runner.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rack-runner.spec.js","sourceRoot":"","sources":["../../../src/runner/rack-runner.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAC7G,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,OAAO,EAAuB,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAmB,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAA8B,MAAM,kBAAkB,CAAC;AAG9E,MAAM,OAAO,GAA+B,EAAE,CAAC;AAC/C,SAAS,CAAC,KAAK,IAAI,EAAE,GAAG,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;IAAE,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3F,KAAK,UAAU,OAAO,CAAC,UAA0B,EAAE;IACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,aAAa,CAAC,EAAE,GAAG,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACpG,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/G,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IACtF,MAAM,MAAM,GAAG,CAAC,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,KAAK,EAAE,UAA0C,EAAE,EAAE,EAAE;QAClE,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM;YACzG,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACrG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACrL,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAChD,CAAC,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACrG,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,KAA6B;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,IAAI,MAAM,KAAK,EAAE;YAAE,OAAO;QAAC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAC7E,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAClD,CAAC;AAED,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;IACxG,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACtF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,oBAAoB,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAChI,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAChG,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;IAC1J,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9F,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9F,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;AACvG,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;IACnF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAAC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAChH,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,uBAAuB,CAAC,CAAC,CAAC;IAC1G,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,mBAAmB,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7F,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACnI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC;AACnG,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,2GAA2G,EAAE,KAAK,IAAI,EAAE;IACzH,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,EAAE,8CAA8C,CAAC,CAAC;IACpF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAChG,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,4BAA4B,CAAC,CAAC;IACvG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,yCAAyC,CAAC,CAAC;IACtG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACtH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,KAAK,MAAM,OAAO,IAAI;IACpB,EAAE,KAAK,EAAE,OAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;IACrG,EAAE,KAAK,EAAE,QAAiB,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACxG,EAAE,KAAK,EAAE,QAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC9G,EAAE,KAAK,EAAE,QAAiB,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE;IACxG,EAAE,KAAK,EAAE,OAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IACpH,6FAA6F;IAC7F,EAAE,KAAK,EAAE,OAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;IACtH,gHAAgH;IAChH,EAAE,KAAK,EAAE,QAAiB,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAChH,EAAE,KAAK,EAAE,QAAiB,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE;CACjH;IAAE,EAAE,CAAC,cAAc,OAAO,CAAC,KAAK,WAAW,OAAO,CAAC,KAAK,QAAQ,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;QAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QACzD,MAAM,MAAM,GAAe,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,wBAAwB,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QACpF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9I,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,sCAAsC,CAAC,CAAC;YAC3J,sEAAsE;YACtE,kEAAkE;YAClE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC5G,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;aAAM,CAAC;YAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAAC,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ;gBAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;IAC5H,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;IAChG,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5H,MAAM,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpE,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;IAC9F,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACvF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACjH,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,kDAAkD,CAAC,CAAC;IAChH,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1J,MAAM,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9B,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;IAChH,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACtF,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAChI,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;IACvI,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,oDAAoD,CAAC,CAAC;IACrI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACnG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;IAC/F,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACtF,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9G,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,KAAK,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC1G,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;IAC1F,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAAC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5H,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC;IAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAClG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AAChG,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;IACpG,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAAC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACtE,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;QACrG,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;QACvE,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAAC,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7D,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,MAAM,KAAK,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9I,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;IACjE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,KAAK,MAAM,KAAK,IAAI,CAAC,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,oBAAoB,CAAU,EAAE,CAAC;IACjG,EAAE,CAAC,WAAW,KAAK,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5D,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YAC9G,iBAAiB,EAAE,UAAU,CAAC,iBAAiB,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACtH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/I,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,oBAAoB,EAAE,CAAC;YAC3D,IAAI,KAAK,KAAK,oBAAoB;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;;gBAChF,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC9B,IAAI,IAAI,GAAG,CAAC;YAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5F,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAAC,MAAM,SAAS,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=split.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.spec.d.ts","sourceRoot":"","sources":["../../../src/runner/split.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}