@rivetkit/workflow-engine 2.3.18 → 2.3.20

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.
@@ -163,6 +163,7 @@ var KEY_PREFIX = {
163
163
  // Workflow metadata: [3, field]
164
164
  ENTRY_METADATA: 4
165
165
  // Entry metadata: [4, entryId]
166
+ // 5 is reserved for RivetKit's workflow trace context.
166
167
  };
167
168
  var WORKFLOW_FIELD = {
168
169
  STATE: 1,
@@ -1871,7 +1872,7 @@ function selectControlFlowError(current, candidate) {
1871
1872
  return controlFlowErrorPriority(candidate) < controlFlowErrorPriority(current) ? candidate : current;
1872
1873
  }
1873
1874
  var WorkflowContextImpl = class _WorkflowContextImpl {
1874
- constructor(workflowId, storage, driver, messageDriver, location = emptyLocation(), abortController, mode = "forward", rollbackActions, rollbackCheckpointSet = false, historyNotifier, onError, logger, visitedKeys) {
1875
+ constructor(workflowId, storage, driver, messageDriver, location = emptyLocation(), abortController, mode = "forward", rollbackActions, rollbackCheckpointSet = false, historyNotifier, onError, logger, visitedKeys, runSpan) {
1875
1876
  this.workflowId = workflowId;
1876
1877
  this.storage = storage;
1877
1878
  this.driver = driver;
@@ -1885,11 +1886,13 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
1885
1886
  this.onError = onError;
1886
1887
  this.logger = logger;
1887
1888
  this.visitedKeys = visitedKeys ?? /* @__PURE__ */ new Set();
1889
+ this.runSpan = runSpan;
1888
1890
  }
1889
1891
  entryInProgress = false;
1890
1892
  abortController;
1891
1893
  currentLocation;
1892
1894
  visitedKeys;
1895
+ runSpan;
1893
1896
  mode;
1894
1897
  rollbackActions;
1895
1898
  rollbackCheckpointSet;
@@ -1942,7 +1945,8 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
1942
1945
  this.historyNotifier,
1943
1946
  this.onError,
1944
1947
  this.logger,
1945
- this.visitedKeys
1948
+ this.visitedKeys,
1949
+ this.runSpan
1946
1950
  );
1947
1951
  }
1948
1952
  /**
@@ -2209,6 +2213,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2209
2213
  }
2210
2214
  }
2211
2215
  async executeStep(config2) {
2216
+ var _a;
2212
2217
  this.ensureRollbackCheckpoint(config2);
2213
2218
  if (this.mode === "rollback") {
2214
2219
  return await this.executeStepRollback(config2);
@@ -2300,9 +2305,13 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2300
2305
  metadata.lastAttemptAt = Date.now();
2301
2306
  metadata.dirty = true;
2302
2307
  const timeout = config2.timeout ?? DEFAULT_STEP_TIMEOUT;
2308
+ const stepSpan = (_a = this.runSpan) == null ? void 0 : _a.startStep(
2309
+ config2.name,
2310
+ metadata.attempts
2311
+ );
2303
2312
  try {
2304
2313
  const output = await this.executeWithTimeout(
2305
- config2.run(),
2314
+ stepSpan ? stepSpan.run(() => config2.run()) : config2.run(),
2306
2315
  timeout,
2307
2316
  config2.name
2308
2317
  );
@@ -2321,6 +2330,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2321
2330
  });
2322
2331
  await this.flushStorage();
2323
2332
  }
2333
+ stepSpan == null ? void 0 : stepSpan.finish("ok");
2324
2334
  this.log("debug", {
2325
2335
  msg: "step completed",
2326
2336
  step: config2.name,
@@ -2333,6 +2343,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2333
2343
  }
2334
2344
  entry.dirty = true;
2335
2345
  if (error instanceof StepTimeoutError && !config2.retryOnTimeout) {
2346
+ stepSpan == null ? void 0 : stepSpan.finish("failed", error);
2336
2347
  metadata.status = "exhausted";
2337
2348
  metadata.error = String(error);
2338
2349
  await this.notifyStepError(config2, metadata.attempts, error, {
@@ -2348,6 +2359,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2348
2359
  );
2349
2360
  }
2350
2361
  if (error instanceof CriticalError || error instanceof RollbackError) {
2362
+ stepSpan == null ? void 0 : stepSpan.finish("failed", error);
2351
2363
  metadata.status = "exhausted";
2352
2364
  metadata.error = String(error);
2353
2365
  await this.notifyStepError(config2, metadata.attempts, error, {
@@ -2363,6 +2375,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2363
2375
  );
2364
2376
  }
2365
2377
  const willRetry = metadata.attempts <= maxRetries;
2378
+ stepSpan == null ? void 0 : stepSpan.finish(willRetry ? "retry" : "failed", error);
2366
2379
  metadata.status = willRetry ? "failed" : "exhausted";
2367
2380
  metadata.error = String(error);
2368
2381
  if (willRetry) {
@@ -3682,7 +3695,7 @@ async function awaitWithEviction(promise, abortSignal) {
3682
3695
  cleanup();
3683
3696
  }
3684
3697
  }
3685
- async function executeRollback(workflowId, workflowFn, input, driver, messageDriver, abortController, storage, historyNotifier, onError, logger) {
3698
+ async function executeRollback(workflowId, workflowFn, input, driver, messageDriver, abortController, storage, historyNotifier, onError, logger, runSpan) {
3686
3699
  const rollbackActions = [];
3687
3700
  const ctx = new WorkflowContextImpl(
3688
3701
  workflowId,
@@ -3696,7 +3709,9 @@ async function executeRollback(workflowId, workflowFn, input, driver, messageDri
3696
3709
  false,
3697
3710
  historyNotifier,
3698
3711
  onError,
3699
- logger
3712
+ logger,
3713
+ void 0,
3714
+ runSpan
3700
3715
  );
3701
3716
  try {
3702
3717
  await workflowFn(ctx, input);
@@ -3832,16 +3847,20 @@ async function waitForSleep(runtime, deadline, abortSignal) {
3832
3847
  async function executeLiveWorkflow(workflowId, workflowFn, input, driver, messageDriver, abortController, runtime, onHistoryUpdated, onError, logger) {
3833
3848
  let lastResult;
3834
3849
  while (true) {
3835
- const result = await executeWorkflow(
3836
- workflowId,
3837
- workflowFn,
3838
- input,
3850
+ const result = await traceRun(
3839
3851
  driver,
3840
- messageDriver,
3841
- abortController,
3842
- onHistoryUpdated,
3843
- onError,
3844
- logger
3852
+ (runSpan) => executeWorkflow(
3853
+ workflowId,
3854
+ workflowFn,
3855
+ input,
3856
+ driver,
3857
+ messageDriver,
3858
+ abortController,
3859
+ onHistoryUpdated,
3860
+ onError,
3861
+ logger,
3862
+ runSpan
3863
+ )
3845
3864
  );
3846
3865
  lastResult = result;
3847
3866
  if (result.state !== "sleeping") {
@@ -3940,16 +3959,20 @@ function runWorkflow(workflowId, workflowFn, input, driver, options = {}) {
3940
3959
  options.onHistoryUpdated,
3941
3960
  options.onError,
3942
3961
  logger
3943
- ) : executeWorkflow(
3944
- workflowId,
3945
- workflowFn,
3946
- input,
3962
+ ) : traceRun(
3947
3963
  driver,
3948
- messageDriver,
3949
- abortController,
3950
- options.onHistoryUpdated,
3951
- options.onError,
3952
- logger
3964
+ (runSpan) => executeWorkflow(
3965
+ workflowId,
3966
+ workflowFn,
3967
+ input,
3968
+ driver,
3969
+ messageDriver,
3970
+ abortController,
3971
+ options.onHistoryUpdated,
3972
+ options.onError,
3973
+ logger,
3974
+ runSpan
3975
+ )
3953
3976
  );
3954
3977
  return {
3955
3978
  workflowId,
@@ -4125,7 +4148,42 @@ function findReplayBoundaryEntry(entries, target) {
4125
4148
  }
4126
4149
  return boundary;
4127
4150
  }
4128
- async function executeWorkflow(workflowId, workflowFn, input, driver, messageDriver, abortController, onHistoryUpdated, onError, logger) {
4151
+ function runOutcomeFromState(state) {
4152
+ switch (state) {
4153
+ case "completed":
4154
+ return "completed";
4155
+ case "sleeping":
4156
+ return "sleeping";
4157
+ case "failed":
4158
+ return "failed";
4159
+ case "cancelled":
4160
+ return "cancelled";
4161
+ case "pending":
4162
+ case "running":
4163
+ case "rolling_back":
4164
+ return "evicted";
4165
+ }
4166
+ }
4167
+ async function traceRun(driver, run) {
4168
+ if (!driver.telemetry) {
4169
+ return await run();
4170
+ }
4171
+ const span = await driver.telemetry.startSpan();
4172
+ let outcome = "failed";
4173
+ try {
4174
+ const result = await span.run(() => run(span));
4175
+ outcome = runOutcomeFromState(result.state);
4176
+ return result;
4177
+ } catch (error) {
4178
+ if (error instanceof EvictedError) {
4179
+ outcome = "cancelled";
4180
+ }
4181
+ throw error;
4182
+ } finally {
4183
+ await span.finish(outcome);
4184
+ }
4185
+ }
4186
+ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDriver, abortController, onHistoryUpdated, onError, logger, runSpan) {
4129
4187
  var _a;
4130
4188
  const storage = await loadStorage(driver);
4131
4189
  const historyNotifier = onHistoryUpdated ? () => onHistoryUpdated(createHistorySnapshot(storage)) : void 0;
@@ -4168,7 +4226,8 @@ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDri
4168
4226
  storage,
4169
4227
  historyNotifier,
4170
4228
  onError,
4171
- logger
4229
+ logger,
4230
+ runSpan
4172
4231
  );
4173
4232
  } catch (error) {
4174
4233
  if (error instanceof EvictedError) {
@@ -4196,7 +4255,9 @@ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDri
4196
4255
  false,
4197
4256
  historyNotifier,
4198
4257
  onError,
4199
- logger
4258
+ logger,
4259
+ void 0,
4260
+ runSpan
4200
4261
  );
4201
4262
  storage.state = "running";
4202
4263
  try {
@@ -4263,7 +4324,8 @@ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDri
4263
4324
  storage,
4264
4325
  historyNotifier,
4265
4326
  onError,
4266
- logger
4327
+ logger,
4328
+ runSpan
4267
4329
  );
4268
4330
  } catch (rollbackError) {
4269
4331
  if (rollbackError instanceof EvictedError) {
@@ -4338,4 +4400,4 @@ export {
4338
4400
  runWorkflow,
4339
4401
  replayWorkflowFromStep
4340
4402
  };
4341
- //# sourceMappingURL=chunk-TVRZA5O5.js.map
4403
+ //# sourceMappingURL=chunk-EGOPMLG2.js.map