@rivetkit/workflow-engine 0.0.0-main.6151ab0 → 0.0.0-main.79e97f1

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.
@@ -101,10 +101,20 @@ interface RemovedEntry {
101
101
  originalType: EntryKindType;
102
102
  originalName?: string;
103
103
  }
104
+ /**
105
+ * Version check entry data - records which version of a code path this
106
+ * workflow instance is pinned to at a given location.
107
+ */
108
+ interface VersionCheckEntry {
109
+ /** The version this instance resolved to at this location. */
110
+ resolved: number;
111
+ /** The `latest` value seen when this entry was first resolved (diagnostics). */
112
+ latest: number;
113
+ }
104
114
  /**
105
115
  * All possible entry kind types.
106
116
  */
107
- type EntryKindType = "step" | "loop" | "sleep" | "message" | "rollback_checkpoint" | "join" | "race" | "removed";
117
+ type EntryKindType = "step" | "loop" | "sleep" | "message" | "rollback_checkpoint" | "join" | "race" | "removed" | "version_check";
108
118
  /**
109
119
  * Type-specific entry data.
110
120
  */
@@ -132,6 +142,9 @@ type EntryKind = {
132
142
  } | {
133
143
  type: "removed";
134
144
  data: RemovedEntry;
145
+ } | {
146
+ type: "version_check";
147
+ data: VersionCheckEntry;
135
148
  };
136
149
  /**
137
150
  * An entry in the workflow history.
@@ -345,6 +358,8 @@ interface StepConfig<T> {
345
358
  retryBackoffMax?: number;
346
359
  /** Timeout in ms for step execution (default: 30000). Set to 0 to disable. */
347
360
  timeout?: number;
361
+ /** If true, step timeouts retry like any other error instead of failing immediately as critical. Default: false. */
362
+ retryOnTimeout?: boolean;
348
363
  }
349
364
  type TryStepCatchKind = "critical" | "timeout" | "exhausted" | "rollback";
