@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,16 @@
1
+ /**
2
+ * External Integrations for Blok Framework
3
+ *
4
+ * Provides integrations with third-party services:
5
+ * - Sentry: Error tracking and performance monitoring
6
+ * - APM: DataDog, New Relic, and generic OTLP backends
7
+ * - CloudWatch: AWS CloudWatch metrics, logs, and traces (via ADOT → X-Ray)
8
+ * - Azure Monitor: Azure Application Insights traces, metrics, and events
9
+ *
10
+ * All integrations use lazy-loading to avoid hard dependencies.
11
+ */
12
+ export { SentryIntegration } from "./SentryIntegration";
13
+ export { APMIntegration } from "./APMIntegration";
14
+ export { CloudWatchIntegration } from "./CloudWatchIntegration";
15
+ export { AzureMonitorIntegration } from "./AzureMonitorIntegration";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AASxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAQhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * RuntimeAutoScaler - Automatic Container Pool Scaling for Blok Runtimes
3
+ *
4
+ * Monitors runtime execution load and automatically adjusts Docker container
5
+ * pool sizes based on configurable scaling policies. Tracks metrics like RPS,
6
+ * p95 latency, and CPU utilization to make informed scaling decisions.
7
+ *
8
+ * Follows patterns from DockerRuntimeAdapter (pool management, health checks)
9
+ * and TriggerMetricsCollector (metrics tracking, percentile calculations).
10
+ */
11
+ import type { RuntimeKind } from "../adapters/RuntimeAdapter";
12
+ import type { RuntimeMetricsDashboard } from "./RuntimeMetricsDashboard";
13
+ export interface ScalingPolicy {
14
+ runtime: RuntimeKind;
15
+ minInstances: number;
16
+ maxInstances: number;
17
+ targetCpuUtilization: number;
18
+ targetLatencyMs: number;
19
+ targetRps: number;
20
+ scaleUpCooldownMs: number;
21
+ scaleDownCooldownMs: number;
22
+ scaleUpStep: number;
23
+ scaleDownStep: number;
24
+ }
25
+ export interface ScalingMetrics {
26
+ currentRps: number;
27
+ currentLatencyP95: number;
28
+ currentCpuUtilization: number;
29
+ instanceUtilization: number;
30
+ }
31
+ export interface ScalingDecision {
32
+ runtime: RuntimeKind;
33
+ action: "scale_up" | "scale_down" | "no_change";
34
+ currentInstances: number;
35
+ desiredInstances: number;
36
+ reason: string;
37
+ timestamp: number;
38
+ metrics: ScalingMetrics;
39
+ }
40
+ export interface ScalingHistory {
41
+ decisions: ScalingDecision[];
42
+ scaleUpCount: number;
43
+ scaleDownCount: number;
44
+ lastScaleUp: number;
45
+ lastScaleDown: number;
46
+ }
47
+ export interface AutoScalerConfig {
48
+ evaluationIntervalMs: number;
49
+ enabled: boolean;
50
+ dryRun: boolean;
51
+ }
52
+ export type ScalingListener = (decision: ScalingDecision) => void;
53
+ /**
54
+ * RuntimeAutoScaler monitors runtime execution load and automatically
55
+ * adjusts Docker container pool sizes based on scaling policies.
56
+ *
57
+ * It periodically evaluates metrics from the RuntimeMetricsDashboard and
58
+ * produces ScalingDecisions that indicate whether to scale up, scale down,
59
+ * or maintain the current number of instances.
60
+ */
61
+ export declare class RuntimeAutoScaler {
62
+ private policies;
63
+ private history;
64
+ private listeners;
65
+ private interval;
66
+ private dashboard;
67
+ private config;
68
+ constructor(dashboard: RuntimeMetricsDashboard, config?: Partial<AutoScalerConfig>);
69
+ /**
70
+ * Set a scaling policy for a runtime.
71
+ * Merges provided values with defaults.
72
+ */
73
+ setPolicy(policy: ScalingPolicy): void;
74
+ /**
75
+ * Get the scaling policy for a runtime.
76
+ */
77
+ getPolicy(runtime: RuntimeKind): ScalingPolicy | undefined;
78
+ /**
79
+ * Remove the scaling policy for a runtime.
80
+ */
81
+ removePolicy(runtime: RuntimeKind): void;
82
+ /**
83
+ * Begin periodic evaluation of all runtime scaling policies.
84
+ */
85
+ start(): void;
86
+ /**
87
+ * Stop periodic evaluation.
88
+ */
89
+ stop(): void;
90
+ /**
91
+ * Evaluate a single runtime against its scaling policy.
92
+ *
93
+ * The evaluation logic:
94
+ * 1. Get current metrics from RuntimeMetricsDashboard
95
+ * 2. Get the scaling policy for this runtime
96
+ * 3. Check cooldown periods (don't scale too frequently)
97
+ * 4. Determine desired instances based on RPS, latency, and CPU thresholds
98
+ * 5. Clamp desired between minInstances and maxInstances
99
+ * 6. Create ScalingDecision with descriptive reason
100
+ * 7. Record in history and notify listeners
101
+ */
102
+ evaluate(runtime: RuntimeKind): ScalingDecision;
103
+ /**
104
+ * Evaluate all runtimes that have scaling policies.
105
+ */
106
+ evaluateAll(): ScalingDecision[];
107
+ /**
108
+ * Get the scaling history for a runtime.
109
+ */
110
+ getHistory(runtime: RuntimeKind): ScalingHistory | undefined;
111
+ /**
112
+ * Get scaling history for all runtimes.
113
+ */
114
+ getAllHistory(): Map<RuntimeKind, ScalingHistory>;
115
+ /**
116
+ * Subscribe to scaling decisions. Returns an unsubscribe function.
117
+ */
118
+ onScalingDecision(listener: ScalingListener): () => void;
119
+ /**
120
+ * Suggest a scaling policy based on current runtime metrics.
121
+ * Uses observed metrics to derive sensible defaults.
122
+ */
123
+ getRecommendedPolicy(runtime: RuntimeKind): ScalingPolicy;
124
+ /**
125
+ * Clear all history, policies, and state.
126
+ */
127
+ reset(): void;
128
+ /**
129
+ * Collect current scaling metrics from the RuntimeMetricsDashboard.
130
+ */
131
+ private collectMetrics;
132
+ /**
133
+ * Create a no-change decision with the given reason.
134
+ */
135
+ private createNoChangeDecision;
136
+ /**
137
+ * Get or create history entry for a runtime.
138
+ */
139
+ private getOrCreateHistory;
140
+ /**
141
+ * Record a scaling decision in the history.
142
+ */
143
+ private recordDecision;
144
+ /**
145
+ * Notify all registered listeners of a scaling decision.
146
+ */
147
+ private notifyListeners;
148
+ }
@@ -0,0 +1,366 @@
1
+ /**
2
+ * RuntimeAutoScaler - Automatic Container Pool Scaling for Blok Runtimes
3
+ *
4
+ * Monitors runtime execution load and automatically adjusts Docker container
5
+ * pool sizes based on configurable scaling policies. Tracks metrics like RPS,
6
+ * p95 latency, and CPU utilization to make informed scaling decisions.
7
+ *
8
+ * Follows patterns from DockerRuntimeAdapter (pool management, health checks)
9
+ * and TriggerMetricsCollector (metrics tracking, percentile calculations).
10
+ */
11
+ const DEFAULT_POLICY = {
12
+ minInstances: 1,
13
+ maxInstances: 10,
14
+ targetCpuUtilization: 70,
15
+ targetLatencyMs: 200,
16
+ targetRps: 100,
17
+ scaleUpCooldownMs: 60_000,
18
+ scaleDownCooldownMs: 300_000,
19
+ scaleUpStep: 1,
20
+ scaleDownStep: 1,
21
+ };
22
+ const DEFAULT_CONFIG = {
23
+ evaluationIntervalMs: 30_000,
24
+ enabled: true,
25
+ dryRun: false,
26
+ };
27
+ const MAX_HISTORY_DECISIONS = 500;
28
+ /**
29
+ * RuntimeAutoScaler monitors runtime execution load and automatically
30
+ * adjusts Docker container pool sizes based on scaling policies.
31
+ *
32
+ * It periodically evaluates metrics from the RuntimeMetricsDashboard and
33
+ * produces ScalingDecisions that indicate whether to scale up, scale down,
34
+ * or maintain the current number of instances.
35
+ */
36
+ export class RuntimeAutoScaler {
37
+ policies = new Map();
38
+ history = new Map();
39
+ listeners = [];
40
+ interval;
41
+ dashboard;
42
+ config;
43
+ constructor(dashboard, config) {
44
+ this.dashboard = dashboard;
45
+ this.config = {
46
+ evaluationIntervalMs: config?.evaluationIntervalMs ?? DEFAULT_CONFIG.evaluationIntervalMs,
47
+ enabled: config?.enabled ?? DEFAULT_CONFIG.enabled,
48
+ dryRun: config?.dryRun ?? DEFAULT_CONFIG.dryRun,
49
+ };
50
+ }
51
+ /**
52
+ * Set a scaling policy for a runtime.
53
+ * Merges provided values with defaults.
54
+ */
55
+ setPolicy(policy) {
56
+ this.policies.set(policy.runtime, {
57
+ ...DEFAULT_POLICY,
58
+ ...policy,
59
+ });
60
+ // Initialize history for this runtime if not present
61
+ if (!this.history.has(policy.runtime)) {
62
+ this.history.set(policy.runtime, {
63
+ decisions: [],
64
+ scaleUpCount: 0,
65
+ scaleDownCount: 0,
66
+ lastScaleUp: 0,
67
+ lastScaleDown: 0,
68
+ });
69
+ }
70
+ }
71
+ /**
72
+ * Get the scaling policy for a runtime.
73
+ */
74
+ getPolicy(runtime) {
75
+ return this.policies.get(runtime);
76
+ }
77
+ /**
78
+ * Remove the scaling policy for a runtime.
79
+ */
80
+ removePolicy(runtime) {
81
+ this.policies.delete(runtime);
82
+ }
83
+ /**
84
+ * Begin periodic evaluation of all runtime scaling policies.
85
+ */
86
+ start() {
87
+ if (!this.config.enabled) {
88
+ return;
89
+ }
90
+ if (this.interval) {
91
+ clearInterval(this.interval);
92
+ }
93
+ this.interval = setInterval(() => {
94
+ this.evaluateAll();
95
+ }, this.config.evaluationIntervalMs);
96
+ }
97
+ /**
98
+ * Stop periodic evaluation.
99
+ */
100
+ stop() {
101
+ if (this.interval) {
102
+ clearInterval(this.interval);
103
+ this.interval = undefined;
104
+ }
105
+ }
106
+ /**
107
+ * Evaluate a single runtime against its scaling policy.
108
+ *
109
+ * The evaluation logic:
110
+ * 1. Get current metrics from RuntimeMetricsDashboard
111
+ * 2. Get the scaling policy for this runtime
112
+ * 3. Check cooldown periods (don't scale too frequently)
113
+ * 4. Determine desired instances based on RPS, latency, and CPU thresholds
114
+ * 5. Clamp desired between minInstances and maxInstances
115
+ * 6. Create ScalingDecision with descriptive reason
116
+ * 7. Record in history and notify listeners
117
+ */
118
+ evaluate(runtime) {
119
+ const policy = this.policies.get(runtime);
120
+ if (!policy) {
121
+ return this.createNoChangeDecision(runtime, 0, "No scaling policy configured for this runtime");
122
+ }
123
+ const metrics = this.collectMetrics(runtime);
124
+ const history = this.getOrCreateHistory(runtime);
125
+ const now = Date.now();
126
+ // Determine current instance count from instance utilization and max
127
+ const currentInstances = Math.max(policy.minInstances, Math.round((metrics.instanceUtilization / 100) * policy.maxInstances) || policy.minInstances);
128
+ let desiredInstances = currentInstances;
129
+ let action = "no_change";
130
+ let reason = "All metrics within acceptable thresholds";
131
+ // Check if scale up is needed
132
+ const rpsExceeded = metrics.currentRps > policy.targetRps * currentInstances;
133
+ const latencyExceeded = metrics.currentLatencyP95 > policy.targetLatencyMs;
134
+ const cpuExceeded = metrics.currentCpuUtilization > policy.targetCpuUtilization;
135
+ if (rpsExceeded || latencyExceeded) {
136
+ // Check scale-up cooldown
137
+ const timeSinceLastScaleUp = now - history.lastScaleUp;
138
+ if (timeSinceLastScaleUp < policy.scaleUpCooldownMs && history.lastScaleUp > 0) {
139
+ reason = `Scale up needed but in cooldown (${Math.round((policy.scaleUpCooldownMs - timeSinceLastScaleUp) / 1000)}s remaining)`;
140
+ }
141
+ else {
142
+ desiredInstances = currentInstances + policy.scaleUpStep;
143
+ action = "scale_up";
144
+ const reasons = [];
145
+ if (rpsExceeded) {
146
+ reasons.push(`RPS ${metrics.currentRps.toFixed(1)} exceeds target ${policy.targetRps * currentInstances} (${policy.targetRps}/instance * ${currentInstances})`);
147
+ }
148
+ if (latencyExceeded) {
149
+ reasons.push(`p95 latency ${metrics.currentLatencyP95.toFixed(1)}ms exceeds target ${policy.targetLatencyMs}ms`);
150
+ }
151
+ if (cpuExceeded) {
152
+ reasons.push(`CPU utilization ${metrics.currentCpuUtilization.toFixed(1)}% exceeds target ${policy.targetCpuUtilization}%`);
153
+ }
154
+ reason = `Scaling up: ${reasons.join("; ")}`;
155
+ }
156
+ }
157
+ else {
158
+ // Check if scale down is possible
159
+ const canScaleDown = currentInstances > policy.minInstances;
160
+ const rpsAllowsScaleDown = metrics.currentRps < policy.targetRps * (currentInstances - 1);
161
+ const latencyIsGood = metrics.currentLatencyP95 <= policy.targetLatencyMs;
162
+ if (canScaleDown && rpsAllowsScaleDown && latencyIsGood) {
163
+ // Check scale-down cooldown
164
+ const timeSinceLastScaleDown = now - history.lastScaleDown;
165
+ if (timeSinceLastScaleDown < policy.scaleDownCooldownMs && history.lastScaleDown > 0) {
166
+ reason = `Scale down possible but in cooldown (${Math.round((policy.scaleDownCooldownMs - timeSinceLastScaleDown) / 1000)}s remaining)`;
167
+ }
168
+ else {
169
+ desiredInstances = currentInstances - policy.scaleDownStep;
170
+ action = "scale_down";
171
+ reason = `Scaling down: RPS ${metrics.currentRps.toFixed(1)} is below threshold ${policy.targetRps * (currentInstances - 1)} for ${currentInstances - 1} instances, latency ${metrics.currentLatencyP95.toFixed(1)}ms is within target ${policy.targetLatencyMs}ms`;
172
+ }
173
+ }
174
+ }
175
+ // Clamp desired instances between min and max
176
+ desiredInstances = Math.max(policy.minInstances, Math.min(policy.maxInstances, desiredInstances));
177
+ // If clamping changed the desired count back to current, it's a no_change
178
+ if (desiredInstances === currentInstances) {
179
+ action = "no_change";
180
+ if (desiredInstances >= policy.maxInstances && (rpsExceeded || latencyExceeded)) {
181
+ reason = `At maximum capacity (${policy.maxInstances} instances), cannot scale further`;
182
+ }
183
+ }
184
+ const decision = {
185
+ runtime,
186
+ action,
187
+ currentInstances,
188
+ desiredInstances,
189
+ reason,
190
+ timestamp: now,
191
+ metrics,
192
+ };
193
+ // Record in history
194
+ this.recordDecision(runtime, decision);
195
+ // Notify listeners
196
+ this.notifyListeners(decision);
197
+ return decision;
198
+ }
199
+ /**
200
+ * Evaluate all runtimes that have scaling policies.
201
+ */
202
+ evaluateAll() {
203
+ const decisions = [];
204
+ for (const runtime of this.policies.keys()) {
205
+ const decision = this.evaluate(runtime);
206
+ decisions.push(decision);
207
+ }
208
+ return decisions;
209
+ }
210
+ /**
211
+ * Get the scaling history for a runtime.
212
+ */
213
+ getHistory(runtime) {
214
+ return this.history.get(runtime);
215
+ }
216
+ /**
217
+ * Get scaling history for all runtimes.
218
+ */
219
+ getAllHistory() {
220
+ return new Map(this.history);
221
+ }
222
+ /**
223
+ * Subscribe to scaling decisions. Returns an unsubscribe function.
224
+ */
225
+ onScalingDecision(listener) {
226
+ this.listeners.push(listener);
227
+ return () => {
228
+ const index = this.listeners.indexOf(listener);
229
+ if (index !== -1) {
230
+ this.listeners.splice(index, 1);
231
+ }
232
+ };
233
+ }
234
+ /**
235
+ * Suggest a scaling policy based on current runtime metrics.
236
+ * Uses observed metrics to derive sensible defaults.
237
+ */
238
+ getRecommendedPolicy(runtime) {
239
+ const metrics = this.collectMetrics(runtime);
240
+ // Base recommendations on current observed load
241
+ const recommendedTargetRps = metrics.currentRps > 0 ? Math.ceil(metrics.currentRps * 1.5) : DEFAULT_POLICY.targetRps;
242
+ const recommendedTargetLatency = metrics.currentLatencyP95 > 0 ? Math.ceil(metrics.currentLatencyP95 * 1.25) : DEFAULT_POLICY.targetLatencyMs;
243
+ const recommendedMinInstances = metrics.currentRps > 0
244
+ ? Math.max(1, Math.ceil(metrics.currentRps / recommendedTargetRps))
245
+ : DEFAULT_POLICY.minInstances;
246
+ const recommendedMaxInstances = Math.max(recommendedMinInstances * 3, DEFAULT_POLICY.maxInstances);
247
+ return {
248
+ runtime,
249
+ minInstances: recommendedMinInstances,
250
+ maxInstances: recommendedMaxInstances,
251
+ targetCpuUtilization: DEFAULT_POLICY.targetCpuUtilization,
252
+ targetLatencyMs: recommendedTargetLatency,
253
+ targetRps: recommendedTargetRps,
254
+ scaleUpCooldownMs: DEFAULT_POLICY.scaleUpCooldownMs,
255
+ scaleDownCooldownMs: DEFAULT_POLICY.scaleDownCooldownMs,
256
+ scaleUpStep: DEFAULT_POLICY.scaleUpStep,
257
+ scaleDownStep: DEFAULT_POLICY.scaleDownStep,
258
+ };
259
+ }
260
+ /**
261
+ * Clear all history, policies, and state.
262
+ */
263
+ reset() {
264
+ this.stop();
265
+ this.policies.clear();
266
+ this.history.clear();
267
+ this.listeners = [];
268
+ }
269
+ /**
270
+ * Collect current scaling metrics from the RuntimeMetricsDashboard.
271
+ */
272
+ collectMetrics(runtime) {
273
+ const executionMetrics = this.dashboard.getMetrics(runtime);
274
+ if (!executionMetrics) {
275
+ return {
276
+ currentRps: 0,
277
+ currentLatencyP95: 0,
278
+ currentCpuUtilization: 0,
279
+ instanceUtilization: 0,
280
+ };
281
+ }
282
+ const policy = this.policies.get(runtime);
283
+ const maxInstances = policy?.maxInstances ?? DEFAULT_POLICY.maxInstances;
284
+ const minInstances = policy?.minInstances ?? DEFAULT_POLICY.minInstances;
285
+ // Estimate current instance count from total executions and RPS
286
+ // In the absence of a direct instance count, use minInstances as the baseline
287
+ const currentInstances = Math.max(minInstances, 1);
288
+ return {
289
+ currentRps: executionMetrics.throughput.requestsPerSecond,
290
+ currentLatencyP95: executionMetrics.latency.p95,
291
+ currentCpuUtilization: executionMetrics.resourceUsage.avgCpuMs > 0
292
+ ? Math.min(100, (executionMetrics.resourceUsage.avgCpuMs / 1000) * 100)
293
+ : 0,
294
+ instanceUtilization: maxInstances > 0 ? (currentInstances / maxInstances) * 100 : 0,
295
+ };
296
+ }
297
+ /**
298
+ * Create a no-change decision with the given reason.
299
+ */
300
+ createNoChangeDecision(runtime, currentInstances, reason) {
301
+ return {
302
+ runtime,
303
+ action: "no_change",
304
+ currentInstances,
305
+ desiredInstances: currentInstances,
306
+ reason,
307
+ timestamp: Date.now(),
308
+ metrics: {
309
+ currentRps: 0,
310
+ currentLatencyP95: 0,
311
+ currentCpuUtilization: 0,
312
+ instanceUtilization: 0,
313
+ },
314
+ };
315
+ }
316
+ /**
317
+ * Get or create history entry for a runtime.
318
+ */
319
+ getOrCreateHistory(runtime) {
320
+ let history = this.history.get(runtime);
321
+ if (!history) {
322
+ history = {
323
+ decisions: [],
324
+ scaleUpCount: 0,
325
+ scaleDownCount: 0,
326
+ lastScaleUp: 0,
327
+ lastScaleDown: 0,
328
+ };
329
+ this.history.set(runtime, history);
330
+ }
331
+ return history;
332
+ }
333
+ /**
334
+ * Record a scaling decision in the history.
335
+ */
336
+ recordDecision(runtime, decision) {
337
+ const history = this.getOrCreateHistory(runtime);
338
+ history.decisions.push(decision);
339
+ // Prune old decisions to avoid unbounded growth
340
+ if (history.decisions.length > MAX_HISTORY_DECISIONS) {
341
+ history.decisions = history.decisions.slice(-MAX_HISTORY_DECISIONS / 2);
342
+ }
343
+ if (decision.action === "scale_up") {
344
+ history.scaleUpCount++;
345
+ history.lastScaleUp = decision.timestamp;
346
+ }
347
+ else if (decision.action === "scale_down") {
348
+ history.scaleDownCount++;
349
+ history.lastScaleDown = decision.timestamp;
350
+ }
351
+ }
352
+ /**
353
+ * Notify all registered listeners of a scaling decision.
354
+ */
355
+ notifyListeners(decision) {
356
+ for (const listener of this.listeners) {
357
+ try {
358
+ listener(decision);
359
+ }
360
+ catch {
361
+ // Listener errors should not break the evaluation loop
362
+ }
363
+ }
364
+ }
365
+ }
366
+ //# sourceMappingURL=RuntimeAutoScaler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeAutoScaler.js","sourceRoot":"","sources":["../../src/marketplace/RuntimeAutoScaler.ts"],"names":[],"mappings":"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"}