@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.
- package/dist/Blok.d.ts +19 -0
- package/dist/Blok.js +184 -0
- package/dist/Blok.js.map +1 -0
- package/dist/BlokResponse.d.ts +16 -0
- package/dist/BlokResponse.js +28 -0
- package/dist/BlokResponse.js.map +1 -0
- package/dist/Configuration.d.ts +37 -0
- package/dist/Configuration.js +248 -0
- package/dist/Configuration.js.map +1 -0
- package/dist/ConfigurationResolver.d.ts +7 -0
- package/dist/ConfigurationResolver.js +15 -0
- package/dist/ConfigurationResolver.js.map +1 -0
- package/dist/DefaultLogger.d.ts +65 -0
- package/dist/DefaultLogger.js +101 -0
- package/dist/DefaultLogger.js.map +1 -0
- package/dist/LocalStorage.d.ts +7 -0
- package/dist/LocalStorage.js +56 -0
- package/dist/LocalStorage.js.map +1 -0
- package/dist/MemoryUsage.d.ts +22 -0
- package/dist/MemoryUsage.js +83 -0
- package/dist/MemoryUsage.js.map +1 -0
- package/dist/NodeMap.d.ts +7 -0
- package/dist/NodeMap.js +13 -0
- package/dist/NodeMap.js.map +1 -0
- package/dist/ResolverBase.d.ts +8 -0
- package/dist/ResolverBase.js +18 -0
- package/dist/ResolverBase.js.map +1 -0
- package/dist/Runner.d.ts +25 -0
- package/dist/Runner.js +32 -0
- package/dist/Runner.js.map +1 -0
- package/dist/RunnerNode.d.ts +9 -0
- package/dist/RunnerNode.js +8 -0
- package/dist/RunnerNode.js.map +1 -0
- package/dist/RunnerNodeBase.d.ts +4 -0
- package/dist/RunnerNodeBase.js +3 -0
- package/dist/RunnerNodeBase.js.map +1 -0
- package/dist/RunnerSteps.d.ts +14 -0
- package/dist/RunnerSteps.js +110 -0
- package/dist/RunnerSteps.js.map +1 -0
- package/dist/RuntimeAdapterNode.d.ts +19 -0
- package/dist/RuntimeAdapterNode.js +87 -0
- package/dist/RuntimeAdapterNode.js.map +1 -0
- package/dist/RuntimeRegistry.d.ts +61 -0
- package/dist/RuntimeRegistry.js +87 -0
- package/dist/RuntimeRegistry.js.map +1 -0
- package/dist/TriggerBase.d.ts +119 -0
- package/dist/TriggerBase.js +413 -0
- package/dist/TriggerBase.js.map +1 -0
- package/dist/adapters/BunRuntimeAdapter.d.ts +38 -0
- package/dist/adapters/BunRuntimeAdapter.js +169 -0
- package/dist/adapters/BunRuntimeAdapter.js.map +1 -0
- package/dist/adapters/DockerRuntimeAdapter.d.ts +85 -0
- package/dist/adapters/DockerRuntimeAdapter.js +298 -0
- package/dist/adapters/DockerRuntimeAdapter.js.map +1 -0
- package/dist/adapters/HttpRuntimeAdapter.d.ts +58 -0
- package/dist/adapters/HttpRuntimeAdapter.js +152 -0
- package/dist/adapters/HttpRuntimeAdapter.js.map +1 -0
- package/dist/adapters/NodeJsRuntimeAdapter.d.ts +23 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js +67 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -0
- package/dist/adapters/RuntimeAdapter.d.ts +42 -0
- package/dist/adapters/RuntimeAdapter.js +2 -0
- package/dist/adapters/RuntimeAdapter.js.map +1 -0
- package/dist/adapters/WasmRuntimeAdapter.d.ts +69 -0
- package/dist/adapters/WasmRuntimeAdapter.js +279 -0
- package/dist/adapters/WasmRuntimeAdapter.js.map +1 -0
- package/dist/cache/NodeResultCache.d.ts +286 -0
- package/dist/cache/NodeResultCache.js +499 -0
- package/dist/cache/NodeResultCache.js.map +1 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cost/CostEstimator.d.ts +57 -0
- package/dist/cost/CostEstimator.js +171 -0
- package/dist/cost/CostEstimator.js.map +1 -0
- package/dist/cost/index.d.ts +4 -0
- package/dist/cost/index.js +3 -0
- package/dist/cost/index.js.map +1 -0
- package/dist/cost/pricing.d.ts +24 -0
- package/dist/cost/pricing.js +169 -0
- package/dist/cost/pricing.js.map +1 -0
- package/dist/defineNode.d.ts +155 -0
- package/dist/defineNode.js +191 -0
- package/dist/defineNode.js.map +1 -0
- package/dist/graphql/GraphQLSchemaGenerator.d.ts +129 -0
- package/dist/graphql/GraphQLSchemaGenerator.js +425 -0
- package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -0
- package/dist/hmr/FileWatcher.d.ts +62 -0
- package/dist/hmr/FileWatcher.js +185 -0
- package/dist/hmr/FileWatcher.js.map +1 -0
- package/dist/hmr/HmrDevConsole.d.ts +13 -0
- package/dist/hmr/HmrDevConsole.js +46 -0
- package/dist/hmr/HmrDevConsole.js.map +1 -0
- package/dist/hmr/HotReloadManager.d.ts +84 -0
- package/dist/hmr/HotReloadManager.js +195 -0
- package/dist/hmr/HotReloadManager.js.map +1 -0
- package/dist/hmr/index.d.ts +39 -0
- package/dist/hmr/index.js +38 -0
- package/dist/hmr/index.js.map +1 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/APMIntegration.d.ts +141 -0
- package/dist/integrations/APMIntegration.js +212 -0
- package/dist/integrations/APMIntegration.js.map +1 -0
- package/dist/integrations/AzureMonitorIntegration.d.ts +118 -0
- package/dist/integrations/AzureMonitorIntegration.js +254 -0
- package/dist/integrations/AzureMonitorIntegration.js.map +1 -0
- package/dist/integrations/CloudWatchIntegration.d.ts +135 -0
- package/dist/integrations/CloudWatchIntegration.js +293 -0
- package/dist/integrations/CloudWatchIntegration.js.map +1 -0
- package/dist/integrations/SentryIntegration.d.ts +153 -0
- package/dist/integrations/SentryIntegration.js +200 -0
- package/dist/integrations/SentryIntegration.js.map +1 -0
- package/dist/integrations/index.d.ts +19 -0
- package/dist/integrations/index.js +16 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/marketplace/RuntimeAutoScaler.d.ts +148 -0
- package/dist/marketplace/RuntimeAutoScaler.js +366 -0
- package/dist/marketplace/RuntimeAutoScaler.js.map +1 -0
- package/dist/marketplace/RuntimeCatalog.d.ts +174 -0
- package/dist/marketplace/RuntimeCatalog.js +339 -0
- package/dist/marketplace/RuntimeCatalog.js.map +1 -0
- package/dist/marketplace/RuntimeDiscovery.d.ts +86 -0
- package/dist/marketplace/RuntimeDiscovery.js +219 -0
- package/dist/marketplace/RuntimeDiscovery.js.map +1 -0
- package/dist/marketplace/RuntimeHealthMonitor.d.ts +100 -0
- package/dist/marketplace/RuntimeHealthMonitor.js +241 -0
- package/dist/marketplace/RuntimeHealthMonitor.js.map +1 -0
- package/dist/marketplace/RuntimeMetricsDashboard.d.ts +113 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js +293 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js.map +1 -0
- package/dist/monitoring/CircuitBreaker.d.ts +107 -0
- package/dist/monitoring/CircuitBreaker.js +238 -0
- package/dist/monitoring/CircuitBreaker.js.map +1 -0
- package/dist/monitoring/DistributedTracer.d.ts +125 -0
- package/dist/monitoring/DistributedTracer.js +230 -0
- package/dist/monitoring/DistributedTracer.js.map +1 -0
- package/dist/monitoring/HealthCheck.d.ts +54 -0
- package/dist/monitoring/HealthCheck.js +102 -0
- package/dist/monitoring/HealthCheck.js.map +1 -0
- package/dist/monitoring/PerformanceProfiler.d.ts +63 -0
- package/dist/monitoring/PerformanceProfiler.js +229 -0
- package/dist/monitoring/PerformanceProfiler.js.map +1 -0
- package/dist/monitoring/PrometheusBootstrap.d.ts +30 -0
- package/dist/monitoring/PrometheusBootstrap.js +71 -0
- package/dist/monitoring/PrometheusBootstrap.js.map +1 -0
- package/dist/monitoring/PrometheusMetricsBridge.d.ts +60 -0
- package/dist/monitoring/PrometheusMetricsBridge.js +216 -0
- package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -0
- package/dist/monitoring/RateLimiter.d.ts +58 -0
- package/dist/monitoring/RateLimiter.js +128 -0
- package/dist/monitoring/RateLimiter.js.map +1 -0
- package/dist/monitoring/StructuredLogger.d.ts +131 -0
- package/dist/monitoring/StructuredLogger.js +207 -0
- package/dist/monitoring/StructuredLogger.js.map +1 -0
- package/dist/monitoring/TracingBootstrap.d.ts +69 -0
- package/dist/monitoring/TracingBootstrap.js +129 -0
- package/dist/monitoring/TracingBootstrap.js.map +1 -0
- package/dist/monitoring/TriggerMetricsCollector.d.ts +94 -0
- package/dist/monitoring/TriggerMetricsCollector.js +174 -0
- package/dist/monitoring/TriggerMetricsCollector.js.map +1 -0
- package/dist/monitoring/index.d.ts +9 -0
- package/dist/monitoring/index.js +10 -0
- package/dist/monitoring/index.js.map +1 -0
- package/dist/openapi/OpenAPIGenerator.d.ts +192 -0
- package/dist/openapi/OpenAPIGenerator.js +373 -0
- package/dist/openapi/OpenAPIGenerator.js.map +1 -0
- package/dist/openapi/index.d.ts +20 -0
- package/dist/openapi/index.js +20 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/security/ABAC.d.ts +224 -0
- package/dist/security/ABAC.js +380 -0
- package/dist/security/ABAC.js.map +1 -0
- package/dist/security/AuditLogger.d.ts +242 -0
- package/dist/security/AuditLogger.js +317 -0
- package/dist/security/AuditLogger.js.map +1 -0
- package/dist/security/AuthMiddleware.d.ts +163 -0
- package/dist/security/AuthMiddleware.js +274 -0
- package/dist/security/AuthMiddleware.js.map +1 -0
- package/dist/security/EncryptionAtRest.d.ts +206 -0
- package/dist/security/EncryptionAtRest.js +236 -0
- package/dist/security/EncryptionAtRest.js.map +1 -0
- package/dist/security/OAuthProvider.d.ts +334 -0
- package/dist/security/OAuthProvider.js +719 -0
- package/dist/security/OAuthProvider.js.map +1 -0
- package/dist/security/PIIDetector.d.ts +233 -0
- package/dist/security/PIIDetector.js +354 -0
- package/dist/security/PIIDetector.js.map +1 -0
- package/dist/security/RBAC.d.ts +143 -0
- package/dist/security/RBAC.js +285 -0
- package/dist/security/RBAC.js.map +1 -0
- package/dist/security/SecretManager.d.ts +652 -0
- package/dist/security/SecretManager.js +1146 -0
- package/dist/security/SecretManager.js.map +1 -0
- package/dist/security/TLSConfig.d.ts +305 -0
- package/dist/security/TLSConfig.js +550 -0
- package/dist/security/TLSConfig.js.map +1 -0
- package/dist/security/index.d.ts +79 -0
- package/dist/security/index.js +80 -0
- package/dist/security/index.js.map +1 -0
- package/dist/testing/TestHarness.d.ts +189 -0
- package/dist/testing/TestHarness.js +272 -0
- package/dist/testing/TestHarness.js.map +1 -0
- package/dist/testing/TestLogger.d.ts +103 -0
- package/dist/testing/TestLogger.js +153 -0
- package/dist/testing/TestLogger.js.map +1 -0
- package/dist/testing/WorkflowTestRunner.d.ts +172 -0
- package/dist/testing/WorkflowTestRunner.js +355 -0
- package/dist/testing/WorkflowTestRunner.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.js +22 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tracing/InMemoryRunStore.d.ts +44 -0
- package/dist/tracing/InMemoryRunStore.js +341 -0
- package/dist/tracing/InMemoryRunStore.js.map +1 -0
- package/dist/tracing/PostgresRunStore.d.ts +82 -0
- package/dist/tracing/PostgresRunStore.js +640 -0
- package/dist/tracing/PostgresRunStore.js.map +1 -0
- package/dist/tracing/RunStore.d.ts +38 -0
- package/dist/tracing/RunStore.js +2 -0
- package/dist/tracing/RunStore.js.map +1 -0
- package/dist/tracing/RunTracker.d.ts +75 -0
- package/dist/tracing/RunTracker.js +374 -0
- package/dist/tracing/RunTracker.js.map +1 -0
- package/dist/tracing/SqliteRunStore.d.ts +53 -0
- package/dist/tracing/SqliteRunStore.js +703 -0
- package/dist/tracing/SqliteRunStore.js.map +1 -0
- package/dist/tracing/TraceRouter.d.ts +47 -0
- package/dist/tracing/TraceRouter.js +904 -0
- package/dist/tracing/TraceRouter.js.map +1 -0
- package/dist/tracing/TracingLogger.d.ts +21 -0
- package/dist/tracing/TracingLogger.js +62 -0
- package/dist/tracing/TracingLogger.js.map +1 -0
- package/dist/tracing/createStore.d.ts +30 -0
- package/dist/tracing/createStore.js +75 -0
- package/dist/tracing/createStore.js.map +1 -0
- package/dist/tracing/index.d.ts +13 -0
- package/dist/tracing/index.js +9 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/sanitize.d.ts +7 -0
- package/dist/tracing/sanitize.js +95 -0
- package/dist/tracing/sanitize.js.map +1 -0
- package/dist/tracing/types.d.ts +178 -0
- package/dist/tracing/types.js +3 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types/Average.d.ts +11 -0
- package/dist/types/Average.js +2 -0
- package/dist/types/Average.js.map +1 -0
- package/dist/types/Condition.d.ts +8 -0
- package/dist/types/Condition.js +2 -0
- package/dist/types/Condition.js.map +1 -0
- package/dist/types/Conditions.d.ts +5 -0
- package/dist/types/Conditions.js +2 -0
- package/dist/types/Conditions.js.map +1 -0
- package/dist/types/Config.d.ts +12 -0
- package/dist/types/Config.js +2 -0
- package/dist/types/Config.js.map +1 -0
- package/dist/types/Flow.d.ts +5 -0
- package/dist/types/Flow.js +2 -0
- package/dist/types/Flow.js.map +1 -0
- package/dist/types/GlobalOptions.d.ts +11 -0
- package/dist/types/GlobalOptions.js +2 -0
- package/dist/types/GlobalOptions.js.map +1 -0
- package/dist/types/Inputs.d.ts +5 -0
- package/dist/types/Inputs.js +2 -0
- package/dist/types/Inputs.js.map +1 -0
- package/dist/types/JsonLikeObject.d.ts +3 -0
- package/dist/types/JsonLikeObject.js +2 -0
- package/dist/types/JsonLikeObject.js.map +1 -0
- package/dist/types/Mapper.d.ts +5 -0
- package/dist/types/Mapper.js +2 -0
- package/dist/types/Mapper.js.map +1 -0
- package/dist/types/Node.d.ts +10 -0
- package/dist/types/Node.js +2 -0
- package/dist/types/Node.js.map +1 -0
- package/dist/types/ParamsDictionary.d.ts +3 -0
- package/dist/types/ParamsDictionary.js +2 -0
- package/dist/types/ParamsDictionary.js.map +1 -0
- package/dist/types/Properties.d.ts +5 -0
- package/dist/types/Properties.js +2 -0
- package/dist/types/Properties.js.map +1 -0
- package/dist/types/Targets.d.ts +5 -0
- package/dist/types/Targets.js +2 -0
- package/dist/types/Targets.js.map +1 -0
- package/dist/types/Trigger.d.ts +5 -0
- package/dist/types/Trigger.js +2 -0
- package/dist/types/Trigger.js.map +1 -0
- package/dist/types/TriggerHttp.d.ts +7 -0
- package/dist/types/TriggerHttp.js +2 -0
- package/dist/types/TriggerHttp.js.map +1 -0
- package/dist/types/TriggerResponse.d.ts +6 -0
- package/dist/types/TriggerResponse.js +2 -0
- package/dist/types/TriggerResponse.js.map +1 -0
- package/dist/types/Triggers.d.ts +5 -0
- package/dist/types/Triggers.js +2 -0
- package/dist/types/Triggers.js.map +1 -0
- package/dist/types/TryCatch.d.ts +6 -0
- package/dist/types/TryCatch.js +2 -0
- package/dist/types/TryCatch.js.map +1 -0
- package/dist/visualization/NodeDependencyGraph.d.ts +76 -0
- package/dist/visualization/NodeDependencyGraph.js +418 -0
- package/dist/visualization/NodeDependencyGraph.js.map +1 -0
- package/dist/visualization/WorkflowVisualizer.d.ts +144 -0
- package/dist/visualization/WorkflowVisualizer.js +446 -0
- package/dist/visualization/WorkflowVisualizer.js.map +1 -0
- 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":"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"}
|