@elaraai/e3-rack 0.0.0-stage → 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 (307) hide show
  1. package/LICENSE.md +54 -0
  2. package/README.md +409 -2
  3. package/dist/src/client/client.spec.d.ts +6 -0
  4. package/dist/src/client/client.spec.d.ts.map +1 -0
  5. package/dist/src/client/client.spec.js +150 -0
  6. package/dist/src/client/client.spec.js.map +1 -0
  7. package/dist/src/client/connect.d.ts +52 -0
  8. package/dist/src/client/connect.d.ts.map +1 -0
  9. package/dist/src/client/connect.js +112 -0
  10. package/dist/src/client/connect.js.map +1 -0
  11. package/dist/src/client/hub-client.d.ts +57 -0
  12. package/dist/src/client/hub-client.d.ts.map +1 -0
  13. package/dist/src/client/hub-client.js +87 -0
  14. package/dist/src/client/hub-client.js.map +1 -0
  15. package/dist/src/client/local-http.d.ts +78 -0
  16. package/dist/src/client/local-http.d.ts.map +1 -0
  17. package/dist/src/client/local-http.js +149 -0
  18. package/dist/src/client/local-http.js.map +1 -0
  19. package/dist/src/client/session-attempts.d.ts +20 -0
  20. package/dist/src/client/session-attempts.d.ts.map +1 -0
  21. package/dist/src/client/session-attempts.js +88 -0
  22. package/dist/src/client/session-attempts.js.map +1 -0
  23. package/dist/src/client/session-data-server.d.ts +37 -0
  24. package/dist/src/client/session-data-server.d.ts.map +1 -0
  25. package/dist/src/client/session-data-server.js +280 -0
  26. package/dist/src/client/session-data-server.js.map +1 -0
  27. package/dist/src/client/session-data-server.spec.d.ts +6 -0
  28. package/dist/src/client/session-data-server.spec.d.ts.map +1 -0
  29. package/dist/src/client/session-data-server.spec.js +192 -0
  30. package/dist/src/client/session-data-server.spec.js.map +1 -0
  31. package/dist/src/client/session.d.ts +119 -0
  32. package/dist/src/client/session.d.ts.map +1 -0
  33. package/dist/src/client/session.js +290 -0
  34. package/dist/src/client/session.js.map +1 -0
  35. package/dist/src/hub/config.d.ts +74 -0
  36. package/dist/src/hub/config.d.ts.map +1 -0
  37. package/dist/src/hub/config.js +159 -0
  38. package/dist/src/hub/config.js.map +1 -0
  39. package/dist/src/hub/fair-lease-store.d.ts +36 -0
  40. package/dist/src/hub/fair-lease-store.d.ts.map +1 -0
  41. package/dist/src/hub/fair-lease-store.js +73 -0
  42. package/dist/src/hub/fair-lease-store.js.map +1 -0
  43. package/dist/src/hub/hub.d.ts +91 -0
  44. package/dist/src/hub/hub.d.ts.map +1 -0
  45. package/dist/src/hub/hub.js +641 -0
  46. package/dist/src/hub/hub.js.map +1 -0
  47. package/dist/src/hub/hub.spec.d.ts +6 -0
  48. package/dist/src/hub/hub.spec.d.ts.map +1 -0
  49. package/dist/src/hub/hub.spec.js +363 -0
  50. package/dist/src/hub/hub.spec.js.map +1 -0
  51. package/dist/src/hub/infrastructure.spec.d.ts +6 -0
  52. package/dist/src/hub/infrastructure.spec.d.ts.map +1 -0
  53. package/dist/src/hub/infrastructure.spec.js +211 -0
  54. package/dist/src/hub/infrastructure.spec.js.map +1 -0
  55. package/dist/src/hub/lock.d.ts +62 -0
  56. package/dist/src/hub/lock.d.ts.map +1 -0
  57. package/dist/src/hub/lock.js +165 -0
  58. package/dist/src/hub/lock.js.map +1 -0
  59. package/dist/src/hub/main.d.ts +16 -0
  60. package/dist/src/hub/main.d.ts.map +1 -0
  61. package/dist/src/hub/main.js +56 -0
  62. package/dist/src/hub/main.js.map +1 -0
  63. package/dist/src/hub/session-bridge.d.ts +116 -0
  64. package/dist/src/hub/session-bridge.d.ts.map +1 -0
  65. package/dist/src/hub/session-bridge.js +336 -0
  66. package/dist/src/hub/session-bridge.js.map +1 -0
  67. package/dist/src/identity/file-identity-store.d.ts +18 -0
  68. package/dist/src/identity/file-identity-store.d.ts.map +1 -0
  69. package/dist/src/identity/file-identity-store.js +34 -0
  70. package/dist/src/identity/file-identity-store.js.map +1 -0
  71. package/dist/src/identity/file-identity-store.spec.d.ts +6 -0
  72. package/dist/src/identity/file-identity-store.spec.d.ts.map +1 -0
  73. package/dist/src/identity/file-identity-store.spec.js +59 -0
  74. package/dist/src/identity/file-identity-store.spec.js.map +1 -0
  75. package/dist/src/identity/in-memory-identity-store.d.ts +48 -0
  76. package/dist/src/identity/in-memory-identity-store.d.ts.map +1 -0
  77. package/dist/src/identity/in-memory-identity-store.js +102 -0
  78. package/dist/src/identity/in-memory-identity-store.js.map +1 -0
  79. package/dist/src/identity/machine-identity.d.ts +134 -0
  80. package/dist/src/identity/machine-identity.d.ts.map +1 -0
  81. package/dist/src/identity/machine-identity.js +65 -0
  82. package/dist/src/identity/machine-identity.js.map +1 -0
  83. package/dist/src/index.d.ts +34 -0
  84. package/dist/src/index.d.ts.map +1 -0
  85. package/dist/src/index.js +34 -0
  86. package/dist/src/index.js.map +1 -0
  87. package/dist/src/lease/closure.d.ts +96 -0
  88. package/dist/src/lease/closure.d.ts.map +1 -0
  89. package/dist/src/lease/closure.js +192 -0
  90. package/dist/src/lease/closure.js.map +1 -0
  91. package/dist/src/lease/closure.spec.d.ts +6 -0
  92. package/dist/src/lease/closure.spec.d.ts.map +1 -0
  93. package/dist/src/lease/closure.spec.js +35 -0
  94. package/dist/src/lease/closure.spec.js.map +1 -0
  95. package/dist/src/lease/coordinator.d.ts +34 -0
  96. package/dist/src/lease/coordinator.d.ts.map +1 -0
  97. package/dist/src/lease/coordinator.js +42 -0
  98. package/dist/src/lease/coordinator.js.map +1 -0
  99. package/dist/src/lease/in-memory-lease-store.d.ts +58 -0
  100. package/dist/src/lease/in-memory-lease-store.d.ts.map +1 -0
  101. package/dist/src/lease/in-memory-lease-store.js +132 -0
  102. package/dist/src/lease/in-memory-lease-store.js.map +1 -0
  103. package/dist/src/lease/lease-store.d.ts +169 -0
  104. package/dist/src/lease/lease-store.d.ts.map +1 -0
  105. package/dist/src/lease/lease-store.js +94 -0
  106. package/dist/src/lease/lease-store.js.map +1 -0
  107. package/dist/src/lease/lease-store.spec.d.ts +6 -0
  108. package/dist/src/lease/lease-store.spec.d.ts.map +1 -0
  109. package/dist/src/lease/lease-store.spec.js +8 -0
  110. package/dist/src/lease/lease-store.spec.js.map +1 -0
  111. package/dist/src/lease/rack-dispatch.d.ts +105 -0
  112. package/dist/src/lease/rack-dispatch.d.ts.map +1 -0
  113. package/dist/src/lease/rack-dispatch.js +6 -0
  114. package/dist/src/lease/rack-dispatch.js.map +1 -0
  115. package/dist/src/mutation-queue.d.ts +13 -0
  116. package/dist/src/mutation-queue.d.ts.map +1 -0
  117. package/dist/src/mutation-queue.js +17 -0
  118. package/dist/src/mutation-queue.js.map +1 -0
  119. package/dist/src/paths.d.ts +56 -0
  120. package/dist/src/paths.d.ts.map +1 -0
  121. package/dist/src/paths.js +82 -0
  122. package/dist/src/paths.js.map +1 -0
  123. package/dist/src/protocol/control.d.ts +295 -0
  124. package/dist/src/protocol/control.d.ts.map +1 -0
  125. package/dist/src/protocol/control.js +74 -0
  126. package/dist/src/protocol/control.js.map +1 -0
  127. package/dist/src/protocol/index.d.ts +9 -0
  128. package/dist/src/protocol/index.d.ts.map +1 -0
  129. package/dist/src/protocol/index.js +9 -0
  130. package/dist/src/protocol/index.js.map +1 -0
  131. package/dist/src/protocol/rack-wire.d.ts +357 -0
  132. package/dist/src/protocol/rack-wire.d.ts.map +1 -0
  133. package/dist/src/protocol/rack-wire.js +262 -0
  134. package/dist/src/protocol/rack-wire.js.map +1 -0
  135. package/dist/src/protocol/rack-wire.spec.d.ts +6 -0
  136. package/dist/src/protocol/rack-wire.spec.d.ts.map +1 -0
  137. package/dist/src/protocol/rack-wire.spec.js +14 -0
  138. package/dist/src/protocol/rack-wire.spec.js.map +1 -0
  139. package/dist/src/protocol/registration.d.ts +70 -0
  140. package/dist/src/protocol/registration.d.ts.map +1 -0
  141. package/dist/src/protocol/registration.js +67 -0
  142. package/dist/src/protocol/registration.js.map +1 -0
  143. package/dist/src/protocol/session-data.d.ts +69 -0
  144. package/dist/src/protocol/session-data.d.ts.map +1 -0
  145. package/dist/src/protocol/session-data.js +26 -0
  146. package/dist/src/protocol/session-data.js.map +1 -0
  147. package/dist/src/protocol/task-envelope.d.ts +198 -0
  148. package/dist/src/protocol/task-envelope.d.ts.map +1 -0
  149. package/dist/src/protocol/task-envelope.js +93 -0
  150. package/dist/src/protocol/task-envelope.js.map +1 -0
  151. package/dist/src/protocol/wire-golden.d.ts +8 -0
  152. package/dist/src/protocol/wire-golden.d.ts.map +1 -0
  153. package/dist/src/protocol/wire-golden.js +34 -0
  154. package/dist/src/protocol/wire-golden.js.map +1 -0
  155. package/dist/src/protocol/wire-samples.d.ts +11 -0
  156. package/dist/src/protocol/wire-samples.d.ts.map +1 -0
  157. package/dist/src/protocol/wire-samples.js +52 -0
  158. package/dist/src/protocol/wire-samples.js.map +1 -0
  159. package/dist/src/registry/file-rack-registry.d.ts +68 -0
  160. package/dist/src/registry/file-rack-registry.d.ts.map +1 -0
  161. package/dist/src/registry/file-rack-registry.js +138 -0
  162. package/dist/src/registry/file-rack-registry.js.map +1 -0
  163. package/dist/src/registry/file-rack-registry.spec.d.ts +6 -0
  164. package/dist/src/registry/file-rack-registry.spec.d.ts.map +1 -0
  165. package/dist/src/registry/file-rack-registry.spec.js +50 -0
  166. package/dist/src/registry/file-rack-registry.spec.js.map +1 -0
  167. package/dist/src/registry/rack-registry.d.ts +64 -0
  168. package/dist/src/registry/rack-registry.d.ts.map +1 -0
  169. package/dist/src/registry/rack-registry.js +65 -0
  170. package/dist/src/registry/rack-registry.js.map +1 -0
  171. package/dist/src/registry/rack-registry.spec.d.ts +6 -0
  172. package/dist/src/registry/rack-registry.spec.d.ts.map +1 -0
  173. package/dist/src/registry/rack-registry.spec.js +8 -0
  174. package/dist/src/registry/rack-registry.spec.js.map +1 -0
  175. package/dist/src/routing/eligibility.d.ts +38 -0
  176. package/dist/src/routing/eligibility.d.ts.map +1 -0
  177. package/dist/src/routing/eligibility.js +78 -0
  178. package/dist/src/routing/eligibility.js.map +1 -0
  179. package/dist/src/routing/host-coupling.d.ts +26 -0
  180. package/dist/src/routing/host-coupling.d.ts.map +1 -0
  181. package/dist/src/routing/host-coupling.js +62 -0
  182. package/dist/src/routing/host-coupling.js.map +1 -0
  183. package/dist/src/routing/policy.d.ts +188 -0
  184. package/dist/src/routing/policy.d.ts.map +1 -0
  185. package/dist/src/routing/policy.js +212 -0
  186. package/dist/src/routing/policy.js.map +1 -0
  187. package/dist/src/routing/routing.spec.d.ts +6 -0
  188. package/dist/src/routing/routing.spec.d.ts.map +1 -0
  189. package/dist/src/routing/routing.spec.js +100 -0
  190. package/dist/src/routing/routing.spec.js.map +1 -0
  191. package/dist/src/routing/tiers.d.ts +22 -0
  192. package/dist/src/routing/tiers.d.ts.map +1 -0
  193. package/dist/src/routing/tiers.js +26 -0
  194. package/dist/src/routing/tiers.js.map +1 -0
  195. package/dist/src/runner/api-server.d.ts +45 -0
  196. package/dist/src/runner/api-server.d.ts.map +1 -0
  197. package/dist/src/runner/api-server.js +21 -0
  198. package/dist/src/runner/api-server.js.map +1 -0
  199. package/dist/src/runner/capacity.d.ts +13 -0
  200. package/dist/src/runner/capacity.d.ts.map +1 -0
  201. package/dist/src/runner/capacity.js +18 -0
  202. package/dist/src/runner/capacity.js.map +1 -0
  203. package/dist/src/runner/rack-body.d.ts +43 -0
  204. package/dist/src/runner/rack-body.d.ts.map +1 -0
  205. package/dist/src/runner/rack-body.js +208 -0
  206. package/dist/src/runner/rack-body.js.map +1 -0
  207. package/dist/src/runner/rack-runner.d.ts +62 -0
  208. package/dist/src/runner/rack-runner.d.ts.map +1 -0
  209. package/dist/src/runner/rack-runner.js +75 -0
  210. package/dist/src/runner/rack-runner.js.map +1 -0
  211. package/dist/src/runner/rack-runner.spec.d.ts +6 -0
  212. package/dist/src/runner/rack-runner.spec.d.ts.map +1 -0
  213. package/dist/src/runner/rack-runner.spec.js +302 -0
  214. package/dist/src/runner/rack-runner.spec.js.map +1 -0
  215. package/dist/src/runner/split.spec.d.ts +6 -0
  216. package/dist/src/runner/split.spec.d.ts.map +1 -0
  217. package/dist/src/runner/split.spec.js +188 -0
  218. package/dist/src/runner/split.spec.js.map +1 -0
  219. package/dist/src/runner-event.d.ts +261 -0
  220. package/dist/src/runner-event.d.ts.map +1 -0
  221. package/dist/src/runner-event.js +332 -0
  222. package/dist/src/runner-event.js.map +1 -0
  223. package/dist/src/server/beast2.d.ts +19 -0
  224. package/dist/src/server/beast2.d.ts.map +1 -0
  225. package/dist/src/server/beast2.js +18 -0
  226. package/dist/src/server/beast2.js.map +1 -0
  227. package/dist/src/server/body-limit.d.ts +16 -0
  228. package/dist/src/server/body-limit.d.ts.map +1 -0
  229. package/dist/src/server/body-limit.js +53 -0
  230. package/dist/src/server/body-limit.js.map +1 -0
  231. package/dist/src/server/body-limit.spec.d.ts +2 -0
  232. package/dist/src/server/body-limit.spec.d.ts.map +1 -0
  233. package/dist/src/server/body-limit.spec.js +32 -0
  234. package/dist/src/server/body-limit.spec.js.map +1 -0
  235. package/dist/src/server/bounded.d.ts +16 -0
  236. package/dist/src/server/bounded.d.ts.map +1 -0
  237. package/dist/src/server/bounded.js +39 -0
  238. package/dist/src/server/bounded.js.map +1 -0
  239. package/dist/src/server/dispatch.d.ts +137 -0
  240. package/dist/src/server/dispatch.d.ts.map +1 -0
  241. package/dist/src/server/dispatch.js +267 -0
  242. package/dist/src/server/dispatch.js.map +1 -0
  243. package/dist/src/server/env-publication.d.ts +45 -0
  244. package/dist/src/server/env-publication.d.ts.map +1 -0
  245. package/dist/src/server/env-publication.js +10 -0
  246. package/dist/src/server/env-publication.js.map +1 -0
  247. package/dist/src/server/index.d.ts +16 -0
  248. package/dist/src/server/index.d.ts.map +1 -0
  249. package/dist/src/server/index.js +17 -0
  250. package/dist/src/server/index.js.map +1 -0
  251. package/dist/src/server/protocol.spec.d.ts +6 -0
  252. package/dist/src/server/protocol.spec.d.ts.map +1 -0
  253. package/dist/src/server/protocol.spec.js +78 -0
  254. package/dist/src/server/protocol.spec.js.map +1 -0
  255. package/dist/src/server/rack-routes.d.ts +175 -0
  256. package/dist/src/server/rack-routes.d.ts.map +1 -0
  257. package/dist/src/server/rack-routes.js +755 -0
  258. package/dist/src/server/rack-routes.js.map +1 -0
  259. package/dist/src/server/rack-routes.spec.d.ts +6 -0
  260. package/dist/src/server/rack-routes.spec.d.ts.map +1 -0
  261. package/dist/src/server/rack-routes.spec.js +477 -0
  262. package/dist/src/server/rack-routes.spec.js.map +1 -0
  263. package/dist/src/server/storage-bridge.d.ts +140 -0
  264. package/dist/src/server/storage-bridge.d.ts.map +1 -0
  265. package/dist/src/server/storage-bridge.js +6 -0
  266. package/dist/src/server/storage-bridge.js.map +1 -0
  267. package/dist/src/state-file.d.ts +10 -0
  268. package/dist/src/state-file.d.ts.map +1 -0
  269. package/dist/src/state-file.js +38 -0
  270. package/dist/src/state-file.js.map +1 -0
  271. package/dist/src/testing/in-memory.d.ts +116 -0
  272. package/dist/src/testing/in-memory.d.ts.map +1 -0
  273. package/dist/src/testing/in-memory.js +193 -0
  274. package/dist/src/testing/in-memory.js.map +1 -0
  275. package/dist/src/testing/index.d.ts +14 -0
  276. package/dist/src/testing/index.d.ts.map +1 -0
  277. package/dist/src/testing/index.js +14 -0
  278. package/dist/src/testing/index.js.map +1 -0
  279. package/dist/src/testing/lease-store-contract.d.ts +14 -0
  280. package/dist/src/testing/lease-store-contract.d.ts.map +1 -0
  281. package/dist/src/testing/lease-store-contract.js +78 -0
  282. package/dist/src/testing/lease-store-contract.js.map +1 -0
  283. package/dist/src/testing/protocol-suite.d.ts +38 -0
  284. package/dist/src/testing/protocol-suite.d.ts.map +1 -0
  285. package/dist/src/testing/protocol-suite.js +207 -0
  286. package/dist/src/testing/protocol-suite.js.map +1 -0
  287. package/dist/src/testing/rack-registry-contract.d.ts +15 -0
  288. package/dist/src/testing/rack-registry-contract.d.ts.map +1 -0
  289. package/dist/src/testing/rack-registry-contract.js +106 -0
  290. package/dist/src/testing/rack-registry-contract.js.map +1 -0
  291. package/dist/src/testing/test-rack-agent.d.ts +121 -0
  292. package/dist/src/testing/test-rack-agent.d.ts.map +1 -0
  293. package/dist/src/testing/test-rack-agent.js +316 -0
  294. package/dist/src/testing/test-rack-agent.js.map +1 -0
  295. package/dist/src/tls/tls.d.ts +67 -0
  296. package/dist/src/tls/tls.d.ts.map +1 -0
  297. package/dist/src/tls/tls.js +200 -0
  298. package/dist/src/tls/tls.js.map +1 -0
  299. package/dist/src/tls/tls.spec.d.ts +6 -0
  300. package/dist/src/tls/tls.spec.d.ts.map +1 -0
  301. package/dist/src/tls/tls.spec.js +101 -0
  302. package/dist/src/tls/tls.spec.js.map +1 -0
  303. package/dist/src/version.d.ts +9 -0
  304. package/dist/src/version.d.ts.map +1 -0
  305. package/dist/src/version.js +10 -0
  306. package/dist/src/version.js.map +1 -0
  307. package/package.json +72 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/client/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ import { StringType, StructType } from '@elaraai/east';
