@blokjs/runner 0.4.0 → 0.6.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 (163) hide show
  1. package/dist/Blok.js +32 -3
  2. package/dist/Blok.js.map +1 -1
  3. package/dist/Configuration.d.ts +41 -5
  4. package/dist/Configuration.js +215 -92
  5. package/dist/Configuration.js.map +1 -1
  6. package/dist/ForEachNode.d.ts +59 -0
  7. package/dist/ForEachNode.js +522 -0
  8. package/dist/ForEachNode.js.map +1 -0
  9. package/dist/LoopMaxIterationsError.d.ts +11 -0
  10. package/dist/LoopMaxIterationsError.js +18 -0
  11. package/dist/LoopMaxIterationsError.js.map +1 -0
  12. package/dist/LoopNode.d.ts +36 -0
  13. package/dist/LoopNode.js +182 -0
  14. package/dist/LoopNode.js.map +1 -0
  15. package/dist/Runner.d.ts +11 -1
  16. package/dist/Runner.js +9 -2
  17. package/dist/Runner.js.map +1 -1
  18. package/dist/RunnerSteps.js +419 -112
  19. package/dist/RunnerSteps.js.map +1 -1
  20. package/dist/RuntimeAdapterNode.d.ts +2 -1
  21. package/dist/RuntimeAdapterNode.js +2 -2
  22. package/dist/RuntimeAdapterNode.js.map +1 -1
  23. package/dist/RuntimeRegistry.d.ts +23 -2
  24. package/dist/RuntimeRegistry.js +31 -2
  25. package/dist/RuntimeRegistry.js.map +1 -1
  26. package/dist/SubworkflowNode.d.ts +106 -0
  27. package/dist/SubworkflowNode.js +261 -3
  28. package/dist/SubworkflowNode.js.map +1 -1
  29. package/dist/SwitchNode.d.ts +37 -0
  30. package/dist/SwitchNode.js +153 -0
  31. package/dist/SwitchNode.js.map +1 -0
  32. package/dist/TriggerBase.d.ts +50 -0
  33. package/dist/TriggerBase.js +262 -4
  34. package/dist/TriggerBase.js.map +1 -1
  35. package/dist/TryCatchNode.d.ts +32 -0
  36. package/dist/TryCatchNode.js +207 -0
  37. package/dist/TryCatchNode.js.map +1 -0
  38. package/dist/adapters/grpc/GrpcCodec.js +2 -2
  39. package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +6 -4
  40. package/dist/adapters/grpc/GrpcRuntimeAdapter.js +6 -4
  41. package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -1
  42. package/dist/adapters/grpc/types.d.ts +7 -5
  43. package/dist/adapters/grpc/types.js.map +1 -1
  44. package/dist/adapters/transport.d.ts +12 -41
  45. package/dist/adapters/transport.js +21 -70
  46. package/dist/adapters/transport.js.map +1 -1
  47. package/dist/cache/NodeResultCache.js +7 -0
  48. package/dist/cache/NodeResultCache.js.map +1 -1
  49. package/dist/concurrency/NatsKvConcurrencyBackend.js +18 -5
  50. package/dist/concurrency/NatsKvConcurrencyBackend.js.map +1 -1
  51. package/dist/concurrency/RedisConcurrencyBackend.d.ts +64 -0
  52. package/dist/concurrency/RedisConcurrencyBackend.js +374 -0
  53. package/dist/concurrency/RedisConcurrencyBackend.js.map +1 -0
  54. package/dist/concurrency/createConcurrencyBackend.d.ts +1 -0
  55. package/dist/concurrency/createConcurrencyBackend.js +5 -1
  56. package/dist/concurrency/createConcurrencyBackend.js.map +1 -1
  57. package/dist/defineNode.d.ts +8 -0
  58. package/dist/defineNode.js +25 -5
  59. package/dist/defineNode.js.map +1 -1
  60. package/dist/graphql/GraphQLSchemaGenerator.js +1 -1
  61. package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -1
  62. package/dist/index.d.ts +10 -6
  63. package/dist/index.js +13 -9
  64. package/dist/index.js.map +1 -1
  65. package/dist/marketplace/RuntimeCatalog.d.ts +6 -0
  66. package/dist/marketplace/RuntimeCatalog.js.map +1 -1
  67. package/dist/marketplace/RuntimeDiscovery.d.ts +2 -2
  68. package/dist/marketplace/RuntimeDiscovery.js +18 -6
  69. package/dist/marketplace/RuntimeDiscovery.js.map +1 -1
  70. package/dist/monitoring/ConcurrencyMetrics.d.ts +26 -0
  71. package/dist/monitoring/ConcurrencyMetrics.js +36 -4
  72. package/dist/monitoring/ConcurrencyMetrics.js.map +1 -1
  73. package/dist/monitoring/ForEachWaitMetrics.d.ts +22 -0
  74. package/dist/monitoring/ForEachWaitMetrics.js +36 -0
  75. package/dist/monitoring/ForEachWaitMetrics.js.map +1 -0
  76. package/dist/openapi/OpenAPIGenerator.js +7 -2
  77. package/dist/openapi/OpenAPIGenerator.js.map +1 -1
  78. package/dist/runtime/PrimitiveStack.d.ts +64 -0
  79. package/dist/runtime/PrimitiveStack.js +92 -0
  80. package/dist/runtime/PrimitiveStack.js.map +1 -0
  81. package/dist/scheduling/DebounceBackend.d.ts +108 -0
  82. package/dist/scheduling/DebounceBackend.js +23 -0
  83. package/dist/scheduling/DebounceBackend.js.map +1 -0
  84. package/dist/scheduling/DebounceCoordinator.d.ts +65 -12
  85. package/dist/scheduling/DebounceCoordinator.js +234 -13
  86. package/dist/scheduling/DebounceCoordinator.js.map +1 -1
  87. package/dist/scheduling/DeferredRunScheduler.d.ts +28 -0
  88. package/dist/scheduling/DeferredRunScheduler.js +105 -3
  89. package/dist/scheduling/DeferredRunScheduler.js.map +1 -1
  90. package/dist/scheduling/NatsKvDebounceBackend.d.ts +53 -0
  91. package/dist/scheduling/NatsKvDebounceBackend.js +334 -0
  92. package/dist/scheduling/NatsKvDebounceBackend.js.map +1 -0
  93. package/dist/scheduling/RedisDebounceBackend.d.ts +49 -0
  94. package/dist/scheduling/RedisDebounceBackend.js +356 -0
  95. package/dist/scheduling/RedisDebounceBackend.js.map +1 -0
  96. package/dist/scheduling/createDebounceBackend.d.ts +25 -0
  97. package/dist/scheduling/createDebounceBackend.js +39 -0
  98. package/dist/scheduling/createDebounceBackend.js.map +1 -0
  99. package/dist/security/AuditLogger.js +1 -1
  100. package/dist/security/AuditLogger.js.map +1 -1
  101. package/dist/security/AuthMiddleware.d.ts +19 -20
  102. package/dist/security/AuthMiddleware.js +35 -20
  103. package/dist/security/AuthMiddleware.js.map +1 -1
  104. package/dist/security/OAuthProvider.js +2 -2
  105. package/dist/security/OAuthProvider.js.map +1 -1
  106. package/dist/security/SecretManager.js +14 -13
  107. package/dist/security/SecretManager.js.map +1 -1
  108. package/dist/security/index.d.ts +3 -1
  109. package/dist/security/index.js +3 -1
  110. package/dist/security/index.js.map +1 -1
  111. package/dist/testing/TestHarness.d.ts +27 -12
  112. package/dist/testing/TestHarness.js +19 -3
  113. package/dist/testing/TestHarness.js.map +1 -1
  114. package/dist/testing/WorkflowTestRunner.js +0 -7
  115. package/dist/testing/WorkflowTestRunner.js.map +1 -1
  116. package/dist/tracing/InMemoryRunStore.d.ts +14 -1
  117. package/dist/tracing/InMemoryRunStore.js +95 -6
  118. package/dist/tracing/InMemoryRunStore.js.map +1 -1
  119. package/dist/tracing/PostgresRunStore.d.ts +28 -2
  120. package/dist/tracing/PostgresRunStore.js +276 -3
  121. package/dist/tracing/PostgresRunStore.js.map +1 -1
  122. package/dist/tracing/RoutingDiagnostics.d.ts +55 -0
  123. package/dist/tracing/RoutingDiagnostics.js +50 -0
  124. package/dist/tracing/RoutingDiagnostics.js.map +1 -0
  125. package/dist/tracing/RunStore.d.ts +82 -1
  126. package/dist/tracing/RunTracker.d.ts +7 -1
  127. package/dist/tracing/RunTracker.js +23 -0
  128. package/dist/tracing/RunTracker.js.map +1 -1
  129. package/dist/tracing/SqliteRunStore.d.ts +57 -2
  130. package/dist/tracing/SqliteRunStore.js +408 -48
  131. package/dist/tracing/SqliteRunStore.js.map +1 -1
  132. package/dist/tracing/TraceRouter.js +380 -18
  133. package/dist/tracing/TraceRouter.js.map +1 -1
  134. package/dist/tracing/createStore.js +14 -3
  135. package/dist/tracing/createStore.js.map +1 -1
  136. package/dist/tracing/metadataFilter.d.ts +63 -0
  137. package/dist/tracing/metadataFilter.js +224 -0
  138. package/dist/tracing/metadataFilter.js.map +1 -0
  139. package/dist/tracing/types.d.ts +331 -7
  140. package/dist/utils/envAllowlist.d.ts +35 -0
  141. package/dist/utils/envAllowlist.js +113 -0
  142. package/dist/utils/envAllowlist.js.map +1 -0
  143. package/dist/version/RuntimeVersionValidator.d.ts +38 -0
  144. package/dist/version/RuntimeVersionValidator.js +121 -0
  145. package/dist/version/RuntimeVersionValidator.js.map +1 -0
  146. package/dist/visualization/WorkflowVisualizer.js +4 -4
  147. package/dist/visualization/WorkflowVisualizer.js.map +1 -1
  148. package/dist/workflow/PersistenceHelper.d.ts +18 -10
  149. package/dist/workflow/PersistenceHelper.js +35 -9
  150. package/dist/workflow/PersistenceHelper.js.map +1 -1
  151. package/dist/workflow/WorkflowNormalizer.d.ts +19 -1
  152. package/dist/workflow/WorkflowNormalizer.js +469 -19
  153. package/dist/workflow/WorkflowNormalizer.js.map +1 -1
  154. package/dist/workflow/WorkflowRegistry.d.ts +122 -0
  155. package/dist/workflow/WorkflowRegistry.js +121 -0
  156. package/dist/workflow/WorkflowRegistry.js.map +1 -1
  157. package/dist/workflow/sampleBody.d.ts +54 -0
  158. package/dist/workflow/sampleBody.js +320 -0
  159. package/dist/workflow/sampleBody.js.map +1 -0
  160. package/package.json +3 -8
  161. package/dist/adapters/HttpRuntimeAdapter.d.ts +0 -79
  162. package/dist/adapters/HttpRuntimeAdapter.js +0 -233
  163. package/dist/adapters/HttpRuntimeAdapter.js.map +0 -1
