@blokjs/runner 0.2.2 → 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 (213) hide show
  1. package/dist/Blok.js +32 -3
  2. package/dist/Blok.js.map +1 -1
  3. package/dist/Configuration.d.ts +59 -5
  4. package/dist/Configuration.js +366 -96
  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/PayloadTooLargeError.d.ts +19 -0
  16. package/dist/PayloadTooLargeError.js +29 -0
  17. package/dist/PayloadTooLargeError.js.map +1 -0
  18. package/dist/RunCancelledError.d.ts +17 -0
  19. package/dist/RunCancelledError.js +25 -0
  20. package/dist/RunCancelledError.js.map +1 -0
  21. package/dist/Runner.d.ts +11 -1
  22. package/dist/Runner.js +9 -2
  23. package/dist/Runner.js.map +1 -1
  24. package/dist/RunnerSteps.js +648 -44
  25. package/dist/RunnerSteps.js.map +1 -1
  26. package/dist/RuntimeAdapterNode.d.ts +2 -1
  27. package/dist/RuntimeAdapterNode.js +2 -2
  28. package/dist/RuntimeAdapterNode.js.map +1 -1
  29. package/dist/RuntimeRegistry.d.ts +23 -2
  30. package/dist/RuntimeRegistry.js +31 -2
  31. package/dist/RuntimeRegistry.js.map +1 -1
  32. package/dist/SubworkflowNode.d.ts +181 -0
  33. package/dist/SubworkflowNode.js +479 -0
  34. package/dist/SubworkflowNode.js.map +1 -0
  35. package/dist/SwitchNode.d.ts +37 -0
  36. package/dist/SwitchNode.js +153 -0
  37. package/dist/SwitchNode.js.map +1 -0
  38. package/dist/TriggerBase.d.ts +178 -0
  39. package/dist/TriggerBase.js +1032 -5
  40. package/dist/TriggerBase.js.map +1 -1
  41. package/dist/TryCatchNode.d.ts +32 -0
  42. package/dist/TryCatchNode.js +207 -0
  43. package/dist/TryCatchNode.js.map +1 -0
  44. package/dist/WaitDispatchRequest.d.ts +38 -0
  45. package/dist/WaitDispatchRequest.js +13 -0
  46. package/dist/WaitDispatchRequest.js.map +1 -0
  47. package/dist/WaitNode.d.ts +23 -0
  48. package/dist/WaitNode.js +26 -0
  49. package/dist/WaitNode.js.map +1 -0
  50. package/dist/adapters/grpc/GrpcCodec.js +2 -2
  51. package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +6 -4
  52. package/dist/adapters/grpc/GrpcRuntimeAdapter.js +6 -4
  53. package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -1
  54. package/dist/adapters/grpc/types.d.ts +7 -5
  55. package/dist/adapters/grpc/types.js.map +1 -1
  56. package/dist/adapters/transport.d.ts +12 -41
  57. package/dist/adapters/transport.js +21 -70
  58. package/dist/adapters/transport.js.map +1 -1
  59. package/dist/cache/NodeResultCache.js +7 -0
  60. package/dist/cache/NodeResultCache.js.map +1 -1
  61. package/dist/concurrency/ConcurrencyBackend.d.ts +61 -0
  62. package/dist/concurrency/ConcurrencyBackend.js +20 -0
  63. package/dist/concurrency/ConcurrencyBackend.js.map +1 -0
  64. package/dist/concurrency/ConcurrencyLimitError.d.ts +37 -0
  65. package/dist/concurrency/ConcurrencyLimitError.js +16 -0
  66. package/dist/concurrency/ConcurrencyLimitError.js.map +1 -0
  67. package/dist/concurrency/NatsKvConcurrencyBackend.d.ts +64 -0
  68. package/dist/concurrency/NatsKvConcurrencyBackend.js +310 -0
  69. package/dist/concurrency/NatsKvConcurrencyBackend.js.map +1 -0
  70. package/dist/concurrency/QueueExpiredError.d.ts +40 -0
  71. package/dist/concurrency/QueueExpiredError.js +15 -0
  72. package/dist/concurrency/QueueExpiredError.js.map +1 -0
  73. package/dist/concurrency/RedisConcurrencyBackend.d.ts +64 -0
  74. package/dist/concurrency/RedisConcurrencyBackend.js +374 -0
  75. package/dist/concurrency/RedisConcurrencyBackend.js.map +1 -0
  76. package/dist/concurrency/createConcurrencyBackend.d.ts +24 -0
  77. package/dist/concurrency/createConcurrencyBackend.js +38 -0
  78. package/dist/concurrency/createConcurrencyBackend.js.map +1 -0
  79. package/dist/concurrency/readConcurrencyConfig.d.ts +60 -0
  80. package/dist/concurrency/readConcurrencyConfig.js +60 -0
  81. package/dist/concurrency/readConcurrencyConfig.js.map +1 -0
  82. package/dist/defineNode.d.ts +8 -0
  83. package/dist/defineNode.js +25 -5
  84. package/dist/defineNode.js.map +1 -1
  85. package/dist/graphql/GraphQLSchemaGenerator.js +1 -1
  86. package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -1
  87. package/dist/idempotency/resolveIdempotencyKey.d.ts +20 -0
  88. package/dist/idempotency/resolveIdempotencyKey.js +37 -0
  89. package/dist/idempotency/resolveIdempotencyKey.js.map +1 -0
  90. package/dist/index.d.ts +30 -6
  91. package/dist/index.js +55 -6
  92. package/dist/index.js.map +1 -1
  93. package/dist/marketplace/RuntimeCatalog.d.ts +6 -0
  94. package/dist/marketplace/RuntimeCatalog.js.map +1 -1
  95. package/dist/marketplace/RuntimeDiscovery.d.ts +2 -2
  96. package/dist/marketplace/RuntimeDiscovery.js +18 -6
  97. package/dist/marketplace/RuntimeDiscovery.js.map +1 -1
  98. package/dist/monitoring/ConcurrencyMetrics.d.ts +82 -0
  99. package/dist/monitoring/ConcurrencyMetrics.js +139 -0
  100. package/dist/monitoring/ConcurrencyMetrics.js.map +1 -0
  101. package/dist/monitoring/ForEachWaitMetrics.d.ts +22 -0
  102. package/dist/monitoring/ForEachWaitMetrics.js +36 -0
  103. package/dist/monitoring/ForEachWaitMetrics.js.map +1 -0
  104. package/dist/monitoring/JanitorMetrics.d.ts +27 -0
  105. package/dist/monitoring/JanitorMetrics.js +48 -0
  106. package/dist/monitoring/JanitorMetrics.js.map +1 -0
  107. package/dist/openapi/OpenAPIGenerator.js +7 -2
  108. package/dist/openapi/OpenAPIGenerator.js.map +1 -1
  109. package/dist/runtime/PrimitiveStack.d.ts +64 -0
  110. package/dist/runtime/PrimitiveStack.js +92 -0
  111. package/dist/runtime/PrimitiveStack.js.map +1 -0
  112. package/dist/scheduling/DebounceBackend.d.ts +108 -0
  113. package/dist/scheduling/DebounceBackend.js +23 -0
  114. package/dist/scheduling/DebounceBackend.js.map +1 -0
  115. package/dist/scheduling/DebounceCoordinator.d.ts +141 -0
  116. package/dist/scheduling/DebounceCoordinator.js +362 -0
  117. package/dist/scheduling/DebounceCoordinator.js.map +1 -0
  118. package/dist/scheduling/DeferredDispatchSignal.d.ts +50 -0
  119. package/dist/scheduling/DeferredDispatchSignal.js +14 -0
  120. package/dist/scheduling/DeferredDispatchSignal.js.map +1 -0
  121. package/dist/scheduling/DeferredRunScheduler.d.ts +96 -0
  122. package/dist/scheduling/DeferredRunScheduler.js +256 -0
  123. package/dist/scheduling/DeferredRunScheduler.js.map +1 -0
  124. package/dist/scheduling/NatsKvDebounceBackend.d.ts +53 -0
  125. package/dist/scheduling/NatsKvDebounceBackend.js +334 -0
  126. package/dist/scheduling/NatsKvDebounceBackend.js.map +1 -0
  127. package/dist/scheduling/RedisDebounceBackend.d.ts +49 -0
  128. package/dist/scheduling/RedisDebounceBackend.js +356 -0
  129. package/dist/scheduling/RedisDebounceBackend.js.map +1 -0
  130. package/dist/scheduling/createDebounceBackend.d.ts +25 -0
  131. package/dist/scheduling/createDebounceBackend.js +39 -0
  132. package/dist/scheduling/createDebounceBackend.js.map +1 -0
  133. package/dist/scheduling/readSchedulingConfig.d.ts +24 -0
  134. package/dist/scheduling/readSchedulingConfig.js +52 -0
  135. package/dist/scheduling/readSchedulingConfig.js.map +1 -0
  136. package/dist/security/AuditLogger.js +1 -1
  137. package/dist/security/AuditLogger.js.map +1 -1
  138. package/dist/security/AuthMiddleware.d.ts +19 -20
  139. package/dist/security/AuthMiddleware.js +35 -20
  140. package/dist/security/AuthMiddleware.js.map +1 -1
  141. package/dist/security/OAuthProvider.js +2 -2
  142. package/dist/security/OAuthProvider.js.map +1 -1
  143. package/dist/security/SecretManager.js +14 -13
  144. package/dist/security/SecretManager.js.map +1 -1
  145. package/dist/security/index.d.ts +3 -1
  146. package/dist/security/index.js +3 -1
  147. package/dist/security/index.js.map +1 -1
  148. package/dist/testing/TestHarness.d.ts +27 -12
  149. package/dist/testing/TestHarness.js +19 -3
  150. package/dist/testing/TestHarness.js.map +1 -1
  151. package/dist/testing/WorkflowTestRunner.js +0 -7
  152. package/dist/testing/WorkflowTestRunner.js.map +1 -1
  153. package/dist/timeouts/StepTimeoutError.d.ts +22 -0
  154. package/dist/timeouts/StepTimeoutError.js +31 -0
  155. package/dist/timeouts/StepTimeoutError.js.map +1 -0
  156. package/dist/tracing/InMemoryRunStore.d.ts +41 -1
  157. package/dist/tracing/InMemoryRunStore.js +239 -0
  158. package/dist/tracing/InMemoryRunStore.js.map +1 -1
  159. package/dist/tracing/Janitor.d.ts +70 -0
  160. package/dist/tracing/Janitor.js +150 -0
  161. package/dist/tracing/Janitor.js.map +1 -0
  162. package/dist/tracing/PostgresRunStore.d.ts +57 -1
  163. package/dist/tracing/PostgresRunStore.js +711 -6
  164. package/dist/tracing/PostgresRunStore.js.map +1 -1
  165. package/dist/tracing/RoutingDiagnostics.d.ts +55 -0
  166. package/dist/tracing/RoutingDiagnostics.js +50 -0
  167. package/dist/tracing/RoutingDiagnostics.js.map +1 -0
  168. package/dist/tracing/RunStore.d.ts +181 -1
  169. package/dist/tracing/RunTracker.d.ts +244 -9
  170. package/dist/tracing/RunTracker.js +594 -1
  171. package/dist/tracing/RunTracker.js.map +1 -1
  172. package/dist/tracing/SqliteRunStore.d.ts +79 -2
  173. package/dist/tracing/SqliteRunStore.js +775 -16
  174. package/dist/tracing/SqliteRunStore.js.map +1 -1
  175. package/dist/tracing/TraceRouter.d.ts +20 -2
  176. package/dist/tracing/TraceRouter.js +612 -6
  177. package/dist/tracing/TraceRouter.js.map +1 -1
  178. package/dist/tracing/createStore.js +14 -3
  179. package/dist/tracing/createStore.js.map +1 -1
  180. package/dist/tracing/metadataFilter.d.ts +63 -0
  181. package/dist/tracing/metadataFilter.js +224 -0
  182. package/dist/tracing/metadataFilter.js.map +1 -0
  183. package/dist/tracing/sanitize.d.ts +11 -0
  184. package/dist/tracing/sanitize.js +29 -0
  185. package/dist/tracing/sanitize.js.map +1 -1
  186. package/dist/tracing/types.d.ts +672 -2
  187. package/dist/utils/createChildContext.d.ts +32 -0
  188. package/dist/utils/createChildContext.js +113 -0
  189. package/dist/utils/createChildContext.js.map +1 -0
  190. package/dist/utils/envAllowlist.d.ts +35 -0
  191. package/dist/utils/envAllowlist.js +113 -0
  192. package/dist/utils/envAllowlist.js.map +1 -0
  193. package/dist/version/RuntimeVersionValidator.d.ts +38 -0
  194. package/dist/version/RuntimeVersionValidator.js +121 -0
  195. package/dist/version/RuntimeVersionValidator.js.map +1 -0
  196. package/dist/visualization/WorkflowVisualizer.js +4 -4
  197. package/dist/visualization/WorkflowVisualizer.js.map +1 -1
  198. package/dist/workflow/PersistenceHelper.d.ts +18 -10
  199. package/dist/workflow/PersistenceHelper.js +35 -9
  200. package/dist/workflow/PersistenceHelper.js.map +1 -1
  201. package/dist/workflow/WorkflowNormalizer.d.ts +48 -42
  202. package/dist/workflow/WorkflowNormalizer.js +650 -18
  203. package/dist/workflow/WorkflowNormalizer.js.map +1 -1
  204. package/dist/workflow/WorkflowRegistry.d.ts +186 -0
  205. package/dist/workflow/WorkflowRegistry.js +202 -0
  206. package/dist/workflow/WorkflowRegistry.js.map +1 -0
  207. package/dist/workflow/sampleBody.d.ts +54 -0
  208. package/dist/workflow/sampleBody.js +320 -0
  209. package/dist/workflow/sampleBody.js.map +1 -0
  210. package/package.json +3 -8
  211. package/dist/adapters/HttpRuntimeAdapter.d.ts +0 -79
  212. package/dist/adapters/HttpRuntimeAdapter.js +0 -233
  213. package/dist/adapters/HttpRuntimeAdapter.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { EventEmitter } from "node:events";