350
365
  interface TryStepFailure {
@@ -398,7 +413,7 @@ type LoopResult<S, T> = {
398
413
  * Stateless loops (state = undefined) may return void/undefined, which is treated as
399
414
  * `Loop.continue(undefined)`.
400
415
  */
401
- type LoopIterationResult<S, T> = Promise<LoopResult<S, T> | (S extends undefined ? void : never)>;
416
+ type LoopIterationResult<S, T> = Promise<LoopResult<S, T> | (S extends undefined ? undefined : never)>;
402
417
  /**
403
418
  * Configuration for a loop.
404
419
  */
@@ -410,6 +425,12 @@ interface LoopConfig<S, T> {
410
425
  historyPruneInterval?: number;
411
426
  /** Number of past iterations to retain when pruning. Defaults to historyPruneInterval. */
412
427
  historySize?: number;
428
+ /** @deprecated Use historyPruneInterval. */
429
+ commitInterval?: number;
430
+ /** @deprecated Use historyPruneInterval. */
431
+ historyEvery?: number;
432
+ /** @deprecated Use historySize. */
433
+ historyKeep?: number;
413
434
  }
414
435
  /**
415
436
  * Configuration for a branch in join/race.
@@ -450,6 +471,7 @@ interface WorkflowContextInterface {
450
471
  value: T;
451
472
  }>;
452
473
  removed(name: string, originalType: EntryKindType): Promise<void>;
474
+ getVersion(name: string, latest: number): Promise<number>;
453
475
  isEvicted(): boolean;
454
476
  }
455
477
  /**
@@ -549,6 +571,11 @@ interface KVWrite {
549
571
  * See architecture.md "Isolation Model" for details.
550
572
  */
551
573
  interface EngineDriver {
574
+ /**
575
+ * Requires each logical storage flush to reach `batch` as one indivisible
576
+ * unit. The driver must reject an oversized unit instead of splitting it.
577
+ */
578
+ readonly atomicBatch?: boolean;
552
579
  /**
553
580
  * Get a value by key.
554
581
  * Returns null if the key doesn't exist.
@@ -691,12 +718,12 @@ declare class WorkflowContextImpl implements WorkflowContextInterface {
691
718
  */
692
719
  evict(): void;
693
720
  /**
694
- * Wait for eviction message.
695
- *
696
- * The event listener uses { once: true } to auto-remove after firing,
697
- * preventing memory leaks if this method is called multiple times.
721
+ * Wait for `ms`, rejecting early with EvictedError if the workflow is
722
+ * evicted. Both the timer and the abort listener are torn down on either
723
+ * outcome, so a completed sleep never leaves a dangling listener on the
724
+ * long-lived run abort signal.
698
725
  */
699
- waitForEviction(): Promise<never>;
726
+ private sleepOrEvict;
700
727
  step<T>(nameOrConfig: string | StepConfig<T>, run?: () => Promise<T>): Promise<T>;
701
728
  tryStep<T>(nameOrConfig: string | TryStepConfig<T>, run?: () => Promise<T>): Promise<TryStepResult<T>>;
702
729
  try<T>(nameOrConfig: string | TryBlockConfig<T>, run?: (ctx: WorkflowContextInterface) => Promise<T>): Promise<TryBlockResult<T>>;
@@ -707,7 +734,9 @@ declare class WorkflowContextImpl implements WorkflowContextInterface {
707
734
  *
708
735
  * Note: This does NOT cancel the underlying operation. JavaScript Promises
709
736
  * cannot be cancelled once started. When a timeout occurs:
710
- * - The step is marked as failed with StepTimeoutError
737
+ * - The step is rejected with StepTimeoutError. By default this is treated
738
+ * as a critical failure with no retry. Set retryOnTimeout: true on the
739
+ * step config to retry timeouts like any other error.
711
740
  * - The underlying async operation continues running in the background
712
741
  * - Any side effects from the operation may still occur
713
742
  *
@@ -771,8 +800,22 @@ declare class WorkflowContextImpl implements WorkflowContextInterface {
771
800
  private executeRace;
772
801
  removed(name: string, originalType: EntryKindType): Promise<void>;
773
802
  private executeRemoved;
803
+ getVersion(name: string, latest: number): Promise<number>;
804
+ private executeGetVersion;
805
+ /**
806
+ * Returns true if any history entry under the current location scope
807
+ * (other than `excludeKey`) has not yet been visited this run. Used by
808
+ * getVersion to detect an old in-flight instance whose scope was already
809
+ * executed by code that predates a version gate.
810
+ */
811
+ private hasUnvisitedUnderCurrentScope;
774
812
  }
775
813
 
814
+ /**
815
+ * Extract structured error information from an error.
816
+ */
817
+ declare function extractErrorInfo(error: unknown): WorkflowError;
818
+
776
819
  /**
777
820
  * Thrown from steps to prevent retry.
778
821
  * Use this when an error is unrecoverable and retrying would be pointless.
@@ -877,11 +920,6 @@ declare class EntryInProgressError extends Error {
877
920
  constructor();
878
921
  }
879
922
 
880
- /**
881
- * Extract structured error information from an error.
882
- */
883
- declare function extractErrorInfo(error: unknown): WorkflowError;
884
-
885
923
  /**
886
924
  * Check if a path segment is a loop iteration marker.
887
925
  */
@@ -101,10 +101,20 @@ interface RemovedEntry {
101
101
  originalType: EntryKindType;
102
102
  originalName?: string;
103
103
  }
104
+ /**
105
+ * Version check entry data - records which version of a code path this
106
+ * workflow instance is pinned to at a given location.
107
+ */
108
+ interface VersionCheckEntry {
109
+ /** The version this instance resolved to at this location. */
110
+ resolved: number;
111
+ /** The `latest` value seen when this entry was first resolved (diagnostics). */
112
+ latest: number;
113
+ }
104
114
  /**
105
115
  * All possible entry kind types.
106
116
  */
107
- type EntryKindType = "step" | "loop" | "sleep" | "message" | "rollback_checkpoint" | "join" | "race" | "removed";
117
+ type EntryKindType = "step" | "loop" | "sleep" | "message" | "rollback_checkpoint" | "join" | "race" | "removed" | "version_check";
108
118
  /**
109
119
  * Type-specific entry data.
110
120
  */
@@ -132,6 +142,9 @@ type EntryKind = {
132
142
  } | {
133
143
  type: "removed";
134
144
  data: RemovedEntry;
145
+ } | {
146
+ type: "version_check";
147
+ data: VersionCheckEntry;
135
148
  };
136
149
  /**
137
150
  * An entry in the workflow history.
@@ -345,6 +358,8 @@ interface StepConfig<T> {
345
358
  retryBackoffMax?: number;
346
359
  /** Timeout in ms for step execution (default: 30000). Set to 0 to disable. */
347
360
  timeout?: number;
361
+ /** If true, step timeouts retry like any other error instead of failing immediately as critical. Default: false. */
362
+ retryOnTimeout?: boolean;
348
363
  }
349
364
  type TryStepCatchKind = "critical" | "timeout" | "exhausted" | "rollback";
350
365
  interface TryStepFailure {
@@ -398,7 +413,7 @@ type LoopResult<S, T> = {
398
413
  * Stateless loops (state = undefined) may return void/undefined, which is treated as
399
414
  * `Loop.continue(undefined)`.
400
415
  */
401
- type LoopIterationResult<S, T> = Promise<LoopResult<S, T> | (S extends undefined ? void : never)>;
416
+ type LoopIterationResult<S, T> = Promise<LoopResult<S, T> | (S extends undefined ? undefined : never)>;
402
417
  /**
403
418
  * Configuration for a loop.
404
419
  */
@@ -410,6 +425,12 @@ interface LoopConfig<S, T> {
410
425
  historyPruneInterval?: number;
411
426
  /** Number of past iterations to retain when pruning. Defaults to historyPruneInterval. */
412
427
  historySize?: number;
428
+ /** @deprecated Use historyPruneInterval. */
429
+ commitInterval?: number;
430
+ /** @deprecated Use historyPruneInterval. */
431
+ historyEvery?: number;
432
+ /** @deprecated Use historySize. */
433
+ historyKeep?: number;
413
434
  }
414
435
  /**
415
436
  * Configuration for a branch in join/race.
@@ -450,6 +471,7 @@ interface WorkflowContextInterface {
450
471
  value: T;
451
472
  }>;
452
473
  removed(name: string, originalType: EntryKindType): Promise<void>;
474
+ getVersion(name: string, latest: number): Promise<number>;
453
475
  isEvicted(): boolean;
454
476
  }
455
477
  /**
@@ -549,6 +571,11 @@ interface KVWrite {
549
571
  * See architecture.md "Isolation Model" for details.
550
572
  */
551
573
  interface EngineDriver {
574
+ /**
575
+ * Requires each logical storage flush to reach `batch` as one indivisible
576
+ * unit. The driver must reject an oversized unit instead of splitting it.
577
+ */
578
+ readonly atomicBatch?: boolean;
552
579
  /**
553
580
  * Get a value by key.
554
581
  * Returns null if the key doesn't exist.
@@ -691,12 +718,12 @@ declare class WorkflowContextImpl implements WorkflowContextInterface {
691
718
  */
692
719
  evict(): void;
693
720
  /**
694
- * Wait for eviction message.
695
- *
696
- * The event listener uses { once: true } to auto-remove after firing,
697
- * preventing memory leaks if this method is called multiple times.
721
+ * Wait for `ms`, rejecting early with EvictedError if the workflow is
722
+ * evicted. Both the timer and the abort listener are torn down on either
723
+ * outcome, so a completed sleep never leaves a dangling listener on the
724
+ * long-lived run abort signal.
698
725
  */
699
- waitForEviction(): Promise<never>;
726
+ private sleepOrEvict;
700
727
  step<T>(nameOrConfig: string | StepConfig<T>, run?: () => Promise<T>): Promise<T>;
701
728
  tryStep<T>(nameOrConfig: string | TryStepConfig<T>, run?: () => Promise<T>): Promise<TryStepResult<T>>;
702
729
  try<T>(nameOrConfig: string | TryBlockConfig<T>, run?: (ctx: WorkflowContextInterface) => Promise<T>): Promise<TryBlockResult<T>>;
@@ -707,7 +734,9 @@ declare class WorkflowContextImpl implements WorkflowContextInterface {
707
734
  *
708
735
  * Note: This does NOT cancel the underlying operation. JavaScript Promises
709
736
  * cannot be cancelled once started. When a timeout occurs:
710
- * - The step is marked as failed with StepTimeoutError
737
+ * - The step is rejected with StepTimeoutError. By default this is treated
738
+ * as a critical failure with no retry. Set retryOnTimeout: true on the
739
+ * step config to retry timeouts like any other error.
711
740
  * - The underlying async operation continues running in the background
712
741
  * - Any side effects from the operation may still occur
713
742
  *
@@ -771,8 +800,22 @@ declare class WorkflowContextImpl implements WorkflowContextInterface {
771
800
  private executeRace;
772
801
  removed(name: string, originalType: EntryKindType): Promise<void>;
773
802
  private executeRemoved;
803
+ getVersion(name: string, latest: number): Promise<number>;
804
+ private executeGetVersion;
805
+ /**
806
+ * Returns true if any history entry under the current location scope
807
+ * (other than `excludeKey`) has not yet been visited this run. Used by
808
+ * getVersion to detect an old in-flight instance whose scope was already
809
+ * executed by code that predates a version gate.
810
+ */
811
+ private hasUnvisitedUnderCurrentScope;
774
812
  }
775
813
 
814
+ /**
815
+ * Extract structured error information from an error.
816
+ */
817
+ declare function extractErrorInfo(error: unknown): WorkflowError;
818
+
776
819
  /**
777
820
  * Thrown from steps to prevent retry.
778
821
  * Use this when an error is unrecoverable and retrying would be pointless.
@@ -877,11 +920,6 @@ declare class EntryInProgressError extends Error {
877
920
  constructor();
878
921
  }
879
922
 
880
- /**
881
- * Extract structured error information from an error.
882
- */
883
- declare function extractErrorInfo(error: unknown): WorkflowError;
884
-
885
923
  /**
886
924
  * Check if a path segment is a loop iteration marker.
887
925
  */
@@ -43,7 +43,7 @@ import {
43
43
  resolveName,
44
44
  runWorkflow,
45
45
  setEntry
46
- } from "./chunk-UMFB2AR3.js";
46
+ } from "./chunk-DTS4S7RT.js";
47
47
  export {
48
48
  CancelledError,
49
49
  CriticalError,
@@ -47,7 +47,7 @@
47
47
 
48
48
 
49
49
 
50
- var _chunk4SWXLWKLcjs = require('./chunk-4SWXLWKL.cjs');
50
+ var _chunkKLHCG2KYcjs = require('./chunk-KLHCG2KY.cjs');
51
51
 
52
52
  // src/testing.ts
53
53
  var InMemoryWorkflowMessageDriver = class {
@@ -97,7 +97,7 @@ var InMemoryWorkflowMessageDriver = class {
97
97
  }
98
98
  async waitForMessages(messageNames, abortSignal) {
99
99
  if (abortSignal.aborted) {
100
- throw new (0, _chunk4SWXLWKLcjs.EvictedError)();
100
+ throw new (0, _chunkKLHCG2KYcjs.EvictedError)();
101
101
  }
102
102
  const nameSet = messageNames.length > 0 ? new Set(messageNames) : void 0;
103
103
  if (this.#messages.some(
@@ -118,7 +118,7 @@ var InMemoryWorkflowMessageDriver = class {
118
118
  },
119
119
  abortSignal,
120
120
  onAbort: () => {
121
- waiter.reject(new (0, _chunk4SWXLWKLcjs.EvictedError)());
121
+ waiter.reject(new (0, _chunkKLHCG2KYcjs.EvictedError)());
122
122
  }
123
123
  };
124
124
  abortSignal.addEventListener("abort", waiter.onAbort, {
@@ -158,56 +158,56 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
158
158
  __init4() {this.workerPollInterval = 100}
159
159
  __init5() {this.messageDriver = this.#inMemoryMessageDriver}
160
160
  async get(key) {
161
- await _chunk4SWXLWKLcjs.sleep.call(void 0, this.latency);
162
- const entry = this.kv.get(_chunk4SWXLWKLcjs.keyToHex.call(void 0, key));
161
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, this.latency);
162
+ const entry = this.kv.get(_chunkKLHCG2KYcjs.keyToHex.call(void 0, key));
163
163
  return _nullishCoalesce((entry == null ? void 0 : entry.value), () => ( null));
164
164
  }
165
165
  async set(key, value) {
166
- await _chunk4SWXLWKLcjs.sleep.call(void 0, this.latency);
167
- this.kv.set(_chunk4SWXLWKLcjs.keyToHex.call(void 0, key), { key, value });
166
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, this.latency);
167
+ this.kv.set(_chunkKLHCG2KYcjs.keyToHex.call(void 0, key), { key, value });
168
168
  }
169
169
  async delete(key) {
170
- await _chunk4SWXLWKLcjs.sleep.call(void 0, this.latency);
171
- this.kv.delete(_chunk4SWXLWKLcjs.keyToHex.call(void 0, key));
170
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, this.latency);
171
+ this.kv.delete(_chunkKLHCG2KYcjs.keyToHex.call(void 0, key));
172
172
  }
173
173
  async deletePrefix(prefix) {
174
- await _chunk4SWXLWKLcjs.sleep.call(void 0, this.latency);
174
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, this.latency);
175
175
  for (const [hexKey, entry] of this.kv) {
176
- if (_chunk4SWXLWKLcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
176
+ if (_chunkKLHCG2KYcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
177
177
  this.kv.delete(hexKey);
178
178
  }
179
179
  }
180
180
  }
181
181
  async deleteRange(start, end) {
182
- await _chunk4SWXLWKLcjs.sleep.call(void 0, this.latency);
182
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, this.latency);
183
183
  for (const [hexKey, entry] of this.kv) {
184
- if (_chunk4SWXLWKLcjs.compareKeys.call(void 0, entry.key, start) >= 0 && _chunk4SWXLWKLcjs.compareKeys.call(void 0, entry.key, end) < 0) {
184
+ if (_chunkKLHCG2KYcjs.compareKeys.call(void 0, entry.key, start) >= 0 && _chunkKLHCG2KYcjs.compareKeys.call(void 0, entry.key, end) < 0) {
185
185
  this.kv.delete(hexKey);
186
186
  }
187
187
  }
188
188
  }
189
189
  async list(prefix) {
190
- await _chunk4SWXLWKLcjs.sleep.call(void 0, this.latency);
190
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, this.latency);
191
191
  const results = [];
192
192
  for (const entry of this.kv.values()) {
193
- if (_chunk4SWXLWKLcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
193
+ if (_chunkKLHCG2KYcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
194
194
  results.push({ key: entry.key, value: entry.value });
195
195
  }
196
196
  }
197
- return results.sort((a, b) => _chunk4SWXLWKLcjs.compareKeys.call(void 0, a.key, b.key));
197
+ return results.sort((a, b) => _chunkKLHCG2KYcjs.compareKeys.call(void 0, a.key, b.key));
198
198
  }
199
199
  async batch(writes) {
200
- await _chunk4SWXLWKLcjs.sleep.call(void 0, this.latency);
200
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, this.latency);
201
201
  for (const { key, value } of writes) {
202
- this.kv.set(_chunk4SWXLWKLcjs.keyToHex.call(void 0, key), { key, value });
202
+ this.kv.set(_chunkKLHCG2KYcjs.keyToHex.call(void 0, key), { key, value });
203
203
  }
204
204
  }
205
205
  async setAlarm(workflowId, wakeAt) {
206
- await _chunk4SWXLWKLcjs.sleep.call(void 0, this.latency);
206
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, this.latency);
207
207
  this.alarms.set(workflowId, wakeAt);
208
208
  }
209
209
  async clearAlarm(workflowId) {
210
- await _chunk4SWXLWKLcjs.sleep.call(void 0, this.latency);
210
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, this.latency);
211
211
  this.alarms.delete(workflowId);
212
212
  }
213
213
  async waitForMessages(messageNames, abortSignal) {
@@ -218,7 +218,7 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
218
218
  }
219
219
  while (true) {
220
220
  if (abortSignal.aborted) {
221
- throw new (0, _chunk4SWXLWKLcjs.EvictedError)();
221
+ throw new (0, _chunkKLHCG2KYcjs.EvictedError)();
222
222
  }
223
223
  const messages = await this.messageDriver.receiveMessages({
224
224
  names: messageNames.length > 0 ? messageNames : void 0,
@@ -228,7 +228,7 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
228
228
  if (messages.length > 0) {
229
229
  return;
230
230
  }
231
- await _chunk4SWXLWKLcjs.sleep.call(void 0, Math.max(1, this.latency));
231
+ await _chunkKLHCG2KYcjs.sleep.call(void 0, Math.max(1, this.latency));
232
232
  }
233
233
  }
234
234
  /**
@@ -324,5 +324,5 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
324
324
 
325
325
 
326
326
 
327
- exports.CancelledError = _chunk4SWXLWKLcjs.CancelledError; exports.CriticalError = _chunk4SWXLWKLcjs.CriticalError; exports.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL = _chunk4SWXLWKLcjs.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL; exports.DEFAULT_MAX_RETRIES = _chunk4SWXLWKLcjs.DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = _chunk4SWXLWKLcjs.DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = _chunk4SWXLWKLcjs.DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_STEP_TIMEOUT = _chunk4SWXLWKLcjs.DEFAULT_STEP_TIMEOUT; exports.EntryInProgressError = _chunk4SWXLWKLcjs.EntryInProgressError; exports.EvictedError = _chunk4SWXLWKLcjs.EvictedError; exports.HistoryDivergedError = _chunk4SWXLWKLcjs.HistoryDivergedError; exports.InMemoryDriver = InMemoryDriver; exports.JoinError = _chunk4SWXLWKLcjs.JoinError; exports.Loop = _chunk4SWXLWKLcjs.Loop; exports.MessageWaitError = _chunk4SWXLWKLcjs.MessageWaitError; exports.RaceError = _chunk4SWXLWKLcjs.RaceError; exports.RollbackCheckpointError = _chunk4SWXLWKLcjs.RollbackCheckpointError; exports.RollbackError = _chunk4SWXLWKLcjs.RollbackError; exports.SleepError = _chunk4SWXLWKLcjs.SleepError; exports.StepExhaustedError = _chunk4SWXLWKLcjs.StepExhaustedError; exports.StepFailedError = _chunk4SWXLWKLcjs.StepFailedError; exports.WorkflowContextImpl = _chunk4SWXLWKLcjs.WorkflowContextImpl; exports.appendLoopIteration = _chunk4SWXLWKLcjs.appendLoopIteration; exports.appendName = _chunk4SWXLWKLcjs.appendName; exports.createEntry = _chunk4SWXLWKLcjs.createEntry; exports.createHistorySnapshot = _chunk4SWXLWKLcjs.createHistorySnapshot; exports.createStorage = _chunk4SWXLWKLcjs.createStorage; exports.deleteEntriesWithPrefix = _chunk4SWXLWKLcjs.deleteEntriesWithPrefix; exports.emptyLocation = _chunk4SWXLWKLcjs.emptyLocation; exports.extractErrorInfo = _chunk4SWXLWKLcjs.extractErrorInfo; exports.flush = _chunk4SWXLWKLcjs.flush; exports.generateId = _chunk4SWXLWKLcjs.generateId; exports.getEntry = _chunk4SWXLWKLcjs.getEntry; exports.getOrCreateMetadata = _chunk4SWXLWKLcjs.getOrCreateMetadata; exports.isLocationPrefix = _chunk4SWXLWKLcjs.isLocationPrefix; exports.isLoopIterationMarker = _chunk4SWXLWKLcjs.isLoopIterationMarker; exports.loadMetadata = _chunk4SWXLWKLcjs.loadMetadata; exports.loadStorage = _chunk4SWXLWKLcjs.loadStorage; exports.locationToKey = _chunk4SWXLWKLcjs.locationToKey; exports.locationsEqual = _chunk4SWXLWKLcjs.locationsEqual; exports.parentLocation = _chunk4SWXLWKLcjs.parentLocation; exports.registerName = _chunk4SWXLWKLcjs.registerName; exports.replayWorkflowFromStep = _chunk4SWXLWKLcjs.replayWorkflowFromStep; exports.resolveName = _chunk4SWXLWKLcjs.resolveName; exports.runWorkflow = _chunk4SWXLWKLcjs.runWorkflow; exports.setEntry = _chunk4SWXLWKLcjs.setEntry;
327
+ exports.CancelledError = _chunkKLHCG2KYcjs.CancelledError; exports.CriticalError = _chunkKLHCG2KYcjs.CriticalError; exports.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL = _chunkKLHCG2KYcjs.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL; exports.DEFAULT_MAX_RETRIES = _chunkKLHCG2KYcjs.DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = _chunkKLHCG2KYcjs.DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = _chunkKLHCG2KYcjs.DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_STEP_TIMEOUT = _chunkKLHCG2KYcjs.DEFAULT_STEP_TIMEOUT; exports.EntryInProgressError = _chunkKLHCG2KYcjs.EntryInProgressError; exports.EvictedError = _chunkKLHCG2KYcjs.EvictedError; exports.HistoryDivergedError = _chunkKLHCG2KYcjs.HistoryDivergedError; exports.InMemoryDriver = InMemoryDriver; exports.JoinError = _chunkKLHCG2KYcjs.JoinError; exports.Loop = _chunkKLHCG2KYcjs.Loop; exports.MessageWaitError = _chunkKLHCG2KYcjs.MessageWaitError; exports.RaceError = _chunkKLHCG2KYcjs.RaceError; exports.RollbackCheckpointError = _chunkKLHCG2KYcjs.RollbackCheckpointError; exports.RollbackError = _chunkKLHCG2KYcjs.RollbackError; exports.SleepError = _chunkKLHCG2KYcjs.SleepError; exports.StepExhaustedError = _chunkKLHCG2KYcjs.StepExhaustedError; exports.StepFailedError = _chunkKLHCG2KYcjs.StepFailedError; exports.WorkflowContextImpl = _chunkKLHCG2KYcjs.WorkflowContextImpl; exports.appendLoopIteration = _chunkKLHCG2KYcjs.appendLoopIteration; exports.appendName = _chunkKLHCG2KYcjs.appendName; exports.createEntry = _chunkKLHCG2KYcjs.createEntry; exports.createHistorySnapshot = _chunkKLHCG2KYcjs.createHistorySnapshot; exports.createStorage = _chunkKLHCG2KYcjs.createStorage; exports.deleteEntriesWithPrefix = _chunkKLHCG2KYcjs.deleteEntriesWithPrefix; exports.emptyLocation = _chunkKLHCG2KYcjs.emptyLocation; exports.extractErrorInfo = _chunkKLHCG2KYcjs.extractErrorInfo; exports.flush = _chunkKLHCG2KYcjs.flush; exports.generateId = _chunkKLHCG2KYcjs.generateId; exports.getEntry = _chunkKLHCG2KYcjs.getEntry; exports.getOrCreateMetadata = _chunkKLHCG2KYcjs.getOrCreateMetadata; exports.isLocationPrefix = _chunkKLHCG2KYcjs.isLocationPrefix; exports.isLoopIterationMarker = _chunkKLHCG2KYcjs.isLoopIterationMarker; exports.loadMetadata = _chunkKLHCG2KYcjs.loadMetadata; exports.loadStorage = _chunkKLHCG2KYcjs.loadStorage; exports.locationToKey = _chunkKLHCG2KYcjs.locationToKey; exports.locationsEqual = _chunkKLHCG2KYcjs.locationsEqual; exports.parentLocation = _chunkKLHCG2KYcjs.parentLocation; exports.registerName = _chunkKLHCG2KYcjs.registerName; exports.replayWorkflowFromStep = _chunkKLHCG2KYcjs.replayWorkflowFromStep; exports.resolveName = _chunkKLHCG2KYcjs.resolveName; exports.runWorkflow = _chunkKLHCG2KYcjs.runWorkflow; exports.setEntry = _chunkKLHCG2KYcjs.setEntry;
328
328
  //# sourceMappingURL=testing.cjs.map
@@ -47,7 +47,7 @@ import {
47
47
  runWorkflow,
48
48
  setEntry,
49
49
  sleep
50
- } from "./chunk-UMFB2AR3.js";
50
+ } from "./chunk-DTS4S7RT.js";
51
51
 
52
52
  // src/testing.ts
53
53
  var InMemoryWorkflowMessageDriver = class {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rivetkit/workflow-engine",
3
- "version": "0.0.0-main.6151ab0",
3
+ "version": "0.0.0-main.79e97f1",
4
4
  "description": "Durable workflow engine with reentrant execution",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
package/schemas/serde.ts CHANGED
@@ -18,7 +18,6 @@ import type {
18
18
  EntryMetadata as InternalEntryMetadata,
19
19
  EntryStatus as InternalEntryStatus,
20
20
  Location as InternalLocation,
21
- LoopIterationMarker as InternalLoopIterationMarker,
22
21
  PathSegment as InternalPathSegment,
23
22
  SleepState as InternalSleepState,
24
23
  WorkflowState as InternalWorkflowState,
@@ -27,7 +26,6 @@ import {
27
26
  CURRENT_VERSION,
28
27
  ENTRY_METADATA_VERSIONED,
29
28
  ENTRY_VERSIONED,
30
- WORKFLOW_METADATA_VERSIONED,
31
29
  } from "./versioned.js";
32
30
 
33
31
  // === Helper: ArrayBuffer to/from utilities ===
@@ -74,7 +72,7 @@ function assertString(
74
72
  /**
75
73
  * Validate that a value is a number.
76
74
  */
77
- function assertNumber(
75
+ function _assertNumber(
78
76
  value: unknown,
79
77
  context: string,
80
78
  ): asserts value is number {
@@ -309,6 +307,14 @@ function entryKindToBare(kind: InternalEntryKind): v1.EntryKind {
309
307
  originalName: kind.data.originalName ?? null,
310
308
  },
311
309
  };
310
+ case "version_check":
311
+ return {
312
+ tag: "VersionCheckEntry",
313
+ val: {
314
+ resolved: kind.data.resolved,
315
+ latest: kind.data.latest,
316
+ },
317
+ };
312
318
  }
313
319
  }
314
320
 
@@ -398,6 +404,14 @@ function entryKindFromBare(kind: v1.EntryKind): InternalEntryKind {
398
404
  originalName: kind.val.originalName ?? undefined,
399
405
  },
400
406
  };
407
+ case "VersionCheckEntry":
408
+ return {
409
+ type: "version_check",
410
+ data: {
411
+ resolved: kind.val.resolved,
412
+ latest: kind.val.latest,
413
+ },
414
+ };
401
415
  default:
402
416
  throw new Error(
403
417
  `Unknown entry kind: ${(kind as { tag: string }).tag}`,
package/schemas/v1.bare CHANGED
@@ -122,6 +122,14 @@ type RemovedEntry struct {
122
122
  originalName: optional<str>
123
123
  }
124
124
 
125
+ # MARK: Version Check Entry
126
+ type VersionCheckEntry struct {
127
+ # The version this instance resolved to at this location
128
+ resolved: u32
129
+ # The `latest` value seen when first resolved (diagnostics)
130
+ latest: u32
131
+ }
132
+
125
133
  # MARK: Entry Kind
126
134
  # Type-specific entry data
127
135
  type EntryKind union {
@@ -132,7 +140,8 @@ type EntryKind union {
132
140
  RollbackCheckpointEntry |
133
141
  JoinEntry |
134
142
  RaceEntry |
135
- RemovedEntry
143
+ RemovedEntry |
144
+ VersionCheckEntry
136
145
  }
137
146
 
138
147
  # MARK: Entry
@@ -19,6 +19,7 @@ export type {
19
19
  RemovedEntry,
20
20
  SleepEntry,
21
21
  StepEntry,
22
+ VersionCheckEntry,
22
23
  WorkflowMetadata,
23
24
  } from "../dist/schemas/v1.js";
24
25