@blokjs/runner 0.6.21 → 0.7.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.
- package/dist/Blok.d.ts +2 -0
- package/dist/Blok.js +42 -110
- package/dist/Blok.js.map +1 -1
- package/dist/DefaultLogger.d.ts +13 -0
- package/dist/DefaultLogger.js +25 -0
- package/dist/DefaultLogger.js.map +1 -1
- package/dist/RunnerSteps.d.ts +23 -0
- package/dist/RunnerSteps.js +128 -87
- package/dist/RunnerSteps.js.map +1 -1
- package/dist/SubworkflowNode.js +19 -0
- package/dist/SubworkflowNode.js.map +1 -1
- package/dist/TriggerBase.d.ts +12 -0
- package/dist/TriggerBase.js +216 -181
- package/dist/TriggerBase.js.map +1 -1
- package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +9 -0
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js +76 -6
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -1
- package/dist/index.d.ts +4 -39
- package/dist/index.js +7 -32
- package/dist/index.js.map +1 -1
- package/dist/monitoring/JanitorMetrics.d.ts +3 -0
- package/dist/monitoring/JanitorMetrics.js +11 -0
- package/dist/monitoring/JanitorMetrics.js.map +1 -1
- package/dist/monitoring/ProcessErrorMetrics.d.ts +32 -0
- package/dist/monitoring/ProcessErrorMetrics.js +43 -0
- package/dist/monitoring/ProcessErrorMetrics.js.map +1 -0
- package/dist/monitoring/PrometheusMetricsBridge.d.ts +7 -0
- package/dist/monitoring/PrometheusMetricsBridge.js +8 -2
- package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -1
- package/dist/monitoring/SubworkflowMetrics.d.ts +25 -0
- package/dist/monitoring/SubworkflowMetrics.js +38 -0
- package/dist/monitoring/SubworkflowMetrics.js.map +1 -0
- package/dist/observability/ErrorSink.d.ts +23 -0
- package/dist/observability/ErrorSink.js +32 -0
- package/dist/observability/ErrorSink.js.map +1 -0
- package/dist/observability/SentryIntegration.d.ts +9 -0
- package/dist/observability/SentryIntegration.js +31 -0
- package/dist/observability/SentryIntegration.js.map +1 -0
- package/dist/scheduling/DebounceCoordinator.d.ts +7 -53
- package/dist/scheduling/DebounceCoordinator.js +8 -207
- package/dist/scheduling/DebounceCoordinator.js.map +1 -1
- package/dist/tracing/InMemoryRunStore.d.ts +5 -1
- package/dist/tracing/InMemoryRunStore.js +14 -0
- package/dist/tracing/InMemoryRunStore.js.map +1 -1
- package/dist/tracing/Janitor.js +3 -0
- package/dist/tracing/Janitor.js.map +1 -1
- package/dist/tracing/PostgresRunStore.d.ts +4 -1
- package/dist/tracing/PostgresRunStore.js +73 -3
- package/dist/tracing/PostgresRunStore.js.map +1 -1
- package/dist/tracing/RunStore.d.ts +17 -1
- package/dist/tracing/RunTracker.d.ts +13 -34
- package/dist/tracing/RunTracker.js +62 -32
- package/dist/tracing/RunTracker.js.map +1 -1
- package/dist/tracing/SqliteRunStore.d.ts +4 -1
- package/dist/tracing/SqliteRunStore.js +60 -0
- package/dist/tracing/SqliteRunStore.js.map +1 -1
- package/dist/tracing/TraceRouter.d.ts +13 -0
- package/dist/tracing/TraceRouter.js +43 -11
- package/dist/tracing/TraceRouter.js.map +1 -1
- package/dist/tracing/TracingLogger.js +22 -0
- package/dist/tracing/TracingLogger.js.map +1 -1
- package/dist/tracing/createStore.js +51 -22
- package/dist/tracing/createStore.js.map +1 -1
- package/dist/tracing/types.d.ts +22 -0
- package/dist/types/GlobalOptions.d.ts +5 -7
- package/dist/workflow/WorkflowNormalizer.js +63 -0
- package/dist/workflow/WorkflowNormalizer.js.map +1 -1
- package/package.json +7 -4
- package/dist/cache/NodeResultCache.d.ts +0 -286
- package/dist/cache/NodeResultCache.js +0 -506
- package/dist/cache/NodeResultCache.js.map +0 -1
- package/dist/cache/index.d.ts +0 -1
- package/dist/cache/index.js +0 -2
- package/dist/cache/index.js.map +0 -1
- package/dist/concurrency/ConcurrencyBackend.d.ts +0 -61
- package/dist/concurrency/ConcurrencyBackend.js +0 -20
- package/dist/concurrency/ConcurrencyBackend.js.map +0 -1
- package/dist/concurrency/NatsKvConcurrencyBackend.d.ts +0 -64
- package/dist/concurrency/NatsKvConcurrencyBackend.js +0 -310
- package/dist/concurrency/NatsKvConcurrencyBackend.js.map +0 -1
- package/dist/concurrency/RedisConcurrencyBackend.d.ts +0 -64
- package/dist/concurrency/RedisConcurrencyBackend.js +0 -374
- package/dist/concurrency/RedisConcurrencyBackend.js.map +0 -1
- package/dist/concurrency/createConcurrencyBackend.d.ts +0 -24
- package/dist/concurrency/createConcurrencyBackend.js +0 -38
- package/dist/concurrency/createConcurrencyBackend.js.map +0 -1
- package/dist/graphql/GraphQLSchemaGenerator.d.ts +0 -129
- package/dist/graphql/GraphQLSchemaGenerator.js +0 -425
- package/dist/graphql/GraphQLSchemaGenerator.js.map +0 -1
- package/dist/integrations/APMIntegration.d.ts +0 -141
- package/dist/integrations/APMIntegration.js +0 -212
- package/dist/integrations/APMIntegration.js.map +0 -1
- package/dist/integrations/AzureMonitorIntegration.d.ts +0 -118
- package/dist/integrations/AzureMonitorIntegration.js +0 -254
- package/dist/integrations/AzureMonitorIntegration.js.map +0 -1
- package/dist/integrations/CloudWatchIntegration.d.ts +0 -135
- package/dist/integrations/CloudWatchIntegration.js +0 -293
- package/dist/integrations/CloudWatchIntegration.js.map +0 -1
- package/dist/integrations/SentryIntegration.d.ts +0 -153
- package/dist/integrations/SentryIntegration.js +0 -200
- package/dist/integrations/SentryIntegration.js.map +0 -1
- package/dist/integrations/index.d.ts +0 -19
- package/dist/integrations/index.js +0 -16
- package/dist/integrations/index.js.map +0 -1
- package/dist/marketplace/RuntimeAutoScaler.d.ts +0 -148
- package/dist/marketplace/RuntimeAutoScaler.js +0 -366
- package/dist/marketplace/RuntimeAutoScaler.js.map +0 -1
- package/dist/marketplace/RuntimeCatalog.d.ts +0 -180
- package/dist/marketplace/RuntimeCatalog.js +0 -339
- package/dist/marketplace/RuntimeCatalog.js.map +0 -1
- package/dist/marketplace/RuntimeDiscovery.d.ts +0 -86
- package/dist/marketplace/RuntimeDiscovery.js +0 -231
- package/dist/marketplace/RuntimeDiscovery.js.map +0 -1
- package/dist/marketplace/RuntimeHealthMonitor.d.ts +0 -100
- package/dist/marketplace/RuntimeHealthMonitor.js +0 -241
- package/dist/marketplace/RuntimeHealthMonitor.js.map +0 -1
- package/dist/marketplace/RuntimeMetricsDashboard.d.ts +0 -113
- package/dist/marketplace/RuntimeMetricsDashboard.js +0 -293
- package/dist/marketplace/RuntimeMetricsDashboard.js.map +0 -1
- package/dist/openapi/OpenAPIGenerator.d.ts +0 -192
- package/dist/openapi/OpenAPIGenerator.js +0 -378
- package/dist/openapi/OpenAPIGenerator.js.map +0 -1
- package/dist/openapi/index.d.ts +0 -20
- package/dist/openapi/index.js +0 -20
- package/dist/openapi/index.js.map +0 -1
- package/dist/scheduling/DebounceBackend.d.ts +0 -108
- package/dist/scheduling/DebounceBackend.js +0 -23
- package/dist/scheduling/DebounceBackend.js.map +0 -1
- package/dist/scheduling/NatsKvDebounceBackend.d.ts +0 -53
- package/dist/scheduling/NatsKvDebounceBackend.js +0 -334
- package/dist/scheduling/NatsKvDebounceBackend.js.map +0 -1
- package/dist/scheduling/RedisDebounceBackend.d.ts +0 -49
- package/dist/scheduling/RedisDebounceBackend.js +0 -356
- package/dist/scheduling/RedisDebounceBackend.js.map +0 -1
- package/dist/scheduling/createDebounceBackend.d.ts +0 -25
- package/dist/scheduling/createDebounceBackend.js +0 -39
- package/dist/scheduling/createDebounceBackend.js.map +0 -1
- package/dist/security/ABAC.d.ts +0 -224
- package/dist/security/ABAC.js +0 -380
- package/dist/security/ABAC.js.map +0 -1
- package/dist/security/AuditLogger.d.ts +0 -242
- package/dist/security/AuditLogger.js +0 -317
- package/dist/security/AuditLogger.js.map +0 -1
- package/dist/security/AuthMiddleware.d.ts +0 -162
- package/dist/security/AuthMiddleware.js +0 -289
- package/dist/security/AuthMiddleware.js.map +0 -1
- package/dist/security/EncryptionAtRest.d.ts +0 -206
- package/dist/security/EncryptionAtRest.js +0 -236
- package/dist/security/EncryptionAtRest.js.map +0 -1
- package/dist/security/OAuthProvider.d.ts +0 -334
- package/dist/security/OAuthProvider.js +0 -719
- package/dist/security/OAuthProvider.js.map +0 -1
- package/dist/security/PIIDetector.d.ts +0 -233
- package/dist/security/PIIDetector.js +0 -354
- package/dist/security/PIIDetector.js.map +0 -1
- package/dist/security/RBAC.d.ts +0 -143
- package/dist/security/RBAC.js +0 -285
- package/dist/security/RBAC.js.map +0 -1
- package/dist/security/SecretManager.d.ts +0 -652
- package/dist/security/SecretManager.js +0 -1147
- package/dist/security/SecretManager.js.map +0 -1
- package/dist/security/TLSConfig.d.ts +0 -305
- package/dist/security/TLSConfig.js +0 -550
- package/dist/security/TLSConfig.js.map +0 -1
- package/dist/security/index.d.ts +0 -81
- package/dist/security/index.js +0 -82
- package/dist/security/index.js.map +0 -1
|
@@ -1,366 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RuntimeAutoScaler.js","sourceRoot":"","sources":["../../src/marketplace/RuntimeAutoScaler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmDH,MAAM,cAAc,GAAmC;IACtD,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,EAAE;IAChB,oBAAoB,EAAE,EAAE;IACxB,eAAe,EAAE,GAAG;IACpB,SAAS,EAAE,GAAG;IACd,iBAAiB,EAAE,MAAM;IACzB,mBAAmB,EAAE,OAAO;IAC5B,WAAW,EAAE,CAAC;IACd,aAAa,EAAE,CAAC;CAChB,CAAC;AAEF,MAAM,cAAc,GAAqB;IACxC,oBAAoB,EAAE,MAAM;IAC5B,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,KAAK;CACb,CAAC;AAEF,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAiB;IACrB,QAAQ,GAAoC,IAAI,GAAG,EAAE,CAAC;IACtD,OAAO,GAAqC,IAAI,GAAG,EAAE,CAAC;IACtD,SAAS,GAAsB,EAAE,CAAC;IAClC,QAAQ,CAA6B;IACrC,SAAS,CAA0B;IACnC,MAAM,CAAmB;IAEjC,YAAY,SAAkC,EAAE,MAAkC;QACjF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG;YACb,oBAAoB,EAAE,MAAM,EAAE,oBAAoB,IAAI,cAAc,CAAC,oBAAoB;YACzF,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,cAAc,CAAC,OAAO;YAClD,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,cAAc,CAAC,MAAM;SAC/C,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,MAAqB;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE;YACjC,GAAG,cAAc;YACjB,GAAG,MAAM;SACT,CAAC,CAAC;QAEH,qDAAqD;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE;gBAChC,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,CAAC;gBACf,cAAc,EAAE,CAAC;gBACjB,WAAW,EAAE,CAAC;gBACd,aAAa,EAAE,CAAC;aAChB,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAoB;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAoB;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO;QACR,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACtC,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;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAoB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;QACjG,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,qEAAqE;QACrE,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAChC,MAAM,CAAC,YAAY,EACnB,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,mBAAmB,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,CAC5F,CAAC;QAEF,IAAI,gBAAgB,GAAG,gBAAgB,CAAC;QACxC,IAAI,MAAM,GAA8B,WAAW,CAAC;QACpD,IAAI,MAAM,GAAG,0CAA0C,CAAC;QAExD,8BAA8B;QAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,GAAG,gBAAgB,CAAC;QAC7E,MAAM,eAAe,GAAG,OAAO,CAAC,iBAAiB,GAAG,MAAM,CAAC,eAAe,CAAC;QAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAEhF,IAAI,WAAW,IAAI,eAAe,EAAE,CAAC;YACpC,0BAA0B;YAC1B,MAAM,oBAAoB,GAAG,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;gBAChF,MAAM,GAAG,oCAAoC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;YACjI,CAAC;iBAAM,CAAC;gBACP,gBAAgB,GAAG,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC;gBACzD,MAAM,GAAG,UAAU,CAAC;gBAEpB,MAAM,OAAO,GAAa,EAAE,CAAC;gBAC7B,IAAI,WAAW,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CACX,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,MAAM,CAAC,SAAS,GAAG,gBAAgB,KAAK,MAAM,CAAC,SAAS,eAAe,gBAAgB,GAAG,CACjJ,CAAC;gBACH,CAAC;gBACD,IAAI,eAAe,EAAE,CAAC;oBACrB,OAAO,CAAC,IAAI,CACX,eAAe,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,MAAM,CAAC,eAAe,IAAI,CAClG,CAAC;gBACH,CAAC;gBACD,IAAI,WAAW,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CACX,mBAAmB,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,MAAM,CAAC,oBAAoB,GAAG,CAC7G,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,eAAe,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,CAAC;QACF,CAAC;aAAM,CAAC;YACP,kCAAkC;YAClC,MAAM,YAAY,GAAG,gBAAgB,GAAG,MAAM,CAAC,YAAY,CAAC;YAC5D,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;YAC1F,MAAM,aAAa,GAAG,OAAO,CAAC,iBAAiB,IAAI,MAAM,CAAC,eAAe,CAAC;YAE1E,IAAI,YAAY,IAAI,kBAAkB,IAAI,aAAa,EAAE,CAAC;gBACzD,4BAA4B;gBAC5B,MAAM,sBAAsB,GAAG,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;gBAC3D,IAAI,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;oBACtF,MAAM,GAAG,wCAAwC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,GAAG,sBAAsB,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;gBACzI,CAAC;qBAAM,CAAC;oBACP,gBAAgB,GAAG,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC;oBAC3D,MAAM,GAAG,YAAY,CAAC;oBACtB,MAAM,GAAG,qBAAqB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,MAAM,CAAC,SAAS,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,QAAQ,gBAAgB,GAAG,CAAC,uBAAuB,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,MAAM,CAAC,eAAe,IAAI,CAAC;gBACrQ,CAAC;YACF,CAAC;QACF,CAAC;QAED,8CAA8C;QAC9C,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAElG,0EAA0E;QAC1E,IAAI,gBAAgB,KAAK,gBAAgB,EAAE,CAAC;YAC3C,MAAM,GAAG,WAAW,CAAC;YACrB,IAAI,gBAAgB,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,WAAW,IAAI,eAAe,CAAC,EAAE,CAAC;gBACjF,MAAM,GAAG,wBAAwB,MAAM,CAAC,YAAY,mCAAmC,CAAC;YACzF,CAAC;QACF,CAAC;QAED,MAAM,QAAQ,GAAoB;YACjC,OAAO;YACP,MAAM;YACN,gBAAgB;YAChB,gBAAgB;YAChB,MAAM;YACN,SAAS,EAAE,GAAG;YACd,OAAO;SACP,CAAC;QAEF,oBAAoB;QACpB,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEvC,mBAAmB;QACnB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE/B,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,WAAW;QACV,MAAM,SAAS,GAAsB,EAAE,CAAC;QAExC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACxC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAoB;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,aAAa;QACZ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,QAAyB;QAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE9B,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;;;OAGG;IACH,oBAAoB,CAAC,OAAoB;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE7C,gDAAgD;QAChD,MAAM,oBAAoB,GACzB,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC;QAEzF,MAAM,wBAAwB,GAC7B,OAAO,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC;QAE9G,MAAM,uBAAuB,GAC5B,OAAO,CAAC,UAAU,GAAG,CAAC;YACrB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,oBAAoB,CAAC,CAAC;YACnE,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC;QAEhC,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;QAEnG,OAAO;YACN,OAAO;YACP,YAAY,EAAE,uBAAuB;YACrC,YAAY,EAAE,uBAAuB;YACrC,oBAAoB,EAAE,cAAc,CAAC,oBAAoB;YACzD,eAAe,EAAE,wBAAwB;YACzC,SAAS,EAAE,oBAAoB;YAC/B,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;YACnD,mBAAmB,EAAE,cAAc,CAAC,mBAAmB;YACvD,WAAW,EAAE,cAAc,CAAC,WAAW;YACvC,aAAa,EAAE,cAAc,CAAC,aAAa;SAC3C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAoB;QAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE5D,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvB,OAAO;gBACN,UAAU,EAAE,CAAC;gBACb,iBAAiB,EAAE,CAAC;gBACpB,qBAAqB,EAAE,CAAC;gBACxB,mBAAmB,EAAE,CAAC;aACtB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,cAAc,CAAC,YAAY,CAAC;QACzE,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,cAAc,CAAC,YAAY,CAAC;QAEzE,gEAAgE;QAChE,8EAA8E;QAC9E,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAEnD,OAAO;YACN,UAAU,EAAE,gBAAgB,CAAC,UAAU,CAAC,iBAAiB;YACzD,iBAAiB,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG;YAC/C,qBAAqB,EACpB,gBAAgB,CAAC,aAAa,CAAC,QAAQ,GAAG,CAAC;gBAC1C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;gBACvE,CAAC,CAAC,CAAC;YACL,mBAAmB,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;SACnF,CAAC;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,OAAoB,EAAE,gBAAwB,EAAE,MAAc;QAC5F,OAAO;YACN,OAAO;YACP,MAAM,EAAE,WAAW;YACnB,gBAAgB;YAChB,gBAAgB,EAAE,gBAAgB;YAClC,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE;gBACR,UAAU,EAAE,CAAC;gBACb,iBAAiB,EAAE,CAAC;gBACpB,qBAAqB,EAAE,CAAC;gBACxB,mBAAmB,EAAE,CAAC;aACtB;SACD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,OAAoB;QAC9C,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,GAAG;gBACT,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,CAAC;gBACf,cAAc,EAAE,CAAC;gBACjB,WAAW,EAAE,CAAC;gBACd,aAAa,EAAE,CAAC;aAChB,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAoB,EAAE,QAAyB;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjC,gDAAgD;QAChD,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;YACtD,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACpC,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC1C,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YAC7C,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,CAAC,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC5C,CAAC;IACF,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAyB;QAChD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC;gBACJ,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACR,uDAAuD;YACxD,CAAC;QACF,CAAC;IACF,CAAC;CACD"}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RuntimeCatalog - Central Registry for Runtime Packages
|
|
3
|
-
*
|
|
4
|
-
* Manages runtime package metadata, search, versioning, and statistics
|
|
5
|
-
* for the Blok marketplace. Supports publishing, discovery, and filtering
|
|
6
|
-
* of runtime packages across all supported language runtimes.
|
|
7
|
-
*/
|
|
8
|
-
import type { RuntimeKind } from "../adapters/RuntimeAdapter";
|
|
9
|
-
export interface RuntimeNodeInfo {
|
|
10
|
-
name: string;
|
|
11
|
-
description: string;
|
|
12
|
-
inputs: Record<string, string>;
|
|
13
|
-
outputs: Record<string, string>;
|
|
14
|
-
}
|
|
15
|
-
export interface RuntimePackageManifest {
|
|
16
|
-
name: string;
|
|
17
|
-
version: string;
|
|
18
|
-
runtime: RuntimeKind;
|
|
19
|
-
description: string;
|
|
20
|
-
author: string;
|
|
21
|
-
license: string;
|
|
22
|
-
repository?: string;
|
|
23
|
-
tags: string[];
|
|
24
|
-
protocols: ("http" | "grpc" | "both")[];
|
|
25
|
-
dockerImage?: string;
|
|
26
|
-
minBlokVersion?: string;
|
|
27
|
-
/**
|
|
28
|
-
* Minimum runtime versions required by this package.
|
|
29
|
-
* Keys are runtime kind identifiers, values are semver constraints.
|
|
30
|
-
* @example { python3: ">=3.11.0", go: ">=1.21.0" }
|
|
31
|
-
*/
|
|
32
|
-
runtimeVersions?: Partial<Record<string, string>>;
|
|
33
|
-
nodeCount: number;
|
|
34
|
-
nodes: RuntimeNodeInfo[];
|
|
35
|
-
createdAt: number;
|
|
36
|
-
updatedAt: number;
|
|
37
|
-
downloads: number;
|
|
38
|
-
rating: number;
|
|
39
|
-
verified: boolean;
|
|
40
|
-
}
|
|
41
|
-
export interface CatalogSearchOptions {
|
|
42
|
-
query?: string;
|
|
43
|
-
runtime?: RuntimeKind;
|
|
44
|
-
tags?: string[];
|
|
45
|
-
verified?: boolean;
|
|
46
|
-
sortBy?: "name" | "downloads" | "rating" | "updated";
|
|
47
|
-
sortOrder?: "asc" | "desc";
|
|
48
|
-
limit?: number;
|
|
49
|
-
offset?: number;
|
|
50
|
-
}
|
|
51
|
-
export interface CatalogSearchResult {
|
|
52
|
-
packages: RuntimePackageManifest[];
|
|
53
|
-
total: number;
|
|
54
|
-
page: number;
|
|
55
|
-
pageSize: number;
|
|
56
|
-
}
|
|
57
|
-
export interface CatalogStats {
|
|
58
|
-
totalPackages: number;
|
|
59
|
-
totalVersions: number;
|
|
60
|
-
packagesByRuntime: Record<string, number>;
|
|
61
|
-
totalDownloads: number;
|
|
62
|
-
verifiedCount: number;
|
|
63
|
-
averageRating: number;
|
|
64
|
-
}
|
|
65
|
-
export declare class RuntimeCatalog {
|
|
66
|
-
private packages;
|
|
67
|
-
constructor();
|
|
68
|
-
/**
|
|
69
|
-
* Publish a runtime package to the catalog.
|
|
70
|
-
*
|
|
71
|
-
* @param manifest - The package manifest to publish
|
|
72
|
-
* @throws Error if required fields are missing or invalid
|
|
73
|
-
*/
|
|
74
|
-
publish(manifest: RuntimePackageManifest): void;
|
|
75
|
-
/**
|
|
76
|
-
* Remove a specific version of a package from the catalog.
|
|
77
|
-
*
|
|
78
|
-
* @param name - The package name
|
|
79
|
-
* @param version - The version to remove
|
|
80
|
-
* @returns true if the version was removed, false if not found
|
|
81
|
-
*/
|
|
82
|
-
unpublish(name: string, version: string): boolean;
|
|
83
|
-
/**
|
|
84
|
-
* Get a package manifest by name and optional version.
|
|
85
|
-
* Returns the latest version if no version is specified.
|
|
86
|
-
*
|
|
87
|
-
* @param name - The package name
|
|
88
|
-
* @param version - Optional specific version
|
|
89
|
-
* @returns The manifest if found, undefined otherwise
|
|
90
|
-
*/
|
|
91
|
-
get(name: string, version?: string): RuntimePackageManifest | undefined;
|
|
92
|
-
/**
|
|
93
|
-
* Get all available versions of a package, sorted by semver descending.
|
|
94
|
-
*
|
|
95
|
-
* @param name - The package name
|
|
96
|
-
* @returns Array of version strings sorted by semver (newest first)
|
|
97
|
-
*/
|
|
98
|
-
getVersions(name: string): string[];
|
|
99
|
-
/**
|
|
100
|
-
* Get the latest version of a package by semver ordering.
|
|
101
|
-
*
|
|
102
|
-
* @param name - The package name
|
|
103
|
-
* @returns The latest version string, or undefined if package not found
|
|
104
|
-
*/
|
|
105
|
-
getLatestVersion(name: string): string | undefined;
|
|
106
|
-
/**
|
|
107
|
-
* Search the catalog with filtering, sorting, and pagination.
|
|
108
|
-
*
|
|
109
|
-
* @param options - Search and filter options
|
|
110
|
-
* @returns Paginated search results
|
|
111
|
-
*/
|
|
112
|
-
search(options: CatalogSearchOptions): CatalogSearchResult;
|
|
113
|
-
/**
|
|
114
|
-
* List all latest-version packages for a specific runtime.
|
|
115
|
-
*
|
|
116
|
-
* @param runtime - The runtime kind to filter by
|
|
117
|
-
* @returns Array of matching package manifests
|
|
118
|
-
*/
|
|
119
|
-
listByRuntime(runtime: RuntimeKind): RuntimePackageManifest[];
|
|
120
|
-
/**
|
|
121
|
-
* Get the most popular packages sorted by download count.
|
|
122
|
-
*
|
|
123
|
-
* @param limit - Maximum number of results (default 10)
|
|
124
|
-
* @returns Array of package manifests sorted by downloads descending
|
|
125
|
-
*/
|
|
126
|
-
getPopular(limit?: number): RuntimePackageManifest[];
|
|
127
|
-
/**
|
|
128
|
-
* Get all verified packages.
|
|
129
|
-
*
|
|
130
|
-
* @returns Array of verified package manifests
|
|
131
|
-
*/
|
|
132
|
-
getVerified(): RuntimePackageManifest[];
|
|
133
|
-
/**
|
|
134
|
-
* Increment the download counter for a specific package version.
|
|
135
|
-
*
|
|
136
|
-
* @param name - The package name
|
|
137
|
-
* @param version - The package version
|
|
138
|
-
*/
|
|
139
|
-
incrementDownloads(name: string, version: string): void;
|
|
140
|
-
/**
|
|
141
|
-
* Set the rating for a specific package version.
|
|
142
|
-
*
|
|
143
|
-
* @param name - The package name
|
|
144
|
-
* @param version - The package version
|
|
145
|
-
* @param rating - The rating value (0-5)
|
|
146
|
-
* @throws Error if rating is out of range
|
|
147
|
-
*/
|
|
148
|
-
setRating(name: string, version: string, rating: number): void;
|
|
149
|
-
/**
|
|
150
|
-
* Get overall catalog statistics.
|
|
151
|
-
*
|
|
152
|
-
* @returns Aggregated catalog statistics
|
|
153
|
-
*/
|
|
154
|
-
getStats(): CatalogStats;
|
|
155
|
-
/**
|
|
156
|
-
* Serialize the catalog to a JSON string for persistence.
|
|
157
|
-
*
|
|
158
|
-
* @returns JSON string representation of the catalog
|
|
159
|
-
*/
|
|
160
|
-
toJSON(): string;
|
|
161
|
-
/**
|
|
162
|
-
* Deserialize a catalog from a JSON string.
|
|
163
|
-
*
|
|
164
|
-
* @param json - The JSON string to parse
|
|
165
|
-
* @returns A new RuntimeCatalog instance populated with the data
|
|
166
|
-
*/
|
|
167
|
-
static fromJSON(json: string): RuntimeCatalog;
|
|
168
|
-
/**
|
|
169
|
-
* Get the latest version manifest for every package in the catalog.
|
|
170
|
-
*/
|
|
171
|
-
private getAllLatestPackages;
|
|
172
|
-
/**
|
|
173
|
-
* Validate that a manifest has all required fields.
|
|
174
|
-
*/
|
|
175
|
-
private validateManifest;
|
|
176
|
-
/**
|
|
177
|
-
* Compare two semver strings. Returns negative if a < b, 0 if equal, positive if a > b.
|
|
178
|
-
*/
|
|
179
|
-
private compareSemver;
|
|
180
|
-
}
|