@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
@@ -15,8 +15,40 @@
15
15
  * an exporter).
16
16
  */
17
17
  import { metrics } from "@opentelemetry/api";
18
+ /**
19
+ * D6 (v0.6) — read the per-key opt-in env var. `concurrency_key` is
20
+ * potentially high-cardinality (per-user, per-tenant, …); emitting it as
21
+ * a metric label by default risks a cardinality explosion in any
22
+ * non-trivial deployment. Default OFF: strip the key before emission so
23
+ * counters stay bucketed by `workflow_name` alone. Opt in to per-key
24
+ * granularity with `BLOK_METRICS_PER_KEY=1` (or `=true`).
25
+ *
26
+ * Exported for test reuse (the strip helper below).
27
+ */
28
+ export function isPerKeyMetricsEnabled() {
29
+ const raw = process.env.BLOK_METRICS_PER_KEY;
30
+ return raw === "1" || raw === "true";
31
+ }
32
+ /**
33
+ * Pure helper — strips `concurrency_key` from a copy of `attrs` when
34
+ * per-key emission is disabled. Returns the original reference when
35
+ * enabled (no allocation on the hot path).
36
+ */
37
+ export function filterPerKeyAttrs(attrs, enabled) {
38
+ if (enabled || attrs.concurrency_key === undefined)
39
+ return attrs;
40
+ const { concurrency_key: _omitted, ...rest } = attrs;
41
+ return rest;
42
+ }
18
43
  export class ConcurrencyMetrics {
19
44
  static instance = null;
45
+ /**
46
+ * Captured at construction time — the constructor is private + the
47
+ * singleton is only reset in tests, so this stays stable for the
48
+ * lifetime of a process. Tests that toggle the env var call
49
+ * `resetInstance()` before re-`getInstance()` to pick up the flip.
50
+ */
51
+ perKeyEnabled = isPerKeyMetricsEnabled();
20
52
  acquiredCounter = metrics.getMeter("blok").createCounter("blok_concurrency_acquired_total", {
21
53
  description: "Total concurrency slots acquired (per workflow + key).",
22
54
  unit: "1",
@@ -78,13 +110,13 @@ export class ConcurrencyMetrics {
78
110
  ConcurrencyMetrics.instance = null;
79
111
  }
80
112
  recordAcquired(attrs) {
81
- this.acquiredCounter.add(1, attrs);
113
+ this.acquiredCounter.add(1, filterPerKeyAttrs(attrs, this.perKeyEnabled));
82
114
  }
83
115
  recordDenied(attrs) {
84
- this.deniedCounter.add(1, attrs);
116
+ this.deniedCounter.add(1, filterPerKeyAttrs(attrs, this.perKeyEnabled));
85
117
  }
86
118
  recordReleased(attrs) {
87
- this.releasedCounter.add(1, attrs);
119
+ this.releasedCounter.add(1, filterPerKeyAttrs(attrs, this.perKeyEnabled));
88
120
  }
89
121
  recordDispatchRecovered(attrs) {
90
122
  this.dispatchRecoveredCounter.add(1, attrs);
@@ -101,7 +133,7 @@ export class ConcurrencyMetrics {
101
133
  }
102
134
  // PR 3 D2 — OCC retry depth + outcome (success | denied | fail-closed).
103
135
  recordOccRetries(attrs, attempts) {
104
- this.occRetriesHistogram.record(attempts, attrs);
136
+ this.occRetriesHistogram.record(attempts, filterPerKeyAttrs(attrs, this.perKeyEnabled));
105
137
  }
106
138
  }
107
139
  //# sourceMappingURL=ConcurrencyMetrics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConcurrencyMetrics.js","sourceRoot":"","sources":["../../src/monitoring/ConcurrencyMetrics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConcurrencyMetrics.js","sourceRoot":"","sources":["../../src/monitoring/ConcurrencyMetrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * v0.6 Phase 3 — OTel counter for parallel forEach + wait observability.
3
+ * Incremented at cursor-write time with the count of iterations
4
+ * cancelled because a peer fired a wait. Lets ops dashboards spot
5
+ * workflows that frequently waste work on cancel + re-launch — usually
6
+ * a signal that the author should switch to sequential forEach OR add
7
+ * `idempotencyKey` to inner steps so the re-launches are cache hits.
8
+ *
9
+ * Singleton, lazy-instantiated. No-ops cleanly when OTel isn't
10
+ * configured (the meter API silently swallows recordings without an
11
+ * exporter).
12
+ */
13
+ export declare class ForEachWaitMetrics {
14
+ private static instance;
15
+ private readonly cancelledCounter;
16
+ static getInstance(): ForEachWaitMetrics;
17
+ static resetInstance(): void;
18
+ recordCancellation(opts: {
19
+ workflowName: string;
20
+ cancelledCount: number;
21
+ }): void;
22
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * v0.6 Phase 3 — OTel counter for parallel forEach + wait observability.
3
+ * Incremented at cursor-write time with the count of iterations
4
+ * cancelled because a peer fired a wait. Lets ops dashboards spot
5
+ * workflows that frequently waste work on cancel + re-launch — usually
6
+ * a signal that the author should switch to sequential forEach OR add
7
+ * `idempotencyKey` to inner steps so the re-launches are cache hits.
8
+ *
9
+ * Singleton, lazy-instantiated. No-ops cleanly when OTel isn't
10
+ * configured (the meter API silently swallows recordings without an
11
+ * exporter).
12
+ */
13
+ import { metrics } from "@opentelemetry/api";
14
+ export class ForEachWaitMetrics {
15
+ static instance = null;
16
+ cancelledCounter = metrics.getMeter("blok").createCounter("blok_foreach_wait_cancelled_total", {
17
+ description: "Iterations cancelled because a peer fired a wait inside a parallel forEach. High values signal authors should add idempotencyKey to inner steps.",
18
+ unit: "1",
19
+ });
20
+ static getInstance() {
21
+ if (!ForEachWaitMetrics.instance) {
22
+ ForEachWaitMetrics.instance = new ForEachWaitMetrics();
23
+ }
24
+ return ForEachWaitMetrics.instance;
25
+ }
26
+ static resetInstance() {
27
+ ForEachWaitMetrics.instance = null;
28
+ }
29
+ recordCancellation(opts) {
30
+ if (opts.cancelledCount <= 0)
31
+ return;
32
+ const attrs = { workflow_name: opts.workflowName };
33
+ this.cancelledCounter.add(opts.cancelledCount, attrs);
34
+ }
35
+ }
36
+ //# sourceMappingURL=ForEachWaitMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForEachWaitMetrics.js","sourceRoot":"","sources":["../../src/monitoring/ForEachWaitMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAmB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,OAAO,kBAAkB;IACtB,MAAM,CAAC,QAAQ,GAA8B,IAAI,CAAC;IAEzC,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,mCAAmC,EAAE;QAC/G,WAAW,EACV,kJAAkJ;QACnJ,IAAI,EAAE,GAAG;KACT,CAAC,CAAC;IAEH,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;YAClC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,aAAa;QACnB,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACpC,CAAC;IAED,kBAAkB,CAAC,IAAsD;QACxE,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC;YAAE,OAAO;QACrC,MAAM,KAAK,GAAe,EAAE,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC"}
@@ -180,7 +180,12 @@ export class OpenAPIGenerator {
180
180
  return this.jsonToYaml(spec);
181
181
  }
182
182
  buildOperation(workflow) {
183
+ // Caller (`generate()`) only invokes `buildOperation` for workflows
184
+ // that have an http trigger; defensive check keeps the type exact.
183
185
  const httpTrigger = workflow.trigger.http;
186
+ if (!httpTrigger) {
187
+ throw new Error(`[OpenAPIGenerator] workflow "${workflow.name}" has no http trigger — cannot build operation`);
188
+ }
184
189
  const method = (httpTrigger.method || "GET").toUpperCase();
185
190
  const tag = this.inferTag(workflow);
186
191
  const operation = {
@@ -219,7 +224,7 @@ export class OpenAPIGenerator {
219
224
  // Extract path parameters
220
225
  const pathParams = this.extractPathParams(httpTrigger.path);
221
226
  for (const param of pathParams) {
222
- operation.parameters.push({
227
+ operation.parameters?.push({
223
228
  name: param,
224
229
  in: "path",
225
230
  required: true,
@@ -238,7 +243,7 @@ export class OpenAPIGenerator {
238
243
  };
239
244
  }
240
245
  // Add requestId query parameter
241
- operation.parameters.push({
246
+ operation.parameters?.push({
242
247
  name: "requestId",
243
248
  in: "query",
244
249
  required: false,
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAPIGenerator.js","sourceRoot":"","sources":["../../src/openapi/OpenAPIGenerator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OpenAPIGenerator.js","sourceRoot":"","sources":["../../src/openapi/OpenAPIGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * PrimitiveStack — v0.6 Phase 4 — runtime call stack of active
3
+ * primitives (forEach, loop, switch) currently executing a sub-
4
+ * pipeline.
5
+ *
6
+ * The Phase 1-3 single-slot machinery (`_blokActivePrimitiveNodeRunId`,
7
+ * `_blokForEachCurrentIteration`, `_blokForEachPartialResults`)
8
+ * could only track ONE primitive at a time. That's fine for
9
+ * `forEach > wait` and `loop > wait`, but the moment a wait fires
10
+ * inside `forEach > forEach > wait` (or `switch > forEach > wait`,
11
+ * etc.) the inner primitive overwrites the outer's sentinels —
12
+ * only the inner cursor lands in `node_runs.iteration_context`, and
13
+ * the outer primitive resumes from iteration 0 instead of iteration
14
+ * N. Phase 4 replaces the single-slot model with this stack so each
15
+ * primitive writes its own NodeRun's cursor frame on wait-throw.
16
+ *
17
+ * Mechanics:
18
+ *
19
+ * - **Each primitive pushes a frame on entry, pops in finally.**
20
+ * `cursor` is an `IterationContext` whose discriminator (`mode`)
21
+ * tells the persistence + resume code paths what shape to expect
22
+ * ("sequential" / "parallel" / "switch").
23
+ * - **The primitive owns the cursor's iteration/case state.** It
24
+ * updates `frame.cursor.iteration` (forEach/loop) or
25
+ * `frame.cursor.caseIndex` (switch) and
26
+ * `frame.cursor.completedResults` as the sub-pipeline progresses.
27
+ * - **RunnerSteps owns the inner-step cursor.** At each step
28
+ * boundary inside a deep runSteps, the runner sets the TOP
29
+ * frame's `cursor.innerStepIndex = i` so a wait fired at that step
30
+ * gets the right cursor written.
31
+ * - **The wait-throw site walks the whole stack** and persists each
32
+ * frame to its respective NodeRun. On resume, every primitive
33
+ * looks itself up by NodeRun id in the rehydrated cursor map
34
+ * (see `_blokIterationCursors` populated by `TriggerBase.run`).
35
+ *
36
+ * The stack lives on `ctx._blokPrimitiveStack` so the per-iteration
37
+ * child-ctx shallow spread inside ForEachNode / LoopNode / SwitchNode
38
+ * preserves the reference; pushes from a nested primitive are visible
39
+ * to the outer runSteps because they share the array.
40
+ */
41
+ import type { Context } from "@blokjs/shared";
42
+ import type { IterationContext } from "../tracing/types";
43
+ export interface PrimitiveStackFrame {
44
+ /** NodeRun id of the primitive that owns this frame. */
45
+ nodeRunId: string;
46
+ /** Iteration / case cursor — mutated in place as the sub-pipeline progresses. */
47
+ cursor: IterationContext;
48
+ }
49
+ export declare function getPrimitiveStack(ctx: Context): PrimitiveStackFrame[];
50
+ export declare function pushPrimitiveFrame(ctx: Context, frame: PrimitiveStackFrame): void;
51
+ export declare function popPrimitiveFrame(ctx: Context): PrimitiveStackFrame | undefined;
52
+ export declare function peekPrimitiveFrame(ctx: Context): PrimitiveStackFrame | undefined;
53
+ /**
54
+ * Read the cursor stamped onto `ctx._blokIterationCursors` for the
55
+ * given primitive step name. The map is keyed by step NAME (not
56
+ * NodeRun id) because NodeRun ids change on every dispatchDeferred
57
+ * re-entry while step names are stable. Returns `undefined` when no
58
+ * cursor was rehydrated (fresh run, no waits, sibling primitive).
59
+ * After successful resume, primitives should call
60
+ * {@link consumeRehydratedCursor} to clear the entry so sibling
61
+ * primitives later in the workflow don't accidentally re-resume.
62
+ */
63
+ export declare function readRehydratedCursor(ctx: Context, stepName: string): IterationContext | undefined;
64
+ export declare function consumeRehydratedCursor(ctx: Context, stepName: string): void;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * PrimitiveStack — v0.6 Phase 4 — runtime call stack of active
3
+ * primitives (forEach, loop, switch) currently executing a sub-
4
+ * pipeline.
5
+ *
6
+ * The Phase 1-3 single-slot machinery (`_blokActivePrimitiveNodeRunId`,
7
+ * `_blokForEachCurrentIteration`, `_blokForEachPartialResults`)
8
+ * could only track ONE primitive at a time. That's fine for
9
+ * `forEach > wait` and `loop > wait`, but the moment a wait fires
10
+ * inside `forEach > forEach > wait` (or `switch > forEach > wait`,
11
+ * etc.) the inner primitive overwrites the outer's sentinels —
12
+ * only the inner cursor lands in `node_runs.iteration_context`, and
13
+ * the outer primitive resumes from iteration 0 instead of iteration
14
+ * N. Phase 4 replaces the single-slot model with this stack so each
15
+ * primitive writes its own NodeRun's cursor frame on wait-throw.
16
+ *
17
+ * Mechanics:
18
+ *
19
+ * - **Each primitive pushes a frame on entry, pops in finally.**
20
+ * `cursor` is an `IterationContext` whose discriminator (`mode`)
21
+ * tells the persistence + resume code paths what shape to expect
22
+ * ("sequential" / "parallel" / "switch").
23
+ * - **The primitive owns the cursor's iteration/case state.** It
24
+ * updates `frame.cursor.iteration` (forEach/loop) or
25
+ * `frame.cursor.caseIndex` (switch) and
26
+ * `frame.cursor.completedResults` as the sub-pipeline progresses.
27
+ * - **RunnerSteps owns the inner-step cursor.** At each step
28
+ * boundary inside a deep runSteps, the runner sets the TOP
29
+ * frame's `cursor.innerStepIndex = i` so a wait fired at that step
30
+ * gets the right cursor written.
31
+ * - **The wait-throw site walks the whole stack** and persists each
32
+ * frame to its respective NodeRun. On resume, every primitive
33
+ * looks itself up by NodeRun id in the rehydrated cursor map
34
+ * (see `_blokIterationCursors` populated by `TriggerBase.run`).
35
+ *
36
+ * The stack lives on `ctx._blokPrimitiveStack` so the per-iteration
37
+ * child-ctx shallow spread inside ForEachNode / LoopNode / SwitchNode
38
+ * preserves the reference; pushes from a nested primitive are visible
39
+ * to the outer runSteps because they share the array.
40
+ */
41
+ const STACK_KEY = "_blokPrimitiveStack";
42
+ export function getPrimitiveStack(ctx) {
43
+ const stack = ctx[STACK_KEY];
44
+ if (Array.isArray(stack))
45
+ return stack;
46
+ return [];
47
+ }
48
+ export function pushPrimitiveFrame(ctx, frame) {
49
+ const ctxAny = ctx;
50
+ let stack = ctxAny[STACK_KEY];
51
+ if (!Array.isArray(stack)) {
52
+ stack = [];
53
+ ctxAny[STACK_KEY] = stack;
54
+ }
55
+ stack.push(frame);
56
+ }
57
+ export function popPrimitiveFrame(ctx) {
58
+ const ctxAny = ctx;
59
+ const stack = ctxAny[STACK_KEY];
60
+ if (!Array.isArray(stack) || stack.length === 0)
61
+ return undefined;
62
+ return stack.pop();
63
+ }
64
+ export function peekPrimitiveFrame(ctx) {
65
+ const stack = getPrimitiveStack(ctx);
66
+ if (stack.length === 0)
67
+ return undefined;
68
+ return stack[stack.length - 1];
69
+ }
70
+ /**
71
+ * Read the cursor stamped onto `ctx._blokIterationCursors` for the
72
+ * given primitive step name. The map is keyed by step NAME (not
73
+ * NodeRun id) because NodeRun ids change on every dispatchDeferred
74
+ * re-entry while step names are stable. Returns `undefined` when no
75
+ * cursor was rehydrated (fresh run, no waits, sibling primitive).
76
+ * After successful resume, primitives should call
77
+ * {@link consumeRehydratedCursor} to clear the entry so sibling
78
+ * primitives later in the workflow don't accidentally re-resume.
79
+ */
80
+ export function readRehydratedCursor(ctx, stepName) {
81
+ const map = ctx._blokIterationCursors;
82
+ if (!(map instanceof Map))
83
+ return undefined;
84
+ return map.get(stepName);
85
+ }
86
+ export function consumeRehydratedCursor(ctx, stepName) {
87
+ const map = ctx._blokIterationCursors;
88
+ if (map instanceof Map) {
89
+ map.delete(stepName);
90
+ }
91
+ }
92
+ //# sourceMappingURL=PrimitiveStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrimitiveStack.js","sourceRoot":"","sources":["../../src/runtime/PrimitiveStack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAKH,MAAM,SAAS,GAAG,qBAAqB,CAAC;AASxC,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC7C,MAAM,KAAK,GAAI,GAA+B,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAA8B,CAAC;IAChE,OAAO,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAY,EAAE,KAA0B;IAC1E,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,IAAI,KAAK,GAAG,MAAM,CAAC,SAAS,CAAsC,CAAC;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK,GAAG,EAAE,CAAC;QACX,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC7C,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAsC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC9C,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY,EAAE,QAAgB;IAClE,MAAM,GAAG,GAAI,GAA+B,CAAC,qBAAqB,CAAC;IACnE,IAAI,CAAC,CAAC,GAAG,YAAY,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAQ,GAAqC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAY,EAAE,QAAgB;IACrE,MAAM,GAAG,GAAI,GAA+B,CAAC,qBAAqB,CAAC;IACnE,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;QACvB,GAAqC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;AACF,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Tier C #1 · Cross-process debounce backend interface.
3
+ *
4
+ * Mirrors the relationship between `ConcurrencyBackend` and the
5
+ * `RunStore`-backed concurrency gate: an optional async capability that
6
+ * lets `DebounceCoordinator` coordinate windows across processes
7
+ * (NATS KV, Redis) instead of relying on the local in-memory Map.
8
+ *
9
+ * Default behavior is unchanged — when no backend is set, the
10
+ * coordinator uses its existing in-memory state. The backend is opt-in
11
+ * via `BLOK_DEBOUNCE_BACKEND={nats-kv|redis}` and installed by trigger
12
+ * packages during `listen()`.
13
+ *
14
+ * **Semantic trade-off**: this v1 ships *owner-local payload*
15
+ * semantics. The owning process's captured closure (`onFire`) fires
16
+ * when its local timer elapses; payloads from coalesce pings on other
17
+ * processes are dropped (the doc only records `pingCount`,
18
+ * `lastPingAt`, and `scheduledAt`). Cross-process latest-payload-wins
19
+ * is a deferred follow-up — would require persisting each ping's
20
+ * payload to the shared doc.
21
+ */
22
+ export type DebounceBackendMode = "leading" | "trailing";
23
+ export interface DebounceRegisterBackendOpts {
24
+ workflowName: string;
25
+ debounceKey: string;
26
+ mode: DebounceBackendMode;
27
+ delayMs: number;
28
+ maxDelayMs?: number;
29
+ /** Run id allocated by the caller for THIS ping. */
30
+ runId: string;
31
+ /** Process identity used for owner-lease attribution. */
32
+ processId: string;
33
+ /** Owner lease in ms — when expired, another process can take over. */
34
+ ownerLeaseMs: number;
35
+ /** Current wall-clock ms. */
36
+ now: number;
37
+ }
38
+ /**
39
+ * Result of a `registerPing`. Three outcomes, mirroring the
40
+ * single-process `DebounceRegisterResult` shape:
41
+ *
42
+ * - `"owner-new"` — caller is the new owner of a fresh window.
43
+ * For leading mode: fire synchronously. For trailing mode: start a
44
+ * local timer to fire at `scheduledAt`.
45
+ * - `"owner-extend"` — caller is the existing owner; window extended.
46
+ * Cancel + restart local timer to fire at the new `scheduledAt`.
47
+ * - `"coalesce"` — caller is NOT the owner. Mark the run `debounced`
48
+ * with `intoRunId = activeRunId`.
49
+ */
50
+ export interface DebounceRegisterBackendResult {
51
+ outcome: "owner-new" | "owner-extend" | "coalesce";
52
+ activeRunId: string;
53
+ /** The runId of the OWNING process. Equal to opts.runId when outcome ∈ {owner-new, owner-extend}; differs on coalesce. */
54
+ scheduledAt: number;
55
+ pingCount: number;
56
+ }
57
+ /**
58
+ * Result of a `finalize` call from an owning process's local timer.
59
+ *
60
+ * - `"fire"` — caller still owns AND the silence period elapsed.
61
+ * Bucket has been atomically DELETEd; caller dispatches.
62
+ * - `"reschedule"` — caller still owns, but coalesce pings from other
63
+ * processes pushed `scheduledAt` forward. Caller restarts local
64
+ * timer for `scheduledAt - now`.
65
+ * - `"abandoned"` — caller's lease expired and another process took
66
+ * ownership. Caller silently drops the closure.
67
+ */
68
+ export type DebounceFinalizeResult = {
69
+ finalize: "fire";
70
+ } | {
71
+ finalize: "reschedule";
72
+ scheduledAt: number;
73
+ } | {
74
+ finalize: "abandoned";
75
+ };
76
+ export interface DebounceBackend {
77
+ /** Identifying string for logs/metrics. e.g. `"nats-kv"`, `"redis"`. */
78
+ readonly name: string;
79
+ /** Lifecycle — open the underlying connection. Idempotent. */
80
+ connect(): Promise<void>;
81
+ /** Lifecycle — close the underlying connection. Idempotent. */
82
+ disconnect(): Promise<void>;
83
+ /**
84
+ * Atomically record a ping against the `(workflow, debounceKey)`
85
+ * bucket and decide ownership. Returns one of the three outcomes
86
+ * documented on {@link DebounceRegisterBackendResult}.
87
+ */
88
+ registerPing(opts: DebounceRegisterBackendOpts): Promise<DebounceRegisterBackendResult>;
89
+ /**
90
+ * Owner calls this on local timer fire. Atomically:
91
+ * - If `runId` still owns AND `now >= scheduledAt` → DELETE the
92
+ * bucket and return `{finalize: "fire"}`.
93
+ * - If `runId` still owns but `now < scheduledAt` → return
94
+ * `{finalize: "reschedule", scheduledAt}`.
95
+ * - If `runId` no longer owns (lease expired + handoff) → return
96
+ * `{finalize: "abandoned"}`.
97
+ */
98
+ finalize(workflowName: string, debounceKey: string, runId: string, now: number): Promise<DebounceFinalizeResult>;
99
+ /** Cancel an active window without firing. Returns true if cancelled. */
100
+ cancel(workflowName: string, debounceKey: string): Promise<boolean>;
101
+ /**
102
+ * Janitor sweep — purge every bucket whose owner lease expired
103
+ * AND whose `scheduledAt` is in the past. Returns the count of
104
+ * purged buckets. Cheap per-bucket lazy-purge happens inside the
105
+ * registerPing/finalize scripts.
106
+ */
107
+ purgeExpired(now: number): Promise<number>;
108
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Tier C #1 · Cross-process debounce backend interface.
3
+ *
4
+ * Mirrors the relationship between `ConcurrencyBackend` and the
5
+ * `RunStore`-backed concurrency gate: an optional async capability that
6
+ * lets `DebounceCoordinator` coordinate windows across processes
7
+ * (NATS KV, Redis) instead of relying on the local in-memory Map.
8
+ *
9
+ * Default behavior is unchanged — when no backend is set, the
10
+ * coordinator uses its existing in-memory state. The backend is opt-in
11
+ * via `BLOK_DEBOUNCE_BACKEND={nats-kv|redis}` and installed by trigger
12
+ * packages during `listen()`.
13
+ *
14
+ * **Semantic trade-off**: this v1 ships *owner-local payload*
15
+ * semantics. The owning process's captured closure (`onFire`) fires
16
+ * when its local timer elapses; payloads from coalesce pings on other
17
+ * processes are dropped (the doc only records `pingCount`,
18
+ * `lastPingAt`, and `scheduledAt`). Cross-process latest-payload-wins
19
+ * is a deferred follow-up — would require persisting each ping's
20
+ * payload to the shared doc.
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=DebounceBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebounceBackend.js","sourceRoot":"","sources":["../../src/scheduling/DebounceBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
@@ -1,19 +1,32 @@
1
1
  /**
2
- * Tier 2 #7 — in-memory debounce coordinator.
2
+ * Tier 2 #7 — debounce coordinator. Tier C #1 — cross-process awareness.
3
3
  *
4
4
  * Coalesces rapid same-key triggers into a single delayed run. Modes:
5
5
  *
6
6
  * - `"trailing"` (default): each ping resets a timer; the run fires
7
- * after `delayMs` of silence. Latest payload wins. `maxDelayMs`
8
- * bounds tail latency — even with continuous pings, the run fires
9
- * after `maxDelayMs` from the FIRST ping.
7
+ * after `delayMs` of silence. Latest payload wins (within a single
8
+ * owning process). `maxDelayMs` bounds tail latency — even with
9
+ * continuous pings, the run fires after `maxDelayMs` from the FIRST
10
+ * ping.
10
11
  * - `"leading"`: the first ping fires immediately. Subsequent pings
11
12
  * within `delayMs` are dropped. Window resets after `delayMs` of
12
13
  * silence.
13
14
  *
14
- * Process-wide singleton. In-memory only for v1 cross-process
15
- * debounce keys are a deferred follow-up.
15
+ * Process-wide singleton. **Default**: in-memory only — fast,
16
+ * synchronous internally. **Cross-process mode (Tier C #1)**: install a
17
+ * `DebounceBackend` via `setBackend()` and the coordinator routes
18
+ * register/cancel through the backend with the same outcome surface,
19
+ * keeping a local timer + closure for the OWNING process. The
20
+ * `register()` API is async — callers must `await` it.
21
+ *
22
+ * Latest-payload semantics in cross-process mode: **owner-local**.
23
+ * Pings from a non-owning process bump pingCount + push scheduledAt in
24
+ * the shared doc but do NOT contribute their payload — only the
25
+ * owning process's captured `onFire` closure fires. Cross-process
26
+ * latest-payload-wins is deferred (would require persisting each
27
+ * ping's payload to the shared doc; tracked in BACKLOG).
16
28
  */
29
+ import type { DebounceBackend } from "./DebounceBackend";
17
30
  export type DebounceDispatchFn = () => Promise<void>;
18
31
  export type DebounceMode = "leading" | "trailing";
19
32
  export interface DebounceRegisterOpts {
@@ -71,18 +84,58 @@ export interface DebounceRegisterResult {
71
84
  export declare class DebounceCoordinator {
72
85
  private static instance;
73
86
  private states;
87
+ private backend;
88
+ /** Process identity for cross-process owner-lease attribution. Stable for the lifetime of the singleton. */
89
+ private readonly processId;
90
+ private ownerLeaseMs;
74
91
  static getInstance(): DebounceCoordinator;
75
92
  /** Test-only — reset the singleton + clear all state. */
76
93
  static resetInstance(): void;
94
+ /**
95
+ * Install a cross-process backend. Set via `HttpTrigger.listen()` /
96
+ * `WorkerTrigger.listen()` when `BLOK_DEBOUNCE_BACKEND` is configured.
97
+ * Pass `null` to revert to the in-memory fast path.
98
+ */
99
+ setBackend(backend: DebounceBackend | null): void;
100
+ getBackend(): DebounceBackend | null;
101
+ /**
102
+ * Override the owner-lease duration. Used by `HttpTrigger.listen()` /
103
+ * `WorkerTrigger.listen()` to apply `BLOK_DEBOUNCE_OWNER_LEASE_MS`.
104
+ */
105
+ setOwnerLeaseMs(ms: number): void;
77
106
  private bucket;
78
- register(opts: DebounceRegisterOpts): DebounceRegisterResult;
79
- private fireTrailing;
107
+ register(opts: DebounceRegisterOpts): Promise<DebounceRegisterResult>;
108
+ /**
109
+ * In-memory fast path — preserved exactly from the v1 single-process
110
+ * implementation. Synchronous internally; the outer signature is
111
+ * async so callers don't need to discriminate.
112
+ */
113
+ private registerLocal;
114
+ private fireTrailingLocal;
115
+ /**
116
+ * Cross-process path — delegates ownership to the backend and uses
117
+ * a local timer + closure for the OWNING process.
118
+ *
119
+ * Three outcomes from the backend:
120
+ * - `owner-new`: this process is the new owner. Start a local timer
121
+ * + closure; on fire, atomically finalize via the backend.
122
+ * - `owner-extend`: this process is already the owner. Cancel +
123
+ * restart the local timer at the new scheduledAt; refresh closure.
124
+ * - `coalesce`: another process owns the window. Just return.
125
+ *
126
+ * Leading mode: `owner-new` translates to `fire-immediate` (caller
127
+ * fires synchronously); `owner-extend`/`coalesce` translate to
128
+ * `coalesce`.
129
+ */
130
+ private registerCrossProcess;
131
+ private installOwnerTimer;
132
+ private fireTrailingCrossProcess;
80
133
  /** Cancel an active window without firing. Returns true if cancelled. */
81
- cancel(workflowName: string, debounceKey: string): boolean;
82
- /** Number of active debounce windows. Tests + observability. */
134
+ cancel(workflowName: string, debounceKey: string): Promise<boolean>;
135
+ /** Number of active LOCAL debounce windows. Tests + observability. Excludes cross-process windows owned by other processes. */
83
136
  size(): number;
84
- /** True if a window is open for `(workflow, key)`. */
137
+ /** True if THIS process has a local window for `(workflow, key)`. Excludes windows owned by other processes. */
85
138
  has(workflowName: string, debounceKey: string): boolean;
86
- /** Cancel everything without firing. */
139
+ /** Cancel everything without firing. Local state only — cross-process buckets fall back to lease-expiry. */
87
140
  clear(): void;
88
141
  }