rivetkit 0.0.0-codex-docsrs-rivetkit-build.b91ad8d → 0.0.0-codex-rivetkit-quickstart-preview.7e0cd02
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.
- package/dist/browser/client.js +1 -1
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +1 -1
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/tsup/actor/errors.cjs +3 -2
- package/dist/tsup/actor/errors.cjs.map +1 -1
- package/dist/tsup/actor/errors.js +1 -1
- package/dist/tsup/agent-os/index.cjs +1 -1
- package/dist/tsup/agent-os/index.cjs.map +1 -1
- package/dist/tsup/agent-os/index.js +1 -1
- package/dist/tsup/agent-os/index.js.map +1 -1
- package/dist/tsup/{chunk-66D4DAAM.js → chunk-477CG44O.js} +3 -3
- package/dist/tsup/{chunk-ZMOR3CEX.cjs → chunk-6BV4OZDA.cjs} +7 -7
- package/dist/tsup/{chunk-ZMOR3CEX.cjs.map → chunk-6BV4OZDA.cjs.map} +1 -1
- package/dist/tsup/{chunk-2GYNUOP4.js → chunk-7HJD6OOC.js} +2 -2
- package/dist/tsup/{chunk-7FGVV7DV.js → chunk-7JCRVCLG.js} +2 -2
- package/dist/tsup/{chunk-3KCDLZ5U.cjs → chunk-7SCJUVRH.cjs} +10 -10
- package/dist/tsup/{chunk-3KCDLZ5U.cjs.map → chunk-7SCJUVRH.cjs.map} +1 -1
- package/dist/tsup/{chunk-VE2X4KMG.cjs → chunk-DLX4NOQR.cjs} +1 -1
- package/dist/tsup/{chunk-VE2X4KMG.cjs.map → chunk-DLX4NOQR.cjs.map} +1 -1
- package/dist/tsup/{chunk-2V2L5MBZ.cjs → chunk-EIQ7RY24.cjs} +4 -4
- package/dist/tsup/{chunk-2V2L5MBZ.cjs.map → chunk-EIQ7RY24.cjs.map} +1 -1
- package/dist/tsup/{chunk-VQ4EAFUD.js → chunk-EXOFMCDL.js} +7 -7
- package/dist/tsup/{chunk-IVLQ7WOO.cjs → chunk-FDEQTWHW.cjs} +174 -174
- package/dist/tsup/{chunk-IVLQ7WOO.cjs.map → chunk-FDEQTWHW.cjs.map} +1 -1
- package/dist/tsup/{chunk-ZZ3WBRPD.js → chunk-FLWADOST.js} +1 -1
- package/dist/tsup/{chunk-ZA7FLHKH.cjs → chunk-FP2IVSEW.cjs} +1 -1
- package/dist/tsup/{chunk-ZA7FLHKH.cjs.map → chunk-FP2IVSEW.cjs.map} +1 -1
- package/dist/tsup/{chunk-K3EF6FMW.cjs → chunk-H5CY23OP.cjs} +10 -10
- package/dist/tsup/chunk-H5CY23OP.cjs.map +1 -0
- package/dist/tsup/{chunk-ZIPEKFMW.cjs → chunk-JBKNLGTL.cjs} +3 -3
- package/dist/tsup/{chunk-ZIPEKFMW.cjs.map → chunk-JBKNLGTL.cjs.map} +1 -1
- package/dist/tsup/{chunk-I4LOJ2CU.js → chunk-M4DPCXYN.js} +4 -4
- package/dist/tsup/{chunk-JZ7TWV65.js → chunk-MYP3D75W.js} +1 -1
- package/dist/tsup/{chunk-TZCFZNNB.js → chunk-NOOZB3MF.js} +2 -2
- package/dist/tsup/{chunk-3MHDOUD7.cjs → chunk-QILCFULW.cjs} +1 -1
- package/dist/tsup/{chunk-3MHDOUD7.cjs.map → chunk-QILCFULW.cjs.map} +1 -1
- package/dist/tsup/{chunk-XIX5DOZN.js → chunk-RQFXU6US.js} +1 -1
- package/dist/tsup/chunk-S3ZELDAP.cjs +8 -0
- package/dist/tsup/chunk-S3ZELDAP.cjs.map +1 -0
- package/dist/tsup/{chunk-HXUEHHJF.js → chunk-VXO53AYC.js} +1 -1
- package/dist/tsup/{chunk-JLTBC3VR.cjs → chunk-XLHSCH3T.cjs} +5 -5
- package/dist/tsup/{chunk-JLTBC3VR.cjs.map → chunk-XLHSCH3T.cjs.map} +1 -1
- package/dist/tsup/{chunk-YRZLSAQP.js → chunk-XUPYQVCI.js} +3 -3
- package/dist/tsup/chunk-XUPYQVCI.js.map +1 -0
- package/dist/tsup/{chunk-4FC7TVS6.cjs → chunk-ZXMKVBQ6.cjs} +1 -1
- package/dist/tsup/{chunk-4FC7TVS6.cjs.map → chunk-ZXMKVBQ6.cjs.map} +1 -1
- package/dist/tsup/client/mod.cjs +10 -9
- package/dist/tsup/client/mod.cjs.map +1 -1
- package/dist/tsup/client/mod.js +8 -8
- package/dist/tsup/common/log.cjs +4 -3
- package/dist/tsup/common/log.cjs.map +1 -1
- package/dist/tsup/common/log.js +2 -2
- package/dist/tsup/common/websocket.cjs +5 -4
- package/dist/tsup/common/websocket.cjs.map +1 -1
- package/dist/tsup/common/websocket.js +3 -3
- package/dist/tsup/db/drizzle.cjs +4 -3
- package/dist/tsup/db/drizzle.cjs.map +1 -1
- package/dist/tsup/db/drizzle.js +1 -1
- package/dist/tsup/db/mod.cjs +3 -2
- package/dist/tsup/db/mod.cjs.map +1 -1
- package/dist/tsup/db/mod.js +1 -1
- package/dist/tsup/dynamic/mod.cjs +3 -2
- package/dist/tsup/dynamic/mod.cjs.map +1 -1
- package/dist/tsup/dynamic/mod.js +1 -1
- package/dist/tsup/inspector/mod.cjs +7 -6
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.js +5 -5
- package/dist/tsup/inspector-tab/mod.cjs +3 -2
- package/dist/tsup/inspector-tab/mod.cjs.map +1 -1
- package/dist/tsup/inspector-tab/mod.js +1 -1
- package/dist/tsup/mod.cjs +149 -129
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.js +31 -14
- package/dist/tsup/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +13 -12
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.js +8 -8
- package/dist/tsup/utils.cjs +4 -3
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.js +2 -2
- package/dist/tsup/workflow/mod.cjs +33 -32
- package/dist/tsup/workflow/mod.cjs.map +1 -1
- package/dist/tsup/workflow/mod.js +7 -7
- package/package.json +8 -8
- package/src/registry/napi-runtime.ts +1 -1
- package/src/registry/native.ts +1 -1
- package/src/registry/wasm-runtime.ts +1 -2
- package/src/serverless/configure.test.ts +22 -0
- package/src/serverless/configure.ts +25 -2
- package/dist/tsup/chunk-K3EF6FMW.cjs.map +0 -1
- package/dist/tsup/chunk-YRZLSAQP.js.map +0 -1
- /package/dist/tsup/{chunk-66D4DAAM.js.map → chunk-477CG44O.js.map} +0 -0
- /package/dist/tsup/{chunk-2GYNUOP4.js.map → chunk-7HJD6OOC.js.map} +0 -0
- /package/dist/tsup/{chunk-7FGVV7DV.js.map → chunk-7JCRVCLG.js.map} +0 -0
- /package/dist/tsup/{chunk-VQ4EAFUD.js.map → chunk-EXOFMCDL.js.map} +0 -0
- /package/dist/tsup/{chunk-ZZ3WBRPD.js.map → chunk-FLWADOST.js.map} +0 -0
- /package/dist/tsup/{chunk-I4LOJ2CU.js.map → chunk-M4DPCXYN.js.map} +0 -0
- /package/dist/tsup/{chunk-JZ7TWV65.js.map → chunk-MYP3D75W.js.map} +0 -0
- /package/dist/tsup/{chunk-TZCFZNNB.js.map → chunk-NOOZB3MF.js.map} +0 -0
- /package/dist/tsup/{chunk-XIX5DOZN.js.map → chunk-RQFXU6US.js.map} +0 -0
- /package/dist/tsup/{chunk-HXUEHHJF.js.map → chunk-VXO53AYC.js.map} +0 -0
package/dist/tsup/test/mod.cjs
CHANGED
|
@@ -1,26 +1,27 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunk6BV4OZDAcjs = require('../chunk-6BV4OZDA.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
8
|
-
require('../chunk-
|
|
9
|
-
require('../chunk-
|
|
10
|
-
require('../chunk-
|
|
11
|
-
require('../chunk-
|
|
12
|
-
require('../chunk-
|
|
13
|
-
require('../chunk-
|
|
7
|
+
var _chunkFDEQTWHWcjs = require('../chunk-FDEQTWHW.cjs');
|
|
8
|
+
require('../chunk-DLX4NOQR.cjs');
|
|
9
|
+
require('../chunk-XLHSCH3T.cjs');
|
|
10
|
+
require('../chunk-FP2IVSEW.cjs');
|
|
11
|
+
require('../chunk-JBKNLGTL.cjs');
|
|
12
|
+
require('../chunk-H5CY23OP.cjs');
|
|
13
|
+
require('../chunk-ZXMKVBQ6.cjs');
|
|
14
|
+
require('../chunk-S3ZELDAP.cjs');
|
|
14
15
|
|
|
15
16
|
// src/test/mod.ts
|
|
16
17
|
var _pretry = require('p-retry'); var _pretry2 = _interopRequireDefault(_pretry);
|
|
17
18
|
async function waitForRegistryReady(registry) {
|
|
18
|
-
const clientConfig =
|
|
19
|
+
const clientConfig = _chunkFDEQTWHWcjs.convertRegistryConfigToClientConfig.call(void 0,
|
|
19
20
|
registry.parseConfig()
|
|
20
21
|
);
|
|
21
22
|
await _pretry2.default.call(void 0,
|
|
22
23
|
async () => {
|
|
23
|
-
await
|
|
24
|
+
await _chunkFDEQTWHWcjs.getMetadata.call(void 0, clientConfig);
|
|
24
25
|
},
|
|
25
26
|
{
|
|
26
27
|
retries: 20,
|
|
@@ -34,8 +35,8 @@ async function setupTest(c, registry) {
|
|
|
34
35
|
registry.config.noWelcome = true;
|
|
35
36
|
registry.start();
|
|
36
37
|
await waitForRegistryReady(registry);
|
|
37
|
-
const client =
|
|
38
|
-
...
|
|
38
|
+
const client = _chunk6BV4OZDAcjs.createClient.call(void 0, {
|
|
39
|
+
..._chunkFDEQTWHWcjs.convertRegistryConfigToClientConfig.call(void 0, registry.parseConfig()),
|
|
39
40
|
disableMetadataLookup: false
|
|
40
41
|
});
|
|
41
42
|
c.onTestFinished(async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/test/mod.cjs","../../../src/test/mod.ts"],"names":[],"mappings":"AAAA;AACE;AACF,yDAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACA;
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/test/mod.cjs","../../../src/test/mod.ts"],"names":[],"mappings":"AAAA;AACE;AACF,yDAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACA;ACfA,iFAAmB;AAWnB,MAAA,SAAe,oBAAA,CAAqB,QAAA,EAAwC;AAC3E,EAAA,MAAM,aAAA,EAAe,mEAAA;AAAA,IACpB,QAAA,CAAS,WAAA,CAAY;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,8BAAA;AAAA,IACL,MAAA,CAAA,EAAA,GAAY;AACX,MAAA,MAAM,2CAAA,YAAwB,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA;AAAA,MACC,OAAA,EAAS,EAAA;AAAA,MACT,UAAA,EAAY,EAAA;AAAA,MACZ,UAAA,EAAY;AAAA,IACb;AAAA,EACD,CAAA;AACD;AAEA,MAAA,SAAsB,SAAA,CACrB,CAAA,EACA,QAAA,EAC8B;AAC9B,EAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,EAAE,GAAG,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA;AAChE,EAAA,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,IAAA;AAE5B,EAAA,QAAA,CAAS,KAAA,CAAM,CAAA;AACf,EAAA,MAAM,oBAAA,CAAqB,QAAQ,CAAA;AAEnC,EAAA,MAAM,OAAA,EAAS,4CAAA;AAAgB,IAC9B,GAAG,mEAAA,QAAoC,CAAS,WAAA,CAAY,CAAC,CAAA;AAAA,IAC7D,qBAAA,EAAuB;AAAA,EACxB,CAAC,CAAA;AAED,EAAA,CAAA,CAAE,cAAA,CAAe,MAAA,CAAA,EAAA,GAAY;AAC5B,IAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,CAAA;AAAA,EACtB,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,OAAO,CAAA;AACjB;ADFA;AACE;AACF,8BAAC","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/test/mod.cjs","sourcesContent":[null,"import pRetry from \"p-retry\";\nimport type { TestContext } from \"vitest\";\nimport { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport { type Client, createClient } from \"@/client/mod\";\nimport { getMetadata } from \"@/engine-client/api-endpoints\";\nimport type { Registry } from \"@/registry\";\n\nexport interface SetupTestResult<A extends Registry<any>> {\n\tclient: Client<A>;\n}\n\nasync function waitForRegistryReady(registry: Registry<any>): Promise<void> {\n\tconst clientConfig = convertRegistryConfigToClientConfig(\n\t\tregistry.parseConfig(),\n\t);\n\n\tawait pRetry(\n\t\tasync () => {\n\t\t\tawait getMetadata(clientConfig);\n\t\t},\n\t\t{\n\t\t\tretries: 20,\n\t\t\tminTimeout: 50,\n\t\t\tmaxTimeout: 250,\n\t\t},\n\t);\n}\n\nexport async function setupTest<A extends Registry<any>>(\n\tc: TestContext,\n\tregistry: A,\n): Promise<SetupTestResult<A>> {\n\tregistry.config.test = { ...registry.config.test, enabled: true };\n\tregistry.config.noWelcome = true;\n\n\tregistry.start();\n\tawait waitForRegistryReady(registry);\n\n\tconst client = createClient<A>({\n\t\t...convertRegistryConfigToClientConfig(registry.parseConfig()),\n\t\tdisableMetadataLookup: false,\n\t});\n\n\tc.onTestFinished(async () => {\n\t\tawait client.dispose();\n\t});\n\n\treturn { client };\n}\n"]}
|
package/dist/tsup/test/mod.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createClient
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-477CG44O.js";
|
|
4
4
|
import {
|
|
5
5
|
convertRegistryConfigToClientConfig,
|
|
6
6
|
getMetadata
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
7
|
+
} from "../chunk-EXOFMCDL.js";
|
|
8
|
+
import "../chunk-VXO53AYC.js";
|
|
9
|
+
import "../chunk-NOOZB3MF.js";
|
|
10
|
+
import "../chunk-MYP3D75W.js";
|
|
11
|
+
import "../chunk-7JCRVCLG.js";
|
|
12
|
+
import "../chunk-XUPYQVCI.js";
|
|
13
|
+
import "../chunk-FLWADOST.js";
|
|
14
14
|
|
|
15
15
|
// src/test/mod.ts
|
|
16
16
|
import pRetry from "p-retry";
|
package/dist/tsup/utils.cjs
CHANGED
|
@@ -17,8 +17,9 @@
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
var
|
|
21
|
-
require('./chunk-
|
|
20
|
+
var _chunkH5CY23OPcjs = require('./chunk-H5CY23OP.cjs');
|
|
21
|
+
require('./chunk-ZXMKVBQ6.cjs');
|
|
22
|
+
require('./chunk-S3ZELDAP.cjs');
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
|
|
@@ -38,5 +39,5 @@ require('./chunk-4FC7TVS6.cjs');
|
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
|
|
41
|
-
exports.EXTRA_ERROR_LOG =
|
|
42
|
+
exports.EXTRA_ERROR_LOG = _chunkH5CY23OPcjs.EXTRA_ERROR_LOG; exports.SinglePromiseQueue = _chunkH5CY23OPcjs.SinglePromiseQueue; exports.VERSION = _chunkH5CY23OPcjs.VERSION; exports.arrayBuffersEqual = _chunkH5CY23OPcjs.arrayBuffersEqual; exports.assertUnreachable = _chunkH5CY23OPcjs.assertUnreachable; exports.bufferToArrayBuffer = _chunkH5CY23OPcjs.bufferToArrayBuffer; exports.combineUrlPath = _chunkH5CY23OPcjs.combineUrlPath; exports.dbg = _chunkH5CY23OPcjs.dbg; exports.detectRuntime = _chunkH5CY23OPcjs.detectRuntime; exports.getEnvUniversal = _chunkH5CY23OPcjs.getEnvUniversal; exports.httpUserAgent = _chunkH5CY23OPcjs.httpUserAgent; exports.interval = _chunkH5CY23OPcjs.interval; exports.joinSignals = _chunkH5CY23OPcjs.joinSignals; exports.promiseWithResolvers = _chunkH5CY23OPcjs.promiseWithResolvers; exports.setLongTimeout = _chunkH5CY23OPcjs.setLongTimeout; exports.sleep = _chunkH5CY23OPcjs.sleep; exports.stringifyError = _chunkH5CY23OPcjs.stringifyError; exports.toUint8Array = _chunkH5CY23OPcjs.toUint8Array;
|
|
42
43
|
//# sourceMappingURL=utils.cjs.map
|
package/dist/tsup/utils.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/utils.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,mgCAAC","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/utils.cjs"}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/utils.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,mgCAAC","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/utils.cjs"}
|
package/dist/tsup/utils.js
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } var _class; var _class2;
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var _chunk7SCJUVRHcjs = require('../chunk-7SCJUVRH.cjs');
|
|
4
|
+
require('../chunk-EIQ7RY24.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkQILCFULWcjs = require('../chunk-QILCFULW.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
var
|
|
14
|
-
require('../chunk-
|
|
13
|
+
var _chunkDLX4NOQRcjs = require('../chunk-DLX4NOQR.cjs');
|
|
14
|
+
require('../chunk-XLHSCH3T.cjs');
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
var
|
|
17
|
+
var _chunkH5CY23OPcjs = require('../chunk-H5CY23OP.cjs');
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
var
|
|
21
|
+
var _chunkZXMKVBQ6cjs = require('../chunk-ZXMKVBQ6.cjs');
|
|
22
|
+
require('../chunk-S3ZELDAP.cjs');
|
|
22
23
|
|
|
23
24
|
// src/workflow/mod.ts
|
|
24
25
|
|
|
@@ -293,7 +294,7 @@ var WorkflowContext = class _WorkflowContext {
|
|
|
293
294
|
const stepCtx = new WorkflowStepContext(this.#runCtx, () => this.#markGuardTriggered());
|
|
294
295
|
let stateSnapshot = null;
|
|
295
296
|
try {
|
|
296
|
-
stateSnapshot = { state: this.#runCtx[
|
|
297
|
+
stateSnapshot = { state: this.#runCtx[_chunkQILCFULWcjs.RAW_STATE_SYMBOL]() };
|
|
297
298
|
} catch (error) {
|
|
298
299
|
this.#runCtx.log.debug({
|
|
299
300
|
msg: "failed to get state, likely due to being stateless workflow",
|
|
@@ -373,7 +374,7 @@ var WorkflowContext = class _WorkflowContext {
|
|
|
373
374
|
};
|
|
374
375
|
|
|
375
376
|
// src/workflow/driver.ts
|
|
376
|
-
var WORKFLOW_STORAGE_PREFIX =
|
|
377
|
+
var WORKFLOW_STORAGE_PREFIX = _chunkDLX4NOQRcjs.workflowStoragePrefix.call(void 0, );
|
|
377
378
|
function stripWorkflowKey(prefixed) {
|
|
378
379
|
return prefixed.slice(WORKFLOW_STORAGE_PREFIX.length);
|
|
379
380
|
}
|
|
@@ -451,7 +452,7 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
451
452
|
async get(key) {
|
|
452
453
|
const [value] = await this.#runCtx.internalKeepAwake(
|
|
453
454
|
this.#actor.driver.kvBatchGet(this.#actor.id, [
|
|
454
|
-
|
|
455
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, key)
|
|
455
456
|
])
|
|
456
457
|
);
|
|
457
458
|
return _nullishCoalesce(value, () => ( null));
|
|
@@ -459,19 +460,19 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
459
460
|
async set(key, value) {
|
|
460
461
|
await this.#runCtx.internalKeepAwake(
|
|
461
462
|
this.#actor.driver.kvBatchPut(this.#actor.id, [
|
|
462
|
-
[
|
|
463
|
+
[_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, key), value]
|
|
463
464
|
])
|
|
464
465
|
);
|
|
465
466
|
}
|
|
466
467
|
async delete(key) {
|
|
467
468
|
await this.#runCtx.internalKeepAwake(
|
|
468
469
|
this.#actor.driver.kvBatchDelete(this.#actor.id, [
|
|
469
|
-
|
|
470
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, key)
|
|
470
471
|
])
|
|
471
472
|
);
|
|
472
473
|
}
|
|
473
474
|
async deletePrefix(prefix) {
|
|
474
|
-
const start =
|
|
475
|
+
const start = _chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, prefix);
|
|
475
476
|
const end = computeUpperBound(start);
|
|
476
477
|
if (end) {
|
|
477
478
|
await this.#runCtx.internalKeepAwake(
|
|
@@ -496,8 +497,8 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
496
497
|
await this.#runCtx.internalKeepAwake(
|
|
497
498
|
this.#actor.driver.kvDeleteRange(
|
|
498
499
|
this.#actor.id,
|
|
499
|
-
|
|
500
|
-
|
|
500
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, start),
|
|
501
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, end)
|
|
501
502
|
)
|
|
502
503
|
);
|
|
503
504
|
}
|
|
@@ -505,7 +506,7 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
505
506
|
const entries = await this.#runCtx.internalKeepAwake(
|
|
506
507
|
this.#actor.driver.kvListPrefix(
|
|
507
508
|
this.#actor.id,
|
|
508
|
-
|
|
509
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, prefix)
|
|
509
510
|
)
|
|
510
511
|
);
|
|
511
512
|
return entries.map(([key, value]) => ({
|
|
@@ -520,7 +521,7 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
520
521
|
this.#actor.driver.kvBatchPut(
|
|
521
522
|
this.#actor.id,
|
|
522
523
|
writes.map(({ key, value }) => [
|
|
523
|
-
|
|
524
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, key),
|
|
524
525
|
value
|
|
525
526
|
])
|
|
526
527
|
),
|
|
@@ -565,22 +566,22 @@ var ActorWorkflowControlDriver = (_class2 = class {
|
|
|
565
566
|
}
|
|
566
567
|
async get(key) {
|
|
567
568
|
const [value] = await this.#actor.driver.kvBatchGet(this.#actor.id, [
|
|
568
|
-
|
|
569
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, key)
|
|
569
570
|
]);
|
|
570
571
|
return _nullishCoalesce(value, () => ( null));
|
|
571
572
|
}
|
|
572
573
|
async set(key, value) {
|
|
573
574
|
await this.#actor.driver.kvBatchPut(this.#actor.id, [
|
|
574
|
-
[
|
|
575
|
+
[_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, key), value]
|
|
575
576
|
]);
|
|
576
577
|
}
|
|
577
578
|
async delete(key) {
|
|
578
579
|
await this.#actor.driver.kvBatchDelete(this.#actor.id, [
|
|
579
|
-
|
|
580
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, key)
|
|
580
581
|
]);
|
|
581
582
|
}
|
|
582
583
|
async deletePrefix(prefix) {
|
|
583
|
-
const start =
|
|
584
|
+
const start = _chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, prefix);
|
|
584
585
|
const end = computeUpperBound(start);
|
|
585
586
|
if (end) {
|
|
586
587
|
await this.#actor.driver.kvDeleteRange(this.#actor.id, start, end);
|
|
@@ -601,14 +602,14 @@ var ActorWorkflowControlDriver = (_class2 = class {
|
|
|
601
602
|
async deleteRange(start, end) {
|
|
602
603
|
await this.#actor.driver.kvDeleteRange(
|
|
603
604
|
this.#actor.id,
|
|
604
|
-
|
|
605
|
-
|
|
605
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, start),
|
|
606
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, end)
|
|
606
607
|
);
|
|
607
608
|
}
|
|
608
609
|
async list(prefix) {
|
|
609
610
|
const entries = await this.#actor.driver.kvListPrefix(
|
|
610
611
|
this.#actor.id,
|
|
611
|
-
|
|
612
|
+
_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, prefix)
|
|
612
613
|
);
|
|
613
614
|
return entries.map(([key, value]) => ({
|
|
614
615
|
key: stripWorkflowKey(key),
|
|
@@ -621,7 +622,7 @@ var ActorWorkflowControlDriver = (_class2 = class {
|
|
|
621
622
|
}
|
|
622
623
|
await this.#actor.driver.kvBatchPut(
|
|
623
624
|
this.#actor.id,
|
|
624
|
-
writes.map(({ key, value }) => [
|
|
625
|
+
writes.map(({ key, value }) => [_chunkDLX4NOQRcjs.makeWorkflowKey.call(void 0, key), value])
|
|
625
626
|
);
|
|
626
627
|
}
|
|
627
628
|
async setAlarm(_workflowId, wakeAt) {
|
|
@@ -647,7 +648,7 @@ function shouldRethrowWorkflowError(error) {
|
|
|
647
648
|
return true;
|
|
648
649
|
}
|
|
649
650
|
function workflowReplayInFlightError() {
|
|
650
|
-
return new (0,
|
|
651
|
+
return new (0, _chunkZXMKVBQ6cjs.RivetError)(
|
|
651
652
|
"actor",
|
|
652
653
|
"workflow_in_flight",
|
|
653
654
|
"Workflow replay is unavailable while the workflow is currently in flight.",
|
|
@@ -666,13 +667,13 @@ function workflow(fn, options = {}) {
|
|
|
666
667
|
function getWorkflowInspector(actorId) {
|
|
667
668
|
let workflowInspector = workflowInspectors.get(actorId);
|
|
668
669
|
if (!workflowInspector) {
|
|
669
|
-
workflowInspector =
|
|
670
|
+
workflowInspector = _chunk7SCJUVRHcjs.createWorkflowInspectorAdapter.call(void 0, );
|
|
670
671
|
workflowInspectors.set(actorId, workflowInspector);
|
|
671
672
|
}
|
|
672
673
|
return workflowInspector;
|
|
673
674
|
}
|
|
674
675
|
async function run(runCtx) {
|
|
675
|
-
const actor = runCtx[
|
|
676
|
+
const actor = runCtx[_chunkQILCFULWcjs.ACTOR_CONTEXT_INTERNAL_SYMBOL];
|
|
676
677
|
_invariant2.default.call(void 0, actor, "workflow() requires an actor instance");
|
|
677
678
|
const workflowInspector = getWorkflowInspector(actor.id);
|
|
678
679
|
const driver = new ActorWorkflowDriver(actor, runCtx);
|
|
@@ -728,26 +729,26 @@ function workflow(fn, options = {}) {
|
|
|
728
729
|
try {
|
|
729
730
|
await handle.result;
|
|
730
731
|
} catch (error) {
|
|
731
|
-
if (runCtx.abortSignal.aborted ||
|
|
732
|
+
if (runCtx.abortSignal.aborted || _chunkZXMKVBQ6cjs.isActorAbortedError.call(void 0, error)) {
|
|
732
733
|
return;
|
|
733
734
|
}
|
|
734
735
|
if (shouldRethrowWorkflowError(error)) {
|
|
735
736
|
runCtx.log.error({
|
|
736
737
|
msg: "workflow run failed",
|
|
737
|
-
error:
|
|
738
|
+
error: _chunkH5CY23OPcjs.stringifyError.call(void 0, error)
|
|
738
739
|
});
|
|
739
740
|
throw error;
|
|
740
741
|
}
|
|
741
742
|
runCtx.log.warn({
|
|
742
743
|
msg: "workflow failed and will sleep until woken",
|
|
743
|
-
error:
|
|
744
|
+
error: _chunkH5CY23OPcjs.stringifyError.call(void 0, error)
|
|
744
745
|
});
|
|
745
746
|
} finally {
|
|
746
747
|
runCtx.abortSignal.removeEventListener("abort", onAbort);
|
|
747
748
|
}
|
|
748
749
|
}
|
|
749
750
|
const runWithConfig = run;
|
|
750
|
-
runWithConfig[
|
|
751
|
+
runWithConfig[_chunkQILCFULWcjs.RUN_FUNCTION_CONFIG_SYMBOL] = {
|
|
751
752
|
icon: "diagram-project",
|
|
752
753
|
// Drop the per-actor inspector when the actor is destroyed so this map
|
|
753
754
|
// does not retain one inspector (and its encoded history) per actor id
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/workflow/mod.cjs","../../../src/workflow/mod.ts","../../../src/workflow/constants.ts","../../../src/workflow/context.ts","../../../src/workflow/driver.ts"],"names":[],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/workflow/mod.cjs","sourcesContent":[null,"import {\n\tCriticalError,\n\tEntryInProgressError,\n\tHistoryDivergedError,\n\tJoinError,\n\tRaceError,\n\tRollbackCheckpointError,\n\tRollbackError,\n\treplayWorkflowFromStep,\n\ttype RunWorkflowOptions,\n\trunWorkflow,\n\tStepExhaustedError,\n\ttype WorkflowErrorEvent,\n} from \"@rivetkit/workflow-engine\";\nimport invariant from \"invariant\";\nimport type { RunContext } from \"@/actor/config\";\nimport {\n\tACTOR_CONTEXT_INTERNAL_SYMBOL,\n\tRUN_FUNCTION_CONFIG_SYMBOL,\n} from \"@/actor/config\";\nimport type { AnyStaticActorInstance } from \"@/actor/definition\";\nimport { isActorAbortedError, RivetError } from \"@/actor/errors\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"@/actor/schema\";\nimport type { AnyDatabaseProvider } from \"@/common/database/config\";\nimport { stringifyError } from \"@/utils\";\nimport { WorkflowContext } from \"./context\";\nimport { ActorWorkflowControlDriver, ActorWorkflowDriver } from \"./driver\";\nimport { createWorkflowInspectorAdapter } from \"./inspector\";\n\nexport type {\n\tTryBlockCatchKind,\n\tTryBlockConfig,\n\tTryBlockFailure,\n\tTryBlockResult,\n\tTryStepCatchKind,\n\tTryStepConfig,\n\tTryStepFailure,\n\tTryStepResult,\n\tWorkflowError,\n\tWorkflowErrorEvent,\n} from \"@rivetkit/workflow-engine\";\nexport { Loop } from \"@rivetkit/workflow-engine\";\nexport {\n\ttype WorkflowBranchConfig,\n\ttype WorkflowBranchContextOf,\n\tWorkflowContext,\n\ttype WorkflowContextOf,\n\ttype WorkflowLoopConfig,\n\ttype WorkflowLoopContextOf,\n\ttype WorkflowStepConfig,\n\tWorkflowStepContext,\n\ttype WorkflowStepContextOf,\n\ttype WorkflowTryConfig,\n\ttype WorkflowTryStepConfig,\n} from \"./context\";\n\nfunction shouldRethrowWorkflowError(error: unknown): boolean {\n\tif (\n\t\terror instanceof CriticalError ||\n\t\terror instanceof JoinError ||\n\t\terror instanceof RaceError ||\n\t\terror instanceof RollbackError ||\n\t\terror instanceof StepExhaustedError\n\t) {\n\t\treturn false;\n\t}\n\n\tif (\n\t\terror instanceof EntryInProgressError ||\n\t\terror instanceof HistoryDivergedError ||\n\t\terror instanceof RollbackCheckpointError\n\t) {\n\t\treturn true;\n\t}\n\n\treturn true;\n}\n\nfunction workflowReplayInFlightError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"workflow_in_flight\",\n\t\t\"Workflow replay is unavailable while the workflow is currently in flight.\",\n\t\t{\n\t\t\tpublic: true,\n\t\t\tstatusCode: 409,\n\t\t},\n\t);\n}\n\nfunction isWorkflowReplayBlockedByRunningEntry(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\terror.message ===\n\t\t\t\"Cannot replay a workflow while a step is currently running\"\n\t);\n}\n\nexport interface WorkflowOptions<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\tonError?: (\n\t\tctx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tevent: WorkflowErrorEvent,\n\t) => void | Promise<void>;\n}\n\nexport function workflow<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n>(\n\tfn: (\n\t\tctx: WorkflowContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) => Promise<unknown>,\n\toptions: WorkflowOptions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> = {},\n): (\n\tc: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<void> {\n\tconst onError = options.onError;\n\tconst workflowInspectors = new Map<\n\t\tstring,\n\t\tReturnType<typeof createWorkflowInspectorAdapter>\n\t>();\n\n\tfunction getWorkflowInspector(actorId: string) {\n\t\tlet workflowInspector = workflowInspectors.get(actorId);\n\t\tif (!workflowInspector) {\n\t\t\tworkflowInspector = createWorkflowInspectorAdapter();\n\t\t\tworkflowInspectors.set(actorId, workflowInspector);\n\t\t}\n\t\treturn workflowInspector;\n\t}\n\n\tasync function run(\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<void> {\n\t\tconst actor = (\n\t\t\trunCtx as unknown as {\n\t\t\t\t[ACTOR_CONTEXT_INTERNAL_SYMBOL]?: AnyStaticActorInstance;\n\t\t\t}\n\t\t)[ACTOR_CONTEXT_INTERNAL_SYMBOL];\n\t\tinvariant(actor, \"workflow() requires an actor instance\");\n\t\tconst workflowInspector = getWorkflowInspector(actor.id);\n\n\t\tconst driver = new ActorWorkflowDriver(actor, runCtx);\n\t\tconst controlDriver = new ActorWorkflowControlDriver(actor);\n\t\tworkflowInspector.setReplayFromStep(async (entryId) => {\n\t\t\tconst workflowState = await workflowInspector.adapter.getState();\n\t\t\tif (\n\t\t\t\tactor.isRunHandlerActive() ||\n\t\t\t\tworkflowState === \"pending\" ||\n\t\t\t\tworkflowState === \"running\"\n\t\t\t) {\n\t\t\t\tthrow workflowReplayInFlightError();\n\t\t\t}\n\n\t\t\tlet snapshot;\n\t\t\ttry {\n\t\t\t\tsnapshot = await replayWorkflowFromStep(\n\t\t\t\t\tactor.id,\n\t\t\t\t\tcontrolDriver,\n\t\t\t\t\tentryId,\n\t\t\t\t\t{ scheduleAlarm: false },\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isWorkflowReplayBlockedByRunningEntry(error)) {\n\t\t\t\t\tthrow workflowReplayInFlightError();\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tworkflowInspector.update(snapshot);\n\t\t\tawait actor.restartRunHandler();\n\t\t\treturn workflowInspector.adapter.getHistory();\n\t\t});\n\n\t\tconst handle = runWorkflow(\n\t\t\tactor.id,\n\t\t\tasync (ctx) => await fn(new WorkflowContext(ctx, runCtx)),\n\t\t\tundefined,\n\t\t\tdriver,\n\t\t\t{\n\t\t\t\tmode: \"live\",\n\t\t\t\t// The actor logger and the engine's pino logger are runtime\n\t\t\t\t// compatible but not structurally assignable.\n\t\t\t\tlogger: runCtx.log as RunWorkflowOptions[\"logger\"],\n\t\t\t\tonHistoryUpdated: workflowInspector.update,\n\t\t\t\tonError: onError\n\t\t\t\t\t? async (event) => await onError(runCtx, event)\n\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t);\n\t\tworkflowInspector.setGetState(async () => await handle.getState());\n\n\t\tconst onAbort = () => {\n\t\t\thandle.evict();\n\t\t};\n\t\tif (runCtx.abortSignal.aborted) {\n\t\t\tonAbort();\n\t\t} else {\n\t\t\trunCtx.abortSignal.addEventListener(\"abort\", onAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tawait handle.result;\n\t\t} catch (error) {\n\t\t\t// `abortSignal.aborted` is delivered on a separate async hop and\n\t\t\t// races the rejection, so detect the sleep abort structurally too.\n\t\t\tif (runCtx.abortSignal.aborted || isActorAbortedError(error)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (shouldRethrowWorkflowError(error)) {\n\t\t\t\trunCtx.log.error({\n\t\t\t\t\tmsg: \"workflow run failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\trunCtx.log.warn({\n\t\t\t\tmsg: \"workflow failed and will sleep until woken\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t} finally {\n\t\t\trunCtx.abortSignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t}\n\n\tconst runWithConfig = run as typeof run & {\n\t\t[RUN_FUNCTION_CONFIG_SYMBOL]?: {\n\t\t\ticon?: string;\n\t\t\tinspectorFactory?: (actor: unknown) => unknown;\n\t\t\tdisposeInspector?: (actorId: string) => void;\n\t\t};\n\t};\n\trunWithConfig[RUN_FUNCTION_CONFIG_SYMBOL] = {\n\t\ticon: \"diagram-project\",\n\t\t// Drop the per-actor inspector when the actor is destroyed so this map\n\t\t// does not retain one inspector (and its encoded history) per actor id\n\t\t// for the process lifetime.\n\t\tdisposeInspector: (actorId) => {\n\t\t\tworkflowInspectors.delete(actorId);\n\t\t},\n\t\tinspectorFactory: (actor) => {\n\t\t\tconst actorId = resolveWorkflowInspectorActorId(actor);\n\t\t\treturn {\n\t\t\t\tworkflow: actorId\n\t\t\t\t\t? getWorkflowInspector(actorId).adapter\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tgetHistory: () => null,\n\t\t\t\t\t\t\tonHistoryUpdated: () => () => {},\n\t\t\t\t\t\t\treplayFromStep: async () => null,\n\t\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n\n\treturn runWithConfig;\n}\n\nfunction resolveWorkflowInspectorActorId(actor: unknown): string | undefined {\n\tif (typeof actor === \"string\" && actor.length > 0) {\n\t\treturn actor;\n\t}\n\n\tif (!actor || typeof actor !== \"object\") {\n\t\treturn undefined;\n\t}\n\n\tconst candidate = actor as {\n\t\tid?: unknown;\n\t\tactorId?: unknown;\n\t};\n\tif (typeof candidate.id === \"string\" && candidate.id.length > 0) {\n\t\treturn candidate.id;\n\t}\n\tif (typeof candidate.actorId === \"string\" && candidate.actorId.length > 0) {\n\t\treturn candidate.actorId;\n\t}\n\n\treturn undefined;\n}\n","export const WORKFLOW_GUARD_KV_KEY = \"__rivet_actor_workflow_guard_triggered\";\n","import type {\n\tBranchConfig,\n\tBranchOutput,\n\tEntryKindType,\n\tLoopConfig,\n\tLoopResult,\n\tStepConfig,\n\tTryBlockConfig,\n\tTryBlockResult,\n\tTryStepConfig,\n\tTryStepResult,\n\tWorkflowContextInterface,\n\tWorkflowQueueMessage,\n} from \"@rivetkit/workflow-engine\";\nimport type {\n\tQueueFilterName,\n\tQueueNextBatchOptions,\n\tQueueNextOptions,\n\tQueueResultMessageForName,\n} from \"@/actor/config\";\nimport { RAW_STATE_SYMBOL, type RunContext } from \"@/actor/config\";\nimport type {\n\tAnyActorDefinition,\n\tBaseActorDefinition,\n} from \"@/actor/definition\";\nimport type {\n\tEventSchemaConfig,\n\tInferEventArgs,\n\tInferSchemaMap,\n\tQueueSchemaConfig,\n} from \"@/actor/schema\";\nimport type { Client } from \"@/client/client\";\nimport type {\n\tAnyDatabaseProvider,\n\tInferDatabaseClient,\n} from \"@/common/database/config\";\nimport type { Registry } from \"@/registry\";\nimport { WORKFLOW_GUARD_KV_KEY } from \"./constants\";\n\ntype WorkflowActorQueueNextOptions<\n\tTName extends string,\n\tTCompletable extends boolean,\n> = Omit<QueueNextOptions<TName, TCompletable>, \"signal\">;\n\ntype WorkflowActorQueueNextOptionsFallback<TCompletable extends boolean> = Omit<\n\tQueueNextOptions<string, TCompletable>,\n\t\"signal\"\n>;\n\ntype WorkflowActorQueueNextBatchOptions<\n\tTName extends string,\n\tTCompletable extends boolean,\n> = Omit<QueueNextBatchOptions<TName, TCompletable>, \"signal\">;\n\ntype WorkflowActorQueueNextBatchOptionsFallback<TCompletable extends boolean> =\n\tOmit<QueueNextBatchOptions<string, TCompletable>, \"signal\">;\n\n// Step run callbacks receive a WorkflowStepContext, which is the only place\n// actor data (state/db/vars/client) may be touched.\ntype WorkflowStepRun<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tstep: WorkflowStepContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<T>;\n\n// Step rollback callbacks compensate a committed step, so they also run with a\n// WorkflowStepContext to mutate actor data.\ntype WorkflowStepRollback<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tstep: WorkflowStepContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n\toutput: T,\n) => Promise<void>;\n\n// Orchestration callbacks (try/loop/race/join) receive a WorkflowContext,\n// because inside them you sequence further steps rather than touch actor data.\ntype WorkflowContextRun<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tctx: WorkflowContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<T>;\n\nexport type WorkflowStepConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<StepConfig<T>, \"run\" | \"rollback\"> & {\n\trun: WorkflowStepRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\trollback?: WorkflowStepRollback<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowTryStepConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<TryStepConfig<T>, \"run\" | \"rollback\"> & {\n\trun: WorkflowStepRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\trollback?: WorkflowStepRollback<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowTryConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<TryBlockConfig<T>, \"run\"> & {\n\trun: WorkflowContextRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowLoopConfig<\n\tS,\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<LoopConfig<S, T>, \"run\"> & {\n\trun: (\n\t\tctx: WorkflowContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tstate: S,\n\t) => Promise<\n\t\tLoopResult<S, T> | (S extends undefined ? undefined | void : never)\n\t>;\n};\n\nexport type WorkflowBranchConfig<\n\tTOutput,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = {\n\trun: WorkflowContextRun<\n\t\tTOutput,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\n// Marks a step context inactive once its step has finished. Module-private so it\n// never appears on the public surface.\nconst DEACTIVATE_STEP = Symbol(\"workflow.step.deactivate\");\n\n/**\n * The context handed to a workflow step (`step` / `tryStep` callbacks). This is\n * the only scope where actor data (state, vars, db, client) and side effects\n * (broadcast, queue.send) are reachable. It is valid only while its step is\n * executing; using it after the step resolves throws.\n */\nexport class WorkflowStepContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#runCtx: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\t#active = true;\n\t#onGuardViolation: () => void;\n\n\tconstructor(\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tonGuardViolation: () => void,\n\t) {\n\t\tthis.#runCtx = runCtx;\n\t\tthis.#onGuardViolation = onGuardViolation;\n\t}\n\n\t[DEACTIVATE_STEP](): void {\n\t\tthis.#active = false;\n\t}\n\n\t#ensureActive(feature: string): void {\n\t\tif (!this.#active) {\n\t\t\tthis.#onGuardViolation();\n\t\t\tthrow new Error(\n\t\t\t\t`${feature} is only available inside workflow steps`,\n\t\t\t);\n\t\t}\n\t}\n\n\tget actorId(): string {\n\t\treturn this.#runCtx.actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#runCtx.name;\n\t}\n\n\tget key(): string[] {\n\t\treturn this.#runCtx.key;\n\t}\n\n\tget log() {\n\t\treturn this.#runCtx.log;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#runCtx.abortSignal;\n\t}\n\n\tget state(): TState extends never ? never : TState {\n\t\tthis.#ensureActive(\"state\");\n\t\treturn this.#runCtx.state as TState extends never ? never : TState;\n\t}\n\n\tget vars(): TVars extends never ? never : TVars {\n\t\tthis.#ensureActive(\"vars\");\n\t\treturn this.#runCtx.vars as TVars extends never ? never : TVars;\n\t}\n\n\tget db(): TDatabase extends never ? never : InferDatabaseClient<TDatabase> {\n\t\tthis.#ensureActive(\"db\");\n\t\treturn this.#runCtx.db as TDatabase extends never\n\t\t\t? never\n\t\t\t: InferDatabaseClient<TDatabase>;\n\t}\n\n\tclient<R extends Registry<any> = Registry<any>>(): Client<R> {\n\t\tthis.#ensureActive(\"client\");\n\t\treturn this.#runCtx.client<R>();\n\t}\n\n\tbroadcast<K extends keyof TEvents & string>(\n\t\tname: K,\n\t\t...args: InferEventArgs<InferSchemaMap<TEvents>[K]>\n\t): void;\n\tbroadcast(\n\t\tname: keyof TEvents extends never ? string : never,\n\t\t...args: Array<unknown>\n\t): void;\n\tbroadcast(name: string, ...args: Array<unknown>): void {\n\t\tthis.#ensureActive(\"broadcast\");\n\t\tthis.#runCtx.broadcast(\n\t\t\tname as never,\n\t\t\t...(args as unknown[] as never[]),\n\t\t);\n\t}\n\n\tget queue() {\n\t\tconst self = this;\n\t\tfunction send<K extends keyof TQueues & string>(\n\t\t\tname: K,\n\t\t\tbody: InferSchemaMap<TQueues>[K],\n\t\t): Promise<void>;\n\t\tfunction send(\n\t\t\tname: keyof TQueues extends never ? string : never,\n\t\t\tbody: unknown,\n\t\t): Promise<void>;\n\t\tasync function send(name: string, body: unknown): Promise<void> {\n\t\t\tself.#ensureActive(\"queue.send\");\n\t\t\tawait self.#runCtx.queue.send(name as never, body as never);\n\t\t}\n\t\treturn { send };\n\t}\n\n\t/**\n\t * Holds the actor awake for the duration of the provided promise. The actor\n\t * cannot idle-sleep or finalize the sleep grace period until the promise\n\t * settles.\n\t */\n\tkeepAwake<T>(promise: Promise<T>): Promise<T> {\n\t\tthis.#ensureActive(\"keepAwake\");\n\t\treturn this.#runCtx.keepAwake(promise);\n\t}\n\n\t/**\n\t * Registers a promise that the sleep grace period will wait on. Use this for\n\t * best-effort flush/cleanup work that may complete inside the grace window.\n\t */\n\twaitUntil(promise: Promise<void>): void {\n\t\tthis.#ensureActive(\"waitUntil\");\n\t\tthis.#runCtx.waitUntil(promise);\n\t}\n\n\tdestroy(): void {\n\t\tthis.#ensureActive(\"destroy\");\n\t\tthis.#runCtx.destroy();\n\t}\n}\n\n/**\n * The context handed to the workflow function and to orchestration callbacks\n * (`try` / `loop` / `race` / `join`). It exposes the deterministic, replayable\n * workflow primitives (step, sleep, queue waits, control flow). It deliberately\n * does NOT expose actor data; reach `state`, `db`, `vars`, `client`, and\n * `broadcast` through the step context passed to `step` / `tryStep`.\n */\nexport class WorkflowContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#inner: WorkflowContextInterface;\n\t#runCtx: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\n\tconstructor(\n\t\tinner: WorkflowContextInterface,\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) {\n\t\tthis.#inner = inner;\n\t\tthis.#runCtx = runCtx;\n\t}\n\n\tget workflowId(): string {\n\t\treturn this.#inner.workflowId;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#inner.abortSignal;\n\t}\n\n\tget actorId(): string {\n\t\treturn this.#runCtx.actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#runCtx.name;\n\t}\n\n\tget key(): string[] {\n\t\treturn this.#runCtx.key;\n\t}\n\n\tget log() {\n\t\treturn this.#runCtx.log;\n\t}\n\n\tget queue() {\n\t\tconst self = this;\n\t\tfunction next<\n\t\t\tconst TName extends QueueFilterName<TQueues>,\n\t\t\tconst TCompletable extends boolean = false,\n\t\t>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextOptions<TName, TCompletable>,\n\t\t): Promise<QueueResultMessageForName<TQueues, TName, TCompletable>>;\n\t\tfunction next<const TCompletable extends boolean = false>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextOptionsFallback<TCompletable>,\n\t\t): Promise<\n\t\t\tQueueResultMessageForName<\n\t\t\t\tTQueues,\n\t\t\t\tQueueFilterName<TQueues>,\n\t\t\t\tTCompletable\n\t\t\t>\n\t\t>;\n\t\t// The implementation signature stays broad so the schema-typed public\n\t\t// overloads above remain compatible with it.\n\t\tasync function next(name: string, opts?: any): Promise<any> {\n\t\t\tconst message = await self.#inner.queue.next(name, opts);\n\t\t\treturn self.#toActorQueueMessage(message);\n\t\t}\n\n\t\tfunction nextBatch<\n\t\t\tconst TName extends QueueFilterName<TQueues>,\n\t\t\tconst TCompletable extends boolean = false,\n\t\t>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextBatchOptions<TName, TCompletable>,\n\t\t): Promise<\n\t\t\tArray<QueueResultMessageForName<TQueues, TName, TCompletable>>\n\t\t>;\n\t\tfunction nextBatch<const TCompletable extends boolean = false>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextBatchOptionsFallback<TCompletable>,\n\t\t): Promise<\n\t\t\tArray<\n\t\t\t\tQueueResultMessageForName<\n\t\t\t\t\tTQueues,\n\t\t\t\t\tQueueFilterName<TQueues>,\n\t\t\t\t\tTCompletable\n\t\t\t\t>\n\t\t\t>\n\t\t>;\n\t\tasync function nextBatch(name: string, opts?: any): Promise<any> {\n\t\t\tconst messages = await self.#inner.queue.nextBatch(name, opts);\n\t\t\treturn messages.map((message) =>\n\t\t\t\tself.#toActorQueueMessage(message),\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tnext,\n\t\t\tnextBatch,\n\t\t};\n\t}\n\n\tstep<T>(\n\t\tname: string,\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tstep<T>(\n\t\tconfig: WorkflowStepConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tasync step<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowStepConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Step run function missing\");\n\t\t\t}\n\t\t\tconst stepRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.step(nameOrConfig, () => this.#runStep(stepRun)),\n\t\t\t);\n\t\t}\n\t\tconst stepConfig = nameOrConfig;\n\t\tconst rollback = stepConfig.rollback;\n\t\tconst config: StepConfig<T> = {\n\t\t\t...stepConfig,\n\t\t\trun: () => this.#runStep(stepConfig.run),\n\t\t\trollback: rollback\n\t\t\t\t? (_ctx, output) => this.#runRollback(rollback, output)\n\t\t\t\t: undefined,\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.step(config));\n\t}\n\n\ttryStep<T>(\n\t\tname: string,\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>>;\n\ttryStep<T>(\n\t\tconfig: WorkflowTryStepConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>>;\n\tasync tryStep<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowTryStepConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Step run function missing\");\n\t\t\t}\n\t\t\tconst stepRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.tryStep(nameOrConfig, () => this.#runStep(stepRun)),\n\t\t\t);\n\t\t}\n\t\tconst stepConfig = nameOrConfig;\n\t\tconst rollback = stepConfig.rollback;\n\t\tconst config: TryStepConfig<T> = {\n\t\t\t...stepConfig,\n\t\t\trun: () => this.#runStep(stepConfig.run),\n\t\t\trollback: rollback\n\t\t\t\t? (_ctx, output) => this.#runRollback(rollback, output)\n\t\t\t\t: undefined,\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.tryStep(config));\n\t}\n\n\ttry<T>(\n\t\tname: string,\n\t\trun: WorkflowContextRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>>;\n\ttry<T>(\n\t\tconfig: WorkflowTryConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>>;\n\tasync try<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowTryConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowContextRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Try run function missing\");\n\t\t\t}\n\t\t\tconst tryRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.try(nameOrConfig, async (ctx) =>\n\t\t\t\t\ttryRun(this.#createChildContext(ctx)),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst tryConfig = nameOrConfig;\n\t\tconst config: TryBlockConfig<T> = {\n\t\t\t...tryConfig,\n\t\t\trun: async (ctx) => tryConfig.run(this.#createChildContext(ctx)),\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.try(config));\n\t}\n\n\tloop<T>(\n\t\tname: string,\n\t\trun: (\n\t\t\tctx: WorkflowContext<\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>,\n\t\t) => Promise<LoopResult<undefined, T> | undefined | void>,\n\t): Promise<T>;\n\tloop<S, T>(\n\t\tconfig: WorkflowLoopConfig<\n\t\t\tS,\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tasync loop(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowLoopConfig<\n\t\t\t\t\tany,\n\t\t\t\t\tany,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: (\n\t\t\tctx: WorkflowContext<\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>,\n\t\t) => Promise<LoopResult<undefined, any> | undefined | void>,\n\t): Promise<any> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Loop run function missing\");\n\t\t\t}\n\t\t\tconst loopRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.loop(\n\t\t\t\t\tnameOrConfig,\n\t\t\t\t\t// A void return (no explicit Loop result) is undefined at\n\t\t\t\t\t// runtime, which the engine treats as continue.\n\t\t\t\t\tasync (\n\t\t\t\t\t\tctx,\n\t\t\t\t\t): Promise<LoopResult<undefined, any> | undefined> =>\n\t\t\t\t\t\t(await loopRun(this.#createChildContext(ctx))) ??\n\t\t\t\t\t\tundefined,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst loopConfig = nameOrConfig;\n\t\tconst wrapped: LoopConfig<any, any> = {\n\t\t\t...loopConfig,\n\t\t\trun: (async (ctx, state) =>\n\t\t\t\t(await loopConfig.run(this.#createChildContext(ctx), state)) ??\n\t\t\t\tundefined) as LoopConfig<any, any>[\"run\"],\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.loop(wrapped));\n\t}\n\n\tsleep(name: string, durationMs: number): Promise<void> {\n\t\treturn this.#inner.sleep(name, durationMs);\n\t}\n\n\tsleepUntil(name: string, timestampMs: number): Promise<void> {\n\t\treturn this.#inner.sleepUntil(name, timestampMs);\n\t}\n\n\tasync rollbackCheckpoint(name: string): Promise<void> {\n\t\tawait this.#wrapActive(() => this.#inner.rollbackCheckpoint(name));\n\t}\n\n\tasync join<\n\t\tT extends Record<\n\t\t\tstring,\n\t\t\tWorkflowBranchConfig<\n\t\t\t\tunknown,\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>\n\t\t>,\n\t>(\n\t\tname: string,\n\t\tbranches: T,\n\t): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K][\"run\"]>> }>;\n\tasync join<T extends Record<string, BranchConfig<unknown>>>(\n\t\tname: string,\n\t\tbranches: T,\n\t): Promise<{ [K in keyof T]: BranchOutput<T[K]> }>;\n\tasync join(\n\t\tname: string,\n\t\tbranches: Record<string, { run: (ctx: any) => Promise<unknown> }>,\n\t) {\n\t\tconst wrappedBranches = Object.fromEntries(\n\t\t\tObject.entries(branches).map(([key, branch]) => [\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\trun: async (ctx: WorkflowContextInterface) =>\n\t\t\t\t\t\tbranch.run(this.#createChildContext(ctx)),\n\t\t\t\t},\n\t\t\t]),\n\t\t) as Record<string, BranchConfig<unknown>>;\n\t\treturn await this.#wrapActive(() =>\n\t\t\tthis.#inner.join(name, wrappedBranches),\n\t\t);\n\t}\n\n\tasync race<T>(\n\t\tname: string,\n\t\tbranches: Array<{\n\t\t\tname: string;\n\t\t\trun: WorkflowContextRun<\n\t\t\t\tT,\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>;\n\t\t}>,\n\t): Promise<{ winner: string; value: T }> {\n\t\tconst wrappedBranches = branches.map((branch) => ({\n\t\t\tname: branch.name,\n\t\t\trun: (ctx: WorkflowContextInterface) =>\n\t\t\t\tbranch.run(this.#createChildContext(ctx)),\n\t\t}));\n\t\treturn (await this.#wrapActive(() =>\n\t\t\tthis.#inner.race(name, wrappedBranches),\n\t\t)) as { winner: string; value: T };\n\t}\n\n\tasync removed(name: string, originalType: EntryKindType): Promise<void> {\n\t\tawait this.#wrapActive(() => this.#inner.removed(name, originalType));\n\t}\n\n\tisEvicted(): boolean {\n\t\treturn this.#inner.isEvicted();\n\t}\n\n\t// Runs a user step body inside a fresh step context, snapshotting actor\n\t// state/vars so a thrown step rolls back its mutations, and deactivating the\n\t// step context once the body settles so it cannot be used after the step.\n\tasync #runStep<T>(\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T> {\n\t\tconst stepCtx = new WorkflowStepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>(this.#runCtx, () => this.#markGuardTriggered());\n\n\t\tlet stateSnapshot: { state: TState } | null = null;\n\t\ttry {\n\t\t\tstateSnapshot = { state: this.#runCtx[RAW_STATE_SYMBOL]() };\n\t\t} catch (error) {\n\t\t\tthis.#runCtx.log.debug({\n\t\t\t\tmsg: \"failed to get state, likely due to being stateless workflow\",\n\t\t\t\terror,\n\t\t\t});\n\t\t}\n\t\tif (stateSnapshot) {\n\t\t\tstateSnapshot.state = structuredClone(stateSnapshot.state);\n\t\t}\n\t\tconst varsSnapshot = structuredClone(this.#runCtx.vars);\n\n\t\ttry {\n\t\t\treturn await run(stepCtx);\n\t\t} catch (error) {\n\t\t\tif (stateSnapshot) {\n\t\t\t\tthis.#runCtx.state = stateSnapshot.state;\n\t\t\t}\n\t\t\tthis.#runCtx.vars = varsSnapshot;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tstepCtx[DEACTIVATE_STEP]();\n\t\t}\n\t}\n\n\t#toActorQueueMessage<T>(\n\t\tmessage: WorkflowQueueMessage<T>,\n\t): WorkflowQueueMessage<T> & { id: bigint } {\n\t\tlet id: bigint;\n\t\ttry {\n\t\t\tid = BigInt(message.id);\n\t\t} catch {\n\t\t\tthrow new Error(`Invalid queue message id \"${message.id}\"`);\n\t\t}\n\t\treturn {\n\t\t\tid,\n\t\t\tname: message.name,\n\t\t\tbody: message.body,\n\t\t\tcreatedAt: message.createdAt,\n\t\t\t...(message.complete ? { complete: message.complete } : {}),\n\t\t};\n\t}\n\n\t// Runs a step rollback compensation with an active step context. Rollbacks\n\t// intentionally mutate actor state, so their writes are not snapshotted.\n\tasync #runRollback<T>(\n\t\trollback: WorkflowStepRollback<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\toutput: T,\n\t): Promise<void> {\n\t\tconst stepCtx = new WorkflowStepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>(this.#runCtx, () => this.#markGuardTriggered());\n\t\ttry {\n\t\t\tawait rollback(stepCtx, output);\n\t\t} finally {\n\t\t\tstepCtx[DEACTIVATE_STEP]();\n\t\t}\n\t}\n\n\tasync #wrapActive<T>(run: () => Promise<T>): Promise<T> {\n\t\treturn await this.#runCtx.internalKeepAwake(run);\n\t}\n\n\t// Records that a step context was used outside its step. Mirrors the value\n\t// onto actor state and a KV flag so callers can observe the violation.\n\t#markGuardTriggered(): void {\n\t\ttry {\n\t\t\tconst state = this.#runCtx.state as Record<string, unknown>;\n\t\t\tif (\n\t\t\t\tstate &&\n\t\t\t\ttypeof state === \"object\" &&\n\t\t\t\t\"guardTriggered\" in state\n\t\t\t) {\n\t\t\t\t(state as Record<string, unknown>).guardTriggered = true;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore if state is unavailable\n\t\t}\n\n\t\tthis.#runCtx.waitUntil(\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#runCtx.kv.put(WORKFLOW_GUARD_KV_KEY, \"true\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.#runCtx.log.error({\n\t\t\t\t\t\tmsg: \"failed to persist workflow guard flag\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\t}\n\n\t#createChildContext(\n\t\tctx: WorkflowContextInterface,\n\t): WorkflowContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> {\n\t\treturn new WorkflowContext(ctx, this.#runCtx);\n\t}\n}\n\nexport type WorkflowContextOf<AD extends AnyActorDefinition> =\n\tAD extends BaseActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WorkflowContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n\nexport type WorkflowLoopContextOf<AD extends AnyActorDefinition> =\n\tWorkflowContextOf<AD>;\n\nexport type WorkflowBranchContextOf<AD extends AnyActorDefinition> =\n\tWorkflowContextOf<AD>;\n\nexport type WorkflowStepContextOf<AD extends AnyActorDefinition> =\n\tAD extends BaseActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WorkflowStepContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type {\n\tEngineDriver,\n\tKVEntry,\n\tKVWrite,\n\tMessage,\n\tWorkflowMessageDriver,\n} from \"@rivetkit/workflow-engine\";\nimport type { RunContext } from \"@/actor/config\";\nimport type { AnyStaticActorInstance } from \"@/actor/definition\";\nimport { makeWorkflowKey, workflowStoragePrefix } from \"@/actor/keys\";\n\nconst WORKFLOW_STORAGE_PREFIX = workflowStoragePrefix();\n\n// Mirrors the element shape returned by `queueManager.receive`. The actor\n// instance is reached through a loose type here, so the call's result is\n// untyped and the message must be annotated explicitly.\ninterface ReceivedQueueMessage {\n\tid: bigint;\n\tname: string;\n\tbody: unknown;\n\tcreatedAt: number;\n\tcomplete?: (response?: unknown) => Promise<void>;\n}\n\n// `kvListPrefix` returns key/value tuples, but the loose actor type erases that\n// so the tuple destructures need an explicit annotation.\ntype KVEntryTuple = [Uint8Array, Uint8Array];\n\nfunction stripWorkflowKey(prefixed: Uint8Array): Uint8Array {\n\treturn prefixed.slice(WORKFLOW_STORAGE_PREFIX.length);\n}\n\nfunction computeUpperBound(prefix: Uint8Array): Uint8Array | null {\n\tconst upperBound = prefix.slice();\n\tfor (let i = upperBound.length - 1; i >= 0; i--) {\n\t\tif (upperBound[i] !== 0xff) {\n\t\t\tupperBound[i]++;\n\t\t\treturn upperBound.slice(0, i + 1);\n\t\t}\n\t}\n\treturn null;\n}\n\nclass ActorWorkflowMessageDriver implements WorkflowMessageDriver {\n\t#actor: AnyStaticActorInstance;\n\t#runCtx: RunContext<any, any, any, any, any, any, any, any>;\n\n\tconstructor(\n\t\tactor: AnyStaticActorInstance,\n\t\trunCtx: RunContext<any, any, any, any, any, any, any, any>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#runCtx = runCtx;\n\t}\n\n\tasync addMessage(message: Message): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.enqueue(message.name, message.data),\n\t\t);\n\t}\n\n\tasync receiveMessages(opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tconst messages = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.receive(\n\t\t\t\topts.names && opts.names.length > 0\n\t\t\t\t\t? [...opts.names]\n\t\t\t\t\t: undefined,\n\t\t\t\topts.count,\n\t\t\t\t0,\n\t\t\t\tundefined,\n\t\t\t\topts.completable,\n\t\t\t),\n\t\t);\n\t\treturn messages.map((message: ReceivedQueueMessage) => ({\n\t\t\tid: message.id.toString(),\n\t\t\tname: message.name,\n\t\t\tdata: message.body,\n\t\t\tsentAt: message.createdAt,\n\t\t\t...(opts.completable\n\t\t\t\t? {\n\t\t\t\t\t\tcomplete: async (response?: unknown) => {\n\t\t\t\t\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\t\t\t\t\tthis.#actor.queueManager.completeMessage(\n\t\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}));\n\t}\n\n\tasync completeMessage(\n\t\tmessageId: string,\n\t\tresponse?: unknown,\n\t): Promise<void> {\n\t\tlet parsedId: bigint;\n\t\ttry {\n\t\t\tparsedId = BigInt(messageId);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.completeMessageById(parsedId, response),\n\t\t);\n\t}\n}\n\nexport class ActorWorkflowDriver implements EngineDriver {\n\treadonly workerPollInterval = 100;\n\treadonly messageDriver: WorkflowMessageDriver;\n\t#actor: AnyStaticActorInstance;\n\t#runCtx: RunContext<any, any, any, any, any, any, any, any>;\n\n\tconstructor(\n\t\tactor: AnyStaticActorInstance,\n\t\trunCtx: RunContext<any, any, any, any, any, any, any, any>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#runCtx = runCtx;\n\t\tthis.messageDriver = new ActorWorkflowMessageDriver(actor, runCtx);\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tconst [value] = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvBatchGet(this.#actor.id, [\n\t\t\t\tmakeWorkflowKey(key),\n\t\t\t]),\n\t\t);\n\t\treturn value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvBatchPut(this.#actor.id, [\n\t\t\t\t[makeWorkflowKey(key), value],\n\t\t\t]),\n\t\t);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvBatchDelete(this.#actor.id, [\n\t\t\t\tmakeWorkflowKey(key),\n\t\t\t]),\n\t\t);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tconst start = makeWorkflowKey(prefix);\n\t\tconst end = computeUpperBound(start);\n\t\tif (end) {\n\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\tthis.#actor.driver.kvDeleteRange(this.#actor.id, start, end),\n\t\t\t);\n\t\t} else {\n\t\t\tconst entries = await this.#runCtx.internalKeepAwake(\n\t\t\t\tthis.#actor.driver.kvListPrefix(this.#actor.id, start),\n\t\t\t);\n\t\t\tif (entries.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\tthis.#actor.driver.kvBatchDelete(\n\t\t\t\t\tthis.#actor.id,\n\t\t\t\t\tentries.map(([key]: KVEntryTuple) => key),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvDeleteRange(\n\t\t\t\tthis.#actor.id,\n\t\t\t\tmakeWorkflowKey(start),\n\t\t\t\tmakeWorkflowKey(end),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tconst entries = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvListPrefix(\n\t\t\t\tthis.#actor.id,\n\t\t\t\tmakeWorkflowKey(prefix),\n\t\t\t),\n\t\t);\n\t\treturn entries.map(([key, value]: KVEntryTuple) => ({\n\t\t\tkey: stripWorkflowKey(key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tif (writes.length === 0) return;\n\n\t\t// Flush actor state together with workflow state to ensure atomicity.\n\t\t// If the server crashes after workflow flush, actor state must also be persisted.\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tPromise.all([\n\t\t\t\tthis.#actor.driver.kvBatchPut(\n\t\t\t\t\tthis.#actor.id,\n\t\t\t\t\twrites.map(({ key, value }) => [\n\t\t\t\t\t\tmakeWorkflowKey(key),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t]),\n\t\t\t\t),\n\t\t\t\tthis.#actor.stateManager.saveState({\n\t\t\t\t\timmediate: true,\n\t\t\t\t}),\n\t\t\t]),\n\t\t);\n\t}\n\n\tasync setAlarm(_workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.setAlarm(this.#actor, wakeAt),\n\t\t);\n\t}\n\n\tasync clearAlarm(_workflowId: string): Promise<void> {\n\t\t// No dedicated clear alarm support in actor drivers.\n\t\treturn;\n\t}\n\n\twaitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\treturn this.#actor.queueManager.waitForNames(\n\t\t\tmessageNames.length > 0 ? messageNames : undefined,\n\t\t\tabortSignal,\n\t\t);\n\t}\n}\n\nclass NoopWorkflowMessageDriver implements WorkflowMessageDriver {\n\tasync addMessage(_message: Message): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n\n\tasync receiveMessages(_opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n\n\tasync completeMessage(\n\t\t_messageId: string,\n\t\t_response?: unknown,\n\t): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n}\n\nexport class ActorWorkflowControlDriver implements EngineDriver {\n\treadonly workerPollInterval = 100;\n\treadonly messageDriver: WorkflowMessageDriver =\n\t\tnew NoopWorkflowMessageDriver();\n\t#actor: AnyStaticActorInstance;\n\n\tconstructor(actor: AnyStaticActorInstance) {\n\t\tthis.#actor = actor;\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tconst [value] = await this.#actor.driver.kvBatchGet(this.#actor.id, [\n\t\t\tmakeWorkflowKey(key),\n\t\t]);\n\t\treturn value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#actor.driver.kvBatchPut(this.#actor.id, [\n\t\t\t[makeWorkflowKey(key), value],\n\t\t]);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#actor.driver.kvBatchDelete(this.#actor.id, [\n\t\t\tmakeWorkflowKey(key),\n\t\t]);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tconst start = makeWorkflowKey(prefix);\n\t\tconst end = computeUpperBound(start);\n\t\tif (end) {\n\t\t\tawait this.#actor.driver.kvDeleteRange(this.#actor.id, start, end);\n\t\t\treturn;\n\t\t}\n\n\t\tconst entries = await this.#actor.driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tstart,\n\t\t);\n\t\tif (entries.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.#actor.driver.kvBatchDelete(\n\t\t\tthis.#actor.id,\n\t\t\tentries.map(([key]: KVEntryTuple) => key),\n\t\t);\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait this.#actor.driver.kvDeleteRange(\n\t\t\tthis.#actor.id,\n\t\t\tmakeWorkflowKey(start),\n\t\t\tmakeWorkflowKey(end),\n\t\t);\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tconst entries = await this.#actor.driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tmakeWorkflowKey(prefix),\n\t\t);\n\t\treturn entries.map(([key, value]: KVEntryTuple) => ({\n\t\t\tkey: stripWorkflowKey(key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tif (writes.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#actor.driver.kvBatchPut(\n\t\t\tthis.#actor.id,\n\t\t\twrites.map(({ key, value }) => [makeWorkflowKey(key), value]),\n\t\t);\n\t}\n\n\tasync setAlarm(_workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait this.#actor.driver.setAlarm(this.#actor, wakeAt);\n\t}\n\n\tasync clearAlarm(_workflowId: string): Promise<void> {\n\t\treturn;\n\t}\n\n\twaitForMessages(\n\t\t_messageNames: string[],\n\t\t_abortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/workflow/mod.cjs","../../../src/workflow/mod.ts","../../../src/workflow/constants.ts","../../../src/workflow/context.ts","../../../src/workflow/driver.ts"],"names":[],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/workflow/mod.cjs","sourcesContent":[null,"import {\n\tCriticalError,\n\tEntryInProgressError,\n\tHistoryDivergedError,\n\tJoinError,\n\tRaceError,\n\tRollbackCheckpointError,\n\tRollbackError,\n\treplayWorkflowFromStep,\n\ttype RunWorkflowOptions,\n\trunWorkflow,\n\tStepExhaustedError,\n\ttype WorkflowErrorEvent,\n} from \"@rivetkit/workflow-engine\";\nimport invariant from \"invariant\";\nimport type { RunContext } from \"@/actor/config\";\nimport {\n\tACTOR_CONTEXT_INTERNAL_SYMBOL,\n\tRUN_FUNCTION_CONFIG_SYMBOL,\n} from \"@/actor/config\";\nimport type { AnyStaticActorInstance } from \"@/actor/definition\";\nimport { isActorAbortedError, RivetError } from \"@/actor/errors\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"@/actor/schema\";\nimport type { AnyDatabaseProvider } from \"@/common/database/config\";\nimport { stringifyError } from \"@/utils\";\nimport { WorkflowContext } from \"./context\";\nimport { ActorWorkflowControlDriver, ActorWorkflowDriver } from \"./driver\";\nimport { createWorkflowInspectorAdapter } from \"./inspector\";\n\nexport type {\n\tTryBlockCatchKind,\n\tTryBlockConfig,\n\tTryBlockFailure,\n\tTryBlockResult,\n\tTryStepCatchKind,\n\tTryStepConfig,\n\tTryStepFailure,\n\tTryStepResult,\n\tWorkflowError,\n\tWorkflowErrorEvent,\n} from \"@rivetkit/workflow-engine\";\nexport { Loop } from \"@rivetkit/workflow-engine\";\nexport {\n\ttype WorkflowBranchConfig,\n\ttype WorkflowBranchContextOf,\n\tWorkflowContext,\n\ttype WorkflowContextOf,\n\ttype WorkflowLoopConfig,\n\ttype WorkflowLoopContextOf,\n\ttype WorkflowStepConfig,\n\tWorkflowStepContext,\n\ttype WorkflowStepContextOf,\n\ttype WorkflowTryConfig,\n\ttype WorkflowTryStepConfig,\n} from \"./context\";\n\nfunction shouldRethrowWorkflowError(error: unknown): boolean {\n\tif (\n\t\terror instanceof CriticalError ||\n\t\terror instanceof JoinError ||\n\t\terror instanceof RaceError ||\n\t\terror instanceof RollbackError ||\n\t\terror instanceof StepExhaustedError\n\t) {\n\t\treturn false;\n\t}\n\n\tif (\n\t\terror instanceof EntryInProgressError ||\n\t\terror instanceof HistoryDivergedError ||\n\t\terror instanceof RollbackCheckpointError\n\t) {\n\t\treturn true;\n\t}\n\n\treturn true;\n}\n\nfunction workflowReplayInFlightError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"workflow_in_flight\",\n\t\t\"Workflow replay is unavailable while the workflow is currently in flight.\",\n\t\t{\n\t\t\tpublic: true,\n\t\t\tstatusCode: 409,\n\t\t},\n\t);\n}\n\nfunction isWorkflowReplayBlockedByRunningEntry(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\terror.message ===\n\t\t\t\"Cannot replay a workflow while a step is currently running\"\n\t);\n}\n\nexport interface WorkflowOptions<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\tonError?: (\n\t\tctx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tevent: WorkflowErrorEvent,\n\t) => void | Promise<void>;\n}\n\nexport function workflow<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n>(\n\tfn: (\n\t\tctx: WorkflowContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) => Promise<unknown>,\n\toptions: WorkflowOptions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> = {},\n): (\n\tc: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<void> {\n\tconst onError = options.onError;\n\tconst workflowInspectors = new Map<\n\t\tstring,\n\t\tReturnType<typeof createWorkflowInspectorAdapter>\n\t>();\n\n\tfunction getWorkflowInspector(actorId: string) {\n\t\tlet workflowInspector = workflowInspectors.get(actorId);\n\t\tif (!workflowInspector) {\n\t\t\tworkflowInspector = createWorkflowInspectorAdapter();\n\t\t\tworkflowInspectors.set(actorId, workflowInspector);\n\t\t}\n\t\treturn workflowInspector;\n\t}\n\n\tasync function run(\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<void> {\n\t\tconst actor = (\n\t\t\trunCtx as unknown as {\n\t\t\t\t[ACTOR_CONTEXT_INTERNAL_SYMBOL]?: AnyStaticActorInstance;\n\t\t\t}\n\t\t)[ACTOR_CONTEXT_INTERNAL_SYMBOL];\n\t\tinvariant(actor, \"workflow() requires an actor instance\");\n\t\tconst workflowInspector = getWorkflowInspector(actor.id);\n\n\t\tconst driver = new ActorWorkflowDriver(actor, runCtx);\n\t\tconst controlDriver = new ActorWorkflowControlDriver(actor);\n\t\tworkflowInspector.setReplayFromStep(async (entryId) => {\n\t\t\tconst workflowState = await workflowInspector.adapter.getState();\n\t\t\tif (\n\t\t\t\tactor.isRunHandlerActive() ||\n\t\t\t\tworkflowState === \"pending\" ||\n\t\t\t\tworkflowState === \"running\"\n\t\t\t) {\n\t\t\t\tthrow workflowReplayInFlightError();\n\t\t\t}\n\n\t\t\tlet snapshot;\n\t\t\ttry {\n\t\t\t\tsnapshot = await replayWorkflowFromStep(\n\t\t\t\t\tactor.id,\n\t\t\t\t\tcontrolDriver,\n\t\t\t\t\tentryId,\n\t\t\t\t\t{ scheduleAlarm: false },\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isWorkflowReplayBlockedByRunningEntry(error)) {\n\t\t\t\t\tthrow workflowReplayInFlightError();\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tworkflowInspector.update(snapshot);\n\t\t\tawait actor.restartRunHandler();\n\t\t\treturn workflowInspector.adapter.getHistory();\n\t\t});\n\n\t\tconst handle = runWorkflow(\n\t\t\tactor.id,\n\t\t\tasync (ctx) => await fn(new WorkflowContext(ctx, runCtx)),\n\t\t\tundefined,\n\t\t\tdriver,\n\t\t\t{\n\t\t\t\tmode: \"live\",\n\t\t\t\t// The actor logger and the engine's pino logger are runtime\n\t\t\t\t// compatible but not structurally assignable.\n\t\t\t\tlogger: runCtx.log as RunWorkflowOptions[\"logger\"],\n\t\t\t\tonHistoryUpdated: workflowInspector.update,\n\t\t\t\tonError: onError\n\t\t\t\t\t? async (event) => await onError(runCtx, event)\n\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t);\n\t\tworkflowInspector.setGetState(async () => await handle.getState());\n\n\t\tconst onAbort = () => {\n\t\t\thandle.evict();\n\t\t};\n\t\tif (runCtx.abortSignal.aborted) {\n\t\t\tonAbort();\n\t\t} else {\n\t\t\trunCtx.abortSignal.addEventListener(\"abort\", onAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tawait handle.result;\n\t\t} catch (error) {\n\t\t\t// `abortSignal.aborted` is delivered on a separate async hop and\n\t\t\t// races the rejection, so detect the sleep abort structurally too.\n\t\t\tif (runCtx.abortSignal.aborted || isActorAbortedError(error)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (shouldRethrowWorkflowError(error)) {\n\t\t\t\trunCtx.log.error({\n\t\t\t\t\tmsg: \"workflow run failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\trunCtx.log.warn({\n\t\t\t\tmsg: \"workflow failed and will sleep until woken\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t} finally {\n\t\t\trunCtx.abortSignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t}\n\n\tconst runWithConfig = run as typeof run & {\n\t\t[RUN_FUNCTION_CONFIG_SYMBOL]?: {\n\t\t\ticon?: string;\n\t\t\tinspectorFactory?: (actor: unknown) => unknown;\n\t\t\tdisposeInspector?: (actorId: string) => void;\n\t\t};\n\t};\n\trunWithConfig[RUN_FUNCTION_CONFIG_SYMBOL] = {\n\t\ticon: \"diagram-project\",\n\t\t// Drop the per-actor inspector when the actor is destroyed so this map\n\t\t// does not retain one inspector (and its encoded history) per actor id\n\t\t// for the process lifetime.\n\t\tdisposeInspector: (actorId) => {\n\t\t\tworkflowInspectors.delete(actorId);\n\t\t},\n\t\tinspectorFactory: (actor) => {\n\t\t\tconst actorId = resolveWorkflowInspectorActorId(actor);\n\t\t\treturn {\n\t\t\t\tworkflow: actorId\n\t\t\t\t\t? getWorkflowInspector(actorId).adapter\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tgetHistory: () => null,\n\t\t\t\t\t\t\tonHistoryUpdated: () => () => {},\n\t\t\t\t\t\t\treplayFromStep: async () => null,\n\t\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n\n\treturn runWithConfig;\n}\n\nfunction resolveWorkflowInspectorActorId(actor: unknown): string | undefined {\n\tif (typeof actor === \"string\" && actor.length > 0) {\n\t\treturn actor;\n\t}\n\n\tif (!actor || typeof actor !== \"object\") {\n\t\treturn undefined;\n\t}\n\n\tconst candidate = actor as {\n\t\tid?: unknown;\n\t\tactorId?: unknown;\n\t};\n\tif (typeof candidate.id === \"string\" && candidate.id.length > 0) {\n\t\treturn candidate.id;\n\t}\n\tif (typeof candidate.actorId === \"string\" && candidate.actorId.length > 0) {\n\t\treturn candidate.actorId;\n\t}\n\n\treturn undefined;\n}\n","export const WORKFLOW_GUARD_KV_KEY = \"__rivet_actor_workflow_guard_triggered\";\n","import type {\n\tBranchConfig,\n\tBranchOutput,\n\tEntryKindType,\n\tLoopConfig,\n\tLoopResult,\n\tStepConfig,\n\tTryBlockConfig,\n\tTryBlockResult,\n\tTryStepConfig,\n\tTryStepResult,\n\tWorkflowContextInterface,\n\tWorkflowQueueMessage,\n} from \"@rivetkit/workflow-engine\";\nimport type {\n\tQueueFilterName,\n\tQueueNextBatchOptions,\n\tQueueNextOptions,\n\tQueueResultMessageForName,\n} from \"@/actor/config\";\nimport { RAW_STATE_SYMBOL, type RunContext } from \"@/actor/config\";\nimport type {\n\tAnyActorDefinition,\n\tBaseActorDefinition,\n} from \"@/actor/definition\";\nimport type {\n\tEventSchemaConfig,\n\tInferEventArgs,\n\tInferSchemaMap,\n\tQueueSchemaConfig,\n} from \"@/actor/schema\";\nimport type { Client } from \"@/client/client\";\nimport type {\n\tAnyDatabaseProvider,\n\tInferDatabaseClient,\n} from \"@/common/database/config\";\nimport type { Registry } from \"@/registry\";\nimport { WORKFLOW_GUARD_KV_KEY } from \"./constants\";\n\ntype WorkflowActorQueueNextOptions<\n\tTName extends string,\n\tTCompletable extends boolean,\n> = Omit<QueueNextOptions<TName, TCompletable>, \"signal\">;\n\ntype WorkflowActorQueueNextOptionsFallback<TCompletable extends boolean> = Omit<\n\tQueueNextOptions<string, TCompletable>,\n\t\"signal\"\n>;\n\ntype WorkflowActorQueueNextBatchOptions<\n\tTName extends string,\n\tTCompletable extends boolean,\n> = Omit<QueueNextBatchOptions<TName, TCompletable>, \"signal\">;\n\ntype WorkflowActorQueueNextBatchOptionsFallback<TCompletable extends boolean> =\n\tOmit<QueueNextBatchOptions<string, TCompletable>, \"signal\">;\n\n// Step run callbacks receive a WorkflowStepContext, which is the only place\n// actor data (state/db/vars/client) may be touched.\ntype WorkflowStepRun<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tstep: WorkflowStepContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<T>;\n\n// Step rollback callbacks compensate a committed step, so they also run with a\n// WorkflowStepContext to mutate actor data.\ntype WorkflowStepRollback<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tstep: WorkflowStepContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n\toutput: T,\n) => Promise<void>;\n\n// Orchestration callbacks (try/loop/race/join) receive a WorkflowContext,\n// because inside them you sequence further steps rather than touch actor data.\ntype WorkflowContextRun<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tctx: WorkflowContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<T>;\n\nexport type WorkflowStepConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<StepConfig<T>, \"run\" | \"rollback\"> & {\n\trun: WorkflowStepRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\trollback?: WorkflowStepRollback<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowTryStepConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<TryStepConfig<T>, \"run\" | \"rollback\"> & {\n\trun: WorkflowStepRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\trollback?: WorkflowStepRollback<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowTryConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<TryBlockConfig<T>, \"run\"> & {\n\trun: WorkflowContextRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowLoopConfig<\n\tS,\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<LoopConfig<S, T>, \"run\"> & {\n\trun: (\n\t\tctx: WorkflowContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tstate: S,\n\t) => Promise<\n\t\tLoopResult<S, T> | (S extends undefined ? undefined | void : never)\n\t>;\n};\n\nexport type WorkflowBranchConfig<\n\tTOutput,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = {\n\trun: WorkflowContextRun<\n\t\tTOutput,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\n// Marks a step context inactive once its step has finished. Module-private so it\n// never appears on the public surface.\nconst DEACTIVATE_STEP = Symbol(\"workflow.step.deactivate\");\n\n/**\n * The context handed to a workflow step (`step` / `tryStep` callbacks). This is\n * the only scope where actor data (state, vars, db, client) and side effects\n * (broadcast, queue.send) are reachable. It is valid only while its step is\n * executing; using it after the step resolves throws.\n */\nexport class WorkflowStepContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#runCtx: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\t#active = true;\n\t#onGuardViolation: () => void;\n\n\tconstructor(\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tonGuardViolation: () => void,\n\t) {\n\t\tthis.#runCtx = runCtx;\n\t\tthis.#onGuardViolation = onGuardViolation;\n\t}\n\n\t[DEACTIVATE_STEP](): void {\n\t\tthis.#active = false;\n\t}\n\n\t#ensureActive(feature: string): void {\n\t\tif (!this.#active) {\n\t\t\tthis.#onGuardViolation();\n\t\t\tthrow new Error(\n\t\t\t\t`${feature} is only available inside workflow steps`,\n\t\t\t);\n\t\t}\n\t}\n\n\tget actorId(): string {\n\t\treturn this.#runCtx.actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#runCtx.name;\n\t}\n\n\tget key(): string[] {\n\t\treturn this.#runCtx.key;\n\t}\n\n\tget log() {\n\t\treturn this.#runCtx.log;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#runCtx.abortSignal;\n\t}\n\n\tget state(): TState extends never ? never : TState {\n\t\tthis.#ensureActive(\"state\");\n\t\treturn this.#runCtx.state as TState extends never ? never : TState;\n\t}\n\n\tget vars(): TVars extends never ? never : TVars {\n\t\tthis.#ensureActive(\"vars\");\n\t\treturn this.#runCtx.vars as TVars extends never ? never : TVars;\n\t}\n\n\tget db(): TDatabase extends never ? never : InferDatabaseClient<TDatabase> {\n\t\tthis.#ensureActive(\"db\");\n\t\treturn this.#runCtx.db as TDatabase extends never\n\t\t\t? never\n\t\t\t: InferDatabaseClient<TDatabase>;\n\t}\n\n\tclient<R extends Registry<any> = Registry<any>>(): Client<R> {\n\t\tthis.#ensureActive(\"client\");\n\t\treturn this.#runCtx.client<R>();\n\t}\n\n\tbroadcast<K extends keyof TEvents & string>(\n\t\tname: K,\n\t\t...args: InferEventArgs<InferSchemaMap<TEvents>[K]>\n\t): void;\n\tbroadcast(\n\t\tname: keyof TEvents extends never ? string : never,\n\t\t...args: Array<unknown>\n\t): void;\n\tbroadcast(name: string, ...args: Array<unknown>): void {\n\t\tthis.#ensureActive(\"broadcast\");\n\t\tthis.#runCtx.broadcast(\n\t\t\tname as never,\n\t\t\t...(args as unknown[] as never[]),\n\t\t);\n\t}\n\n\tget queue() {\n\t\tconst self = this;\n\t\tfunction send<K extends keyof TQueues & string>(\n\t\t\tname: K,\n\t\t\tbody: InferSchemaMap<TQueues>[K],\n\t\t): Promise<void>;\n\t\tfunction send(\n\t\t\tname: keyof TQueues extends never ? string : never,\n\t\t\tbody: unknown,\n\t\t): Promise<void>;\n\t\tasync function send(name: string, body: unknown): Promise<void> {\n\t\t\tself.#ensureActive(\"queue.send\");\n\t\t\tawait self.#runCtx.queue.send(name as never, body as never);\n\t\t}\n\t\treturn { send };\n\t}\n\n\t/**\n\t * Holds the actor awake for the duration of the provided promise. The actor\n\t * cannot idle-sleep or finalize the sleep grace period until the promise\n\t * settles.\n\t */\n\tkeepAwake<T>(promise: Promise<T>): Promise<T> {\n\t\tthis.#ensureActive(\"keepAwake\");\n\t\treturn this.#runCtx.keepAwake(promise);\n\t}\n\n\t/**\n\t * Registers a promise that the sleep grace period will wait on. Use this for\n\t * best-effort flush/cleanup work that may complete inside the grace window.\n\t */\n\twaitUntil(promise: Promise<void>): void {\n\t\tthis.#ensureActive(\"waitUntil\");\n\t\tthis.#runCtx.waitUntil(promise);\n\t}\n\n\tdestroy(): void {\n\t\tthis.#ensureActive(\"destroy\");\n\t\tthis.#runCtx.destroy();\n\t}\n}\n\n/**\n * The context handed to the workflow function and to orchestration callbacks\n * (`try` / `loop` / `race` / `join`). It exposes the deterministic, replayable\n * workflow primitives (step, sleep, queue waits, control flow). It deliberately\n * does NOT expose actor data; reach `state`, `db`, `vars`, `client`, and\n * `broadcast` through the step context passed to `step` / `tryStep`.\n */\nexport class WorkflowContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#inner: WorkflowContextInterface;\n\t#runCtx: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\n\tconstructor(\n\t\tinner: WorkflowContextInterface,\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) {\n\t\tthis.#inner = inner;\n\t\tthis.#runCtx = runCtx;\n\t}\n\n\tget workflowId(): string {\n\t\treturn this.#inner.workflowId;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#inner.abortSignal;\n\t}\n\n\tget actorId(): string {\n\t\treturn this.#runCtx.actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#runCtx.name;\n\t}\n\n\tget key(): string[] {\n\t\treturn this.#runCtx.key;\n\t}\n\n\tget log() {\n\t\treturn this.#runCtx.log;\n\t}\n\n\tget queue() {\n\t\tconst self = this;\n\t\tfunction next<\n\t\t\tconst TName extends QueueFilterName<TQueues>,\n\t\t\tconst TCompletable extends boolean = false,\n\t\t>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextOptions<TName, TCompletable>,\n\t\t): Promise<QueueResultMessageForName<TQueues, TName, TCompletable>>;\n\t\tfunction next<const TCompletable extends boolean = false>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextOptionsFallback<TCompletable>,\n\t\t): Promise<\n\t\t\tQueueResultMessageForName<\n\t\t\t\tTQueues,\n\t\t\t\tQueueFilterName<TQueues>,\n\t\t\t\tTCompletable\n\t\t\t>\n\t\t>;\n\t\t// The implementation signature stays broad so the schema-typed public\n\t\t// overloads above remain compatible with it.\n\t\tasync function next(name: string, opts?: any): Promise<any> {\n\t\t\tconst message = await self.#inner.queue.next(name, opts);\n\t\t\treturn self.#toActorQueueMessage(message);\n\t\t}\n\n\t\tfunction nextBatch<\n\t\t\tconst TName extends QueueFilterName<TQueues>,\n\t\t\tconst TCompletable extends boolean = false,\n\t\t>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextBatchOptions<TName, TCompletable>,\n\t\t): Promise<\n\t\t\tArray<QueueResultMessageForName<TQueues, TName, TCompletable>>\n\t\t>;\n\t\tfunction nextBatch<const TCompletable extends boolean = false>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextBatchOptionsFallback<TCompletable>,\n\t\t): Promise<\n\t\t\tArray<\n\t\t\t\tQueueResultMessageForName<\n\t\t\t\t\tTQueues,\n\t\t\t\t\tQueueFilterName<TQueues>,\n\t\t\t\t\tTCompletable\n\t\t\t\t>\n\t\t\t>\n\t\t>;\n\t\tasync function nextBatch(name: string, opts?: any): Promise<any> {\n\t\t\tconst messages = await self.#inner.queue.nextBatch(name, opts);\n\t\t\treturn messages.map((message) =>\n\t\t\t\tself.#toActorQueueMessage(message),\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tnext,\n\t\t\tnextBatch,\n\t\t};\n\t}\n\n\tstep<T>(\n\t\tname: string,\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tstep<T>(\n\t\tconfig: WorkflowStepConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tasync step<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowStepConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Step run function missing\");\n\t\t\t}\n\t\t\tconst stepRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.step(nameOrConfig, () => this.#runStep(stepRun)),\n\t\t\t);\n\t\t}\n\t\tconst stepConfig = nameOrConfig;\n\t\tconst rollback = stepConfig.rollback;\n\t\tconst config: StepConfig<T> = {\n\t\t\t...stepConfig,\n\t\t\trun: () => this.#runStep(stepConfig.run),\n\t\t\trollback: rollback\n\t\t\t\t? (_ctx, output) => this.#runRollback(rollback, output)\n\t\t\t\t: undefined,\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.step(config));\n\t}\n\n\ttryStep<T>(\n\t\tname: string,\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>>;\n\ttryStep<T>(\n\t\tconfig: WorkflowTryStepConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>>;\n\tasync tryStep<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowTryStepConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Step run function missing\");\n\t\t\t}\n\t\t\tconst stepRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.tryStep(nameOrConfig, () => this.#runStep(stepRun)),\n\t\t\t);\n\t\t}\n\t\tconst stepConfig = nameOrConfig;\n\t\tconst rollback = stepConfig.rollback;\n\t\tconst config: TryStepConfig<T> = {\n\t\t\t...stepConfig,\n\t\t\trun: () => this.#runStep(stepConfig.run),\n\t\t\trollback: rollback\n\t\t\t\t? (_ctx, output) => this.#runRollback(rollback, output)\n\t\t\t\t: undefined,\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.tryStep(config));\n\t}\n\n\ttry<T>(\n\t\tname: string,\n\t\trun: WorkflowContextRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>>;\n\ttry<T>(\n\t\tconfig: WorkflowTryConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>>;\n\tasync try<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowTryConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowContextRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Try run function missing\");\n\t\t\t}\n\t\t\tconst tryRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.try(nameOrConfig, async (ctx) =>\n\t\t\t\t\ttryRun(this.#createChildContext(ctx)),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst tryConfig = nameOrConfig;\n\t\tconst config: TryBlockConfig<T> = {\n\t\t\t...tryConfig,\n\t\t\trun: async (ctx) => tryConfig.run(this.#createChildContext(ctx)),\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.try(config));\n\t}\n\n\tloop<T>(\n\t\tname: string,\n\t\trun: (\n\t\t\tctx: WorkflowContext<\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>,\n\t\t) => Promise<LoopResult<undefined, T> | undefined | void>,\n\t): Promise<T>;\n\tloop<S, T>(\n\t\tconfig: WorkflowLoopConfig<\n\t\t\tS,\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tasync loop(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowLoopConfig<\n\t\t\t\t\tany,\n\t\t\t\t\tany,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: (\n\t\t\tctx: WorkflowContext<\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>,\n\t\t) => Promise<LoopResult<undefined, any> | undefined | void>,\n\t): Promise<any> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Loop run function missing\");\n\t\t\t}\n\t\t\tconst loopRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.loop(\n\t\t\t\t\tnameOrConfig,\n\t\t\t\t\t// A void return (no explicit Loop result) is undefined at\n\t\t\t\t\t// runtime, which the engine treats as continue.\n\t\t\t\t\tasync (\n\t\t\t\t\t\tctx,\n\t\t\t\t\t): Promise<LoopResult<undefined, any> | undefined> =>\n\t\t\t\t\t\t(await loopRun(this.#createChildContext(ctx))) ??\n\t\t\t\t\t\tundefined,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst loopConfig = nameOrConfig;\n\t\tconst wrapped: LoopConfig<any, any> = {\n\t\t\t...loopConfig,\n\t\t\trun: (async (ctx, state) =>\n\t\t\t\t(await loopConfig.run(this.#createChildContext(ctx), state)) ??\n\t\t\t\tundefined) as LoopConfig<any, any>[\"run\"],\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.loop(wrapped));\n\t}\n\n\tsleep(name: string, durationMs: number): Promise<void> {\n\t\treturn this.#inner.sleep(name, durationMs);\n\t}\n\n\tsleepUntil(name: string, timestampMs: number): Promise<void> {\n\t\treturn this.#inner.sleepUntil(name, timestampMs);\n\t}\n\n\tasync rollbackCheckpoint(name: string): Promise<void> {\n\t\tawait this.#wrapActive(() => this.#inner.rollbackCheckpoint(name));\n\t}\n\n\tasync join<\n\t\tT extends Record<\n\t\t\tstring,\n\t\t\tWorkflowBranchConfig<\n\t\t\t\tunknown,\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>\n\t\t>,\n\t>(\n\t\tname: string,\n\t\tbranches: T,\n\t): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K][\"run\"]>> }>;\n\tasync join<T extends Record<string, BranchConfig<unknown>>>(\n\t\tname: string,\n\t\tbranches: T,\n\t): Promise<{ [K in keyof T]: BranchOutput<T[K]> }>;\n\tasync join(\n\t\tname: string,\n\t\tbranches: Record<string, { run: (ctx: any) => Promise<unknown> }>,\n\t) {\n\t\tconst wrappedBranches = Object.fromEntries(\n\t\t\tObject.entries(branches).map(([key, branch]) => [\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\trun: async (ctx: WorkflowContextInterface) =>\n\t\t\t\t\t\tbranch.run(this.#createChildContext(ctx)),\n\t\t\t\t},\n\t\t\t]),\n\t\t) as Record<string, BranchConfig<unknown>>;\n\t\treturn await this.#wrapActive(() =>\n\t\t\tthis.#inner.join(name, wrappedBranches),\n\t\t);\n\t}\n\n\tasync race<T>(\n\t\tname: string,\n\t\tbranches: Array<{\n\t\t\tname: string;\n\t\t\trun: WorkflowContextRun<\n\t\t\t\tT,\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>;\n\t\t}>,\n\t): Promise<{ winner: string; value: T }> {\n\t\tconst wrappedBranches = branches.map((branch) => ({\n\t\t\tname: branch.name,\n\t\t\trun: (ctx: WorkflowContextInterface) =>\n\t\t\t\tbranch.run(this.#createChildContext(ctx)),\n\t\t}));\n\t\treturn (await this.#wrapActive(() =>\n\t\t\tthis.#inner.race(name, wrappedBranches),\n\t\t)) as { winner: string; value: T };\n\t}\n\n\tasync removed(name: string, originalType: EntryKindType): Promise<void> {\n\t\tawait this.#wrapActive(() => this.#inner.removed(name, originalType));\n\t}\n\n\tisEvicted(): boolean {\n\t\treturn this.#inner.isEvicted();\n\t}\n\n\t// Runs a user step body inside a fresh step context, snapshotting actor\n\t// state/vars so a thrown step rolls back its mutations, and deactivating the\n\t// step context once the body settles so it cannot be used after the step.\n\tasync #runStep<T>(\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T> {\n\t\tconst stepCtx = new WorkflowStepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>(this.#runCtx, () => this.#markGuardTriggered());\n\n\t\tlet stateSnapshot: { state: TState } | null = null;\n\t\ttry {\n\t\t\tstateSnapshot = { state: this.#runCtx[RAW_STATE_SYMBOL]() };\n\t\t} catch (error) {\n\t\t\tthis.#runCtx.log.debug({\n\t\t\t\tmsg: \"failed to get state, likely due to being stateless workflow\",\n\t\t\t\terror,\n\t\t\t});\n\t\t}\n\t\tif (stateSnapshot) {\n\t\t\tstateSnapshot.state = structuredClone(stateSnapshot.state);\n\t\t}\n\t\tconst varsSnapshot = structuredClone(this.#runCtx.vars);\n\n\t\ttry {\n\t\t\treturn await run(stepCtx);\n\t\t} catch (error) {\n\t\t\tif (stateSnapshot) {\n\t\t\t\tthis.#runCtx.state = stateSnapshot.state;\n\t\t\t}\n\t\t\tthis.#runCtx.vars = varsSnapshot;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tstepCtx[DEACTIVATE_STEP]();\n\t\t}\n\t}\n\n\t#toActorQueueMessage<T>(\n\t\tmessage: WorkflowQueueMessage<T>,\n\t): WorkflowQueueMessage<T> & { id: bigint } {\n\t\tlet id: bigint;\n\t\ttry {\n\t\t\tid = BigInt(message.id);\n\t\t} catch {\n\t\t\tthrow new Error(`Invalid queue message id \"${message.id}\"`);\n\t\t}\n\t\treturn {\n\t\t\tid,\n\t\t\tname: message.name,\n\t\t\tbody: message.body,\n\t\t\tcreatedAt: message.createdAt,\n\t\t\t...(message.complete ? { complete: message.complete } : {}),\n\t\t};\n\t}\n\n\t// Runs a step rollback compensation with an active step context. Rollbacks\n\t// intentionally mutate actor state, so their writes are not snapshotted.\n\tasync #runRollback<T>(\n\t\trollback: WorkflowStepRollback<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\toutput: T,\n\t): Promise<void> {\n\t\tconst stepCtx = new WorkflowStepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>(this.#runCtx, () => this.#markGuardTriggered());\n\t\ttry {\n\t\t\tawait rollback(stepCtx, output);\n\t\t} finally {\n\t\t\tstepCtx[DEACTIVATE_STEP]();\n\t\t}\n\t}\n\n\tasync #wrapActive<T>(run: () => Promise<T>): Promise<T> {\n\t\treturn await this.#runCtx.internalKeepAwake(run);\n\t}\n\n\t// Records that a step context was used outside its step. Mirrors the value\n\t// onto actor state and a KV flag so callers can observe the violation.\n\t#markGuardTriggered(): void {\n\t\ttry {\n\t\t\tconst state = this.#runCtx.state as Record<string, unknown>;\n\t\t\tif (\n\t\t\t\tstate &&\n\t\t\t\ttypeof state === \"object\" &&\n\t\t\t\t\"guardTriggered\" in state\n\t\t\t) {\n\t\t\t\t(state as Record<string, unknown>).guardTriggered = true;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore if state is unavailable\n\t\t}\n\n\t\tthis.#runCtx.waitUntil(\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#runCtx.kv.put(WORKFLOW_GUARD_KV_KEY, \"true\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.#runCtx.log.error({\n\t\t\t\t\t\tmsg: \"failed to persist workflow guard flag\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\t}\n\n\t#createChildContext(\n\t\tctx: WorkflowContextInterface,\n\t): WorkflowContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> {\n\t\treturn new WorkflowContext(ctx, this.#runCtx);\n\t}\n}\n\nexport type WorkflowContextOf<AD extends AnyActorDefinition> =\n\tAD extends BaseActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WorkflowContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n\nexport type WorkflowLoopContextOf<AD extends AnyActorDefinition> =\n\tWorkflowContextOf<AD>;\n\nexport type WorkflowBranchContextOf<AD extends AnyActorDefinition> =\n\tWorkflowContextOf<AD>;\n\nexport type WorkflowStepContextOf<AD extends AnyActorDefinition> =\n\tAD extends BaseActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WorkflowStepContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type {\n\tEngineDriver,\n\tKVEntry,\n\tKVWrite,\n\tMessage,\n\tWorkflowMessageDriver,\n} from \"@rivetkit/workflow-engine\";\nimport type { RunContext } from \"@/actor/config\";\nimport type { AnyStaticActorInstance } from \"@/actor/definition\";\nimport { makeWorkflowKey, workflowStoragePrefix } from \"@/actor/keys\";\n\nconst WORKFLOW_STORAGE_PREFIX = workflowStoragePrefix();\n\n// Mirrors the element shape returned by `queueManager.receive`. The actor\n// instance is reached through a loose type here, so the call's result is\n// untyped and the message must be annotated explicitly.\ninterface ReceivedQueueMessage {\n\tid: bigint;\n\tname: string;\n\tbody: unknown;\n\tcreatedAt: number;\n\tcomplete?: (response?: unknown) => Promise<void>;\n}\n\n// `kvListPrefix` returns key/value tuples, but the loose actor type erases that\n// so the tuple destructures need an explicit annotation.\ntype KVEntryTuple = [Uint8Array, Uint8Array];\n\nfunction stripWorkflowKey(prefixed: Uint8Array): Uint8Array {\n\treturn prefixed.slice(WORKFLOW_STORAGE_PREFIX.length);\n}\n\nfunction computeUpperBound(prefix: Uint8Array): Uint8Array | null {\n\tconst upperBound = prefix.slice();\n\tfor (let i = upperBound.length - 1; i >= 0; i--) {\n\t\tif (upperBound[i] !== 0xff) {\n\t\t\tupperBound[i]++;\n\t\t\treturn upperBound.slice(0, i + 1);\n\t\t}\n\t}\n\treturn null;\n}\n\nclass ActorWorkflowMessageDriver implements WorkflowMessageDriver {\n\t#actor: AnyStaticActorInstance;\n\t#runCtx: RunContext<any, any, any, any, any, any, any, any>;\n\n\tconstructor(\n\t\tactor: AnyStaticActorInstance,\n\t\trunCtx: RunContext<any, any, any, any, any, any, any, any>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#runCtx = runCtx;\n\t}\n\n\tasync addMessage(message: Message): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.enqueue(message.name, message.data),\n\t\t);\n\t}\n\n\tasync receiveMessages(opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tconst messages = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.receive(\n\t\t\t\topts.names && opts.names.length > 0\n\t\t\t\t\t? [...opts.names]\n\t\t\t\t\t: undefined,\n\t\t\t\topts.count,\n\t\t\t\t0,\n\t\t\t\tundefined,\n\t\t\t\topts.completable,\n\t\t\t),\n\t\t);\n\t\treturn messages.map((message: ReceivedQueueMessage) => ({\n\t\t\tid: message.id.toString(),\n\t\t\tname: message.name,\n\t\t\tdata: message.body,\n\t\t\tsentAt: message.createdAt,\n\t\t\t...(opts.completable\n\t\t\t\t? {\n\t\t\t\t\t\tcomplete: async (response?: unknown) => {\n\t\t\t\t\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\t\t\t\t\tthis.#actor.queueManager.completeMessage(\n\t\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}));\n\t}\n\n\tasync completeMessage(\n\t\tmessageId: string,\n\t\tresponse?: unknown,\n\t): Promise<void> {\n\t\tlet parsedId: bigint;\n\t\ttry {\n\t\t\tparsedId = BigInt(messageId);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.completeMessageById(parsedId, response),\n\t\t);\n\t}\n}\n\nexport class ActorWorkflowDriver implements EngineDriver {\n\treadonly workerPollInterval = 100;\n\treadonly messageDriver: WorkflowMessageDriver;\n\t#actor: AnyStaticActorInstance;\n\t#runCtx: RunContext<any, any, any, any, any, any, any, any>;\n\n\tconstructor(\n\t\tactor: AnyStaticActorInstance,\n\t\trunCtx: RunContext<any, any, any, any, any, any, any, any>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#runCtx = runCtx;\n\t\tthis.messageDriver = new ActorWorkflowMessageDriver(actor, runCtx);\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tconst [value] = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvBatchGet(this.#actor.id, [\n\t\t\t\tmakeWorkflowKey(key),\n\t\t\t]),\n\t\t);\n\t\treturn value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvBatchPut(this.#actor.id, [\n\t\t\t\t[makeWorkflowKey(key), value],\n\t\t\t]),\n\t\t);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvBatchDelete(this.#actor.id, [\n\t\t\t\tmakeWorkflowKey(key),\n\t\t\t]),\n\t\t);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tconst start = makeWorkflowKey(prefix);\n\t\tconst end = computeUpperBound(start);\n\t\tif (end) {\n\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\tthis.#actor.driver.kvDeleteRange(this.#actor.id, start, end),\n\t\t\t);\n\t\t} else {\n\t\t\tconst entries = await this.#runCtx.internalKeepAwake(\n\t\t\t\tthis.#actor.driver.kvListPrefix(this.#actor.id, start),\n\t\t\t);\n\t\t\tif (entries.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\tthis.#actor.driver.kvBatchDelete(\n\t\t\t\t\tthis.#actor.id,\n\t\t\t\t\tentries.map(([key]: KVEntryTuple) => key),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvDeleteRange(\n\t\t\t\tthis.#actor.id,\n\t\t\t\tmakeWorkflowKey(start),\n\t\t\t\tmakeWorkflowKey(end),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tconst entries = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvListPrefix(\n\t\t\t\tthis.#actor.id,\n\t\t\t\tmakeWorkflowKey(prefix),\n\t\t\t),\n\t\t);\n\t\treturn entries.map(([key, value]: KVEntryTuple) => ({\n\t\t\tkey: stripWorkflowKey(key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tif (writes.length === 0) return;\n\n\t\t// Flush actor state together with workflow state to ensure atomicity.\n\t\t// If the server crashes after workflow flush, actor state must also be persisted.\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tPromise.all([\n\t\t\t\tthis.#actor.driver.kvBatchPut(\n\t\t\t\t\tthis.#actor.id,\n\t\t\t\t\twrites.map(({ key, value }) => [\n\t\t\t\t\t\tmakeWorkflowKey(key),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t]),\n\t\t\t\t),\n\t\t\t\tthis.#actor.stateManager.saveState({\n\t\t\t\t\timmediate: true,\n\t\t\t\t}),\n\t\t\t]),\n\t\t);\n\t}\n\n\tasync setAlarm(_workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.setAlarm(this.#actor, wakeAt),\n\t\t);\n\t}\n\n\tasync clearAlarm(_workflowId: string): Promise<void> {\n\t\t// No dedicated clear alarm support in actor drivers.\n\t\treturn;\n\t}\n\n\twaitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\treturn this.#actor.queueManager.waitForNames(\n\t\t\tmessageNames.length > 0 ? messageNames : undefined,\n\t\t\tabortSignal,\n\t\t);\n\t}\n}\n\nclass NoopWorkflowMessageDriver implements WorkflowMessageDriver {\n\tasync addMessage(_message: Message): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n\n\tasync receiveMessages(_opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n\n\tasync completeMessage(\n\t\t_messageId: string,\n\t\t_response?: unknown,\n\t): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n}\n\nexport class ActorWorkflowControlDriver implements EngineDriver {\n\treadonly workerPollInterval = 100;\n\treadonly messageDriver: WorkflowMessageDriver =\n\t\tnew NoopWorkflowMessageDriver();\n\t#actor: AnyStaticActorInstance;\n\n\tconstructor(actor: AnyStaticActorInstance) {\n\t\tthis.#actor = actor;\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tconst [value] = await this.#actor.driver.kvBatchGet(this.#actor.id, [\n\t\t\tmakeWorkflowKey(key),\n\t\t]);\n\t\treturn value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#actor.driver.kvBatchPut(this.#actor.id, [\n\t\t\t[makeWorkflowKey(key), value],\n\t\t]);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#actor.driver.kvBatchDelete(this.#actor.id, [\n\t\t\tmakeWorkflowKey(key),\n\t\t]);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tconst start = makeWorkflowKey(prefix);\n\t\tconst end = computeUpperBound(start);\n\t\tif (end) {\n\t\t\tawait this.#actor.driver.kvDeleteRange(this.#actor.id, start, end);\n\t\t\treturn;\n\t\t}\n\n\t\tconst entries = await this.#actor.driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tstart,\n\t\t);\n\t\tif (entries.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.#actor.driver.kvBatchDelete(\n\t\t\tthis.#actor.id,\n\t\t\tentries.map(([key]: KVEntryTuple) => key),\n\t\t);\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait this.#actor.driver.kvDeleteRange(\n\t\t\tthis.#actor.id,\n\t\t\tmakeWorkflowKey(start),\n\t\t\tmakeWorkflowKey(end),\n\t\t);\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tconst entries = await this.#actor.driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tmakeWorkflowKey(prefix),\n\t\t);\n\t\treturn entries.map(([key, value]: KVEntryTuple) => ({\n\t\t\tkey: stripWorkflowKey(key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tif (writes.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#actor.driver.kvBatchPut(\n\t\t\tthis.#actor.id,\n\t\t\twrites.map(({ key, value }) => [makeWorkflowKey(key), value]),\n\t\t);\n\t}\n\n\tasync setAlarm(_workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait this.#actor.driver.setAlarm(this.#actor, wakeAt);\n\t}\n\n\tasync clearAlarm(_workflowId: string): Promise<void> {\n\t\treturn;\n\t}\n\n\twaitForMessages(\n\t\t_messageNames: string[],\n\t\t_abortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n}\n"]}
|