6
+ import { type HubCertificate } from '../tls/tls.js';
7
+ import { type HubConfig } from '../protocol/control.js';
8
+ export { HubConfigType, type HubConfig } from '../protocol/control.js';
9
+ /** Creates independent defaults with external access disabled; a listener, once configured, serves TLS. */
10
+ export declare function defaultHubConfig(): HubConfig;
11
+ /**
12
+ * Whether a listen host binds every address of this machine.
13
+ * @param host - The configured listen host
14
+ * @returns True for `0.0.0.0` and `::`
15
+ * @example
16
+ * wildcardHost('0.0.0.0'); // true
17
+ */
18
+ export declare function wildcardHost(host: string): boolean;
19
+ /**
20
+ * Explains why a configured rack listener must not be served, if it must not.
21
+ * Anything that reaches a plain-HTTP listener reads every rack token, data
22
+ * URL, input, output and log on it, so plain HTTP is served only on the
23
+ * loopback or a private address, to the addresses `allow` names: for a TLS
24
+ * terminator in front of the hub, or for a network path encrypted end to end.
25
+ * A TLS listener must advertise an https:// origin.
26
+ * @param config - The hub configuration
27
+ * @returns The reason, or undefined when the listener may be served
28
+ * @example
29
+ * listenerProblem({ ...defaultHubConfig(), listen: some({ host: '0.0.0.0', port: 7331n }), tls: false });
30
+ */
31
+ export declare function listenerProblem(config: HubConfig): string | undefined;
32
+ /**
33
+ * Validates a configuration before it changes a running hub: its form, and
34
+ * that its listener may be served ({@link listenerProblem}).
35
+ * @param config - The configuration to apply
36
+ * @throws {Error} When it is malformed or its listener must not be served
37
+ */
38
+ export declare function validateHubConfig(config: HubConfig): void;
39
+ /**
40
+ * Reads the hub configuration, using defaults only when it is absent. A saved
41
+ * listener that may no longer be served is loaded anyway: the hub reports it
42
+ * down with the reason, and `e3 rack config` can still change it.
43
+ * @param home - Private rack home
44
+ * @returns The configuration
45
+ * @throws {Error} When state is corrupt or requires a newer release
46
+ * @example
47
+ * const config = await loadHubConfig();
48
+ */
49
+ export declare function loadHubConfig(home?: string): Promise<HubConfig>;
50
+ /**
51
+ * Atomically persists a validated configuration in the private rack home.
52
+ * @param config - Configuration to persist
53
+ * @param home - Private rack home
54
+ * @example
55
+ * await saveHubConfig(config);
56
+ */
57
+ export declare function saveHubConfig(config: HubConfig, home?: string): Promise<void>;
58
+ /** The hub's TLS certificate and private key, as kept in its private home. */
59
+ export declare const HubCertificateType: StructType<{
60
+ readonly certificatePem: StringType;
61
+ readonly privateKeyPem: StringType;
62
+ }>;
63
+ /**
64
+ * Reads the hub's TLS certificate, creating it the first time. It is kept
65
+ * until removed on purpose: every rack pins it, so a new one must be pinned
66
+ * again on every rack.
67
+ * @param home - Private rack home
68
+ * @returns The certificate and its key
69
+ * @throws {Error} When state is corrupt or requires a newer release
70
+ * @example
71
+ * const { certificatePem } = await loadHubCertificate();
72
+ */
73
+ export declare function loadHubCertificate(home?: string): Promise<HubCertificate>;
74
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/hub/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,UAAU,EAAE,UAAU,EAA0C,MAAM,eAAe,CAAC;AAG/F,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEvE,2GAA2G;AAC3G,wBAAgB,gBAAgB,IAAI,SAAS,CAE5C;AAaD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD;AASD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAarE;AAoBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAIzD;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,IAAI,SAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAKzE;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,SAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvF;AAED,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB;;;EAAwE,CAAC;AAExG;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,SAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAQnF"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ import { BlockList, isIP } from 'node:net';
6
+ import { join } from 'node:path';
7
+ import { StringType, StructType, decodeBeast2For, encodeBeast2For, none } from '@elaraai/east';
8
+ import { ensureRackHome, HUB_CONFIG_FILE, HUB_TLS_FILE, rackHome } from '../paths.js';
9
+ import { readStateFile, writeStateFile } from '../state-file.js';
10
+ import { createHubCertificate } from '../tls/tls.js';
11
+ import { HubConfigType } from '../protocol/control.js';
12
+ export { HubConfigType } from '../protocol/control.js';
13
+ /** Creates independent defaults with external access disabled; a listener, once configured, serves TLS. */
14
+ export function defaultHubConfig() {
15
+ return { listen: none, allow: [], idleExitMinutes: 15n, advertiseUrl: none, tls: true };
16
+ }
17
+ // The addresses plain HTTP may be served on: this machine's loopback and the
18
+ // private ranges (RFC 1918, shared address space for carrier-grade NAT and
19
+ // VPN overlays, link-local, IPv6 unique-local and link-local).
20
+ const PRIVATE = new BlockList();
21
+ for (const [address, prefix] of [['127.0.0.0', 8], ['10.0.0.0', 8], ['172.16.0.0', 12], ['192.168.0.0', 16], ['100.64.0.0', 10], ['169.254.0.0', 16]])
22
+ PRIVATE.addSubnet(address, prefix, 'ipv4');
23
+ PRIVATE.addAddress('::1', 'ipv6');
24
+ PRIVATE.addSubnet('fc00::', 7, 'ipv6');
25
+ PRIVATE.addSubnet('fe80::', 10, 'ipv6');
26
+ const unmapped = (address) => address.replace(/^::ffff:(?=\d+\.\d+\.\d+\.\d+$)/i, '');
27
+ /**
28
+ * Whether a listen host binds every address of this machine.
29
+ * @param host - The configured listen host
30
+ * @returns True for `0.0.0.0` and `::`
31
+ * @example
32
+ * wildcardHost('0.0.0.0'); // true
33
+ */
34
+ export function wildcardHost(host) {
35
+ const address = unmapped(host);
36
+ return isIP(address) !== 0 && (address === '0.0.0.0' || /^[0:]+$/.test(address));
37
+ }
38
+ function privateHost(host) {
39
+ if (host === 'localhost')
40
+ return true;
41
+ const address = unmapped(host);
42
+ const family = isIP(address);
43
+ return family !== 0 && PRIVATE.check(address, family === 4 ? 'ipv4' : 'ipv6');
44
+ }
45
+ /**
46
+ * Explains why a configured rack listener must not be served, if it must not.
47
+ * Anything that reaches a plain-HTTP listener reads every rack token, data
48
+ * URL, input, output and log on it, so plain HTTP is served only on the
49
+ * loopback or a private address, to the addresses `allow` names: for a TLS
50
+ * terminator in front of the hub, or for a network path encrypted end to end.
51
+ * A TLS listener must advertise an https:// origin.
52
+ * @param config - The hub configuration
53
+ * @returns The reason, or undefined when the listener may be served
54
+ * @example
55
+ * listenerProblem({ ...defaultHubConfig(), listen: some({ host: '0.0.0.0', port: 7331n }), tls: false });
56
+ */
57
+ export function listenerProblem(config) {
58
+ if (config.listen.type === 'none')
59
+ return undefined;
60
+ const { host } = config.listen.value;
61
+ if (config.tls) {
62
+ if (config.advertiseUrl.type === 'some' && new URL(config.advertiseUrl.value).protocol !== 'https:') {
63
+ return 'A TLS rack listener must advertise an https:// origin';
64
+ }
65
+ return undefined;
66
+ }
67
+ if (wildcardHost(host))
68
+ return `Plain HTTP cannot be served on every address (${host}); bind the loopback or a private address, or serve TLS`;
69
+ if (!privateHost(host))
70
+ return `Plain HTTP is served only on the loopback or a private address, not ${host}; serve TLS instead`;
71
+ if (config.allow.length === 0)
72
+ return 'A plain-HTTP rack listener must name the addresses it admits (--allow)';
73
+ return undefined;
74
+ }
75
+ /** Checks the configuration's form: addresses, ports, timers and origin. */
76
+ function validateForm(config) {
77
+ if (config.listen.type === 'some') {
78
+ if (!config.listen.value.host.trim())
79
+ throw new Error('Rack listen host is empty');
80
+ const port = Number(config.listen.value.port);
81
+ if (!Number.isSafeInteger(port) || port < 0 || port > 65535)
82
+ throw new Error('Rack listen port must be 0–65535');
83
+ }
84
+ for (const address of config.allow)
85
+ if (isIP(unmapped(address)) === 0)
86
+ throw new Error(`Rack allowed address '${address}' is not an IP address`);
87
+ const minutes = Number(config.idleExitMinutes);
88
+ if (!Number.isSafeInteger(minutes) || minutes < 0 || minutes > 35_000)
89
+ throw new Error('Rack idle timeout must be 0–35000 minutes');
90
+ if (config.advertiseUrl.type === 'some') {
91
+ const url = new URL(config.advertiseUrl.value);
92
+ if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash || url.pathname !== '/') {
93
+ throw new Error('Rack advertise URL must be an HTTP(S) origin without credentials, path or query');
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Validates a configuration before it changes a running hub: its form, and
99
+ * that its listener may be served ({@link listenerProblem}).
100
+ * @param config - The configuration to apply
101
+ * @throws {Error} When it is malformed or its listener must not be served
102
+ */
103
+ export function validateHubConfig(config) {
104
+ validateForm(config);
105
+ const problem = listenerProblem(config);
106
+ if (problem !== undefined)
107
+ throw new Error(problem);
108
+ }
109
+ /**
110
+ * Reads the hub configuration, using defaults only when it is absent. A saved
111
+ * listener that may no longer be served is loaded anyway: the hub reports it
112
+ * down with the reason, and `e3 rack config` can still change it.
113
+ * @param home - Private rack home
114
+ * @returns The configuration
115
+ * @throws {Error} When state is corrupt or requires a newer release
116
+ * @example
117
+ * const config = await loadHubConfig();
118
+ */
119
+ export async function loadHubConfig(home = rackHome()) {
120
+ const bytes = await readStateFile(join(home, HUB_CONFIG_FILE));
121
+ const config = bytes === null ? defaultHubConfig() : decodeBeast2For(HubConfigType)(bytes);
122
+ validateForm(config);
123
+ return config;
124
+ }
125
+ /**
126
+ * Atomically persists a validated configuration in the private rack home.
127
+ * @param config - Configuration to persist
128
+ * @param home - Private rack home
129
+ * @example
130
+ * await saveHubConfig(config);
131
+ */
132
+ export async function saveHubConfig(config, home = rackHome()) {
133
+ validateHubConfig(config);
134
+ ensureRackHome(home);
135
+ await writeStateFile(join(home, HUB_CONFIG_FILE), encodeBeast2For(HubConfigType)(config));
136
+ }
137
+ /** The hub's TLS certificate and private key, as kept in its private home. */
138
+ export const HubCertificateType = StructType({ certificatePem: StringType, privateKeyPem: StringType });
139
+ /**
140
+ * Reads the hub's TLS certificate, creating it the first time. It is kept
141
+ * until removed on purpose: every rack pins it, so a new one must be pinned
142
+ * again on every rack.
143
+ * @param home - Private rack home
144
+ * @returns The certificate and its key
145
+ * @throws {Error} When state is corrupt or requires a newer release
146
+ * @example
147
+ * const { certificatePem } = await loadHubCertificate();
148
+ */
149
+ export async function loadHubCertificate(home = rackHome()) {
150
+ const file = join(home, HUB_TLS_FILE);
151
+ const bytes = await readStateFile(file);
152
+ if (bytes !== null)
153
+ return decodeBeast2For(HubCertificateType)(bytes);
154
+ const created = createHubCertificate();
155
+ ensureRackHome(home);
156
+ await writeStateFile(file, encodeBeast2For(HubCertificateType)(created));
157
+ return created;
158
+ }
159
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/hub/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ import type { RackLeaseAttempt, RackLeaseResult } from '../protocol/task-envelope.js';
6
+ import type { RackLeaseRecord, RackLeaseStore } from '../lease/lease-store.js';
7
+ import type { InMemoryRackLeaseStore } from '../lease/in-memory-lease-store.js';
8
+ /**
9
+ * Rotates claim priority across session owners while retaining FIFO per owner.
10
+ * Only successful claims advance the pointer; a losing poll does not consume
11
+ * another session's turn. All state transitions remain the backend's.
12
+ * @example
13
+ * const leases = new FairLeaseStore(store, (lease) => owners.get(lease.leaseId) ?? '');
14
+ */
15
+ export declare class FairLeaseStore implements RackLeaseStore {
16
+ private readonly store;
17
+ private readonly owner;
18
+ private lastOwner;
19
+ /**
20
+ * @param store - The hub's in-memory lease persistence, whose queue is read in place
21
+ * @param owner - Resolves the current session owner, including takeover
22
+ */
23
+ constructor(store: InMemoryRackLeaseStore, owner: (lease: RackLeaseRecord) => string);
24
+ put(record: RackLeaseRecord): Promise<void>;
25
+ get(repo: string, id: string): Promise<RackLeaseRecord | null>;
26
+ findByTask(repo: string, task: string, inputs: string): Promise<RackLeaseRecord | null>;
27
+ recordTargets(repo: string, id: string, rack: string, hashes: readonly string[]): Promise<boolean>;
28
+ listRecentByRack(rack: string, limit: number): Promise<RackLeaseRecord[]>;
29
+ extend(repo: string, id: string, rack: string, deadline: number): Promise<boolean>;
30
+ complete(repo: string, id: string, rack: string, result: RackLeaseResult): Promise<import("../lease/lease-store.js").CompleteDisposition>;
31
+ supersede(repo: string, id: string): Promise<RackLeaseRecord | null>;
32
+ cancel(repo: string, id: string): Promise<RackLeaseRecord | null>;
33
+ claim(repo: string, id: string, rack: string, deadline: number, attempt?: RackLeaseAttempt): Promise<RackLeaseRecord | null>;
34
+ listClaimable(tiers: string[], now: number, limit: number): Promise<RackLeaseRecord[]>;
35
+ }
36
+ //# sourceMappingURL=fair-lease-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fair-lease-store.d.ts","sourceRoot":"","sources":["../../../src/hub/fair-lease-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,cAAc;IAMvC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAA0B,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlF,OAAO,CAAC,SAAS,CAAqB;IACtC;;;OAGG;gBAC0B,KAAK,EAAE,sBAAsB,EAAmB,KAAK,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM;IAEtH,GAAG,CAAC,MAAM,EAAE,eAAe;IAC3B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAC5B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACrD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE;IAC/E,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAC5C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe;IACxE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAClC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAEzB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAMhG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CA4BvF"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Rotates claim priority across session owners while retaining FIFO per owner.
7
+ * Only successful claims advance the pointer; a losing poll does not consume
8
+ * another session's turn. All state transitions remain the backend's.
9
+ * @example
10
+ * const leases = new FairLeaseStore(store, (lease) => owners.get(lease.leaseId) ?? '');
11
+ */
12
+ export class FairLeaseStore {
13
+ store;
14
+ owner;
15
+ lastOwner;
16
+ /**
17
+ * @param store - The hub's in-memory lease persistence, whose queue is read in place
18
+ * @param owner - Resolves the current session owner, including takeover
19
+ */
20
+ constructor(store, owner) {
21
+ this.store = store;
22
+ this.owner = owner;
23
+ }
24
+ put(record) { return this.store.put(record); }
25
+ get(repo, id) { return this.store.get(repo, id); }
26
+ findByTask(repo, task, inputs) { return this.store.findByTask(repo, task, inputs); }
27
+ recordTargets(repo, id, rack, hashes) { return this.store.recordTargets(repo, id, rack, hashes); }
28
+ listRecentByRack(rack, limit) { return this.store.listRecentByRack(rack, limit); }
29
+ extend(repo, id, rack, deadline) { return this.store.extend(repo, id, rack, deadline); }
30
+ complete(repo, id, rack, result) { return this.store.complete(repo, id, rack, result); }
31
+ supersede(repo, id) { return this.store.supersede(repo, id); }
32
+ cancel(repo, id) { return this.store.cancel(repo, id); }
33
+ async claim(repo, id, rack, deadline, attempt) {
34
+ const claimed = await this.store.claim(repo, id, rack, deadline, attempt);
35
+ if (claimed !== null)
36
+ this.lastOwner = this.owner(claimed);
37
+ return claimed;
38
+ }
39
+ listClaimable(tiers, now, limit) {
40
+ // Limiting before grouping would let one large session hide every other
41
+ // owner, so the whole queue is read, in place: an agent polls it every
42
+ // 250 ms. Only the leases chosen are copied out.
43
+ const candidates = this.store.peekClaimable(tiers, now);
44
+ const groups = new Map();
45
+ for (const lease of candidates) {
46
+ const id = this.owner(lease);
47
+ const group = groups.get(id) ?? [];
48
+ group.push(lease);
49
+ groups.set(id, group);
50
+ }
51
+ const owners = [...groups.keys()].sort();
52
+ const next = this.lastOwner === undefined ? 0 : owners.findIndex((id) => id > this.lastOwner);
53
+ const offset = next < 0 ? 0 : next;
54
+ const order = [...owners.slice(offset), ...owners.slice(0, offset)];
55
+ const result = [];
56
+ for (let round = 0; result.length < limit; round++) {
57
+ let added = false;
58
+ for (const id of order) {
59
+ const lease = groups.get(id)[round];
60
+ if (lease !== undefined) {
61
+ result.push(lease);
62
+ added = true;
63
+ }
64
+ if (result.length >= limit)
65
+ break;
66
+ }
67
+ if (!added)
68
+ break;
69
+ }
70
+ return Promise.resolve(result.map((lease) => structuredClone(lease)));
71
+ }
72
+ }
73
+ //# sourceMappingURL=fair-lease-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fair-lease-store.js","sourceRoot":"","sources":["../../../src/hub/fair-lease-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /** Configures a shared hub and its deterministic lifecycle tests. */
6
+ export interface RackHubOptions {
7
+ /** Private state home; defaults to E3_RACK_HOME or ~/.e3/rack. */
8
+ home?: string;
9
+ /** Disables idle exit for an interactive foreground hub. */
10
+ foreground?: boolean;
11
+ /** Overrides the idle lifetime, including in foreground mode. */
12
+ idleExitMinutes?: number;
13
+ /** Supplies lifecycle diagnostics. */
14
+ log?: (line: string) => void;
15
+ /** Clock for leases, health and idle exit. */
16
+ now?: () => number;
17
+ /** Test tuning; production uses sixty seconds. */
18
+ visibilityMs?: number;
19
+ /** Test tuning; production retries a failed listener every ten seconds. */
20
+ listenerRetryMs?: number;
21
+ /** Test tuning; production sweeps every five seconds. */
22
+ sweepMs?: number;
23
+ }
24
+ /**
25
+ * Hosts one user's rack queue, fleet and repository-owning sessions.
26
+ * The hub interprets the rack/control protocol only. A live session of the
27
+ * same repository and exact e3 release performs every repository operation.
28
+ * @example
29
+ * const hub = new RackHub({ foreground: true });
30
+ * if (await hub.start()) await hub.closed;
31
+ */
32
+ export declare class RackHub {
33
+ private readonly options;
34
+ /** Resolves after listeners, file stores and ownership have been closed. */
35
+ readonly closed: Promise<void>;
36
+ private resolveClosed;
37
+ private readonly home;
38
+ private readonly now;
39
+ private readonly sessions;
40
+ private readonly subscriptions;
41
+ private readonly dedupe;
42
+ private readonly mutations;
43
+ private readonly coordinator;
44
+ private readonly backend;
45
+ private readonly leases;
46
+ private readonly abort;
47
+ private lock?;
48
+ private identity;
49
+ private registry;
50
+ private config;
51
+ private bridge;
52
+ private dispatch;
53
+ private control?;
54
+ private rack?;
55
+ private listener;
56
+ private retry?;
57
+ private sweeper?;
58
+ private stopping?;
59
+ private draining;
60
+ private idleSince;
61
+ /** @param options - State home, idle policy, diagnostics and lifecycle clocks */
62
+ constructor(options?: RackHubOptions);
63
+ /**
64
+ * Acquires ownership, loads state, and starts both listeners and sweepers.
65
+ * @returns False when another live hub owns this home
66
+ * @throws {Error} When private state or the control socket cannot be opened
67
+ */
68
+ start(): Promise<boolean>;
69
+ private hello;
70
+ private endpoint;
71
+ private session;
72
+ private emit;
73
+ private publish;
74
+ private claimedEvent;
75
+ private finish;
76
+ private signal;
77
+ /** Attaches the session to identical work already queued or held, or queues the work; attach-only queues nothing. */
78
+ private submit;
79
+ private unsubscribe;
80
+ private endSession;
81
+ private capacity;
82
+ private controlApp;
83
+ private bindRack;
84
+ private closeRack;
85
+ private lose;
86
+ /** Sweeps dead sessions, lost attempts and expired replay; deterministic in tests. */
87
+ sweep(): Promise<void>;
88
+ /** Cancels outstanding work, flushes state and releases the hub lock once. */
89
+ stop(): Promise<void>;
90
+ }
91
+ //# sourceMappingURL=hub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../../src/hub/hub.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8DH,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,qBAAa,OAAO;IA8BN,OAAO,CAAC,QAAQ,CAAC,OAAO;IA7BpC,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,IAAI,CAAC,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAgF;IAChG,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAE1B,iFAAiF;gBACpD,OAAO,GAAE,cAAmB;IASzD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAuC/B,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,OAAO;YAID,YAAY;YAOZ,MAAM;YAMN,MAAM;IA4BpB,qHAAqH;YACvG,MAAM;YAgCN,WAAW;YAkBX,UAAU;YAOV,QAAQ;IAsBtB,OAAO,CAAC,UAAU;YAqIJ,QAAQ;YA8DR,SAAS;YAKT,IAAI;IAOlB,sFAAsF;IAChF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5B,8EAA8E;IAC9E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAqBtB"}