@rivetkit/workflow-engine 2.3.3-rc.1 → 2.3.3-rc.2

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.
@@ -446,6 +446,23 @@ export function writeRemovedEntry(bc: bare.ByteCursor, x: RemovedEntry): void {
446
446
  write1(bc, x.originalName)
447
447
  }
448
448
 
449
+ export type VersionCheckEntry = {
450
+ readonly resolved: u32,
451
+ readonly latest: u32,
452
+ }
453
+
454
+ export function readVersionCheckEntry(bc: bare.ByteCursor): VersionCheckEntry {
455
+ return {
456
+ resolved: bare.readU32(bc),
457
+ latest: bare.readU32(bc),
458
+ }
459
+ }
460
+
461
+ export function writeVersionCheckEntry(bc: bare.ByteCursor, x: VersionCheckEntry): void {
462
+ bare.writeU32(bc, x.resolved)
463
+ bare.writeU32(bc, x.latest)
464
+ }
465
+
449
466
  export type EntryKind =
450
467
  | { readonly tag: "StepEntry", readonly val: StepEntry }
451
468
  | { readonly tag: "LoopEntry", readonly val: LoopEntry }
@@ -455,6 +472,7 @@ export type EntryKind =
455
472
  | { readonly tag: "JoinEntry", readonly val: JoinEntry }
456
473
  | { readonly tag: "RaceEntry", readonly val: RaceEntry }
457
474
  | { readonly tag: "RemovedEntry", readonly val: RemovedEntry }
475
+ | { readonly tag: "VersionCheckEntry", readonly val: VersionCheckEntry }
458
476
 
459
477
  export function readEntryKind(bc: bare.ByteCursor): EntryKind {
460
478
  const offset = bc.offset
@@ -476,6 +494,8 @@ export function readEntryKind(bc: bare.ByteCursor): EntryKind {
476
494
  return { tag: "RaceEntry", val: readRaceEntry(bc) }
477
495
  case 7:
478
496
  return { tag: "RemovedEntry", val: readRemovedEntry(bc) }
497
+ case 8:
498
+ return { tag: "VersionCheckEntry", val: readVersionCheckEntry(bc) }
479
499
  default: {
480
500
  bc.offset = offset
481
501
  throw new bare.BareError(offset, "invalid tag")
@@ -525,6 +545,11 @@ export function writeEntryKind(bc: bare.ByteCursor, x: EntryKind): void {
525
545
  writeRemovedEntry(bc, x.val)
526
546
  break
527
547
  }
548
+ case "VersionCheckEntry": {
549
+ bare.writeU8(bc, 8)
550
+ writeVersionCheckEntry(bc, x.val)
551
+ break
552
+ }
528
553
  }
529
554
  }
530
555
 
@@ -670,6 +670,16 @@ function writeRemovedEntry(bc, x) {
670
670
  bare.writeString(bc, x.originalType);
671
671
  write1(bc, x.originalName);
672
672
  }
673
+ function readVersionCheckEntry(bc) {
674
+ return {
675
+ resolved: bare.readU32(bc),
676
+ latest: bare.readU32(bc)
677
+ };
678
+ }
679
+ function writeVersionCheckEntry(bc, x) {
680
+ bare.writeU32(bc, x.resolved);
681
+ bare.writeU32(bc, x.latest);
682
+ }
673
683
  function readEntryKind(bc) {
674
684
  const offset = bc.offset;
675
685
  const tag = bare.readU8(bc);
@@ -690,6 +700,8 @@ function readEntryKind(bc) {
690
700
  return { tag: "RaceEntry", val: readRaceEntry(bc) };
691
701
  case 7:
692
702
  return { tag: "RemovedEntry", val: readRemovedEntry(bc) };
703
+ case 8:
704
+ return { tag: "VersionCheckEntry", val: readVersionCheckEntry(bc) };
693
705
  default: {
694
706
  bc.offset = offset;
695
707
  throw new bare.BareError(offset, "invalid tag");
@@ -738,6 +750,11 @@ function writeEntryKind(bc, x) {
738
750
  writeRemovedEntry(bc, x.val);
739
751
  break;
740
752
  }
753
+ case "VersionCheckEntry": {
754
+ bare.writeU8(bc, 8);
755
+ writeVersionCheckEntry(bc, x.val);
756
+ break;
757
+ }
741
758
  }
742
759
  }
743
760
  function readEntry(bc) {
@@ -1182,6 +1199,14 @@ function entryKindToBare(kind) {
1182
1199
  originalName: _nullishCoalesce(kind.data.originalName, () => ( null))
1183
1200
  }
1184
1201
  };
1202
+ case "version_check":
1203
+ return {
1204
+ tag: "VersionCheckEntry",
1205
+ val: {
1206
+ resolved: kind.data.resolved,
1207
+ latest: kind.data.latest
1208
+ }
1209
+ };
1185
1210
  }
1186
1211
  }
1187
1212
  function entryKindFromBare(kind) {
@@ -1263,6 +1288,14 @@ function entryKindFromBare(kind) {
1263
1288
  originalName: _nullishCoalesce(kind.val.originalName, () => ( void 0))
1264
1289
  }
1265
1290
  };
1291
+ case "VersionCheckEntry":
1292
+ return {
1293
+ type: "version_check",
1294
+ data: {
1295
+ resolved: kind.val.resolved,
1296
+ latest: kind.val.latest
1297
+ }
1298
+ };
1266
1299
  default:
