@blokjs/runner 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/dist/Blok.d.ts +19 -0
  2. package/dist/Blok.js +184 -0
  3. package/dist/Blok.js.map +1 -0
  4. package/dist/BlokResponse.d.ts +16 -0
  5. package/dist/BlokResponse.js +28 -0
  6. package/dist/BlokResponse.js.map +1 -0
  7. package/dist/Configuration.d.ts +37 -0
  8. package/dist/Configuration.js +248 -0
  9. package/dist/Configuration.js.map +1 -0
  10. package/dist/ConfigurationResolver.d.ts +7 -0
  11. package/dist/ConfigurationResolver.js +15 -0
  12. package/dist/ConfigurationResolver.js.map +1 -0
  13. package/dist/DefaultLogger.d.ts +65 -0
  14. package/dist/DefaultLogger.js +101 -0
  15. package/dist/DefaultLogger.js.map +1 -0
  16. package/dist/LocalStorage.d.ts +7 -0
  17. package/dist/LocalStorage.js +56 -0
  18. package/dist/LocalStorage.js.map +1 -0
  19. package/dist/MemoryUsage.d.ts +22 -0
  20. package/dist/MemoryUsage.js +83 -0
  21. package/dist/MemoryUsage.js.map +1 -0
  22. package/dist/NodeMap.d.ts +7 -0
  23. package/dist/NodeMap.js +13 -0
  24. package/dist/NodeMap.js.map +1 -0
  25. package/dist/ResolverBase.d.ts +8 -0
  26. package/dist/ResolverBase.js +18 -0
  27. package/dist/ResolverBase.js.map +1 -0
  28. package/dist/Runner.d.ts +25 -0
  29. package/dist/Runner.js +32 -0
  30. package/dist/Runner.js.map +1 -0
  31. package/dist/RunnerNode.d.ts +9 -0
  32. package/dist/RunnerNode.js +8 -0
  33. package/dist/RunnerNode.js.map +1 -0
  34. package/dist/RunnerNodeBase.d.ts +4 -0
  35. package/dist/RunnerNodeBase.js +3 -0
  36. package/dist/RunnerNodeBase.js.map +1 -0
  37. package/dist/RunnerSteps.d.ts +14 -0
  38. package/dist/RunnerSteps.js +110 -0
  39. package/dist/RunnerSteps.js.map +1 -0
  40. package/dist/RuntimeAdapterNode.d.ts +19 -0
  41. package/dist/RuntimeAdapterNode.js +87 -0
  42. package/dist/RuntimeAdapterNode.js.map +1 -0
  43. package/dist/RuntimeRegistry.d.ts +61 -0
  44. package/dist/RuntimeRegistry.js +87 -0
  45. package/dist/RuntimeRegistry.js.map +1 -0
  46. package/dist/TriggerBase.d.ts +119 -0
  47. package/dist/TriggerBase.js +413 -0
  48. package/dist/TriggerBase.js.map +1 -0
  49. package/dist/adapters/BunRuntimeAdapter.d.ts +38 -0
  50. package/dist/adapters/BunRuntimeAdapter.js +169 -0
  51. package/dist/adapters/BunRuntimeAdapter.js.map +1 -0
  52. package/dist/adapters/DockerRuntimeAdapter.d.ts +85 -0
  53. package/dist/adapters/DockerRuntimeAdapter.js +298 -0
  54. package/dist/adapters/DockerRuntimeAdapter.js.map +1 -0
  55. package/dist/adapters/HttpRuntimeAdapter.d.ts +58 -0
  56. package/dist/adapters/HttpRuntimeAdapter.js +152 -0
  57. package/dist/adapters/HttpRuntimeAdapter.js.map +1 -0
  58. package/dist/adapters/NodeJsRuntimeAdapter.d.ts +23 -0
  59. package/dist/adapters/NodeJsRuntimeAdapter.js +67 -0
  60. package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -0
  61. package/dist/adapters/RuntimeAdapter.d.ts +42 -0
  62. package/dist/adapters/RuntimeAdapter.js +2 -0
  63. package/dist/adapters/RuntimeAdapter.js.map +1 -0
  64. package/dist/adapters/WasmRuntimeAdapter.d.ts +69 -0
  65. package/dist/adapters/WasmRuntimeAdapter.js +279 -0
  66. package/dist/adapters/WasmRuntimeAdapter.js.map +1 -0
  67. package/dist/cache/NodeResultCache.d.ts +286 -0
  68. package/dist/cache/NodeResultCache.js +499 -0
  69. package/dist/cache/NodeResultCache.js.map +1 -0
  70. package/dist/cache/index.d.ts +1 -0
  71. package/dist/cache/index.js +2 -0
  72. package/dist/cache/index.js.map +1 -0
  73. package/dist/cost/CostEstimator.d.ts +57 -0
  74. package/dist/cost/CostEstimator.js +171 -0
  75. package/dist/cost/CostEstimator.js.map +1 -0
  76. package/dist/cost/index.d.ts +4 -0
  77. package/dist/cost/index.js +3 -0
  78. package/dist/cost/index.js.map +1 -0
  79. package/dist/cost/pricing.d.ts +24 -0
  80. package/dist/cost/pricing.js +169 -0
  81. package/dist/cost/pricing.js.map +1 -0
  82. package/dist/defineNode.d.ts +155 -0
  83. package/dist/defineNode.js +191 -0
  84. package/dist/defineNode.js.map +1 -0
  85. package/dist/graphql/GraphQLSchemaGenerator.d.ts +129 -0
  86. package/dist/graphql/GraphQLSchemaGenerator.js +425 -0
  87. package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -0
  88. package/dist/hmr/FileWatcher.d.ts +62 -0
  89. package/dist/hmr/FileWatcher.js +185 -0
  90. package/dist/hmr/FileWatcher.js.map +1 -0
  91. package/dist/hmr/HmrDevConsole.d.ts +13 -0
  92. package/dist/hmr/HmrDevConsole.js +46 -0
  93. package/dist/hmr/HmrDevConsole.js.map +1 -0
  94. package/dist/hmr/HotReloadManager.d.ts +84 -0
  95. package/dist/hmr/HotReloadManager.js +195 -0
  96. package/dist/hmr/HotReloadManager.js.map +1 -0
  97. package/dist/hmr/index.d.ts +39 -0
  98. package/dist/hmr/index.js +38 -0
  99. package/dist/hmr/index.js.map +1 -0
  100. package/dist/index.d.ts +107 -0
  101. package/dist/index.js +107 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/integrations/APMIntegration.d.ts +141 -0
  104. package/dist/integrations/APMIntegration.js +212 -0
  105. package/dist/integrations/APMIntegration.js.map +1 -0
  106. package/dist/integrations/AzureMonitorIntegration.d.ts +118 -0
  107. package/dist/integrations/AzureMonitorIntegration.js +254 -0
  108. package/dist/integrations/AzureMonitorIntegration.js.map +1 -0
  109. package/dist/integrations/CloudWatchIntegration.d.ts +135 -0
  110. package/dist/integrations/CloudWatchIntegration.js +293 -0
  111. package/dist/integrations/CloudWatchIntegration.js.map +1 -0
  112. package/dist/integrations/SentryIntegration.d.ts +153 -0
  113. package/dist/integrations/SentryIntegration.js +200 -0
  114. package/dist/integrations/SentryIntegration.js.map +1 -0
  115. package/dist/integrations/index.d.ts +19 -0
  116. package/dist/integrations/index.js +16 -0
  117. package/dist/integrations/index.js.map +1 -0
  118. package/dist/marketplace/RuntimeAutoScaler.d.ts +148 -0
  119. package/dist/marketplace/RuntimeAutoScaler.js +366 -0
  120. package/dist/marketplace/RuntimeAutoScaler.js.map +1 -0
  121. package/dist/marketplace/RuntimeCatalog.d.ts +174 -0
  122. package/dist/marketplace/RuntimeCatalog.js +339 -0
  123. package/dist/marketplace/RuntimeCatalog.js.map +1 -0
  124. package/dist/marketplace/RuntimeDiscovery.d.ts +86 -0
  125. package/dist/marketplace/RuntimeDiscovery.js +219 -0
  126. package/dist/marketplace/RuntimeDiscovery.js.map +1 -0
  127. package/dist/marketplace/RuntimeHealthMonitor.d.ts +100 -0
  128. package/dist/marketplace/RuntimeHealthMonitor.js +241 -0
  129. package/dist/marketplace/RuntimeHealthMonitor.js.map +1 -0
  130. package/dist/marketplace/RuntimeMetricsDashboard.d.ts +113 -0
  131. package/dist/marketplace/RuntimeMetricsDashboard.js +293 -0
  132. package/dist/marketplace/RuntimeMetricsDashboard.js.map +1 -0
  133. package/dist/monitoring/CircuitBreaker.d.ts +107 -0
  134. package/dist/monitoring/CircuitBreaker.js +238 -0
  135. package/dist/monitoring/CircuitBreaker.js.map +1 -0
  136. package/dist/monitoring/DistributedTracer.d.ts +125 -0
  137. package/dist/monitoring/DistributedTracer.js +230 -0
  138. package/dist/monitoring/DistributedTracer.js.map +1 -0
  139. package/dist/monitoring/HealthCheck.d.ts +54 -0
  140. package/dist/monitoring/HealthCheck.js +102 -0
  141. package/dist/monitoring/HealthCheck.js.map +1 -0
  142. package/dist/monitoring/PerformanceProfiler.d.ts +63 -0
  143. package/dist/monitoring/PerformanceProfiler.js +229 -0
  144. package/dist/monitoring/PerformanceProfiler.js.map +1 -0
  145. package/dist/monitoring/PrometheusBootstrap.d.ts +30 -0
  146. package/dist/monitoring/PrometheusBootstrap.js +71 -0
  147. package/dist/monitoring/PrometheusBootstrap.js.map +1 -0
  148. package/dist/monitoring/PrometheusMetricsBridge.d.ts +60 -0
  149. package/dist/monitoring/PrometheusMetricsBridge.js +216 -0
  150. package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -0
  151. package/dist/monitoring/RateLimiter.d.ts +58 -0
  152. package/dist/monitoring/RateLimiter.js +128 -0
  153. package/dist/monitoring/RateLimiter.js.map +1 -0
  154. package/dist/monitoring/StructuredLogger.d.ts +131 -0
  155. package/dist/monitoring/StructuredLogger.js +207 -0
  156. package/dist/monitoring/StructuredLogger.js.map +1 -0
  157. package/dist/monitoring/TracingBootstrap.d.ts +69 -0
  158. package/dist/monitoring/TracingBootstrap.js +129 -0
  159. package/dist/monitoring/TracingBootstrap.js.map +1 -0
  160. package/dist/monitoring/TriggerMetricsCollector.d.ts +94 -0
  161. package/dist/monitoring/TriggerMetricsCollector.js +174 -0
  162. package/dist/monitoring/TriggerMetricsCollector.js.map +1 -0
  163. package/dist/monitoring/index.d.ts +9 -0
  164. package/dist/monitoring/index.js +10 -0
  165. package/dist/monitoring/index.js.map +1 -0
  166. package/dist/openapi/OpenAPIGenerator.d.ts +192 -0
  167. package/dist/openapi/OpenAPIGenerator.js +373 -0
  168. package/dist/openapi/OpenAPIGenerator.js.map +1 -0
  169. package/dist/openapi/index.d.ts +20 -0
  170. package/dist/openapi/index.js +20 -0
  171. package/dist/openapi/index.js.map +1 -0
  172. package/dist/security/ABAC.d.ts +224 -0
  173. package/dist/security/ABAC.js +380 -0
  174. package/dist/security/ABAC.js.map +1 -0
  175. package/dist/security/AuditLogger.d.ts +242 -0
  176. package/dist/security/AuditLogger.js +317 -0
  177. package/dist/security/AuditLogger.js.map +1 -0
  178. package/dist/security/AuthMiddleware.d.ts +163 -0
  179. package/dist/security/AuthMiddleware.js +274 -0
  180. package/dist/security/AuthMiddleware.js.map +1 -0
  181. package/dist/security/EncryptionAtRest.d.ts +206 -0
  182. package/dist/security/EncryptionAtRest.js +236 -0
  183. package/dist/security/EncryptionAtRest.js.map +1 -0
  184. package/dist/security/OAuthProvider.d.ts +334 -0
  185. package/dist/security/OAuthProvider.js +719 -0
  186. package/dist/security/OAuthProvider.js.map +1 -0
  187. package/dist/security/PIIDetector.d.ts +233 -0
  188. package/dist/security/PIIDetector.js +354 -0
  189. package/dist/security/PIIDetector.js.map +1 -0
  190. package/dist/security/RBAC.d.ts +143 -0
  191. package/dist/security/RBAC.js +285 -0
  192. package/dist/security/RBAC.js.map +1 -0
  193. package/dist/security/SecretManager.d.ts +652 -0
  194. package/dist/security/SecretManager.js +1146 -0
  195. package/dist/security/SecretManager.js.map +1 -0
  196. package/dist/security/TLSConfig.d.ts +305 -0
  197. package/dist/security/TLSConfig.js +550 -0
  198. package/dist/security/TLSConfig.js.map +1 -0
  199. package/dist/security/index.d.ts +79 -0
  200. package/dist/security/index.js +80 -0
  201. package/dist/security/index.js.map +1 -0
  202. package/dist/testing/TestHarness.d.ts +189 -0
  203. package/dist/testing/TestHarness.js +272 -0
  204. package/dist/testing/TestHarness.js.map +1 -0
  205. package/dist/testing/TestLogger.d.ts +103 -0
  206. package/dist/testing/TestLogger.js +153 -0
  207. package/dist/testing/TestLogger.js.map +1 -0
  208. package/dist/testing/WorkflowTestRunner.d.ts +172 -0
  209. package/dist/testing/WorkflowTestRunner.js +355 -0
  210. package/dist/testing/WorkflowTestRunner.js.map +1 -0
  211. package/dist/testing/index.d.ts +21 -0
  212. package/dist/testing/index.js +22 -0
  213. package/dist/testing/index.js.map +1 -0
  214. package/dist/tracing/InMemoryRunStore.d.ts +44 -0
  215. package/dist/tracing/InMemoryRunStore.js +341 -0
  216. package/dist/tracing/InMemoryRunStore.js.map +1 -0
  217. package/dist/tracing/PostgresRunStore.d.ts +82 -0
  218. package/dist/tracing/PostgresRunStore.js +640 -0
  219. package/dist/tracing/PostgresRunStore.js.map +1 -0
  220. package/dist/tracing/RunStore.d.ts +38 -0
  221. package/dist/tracing/RunStore.js +2 -0
  222. package/dist/tracing/RunStore.js.map +1 -0
  223. package/dist/tracing/RunTracker.d.ts +75 -0
  224. package/dist/tracing/RunTracker.js +374 -0
  225. package/dist/tracing/RunTracker.js.map +1 -0
  226. package/dist/tracing/SqliteRunStore.d.ts +53 -0
  227. package/dist/tracing/SqliteRunStore.js +703 -0
  228. package/dist/tracing/SqliteRunStore.js.map +1 -0
  229. package/dist/tracing/TraceRouter.d.ts +47 -0
  230. package/dist/tracing/TraceRouter.js +904 -0
  231. package/dist/tracing/TraceRouter.js.map +1 -0
  232. package/dist/tracing/TracingLogger.d.ts +21 -0
  233. package/dist/tracing/TracingLogger.js +62 -0
  234. package/dist/tracing/TracingLogger.js.map +1 -0
  235. package/dist/tracing/createStore.d.ts +30 -0
  236. package/dist/tracing/createStore.js +75 -0
  237. package/dist/tracing/createStore.js.map +1 -0
  238. package/dist/tracing/index.d.ts +13 -0
  239. package/dist/tracing/index.js +9 -0
  240. package/dist/tracing/index.js.map +1 -0
  241. package/dist/tracing/sanitize.d.ts +7 -0
  242. package/dist/tracing/sanitize.js +95 -0
  243. package/dist/tracing/sanitize.js.map +1 -0
  244. package/dist/tracing/types.d.ts +178 -0
  245. package/dist/tracing/types.js +3 -0
  246. package/dist/tracing/types.js.map +1 -0
  247. package/dist/types/Average.d.ts +11 -0
  248. package/dist/types/Average.js +2 -0
  249. package/dist/types/Average.js.map +1 -0
  250. package/dist/types/Condition.d.ts +8 -0
  251. package/dist/types/Condition.js +2 -0
  252. package/dist/types/Condition.js.map +1 -0
  253. package/dist/types/Conditions.d.ts +5 -0
  254. package/dist/types/Conditions.js +2 -0
  255. package/dist/types/Conditions.js.map +1 -0
  256. package/dist/types/Config.d.ts +12 -0
  257. package/dist/types/Config.js +2 -0
  258. package/dist/types/Config.js.map +1 -0
  259. package/dist/types/Flow.d.ts +5 -0
  260. package/dist/types/Flow.js +2 -0
  261. package/dist/types/Flow.js.map +1 -0
  262. package/dist/types/GlobalOptions.d.ts +11 -0
  263. package/dist/types/GlobalOptions.js +2 -0
  264. package/dist/types/GlobalOptions.js.map +1 -0
  265. package/dist/types/Inputs.d.ts +5 -0
  266. package/dist/types/Inputs.js +2 -0
  267. package/dist/types/Inputs.js.map +1 -0
  268. package/dist/types/JsonLikeObject.d.ts +3 -0
  269. package/dist/types/JsonLikeObject.js +2 -0
  270. package/dist/types/JsonLikeObject.js.map +1 -0
  271. package/dist/types/Mapper.d.ts +5 -0
  272. package/dist/types/Mapper.js +2 -0
  273. package/dist/types/Mapper.js.map +1 -0
  274. package/dist/types/Node.d.ts +10 -0
  275. package/dist/types/Node.js +2 -0
  276. package/dist/types/Node.js.map +1 -0
  277. package/dist/types/ParamsDictionary.d.ts +3 -0
  278. package/dist/types/ParamsDictionary.js +2 -0
  279. package/dist/types/ParamsDictionary.js.map +1 -0
  280. package/dist/types/Properties.d.ts +5 -0
  281. package/dist/types/Properties.js +2 -0
  282. package/dist/types/Properties.js.map +1 -0
  283. package/dist/types/Targets.d.ts +5 -0
  284. package/dist/types/Targets.js +2 -0
  285. package/dist/types/Targets.js.map +1 -0
  286. package/dist/types/Trigger.d.ts +5 -0
  287. package/dist/types/Trigger.js +2 -0
  288. package/dist/types/Trigger.js.map +1 -0
  289. package/dist/types/TriggerHttp.d.ts +7 -0
  290. package/dist/types/TriggerHttp.js +2 -0
  291. package/dist/types/TriggerHttp.js.map +1 -0
  292. package/dist/types/TriggerResponse.d.ts +6 -0
  293. package/dist/types/TriggerResponse.js +2 -0
  294. package/dist/types/TriggerResponse.js.map +1 -0
  295. package/dist/types/Triggers.d.ts +5 -0
  296. package/dist/types/Triggers.js +2 -0
  297. package/dist/types/Triggers.js.map +1 -0
  298. package/dist/types/TryCatch.d.ts +6 -0
  299. package/dist/types/TryCatch.js +2 -0
  300. package/dist/types/TryCatch.js.map +1 -0
  301. package/dist/visualization/NodeDependencyGraph.d.ts +76 -0
  302. package/dist/visualization/NodeDependencyGraph.js +418 -0
  303. package/dist/visualization/NodeDependencyGraph.js.map +1 -0
  304. package/dist/visualization/WorkflowVisualizer.d.ts +144 -0
  305. package/dist/visualization/WorkflowVisualizer.js +446 -0
  306. package/dist/visualization/WorkflowVisualizer.js.map +1 -0
  307. package/package.json +95 -0
