@logixjs/sandbox 0.0.1 → 0.0.2

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 (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -0,0 +1,255 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ currentDiagnosticsLevel,
5
+ toRuntimeDebugEventRef
6
+ } from "./chunk-CVZPRIDB.js";
7
+ import {
8
+ makeEvidenceSink
9
+ } from "./chunk-RS5FFPUV.js";
10
+ import {
11
+ projectJsonValue
12
+ } from "./chunk-RYSSJBGX.js";
13
+
14
+ // ../logix-core/src/internal/runtime/core/RuntimeKernel.ts
15
+ import { Context, Effect, Option } from "../effect.js";
16
+ var RuntimeServicesRuntimeConfigTagImpl = class extends Context.Tag(
17
+ "@logix/core/RuntimeServicesRuntimeConfig"
18
+ )() {
19
+ };
20
+ var RuntimeServicesRuntimeConfigTag = RuntimeServicesRuntimeConfigTagImpl;
21
+ var RuntimeServicesProviderOverridesTagImpl = class extends Context.Tag(
22
+ "@logix/core/RuntimeServicesProviderOverrides"
23
+ )() {
24
+ };
25
+ var RuntimeServicesProviderOverridesTag = RuntimeServicesProviderOverridesTagImpl;
26
+ var RuntimeServicesInstanceOverridesTagImpl = class extends Context.Tag(
27
+ "@logix/core/RuntimeServicesInstanceOverrides"
28
+ )() {
29
+ };
30
+ var RuntimeServicesInstanceOverridesTag = RuntimeServicesInstanceOverridesTagImpl;
31
+ var ORDERED_SCOPES = [
32
+ "builtin",
33
+ "runtime_default",
34
+ "runtime_module",
35
+ "provider",
36
+ "instance"
37
+ ];
38
+ var maxScope = (a, b) => {
39
+ const ai = ORDERED_SCOPES.indexOf(a);
40
+ const bi = ORDERED_SCOPES.indexOf(b);
41
+ return ai >= bi ? a : b;
42
+ };
43
+ var isPlainRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
44
+ var normalizeOverride = (value) => {
45
+ if (!isPlainRecord(value)) return void 0;
46
+ const implIdRaw = value.implId;
47
+ const notesRaw = value.notes;
48
+ return {
49
+ implId: typeof implIdRaw === "string" && implIdRaw.length > 0 ? implIdRaw : void 0,
50
+ notes: typeof notesRaw === "string" && notesRaw.length > 0 ? notesRaw : void 0
51
+ };
52
+ };
53
+ var resolveRuntimeServicesOverrides = (args) => Effect.gen(function* () {
54
+ const runtimeConfigOpt = yield* Effect.serviceOption(
55
+ RuntimeServicesRuntimeConfigTag
56
+ );
57
+ const providerOverridesOpt = yield* Effect.serviceOption(
58
+ RuntimeServicesProviderOverridesTag
59
+ );
60
+ const instanceOverridesOpt = yield* Effect.serviceOption(
61
+ RuntimeServicesInstanceOverridesTag
62
+ );
63
+ const runtimeConfig = Option.isSome(runtimeConfigOpt) ? runtimeConfigOpt.value : void 0;
64
+ const providerOverrides = Option.isSome(providerOverridesOpt) ? providerOverridesOpt.value : void 0;
65
+ const instanceOverrides = Option.isSome(instanceOverridesOpt) ? instanceOverridesOpt.value : void 0;
66
+ const moduleId = args.moduleId;
67
+ const runtimeModule = moduleId && runtimeConfig?.servicesByModuleId ? runtimeConfig.servicesByModuleId[moduleId] : void 0;
68
+ const providerModule = moduleId && providerOverrides?.servicesByModuleId ? providerOverrides.servicesByModuleId[moduleId] : void 0;
69
+ return {
70
+ runtimeDefault: runtimeConfig?.services,
71
+ runtimeModule,
72
+ provider: providerOverrides?.services,
73
+ providerModule,
74
+ instance: instanceOverrides
75
+ };
76
+ });
77
+ var selectRuntimeService = (serviceId, impls, overrides) => {
78
+ const builtin = impls[0];
79
+ if (!builtin) {
80
+ throw new Error(`[Logix] RuntimeKernel registry missing builtin impl for: ${serviceId}`);
81
+ }
82
+ let desired;
83
+ const consider = (scope, patch) => {
84
+ const next = patch ? normalizeOverride(patch[serviceId]) : void 0;
85
+ if (!next || !next.implId) return;
86
+ desired = { scope, override: next };
87
+ };
88
+ consider("runtime_default", overrides.runtimeDefault);
89
+ consider("runtime_module", overrides.runtimeModule);
90
+ consider("provider", overrides.provider);
91
+ consider("provider", overrides.providerModule);
92
+ consider("instance", overrides.instance);
93
+ if (!desired) {
94
+ return {
95
+ impl: builtin,
96
+ binding: {
97
+ serviceId,
98
+ implId: builtin.implId,
99
+ implVersion: builtin.implVersion,
100
+ scope: "builtin",
101
+ overridden: false,
102
+ notes: builtin.notes
103
+ },
104
+ overridesApplied: []
105
+ };
106
+ }
107
+ const desiredImplId = desired.override.implId;
108
+ const selected = impls.find((i) => i.implId === desiredImplId);
109
+ const impl = selected ?? builtin;
110
+ const didFallback = selected == null;
111
+ const fallbackNote = didFallback ? `Unknown implId "${desiredImplId}", falling back to builtin "${builtin.implId}"` : void 0;
112
+ const notes = [desired.override.notes, impl.notes, fallbackNote].filter((s) => typeof s === "string" && s.length > 0).join("; ");
113
+ return {
114
+ impl,
115
+ binding: {
116
+ serviceId,
117
+ implId: impl.implId,
118
+ implVersion: impl.implVersion,
119
+ scope: desired.scope,
120
+ overridden: true,
121
+ notes: notes.length > 0 ? notes : void 0
122
+ },
123
+ overridesApplied: [
124
+ didFallback ? `${desired.scope}:${serviceId}=${desiredImplId} (fallback=${builtin.implId})` : `${desired.scope}:${serviceId}=${desiredImplId}`
125
+ ]
126
+ };
127
+ };
128
+ var makeRuntimeServicesEvidence = (args) => {
129
+ let scope = "builtin";
130
+ for (const b of args.bindings) {
131
+ scope = maxScope(scope, b.scope);
132
+ }
133
+ return {
134
+ moduleId: args.moduleId,
135
+ instanceId: args.instanceId,
136
+ scope,
137
+ bindings: args.bindings,
138
+ overridesApplied: args.overridesApplied
139
+ };
140
+ };
141
+ var RUNTIME_SERVICES_EVIDENCE = /* @__PURE__ */ Symbol.for("@logix/core/runtimeServicesEvidence");
142
+ var defineHidden = (target, key, value) => {
143
+ Object.defineProperty(target, key, {
144
+ value,
145
+ enumerable: false,
146
+ configurable: true,
147
+ writable: false
148
+ });
149
+ };
150
+ var setRuntimeServicesEvidence = (runtime, evidence) => {
151
+ defineHidden(runtime, RUNTIME_SERVICES_EVIDENCE, evidence);
152
+ };
153
+
154
+ // ../logix-core/src/internal/observability/evidenceCollector.ts
155
+ import { Context as Context2, Effect as Effect2, FiberRef, Layer } from "../effect.js";
156
+ var EvidenceCollectorTagImpl = class extends Context2.Tag(
157
+ "@logix/core/EvidenceCollector"
158
+ )() {
159
+ };
160
+ var EvidenceCollectorTag = EvidenceCollectorTagImpl;
161
+ var evidenceCollectorLayer = (collector) => Layer.succeed(EvidenceCollectorTag, collector);
162
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
163
+ var makeEvidenceCollector = (session) => {
164
+ const sink = makeEvidenceSink(session);
165
+ const convergeStaticIrByDigest = /* @__PURE__ */ new Map();
166
+ let runtimeServicesEvidence;
167
+ const exportBudget = {
168
+ dropped: 0,
169
+ oversized: 0,
170
+ nonSerializable: 0
171
+ };
172
+ const debugSink = {
173
+ record: (event) => Effect2.gen(function* () {
174
+ const level = yield* FiberRef.get(currentDiagnosticsLevel);
175
+ const instanceIdRaw = event.instanceId;
176
+ const instanceId = typeof instanceIdRaw === "string" && instanceIdRaw.length > 0 ? instanceIdRaw : "unknown";
177
+ const eventSeq = level === "off" ? void 0 : session.local.nextSeq("eventSeq", instanceId);
178
+ const ref = toRuntimeDebugEventRef(event, {
179
+ diagnosticsLevel: level,
180
+ eventSeq,
181
+ onMetaProjection: ({ stats }) => {
182
+ exportBudget.dropped += stats.dropped;
183
+ exportBudget.oversized += stats.oversized;
184
+ }
185
+ });
186
+ if (!ref) return;
187
+ const projected = projectJsonValue(ref);
188
+ exportBudget.dropped += projected.stats.dropped;
189
+ exportBudget.oversized += projected.stats.oversized;
190
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
191
+ sink.record("debug:event", projected.value, {
192
+ timestamp: ref.timestamp
193
+ });
194
+ })
195
+ };
196
+ const registerConvergeStaticIr = (staticIr) => {
197
+ if (!isRecord(staticIr)) return;
198
+ const digest = staticIr.staticIrDigest;
199
+ if (typeof digest !== "string" || digest.length === 0) return;
200
+ const projected = projectJsonValue(staticIr);
201
+ exportBudget.dropped += projected.stats.dropped;
202
+ exportBudget.oversized += projected.stats.oversized;
203
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
204
+ convergeStaticIrByDigest.set(digest, projected.value);
205
+ };
206
+ const setRuntimeServicesEvidence2 = (evidence) => {
207
+ const projected = projectJsonValue(evidence);
208
+ exportBudget.dropped += projected.stats.dropped;
209
+ exportBudget.oversized += projected.stats.oversized;
210
+ exportBudget.nonSerializable += projected.stats.nonSerializable;
211
+ runtimeServicesEvidence = projected.value;
212
+ };
213
+ const exportEvidencePackage = (options) => {
214
+ const convergeSummary = convergeStaticIrByDigest.size > 0 ? {
215
+ staticIrByDigest: Object.fromEntries(convergeStaticIrByDigest)
216
+ } : void 0;
217
+ const runtimeSummary = runtimeServicesEvidence != null ? { services: runtimeServicesEvidence } : void 0;
218
+ const summary = convergeSummary != null || runtimeSummary != null ? {
219
+ ...convergeSummary != null ? { converge: convergeSummary } : {},
220
+ ...runtimeSummary != null ? { runtime: runtimeSummary } : {}
221
+ } : void 0;
222
+ return sink.export({
223
+ maxEvents: options?.maxEvents,
224
+ summary
225
+ });
226
+ };
227
+ const clear = () => {
228
+ sink.clear();
229
+ convergeStaticIrByDigest.clear();
230
+ runtimeServicesEvidence = void 0;
231
+ exportBudget.dropped = 0;
232
+ exportBudget.oversized = 0;
233
+ exportBudget.nonSerializable = 0;
234
+ };
235
+ return {
236
+ session,
237
+ debugSink,
238
+ registerConvergeStaticIr,
239
+ setRuntimeServicesEvidence: setRuntimeServicesEvidence2,
240
+ exportEvidencePackage,
241
+ clear
242
+ };
243
+ };
244
+
245
+ export {
246
+ RuntimeServicesInstanceOverridesTag,
247
+ resolveRuntimeServicesOverrides,
248
+ selectRuntimeService,
249
+ makeRuntimeServicesEvidence,
250
+ setRuntimeServicesEvidence,
251
+ EvidenceCollectorTag,
252
+ evidenceCollectorLayer,
253
+ makeEvidenceCollector
254
+ };
255
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1J1bnRpbWVLZXJuZWwudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvb2JzZXJ2YWJpbGl0eS9ldmlkZW5jZUNvbGxlY3Rvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0LCBPcHRpb24gfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IGlzRGV2RW52IH0gZnJvbSBcIi4vZW52LmpzXCJcblxuZXhwb3J0IHR5cGUgT3ZlcnJpZGVTY29wZSA9XG4gIHwgXCJidWlsdGluXCJcbiAgfCBcInJ1bnRpbWVfZGVmYXVsdFwiXG4gIHwgXCJydW50aW1lX21vZHVsZVwiXG4gIHwgXCJwcm92aWRlclwiXG4gIHwgXCJpbnN0YW5jZVwiXG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVTZXJ2aWNlT3ZlcnJpZGUgPSB7XG4gIHJlYWRvbmx5IGltcGxJZD86IHN0cmluZ1xuICByZWFkb25seSBub3Rlcz86IHN0cmluZ1xufVxuXG4vKipcbiAqIFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1x1RkYxQVx1NTNFRlx1NUU4Rlx1NTIxN1x1NTMxNlx1NzY4NFx1MjAxQ1x1NjcwRFx1NTJBMVx1NUI5RVx1NzNCMFx1OTAwOVx1NjJFOVx1MjAxRFx1ODk4Nlx1NTE5OVx1MzAwMlxuICpcbiAqIC0ga2V5IFx1NEUzQVx1N0EzM1x1NUI5QSBzZXJ2aWNlSWRcdUZGMUJcbiAqIC0gdmFsdWUgXHU0RUM1XHU1MTQxXHU4QkI4XHU1MzA1XHU1NDJCXHU1M0VGXHU1RThGXHU1MjE3XHU1MzE2XHU1QjU3XHU2QkI1XHVGRjA4XHU3OTgxXHU2QjYyXHU1MUZEXHU2NTcwL1x1OTVFRFx1NTMwNVx1RkYwOVx1RkYwQ1x1NEVFNVx1NEZCRlx1NzUxRlx1NjIxMFx1NTNFRlx1ODlFM1x1OTFDQVx1OEJDMVx1NjM2RVx1MzAwMlxuICovXG5leHBvcnQgdHlwZSBSdW50aW1lU2VydmljZXNPdmVycmlkZXMgPSBSZWFkb25seTxcbiAgUmVjb3JkPHN0cmluZywgUnVudGltZVNlcnZpY2VPdmVycmlkZT5cbj5cblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnIHtcbiAgLyoqIFJ1bnRpbWUgXHU3RUE3XHU5RUQ4XHU4QkE0XHU4OTg2XHU1MTk5XHVGRjA4cnVudGltZV9kZWZhdWx0XHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IHNlcnZpY2VzPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gIC8qKiBcdTYzMDkgbW9kdWxlSWQgXHU3Njg0XHU1REVFXHU5MUNGXHU4OTg2XHU1MTk5XHVGRjA4cnVudGltZV9tb2R1bGVcdUZGMDlcdTMwMDIgKi9cbiAgcmVhZG9ubHkgc2VydmljZXNCeU1vZHVsZUlkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzPj5cbn1cblxuY2xhc3MgUnVudGltZVNlcnZpY2VzUnVudGltZUNvbmZpZ1RhZ0ltcGwgZXh0ZW5kcyBDb250ZXh0LlRhZyhcbiAgXCJAbG9naXgvY29yZS9SdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnXCIsXG4pPFJ1bnRpbWVTZXJ2aWNlc1J1bnRpbWVDb25maWdUYWdJbXBsLCBSdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnPigpIHt9XG5cbmV4cG9ydCBjb25zdCBSdW50aW1lU2VydmljZXNSdW50aW1lQ29uZmlnVGFnID0gUnVudGltZVNlcnZpY2VzUnVudGltZUNvbmZpZ1RhZ0ltcGxcblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lU2VydmljZXNQcm92aWRlck92ZXJyaWRlcyB7XG4gIC8qKiBQcm92aWRlciBcdTgzMDNcdTU2RjRcdTlFRDhcdThCQTRcdTg5ODZcdTUxOTlcdUZGMDhwcm92aWRlclx1RkYwOVx1MzAwMiAqL1xuICByZWFkb25seSBzZXJ2aWNlcz86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAvKiogUHJvdmlkZXIgXHU4MzAzXHU1NkY0XHU2MzA5IG1vZHVsZUlkIFx1NzY4NFx1NURFRVx1OTFDRlx1ODk4Nlx1NTE5OVx1RkYwOHByb3ZpZGVyXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IHNlcnZpY2VzQnlNb2R1bGVJZD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlcz4+XG59XG5cbmNsYXNzIFJ1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzVGFnSW1wbCBleHRlbmRzIENvbnRleHQuVGFnKFxuICBcIkBsb2dpeC9jb3JlL1J1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzXCIsXG4pPFJ1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzVGFnSW1wbCwgUnVudGltZVNlcnZpY2VzUHJvdmlkZXJPdmVycmlkZXM+KCkge31cblxuZXhwb3J0IGNvbnN0IFJ1bnRpbWVTZXJ2aWNlc1Byb3ZpZGVyT3ZlcnJpZGVzVGFnID0gUnVudGltZVNlcnZpY2VzUHJvdmlkZXJPdmVycmlkZXNUYWdJbXBsXG5cbmNsYXNzIFJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnSW1wbCBleHRlbmRzIENvbnRleHQuVGFnKFxuICBcIkBsb2dpeC9jb3JlL1J1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzXCIsXG4pPFJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnSW1wbCwgUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzPigpIHt9XG5cbmV4cG9ydCBjb25zdCBSdW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlc1RhZyA9IFJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnSW1wbFxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlQmluZGluZyB7XG4gIHJlYWRvbmx5IHNlcnZpY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGltcGxJZD86IHN0cmluZ1xuICByZWFkb25seSBpbXBsVmVyc2lvbj86IHN0cmluZ1xuICByZWFkb25seSBzY29wZTogT3ZlcnJpZGVTY29wZVxuICByZWFkb25seSBvdmVycmlkZGVuOiBib29sZWFuXG4gIHJlYWRvbmx5IG5vdGVzPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVNlcnZpY2VzRXZpZGVuY2Uge1xuICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgc2NvcGU6IE92ZXJyaWRlU2NvcGVcbiAgcmVhZG9ubHkgYmluZGluZ3M6IFJlYWRvbmx5QXJyYXk8UnVudGltZVNlcnZpY2VCaW5kaW5nPlxuICByZWFkb25seSBvdmVycmlkZXNBcHBsaWVkOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn1cblxuY29uc3QgT1JERVJFRF9TQ09QRVM6IFJlYWRvbmx5QXJyYXk8T3ZlcnJpZGVTY29wZT4gPSBbXG4gIFwiYnVpbHRpblwiLFxuICBcInJ1bnRpbWVfZGVmYXVsdFwiLFxuICBcInJ1bnRpbWVfbW9kdWxlXCIsXG4gIFwicHJvdmlkZXJcIixcbiAgXCJpbnN0YW5jZVwiLFxuXVxuXG5jb25zdCBtYXhTY29wZSA9IChhOiBPdmVycmlkZVNjb3BlLCBiOiBPdmVycmlkZVNjb3BlKTogT3ZlcnJpZGVTY29wZSA9PiB7XG4gIGNvbnN0IGFpID0gT1JERVJFRF9TQ09QRVMuaW5kZXhPZihhKVxuICBjb25zdCBiaSA9IE9SREVSRURfU0NPUEVTLmluZGV4T2YoYilcbiAgcmV0dXJuIChhaSA+PSBiaSA/IGEgOiBiKSBhcyBPdmVycmlkZVNjb3BlXG59XG5cbmNvbnN0IGlzUGxhaW5SZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IG5vcm1hbGl6ZU92ZXJyaWRlID0gKHZhbHVlOiB1bmtub3duKTogUnVudGltZVNlcnZpY2VPdmVycmlkZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNQbGFpblJlY29yZCh2YWx1ZSkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBpbXBsSWRSYXcgPSB2YWx1ZS5pbXBsSWRcbiAgY29uc3Qgbm90ZXNSYXcgPSB2YWx1ZS5ub3Rlc1xuXG4gIHJldHVybiB7XG4gICAgaW1wbElkOiB0eXBlb2YgaW1wbElkUmF3ID09PSBcInN0cmluZ1wiICYmIGltcGxJZFJhdy5sZW5ndGggPiAwID8gaW1wbElkUmF3IDogdW5kZWZpbmVkLFxuICAgIG5vdGVzOiB0eXBlb2Ygbm90ZXNSYXcgPT09IFwic3RyaW5nXCIgJiYgbm90ZXNSYXcubGVuZ3RoID4gMCA/IG5vdGVzUmF3IDogdW5kZWZpbmVkLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxufSk6IEVmZmVjdC5FZmZlY3Q8XG4gIHtcbiAgICByZWFkb25seSBydW50aW1lRGVmYXVsdD86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAgIHJlYWRvbmx5IHJ1bnRpbWVNb2R1bGU/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgICByZWFkb25seSBwcm92aWRlcj86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAgIHJlYWRvbmx5IHByb3ZpZGVyTW9kdWxlPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gICAgcmVhZG9ubHkgaW5zdGFuY2U/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgfSxcbiAgbmV2ZXIsXG4gIGFueVxuPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgcnVudGltZUNvbmZpZ09wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihcbiAgICAgIFJ1bnRpbWVTZXJ2aWNlc1J1bnRpbWVDb25maWdUYWcsXG4gICAgKVxuICAgIGNvbnN0IHByb3ZpZGVyT3ZlcnJpZGVzT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFxuICAgICAgUnVudGltZVNlcnZpY2VzUHJvdmlkZXJPdmVycmlkZXNUYWcsXG4gICAgKVxuICAgIGNvbnN0IGluc3RhbmNlT3ZlcnJpZGVzT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFxuICAgICAgUnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXNUYWcsXG4gICAgKVxuXG4gICAgY29uc3QgcnVudGltZUNvbmZpZyA9IE9wdGlvbi5pc1NvbWUocnVudGltZUNvbmZpZ09wdClcbiAgICAgID8gcnVudGltZUNvbmZpZ09wdC52YWx1ZVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCBwcm92aWRlck92ZXJyaWRlcyA9IE9wdGlvbi5pc1NvbWUocHJvdmlkZXJPdmVycmlkZXNPcHQpXG4gICAgICA/IHByb3ZpZGVyT3ZlcnJpZGVzT3B0LnZhbHVlXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGluc3RhbmNlT3ZlcnJpZGVzID0gT3B0aW9uLmlzU29tZShpbnN0YW5jZU92ZXJyaWRlc09wdClcbiAgICAgID8gaW5zdGFuY2VPdmVycmlkZXNPcHQudmFsdWVcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBtb2R1bGVJZCA9IGFyZ3MubW9kdWxlSWRcblxuICAgIGNvbnN0IHJ1bnRpbWVNb2R1bGUgPVxuICAgICAgbW9kdWxlSWQgJiYgcnVudGltZUNvbmZpZz8uc2VydmljZXNCeU1vZHVsZUlkXG4gICAgICAgID8gcnVudGltZUNvbmZpZy5zZXJ2aWNlc0J5TW9kdWxlSWRbbW9kdWxlSWRdXG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBwcm92aWRlck1vZHVsZSA9XG4gICAgICBtb2R1bGVJZCAmJiBwcm92aWRlck92ZXJyaWRlcz8uc2VydmljZXNCeU1vZHVsZUlkXG4gICAgICAgID8gcHJvdmlkZXJPdmVycmlkZXMuc2VydmljZXNCeU1vZHVsZUlkW21vZHVsZUlkXVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJ1bnRpbWVEZWZhdWx0OiBydW50aW1lQ29uZmlnPy5zZXJ2aWNlcyxcbiAgICAgIHJ1bnRpbWVNb2R1bGUsXG4gICAgICBwcm92aWRlcjogcHJvdmlkZXJPdmVycmlkZXM/LnNlcnZpY2VzLFxuICAgICAgcHJvdmlkZXJNb2R1bGUsXG4gICAgICBpbnN0YW5jZTogaW5zdGFuY2VPdmVycmlkZXMsXG4gICAgfVxuICB9KVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlSW1wbDxTZXJ2aWNlPiB7XG4gIHJlYWRvbmx5IGltcGxJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGltcGxWZXJzaW9uOiBzdHJpbmdcbiAgcmVhZG9ubHkgbWFrZTogRWZmZWN0LkVmZmVjdDxTZXJ2aWNlLCBuZXZlciwgYW55PlxuICByZWFkb25seSBub3Rlcz86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTZXJ2aWNlU2VsZWN0aW9uPFNlcnZpY2U+IHtcbiAgcmVhZG9ubHkgYmluZGluZzogUnVudGltZVNlcnZpY2VCaW5kaW5nXG4gIHJlYWRvbmx5IGltcGw6IFJ1bnRpbWVTZXJ2aWNlSW1wbDxTZXJ2aWNlPlxuICByZWFkb25seSBvdmVycmlkZXNBcHBsaWVkOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdFJ1bnRpbWVTZXJ2aWNlID0gPFNlcnZpY2U+KFxuICBzZXJ2aWNlSWQ6IHN0cmluZyxcbiAgaW1wbHM6IFJlYWRvbmx5QXJyYXk8UnVudGltZVNlcnZpY2VJbXBsPFNlcnZpY2U+PixcbiAgb3ZlcnJpZGVzOiB7XG4gICAgcmVhZG9ubHkgcnVudGltZURlZmF1bHQ/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgICByZWFkb25seSBydW50aW1lTW9kdWxlPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gICAgcmVhZG9ubHkgcHJvdmlkZXI/OiBSdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgICByZWFkb25seSBwcm92aWRlck1vZHVsZT86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICAgIHJlYWRvbmx5IGluc3RhbmNlPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gIH0sXG4pOiBSdW50aW1lU2VydmljZVNlbGVjdGlvbjxTZXJ2aWNlPiA9PiB7XG4gIGNvbnN0IGJ1aWx0aW4gPSBpbXBsc1swXVxuICBpZiAoIWJ1aWx0aW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFtMb2dpeF0gUnVudGltZUtlcm5lbCByZWdpc3RyeSBtaXNzaW5nIGJ1aWx0aW4gaW1wbCBmb3I6ICR7c2VydmljZUlkfWApXG4gIH1cblxuICBsZXQgZGVzaXJlZDogeyByZWFkb25seSBzY29wZTogT3ZlcnJpZGVTY29wZTsgcmVhZG9ubHkgb3ZlcnJpZGU6IFJ1bnRpbWVTZXJ2aWNlT3ZlcnJpZGUgfSB8IHVuZGVmaW5lZFxuICBjb25zdCBjb25zaWRlciA9IChzY29wZTogT3ZlcnJpZGVTY29wZSwgcGF0Y2g6IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlcyB8IHVuZGVmaW5lZCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBwYXRjaCA/IG5vcm1hbGl6ZU92ZXJyaWRlKHBhdGNoW3NlcnZpY2VJZF0pIDogdW5kZWZpbmVkXG4gICAgaWYgKCFuZXh0IHx8ICFuZXh0LmltcGxJZCkgcmV0dXJuXG4gICAgZGVzaXJlZCA9IHsgc2NvcGUsIG92ZXJyaWRlOiBuZXh0IH1cbiAgfVxuXG4gIC8vIHByaW9yaXR5OiBidWlsdGluIDwgcnVudGltZV9kZWZhdWx0IDwgcnVudGltZV9tb2R1bGUgPCBwcm92aWRlciA8IGluc3RhbmNlXG4gIGNvbnNpZGVyKFwicnVudGltZV9kZWZhdWx0XCIsIG92ZXJyaWRlcy5ydW50aW1lRGVmYXVsdClcbiAgY29uc2lkZXIoXCJydW50aW1lX21vZHVsZVwiLCBvdmVycmlkZXMucnVudGltZU1vZHVsZSlcbiAgY29uc2lkZXIoXCJwcm92aWRlclwiLCBvdmVycmlkZXMucHJvdmlkZXIpXG4gIGNvbnNpZGVyKFwicHJvdmlkZXJcIiwgb3ZlcnJpZGVzLnByb3ZpZGVyTW9kdWxlKVxuICBjb25zaWRlcihcImluc3RhbmNlXCIsIG92ZXJyaWRlcy5pbnN0YW5jZSlcblxuICBpZiAoIWRlc2lyZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW1wbDogYnVpbHRpbixcbiAgICAgIGJpbmRpbmc6IHtcbiAgICAgICAgc2VydmljZUlkLFxuICAgICAgICBpbXBsSWQ6IGJ1aWx0aW4uaW1wbElkLFxuICAgICAgICBpbXBsVmVyc2lvbjogYnVpbHRpbi5pbXBsVmVyc2lvbixcbiAgICAgICAgc2NvcGU6IFwiYnVpbHRpblwiLFxuICAgICAgICBvdmVycmlkZGVuOiBmYWxzZSxcbiAgICAgICAgbm90ZXM6IGJ1aWx0aW4ubm90ZXMsXG4gICAgICB9LFxuICAgICAgb3ZlcnJpZGVzQXBwbGllZDogW10sXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGVzaXJlZEltcGxJZCA9IGRlc2lyZWQub3ZlcnJpZGUuaW1wbElkIVxuICBjb25zdCBzZWxlY3RlZCA9IGltcGxzLmZpbmQoKGkpID0+IGkuaW1wbElkID09PSBkZXNpcmVkSW1wbElkKVxuICBjb25zdCBpbXBsID0gc2VsZWN0ZWQgPz8gYnVpbHRpblxuXG4gIGNvbnN0IGRpZEZhbGxiYWNrID0gc2VsZWN0ZWQgPT0gbnVsbFxuICBjb25zdCBmYWxsYmFja05vdGUgPVxuICAgIGRpZEZhbGxiYWNrXG4gICAgICA/IGBVbmtub3duIGltcGxJZCBcIiR7ZGVzaXJlZEltcGxJZH1cIiwgZmFsbGluZyBiYWNrIHRvIGJ1aWx0aW4gXCIke2J1aWx0aW4uaW1wbElkfVwiYFxuICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBub3RlcyA9IFtkZXNpcmVkLm92ZXJyaWRlLm5vdGVzLCBpbXBsLm5vdGVzLCBmYWxsYmFja05vdGVdXG4gICAgLmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHR5cGVvZiBzID09PSBcInN0cmluZ1wiICYmIHMubGVuZ3RoID4gMClcbiAgICAuam9pbihcIjsgXCIpXG5cbiAgcmV0dXJuIHtcbiAgICBpbXBsLFxuICAgIGJpbmRpbmc6IHtcbiAgICAgIHNlcnZpY2VJZCxcbiAgICAgIGltcGxJZDogaW1wbC5pbXBsSWQsXG4gICAgICBpbXBsVmVyc2lvbjogaW1wbC5pbXBsVmVyc2lvbixcbiAgICAgIHNjb3BlOiBkZXNpcmVkLnNjb3BlLFxuICAgICAgb3ZlcnJpZGRlbjogdHJ1ZSxcbiAgICAgIG5vdGVzOiBub3Rlcy5sZW5ndGggPiAwID8gbm90ZXMgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgICBvdmVycmlkZXNBcHBsaWVkOiBbXG4gICAgICBkaWRGYWxsYmFja1xuICAgICAgICA/IGAke2Rlc2lyZWQuc2NvcGV9OiR7c2VydmljZUlkfT0ke2Rlc2lyZWRJbXBsSWR9IChmYWxsYmFjaz0ke2J1aWx0aW4uaW1wbElkfSlgXG4gICAgICAgIDogYCR7ZGVzaXJlZC5zY29wZX06JHtzZXJ2aWNlSWR9PSR7ZGVzaXJlZEltcGxJZH1gLFxuICAgIF0sXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VSdW50aW1lU2VydmljZXNFdmlkZW5jZSA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGJpbmRpbmdzOiBSZWFkb25seUFycmF5PFJ1bnRpbWVTZXJ2aWNlQmluZGluZz5cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzQXBwbGllZDogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG59KTogUnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPT4ge1xuICBsZXQgc2NvcGU6IE92ZXJyaWRlU2NvcGUgPSBcImJ1aWx0aW5cIlxuICBmb3IgKGNvbnN0IGIgb2YgYXJncy5iaW5kaW5ncykge1xuICAgIHNjb3BlID0gbWF4U2NvcGUoc2NvcGUsIGIuc2NvcGUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vZHVsZUlkOiBhcmdzLm1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQ6IGFyZ3MuaW5zdGFuY2VJZCxcbiAgICBzY29wZSxcbiAgICBiaW5kaW5nczogYXJncy5iaW5kaW5ncyxcbiAgICBvdmVycmlkZXNBcHBsaWVkOiBhcmdzLm92ZXJyaWRlc0FwcGxpZWQsXG4gIH1cbn1cblxuY29uc3QgUlVOVElNRV9TRVJWSUNFU19FVklERU5DRSA9IFN5bWJvbC5mb3IoXCJAbG9naXgvY29yZS9ydW50aW1lU2VydmljZXNFdmlkZW5jZVwiKVxuXG5jb25zdCBkZWZpbmVIaWRkZW4gPSAodGFyZ2V0OiBvYmplY3QsIGtleTogc3ltYm9sLCB2YWx1ZTogdW5rbm93bik6IHZvaWQgPT4ge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICB2YWx1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9KVxufVxuXG5jb25zdCBmb3JtYXRTY29wZSA9IChtb2R1bGVJZDogdW5rbm93biwgaW5zdGFuY2VJZDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG0gPSB0eXBlb2YgbW9kdWxlSWQgPT09IFwic3RyaW5nXCIgJiYgbW9kdWxlSWQubGVuZ3RoID4gMCA/IG1vZHVsZUlkIDogXCJ1bmtub3duXCJcbiAgY29uc3QgaSA9IHR5cGVvZiBpbnN0YW5jZUlkID09PSBcInN0cmluZ1wiICYmIGluc3RhbmNlSWQubGVuZ3RoID4gMCA/IGluc3RhbmNlSWQgOiBcInVua25vd25cIlxuICByZXR1cm4gYG1vZHVsZUlkPSR7bX0sIGluc3RhbmNlSWQ9JHtpfWBcbn1cblxuZXhwb3J0IGNvbnN0IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKHJ1bnRpbWU6IG9iamVjdCwgZXZpZGVuY2U6IFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlKTogdm9pZCA9PiB7XG4gIGRlZmluZUhpZGRlbihydW50aW1lLCBSVU5USU1FX1NFUlZJQ0VTX0VWSURFTkNFLCBldmlkZW5jZSlcbn1cblxuZXhwb3J0IGNvbnN0IGdldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKHJ1bnRpbWU6IG9iamVjdCk6IFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0+IHtcbiAgY29uc3Qgc2NvcGUgPSBydW50aW1lIGFzIHsgcmVhZG9ubHkgbW9kdWxlSWQ/OiB1bmtub3duOyByZWFkb25seSBpbnN0YW5jZUlkPzogdW5rbm93biB9XG4gIGNvbnN0IGV2aWRlbmNlID0gKHJ1bnRpbWUgYXMgYW55KVtSVU5USU1FX1NFUlZJQ0VTX0VWSURFTkNFXSBhcyBSdW50aW1lU2VydmljZXNFdmlkZW5jZSB8IHVuZGVmaW5lZFxuICBpZiAoIWV2aWRlbmNlKSB7XG4gICAgY29uc3QgbXNnID0gaXNEZXZFbnYoKVxuICAgICAgPyBbXG4gICAgICAgICAgXCJbTWlzc2luZ1J1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlXSBSdW50aW1lIHNlcnZpY2VzIGV2aWRlbmNlIG5vdCBpbnN0YWxsZWQgb24gTW9kdWxlUnVudGltZSBpbnN0YW5jZS5cIixcbiAgICAgICAgICBgc2NvcGU6ICR7Zm9ybWF0U2NvcGUoc2NvcGUubW9kdWxlSWQsIHNjb3BlLmluc3RhbmNlSWQpfWAsXG4gICAgICAgICAgXCJmaXg6XCIsXG4gICAgICAgICAgXCItIEVuc3VyZSBNb2R1bGVSdW50aW1lLm1ha2UgYXNzZW1ibGVzIFJ1bnRpbWVLZXJuZWwgYW5kIGF0dGFjaGVzIGV2aWRlbmNlICgwMjAgVVMyKS5cIixcbiAgICAgICAgICBcIi0gSWYgeW91IGNyZWF0ZWQgYSBtb2NrIHJ1bnRpbWUgZm9yIHRlc3RzLCBhdHRhY2ggZXZpZGVuY2Ugb3IgYXZvaWQgY2FsbGluZyBldmlkZW5jZS1vbmx5IEFQSXMuXCIsXG4gICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgOiBcIlJ1bnRpbWUgc2VydmljZXMgZXZpZGVuY2Ugbm90IGluc3RhbGxlZFwiXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZylcbiAgfVxuXG4gIGNvbnN0IHJ1bnRpbWVJbnN0YW5jZUlkID0gc2NvcGUuaW5zdGFuY2VJZFxuICBpZiAoXG4gICAgdHlwZW9mIHJ1bnRpbWVJbnN0YW5jZUlkID09PSBcInN0cmluZ1wiICYmXG4gICAgcnVudGltZUluc3RhbmNlSWQubGVuZ3RoID4gMCAmJlxuICAgIHJ1bnRpbWVJbnN0YW5jZUlkICE9PSBldmlkZW5jZS5pbnN0YW5jZUlkXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGlzRGV2RW52KClcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBcIltJbmNvbnNpc3RlbnRSdW50aW1lU2VydmljZXNFdmlkZW5jZV0gUnVudGltZSBzZXJ2aWNlcyBldmlkZW5jZSBpbnN0YW5jZUlkIG1pc21hdGNoLlwiLFxuICAgICAgICAgICAgYHJ1bnRpbWU6ICR7Zm9ybWF0U2NvcGUoc2NvcGUubW9kdWxlSWQsIHJ1bnRpbWVJbnN0YW5jZUlkKX1gLFxuICAgICAgICAgICAgYGV2aWRlbmNlOiAke2Zvcm1hdFNjb3BlKGV2aWRlbmNlLm1vZHVsZUlkLCBldmlkZW5jZS5pbnN0YW5jZUlkKX1gLFxuICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICA6IFwiUnVudGltZSBzZXJ2aWNlcyBldmlkZW5jZSBtaXNtYXRjaFwiLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBldmlkZW5jZVxufVxuIiwgImltcG9ydCB7IENvbnRleHQsIEVmZmVjdCwgRmliZXJSZWYsIExheWVyIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gXCIuL2pzb25WYWx1ZS5qc1wiXG5pbXBvcnQgeyBwcm9qZWN0SnNvblZhbHVlIH0gZnJvbSBcIi4vanNvblZhbHVlLmpzXCJcbmltcG9ydCB0eXBlIHsgRXZpZGVuY2VQYWNrYWdlIH0gZnJvbSBcIi4vZXZpZGVuY2UuanNcIlxuaW1wb3J0IHR5cGUgeyBSdW5TZXNzaW9uIH0gZnJvbSBcIi4vcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQgeyBtYWtlRXZpZGVuY2VTaW5rIH0gZnJvbSBcIi4vcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQge1xuICBjdXJyZW50RGlhZ25vc3RpY3NMZXZlbCxcbiAgdG9SdW50aW1lRGVidWdFdmVudFJlZixcbiAgdHlwZSBFdmVudCBhcyBEZWJ1Z0V2ZW50LFxuICB0eXBlIFNpbmsgYXMgRGVidWdTaW5rLFxufSBmcm9tIFwiLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZpZGVuY2VDb2xsZWN0b3Ige1xuICByZWFkb25seSBzZXNzaW9uOiBSdW5TZXNzaW9uXG4gIHJlYWRvbmx5IGRlYnVnU2luazogRGVidWdTaW5rXG4gIHJlYWRvbmx5IHJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcjogKHN0YXRpY0lyOiB1bmtub3duKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiAoZXZpZGVuY2U6IHVua25vd24pID0+IHZvaWRcbiAgcmVhZG9ubHkgZXhwb3J0RXZpZGVuY2VQYWNrYWdlOiAob3B0aW9ucz86IHsgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyIH0pID0+IEV2aWRlbmNlUGFja2FnZVxuICByZWFkb25seSBjbGVhcjogKCkgPT4gdm9pZFxufVxuXG5jbGFzcyBFdmlkZW5jZUNvbGxlY3RvclRhZ0ltcGwgZXh0ZW5kcyBDb250ZXh0LlRhZyhcbiAgXCJAbG9naXgvY29yZS9FdmlkZW5jZUNvbGxlY3RvclwiLFxuKTxFdmlkZW5jZUNvbGxlY3RvclRhZ0ltcGwsIEV2aWRlbmNlQ29sbGVjdG9yPigpIHt9XG5cbmV4cG9ydCBjb25zdCBFdmlkZW5jZUNvbGxlY3RvclRhZyA9IEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbFxuXG5leHBvcnQgY29uc3QgZXZpZGVuY2VDb2xsZWN0b3JMYXllciA9IChcbiAgY29sbGVjdG9yOiBFdmlkZW5jZUNvbGxlY3Rvcixcbik6IExheWVyLkxheWVyPEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbCwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKEV2aWRlbmNlQ29sbGVjdG9yVGFnLCBjb2xsZWN0b3IpIGFzIExheWVyLkxheWVyPFxuICAgIEV2aWRlbmNlQ29sbGVjdG9yVGFnSW1wbCxcbiAgICBuZXZlcixcbiAgICBuZXZlclxuICA+XG5cbmNvbnN0IGlzUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5leHBvcnQgY29uc3QgbWFrZUV2aWRlbmNlQ29sbGVjdG9yID0gKHNlc3Npb246IFJ1blNlc3Npb24pOiBFdmlkZW5jZUNvbGxlY3RvciA9PiB7XG4gIGNvbnN0IHNpbmsgPSBtYWtlRXZpZGVuY2VTaW5rKHNlc3Npb24pXG5cbiAgY29uc3QgY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0ID0gbmV3IE1hcDxzdHJpbmcsIEpzb25WYWx1ZT4oKVxuICBsZXQgcnVudGltZVNlcnZpY2VzRXZpZGVuY2U6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGV4cG9ydEJ1ZGdldCA9IHtcbiAgICBkcm9wcGVkOiAwLFxuICAgIG92ZXJzaXplZDogMCxcbiAgICBub25TZXJpYWxpemFibGU6IDAsXG4gIH1cblxuICBjb25zdCBkZWJ1Z1Npbms6IERlYnVnU2luayA9IHtcbiAgICByZWNvcmQ6IChldmVudDogRGVidWdFdmVudCkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnREaWFnbm9zdGljc0xldmVsKVxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkUmF3ID0gKGV2ZW50IGFzIGFueSkuaW5zdGFuY2VJZFxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkID1cbiAgICAgICAgICB0eXBlb2YgaW5zdGFuY2VJZFJhdyA9PT0gXCJzdHJpbmdcIiAmJiBpbnN0YW5jZUlkUmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gaW5zdGFuY2VJZFJhd1xuICAgICAgICAgICAgOiBcInVua25vd25cIlxuICAgICAgICBjb25zdCBldmVudFNlcSA9XG4gICAgICAgICAgbGV2ZWwgPT09IFwib2ZmXCJcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHNlc3Npb24ubG9jYWwubmV4dFNlcShcImV2ZW50U2VxXCIsIGluc3RhbmNlSWQpXG4gICAgICAgIGNvbnN0IHJlZiA9IHRvUnVudGltZURlYnVnRXZlbnRSZWYoZXZlbnQsIHtcbiAgICAgICAgICBkaWFnbm9zdGljc0xldmVsOiBsZXZlbCxcbiAgICAgICAgICBldmVudFNlcSxcbiAgICAgICAgICBvbk1ldGFQcm9qZWN0aW9uOiAoeyBzdGF0cyB9KSA9PiB7XG4gICAgICAgICAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCArPSBzdGF0cy5kcm9wcGVkXG4gICAgICAgICAgICBleHBvcnRCdWRnZXQub3ZlcnNpemVkICs9IHN0YXRzLm92ZXJzaXplZFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGlmICghcmVmKSByZXR1cm5cblxuICAgICAgICBjb25zdCBwcm9qZWN0ZWQgPSBwcm9qZWN0SnNvblZhbHVlKHJlZilcbiAgICAgICAgZXhwb3J0QnVkZ2V0LmRyb3BwZWQgKz0gcHJvamVjdGVkLnN0YXRzLmRyb3BwZWRcbiAgICAgICAgZXhwb3J0QnVkZ2V0Lm92ZXJzaXplZCArPSBwcm9qZWN0ZWQuc3RhdHMub3ZlcnNpemVkXG4gICAgICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgKz0gcHJvamVjdGVkLnN0YXRzLm5vblNlcmlhbGl6YWJsZVxuXG4gICAgICAgIHNpbmsucmVjb3JkKFwiZGVidWc6ZXZlbnRcIiwgcHJvamVjdGVkLnZhbHVlLCB7XG4gICAgICAgICAgdGltZXN0YW1wOiByZWYudGltZXN0YW1wLFxuICAgICAgICB9KVxuICAgICAgfSksXG4gIH1cblxuICBjb25zdCByZWdpc3RlckNvbnZlcmdlU3RhdGljSXIgPSAoc3RhdGljSXI6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIWlzUmVjb3JkKHN0YXRpY0lyKSkgcmV0dXJuXG4gICAgY29uc3QgZGlnZXN0ID0gc3RhdGljSXIuc3RhdGljSXJEaWdlc3RcbiAgICBpZiAodHlwZW9mIGRpZ2VzdCAhPT0gXCJzdHJpbmdcIiB8fCBkaWdlc3QubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCBwcm9qZWN0ZWQgPSBwcm9qZWN0SnNvblZhbHVlKHN0YXRpY0lyKVxuICAgIGV4cG9ydEJ1ZGdldC5kcm9wcGVkICs9IHByb2plY3RlZC5zdGF0cy5kcm9wcGVkXG4gICAgZXhwb3J0QnVkZ2V0Lm92ZXJzaXplZCArPSBwcm9qZWN0ZWQuc3RhdHMub3ZlcnNpemVkXG4gICAgZXhwb3J0QnVkZ2V0Lm5vblNlcmlhbGl6YWJsZSArPSBwcm9qZWN0ZWQuc3RhdHMubm9uU2VyaWFsaXphYmxlXG4gICAgY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0LnNldChkaWdlc3QsIHByb2plY3RlZC52YWx1ZSlcbiAgfVxuXG4gIGNvbnN0IHNldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gKGV2aWRlbmNlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgY29uc3QgcHJvamVjdGVkID0gcHJvamVjdEpzb25WYWx1ZShldmlkZW5jZSlcbiAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCArPSBwcm9qZWN0ZWQuc3RhdHMuZHJvcHBlZFxuICAgIGV4cG9ydEJ1ZGdldC5vdmVyc2l6ZWQgKz0gcHJvamVjdGVkLnN0YXRzLm92ZXJzaXplZFxuICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgKz0gcHJvamVjdGVkLnN0YXRzLm5vblNlcmlhbGl6YWJsZVxuICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gcHJvamVjdGVkLnZhbHVlXG4gIH1cblxuICBjb25zdCBleHBvcnRFdmlkZW5jZVBhY2thZ2UgPSAob3B0aW9ucz86IHtcbiAgICByZWFkb25seSBtYXhFdmVudHM/OiBudW1iZXJcbiAgfSk6IEV2aWRlbmNlUGFja2FnZSA9PiB7XG4gICAgY29uc3QgY29udmVyZ2VTdW1tYXJ5ID1cbiAgICAgIGNvbnZlcmdlU3RhdGljSXJCeURpZ2VzdC5zaXplID4gMFxuICAgICAgICA/ICh7XG4gICAgICAgICAgICBzdGF0aWNJckJ5RGlnZXN0OiBPYmplY3QuZnJvbUVudHJpZXMoY29udmVyZ2VTdGF0aWNJckJ5RGlnZXN0KSxcbiAgICAgICAgICB9IGFzIHVua25vd24gYXMgSnNvblZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgcnVudGltZVN1bW1hcnkgPVxuICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgIT0gbnVsbFxuICAgICAgICA/ICh7IHNlcnZpY2VzOiBydW50aW1lU2VydmljZXNFdmlkZW5jZSB9IGFzIHVua25vd24gYXMgSnNvblZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3Qgc3VtbWFyeSA9XG4gICAgICBjb252ZXJnZVN1bW1hcnkgIT0gbnVsbCB8fCBydW50aW1lU3VtbWFyeSAhPSBudWxsXG4gICAgICAgID8gKHtcbiAgICAgICAgICAgIC4uLihjb252ZXJnZVN1bW1hcnkgIT0gbnVsbCA/IHsgY29udmVyZ2U6IGNvbnZlcmdlU3VtbWFyeSB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHJ1bnRpbWVTdW1tYXJ5ICE9IG51bGwgPyB7IHJ1bnRpbWU6IHJ1bnRpbWVTdW1tYXJ5IH0gOiB7fSksXG4gICAgICAgICAgfSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgIHJldHVybiBzaW5rLmV4cG9ydCh7XG4gICAgICBtYXhFdmVudHM6IG9wdGlvbnM/Lm1heEV2ZW50cyxcbiAgICAgIHN1bW1hcnksXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgIHNpbmsuY2xlYXIoKVxuICAgIGNvbnZlcmdlU3RhdGljSXJCeURpZ2VzdC5jbGVhcigpXG4gICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2UgPSB1bmRlZmluZWRcbiAgICBleHBvcnRCdWRnZXQuZHJvcHBlZCA9IDBcbiAgICBleHBvcnRCdWRnZXQub3ZlcnNpemVkID0gMFxuICAgIGV4cG9ydEJ1ZGdldC5ub25TZXJpYWxpemFibGUgPSAwXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlc3Npb24sXG4gICAgZGVidWdTaW5rLFxuICAgIHJlZ2lzdGVyQ29udmVyZ2VTdGF0aWNJcixcbiAgICBzZXRSdW50aW1lU2VydmljZXNFdmlkZW5jZSxcbiAgICBleHBvcnRFdmlkZW5jZVBhY2thZ2UsXG4gICAgY2xlYXIsXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUyxTQUFTLFFBQVEsY0FBYztBQWdDeEMsSUFBTSxzQ0FBTixjQUFrRCxRQUFRO0FBQUEsRUFDeEQ7QUFDRixFQUFxRSxFQUFFO0FBQUM7QUFFakUsSUFBTSxrQ0FBa0M7QUFTL0MsSUFBTSwwQ0FBTixjQUFzRCxRQUFRO0FBQUEsRUFDNUQ7QUFDRixFQUE2RSxFQUFFO0FBQUM7QUFFekUsSUFBTSxzQ0FBc0M7QUFFbkQsSUFBTSwwQ0FBTixjQUFzRCxRQUFRO0FBQUEsRUFDNUQ7QUFDRixFQUFxRSxFQUFFO0FBQUM7QUFFakUsSUFBTSxzQ0FBc0M7QUFtQm5ELElBQU0saUJBQStDO0FBQUEsRUFDbkQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FB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QUksQ0FBQztBQUFBLE1BQy9ELEdBQUksa0JBQWtCLE9BQU8sRUFBRSxTQUFTLGVBQWUsSUFBSSxDQUFDO0FBQUEsSUFDOUQsSUFDQTtBQUVOLFdBQU8sS0FBSyxPQUFPO0FBQUEsTUFDakIsV0FBVyxTQUFTO0FBQUEsTUFDcEI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxRQUFRLE1BQVk7QUFDeEIsU0FBSyxNQUFNO0FBQ1gsNkJBQXlCLE1BQU07QUFDL0IsOEJBQTBCO0FBQzFCLGlCQUFhLFVBQVU7QUFDdkIsaUJBQWEsWUFBWTtBQUN6QixpQkFBYSxrQkFBa0I7QUFBQSxFQUNqQztBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLDRCQUFBQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogWyJDb250ZXh0IiwgIkVmZmVjdCIsICJDb250ZXh0IiwgIkVmZmVjdCIsICJzZXRSdW50aW1lU2VydmljZXNFdmlkZW5jZSJdCn0K
@@ -0,0 +1,26 @@
1
+ // @logixjs/core subpath bundles for @logixjs/sandbox
2
+
3
+
4
+ // ../logix-core/src/internal/external-store-descriptor.ts
5
+ var EXTERNAL_STORE_DESCRIPTOR = /* @__PURE__ */ Symbol.for("@logixjs/core/externalStoreDescriptor");
6
+ var defineHidden = (target, key, value) => {
7
+ Object.defineProperty(target, key, {
8
+ value,
9
+ enumerable: false,
10
+ configurable: true,
11
+ writable: false
12
+ });
13
+ };
14
+ var attachExternalStoreDescriptor = (store, descriptor) => {
15
+ defineHidden(store, EXTERNAL_STORE_DESCRIPTOR, descriptor);
16
+ };
17
+ var getExternalStoreDescriptor = (store) => {
18
+ if (!store || typeof store !== "object" && typeof store !== "function") return void 0;
19
+ return store[EXTERNAL_STORE_DESCRIPTOR];
20
+ };
21
+
22
+ export {
23
+ attachExternalStoreDescriptor,
24
+ getExternalStoreDescriptor
25
+ };
26
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvZXh0ZXJuYWwtc3RvcmUtZGVzY3JpcHRvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBDb250ZXh0LCBTdHJlYW0sIFN1YnNjcmlwdGlvblJlZiB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgUmVhZFF1ZXJ5Q29tcGlsZWQgfSBmcm9tICcuL3J1bnRpbWUvY29yZS9SZWFkUXVlcnkuanMnXG5cbmV4cG9ydCB0eXBlIEV4dGVybmFsU3RvcmVEZXNjcmlwdG9yID1cbiAgfCB7XG4gICAgICByZWFkb25seSBraW5kOiAnbWFudWFsJ1xuICAgICAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IGtpbmQ6ICdzZXJ2aWNlJ1xuICAgICAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nXG4gICAgICByZWFkb25seSB0YWdJZDogc3RyaW5nXG4gICAgICByZWFkb25seSB0YWc6IENvbnRleHQuVGFnPGFueSwgYW55PlxuICAgICAgcmVhZG9ubHkgbWFwOiAoc2VydmljZTogYW55KSA9PiB7XG4gICAgICAgIHJlYWRvbmx5IGdldFNuYXBzaG90OiAoKSA9PiBhbnlcbiAgICAgICAgcmVhZG9ubHkgZ2V0U2VydmVyU25hcHNob3Q/OiAoKSA9PiBhbnlcbiAgICAgICAgcmVhZG9ubHkgc3Vic2NyaWJlOiAobGlzdGVuZXI6ICgpID0+IHZvaWQpID0+ICgpID0+IHZvaWRcbiAgICAgIH1cbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkga2luZDogJ3N1YnNjcmlwdGlvblJlZidcbiAgICAgIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcmVmOiBTdWJzY3JpcHRpb25SZWYuU3Vic2NyaXB0aW9uUmVmPGFueT5cbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkga2luZDogJ3N0cmVhbSdcbiAgICAgIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgc3RyZWFtOiBTdHJlYW0uU3RyZWFtPGFueSwgYW55LCBhbnk+XG4gICAgICByZWFkb25seSBpbml0aWFsOiB1bmtub3duXG4gICAgICByZWFkb25seSBpbml0aWFsSGludDogJ2luaXRpYWwnIHwgJ2N1cnJlbnQnXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IGtpbmQ6ICdtb2R1bGUnXG4gICAgICByZWFkb25seSBzdG9yZUlkOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IG1vZHVsZTogdW5rbm93blxuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb25hbCBpbnN0YW5jZSBhbmNob3Igd2hlbiB0aGUgY2FsbGVyIHBhc3NlcyBhIGNvbmNyZXRlIE1vZHVsZVJ1bnRpbWUgaGFuZGxlLlxuICAgICAgICogLSBXaGVuIG9taXR0ZWQsIHRoZSBydW50aW1lIHJlc29sdmVzIGl0IGZyb20gdGhlIG1vZHVsZSB0YWcgZHVyaW5nIGluc3RhbGwuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogRnVsbCBjb21waWxlZCBSZWFkUXVlcnkgKGluY2x1ZGVzIHNlbGVjdC9lcXVhbHMpOyBtYXkgY2Fycnkgbm9uLXNlcmlhbGl6YWJsZSBjbG9zdXJlcy5cbiAgICAgICAqIFN0YXRpYyBJUiBleHBvcnQgTVVTVCB1c2UgYHJlYWRRdWVyeS5zdGF0aWNJcmAgKEpTT04tZnJpZW5kbHkpIGFuZCBpZ25vcmUgbm9uLXNlcmlhbGl6YWJsZSBwYXJ0cy5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgcmVhZFF1ZXJ5OiBSZWFkUXVlcnlDb21waWxlZDxhbnksIGFueT5cbiAgICB9XG5cbmV4cG9ydCBjb25zdCBFWFRFUk5BTF9TVE9SRV9ERVNDUklQVE9SID0gU3ltYm9sLmZvcignQGxvZ2l4anMvY29yZS9leHRlcm5hbFN0b3JlRGVzY3JpcHRvcicpXG5cbmNvbnN0IGRlZmluZUhpZGRlbiA9ICh0YXJnZXQ6IG9iamVjdCwga2V5OiBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgIHZhbHVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBhdHRhY2hFeHRlcm5hbFN0b3JlRGVzY3JpcHRvciA9IChzdG9yZTogb2JqZWN0LCBkZXNjcmlwdG9yOiBFeHRlcm5hbFN0b3JlRGVzY3JpcHRvcik6IHZvaWQgPT4ge1xuICBkZWZpbmVIaWRkZW4oc3RvcmUsIEVYVEVSTkFMX1NUT1JFX0RFU0NSSVBUT1IsIGRlc2NyaXB0b3IpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRFeHRlcm5hbFN0b3JlRGVzY3JpcHRvciA9IChzdG9yZTogdW5rbm93bik6IEV4dGVybmFsU3RvcmVEZXNjcmlwdG9yIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFzdG9yZSB8fCAodHlwZW9mIHN0b3JlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygc3RvcmUgIT09ICdmdW5jdGlvbicpKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiAoc3RvcmUgYXMgYW55KVtFWFRFUk5BTF9TVE9SRV9ERVNDUklQVE9SXSBhcyBFeHRlcm5hbFN0b3JlRGVzY3JpcHRvciB8IHVuZGVmaW5lZFxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7OztBQWdETyxJQUFNLDRCQUE0Qix1QkFBTyxJQUFJLHVDQUF1QztBQUUzRixJQUFNLGVBQWUsQ0FBQyxRQUFnQixLQUFhLFVBQXlCO0FBQzFFLFNBQU8sZUFBZSxRQUFRLEtBQUs7QUFBQSxJQUNqQztBQUFBLElBQ0EsWUFBWTtBQUFBLElBQ1osY0FBYztBQUFBLElBQ2QsVUFBVTtBQUFBLEVBQ1osQ0FBQztBQUNIO0FBRU8sSUFBTSxnQ0FBZ0MsQ0FBQyxPQUFlLGVBQThDO0FBQ3pHLGVBQWEsT0FBTywyQkFBMkIsVUFBVTtBQUMzRDtBQUVPLElBQU0sNkJBQTZCLENBQUMsVUFBd0Q7QUFDakcsTUFBSSxDQUFDLFNBQVUsT0FBTyxVQUFVLFlBQVksT0FBTyxVQUFVLFdBQWEsUUFBTztBQUNqRixTQUFRLE1BQWMseUJBQXlCO0FBQ2pEOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,71 @@
1
+ // @logixjs/core subpath bundles for @logixjs/sandbox
2
+
3
+ import {
4
+ RootContextTag
5
+ } from "./chunk-UBMUY7WO.js";
6
+ import {
7
+ isDevEnv
8
+ } from "./chunk-YMVMZA3U.js";
9
+
10
+ // ../logix-core/src/internal/root.ts
11
+ import { Context, Deferred, Effect, Layer } from "../effect.js";
12
+ var tagIdOf = (tag) => typeof tag?.id === "string" ? String(tag.id) : typeof tag?.key === "string" ? String(tag.key) : "<unknown tag>";
13
+ var makeMissingRootProviderError = (tag, entrypoint, extra) => {
14
+ const dev = isDevEnv();
15
+ const tokenId = tagIdOf(tag);
16
+ const fix = dev ? [
17
+ "- Provide it when creating the runtime tree (Logix.Runtime.make(...,{ layer }) / ManagedRuntime.make(Layer.mergeAll(...))).",
18
+ "- If you're in React and want the current runtime environment singleton, use useModule(ModuleTag).",
19
+ "- Do not rely on nested RuntimeProvider.layer to mock Root.resolve."
20
+ ] : [];
21
+ const message = dev ? [
22
+ "[MissingRootProviderError] Cannot resolve Tag from root provider.",
23
+ extra ? `
24
+ ${extra}` : "",
25
+ `tokenId: ${tokenId}`,
26
+ `entrypoint: ${entrypoint}`,
27
+ "mode: global",
28
+ "startScope: root",
29
+ "",
30
+ "fix:",
31
+ ...fix
32
+ ].filter((s) => s.length > 0).join("\n") : "[MissingRootProviderError] tag not found in root provider";
33
+ const err = new Error(message);
34
+ err.name = "MissingRootProviderError";
35
+ err.tokenId = tokenId;
36
+ err.entrypoint = entrypoint;
37
+ err.mode = "global";
38
+ err.startScope = { kind: "root" };
39
+ err.fix = fix;
40
+ return err;
41
+ };
42
+ var resolve = (tag, options) => Effect.gen(function* () {
43
+ const entrypoint = options?.entrypoint ?? "logic.root.resolve";
44
+ const root = yield* RootContextTag;
45
+ const rootContext = root.context ?? (options?.waitForReady ? yield* root.ready : void 0);
46
+ if (!rootContext) {
47
+ return yield* Effect.die(
48
+ makeMissingRootProviderError(tag, entrypoint, "reason: rootContextNotReady")
49
+ );
50
+ }
51
+ try {
52
+ return Context.get(rootContext, tag);
53
+ } catch {
54
+ return yield* Effect.die(makeMissingRootProviderError(tag, entrypoint));
55
+ }
56
+ });
57
+ var layerFromContext = (context) => Layer.scoped(
58
+ RootContextTag,
59
+ Effect.gen(function* () {
60
+ const ready = yield* Deferred.make();
61
+ yield* Deferred.succeed(ready, context);
62
+ const root = { context, ready };
63
+ return root;
64
+ })
65
+ );
66
+
67
+ export {
68
+ resolve,
69
+ layerFromContext
70
+ };
71
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcm9vdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ29udGV4dCwgRGVmZXJyZWQsIEVmZmVjdCwgTGF5ZXIgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgeyBpc0RldkVudiB9IGZyb20gJy4vcnVudGltZS9jb3JlL2Vudi5qcydcbmltcG9ydCB7IFJvb3RDb250ZXh0VGFnLCB0eXBlIFJvb3RDb250ZXh0IH0gZnJvbSAnLi9ydW50aW1lL2NvcmUvUm9vdENvbnRleHQuanMnXG5cbmV4cG9ydCB0eXBlIFJvb3RSZXNvbHZlRW50cnlwb2ludCA9ICdsb2dpYy5yb290LnJlc29sdmUnIHwgJ2xvZ2ljLiQucm9vdC5yZXNvbHZlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RSZXNvbHZlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGVudHJ5cG9pbnQ/OiBSb290UmVzb2x2ZUVudHJ5cG9pbnRcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gd2FpdCB3aGVuIFJvb3RDb250ZXh0IGlzIG5vdCByZWFkeSB5ZXQ6XG4gICAqIC0gRGVmYXVsdCBmYWxzZTogYXZvaWQgbWlzdXNlIGR1cmluZyBsYXllci9zZXR1cCB3aGljaCBjYW4gZGVhZGxvY2suXG4gICAqIC0gYCQucm9vdC5yZXNvbHZlYCBwYXNzZXMgdHJ1ZSBpbiB0aGUgcnVuIHBoYXNlIChydW4tb25seSksIGFsbG93aW5nIEVudiBhc3NlbWJseSB0byBjb21wbGV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHdhaXRGb3JSZWFkeT86IGJvb2xlYW5cbn1cblxuY29uc3QgdGFnSWRPZiA9ICh0YWc6IENvbnRleHQuVGFnPGFueSwgYW55Pik6IHN0cmluZyA9PlxuICB0eXBlb2YgKHRhZyBhcyBhbnkpPy5pZCA9PT0gJ3N0cmluZydcbiAgICA/IFN0cmluZygodGFnIGFzIGFueSkuaWQpXG4gICAgOiB0eXBlb2YgKHRhZyBhcyBhbnkpPy5rZXkgPT09ICdzdHJpbmcnXG4gICAgICA/IFN0cmluZygodGFnIGFzIGFueSkua2V5KVxuICAgICAgOiAnPHVua25vd24gdGFnPidcblxuY29uc3QgbWFrZU1pc3NpbmdSb290UHJvdmlkZXJFcnJvciA9IChcbiAgdGFnOiBDb250ZXh0LlRhZzxhbnksIGFueT4sXG4gIGVudHJ5cG9pbnQ6IFJvb3RSZXNvbHZlRW50cnlwb2ludCxcbiAgZXh0cmE/OiBzdHJpbmcsXG4pOiBFcnJvciA9PiB7XG4gIGNvbnN0IGRldiA9IGlzRGV2RW52KClcbiAgY29uc3QgdG9rZW5JZCA9IHRhZ0lkT2YodGFnKVxuICBjb25zdCBmaXg6IHN0cmluZ1tdID0gZGV2XG4gICAgPyBbXG4gICAgICAgICctIFByb3ZpZGUgaXQgd2hlbiBjcmVhdGluZyB0aGUgcnVudGltZSB0cmVlIChMb2dpeC5SdW50aW1lLm1ha2UoLi4uLHsgbGF5ZXIgfSkgLyBNYW5hZ2VkUnVudGltZS5tYWtlKExheWVyLm1lcmdlQWxsKC4uLikpKS4nLFxuICAgICAgICBcIi0gSWYgeW91J3JlIGluIFJlYWN0IGFuZCB3YW50IHRoZSBjdXJyZW50IHJ1bnRpbWUgZW52aXJvbm1lbnQgc2luZ2xldG9uLCB1c2UgdXNlTW9kdWxlKE1vZHVsZVRhZykuXCIsXG4gICAgICAgICctIERvIG5vdCByZWx5IG9uIG5lc3RlZCBSdW50aW1lUHJvdmlkZXIubGF5ZXIgdG8gbW9jayBSb290LnJlc29sdmUuJyxcbiAgICAgIF1cbiAgICA6IFtdXG5cbiAgY29uc3QgbWVzc2FnZSA9IGRldlxuICAgID8gW1xuICAgICAgICAnW01pc3NpbmdSb290UHJvdmlkZXJFcnJvcl0gQ2Fubm90IHJlc29sdmUgVGFnIGZyb20gcm9vdCBwcm92aWRlci4nLFxuICAgICAgICBleHRyYSA/IGBcXG4ke2V4dHJhfWAgOiAnJyxcbiAgICAgICAgYHRva2VuSWQ6ICR7dG9rZW5JZH1gLFxuICAgICAgICBgZW50cnlwb2ludDogJHtlbnRyeXBvaW50fWAsXG4gICAgICAgICdtb2RlOiBnbG9iYWwnLFxuICAgICAgICAnc3RhcnRTY29wZTogcm9vdCcsXG4gICAgICAgICcnLFxuICAgICAgICAnZml4OicsXG4gICAgICAgIC4uLmZpeCxcbiAgICAgIF1cbiAgICAgICAgLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKVxuICAgICAgICAuam9pbignXFxuJylcbiAgICA6ICdbTWlzc2luZ1Jvb3RQcm92aWRlckVycm9yXSB0YWcgbm90IGZvdW5kIGluIHJvb3QgcHJvdmlkZXInXG5cbiAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpXG4gIGVyci5uYW1lID0gJ01pc3NpbmdSb290UHJvdmlkZXJFcnJvcidcbiAgOyhlcnIgYXMgYW55KS50b2tlbklkID0gdG9rZW5JZFxuICA7KGVyciBhcyBhbnkpLmVudHJ5cG9pbnQgPSBlbnRyeXBvaW50XG4gIDsoZXJyIGFzIGFueSkubW9kZSA9ICdnbG9iYWwnXG4gIDsoZXJyIGFzIGFueSkuc3RhcnRTY29wZSA9IHsga2luZDogJ3Jvb3QnIH1cbiAgOyhlcnIgYXMgYW55KS5maXggPSBmaXhcbiAgcmV0dXJuIGVyclxufVxuXG4vKipcbiAqIHJlc29sdmVcbiAqXG4gKiBSZXNvbHZlIGEgVGFnIGV4cGxpY2l0bHkgZnJvbSB0aGUgcm9vdCBwcm92aWRlciBvZiB0aGUgY3VycmVudCBSdW50aW1lIHRyZWUgKFNlcnZpY2VUYWcgLyBNb2R1bGVUYWcpLlxuICpcbiAqIFNlbWFudGljczpcbiAqIC0gQWx3YXlzIHJlYWRzIHJvb3RDb250ZXh0OyB1bmFmZmVjdGVkIGJ5IG5lYXJlci1zY29wZSBMYXllci9Db250ZXh0IG92ZXJyaWRlcy5cbiAqIC0gRm9yIE1vZHVsZVRhZzogZXhwcmVzc2VzIHJvb3Qgc2luZ2xldG9uIHNlbWFudGljcyBvbmx5IChub3QgdXNlZCBmb3IgbXVsdGktaW5zdGFuY2Ugc2VsZWN0aW9uKS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmUgPSA8SWQsIFN2Yz4oXG4gIHRhZzogQ29udGV4dC5UYWc8SWQsIFN2Yz4sXG4gIG9wdGlvbnM/OiBSb290UmVzb2x2ZU9wdGlvbnMsXG4pOiBFZmZlY3QuRWZmZWN0PFN2YywgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGVudHJ5cG9pbnQ6IFJvb3RSZXNvbHZlRW50cnlwb2ludCA9IG9wdGlvbnM/LmVudHJ5cG9pbnQgPz8gJ2xvZ2ljLnJvb3QucmVzb2x2ZSdcblxuICAgIGNvbnN0IHJvb3QgPSB5aWVsZCogUm9vdENvbnRleHRUYWdcblxuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gcm9vdC5jb250ZXh0ID8/IChvcHRpb25zPy53YWl0Rm9yUmVhZHkgPyB5aWVsZCogcm9vdC5yZWFkeSA6IHVuZGVmaW5lZClcblxuICAgIGlmICghcm9vdENvbnRleHQpIHtcbiAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmRpZShcbiAgICAgICAgbWFrZU1pc3NpbmdSb290UHJvdmlkZXJFcnJvcih0YWcgYXMgQ29udGV4dC5UYWc8YW55LCBhbnk+LCBlbnRyeXBvaW50LCAncmVhc29uOiByb290Q29udGV4dE5vdFJlYWR5JyksXG4gICAgICApXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBDb250ZXh0LmdldChyb290Q29udGV4dCwgdGFnIGFzIENvbnRleHQuVGFnPGFueSwgYW55PikgYXMgU3ZjXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5kaWUobWFrZU1pc3NpbmdSb290UHJvdmlkZXJFcnJvcih0YWcgYXMgQ29udGV4dC5UYWc8YW55LCBhbnk+LCBlbnRyeXBvaW50KSlcbiAgICB9XG4gIH0pXG5cbi8qKlxuICogbGF5ZXJGcm9tQ29udGV4dFx1RkYwOHRlc3RzL3BlcmYgb25seVx1RkYwOVxuICpcbiAqIFByb3ZpZGUgYSBcInJlYWR5IGltbWVkaWF0ZWx5XCIgUm9vdENvbnRleHQgZm9yIFJvb3QucmVzb2x2ZS5cbiAqIC0gYHJlYWR5YCBpcyBmdWxmaWxsZWQgaW1tZWRpYXRlbHkgdG8gYXZvaWQgZXh0cmEgd2FpdHMgd2hlbiB3YWl0Rm9yUmVhZHk9dHJ1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyRnJvbUNvbnRleHQgPSAoY29udGV4dDogQ29udGV4dC5Db250ZXh0PGFueT4pOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBhbnk+ID0+XG4gIExheWVyLnNjb3BlZChcbiAgICBSb290Q29udGV4dFRhZyxcbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCByZWFkeSA9IHlpZWxkKiBEZWZlcnJlZC5tYWtlPENvbnRleHQuQ29udGV4dDxhbnk+PigpXG4gICAgICB5aWVsZCogRGVmZXJyZWQuc3VjY2VlZChyZWFkeSwgY29udGV4dClcbiAgICAgIGNvbnN0IHJvb3Q6IFJvb3RDb250ZXh0ID0geyBjb250ZXh0LCByZWFkeSB9XG4gICAgICByZXR1cm4gcm9vdFxuICAgIH0pLFxuICApXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7O0FBQUEsU0FBUyxTQUFTLFVBQVUsUUFBUSxhQUFhO0FBZ0JqRCxJQUFNLFVBQVUsQ0FBQyxRQUNmLE9BQVEsS0FBYSxPQUFPLFdBQ3hCLE9BQVEsSUFBWSxFQUFFLElBQ3RCLE9BQVEsS0FBYSxRQUFRLFdBQzNCLE9BQVEsSUFBWSxHQUFHLElBQ3ZCO0FBRVIsSUFBTSwrQkFBK0IsQ0FDbkMsS0FDQSxZQUNBLFVBQ1U7QUFDVixRQUFNLE1BQU0sU0FBUztBQUNyQixRQUFNLFVBQVUsUUFBUSxHQUFHO0FBQzNCLFFBQU0sTUFBZ0IsTUFDbEI7QUFBQSxJQUNFO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQ0EsQ0FBQztBQUVMLFFBQU0sVUFBVSxNQUNaO0FBQUEsSUFDRTtBQUFBLElBQ0EsUUFBUTtBQUFBLEVBQUssS0FBSyxLQUFLO0FBQUEsSUFDdkIsWUFBWSxPQUFPO0FBQUEsSUFDbkIsZUFBZSxVQUFVO0FBQUEsSUFDekI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUc7QUFBQSxFQUNMLEVBQ0csT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsRUFDMUIsS0FBSyxJQUFJLElBQ1o7QUFFSixRQUFNLE1BQU0sSUFBSSxNQUFNLE9BQU87QUFDN0IsTUFBSSxPQUFPO0FBQ1YsRUFBQyxJQUFZLFVBQVU7QUFDdkIsRUFBQyxJQUFZLGFBQWE7QUFDMUIsRUFBQyxJQUFZLE9BQU87QUFDcEIsRUFBQyxJQUFZLGFBQWEsRUFBRSxNQUFNLE9BQU87QUFDekMsRUFBQyxJQUFZLE1BQU07QUFDcEIsU0FBTztBQUNUO0FBV08sSUFBTSxVQUFVLENBQ3JCLEtBQ0EsWUFFQSxPQUFPLElBQUksYUFBYTtBQUN0QixRQUFNLGFBQW9DLFNBQVMsY0FBYztBQUVqRSxRQUFNLE9BQU8sT0FBTztBQUVwQixRQUFNLGNBQWMsS0FBSyxZQUFZLFNBQVMsZUFBZSxPQUFPLEtBQUssUUFBUTtBQUVqRixNQUFJLENBQUMsYUFBYTtBQUNoQixXQUFPLE9BQU8sT0FBTztBQUFBLE1BQ25CLDZCQUE2QixLQUE4QixZQUFZLDZCQUE2QjtBQUFBLElBQ3RHO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFDRixXQUFPLFFBQVEsSUFBSSxhQUFhLEdBQTRCO0FBQUEsRUFDOUQsUUFBUTtBQUNOLFdBQU8sT0FBTyxPQUFPLElBQUksNkJBQTZCLEtBQThCLFVBQVUsQ0FBQztBQUFBLEVBQ2pHO0FBQ0YsQ0FBQztBQVFJLElBQU0sbUJBQW1CLENBQUMsWUFDL0IsTUFBTTtBQUFBLEVBQ0o7QUFBQSxFQUNBLE9BQU8sSUFBSSxhQUFhO0FBQ3RCLFVBQU0sUUFBUSxPQUFPLFNBQVMsS0FBMkI7QUFDekQsV0FBTyxTQUFTLFFBQVEsT0FBTyxPQUFPO0FBQ3RDLFVBQU0sT0FBb0IsRUFBRSxTQUFTLE1BQU07QUFDM0MsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogW10KfQo=