1267
1300
  throw new Error(
1268
1301
  `Unknown entry kind: ${kind.tag}`
@@ -3488,6 +3521,65 @@ var WorkflowContextImpl = (_class = class _WorkflowContextImpl {
3488
3521
  setEntry(this.storage, location, entry);
3489
3522
  await this.flushStorage();
3490
3523
  }
3524
+ // === Version ===
3525
+ async getVersion(name, latest) {
3526
+ this.assertNotInProgress();
3527
+ this.checkEvicted();
3528
+ this.entryInProgress = true;
3529
+ try {
3530
+ return await this.executeGetVersion(name, latest);
3531
+ } finally {
3532
+ this.entryInProgress = false;
3533
+ }
3534
+ }
3535
+ async executeGetVersion(name, latest) {
3536
+ if (!Number.isInteger(latest) || latest < 1) {
3537
+ throw new Error(
3538
+ `getVersion("${name}", ${latest}): latest must be an integer >= 1`
3539
+ );
3540
+ }
3541
+ this.checkDuplicateName(name);
3542
+ const location = appendName(this.storage, this.currentLocation, name);
3543
+ const key = locationToKey(this.storage, location);
3544
+ const existing = this.storage.history.entries.get(key);
3545
+ this.markVisited(key);
3546
+ this.stopRollbackIfMissing(existing);
3547
+ if (existing) {
3548
+ if (existing.kind.type !== "version_check") {
3549
+ throw new HistoryDivergedError(
3550
+ `Expected version_check at ${key}, found ${existing.kind.type}`
3551
+ );
3552
+ }
3553
+ return existing.kind.data.resolved;
3554
+ }
3555
+ const resolved = this.hasUnvisitedUnderCurrentScope(key) ? 1 : latest;
3556
+ const entry = createEntry(location, {
3557
+ type: "version_check",
3558
+ data: { resolved, latest }
3559
+ });
3560
+ setEntry(this.storage, location, entry);
3561
+ await this.flushStorage();
3562
+ return resolved;
3563
+ }
3564
+ /**
3565
+ * Returns true if any history entry under the current location scope
3566
+ * (other than `excludeKey`) has not yet been visited this run. Used by
3567
+ * getVersion to detect an old in-flight instance whose scope was already
3568
+ * executed by code that predates a version gate.
3569
+ */
3570
+ hasUnvisitedUnderCurrentScope(excludeKey) {
3571
+ const prefix = locationToKey(this.storage, this.currentLocation);
3572
+ for (const key of this.storage.history.entries.keys()) {
3573
+ if (key === excludeKey) {
3574
+ continue;
3575
+ }
3576
+ const isUnderPrefix = prefix === "" ? true : key.startsWith(`${prefix}/`) || key === prefix;
3577
+ if (isUnderPrefix && !this.visitedKeys.has(key)) {
3578
+ return true;
3579
+ }
3580
+ }
3581
+ return false;
3582
+ }
3491
3583
  }, _class);
3492
3584
 
3493
3585
  // src/utils.ts
@@ -4225,4 +4317,4 @@ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDri
4225
4317
 
4226
4318
 
4227
4319
  exports.extractErrorInfo = extractErrorInfo; exports.CriticalError = CriticalError; exports.RollbackError = RollbackError; exports.RollbackCheckpointError = RollbackCheckpointError; exports.SleepError = SleepError; exports.MessageWaitError = MessageWaitError; exports.EvictedError = EvictedError; exports.HistoryDivergedError = HistoryDivergedError; exports.StepExhaustedError = StepExhaustedError; exports.StepFailedError = StepFailedError; exports.JoinError = JoinError; exports.RaceError = RaceError; exports.CancelledError = CancelledError; exports.EntryInProgressError = EntryInProgressError; exports.keyStartsWith = keyStartsWith; exports.compareKeys = compareKeys; exports.keyToHex = keyToHex; exports.isLoopIterationMarker = isLoopIterationMarker; exports.registerName = registerName; exports.resolveName = resolveName; exports.locationToKey = locationToKey; exports.appendName = appendName; exports.appendLoopIteration = appendLoopIteration; exports.emptyLocation = emptyLocation; exports.parentLocation = parentLocation; exports.isLocationPrefix = isLocationPrefix; exports.locationsEqual = locationsEqual; exports.createStorage = createStorage; exports.createHistorySnapshot = createHistorySnapshot; exports.generateId = generateId; exports.createEntry = createEntry; exports.getOrCreateMetadata = getOrCreateMetadata; exports.loadStorage = loadStorage; exports.loadMetadata = loadMetadata; exports.flush = flush; exports.deleteEntriesWithPrefix = deleteEntriesWithPrefix; exports.getEntry = getEntry; exports.setEntry = setEntry; exports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL = DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL; exports.DEFAULT_STEP_TIMEOUT = DEFAULT_STEP_TIMEOUT; exports.WorkflowContextImpl = WorkflowContextImpl; exports.sleep = sleep; exports.Loop = Loop; exports.runWorkflow = runWorkflow; exports.replayWorkflowFromStep = replayWorkflowFromStep;
4228
- //# sourceMappingURL=chunk-GQWOLYBA.cjs.map
4320
+ //# sourceMappingURL=chunk-OCUQRGRS.cjs.map