2
+ import type { ConcurrencyBackend } from "../concurrency/ConcurrencyBackend";
2
3
  import type { RunStore } from "./RunStore";
3
- import type { Dashboard, MetricsResult, NodeRun, RunEvent, StartNodeOptions, StartRunOptions, TraceLogEntry, WorkflowRun, WorkflowRunStatus, WorkflowSummary } from "./types";
4
+ import type { ConcurrencySlotResult, Dashboard, MetricsResult, NodeRun, RunEvent, RunQuery, SavedFilter, StartNodeOptions, StartRunOptions, TraceLogEntry, WorkflowRun, WorkflowSample, WorkflowSummary } from "./types";
4
5
  /** Webhook registration for run event notifications. */
5
6
  export interface Webhook {
6
7
  id: string;
@@ -29,8 +30,237 @@ export declare class RunTracker extends EventEmitter {
29
30
  startRun(opts: StartRunOptions): WorkflowRun;
30
31
  completeRun(runId: string, data?: unknown): void;
31
32
  failRun(runId: string, error: Error | unknown): void;
33
+ /**
34
+ * Tier 2 #6 — mark a run as throttled because the concurrency gate
35
+ * denied it before any step executed. Distinct from `failRun` because
36
+ * no step ran; nothing produced an error. Studio surfaces a Throttled
37
+ * badge and SSE subscribers see a granular `RUN_THROTTLED` event.
38
+ */
39
+ markRunThrottled(runId: string, info: {
40
+ concurrencyKey: string;
41
+ concurrencyLimit: number;
42
+ currentInFlight: number;
43
+ }): void;
44
+ /**
45
+ * Tier 2 #6 follow-up — mark a run as queued because the concurrency
46
+ * gate denied it AND the trigger is configured with `onLimit: "queue"`.
47
+ * The run will be re-attempted after `scheduledAt`; `scheduledAt` is
48
+ * persisted on the run record so Studio can render a "queued · retries
49
+ * at <time>" badge.
50
+ *
51
+ * Distinct from `markRunThrottled` because queued runs WILL eventually
52
+ * execute (or stay queued indefinitely until a slot frees), while
53
+ * throttled runs are terminal and `failRun` semantics are skipped.
54
+ *
55
+ * Caller is responsible for actually scheduling the retry via
56
+ * `DeferredRunScheduler`. This method only flips status + emits the
57
+ * `RUN_QUEUED` event. Re-marking with a later `scheduledAt` updates
58
+ * the field (used when re-defer happens after a timer-fired re-acquire
59
+ * also fails).
60
+ */
61
+ markRunQueued(runId: string, info: {
62
+ concurrencyKey: string;
63
+ concurrencyLimit: number;
64
+ currentInFlight: number;
65
+ scheduledAt: number;
66
+ }): void;
67
+ /**
68
+ * Tier 2 #5 — mark a run as `delayed`. Called immediately after
69
+ * `startRun` for runs that should be deferred. The run record carries
70
+ * `scheduledAt` (and optionally `expiresAt`) so Studio can render a
71
+ * "Delayed → fires at <time>" badge.
72
+ *
73
+ * Caller is responsible for actually scheduling the dispatch via
74
+ * `DeferredRunScheduler`. This method only flips status + emits the
75
+ * `RUN_DELAYED` event.
76
+ */
77
+ markRunDelayed(runId: string, info: {
78
+ scheduledAt: number;
79
+ delayMs: number;
80
+ expiresAt?: number;
81
+ }): void;
82
+ /**
83
+ * Tier 2 #5 — mark a run as `expired` because its TTL was exceeded
84
+ * before dispatch. Distinct from `failed` (no step ran) and
85
+ * `cancelled` (operator action — TTL is automatic).
86
+ */
87
+ markRunExpired(runId: string, info: {
88
+ expiresAt: number;
89
+ expiredAt: number;
90
+ }): void;
91
+ /**
92
+ * Tier 2 #7 — mark a run as `debounced`. In **leading** mode this is
93
+ * terminal: the ping was suppressed because a sibling fired
94
+ * immediately (`intoRunId` carries the sibling's id). In **trailing**
95
+ * mode this is transient: the same run is marked `debounced` while
96
+ * the timer is active and flips to `running` when the window closes
97
+ * (no separate transition method needed — `tracker` updates status
98
+ * directly via store before invoking the runner).
99
+ */
100
+ markRunDebounced(runId: string, info: {
101
+ debounceKey: string;
102
+ mode: "leading" | "trailing";
103
+ intoRunId?: string;
104
+ pingCount?: number;
105
+ scheduledAt?: number;
106
+ }): void;
107
+ /**
108
+ * Tier 2 quick-wins — mark a run as `crashed` (uncaught exception,
109
+ * OOM, signal). Distinct from `failRun` because the failure was
110
+ * NOT a step's `process()` throwing — it was the runner itself
111
+ * giving up. Currently manual; call from custom triggers / ops
112
+ * harnesses when uncaught failures are detected.
113
+ */
114
+ markRunCrashed(runId: string, info: {
115
+ error: Error | unknown;
116
+ }): void;
117
+ /**
118
+ * Tier 2 quick-wins follow-up — bulk-flip every run currently in
119
+ * `running` status to `crashed`. Returns the count flipped.
120
+ *
121
+ * Used by:
122
+ * - Process-level uncaught-exception handlers
123
+ * (`TriggerBase.installCrashHandlers`) — flip in-flight runs
124
+ * before the process dies.
125
+ * - Boot recovery (`TriggerBase.recoverOrphanedRuns`) — flip runs
126
+ * that were `running` from the previous (dead) process.
127
+ *
128
+ * Synchronous + safe to call from a `process.on("uncaughtException")`
129
+ * handler (which can't await). Backed by sync sqlite/in-memory
130
+ * writes that complete before the handler returns.
131
+ *
132
+ * Optional `opts.maxStartedAt` filter — only flip runs whose
133
+ * `startedAt` is at or before this timestamp. Used by boot recovery
134
+ * to avoid flipping runs from the current (live) process.
135
+ */
136
+ markAllRunningRunsAsCrashed(error: Error | unknown, opts?: {
137
+ maxStartedAt?: number;
138
+ }): number;
139
+ /**
140
+ * Tier 2 quick-wins — mark a run as `timedOut` because a step's
141
+ * final retry attempt exceeded its `maxDuration` cap. Distinct
142
+ * from `failed` so SLA dashboards can separate timeout-driven
143
+ * failures (network / capacity) from logic failures (bugs).
144
+ * Auto-called by `RunnerSteps` on final-attempt `StepTimeoutError`.
145
+ */
146
+ markRunTimedOut(runId: string, info: {
147
+ stepId: string;
148
+ maxDurationMs: number;
149
+ attemptsExhausted: number;
150
+ }): void;
151
+ /**
152
+ * Tier 2 #7 — record an additional ping into an existing trailing-mode
153
+ * debounce window. Increments `pingCount` and updates `scheduledAt`.
154
+ * Does NOT emit a new event (avoid event-stream bloat under burst).
155
+ */
156
+ recordDebouncePing(runId: string, opts: {
157
+ pingCount: number;
158
+ scheduledAt: number;
159
+ }): void;
160
+ /**
161
+ * Tier 2 #7 — transition a `delayed`/`debounced` run into `running`
162
+ * when its timer fires. Studio sees the status change via the
163
+ * existing run-update SSE stream.
164
+ */
165
+ transitionRunToRunning(runId: string): void;
166
+ /**
167
+ * Tier 2 polish — cancel a pending (delayed/debounced/queued) run.
168
+ * Idempotent. Returns true when the run existed AND was in a cancellable
169
+ * state; false when the run doesn't exist OR is already running/completed/
170
+ * failed/throttled/expired/crashed/timedOut/cancelled.
171
+ *
172
+ * **Caller responsibility**: this method only updates the run record
173
+ * (status → `"cancelled"`) and emits `RUN_CANCELLED`. The caller must
174
+ * separately clear any pending scheduler timers via
175
+ * `DeferredRunScheduler.getInstance().cancel(runId)` and (when applicable)
176
+ * `DebounceCoordinator.getInstance().cancel(workflowName, debounceKey)`.
177
+ * Done this way to avoid an import cycle from tracing → scheduling.
178
+ */
179
+ cancelRun(runId: string, options?: {
180
+ cascade?: boolean;
181
+ }): boolean;
182
+ /**
183
+ * Per-process map from runId to the AbortController owned by the
184
+ * trigger's createContext call. Populated by TriggerBase right after
185
+ * `startRun()`; cleared in TriggerBase's finally block. Used by
186
+ * `abortRunningRun` to fire the signal when an operator cancels a
187
+ * `running` run via the cancel API.
188
+ */
189
+ private abortControllers;
190
+ registerAbortController(runId: string, controller: AbortController): void;
191
+ unregisterAbortController(runId: string): void;
192
+ /**
193
+ * Tier 2 follow-up · cooperative cancellation for `running` runs.
194
+ *
195
+ * Fires the run's AbortController (so `ctx.signal.aborted` becomes
196
+ * true and any node consulting it can abort early) AND flips the run
197
+ * status to `"cancelled"` immediately via `cancelRun`. RunnerSteps'
198
+ * between-step abort check throws `RunCancelledError` shortly after,
199
+ * which TriggerBase catches without re-flipping the status.
200
+ *
201
+ * Returns true when an AbortController was registered for this run
202
+ * AND the status was successfully flipped; false otherwise (run not
203
+ * found, run not in `running` status, or no controller registered —
204
+ * e.g. controller already cleaned up).
205
+ */
206
+ abortRunningRun(runId: string): boolean;
207
+ /**
208
+ * Tier 2 #6 follow-up · cross-process concurrency backend.
209
+ *
210
+ * When set (via {@link setConcurrencyBackend}), the tracker's
211
+ * `acquireConcurrencySlot` and `releaseConcurrencySlot` methods
212
+ * delegate to the backend instead of the local sync `RunStore` impl.
213
+ * Used to coordinate across processes via NATS KV / Redis.
214
+ *
215
+ * Default `null` — preserves zero-overhead in-process behavior.
216
+ * Trigger packages install a backend in `listen()` when the operator
217
+ * sets `BLOK_CONCURRENCY_BACKEND=nats-kv`.
218
+ */
219
+ private concurrencyBackend;
220
+ setConcurrencyBackend(backend: ConcurrencyBackend | null): void;
221
+ getConcurrencyBackend(): ConcurrencyBackend | null;
222
+ /**
223
+ * Acquire a concurrency slot for `(workflowName, concurrencyKey)`.
224
+ * Delegates to the configured cross-process backend when set; falls
225
+ * back to the local sync `RunStore` impl otherwise.
226
+ *
227
+ * Async — the cross-process backend (NATS KV) is async-only. The
228
+ * sync fallback is wrapped in `Promise.resolve()` so the call site
229
+ * is uniform.
230
+ */
231
+ acquireConcurrencySlot(workflowName: string, concurrencyKey: string, concurrencyLimit: number, runId: string, leaseExpiresAt: number): Promise<ConcurrencySlotResult>;
232
+ /** Release a slot acquired via `acquireConcurrencySlot`. Idempotent. */
233
+ releaseConcurrencySlot(workflowName: string, concurrencyKey: string, runId: string): Promise<void>;
32
234
  startNode(runId: string, opts: StartNodeOptions): NodeRun;
33
235
  completeNode(nodeRunId: string, outputs?: unknown, nodeMetrics?: NodeRun["metrics"]): void;
236
+ /**
237
+ * Tier 1 idempotency cache hit. Marks the node as completed without
238
+ * having actually run, attaches the source-run/source-node lineage so
239
+ * Studio can render a CACHED badge with click-through, and emits a
240
+ * `NODE_CACHED` event so SSE subscribers see the short-circuit live.
241
+ *
242
+ * Caller is responsible for replaying the cached result through
243
+ * `PersistenceHelper.applyStepOutput` — this method only records the
244
+ * tracing side. Caching layers ABOVE persistence, never within it.
245
+ */
246
+ markNodeCached(nodeRunId: string, source: {
247
+ sourceRunId: string;
248
+ sourceNodeRunId: string;
249
+ cachedAt: number;
250
+ }, outputs?: unknown): void;
251
+ /**
252
+ * Tier 1 retry: record a single failed attempt before the next retry. The
253
+ * node stays in `running` status — `failNode` is the terminal call that
254
+ * fires only after `retry.maxAttempts` is exhausted.
255
+ *
256
+ * Per-node attempt history is capped at {@link MAX_STORED_ATTEMPTS} (10)
257
+ * to bound store growth on extreme retry counts. The cap matches the
258
+ * risk-register decision in `tier1-idempotency-replay-retry.md`.
259
+ */
260
+ recordNodeAttemptFailed(nodeRunId: string, info: {
261
+ attempt: number;
262
+ error: unknown;
263
+ }): void;
34
264
  failNode(nodeRunId: string, error: Error | unknown): void;
35
265
  skipNode(runId: string, nodeName: string, stepIndex: number, reason?: string): void;
36
266
  /**
@@ -57,20 +287,19 @@ export declare class RunTracker extends EventEmitter {
57
287
  addLog(entry: Omit<TraceLogEntry, "id" | "timestamp">): void;
58
288
  trackVarsUpdate(runId: string, nodeName: string, nodeId: string | undefined, vars: Record<string, unknown>): void;
59
289
  getRun(runId: string): WorkflowRun | undefined;
60
- getRuns(opts?: {
61
- workflow?: string;
62
- status?: WorkflowRunStatus;
63
- tags?: string[];
64
- limit?: number;
65
- offset?: number;
66
- sort?: "asc" | "desc";
67
- }): {
290
+ getRuns(opts?: RunQuery): {
68
291
  runs: WorkflowRun[];
69
292
  total: number;
70
293
  };
71
294
  getNodeRuns(runId: string): NodeRun[];
72
295
  getNodeRun(nodeRunId: string): NodeRun | undefined;
73
296
  getEvents(runId: string, since?: number): RunEvent[];
297
+ /**
298
+ * Tier 2 sub-workflow lineage. Returns every run that was started by
299
+ * a `subworkflow:` step inside the given parent run. Powers Studio's
300
+ * "Sub-runs" list on a parent's run-detail page.
301
+ */
302
+ getRunsByParent(parentRunId: string): WorkflowRun[];
74
303
  getLogs(runId: string, nodeId?: string): TraceLogEntry[];
75
304
  getWorkflowSummaries(): WorkflowSummary[];
76
305
  addTag(runId: string, tag: string): boolean;
@@ -84,6 +313,12 @@ export declare class RunTracker extends EventEmitter {
84
313
  listDashboards(): Dashboard[];
85
314
  deleteDashboard(dashboardId: string): boolean;
86
315
  updateDashboard(dashboardId: string, updates: Partial<Dashboard>): void;
316
+ upsertSavedFilter(filter: SavedFilter): SavedFilter;
317
+ listSavedFilters(): SavedFilter[];
318
+ deleteSavedFilter(name: string): boolean;
319
+ recordWorkflowSample(sample: WorkflowSample): WorkflowSample;
320
+ getWorkflowSample(workflowName: string): WorkflowSample | undefined;
321
+ deleteWorkflowSample(workflowName: string): boolean;
87
322
  registerWebhook(opts: {
88
323
  url: string;
89
324
  events: string[];