@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,293 @@
1
+ /**
2
+ * AWS CloudWatch Integration for Blok
3
+ *
4
+ * Sends metrics to CloudWatch Metrics and logs to CloudWatch Logs.
5
+ * Traces are exported via OTLP to the AWS Distro for OpenTelemetry (ADOT)
6
+ * Collector, which forwards them to AWS X-Ray.
7
+ *
8
+ * Uses lazy dynamic imports so AWS SDK packages are optional peer
9
+ * dependencies. If the SDK is not installed the integration silently
10
+ * degrades (init returns false).
11
+ *
12
+ * Supported transports:
13
+ * - **Metrics** – CloudWatch PutMetricData (via @aws-sdk/client-cloudwatch)
14
+ * - **Logs** – CloudWatch Logs PutLogEvents (via @aws-sdk/client-cloudwatch-logs)
15
+ * - **Traces** – OTLP → ADOT Collector → X-Ray (reuses TracingBootstrap)
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import { CloudWatchIntegration } from "@blokjs/runner";
20
+ *
21
+ * const cw = new CloudWatchIntegration({
22
+ * region: "us-east-1",
23
+ * serviceName: "blok-http",
24
+ * logGroupName: "/blok/workflows",
25
+ * namespace: "Blok",
26
+ * });
27
+ *
28
+ * await cw.init();
29
+ *
30
+ * // Send a custom metric
31
+ * await cw.putMetric("WorkflowDuration", 42, "Milliseconds");
32
+ *
33
+ * // Send a structured log entry
34
+ * await cw.putLog({ level: "info", message: "workflow completed", workflowName: "get-user" });
35
+ *
36
+ * // Enable OTLP traces via ADOT Collector
37
+ * const cw = new CloudWatchIntegration({
38
+ * region: "us-east-1",
39
+ * serviceName: "blok-http",
40
+ * enableTracing: true,
41
+ * adotEndpoint: "http://localhost:4318/v1/traces",
42
+ * });
43
+ * ```
44
+ */
45
+ export class CloudWatchIntegration {
46
+ config;
47
+ cwClient = null;
48
+ cwLogsClient = null;
49
+ initialized = false;
50
+ tracingInitialized = false;
51
+ tracingShutdown = null;
52
+ sequenceToken;
53
+ // SDK constructors (loaded lazily)
54
+ PutMetricDataCommand = null;
55
+ PutLogEventsCommand = null;
56
+ CreateLogGroupCommand = null;
57
+ CreateLogStreamCommand = null;
58
+ // stats
59
+ metricsPublished = 0;
60
+ logsPublished = 0;
61
+ metricErrors = 0;
62
+ logErrors = 0;
63
+ constructor(config) {
64
+ this.config = {
65
+ region: process.env.AWS_REGION || "us-east-1",
66
+ serviceVersion: "0.0.1",
67
+ environment: process.env.NODE_ENV || "development",
68
+ logGroupName: "/blok/workflows",
69
+ namespace: "Blok",
70
+ enableTracing: false,
71
+ adotEndpoint: "http://localhost:4318/v1/traces",
72
+ samplingRatio: 1.0,
73
+ debug: false,
74
+ ...config,
75
+ };
76
+ }
77
+ /**
78
+ * Initialize CloudWatch clients.
79
+ * Returns false if AWS SDK packages are not installed.
80
+ */
81
+ async init() {
82
+ if (this.initialized)
83
+ return true;
84
+ try {
85
+ // Dynamically load AWS SDK v3 packages
86
+ // @ts-expect-error: optional peer dependency
87
+ const cwMod = await import("@aws-sdk/client-cloudwatch");
88
+ // @ts-expect-error: optional peer dependency
89
+ const cwLogsMod = await import("@aws-sdk/client-cloudwatch-logs");
90
+ const regionConfig = { region: this.config.region };
91
+ this.cwClient = new cwMod.CloudWatchClient(regionConfig);
92
+ this.cwLogsClient = new cwLogsMod.CloudWatchLogsClient(regionConfig);
93
+ this.PutMetricDataCommand = cwMod.PutMetricDataCommand;
94
+ this.PutLogEventsCommand = cwLogsMod.PutLogEventsCommand;
95
+ this.CreateLogGroupCommand = cwLogsMod.CreateLogGroupCommand;
96
+ this.CreateLogStreamCommand = cwLogsMod.CreateLogStreamCommand;
97
+ // Ensure log group & stream exist
98
+ await this.ensureLogDestination();
99
+ this.initialized = true;
100
+ // Optionally bootstrap OTLP tracing for X-Ray via ADOT
101
+ if (this.config.enableTracing) {
102
+ await this.initTracing();
103
+ }
104
+ return true;
105
+ }
106
+ catch {
107
+ // AWS SDK packages not installed — degrade gracefully
108
+ return false;
109
+ }
110
+ }
111
+ /* ------------------------------------------------------------------ */
112
+ /* Metrics */
113
+ /* ------------------------------------------------------------------ */
114
+ /**
115
+ * Publish a custom metric to CloudWatch.
116
+ */
117
+ async putMetric(metricName, value, unit = "None", dimensions) {
118
+ if (!this.cwClient || !this.PutMetricDataCommand)
119
+ return false;
120
+ try {
121
+ const dims = {
122
+ Service: this.config.serviceName,
123
+ Environment: this.config.environment || "development",
124
+ ...dimensions,
125
+ };
126
+ const command = new this.PutMetricDataCommand({
127
+ Namespace: this.config.namespace,
128
+ MetricData: [
129
+ {
130
+ MetricName: metricName,
131
+ Value: value,
132
+ Unit: unit,
133
+ Timestamp: new Date(),
134
+ Dimensions: Object.entries(dims).map(([Name, Value]) => ({
135
+ Name,
136
+ Value,
137
+ })),
138
+ },
139
+ ],
140
+ });
141
+ await this.cwClient.send(command);
142
+ this.metricsPublished++;
143
+ return true;
144
+ }
145
+ catch {
146
+ this.metricErrors++;
147
+ return false;
148
+ }
149
+ }
150
+ /**
151
+ * Publish workflow execution metrics (duration + error count).
152
+ */
153
+ async recordWorkflowExecution(workflowName, durationMs, success) {
154
+ await this.putMetric("WorkflowDuration", durationMs, "Milliseconds", {
155
+ Workflow: workflowName,
156
+ });
157
+ if (!success) {
158
+ await this.putMetric("WorkflowErrors", 1, "Count", {
159
+ Workflow: workflowName,
160
+ });
161
+ }
162
+ }
163
+ /* ------------------------------------------------------------------ */
164
+ /* Logs */
165
+ /* ------------------------------------------------------------------ */
166
+ /**
167
+ * Send a structured log entry to CloudWatch Logs.
168
+ */
169
+ async putLog(entry) {
170
+ if (!this.cwLogsClient || !this.PutLogEventsCommand)
171
+ return false;
172
+ try {
173
+ const event = {
174
+ timestamp: Date.now(),
175
+ message: JSON.stringify({
176
+ ...entry,
177
+ service: this.config.serviceName,
178
+ version: this.config.serviceVersion,
179
+ environment: this.config.environment,
180
+ }),
181
+ };
182
+ const command = new this.PutLogEventsCommand({
183
+ logGroupName: this.config.logGroupName,
184
+ logStreamName: this.getLogStreamName(),
185
+ logEvents: [event],
186
+ sequenceToken: this.sequenceToken,
187
+ });
188
+ const result = await this.cwLogsClient.send(command);
189
+ this.sequenceToken = result?.nextSequenceToken;
190
+ this.logsPublished++;
191
+ return true;
192
+ }
193
+ catch {
194
+ this.logErrors++;
195
+ return false;
196
+ }
197
+ }
198
+ /**
199
+ * Log a workflow error to CloudWatch Logs.
200
+ */
201
+ async logWorkflowError(error, context) {
202
+ return this.putLog({
203
+ level: "error",
204
+ message: error.message,
205
+ errorName: error.name,
206
+ stack: error.stack,
207
+ ...context,
208
+ });
209
+ }
210
+ /* ------------------------------------------------------------------ */
211
+ /* Tracing (OTLP → ADOT → X-Ray) */
212
+ /* ------------------------------------------------------------------ */
213
+ async initTracing() {
214
+ try {
215
+ const { bootstrapTracing } = await import("../monitoring/TracingBootstrap");
216
+ const result = await bootstrapTracing({
217
+ serviceName: this.config.serviceName,
218
+ serviceVersion: this.config.serviceVersion,
219
+ exporter: "otlp",
220
+ endpoint: this.config.adotEndpoint || "http://localhost:4318/v1/traces",
221
+ headers: {},
222
+ samplingRatio: this.config.samplingRatio,
223
+ });
224
+ if (!result)
225
+ return false;
226
+ this.tracingShutdown = result.shutdown;
227
+ this.tracingInitialized = true;
228
+ return true;
229
+ }
230
+ catch {
231
+ return false;
232
+ }
233
+ }
234
+ /* ------------------------------------------------------------------ */
235
+ /* Lifecycle */
236
+ /* ------------------------------------------------------------------ */
237
+ isInitialized() {
238
+ return this.initialized;
239
+ }
240
+ isTracingEnabled() {
241
+ return this.tracingInitialized;
242
+ }
243
+ getStats() {
244
+ return {
245
+ initialized: this.initialized,
246
+ metricsPublished: this.metricsPublished,
247
+ logsPublished: this.logsPublished,
248
+ metricErrors: this.metricErrors,
249
+ logErrors: this.logErrors,
250
+ tracingEnabled: this.tracingInitialized,
251
+ };
252
+ }
253
+ async shutdown() {
254
+ if (this.tracingShutdown) {
255
+ await this.tracingShutdown();
256
+ }
257
+ this.initialized = false;
258
+ this.tracingInitialized = false;
259
+ }
260
+ async flush() {
261
+ // CloudWatch SDK calls are fire-and-forget; nothing buffered to flush.
262
+ // Tracing flush is handled by TracingBootstrap.
263
+ }
264
+ /* ------------------------------------------------------------------ */
265
+ /* Internal helpers */
266
+ /* ------------------------------------------------------------------ */
267
+ getLogStreamName() {
268
+ if (this.config.logStreamName)
269
+ return this.config.logStreamName;
270
+ const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
271
+ return `${this.config.serviceName}-${date}`;
272
+ }
273
+ async ensureLogDestination() {
274
+ if (!this.cwLogsClient || !this.CreateLogGroupCommand || !this.CreateLogStreamCommand)
275
+ return;
276
+ try {
277
+ await this.cwLogsClient.send(new this.CreateLogGroupCommand({ logGroupName: this.config.logGroupName }));
278
+ }
279
+ catch {
280
+ // ResourceAlreadyExistsException is expected
281
+ }
282
+ try {
283
+ await this.cwLogsClient.send(new this.CreateLogStreamCommand({
284
+ logGroupName: this.config.logGroupName,
285
+ logStreamName: this.getLogStreamName(),
286
+ }));
287
+ }
288
+ catch {
289
+ // ResourceAlreadyExistsException is expected
290
+ }
291
+ }
292
+ }
293
+ //# sourceMappingURL=CloudWatchIntegration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudWatchIntegration.js","sourceRoot":"","sources":["../../src/integrations/CloudWatchIntegration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Sentry Error Tracking Integration for Blok
3
+ *
4
+ * Provides error tracking and performance monitoring via Sentry.
5
+ * Captures workflow execution errors, node failures, and trigger issues
6
+ * with full context (workflow name, node, request ID, etc.).
7
+ *
8
+ * Uses a lightweight adapter pattern so Sentry SDK is loaded lazily
9
+ * and the framework doesn't hard-depend on @sentry/node.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { SentryIntegration } from "@blokjs/runner";
14
+ *
15
+ * const sentry = new SentryIntegration({
16
+ * dsn: process.env.SENTRY_DSN!,
17
+ * environment: process.env.NODE_ENV || "development",
18
+ * release: "blok@1.0.0",
19
+ * tracesSampleRate: 0.1,
20
+ * });
21
+ *
22
+ * await sentry.init();
23
+ *
24
+ * // In error handler
25
+ * sentry.captureWorkflowError(error, {
26
+ * workflowName: "get-user",
27
+ * workflowPath: "/users/:id",
28
+ * requestId: ctx.id,
29
+ * });
30
+ * ```
31
+ */
32
+ export interface SentryConfig {
33
+ /** Sentry DSN (Data Source Name) */
34
+ dsn: string;
35
+ /** Environment (e.g., "production", "staging", "development") */
36
+ environment?: string;
37
+ /** Release version */
38
+ release?: string;
39
+ /** Server name */
40
+ serverName?: string;
41
+ /** Sample rate for error events (0.0 to 1.0, default: 1.0) */
42
+ sampleRate?: number;
43
+ /** Sample rate for performance/transaction traces (0.0 to 1.0, default: 0.1) */
44
+ tracesSampleRate?: number;
45
+ /** Tags to add to all events */
46
+ tags?: Record<string, string>;
47
+ /** Enable debug mode */
48
+ debug?: boolean;
49
+ }
50
+ export interface WorkflowErrorContext {
51
+ workflowName: string;
52
+ workflowPath: string;
53
+ workflowVersion?: string;
54
+ requestId?: string;
55
+ nodeName?: string;
56
+ nodeType?: string;
57
+ triggerType?: string;
58
+ durationMs?: number;
59
+ userId?: string;
60
+ }
61
+ export interface SentryClient {
62
+ captureException(error: Error, context?: Record<string, unknown>): string;
63
+ captureMessage(message: string, level: "info" | "warning" | "error" | "fatal"): string;
64
+ setTag(key: string, value: string): void;
65
+ setUser(user: {
66
+ id: string;
67
+ email?: string;
68
+ username?: string;
69
+ } | null): void;
70
+ startTransaction(context: {
71
+ name: string;
72
+ op: string;
73
+ }): SentryTransaction;
74
+ flush(timeout: number): Promise<boolean>;
75
+ }
76
+ export interface SentryTransaction {
77
+ setTag(key: string, value: string): void;
78
+ setData(key: string, value: unknown): void;
79
+ finish(): void;
80
+ startChild(context: {
81
+ op: string;
82
+ description: string;
83
+ }): SentrySpan;
84
+ }
85
+ export interface SentrySpan {
86
+ setTag(key: string, value: string): void;
87
+ setData(key: string, value: unknown): void;
88
+ setStatus(status: string): void;
89
+ finish(): void;
90
+ }
91
+ export declare class SentryIntegration {
92
+ private config;
93
+ private client;
94
+ private initialized;
95
+ private eventCount;
96
+ private errorCount;
97
+ constructor(config: SentryConfig);
98
+ /**
99
+ * Initialize Sentry SDK (lazy-loads @sentry/node)
100
+ */
101
+ init(): Promise<boolean>;
102
+ /**
103
+ * Set a custom Sentry client (useful for testing)
104
+ */
105
+ setClient(client: SentryClient): void;
106
+ /**
107
+ * Capture a workflow execution error
108
+ */
109
+ captureWorkflowError(error: Error, context: WorkflowErrorContext): string | null;
110
+ /**
111
+ * Capture a node execution error
112
+ */
113
+ captureNodeError(error: Error, nodeName: string, nodeType: string, context?: {
114
+ workflowName?: string;
115
+ requestId?: string;
116
+ }): string | null;
117
+ /**
118
+ * Capture a trigger error
119
+ */
120
+ captureTriggerError(error: Error, triggerType: string, context?: Record<string, unknown>): string | null;
121
+ /**
122
+ * Capture a warning message
123
+ */
124
+ captureWarning(message: string, context?: Record<string, unknown>): string | null;
125
+ /**
126
+ * Set current user context
127
+ */
128
+ setUser(user: {
129
+ id: string;
130
+ email?: string;
131
+ username?: string;
132
+ } | null): void;
133
+ /**
134
+ * Add a tag to all future events
135
+ */
136
+ setTag(key: string, value: string): void;
137
+ /**
138
+ * Flush pending events to Sentry
139
+ */
140
+ flush(timeoutMs?: number): Promise<boolean>;
141
+ /**
142
+ * Check if Sentry is initialized
143
+ */
144
+ isInitialized(): boolean;
145
+ /**
146
+ * Get stats about captured events
147
+ */
148
+ getStats(): {
149
+ initialized: boolean;
150
+ eventCount: number;
151
+ errorCount: number;
152
+ };
153
+ }
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Sentry Error Tracking Integration for Blok
3
+ *
4
+ * Provides error tracking and performance monitoring via Sentry.
5
+ * Captures workflow execution errors, node failures, and trigger issues
6
+ * with full context (workflow name, node, request ID, etc.).
7
+ *
8
+ * Uses a lightweight adapter pattern so Sentry SDK is loaded lazily
9
+ * and the framework doesn't hard-depend on @sentry/node.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { SentryIntegration } from "@blokjs/runner";
14
+ *
15
+ * const sentry = new SentryIntegration({
16
+ * dsn: process.env.SENTRY_DSN!,
17
+ * environment: process.env.NODE_ENV || "development",
18
+ * release: "blok@1.0.0",
19
+ * tracesSampleRate: 0.1,
20
+ * });
21
+ *
22
+ * await sentry.init();
23
+ *
24
+ * // In error handler
25
+ * sentry.captureWorkflowError(error, {
26
+ * workflowName: "get-user",
27
+ * workflowPath: "/users/:id",
28
+ * requestId: ctx.id,
29
+ * });
30
+ * ```
31
+ */
32
+ export class SentryIntegration {
33
+ config;
34
+ client = null;
35
+ initialized = false;
36
+ eventCount = 0;
37
+ errorCount = 0;
38
+ constructor(config) {
39
+ this.config = {
40
+ environment: process.env.NODE_ENV || "development",
41
+ sampleRate: 1.0,
42
+ tracesSampleRate: 0.1,
43
+ debug: false,
44
+ ...config,
45
+ };
46
+ }
47
+ /**
48
+ * Initialize Sentry SDK (lazy-loads @sentry/node)
49
+ */
50
+ async init() {
51
+ if (this.initialized)
52
+ return true;
53
+ try {
54
+ // Dynamic import to avoid hard dependency — @sentry/node is optional
55
+ // @ts-expect-error: @sentry/node types not installed; loaded lazily at runtime
56
+ const Sentry = await import("@sentry/node");
57
+ Sentry.init({
58
+ dsn: this.config.dsn,
59
+ environment: this.config.environment,
60
+ release: this.config.release,
61
+ serverName: this.config.serverName,
62
+ sampleRate: this.config.sampleRate,
63
+ tracesSampleRate: this.config.tracesSampleRate,
64
+ debug: this.config.debug,
65
+ });
66
+ // Set global tags
67
+ if (this.config.tags) {
68
+ for (const [key, value] of Object.entries(this.config.tags)) {
69
+ Sentry.setTag(key, value);
70
+ }
71
+ }
72
+ Sentry.setTag("framework", "blok");
73
+ // Create adapter
74
+ this.client = {
75
+ captureException: (error, context) => {
76
+ return Sentry.captureException(error, {
77
+ extra: context,
78
+ });
79
+ },
80
+ captureMessage: (message, level) => {
81
+ return Sentry.captureMessage(message, level);
82
+ },
83
+ setTag: (key, value) => Sentry.setTag(key, value),
84
+ setUser: (user) => Sentry.setUser(user),
85
+ startTransaction: (context) => {
86
+ return Sentry.startSpan(context, (span) => span);
87
+ },
88
+ flush: (timeout) => Sentry.flush(timeout),
89
+ };
90
+ this.initialized = true;
91
+ return true;
92
+ }
93
+ catch {
94
+ // @sentry/node not installed - that's OK, fail silently
95
+ this.initialized = false;
96
+ return false;
97
+ }
98
+ }
99
+ /**
100
+ * Set a custom Sentry client (useful for testing)
101
+ */
102
+ setClient(client) {
103
+ this.client = client;
104
+ this.initialized = true;
105
+ }
106
+ /**
107
+ * Capture a workflow execution error
108
+ */
109
+ captureWorkflowError(error, context) {
110
+ if (!this.client)
111
+ return null;
112
+ this.errorCount++;
113
+ this.eventCount++;
114
+ const eventId = this.client.captureException(error, {
115
+ workflow_name: context.workflowName,
116
+ workflow_path: context.workflowPath,
117
+ workflow_version: context.workflowVersion,
118
+ request_id: context.requestId,
119
+ node_name: context.nodeName,
120
+ node_type: context.nodeType,
121
+ trigger_type: context.triggerType,
122
+ duration_ms: context.durationMs,
123
+ });
124
+ return eventId;
125
+ }
126
+ /**
127
+ * Capture a node execution error
128
+ */
129
+ captureNodeError(error, nodeName, nodeType, context) {
130
+ if (!this.client)
131
+ return null;
132
+ this.errorCount++;
133
+ this.eventCount++;
134
+ return this.client.captureException(error, {
135
+ node_name: nodeName,
136
+ node_type: nodeType,
137
+ workflow_name: context?.workflowName,
138
+ request_id: context?.requestId,
139
+ });
140
+ }
141
+ /**
142
+ * Capture a trigger error
143
+ */
144
+ captureTriggerError(error, triggerType, context) {
145
+ if (!this.client)
146
+ return null;
147
+ this.errorCount++;
148
+ this.eventCount++;
149
+ return this.client.captureException(error, {
150
+ trigger_type: triggerType,
151
+ ...context,
152
+ });
153
+ }
154
+ /**
155
+ * Capture a warning message
156
+ */
157
+ captureWarning(message, context) {
158
+ if (!this.client)
159
+ return null;
160
+ this.eventCount++;
161
+ return this.client.captureMessage(context ? `${message} | ${JSON.stringify(context)}` : message, "warning");
162
+ }
163
+ /**
164
+ * Set current user context
165
+ */
166
+ setUser(user) {
167
+ this.client?.setUser(user);
168
+ }
169
+ /**
170
+ * Add a tag to all future events
171
+ */
172
+ setTag(key, value) {
173
+ this.client?.setTag(key, value);
174
+ }
175
+ /**
176
+ * Flush pending events to Sentry
177
+ */
178
+ async flush(timeoutMs = 2000) {
179
+ if (!this.client)
180
+ return true;
181
+ return this.client.flush(timeoutMs);
182
+ }
183
+ /**
184
+ * Check if Sentry is initialized
185
+ */
186
+ isInitialized() {
187
+ return this.initialized;
188
+ }
189
+ /**
190
+ * Get stats about captured events
191
+ */
192
+ getStats() {
193
+ return {
194
+ initialized: this.initialized,
195
+ eventCount: this.eventCount,
196
+ errorCount: this.errorCount,
197
+ };
198
+ }
199
+ }
200
+ //# sourceMappingURL=SentryIntegration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentryIntegration.js","sourceRoot":"","sources":["../../src/integrations/SentryIntegration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
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 type { SentryConfig, WorkflowErrorContext, SentryClient, SentryTransaction, SentrySpan, } from "./SentryIntegration";
14
+ export { APMIntegration } from "./APMIntegration";
15
+ export type { APMVendor, APMConfig, APMBootstrapResult, } from "./APMIntegration";
16
+ export { CloudWatchIntegration } from "./CloudWatchIntegration";
17
+ export type { CloudWatchConfig, CloudWatchUnit, CloudWatchLogEntry, CloudWatchStats, } from "./CloudWatchIntegration";
18
+ export { AzureMonitorIntegration } from "./AzureMonitorIntegration";
19
+ export type { AzureMonitorConfig, AzureMonitorStats, } from "./AzureMonitorIntegration";