Skip to content

Commit 2635c05

Browse files
committed
[SLOP(claude-opus-4-8-high)] feat(workflow-engine): add getVersion primitive for workflow versioning
1 parent ea606a3 commit 2635c05

14 files changed

Lines changed: 478 additions & 5 deletions

File tree

frontend/src/components/actors/workflow/transform-workflow-history.ts

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/components/actors/workflow/workflow-types.ts

Lines changed: 9 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/components/actors/workflow/xyflow-nodes.tsx

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rivetkit-typescript/packages/rivetkit/src/common/bare/transport/v1.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,28 @@ export function writeWorkflowRemovedEntry(
521521
write1(bc, x.originalName);
522522
}
523523

524+
export type WorkflowVersionCheckEntry = {
525+
readonly resolved: u32;
526+
readonly latest: u32;
527+
};
528+
529+
export function readWorkflowVersionCheckEntry(
530+
bc: bare.ByteCursor,
531+
): WorkflowVersionCheckEntry {
532+
return {
533+
resolved: bare.readU32(bc),
534+
latest: bare.readU32(bc),
535+
};
536+
}
537+
538+
export function writeWorkflowVersionCheckEntry(
539+
bc: bare.ByteCursor,
540+
x: WorkflowVersionCheckEntry,
541+
): void {
542+
bare.writeU32(bc, x.resolved);
543+
bare.writeU32(bc, x.latest);
544+
}
545+
524546
export type WorkflowEntryKind =
525547
| { readonly tag: "WorkflowStepEntry"; readonly val: WorkflowStepEntry }
526548
| { readonly tag: "WorkflowLoopEntry"; readonly val: WorkflowLoopEntry }
@@ -538,6 +560,10 @@ export type WorkflowEntryKind =
538560
| {
539561
readonly tag: "WorkflowRemovedEntry";
540562
readonly val: WorkflowRemovedEntry;
563+
}
564+
| {
565+
readonly tag: "WorkflowVersionCheckEntry";
566+
readonly val: WorkflowVersionCheckEntry;
541567
};
542568

543569
export function readWorkflowEntryKind(bc: bare.ByteCursor): WorkflowEntryKind {
@@ -572,6 +598,11 @@ export function readWorkflowEntryKind(bc: bare.ByteCursor): WorkflowEntryKind {
572598
tag: "WorkflowRemovedEntry",
573599
val: readWorkflowRemovedEntry(bc),
574600
};
601+
case 8:
602+
return {
603+
tag: "WorkflowVersionCheckEntry",
604+
val: readWorkflowVersionCheckEntry(bc),
605+
};
575606
default: {
576607
bc.offset = offset;
577608
throw new bare.BareError(offset, "invalid tag");
@@ -624,6 +655,11 @@ export function writeWorkflowEntryKind(
624655
writeWorkflowRemovedEntry(bc, x.val);
625656
break;
626657
}
658+
case "WorkflowVersionCheckEntry": {
659+
bare.writeU8(bc, 8);
660+
writeWorkflowVersionCheckEntry(bc, x.val);
661+
break;
662+
}
627663
}
628664
}
629665

rivetkit-typescript/packages/rivetkit/src/registry/native.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,10 @@ function serializeWorkflowEntryKind(
907907
| {
908908
tag: "WorkflowRemovedEntry";
909909
val: { originalType: string; originalName: string | null };
910+
}
911+
| {
912+
tag: "WorkflowVersionCheckEntry";
913+
val: { resolved: number; latest: number };
910914
} {
911915
switch (kind.tag) {
912916
case "WorkflowStepEntry":
@@ -972,6 +976,14 @@ function serializeWorkflowEntryKind(
972976
originalName: kind.val.originalName,
973977
},
974978
};
979+
case "WorkflowVersionCheckEntry":
980+
return {
981+
tag: kind.tag,
982+
val: {
983+
resolved: kind.val.resolved,
984+
latest: kind.val.latest,
985+
},
986+
};
975987
}
976988
}
977989

rivetkit-typescript/packages/rivetkit/src/workflow/context.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,10 @@ export class WorkflowContext<
960960
await this.#wrapActive(() => this.#inner.removed(name, originalType));
961961
}
962962

963+
getVersion(name: string, latest: number): Promise<number> {
964+
return this.#wrapActive(() => this.#inner.getVersion(name, latest));
965+
}
966+
963967
isEvicted(): boolean {
964968
return this.#inner.isEvicted();
965969
}

rivetkit-typescript/packages/rivetkit/src/workflow/inspector.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,14 @@ function toWorkflowEntryKind(kind: EntryKind): transport.WorkflowEntryKind {
184184
originalName: kind.data.originalName ?? null,
185185
},
186186
};
187+
case "version_check":
188+
return {
189+
tag: "WorkflowVersionCheckEntry",
190+
val: {
191+
resolved: kind.data.resolved,
192+
latest: kind.data.latest,
193+
},
194+
};
187195
default:
188196
assertUnreachable(kind as never);
189197
}

rivetkit-typescript/packages/rivetkit/tests/inspector-versioned.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,17 @@ describe("inspector workflow transport", () => {
188188
},
189189
},
190190
},
191+
{
192+
id: "entry-2",
193+
location: [{ tag: "WorkflowNameIndex", val: 1 }],
194+
kind: {
195+
tag: "WorkflowVersionCheckEntry",
196+
val: {
197+
resolved: 1,
198+
latest: 2,
199+
},
200+
},
201+
},
191202
],
192203
entryMetadata: new Map([
193204
[

rivetkit-typescript/packages/workflow-engine/schemas/serde.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,14 @@ function entryKindToBare(kind: InternalEntryKind): v1.EntryKind {
307307
originalName: kind.data.originalName ?? null,
308308
},
309309
};
310+
case "version_check":
311+
return {
312+
tag: "VersionCheckEntry",
313+
val: {
314+
resolved: kind.data.resolved,
315+
latest: kind.data.latest,
316+
},
317+
};
310318
}
311319
}
312320

@@ -396,6 +404,14 @@ function entryKindFromBare(kind: v1.EntryKind): InternalEntryKind {
396404
originalName: kind.val.originalName ?? undefined,
397405
},
398406
};
407+
case "VersionCheckEntry":
408+
return {
409+
type: "version_check",
410+
data: {
411+
resolved: kind.val.resolved,
412+
latest: kind.val.latest,
413+
},
414+
};
399415
default:
400416
throw new Error(
401417
`Unknown entry kind: ${(kind as { tag: string }).tag}`,

rivetkit-typescript/packages/workflow-engine/schemas/v1.bare

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ type RemovedEntry struct {
122122
originalName: optional<str>
123123
}
124124

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+
125133
# MARK: Entry Kind
126134
# Type-specific entry data
127135
type EntryKind union {
@@ -132,7 +140,8 @@ type EntryKind union {
132140
RollbackCheckpointEntry |
133141
JoinEntry |
134142
RaceEntry |
135-
RemovedEntry
143+
RemovedEntry |
144+
VersionCheckEntry
136145
}
137146

138147
# MARK: Entry

0 commit comments

Comments
 (0)