package/dist/Blok.js CHANGED
@@ -70,6 +70,15 @@ export default class BlokService extends NodeBase {
70
70
  const result = await this.handle(ctx, inputs);
71
71
  this.v.validate(result, this.outputSchema);
72
72
  const end = performance.now();
73
+ // Truthful failure indicator. `defineNode.handle()` catches every
74
+ // throw and stuffs it onto `BlokResponse.error` — so the previous
75
+ // "Executed node" log line and the `response.success === false`
76
+ // metrics counter at the bottom of run() were both wrong on the
77
+ // error path (one always said success, the other never fired).
78
+ // Read the BlokResponse's error field once and let the rest of the
79
+ // method use it consistently.
80
+ const blokResponse = result;
81
+ const errored = blokResponse.error !== undefined && blokResponse.error !== null;
73
82
  node_execution.add(1, {
74
83
  env: process.env.NODE_ENV,
75
84
  workflow_path: `${ctx.workflow_path}`,
@@ -84,16 +93,36 @@ export default class BlokService extends NodeBase {
84
93
  node_name: `${this.name}`,
85
94
  node: this.node,
86
95
  });
87
- ctx.logger.log(`Executed node: ${this.name} in ${(end - start).toFixed(2)}ms`);
96
+ // Surface failures clearly on the per-node log so operators don't
97
+ // see a misleading "Executed node" line followed by a contradictory
98
+ // "FAILED" line from RunnerSteps. The structured per-step log
99
+ // emitted by RunnerSteps remains the canonical "step N/M" entry;
100
+ // this one is the inner-node companion.
101
+ if (errored) {
102
+ const errMsg = blokResponse.error instanceof Error ? blokResponse.error.message : String(blokResponse.error);
103
+ ctx.logger.log(`Node ${this.name} failed in ${(end - start).toFixed(2)}ms: ${errMsg}`);
104
+ }
105
+ else {
106
+ ctx.logger.log(`Executed node: ${this.name} in ${(end - start).toFixed(2)}ms`);
107
+ }
88
108
  // V2 persistence — runner-owned, declarative.
89
109
  // `ephemeral` skips, `spread` merges, `as` renames, default stores
90
- // at state[name]. Legacy `set_var: false` maps to ephemeral; legacy
91
- // `set_var: true` is a no-op (default already persists).
110
+ // at state[name].
111
+ // Pass through the full IBlokResponse so the helper's error guard
112
+ // (`success: false` / non-null `error`) skips state persistence on
113
+ // the failure path — see PersistenceHelper.isErroredResult.
92
114
  applyStepOutput(ctx, this, result);
93
115
  // Hand the raw result back to the runner. RunnerSteps mirrors
94
116
  // response.data into ctx.response so adjacent-step access via
95
117
  // `ctx.prev` / `$.prev` keeps working.
96
118
  response.data = result;
119
+ // Mirror the inner BlokResponse error state onto the outer envelope
120
+ // the metrics block at the bottom of run() reads. Without this flip
121
+ // the `if (response.success === false)` guard never matched, so
122
+ // the `node_errors` OTel counter has been silently broken for every
123
+ // defineNode-built step since v0.3.x.
124
+ response.success = !errored;
125
+ response.error = errored ? blokResponse.error : null;
97
126
  response.data.contentType = this.contentType;
98
127
  globalMetrics.retry();
99
128
  globalMetrics.stop();
package/dist/Blok.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Blok.js","sourceRoot":"","sources":["../src/Blok.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Blok.js","sourceRoot":"","sources":["../src/Blok.ts"],"names":[],"mappings":"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"}
@@ -12,19 +12,26 @@ export default class Configuration implements Config {
12
12
  steps: NodeBase[];
13
13
  nodes: Node;
14
14
  trigger: Trigger;
15
+ /**
16
+ * v0.5.2 — workflow-level middleware chain. Populated from the
17
+ * normalized workflow's `appliedMiddleware` field. HTTP and Worker
18
+ * triggers prepend this list to their own `trigger.<kind>.middleware`
19
+ * before invoking the chain, so workflow-level entries run BEFORE
20
+ * trigger-level entries on every request.
21
+ */
22
+ appliedMiddleware: readonly string[];
15
23
  static loaded_nodes: Node;
16
24
  globalOptions: GlobalOptions | undefined;
17
25
  constructor();
18
26
  /**
19
27
  * Initialize the RuntimeRegistry with built-in adapters.
20
28
  *
21
- * Registers `NodeJsRuntimeAdapter` for in-process JS nodes, then for each
22
- * SDK language picks `HttpRuntimeAdapter` or `GrpcRuntimeAdapter` based on
23
- * {@link resolveTransportForKind} (env-driven). This is the single point
24
- * of transport selection — no other file branches on transport.
29
+ * Registers `NodeJsRuntimeAdapter` for in-process JS nodes, then a
30
+ * `GrpcRuntimeAdapter` per SDK language. gRPC is the sole transport
31
+ * since v0.5 `assertGrpcOnlyTransport` throws if the operator still
32
+ * has `RUNTIME_TRANSPORT=http` set.
25
33
  */
26
34
  private initializeRuntimeRegistry;
27
- private buildHttpAdapter;
28
35
  private buildGrpcAdapter;
29
36
  /**
30
37
  * Initialize the configuration for a workflow run.
@@ -64,6 +71,35 @@ export default class Configuration implements Config {
64
71
  * doesn't fire on otherwise-valid wait steps.
65
72
  */
66
73
  protected waitResolver(node: RunnerNode): Promise<RunnerNode>;
74
+ /**
75
+ * v0.5 · resolve a `forEach` step. The actual iteration logic lives
76
+ * in `ForEachNode.run()`; the inner `steps` array is pre-resolved by
77
+ * the existing isFlowWithProperties path in `getNodes()`.
78
+ */
79
+ protected forEachResolver(node: RunnerNode): Promise<RunnerNode>;
80
+ /**
81
+ * v0.5 · resolve a `loop` step. While-loop semantics live in
82
+ * `LoopNode.run()`. Inner `steps` resolved by isFlowWithProperties.
83
+ */
84
+ protected loopResolver(node: RunnerNode): Promise<RunnerNode>;
85
+ /**
86
+ * v0.5 · resolve a `switch` step. The N-way match logic lives in
87
+ * `SwitchNode.run()`. Cases + default each carry their own resolved
88
+ * inner-step list — see the dedicated `cases` branch in `getNodes()`.
89
+ */
90
+ protected switchResolver(node: RunnerNode): Promise<RunnerNode>;
91
+ /**
92
+ * v0.5 · resolve a `tryCatch` step. JS-like try/catch/finally semantics
93
+ * live in `TryCatchNode.run()`. Each block (try, catch, finally) is
94
+ * pre-resolved by the dedicated tryCatch branch in `getNodes()` so
95
+ * the runtime can dispatch them through child Runners on-demand.
96
+ */
97
+ protected tryCatchResolver(node: RunnerNode): Promise<RunnerNode>;
98
+ /**
99
+ * Check if a resolved node has runtimeRequirements and validate them
100
+ * against the currently known runtime versions in the RuntimeRegistry.
101
+ */
102
+ private validateNodeRuntimeRequirements;
67
103
  protected localResolver(node: RunnerNode): Promise<RunnerNode>;
68
104
  }
69
105
  type NodeResolverTypes = {
@@ -6,11 +6,11 @@ import ConfigurationResolver from "./ConfigurationResolver";
6
6
  import RunnerNode from "./RunnerNode";
7
7
  import { RuntimeAdapterNode } from "./RuntimeAdapterNode";
8
8
  import { RuntimeRegistry } from "./RuntimeRegistry";
9
- import { HttpRuntimeAdapter } from "./adapters/HttpRuntimeAdapter";
10
9
  import { NodeJsRuntimeAdapter } from "./adapters/NodeJsRuntimeAdapter";
11
10
  import { GrpcRuntimeAdapter } from "./adapters/grpc/GrpcRuntimeAdapter";
12
11
  import { DEFAULT_GRPC_PORTS, GRPC_DEFAULTS } from "./adapters/grpc/types";
13
- import { isLoopbackHost, isStreamLogsEnabled, isStrictTlsEnabled, loadTlsConfigForKind, resolveHealthCheckFailureThreshold, resolveHealthCheckIntervalMs, resolveTransportForKind, } from "./adapters/transport";
12
+ import { assertGrpcOnlyTransport, isLoopbackHost, isStreamLogsEnabled, isStrictTlsEnabled, loadTlsConfigForKind, resolveHealthCheckFailureThreshold, resolveHealthCheckIntervalMs, } from "./adapters/transport";
13
+ import { RuntimeVersionValidator } from "./version/RuntimeVersionValidator";
14
14
  export default class Configuration {
15
15
  workflow = {};
16
16
  name;
@@ -18,6 +18,14 @@ export default class Configuration {
18
18
  steps;
19
19
  nodes;
20
20
  trigger;
21
+ /**
22
+ * v0.5.2 — workflow-level middleware chain. Populated from the
23
+ * normalized workflow's `appliedMiddleware` field. HTTP and Worker
24
+ * triggers prepend this list to their own `trigger.<kind>.middleware`
25
+ * before invoking the chain, so workflow-level entries run BEFORE
26
+ * trigger-level entries on every request.
27
+ */
28
+ appliedMiddleware;
21
29
  static loaded_nodes = {};
22
30
  globalOptions;
23
31
  constructor() {
@@ -26,87 +34,40 @@ export default class Configuration {
26
34
  this.version = "";
27
35
  this.name = "";
28
36
  this.trigger = {};
37
+ this.appliedMiddleware = [];
29
38
  this.initializeRuntimeRegistry();
30
39
  }
31
40
  /**
32
41
  * Initialize the RuntimeRegistry with built-in adapters.
33
42
  *
34
- * Registers `NodeJsRuntimeAdapter` for in-process JS nodes, then for each
35
- * SDK language picks `HttpRuntimeAdapter` or `GrpcRuntimeAdapter` based on
36
- * {@link resolveTransportForKind} (env-driven). This is the single point
37
- * of transport selection — no other file branches on transport.
43
+ * Registers `NodeJsRuntimeAdapter` for in-process JS nodes, then a
44
+ * `GrpcRuntimeAdapter` per SDK language. gRPC is the sole transport
45
+ * since v0.5 `assertGrpcOnlyTransport` throws if the operator still
46
+ * has `RUNTIME_TRANSPORT=http` set.
38
47
  */
39
48
  initializeRuntimeRegistry() {
49
+ assertGrpcOnlyTransport();
40
50
  const registry = RuntimeRegistry.getInstance();
41
51
  if (!registry.has("nodejs")) {
42
52
  registry.register(new NodeJsRuntimeAdapter());
43
53
  }
44
54
  const sdkLanguages = [
45
- {
46
- kind: "go",
47
- hostEnv: "RUNTIME_GO_HOST",
48
- httpPortEnv: "RUNTIME_GO_PORT",
49
- grpcPortEnv: "RUNTIME_GO_GRPC_PORT",
50
- defaultHttpPort: 9001,
51
- },
52
- {
53
- kind: "rust",
54
- hostEnv: "RUNTIME_RUST_HOST",
55
- httpPortEnv: "RUNTIME_RUST_PORT",
56
- grpcPortEnv: "RUNTIME_RUST_GRPC_PORT",
57
- defaultHttpPort: 9002,
58
- },
59
- {
60
- kind: "java",
61
- hostEnv: "RUNTIME_JAVA_HOST",
62
- httpPortEnv: "RUNTIME_JAVA_PORT",
63
- grpcPortEnv: "RUNTIME_JAVA_GRPC_PORT",
64
- defaultHttpPort: 9003,
65
- },
66
- {
67
- kind: "csharp",
68
- hostEnv: "RUNTIME_CSHARP_HOST",
69
- httpPortEnv: "RUNTIME_CSHARP_PORT",
70
- grpcPortEnv: "RUNTIME_CSHARP_GRPC_PORT",
71
- defaultHttpPort: 9004,
72
- },
73
- {
74
- kind: "php",
75
- hostEnv: "RUNTIME_PHP_HOST",
76
- httpPortEnv: "RUNTIME_PHP_PORT",
77
- grpcPortEnv: "RUNTIME_PHP_GRPC_PORT",
78
- defaultHttpPort: 9005,
79
- },
80
- {
81
- kind: "ruby",
82
- hostEnv: "RUNTIME_RUBY_HOST",
83
- httpPortEnv: "RUNTIME_RUBY_PORT",
84
- grpcPortEnv: "RUNTIME_RUBY_GRPC_PORT",
85
- defaultHttpPort: 9006,
86
- },
87
- {
88
- kind: "python3",
89
- hostEnv: "RUNTIME_PYTHON3_HOST",
90
- httpPortEnv: "RUNTIME_PYTHON3_PORT",
91
- grpcPortEnv: "RUNTIME_PYTHON3_GRPC_PORT",
92
- defaultHttpPort: 9007,
93
- },
55
+ { kind: "go", hostEnv: "RUNTIME_GO_HOST", grpcPortEnv: "RUNTIME_GO_GRPC_PORT" },
56
+ { kind: "rust", hostEnv: "RUNTIME_RUST_HOST", grpcPortEnv: "RUNTIME_RUST_GRPC_PORT" },
57
+ { kind: "java", hostEnv: "RUNTIME_JAVA_HOST", grpcPortEnv: "RUNTIME_JAVA_GRPC_PORT" },
58
+ { kind: "csharp", hostEnv: "RUNTIME_CSHARP_HOST", grpcPortEnv: "RUNTIME_CSHARP_GRPC_PORT" },
59
+ { kind: "php", hostEnv: "RUNTIME_PHP_HOST", grpcPortEnv: "RUNTIME_PHP_GRPC_PORT" },
60
+ { kind: "ruby", hostEnv: "RUNTIME_RUBY_HOST", grpcPortEnv: "RUNTIME_RUBY_GRPC_PORT" },
61
+ { kind: "python3", hostEnv: "RUNTIME_PYTHON3_HOST", grpcPortEnv: "RUNTIME_PYTHON3_GRPC_PORT" },
94
62
  ];
95
63
  for (const lang of sdkLanguages) {
96
64
  if (registry.has(lang.kind))
97
65
  continue;
98
- const transport = resolveTransportForKind(lang.kind);
99
66
  const host = process.env[lang.hostEnv] || "localhost";
100
- const adapter = transport === "grpc"
101
- ? this.buildGrpcAdapter(lang.kind, host, lang.grpcPortEnv)
102
- : this.buildHttpAdapter(lang.kind, host, lang.httpPortEnv, lang.defaultHttpPort);
67
+ const adapter = this.buildGrpcAdapter(lang.kind, host, lang.grpcPortEnv);
103
68
  registry.register(adapter);
104
69
  }
105
70
  }
106
- buildHttpAdapter(kind, host, portEnv, defaultPort) {
107
- const port = process.env[portEnv] ? Number.parseInt(process.env[portEnv], 10) : defaultPort;
108
- return new HttpRuntimeAdapter(kind, host, port);
109
- }
110
71
  buildGrpcAdapter(kind, host, portEnv) {
111
72
  const defaultPort = DEFAULT_GRPC_PORTS[kind];
112
73
  const port = process.env[portEnv] ? Number.parseInt(process.env[portEnv], 10) : defaultPort;
@@ -185,6 +146,11 @@ export default class Configuration {
185
146
  this.version = this.workflow.version;
186
147
  this.name = this.workflow.name;
187
148
  this.trigger = this.workflow.trigger;
149
+ // Workflow-level middleware list (v0.5.2). Lives on the normalized
150
+ // workflow as `appliedMiddleware` — see WorkflowNormalizer for the
151
+ // schema overload (`middleware: string[]` at the top level).
152
+ const wfWithApplied = this.workflow;
153
+ this.appliedMiddleware = Array.isArray(wfWithApplied.appliedMiddleware) ? wfWithApplied.appliedMiddleware : [];
188
154
  }
189
155
  async getSteps(blueprint_steps) {
190
156
  const nodes = [];
@@ -203,13 +169,6 @@ export default class Configuration {
203
169
  node.name = step.name;
204
170
  node.active = step.active !== undefined ? step.active : true;
205
171
  node.stop = step.stop !== undefined ? step.stop : false;
206
- // Pass `set_var` through verbatim — DO NOT default to `false`. The
207
- // `false` value short-circuits PersistenceHelper.applyStepOutput
208
- // and silently disables v2's default-store rule. Legacy v1
209
- // workflows that explicitly set `set_var: false` are normalized
210
- // to `ephemeral: true` upstream by WorkflowNormalizer.
211
- if (step.set_var !== undefined)
212
- node.set_var = step.set_var;
213
172
  // V2 persistence knobs — read by PersistenceHelper.applyStepOutput.
214
173
  // `as` renames the state key; `spread` flattens result.data into
215
174
  // state; `ephemeral: true` skips persistence entirely. Default
@@ -255,10 +214,17 @@ export default class Configuration {
255
214
  const hasOutputs = currentNode.mapper !== undefined;
256
215
  if (isFlowWithProperties) {
257
216
  const steps = currentNode.steps;
258
- nodes[key] = await this.getFlow(steps);
259
- const copyBlueprintNode = { ...workflow_nodes[key] };
260
- copyBlueprintNode.steps = [];
261
- nodes[key] = { ...nodes[key], ...copyBlueprintNode };
217
+ const flow = await this.getFlow(steps);
218
+ // Spread the metadata FIRST, then the resolved flow — this
219
+ // keeps the resolved NodeBase[] in `flow.steps` and lets
220
+ // the metadata (e.g. forEach's in/as/mode/concurrency,
221
+ // loop's while/maxIterations) survive on the merged config.
222
+ // The earlier code spread metadata AFTER flow with a
223
+ // `copyBlueprintNode.steps = []` reset, which clobbered
224
+ // the resolved steps array — broken for any node config
225
+ // that needed both inner steps AND sibling fields.
226
+ const { steps: _drop, ...metadata } = workflow_nodes[key];
227
+ nodes[key] = { ...metadata, ...flow };
262
228
  }
263
229
  else if (isFlow) {
264
230
  const steps = currentNode.steps;
@@ -284,6 +250,47 @@ export default class Configuration {
284
250
  catch: await this.getFlow(currentNode.catch.steps),
285
251
  };
286
252
  }
253
+ else if (typeof workflow_nodes[key] === "object" &&
254
+ Array.isArray(currentNode.try) &&
255
+ Array.isArray(currentNode.catch)) {
256
+ // v0.5 · tryCatch step. `try`, `catch`, and optional `finally`
257
+ // each carry their own inner-step array (set by
258
+ // `normalizeTryCatchStep`). Resolve each block as its own Flow
259
+ // so TryCatchNode.run() can dispatch them through child Runners.
260
+ const raw = workflow_nodes[key];
261
+ const merged = {
262
+ try: (await this.getFlow(raw.try)).steps,
263
+ catch: (await this.getFlow(raw.catch)).steps,
264
+ };
265
+ if (Array.isArray(raw.finally)) {
266
+ merged.finally = (await this.getFlow(raw.finally)).steps;
267
+ }
268
+ nodes[key] = merged;
269
+ }
270
+ else if (typeof workflow_nodes[key] === "object" &&
271
+ currentNode.cases !== undefined &&
272
+ Array.isArray(currentNode.cases)) {
273
+ // v0.5 · switch step. Each case carries its own inner-step
274
+ // list at `case.steps` (set by `normalizeSwitchStep`); resolve
275
+ // each independently via getFlow. Optional `default` is its
276
+ // own resolved Flow. The merged config preserves the `on`
277
+ // expression so the blueprint mapper can rewrite it before
278
+ // SwitchNode.run() reads ctx.config[name].on at run time.
279
+ const raw = workflow_nodes[key];
280
+ const rawCases = raw.cases;
281
+ const resolvedCases = await Promise.all(rawCases.map(async (c) => ({
282
+ when: c.when,
283
+ steps: (await this.getFlow(c.steps)).steps,
284
+ })));
285
+ const merged = {
286
+ on: raw.on,
287
+ cases: resolvedCases,
288
+ };
289
+ if (Array.isArray(raw.default)) {
290
+ merged.default = (await this.getFlow(raw.default)).steps;
291
+ }
292
+ nodes[key] = merged;
293
+ }
287
294
  else {
288
295
  nodes[key] = { ...workflow_nodes[key] };
289
296
  }
@@ -309,13 +316,6 @@ export default class Configuration {
309
316
  node.name = step.name;
310
317
  node.active = step.active !== undefined ? step.active : true;
311
318
  node.stop = step.stop !== undefined ? step.stop : false;
312
- // Pass `set_var` through verbatim — DO NOT default to `false`. The
313
- // `false` value short-circuits PersistenceHelper.applyStepOutput
314
- // and silently disables v2's default-store rule. Legacy v1
315
- // workflows that explicitly set `set_var: false` are normalized
316
- // to `ephemeral: true` upstream by WorkflowNormalizer.
317
- if (step.set_var !== undefined)
318
- node.set_var = step.set_var;
319
319
  // V2 persistence + idempotency + retry knobs flow through nested
320
320
  // flow steps too. Without this, a `branch.then[0]` step with
321
321
  // `idempotencyKey` set would NOT be cached on rerun. Mirrors the
@@ -395,6 +395,23 @@ export default class Configuration {
395
395
  wait: {
396
396
  resolver: async (node) => await this.waitResolver(node),
397
397
  },
398
+ // v0.5 · `forEach({...})` step — iterate a collection running
399
+ // inner steps per item. Sequential or parallel-bounded.
400
+ forEach: {
401
+ resolver: async (node) => await this.forEachResolver(node),
402
+ },
403
+ // v0.5 · `loop({...})` step — while-loop with maxIterations cap.
404
+ loop: {
405
+ resolver: async (node) => await this.loopResolver(node),
406
+ },
407
+ // v0.5 · `switchOn({...})` step — N-way branch; first matching case wins.
408
+ switch: {
409
+ resolver: async (node) => await this.switchResolver(node),
410
+ },
411
+ // v0.5 · `tryCatch({...})` step — JS-like try/catch/finally semantics.
412
+ tryCatch: {
413
+ resolver: async (node) => await this.tryCatchResolver(node),
414
+ },
398
415
  };
399
416
  }
400
417
  async runtimeResolver(node) {
@@ -424,15 +441,6 @@ export default class Configuration {
424
441
  targetNode.runtime = runtimeKind;
425
442
  targetNode.active = node.active !== undefined ? node.active : true;
426
443
  targetNode.stop = node.stop !== undefined ? node.stop : false;
427
- // Pass `set_var` through verbatim — DO NOT default to `false`. The v2
428
- // default-store rule in PersistenceHelper persists `result.data` at
429
- // `state[name]` unless `set_var === false` is explicit. Defaulting to
430
- // `false` here silently disabled persistence for every SDK step,
431
- // breaking `js/ctx.state['<id>']` reads in v2 workflows
432
- // (cross-runtime-chain regressed: `state['go']` was undefined even
433
- // though the GO step ran fine).
434
- if (node.set_var !== undefined)
435
- targetNode.set_var = node.set_var;
436
444
  // V2 persistence knobs — flow through to PersistenceHelper.
437
445
  const v2 = node;
438
446
  if (v2.as !== undefined)
@@ -492,6 +500,31 @@ export default class Configuration {
492
500
  // `wait: false` triggers the fire-and-forget branch in SubworkflowNode.run.
493
501
  // Default to `true` (synchronous) when unset.
494
502
  subworkflowNode.wait = v2.wait !== false;
503
+ // v0.7 PR 4 — polymorphic sub-workflow dispatch carries the
504
+ // parent workflow's `trigger.webhook.namespace` so a resolved
505
+ // event-type name (e.g. `"invoice.paid"`) gets prefixed into a
506
+ // full registry name (e.g. `"stripe.invoice.paid"`). Static
507
+ // names are unaffected.
508
+ const triggerCfg = this.workflow?.trigger;
509
+ if (typeof triggerCfg?.webhook?.namespace === "string" && triggerCfg.webhook.namespace.length > 0) {
510
+ subworkflowNode.namespace = triggerCfg.webhook.namespace;
511
+ }
512
+ // G3 polymorphic dispatch — pass the per-step allowList (cleaned to
513
+ // non-empty strings by `normalizeSubworkflowStep`) onto the node so
514
+ // `resolveSubworkflowName` can reject unauthorized lookups at
515
+ // dispatch time without re-walking the workflow shape.
516
+ const allowListSource = node.allowList;
517
+ if (Array.isArray(allowListSource) && allowListSource.length > 0) {
518
+ subworkflowNode.allowList = Object.freeze(allowListSource.filter((s) => typeof s === "string" && s.length > 0));
519
+ }
520
+ // G2 (v0.6) — dispatch strategy. `in-process` (default) preserves
521
+ // the v0.5 behaviour; `http-self` routes the child via a fresh
522
+ // HTTP request to the deployment's own base URL so multi-process
523
+ // deployments can isolate child execution from the parent.
524
+ const dispatchRaw = node.dispatch;
525
+ if (dispatchRaw === "http-self" || dispatchRaw === "in-process") {
526
+ subworkflowNode.dispatch = dispatchRaw;
527
+ }
495
528
  // `globalOptions` is the runner's node registry — child Configuration.init
496
529
  // needs it for `module:` step resolution.
497
530
  subworkflowNode.globalOptions = this.globalOptions;
@@ -502,6 +535,8 @@ export default class Configuration {
502
535
  if (!nodeHandler) {
503
536
  throw new Error(`Node ${node.node} not found`);
504
537
  }
538
+ // Validate runtime requirements if the node declares them
539
+ this.validateNodeRuntimeRequirements(nodeHandler);
505
540
  const clone = Object.assign(Object.create(Object.getPrototypeOf(nodeHandler)), nodeHandler);
506
541
  // Copy step-level metadata from the workflow JSON onto the clone.
507
542
  // Without this, `step.type` is undefined for module nodes and
@@ -516,8 +551,6 @@ export default class Configuration {
516
551
  clone.active = node.active;
517
552
  if (node.stop !== undefined)
518
553
  clone.stop = node.stop;
519
- if (node.set_var !== undefined)
520
- clone.set_var = node.set_var;
521
554
  return clone;
522
555
  }
523
556
  /**
@@ -542,6 +575,96 @@ export default class Configuration {
542
575
  stub.waitUntil = v2.waitUntil;
543
576
  return stub;
544
577
  }
578
+ /**
579
+ * v0.5 · resolve a `forEach` step. The actual iteration logic lives
580
+ * in `ForEachNode.run()`; the inner `steps` array is pre-resolved by
581
+ * the existing isFlowWithProperties path in `getNodes()`.
582
+ */
583
+ async forEachResolver(node) {
584
+ const { ForEachNode } = await import("./ForEachNode");
585
+ const n = new ForEachNode();
586
+ n.node = node.node;
587
+ n.name = node.name;
588
+ n.type = node.type;
589
+ n.active = node.active !== undefined ? node.active : true;
590
+ n.stop = node.stop !== undefined ? node.stop : false;
591
+ return n;
592
+ }
593
+ /**
594
+ * v0.5 · resolve a `loop` step. While-loop semantics live in
595
+ * `LoopNode.run()`. Inner `steps` resolved by isFlowWithProperties.
596
+ */
597
+ async loopResolver(node) {
598
+ const { LoopNode } = await import("./LoopNode");
599
+ const n = new LoopNode();
600
+ n.node = node.node;
601
+ n.name = node.name;
602
+ n.type = node.type;
603
+ n.active = node.active !== undefined ? node.active : true;
604
+ n.stop = node.stop !== undefined ? node.stop : false;
605
+ return n;
606
+ }
607
+ /**
608
+ * v0.5 · resolve a `switch` step. The N-way match logic lives in
609
+ * `SwitchNode.run()`. Cases + default each carry their own resolved
610
+ * inner-step list — see the dedicated `cases` branch in `getNodes()`.
611
+ */
612
+ async switchResolver(node) {
613
+ const { SwitchNode } = await import("./SwitchNode");
614
+ const n = new SwitchNode();
615
+ n.node = node.node;
616
+ n.name = node.name;
617
+ n.type = node.type;
618
+ n.active = node.active !== undefined ? node.active : true;
619
+ n.stop = node.stop !== undefined ? node.stop : false;
620
+ return n;
621
+ }
622
+ /**
623
+ * v0.5 · resolve a `tryCatch` step. JS-like try/catch/finally semantics
624
+ * live in `TryCatchNode.run()`. Each block (try, catch, finally) is
625
+ * pre-resolved by the dedicated tryCatch branch in `getNodes()` so
626
+ * the runtime can dispatch them through child Runners on-demand.
627
+ */
628
+ async tryCatchResolver(node) {
629
+ const { TryCatchNode } = await import("./TryCatchNode");
630
+ const n = new TryCatchNode();
631
+ n.node = node.node;
632
+ n.name = node.name;
633
+ n.type = node.type;
634
+ n.active = node.active !== undefined ? node.active : true;
635
+ n.stop = node.stop !== undefined ? node.stop : false;
636
+ return n;
637
+ }
638
+ /**
639
+ * Check if a resolved node has runtimeRequirements and validate them
640
+ * against the currently known runtime versions in the RuntimeRegistry.
641
+ */
642
+ validateNodeRuntimeRequirements(node) {
643
+ const fnNode = node;
644
+ if (!fnNode.runtimeRequirements)
645
+ return;
646
+ const registry = RuntimeRegistry.getInstance();
647
+ const runtimeVersions = {};
648
+ for (const kind of registry.getRegisteredKinds()) {
649
+ const version = registry.getVersion(kind);
650
+ if (version) {
651
+ runtimeVersions[kind] = version;
652
+ }
653
+ }
654
+ // If no runtime versions are known yet, skip validation
655
+ // (versions are populated when health checks succeed)
656
+ if (Object.keys(runtimeVersions).length === 0)
657
+ return;
658
+ const validator = new RuntimeVersionValidator(runtimeVersions);
659
+ const results = validator.validateNode({
660
+ name: fnNode.name || "unknown",
661
+ runtimeRequirements: fnNode.runtimeRequirements,
662
+ });
663
+ const failures = results.filter((r) => !r.valid);
664
+ if (failures.length > 0) {
665
+ throw new Error(RuntimeVersionValidator.formatErrors(failures));
666
+ }
667
+ }
545
668
  async localResolver(node) {
546
669
  // Security review FW-3 — canonicalize the resolved path against
547
670
  // NODES_PATH so a node.node value like "../../malicious" can't