@@ -0,0 +1,219 @@
1
+ /**
2
+ * RuntimeDiscovery - Package Discovery and Resolution Service
3
+ *
4
+ * Helps find, resolve, and recommend runtime packages from the catalog.
5
+ * Provides compatibility checking, semver range resolution, and
6
+ * intelligent package recommendations for the Blok marketplace.
7
+ */
8
+ export class RuntimeDiscovery {
9
+ catalog;
10
+ registry;
11
+ constructor(catalog, registry) {
12
+ this.catalog = catalog;
13
+ this.registry = registry;
14
+ }
15
+ /**
16
+ * Discover all packages available for a specific runtime.
17
+ *
18
+ * @param runtime - The runtime kind to discover packages for
19
+ * @returns Array of matching package manifests
20
+ */
21
+ discover(runtime) {
22
+ return this.catalog.listByRuntime(runtime);
23
+ }
24
+ /**
25
+ * Resolve a package by name with full compatibility checking.
26
+ *
27
+ * @param options - Resolution options including name, version, runtime preference
28
+ * @returns Discovery result with compatibility info and alternatives, or undefined
29
+ */
30
+ resolve(options) {
31
+ const { name, version, runtime, preferVerified } = options;
32
+ let resolvedVersion;
33
+ if (version) {
34
+ // Check if this is a semver range or exact version
35
+ if (version.startsWith("^") || version.startsWith("~")) {
36
+ resolvedVersion = this.resolveVersion(name, version);
37
+ }
38
+ else {
39
+ resolvedVersion = version;
40
+ }
41
+ }
42
+ const manifest = this.catalog.get(name, resolvedVersion);
43
+ if (!manifest)
44
+ return undefined;
45
+ // If runtime is specified, verify it matches
46
+ if (runtime && manifest.runtime !== runtime) {
47
+ return undefined;
48
+ }
49
+ const compatibility = this.checkCompatibility(manifest);
50
+ let alternatives = this.findAlternatives(name, manifest.runtime);
51
+ // If preferVerified, sort alternatives with verified first
52
+ if (preferVerified) {
53
+ alternatives = alternatives.sort((a, b) => {
54
+ if (a.verified && !b.verified)
55
+ return -1;
56
+ if (!a.verified && b.verified)
57
+ return 1;
58
+ return 0;
59
+ });
60
+ }
61
+ return {
62
+ package: manifest,
63
+ compatibility,
64
+ alternatives,
65
+ };
66
+ }
67
+ /**
68
+ * Find alternative packages similar to a given package.
69
+ * Searches by shared tags and runtime kind.
70
+ *
71
+ * @param name - The package name to find alternatives for
72
+ * @param runtime - Optional runtime kind to filter alternatives
73
+ * @returns Array of alternative package manifests
74
+ */
75
+ findAlternatives(name, runtime) {
76
+ const original = this.catalog.get(name);
77
+ const searchResult = this.catalog.search({
78
+ runtime,
79
+ limit: 100,
80
+ });
81
+ // Exclude the original package and score by tag overlap
82
+ const candidates = searchResult.packages.filter((pkg) => pkg.name !== name);
83
+ if (!original)
84
+ return candidates;
85
+ // Score by tag similarity
86
+ const scored = candidates.map((pkg) => {
87
+ const sharedTags = pkg.tags.filter((tag) => original.tags.some((oTag) => oTag.toLowerCase() === tag.toLowerCase()));
88
+ return { pkg, score: sharedTags.length };
89
+ });
90
+ scored.sort((a, b) => b.score - a.score);
91
+ return scored.map((s) => s.pkg);
92
+ }
93
+ /**
94
+ * Check if a package is compatible with the current environment.
95
+ *
96
+ * @param manifest - The package manifest to check
97
+ * @returns Compatibility information with warnings
98
+ */
99
+ checkCompatibility(manifest) {
100
+ const warnings = [];
101
+ let runtimeAvailable = false;
102
+ const blokVersionMatch = true;
103
+ let protocolSupported = true;
104
+ // Check if the runtime adapter is registered
105
+ try {
106
+ runtimeAvailable = this.registry.has(manifest.runtime);
107
+ }
108
+ catch {
109
+ runtimeAvailable = false;
110
+ }
111
+ if (!runtimeAvailable) {
112
+ warnings.push(`Runtime '${manifest.runtime}' is not currently registered. Install the adapter before using this package.`);
113
+ }
114
+ // Check minimum Blok version compatibility
115
+ if (manifest.minBlokVersion) {
116
+ // In a real implementation, this would compare against the actual Blok version.
117
+ // For now, we assume compatibility and note the requirement.
118
+ warnings.push(`Package requires minimum Blok version ${manifest.minBlokVersion}. Verify your Blok installation is compatible.`);
119
+ }
120
+ // Check protocol support
121
+ if (manifest.protocols.length === 0) {
122
+ protocolSupported = false;
123
+ warnings.push("Package does not declare any supported protocols.");
124
+ }
125
+ const compatible = runtimeAvailable && blokVersionMatch && protocolSupported;
126
+ return {
127
+ compatible,
128
+ blokVersionMatch,
129
+ runtimeAvailable,
130
+ protocolSupported,
131
+ warnings,
132
+ };
133
+ }
134
+ /**
135
+ * Recommend packages for a runtime, optionally filtered by tags.
136
+ * Results are sorted by a composite score of rating and downloads.
137
+ *
138
+ * @param runtime - The runtime kind to recommend packages for
139
+ * @param tags - Optional tags to filter recommendations
140
+ * @returns Array of recommended package manifests
141
+ */
142
+ recommend(runtime, tags) {
143
+ let candidates = this.catalog.listByRuntime(runtime);
144
+ // Filter by tags if provided
145
+ if (tags && tags.length > 0) {
146
+ candidates = candidates.filter((pkg) => tags.some((tag) => pkg.tags.some((pkgTag) => pkgTag.toLowerCase() === tag.toLowerCase())));
147
+ }
148
+ // Sort by composite score: rating * log(downloads + 1)
149
+ candidates.sort((a, b) => {
150
+ const scoreA = a.rating * Math.log(a.downloads + 1);
151
+ const scoreB = b.rating * Math.log(b.downloads + 1);
152
+ return scoreB - scoreA;
153
+ });
154
+ return candidates;
155
+ }
156
+ /**
157
+ * Resolve a semver range to a specific version available in the catalog.
158
+ * Supports exact versions, ^ (caret), and ~ (tilde) ranges.
159
+ *
160
+ * @param name - The package name
161
+ * @param range - The semver range string (e.g., "^1.2.0", "~2.0.0", "1.5.3")
162
+ * @returns The resolved version string, or undefined if no match found
163
+ */
164
+ resolveVersion(name, range) {
165
+ const versions = this.catalog.getVersions(name);
166
+ if (versions.length === 0)
167
+ return undefined;
168
+ // Exact version match
169
+ if (!range.startsWith("^") && !range.startsWith("~")) {
170
+ return versions.includes(range) ? range : undefined;
171
+ }
172
+ const prefix = range[0];
173
+ const baseVersion = range.slice(1);
174
+ const baseParts = baseVersion.split(".").map(Number);
175
+ if (baseParts.length < 3) {
176
+ // Pad with zeros
177
+ while (baseParts.length < 3) {
178
+ baseParts.push(0);
179
+ }
180
+ }
181
+ const [baseMajor, baseMinor, basePatch] = baseParts;
182
+ const matching = versions.filter((v) => {
183
+ const parts = v.split(".").map(Number);
184
+ const [major, minor, patch] = [parts[0] || 0, parts[1] || 0, parts[2] || 0];
185
+ if (prefix === "^") {
186
+ // Caret: allows changes that do not modify the left-most non-zero digit
187
+ // ^1.2.3 := >=1.2.3 <2.0.0
188
+ // ^0.2.3 := >=0.2.3 <0.3.0
189
+ // ^0.0.3 := >=0.0.3 <0.0.4
190
+ if (baseMajor !== 0) {
191
+ return major === baseMajor && this.semverGte(major, minor, patch, baseMajor, baseMinor, basePatch);
192
+ }
193
+ if (baseMinor !== 0) {
194
+ return major === 0 && minor === baseMinor && patch >= basePatch;
195
+ }
196
+ return major === 0 && minor === 0 && patch === basePatch;
197
+ }
198
+ if (prefix === "~") {
199
+ // Tilde: allows patch-level changes
200
+ // ~1.2.3 := >=1.2.3 <1.3.0
201
+ return major === baseMajor && minor === baseMinor && patch >= basePatch;
202
+ }
203
+ return false;
204
+ });
205
+ // Return the highest matching version (versions are already sorted desc)
206
+ return matching.length > 0 ? matching[0] : undefined;
207
+ }
208
+ /**
209
+ * Check if version (major, minor, patch) is >= base version.
210
+ */
211
+ semverGte(major, minor, patch, baseMajor, baseMinor, basePatch) {
212
+ if (major !== baseMajor)
213
+ return major > baseMajor;
214
+ if (minor !== baseMinor)
215
+ return minor > baseMinor;
216
+ return patch >= basePatch;
217
+ }
218
+ }
219
+ //# sourceMappingURL=RuntimeDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeDiscovery.js","sourceRoot":"","sources":["../../src/marketplace/RuntimeDiscovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * RuntimeHealthMonitor - Health Monitoring for Blok Runtime Adapters
3
+ *
4
+ * Tracks the health of all registered runtime adapters with periodic
5
+ * health checks, status transitions, uptime tracking, and event-driven
6
+ * notifications following the same patterns as TriggerMetricsCollector.
7
+ */
8
+ import type { RuntimeRegistry } from "../RuntimeRegistry";
9
+ import type { RuntimeKind } from "../adapters/RuntimeAdapter";
10
+ export interface RuntimeHealthStatus {
11
+ runtime: RuntimeKind;
12
+ status: "healthy" | "degraded" | "unhealthy" | "unknown";
13
+ lastCheck: number;
14
+ lastSuccess: number;
15
+ consecutiveFailures: number;
16
+ uptime: number;
17
+ latencyMs: number;
18
+ details: Record<string, unknown>;
19
+ }
20
+ export interface HealthMonitorConfig {
21
+ checkIntervalMs: number;
22
+ unhealthyThreshold: number;
23
+ degradedThreshold: number;
24
+ timeoutMs: number;
25
+ historySize: number;
26
+ }
27
+ export interface HealthCheckRecord {
28
+ runtime: RuntimeKind;
29
+ timestamp: number;
30
+ status: "healthy" | "degraded" | "unhealthy" | "unknown";
31
+ latencyMs: number;
32
+ error?: string;
33
+ }
34
+ export type HealthChangeListener = (runtime: RuntimeKind, oldStatus: string, newStatus: string) => void;
35
+ export declare class RuntimeHealthMonitor {
36
+ private registry;
37
+ private config;
38
+ private healthStatuses;
39
+ private history;
40
+ private listeners;
41
+ private interval;
42
+ constructor(registry: RuntimeRegistry, config?: Partial<HealthMonitorConfig>);
43
+ /**
44
+ * Begin periodic health checks using setInterval.
45
+ */
46
+ start(): void;
47
+ /**
48
+ * Stop periodic health checks.
49
+ */
50
+ stop(): void;
51
+ /**
52
+ * Check all registered runtimes and return their health statuses.
53
+ */
54
+ checkAll(): Promise<Map<RuntimeKind, RuntimeHealthStatus>>;
55
+ /**
56
+ * Check a specific runtime by verifying adapter availability and responsiveness.
57
+ */
58
+ checkRuntime(runtime: RuntimeKind): Promise<RuntimeHealthStatus>;
59
+ /**
60
+ * Get current status for a specific runtime.
61
+ */
62
+ getStatus(runtime: RuntimeKind): RuntimeHealthStatus | undefined;
63
+ /**
64
+ * Get all current health statuses.
65
+ */
66
+ getAllStatuses(): RuntimeHealthStatus[];
67
+ /**
68
+ * Get check history, optionally filtered by runtime and limited in count.
69
+ */
70
+ getHistory(runtime?: RuntimeKind, limit?: number): HealthCheckRecord[];
71
+ /**
72
+ * Subscribe to status change events. Returns an unsubscribe function.
73
+ */
74
+ onHealthChange(listener: HealthChangeListener): () => void;
75
+ /**
76
+ * Quick check if a runtime is currently healthy.
77
+ */
78
+ isHealthy(runtime: RuntimeKind): boolean;
79
+ /**
80
+ * Calculate uptime percentage from history for a given runtime.
81
+ */
82
+ getUptimePercentage(runtime: RuntimeKind): number;
83
+ /**
84
+ * Clear all status data and history.
85
+ */
86
+ reset(): void;
87
+ /**
88
+ * Calculate uptime percentage from recorded history for a specific runtime.
89
+ * Uptime is the ratio of healthy checks to total checks, expressed as 0-100.
90
+ */
91
+ private calculateUptimeFromHistory;
92
+ /**
93
+ * Notify all listeners of a health status change.
94
+ */
95
+ private emitHealthChange;
96
+ /**
97
+ * Execute an async function with a timeout.
98
+ */
99
+ private withTimeout;
100
+ }
@@ -0,0 +1,241 @@
1
+ /**
2
+ * RuntimeHealthMonitor - Health Monitoring for Blok Runtime Adapters
3
+ *
4
+ * Tracks the health of all registered runtime adapters with periodic
5
+ * health checks, status transitions, uptime tracking, and event-driven
6
+ * notifications following the same patterns as TriggerMetricsCollector.
7
+ */
8
+ const DEFAULT_CONFIG = {
9
+ checkIntervalMs: 30_000,
10
+ unhealthyThreshold: 3,
11
+ degradedThreshold: 1,
12
+ timeoutMs: 5_000,
13
+ historySize: 100,
14
+ };
15
+ export class RuntimeHealthMonitor {
16
+ registry;
17
+ config;
18
+ healthStatuses = new Map();
19
+ history = [];
20
+ listeners = [];
21
+ interval;
22
+ constructor(registry, config) {
23
+ this.registry = registry;
24
+ this.config = { ...DEFAULT_CONFIG, ...config };
25
+ }
26
+ /**
27
+ * Begin periodic health checks using setInterval.
28
+ */
29
+ start() {
30
+ if (this.interval) {
31
+ return;
32
+ }
33
+ // Perform an initial check immediately
34
+ this.checkAll();
35
+ this.interval = setInterval(() => {
36
+ this.checkAll();
37
+ }, this.config.checkIntervalMs);
38
+ }
39
+ /**
40
+ * Stop periodic health checks.
41
+ */
42
+ stop() {
43
+ if (this.interval) {
44
+ clearInterval(this.interval);
45
+ this.interval = undefined;
46
+ }
47
+ }
48
+ /**
49
+ * Check all registered runtimes and return their health statuses.
50
+ */
51
+ async checkAll() {
52
+ const kinds = this.registry.getRegisteredKinds();
53
+ const results = new Map();
54
+ for (const kind of kinds) {
55
+ const status = await this.checkRuntime(kind);
56
+ results.set(kind, status);
57
+ }
58
+ return results;
59
+ }
60
+ /**
61
+ * Check a specific runtime by verifying adapter availability and responsiveness.
62
+ */
63
+ async checkRuntime(runtime) {
64
+ const startTime = Date.now();
65
+ const previousStatus = this.healthStatuses.get(runtime);
66
+ const oldStatusLabel = previousStatus?.status ?? "unknown";
67
+ let newStatus;
68
+ try {
69
+ // Verify the adapter is registered and functional by attempting to retrieve it.
70
+ // Wrap in a timeout to detect hung adapters.
71
+ await this.withTimeout(async () => {
72
+ const adapter = this.registry.get(runtime);
73
+ // Verify the adapter object is present and has the expected kind
74
+ if (adapter.kind !== runtime) {
75
+ throw new Error(`Adapter kind mismatch: expected ${runtime}, got ${adapter.kind}`);
76
+ }
77
+ }, this.config.timeoutMs);
78
+ const latencyMs = Date.now() - startTime;
79
+ const consecutiveFailures = 0;
80
+ const status = "healthy";
81
+ newStatus = {
82
+ runtime,
83
+ status,
84
+ lastCheck: Date.now(),
85
+ lastSuccess: Date.now(),
86
+ consecutiveFailures,
87
+ uptime: 0,
88
+ latencyMs,
89
+ details: {},
90
+ };
91
+ }
92
+ catch (err) {
93
+ const latencyMs = Date.now() - startTime;
94
+ const consecutiveFailures = (previousStatus?.consecutiveFailures ?? 0) + 1;
95
+ const errorMessage = err instanceof Error ? err.message : String(err);
96
+ let status;
97
+ if (consecutiveFailures >= this.config.unhealthyThreshold) {
98
+ status = "unhealthy";
99
+ }
100
+ else if (consecutiveFailures >= this.config.degradedThreshold) {
101
+ status = "degraded";
102
+ }
103
+ else {
104
+ status = "degraded";
105
+ }
106
+ newStatus = {
107
+ runtime,
108
+ status,
109
+ lastCheck: Date.now(),
110
+ lastSuccess: previousStatus?.lastSuccess ?? 0,
111
+ consecutiveFailures,
112
+ uptime: 0,
113
+ latencyMs,
114
+ details: { error: errorMessage },
115
+ };
116
+ }
117
+ // Record check in history
118
+ const record = {
119
+ runtime,
120
+ timestamp: newStatus.lastCheck,
121
+ status: newStatus.status,
122
+ latencyMs: newStatus.latencyMs,
123
+ ...(newStatus.details.error ? { error: newStatus.details.error } : {}),
124
+ };
125
+ this.history.push(record);
126
+ if (this.history.length > this.config.historySize) {
127
+ this.history = this.history.slice(-this.config.historySize);
128
+ }
129
+ // Calculate uptime from history
130
+ newStatus.uptime = this.calculateUptimeFromHistory(runtime);
131
+ // Store updated status
132
+ this.healthStatuses.set(runtime, newStatus);
133
+ // Emit health change events when status transitions
134
+ if (oldStatusLabel !== newStatus.status) {
135
+ this.emitHealthChange(runtime, oldStatusLabel, newStatus.status);
136
+ }
137
+ return newStatus;
138
+ }
139
+ /**
140
+ * Get current status for a specific runtime.
141
+ */
142
+ getStatus(runtime) {
143
+ return this.healthStatuses.get(runtime);
144
+ }
145
+ /**
146
+ * Get all current health statuses.
147
+ */
148
+ getAllStatuses() {
149
+ return Array.from(this.healthStatuses.values());
150
+ }
151
+ /**
152
+ * Get check history, optionally filtered by runtime and limited in count.
153
+ */
154
+ getHistory(runtime, limit) {
155
+ let records = [...this.history];
156
+ if (runtime) {
157
+ records = records.filter((r) => r.runtime === runtime);
158
+ }
159
+ if (limit !== undefined && limit > 0) {
160
+ records = records.slice(-limit);
161
+ }
162
+ return records;
163
+ }
164
+ /**
165
+ * Subscribe to status change events. Returns an unsubscribe function.
166
+ */
167
+ onHealthChange(listener) {
168
+ this.listeners.push(listener);
169
+ return () => {
170
+ const index = this.listeners.indexOf(listener);
171
+ if (index !== -1) {
172
+ this.listeners.splice(index, 1);
173
+ }
174
+ };
175
+ }
176
+ /**
177
+ * Quick check if a runtime is currently healthy.
178
+ */
179
+ isHealthy(runtime) {
180
+ const status = this.healthStatuses.get(runtime);
181
+ return status?.status === "healthy";
182
+ }
183
+ /**
184
+ * Calculate uptime percentage from history for a given runtime.
185
+ */
186
+ getUptimePercentage(runtime) {
187
+ return this.calculateUptimeFromHistory(runtime);
188
+ }
189
+ /**
190
+ * Clear all status data and history.
191
+ */
192
+ reset() {
193
+ this.healthStatuses.clear();
194
+ this.history = [];
195
+ }
196
+ /**
197
+ * Calculate uptime percentage from recorded history for a specific runtime.
198
+ * Uptime is the ratio of healthy checks to total checks, expressed as 0-100.
199
+ */
200
+ calculateUptimeFromHistory(runtime) {
201
+ const runtimeHistory = this.history.filter((r) => r.runtime === runtime);
202
+ if (runtimeHistory.length === 0) {
203
+ return 100;
204
+ }
205
+ const healthyChecks = runtimeHistory.filter((r) => r.status === "healthy").length;
206
+ return (healthyChecks / runtimeHistory.length) * 100;
207
+ }
208
+ /**
209
+ * Notify all listeners of a health status change.
210
+ */
211
+ emitHealthChange(runtime, oldStatus, newStatus) {
212
+ for (const listener of this.listeners) {
213
+ try {
214
+ listener(runtime, oldStatus, newStatus);
215
+ }
216
+ catch {
217
+ // Swallow listener errors to avoid breaking the monitor loop
218
+ }
219
+ }
220
+ }
221
+ /**
222
+ * Execute an async function with a timeout.
223
+ */
224
+ withTimeout(fn, timeoutMs) {
225
+ return new Promise((resolve, reject) => {
226
+ const timer = setTimeout(() => {
227
+ reject(new Error(`Health check timed out after ${timeoutMs}ms`));
228
+ }, timeoutMs);
229
+ fn()
230
+ .then((result) => {
231
+ clearTimeout(timer);
232
+ resolve(result);
233
+ })
234
+ .catch((err) => {
235
+ clearTimeout(timer);
236
+ reject(err);
237
+ });
238
+ });
239
+ }
240
+ }
241
+ //# sourceMappingURL=RuntimeHealthMonitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeHealthMonitor.js","sourceRoot":"","sources":["../../src/marketplace/RuntimeHealthMonitor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkCH,MAAM,cAAc,GAAwB;IAC3C,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,CAAC;IACrB,iBAAiB,EAAE,CAAC;IACpB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,GAAG;CAChB,CAAC;AAEF,MAAM,OAAO,oBAAoB;IACxB,QAAQ,CAAkB;IAC1B,MAAM,CAAsB;IAC5B,cAAc,GAA0C,IAAI,GAAG,EAAE,CAAC;IAClE,OAAO,GAAwB,EAAE,CAAC;IAClC,SAAS,GAA2B,EAAE,CAAC;IACvC,QAAQ,CAA6B;IAE7C,YAAY,QAAyB,EAAE,MAAqC;QAC3E,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACR,CAAC;QACD,uCAAuC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAI;QACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC3B,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoC,CAAC;QAE5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAoB;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,cAAc,GAAG,cAAc,EAAE,MAAM,IAAI,SAAS,CAAC;QAE3D,IAAI,SAA8B,CAAC;QAEnC,IAAI,CAAC;YACJ,gFAAgF;YAChF,6CAA6C;YAC7C,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;gBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC3C,iEAAiE;gBACjE,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpF,CAAC;YACF,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACzC,MAAM,mBAAmB,GAAG,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,SAAkB,CAAC;YAElC,SAAS,GAAG;gBACX,OAAO;gBACP,MAAM;gBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;gBACvB,mBAAmB;gBACnB,MAAM,EAAE,CAAC;gBACT,SAAS;gBACT,OAAO,EAAE,EAAE;aACX,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACzC,MAAM,mBAAmB,GAAG,CAAC,cAAc,EAAE,mBAAmB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3E,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEtE,IAAI,MAAgC,CAAC;YACrC,IAAI,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC3D,MAAM,GAAG,WAAW,CAAC;YACtB,CAAC;iBAAM,IAAI,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBACjE,MAAM,GAAG,UAAU,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACP,MAAM,GAAG,UAAU,CAAC;YACrB,CAAC;YAED,SAAS,GAAG;gBACX,OAAO;gBACP,MAAM;gBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,WAAW,EAAE,cAAc,EAAE,WAAW,IAAI,CAAC;gBAC7C,mBAAmB;gBACnB,MAAM,EAAE,CAAC;gBACT,SAAS;gBACT,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE;aAChC,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAsB;YACjC,OAAO;YACP,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,KAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7D,CAAC;QAED,gCAAgC;QAChC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAE5D,uBAAuB;QACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAE5C,oDAAoD;QACpD,IAAI,cAAc,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAoB;QAC7B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,cAAc;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAqB,EAAE,KAAc;QAC/C,IAAI,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAA8B;QAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACX,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACjC,CAAC;QACF,CAAC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAoB;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,OAAoB;QACvC,OAAO,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACnB,CAAC;IAED;;;OAGG;IACK,0BAA0B,CAAC,OAAoB;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QACzE,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAClF,OAAO,CAAC,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAoB,EAAE,SAAiB,EAAE,SAAiB;QAClF,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC;gBACJ,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACR,6DAA6D;YAC9D,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACK,WAAW,CAAI,EAAoB,EAAE,SAAiB;QAC7D,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,SAAS,IAAI,CAAC,CAAC,CAAC;YAClE,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,EAAE,EAAE;iBACF,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBAChB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACd,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CAAC,GAAG,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACJ,CAAC;CACD"}