rivetkit 2.3.4 → 2.3.5-rc.1

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.
Files changed (161) hide show
  1. package/dist/browser/client.d.ts +157 -9
  2. package/dist/browser/client.js +518 -542
  3. package/dist/browser/client.js.map +1 -1
  4. package/dist/browser/inspector/client.d.ts +101 -2
  5. package/dist/browser/inspector/client.js +1245 -227
  6. package/dist/browser/inspector/client.js.map +1 -1
  7. package/dist/tsup/agent-os/index.cjs +103 -36
  8. package/dist/tsup/agent-os/index.cjs.map +1 -1
  9. package/dist/tsup/agent-os/index.d.cts +159 -11
  10. package/dist/tsup/agent-os/index.d.ts +159 -11
  11. package/dist/tsup/agent-os/index.js +103 -36
  12. package/dist/tsup/agent-os/index.js.map +1 -1
  13. package/dist/tsup/{chunk-7X4M7ZRA.cjs → chunk-4XKED5P5.cjs} +146 -177
  14. package/dist/tsup/chunk-4XKED5P5.cjs.map +1 -0
  15. package/dist/tsup/{chunk-Q7NBMTF3.cjs → chunk-6HQCLWAW.cjs} +384 -4
  16. package/dist/tsup/chunk-6HQCLWAW.cjs.map +1 -0
  17. package/dist/tsup/{chunk-JZ7TWV65.js → chunk-7AFZMFPQ.js} +15 -1
  18. package/dist/tsup/chunk-7AFZMFPQ.js.map +1 -0
  19. package/dist/tsup/{chunk-M7DCRMOZ.js → chunk-B4IZU537.js} +382 -2
  20. package/dist/tsup/chunk-B4IZU537.js.map +1 -0
  21. package/dist/tsup/{chunk-3MHDOUD7.cjs → chunk-G3CCRCTK.cjs} +14 -9
  22. package/dist/tsup/chunk-G3CCRCTK.cjs.map +1 -0
  23. package/dist/tsup/{chunk-CMPFZ724.js → chunk-GAV4PKFT.js} +16 -47
  24. package/dist/tsup/{chunk-CMPFZ724.js.map → chunk-GAV4PKFT.js.map} +1 -1
  25. package/dist/tsup/{chunk-HXUEHHJF.js → chunk-JI6GZ2C2.js} +2 -11
  26. package/dist/tsup/{chunk-HXUEHHJF.js.map → chunk-JI6GZ2C2.js.map} +1 -1
  27. package/dist/tsup/{chunk-3SNFA373.cjs → chunk-M3FCXL3Q.cjs} +3 -3
  28. package/dist/tsup/{chunk-3SNFA373.cjs.map → chunk-M3FCXL3Q.cjs.map} +1 -1
  29. package/dist/tsup/{chunk-GXW3VFJQ.js → chunk-MGTSVSUC.js} +2 -2
  30. package/dist/tsup/{chunk-VE2X4KMG.cjs → chunk-MYWZCDML.cjs} +2 -11
  31. package/dist/tsup/chunk-MYWZCDML.cjs.map +1 -0
  32. package/dist/tsup/{chunk-M5TAM4JV.js → chunk-NIC3QLKL.js} +3 -3
  33. package/dist/tsup/{chunk-H4XOUVGP.js → chunk-P4OGQ4JL.js} +5 -7
  34. package/dist/tsup/{chunk-H4XOUVGP.js.map → chunk-P4OGQ4JL.js.map} +1 -1
  35. package/dist/tsup/{chunk-EOSGY3DC.js → chunk-PAG6G46L.js} +2 -2
  36. package/dist/tsup/{chunk-XIX5DOZN.js → chunk-SHBE77IT.js} +14 -9
  37. package/dist/tsup/chunk-SHBE77IT.js.map +1 -0
  38. package/dist/tsup/{chunk-SRT2DPN3.cjs → chunk-TNIWIUNV.cjs} +9 -11
  39. package/dist/tsup/chunk-TNIWIUNV.cjs.map +1 -0
  40. package/dist/tsup/{chunk-UPOCJPEQ.cjs → chunk-TR5NLR5V.cjs} +4 -4
  41. package/dist/tsup/{chunk-UPOCJPEQ.cjs.map → chunk-TR5NLR5V.cjs.map} +1 -1
  42. package/dist/tsup/{chunk-ZA7FLHKH.cjs → chunk-UEULFXUI.cjs} +16 -2
  43. package/dist/tsup/chunk-UEULFXUI.cjs.map +1 -0
  44. package/dist/tsup/{chunk-T4MURX4P.cjs → chunk-UJ2FQY63.cjs} +7 -7
  45. package/dist/tsup/{chunk-T4MURX4P.cjs.map → chunk-UJ2FQY63.cjs.map} +1 -1
  46. package/dist/tsup/client/mod.cjs +7 -8
  47. package/dist/tsup/client/mod.cjs.map +1 -1
  48. package/dist/tsup/client/mod.d.cts +5 -4
  49. package/dist/tsup/client/mod.d.ts +5 -4
  50. package/dist/tsup/client/mod.js +6 -7
  51. package/dist/tsup/common/log.cjs +2 -2
  52. package/dist/tsup/common/log.js +1 -1
  53. package/dist/tsup/common/websocket.cjs +3 -3
  54. package/dist/tsup/common/websocket.js +2 -2
  55. package/dist/tsup/{config-D49x8NpL.d.cts → config-BxOimoGX.d.cts} +16 -0
  56. package/dist/tsup/{config-D49x8NpL.d.ts → config-BxOimoGX.d.ts} +16 -0
  57. package/dist/tsup/{config-ZkIsRFsN.d.ts → config-BzdqbLAP.d.ts} +164 -27
  58. package/dist/tsup/{config-BfBhjEbk.d.cts → config-CPPEwn_e.d.cts} +164 -27
  59. package/dist/tsup/{context-sZ9GlaBK.d.cts → context-DSA9gFXB.d.cts} +2 -2
  60. package/dist/tsup/{context-B7-84u9K.d.ts → context-wWv-K2K_.d.ts} +2 -2
  61. package/dist/tsup/db/drizzle.cjs +120 -68
  62. package/dist/tsup/db/drizzle.cjs.map +1 -1
  63. package/dist/tsup/db/drizzle.d.cts +8 -3
  64. package/dist/tsup/db/drizzle.d.ts +8 -3
  65. package/dist/tsup/db/drizzle.js +120 -68
  66. package/dist/tsup/db/drizzle.js.map +1 -1
  67. package/dist/tsup/db/mod.cjs +74 -22
  68. package/dist/tsup/db/mod.cjs.map +1 -1
  69. package/dist/tsup/db/mod.d.cts +4 -3
  70. package/dist/tsup/db/mod.d.ts +4 -3
  71. package/dist/tsup/db/mod.js +74 -22
  72. package/dist/tsup/db/mod.js.map +1 -1
  73. package/dist/tsup/dynamic/mod.cjs +2 -2
  74. package/dist/tsup/dynamic/mod.d.cts +3 -3
  75. package/dist/tsup/dynamic/mod.d.ts +3 -3
  76. package/dist/tsup/dynamic/mod.js +1 -1
  77. package/dist/tsup/inspector/mod.cjs +4 -5
  78. package/dist/tsup/inspector/mod.cjs.map +1 -1
  79. package/dist/tsup/inspector/mod.js +3 -4
  80. package/dist/tsup/inspector/mod.js.map +1 -1
  81. package/dist/tsup/inspector-tab/mod.cjs +2 -2
  82. package/dist/tsup/inspector-tab/mod.cjs.map +1 -1
  83. package/dist/tsup/inspector-tab/mod.d.cts +5 -5
  84. package/dist/tsup/inspector-tab/mod.d.ts +5 -5
  85. package/dist/tsup/inspector-tab/mod.js +1 -1
  86. package/dist/tsup/inspector-tab/mod.js.map +1 -1
  87. package/dist/tsup/mod.cjs +605 -158
  88. package/dist/tsup/mod.cjs.map +1 -1
  89. package/dist/tsup/mod.d.cts +5 -5
  90. package/dist/tsup/mod.d.ts +5 -5
  91. package/dist/tsup/mod.js +528 -81
  92. package/dist/tsup/mod.js.map +1 -1
  93. package/dist/tsup/test/mod.cjs +10 -11
  94. package/dist/tsup/test/mod.cjs.map +1 -1
  95. package/dist/tsup/test/mod.d.cts +3 -3
  96. package/dist/tsup/test/mod.d.ts +3 -3
  97. package/dist/tsup/test/mod.js +6 -7
  98. package/dist/tsup/test/mod.js.map +1 -1
  99. package/dist/tsup/utils-CV0akuDD.d.ts +162 -0
  100. package/dist/tsup/utils-DQDCphrl.d.cts +162 -0
  101. package/dist/tsup/utils.cjs +6 -2
  102. package/dist/tsup/utils.cjs.map +1 -1
  103. package/dist/tsup/utils.d.cts +3 -146
  104. package/dist/tsup/utils.d.ts +3 -146
  105. package/dist/tsup/utils.js +5 -1
  106. package/dist/tsup/workflow/mod.cjs +198 -151
  107. package/dist/tsup/workflow/mod.cjs.map +1 -1
  108. package/dist/tsup/workflow/mod.d.cts +5 -5
  109. package/dist/tsup/workflow/mod.d.ts +5 -5
  110. package/dist/tsup/workflow/mod.js +187 -140
  111. package/dist/tsup/workflow/mod.js.map +1 -1
  112. package/package.json +8 -8
  113. package/src/actor/config.test.ts +14 -0
  114. package/src/actor/config.ts +104 -16
  115. package/src/actor/definition.ts +18 -7
  116. package/src/agent-os/actor/index.ts +2 -2
  117. package/src/common/bare/generated/actor-runtime-socket-protocol/v1.ts +848 -0
  118. package/src/common/bare/generated/inspector/v6.ts +1367 -0
  119. package/src/common/database/config.ts +24 -0
  120. package/src/common/database/mod.test.ts +148 -59
  121. package/src/common/database/mod.ts +93 -23
  122. package/src/common/database/native-database.test.ts +9 -0
  123. package/src/common/database/native-database.ts +151 -0
  124. package/src/common/database/shared.ts +15 -0
  125. package/src/common/encoding.ts +28 -21
  126. package/src/db/drizzle.test.ts +157 -0
  127. package/src/db/drizzle.ts +170 -79
  128. package/src/dynamic/isolate-runtime.ts +0 -2
  129. package/src/engine-client/driver.ts +0 -15
  130. package/src/engine-client/mod.ts +0 -41
  131. package/src/inspector/client.browser.ts +69 -8
  132. package/src/inspector-tab/mod.ts +1 -0
  133. package/src/registry/config/index.ts +1 -35
  134. package/src/registry/napi-runtime.ts +204 -16
  135. package/src/registry/native.ts +200 -30
  136. package/src/registry/runtime.ts +146 -3
  137. package/src/registry/wasm-runtime.ts +217 -6
  138. package/src/utils.ts +3 -0
  139. package/src/workflow/context.ts +5 -27
  140. package/src/workflow/driver.test.ts +62 -0
  141. package/src/workflow/driver.ts +231 -113
  142. package/src/workflow/mod.ts +3 -3
  143. package/dist/tsup/chunk-3MHDOUD7.cjs.map +0 -1
  144. package/dist/tsup/chunk-7X4M7ZRA.cjs.map +0 -1
  145. package/dist/tsup/chunk-JZ7TWV65.js.map +0 -1
  146. package/dist/tsup/chunk-M7DCRMOZ.js.map +0 -1
  147. package/dist/tsup/chunk-Q7NBMTF3.cjs.map +0 -1
  148. package/dist/tsup/chunk-SRT2DPN3.cjs.map +0 -1
  149. package/dist/tsup/chunk-VE2X4KMG.cjs.map +0 -1
  150. package/dist/tsup/chunk-W6WPKZ6I.js +0 -382
  151. package/dist/tsup/chunk-W6WPKZ6I.js.map +0 -1
  152. package/dist/tsup/chunk-XIX5DOZN.js.map +0 -1
  153. package/dist/tsup/chunk-Z7PSQWMC.cjs +0 -382
  154. package/dist/tsup/chunk-Z7PSQWMC.cjs.map +0 -1
  155. package/dist/tsup/chunk-ZA7FLHKH.cjs.map +0 -1
  156. package/src/actor/driver.ts +0 -141
  157. package/src/actor/instance/mod.ts +0 -2484
  158. package/src/drivers/engine/actor-driver.ts +0 -2473
  159. /package/dist/tsup/{chunk-GXW3VFJQ.js.map → chunk-MGTSVSUC.js.map} +0 -0
  160. /package/dist/tsup/{chunk-M5TAM4JV.js.map → chunk-NIC3QLKL.js.map} +0 -0
  161. /package/dist/tsup/{chunk-EOSGY3DC.js.map → chunk-PAG6G46L.js.map} +0 -0
@@ -8,8 +8,14 @@ import type {
8
8
  import type { RunContext } from "@/actor/config";
9
9
  import type { AnyStaticActorInstance } from "@/actor/definition";
10
10
  import { makeWorkflowKey, workflowStoragePrefix } from "@/actor/keys";
11
+ import type { SqliteDatabase } from "@/common/database/config";
11
12
 
12
13
  const WORKFLOW_STORAGE_PREFIX = workflowStoragePrefix();
14
+ // Keep workflow flushes below depot's 320-dirty-page commit ceiling. The
15
+ // former actor-KV transport allowed 976 KiB batches; SQLite also dirties table
16
+ // and index pages, so it needs the same conservative budget as core imports.
17
+ const WORKFLOW_SQLITE_MAX_BATCH_ROWS = 128;
18
+ const WORKFLOW_SQLITE_MAX_BATCH_BYTES = 512 * 1024;
13
19
 
14
20
  // Mirrors the element shape returned by `queueManager.receive`. The actor
15
21
  // instance is reached through a loose type here, so the call's result is
@@ -22,8 +28,6 @@ interface ReceivedQueueMessage {
22
28
  complete?: (response?: unknown) => Promise<void>;
23
29
  }
24
30
 
25
- // `kvListPrefix` returns key/value tuples, but the loose actor type erases that
26
- // so the tuple destructures need an explicit annotation.
27
31
  type KVEntryTuple = [Uint8Array, Uint8Array];
28
32
 
29
33
  function stripWorkflowKey(prefixed: Uint8Array): Uint8Array {
@@ -41,6 +45,206 @@ function computeUpperBound(prefix: Uint8Array): Uint8Array | null {
41
45
  return null;
42
46
  }
43
47
 
48
+ function normalizeSqlBlob(value: unknown): Uint8Array {
49
+ if (value instanceof Uint8Array) {
50
+ return value;
51
+ }
52
+ if (value instanceof ArrayBuffer) {
53
+ return new Uint8Array(value);
54
+ }
55
+ if (ArrayBuffer.isView(value)) {
56
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
57
+ }
58
+ if (Array.isArray(value)) {
59
+ const bytes = new Uint8Array(value.length);
60
+ for (const [i, item] of value.entries()) {
61
+ if (!Number.isInteger(item) || item < 0 || item > 255) {
62
+ throw new Error("workflow sqlite value was not a byte array");
63
+ }
64
+ bytes[i] = item;
65
+ }
66
+ return bytes;
67
+ }
68
+ throw new Error("workflow sqlite value was not a blob");
69
+ }
70
+
71
+ function runtimeSqlFromContext(
72
+ runCtx?: RunContext<any, any, any, any, any, any, any, any>,
73
+ ): SqliteDatabase | undefined {
74
+ const sql = (runCtx as unknown as { sql?: unknown } | undefined)?.sql;
75
+ if (
76
+ sql &&
77
+ typeof sql === "object" &&
78
+ "query" in sql &&
79
+ "execute" in sql &&
80
+ "executeBatch" in sql &&
81
+ "run" in sql
82
+ ) {
83
+ return sql as SqliteDatabase;
84
+ }
85
+ return undefined;
86
+ }
87
+
88
+ type WorkflowSqliteDatabase = SqliteDatabase &
89
+ Required<Pick<SqliteDatabase, "executeBatch">>;
90
+
91
+ class WorkflowStorage {
92
+ #sql: WorkflowSqliteDatabase;
93
+
94
+ constructor(sql?: SqliteDatabase) {
95
+ if (!sql) {
96
+ throw new Error(
97
+ "workflow storage requires embedded SQLite; actor KV workflow storage is no longer supported",
98
+ );
99
+ }
100
+ if (!sql.executeBatch) {
101
+ throw new Error(
102
+ "workflow storage requires a SQLite database with executeBatch support",
103
+ );
104
+ }
105
+ this.#sql = sql as WorkflowSqliteDatabase;
106
+ }
107
+
108
+ async get(key: Uint8Array): Promise<Uint8Array | null> {
109
+ const prefixed = makeWorkflowKey(key);
110
+ const result = await this.#sql.query(
111
+ "SELECT value FROM _rivet_wf_kv WHERE key = ?",
112
+ [prefixed],
113
+ );
114
+ return result.rows[0]?.[0] == null
115
+ ? null
116
+ : normalizeSqlBlob(result.rows[0][0]);
117
+ }
118
+
119
+ async set(key: Uint8Array, value: Uint8Array): Promise<void> {
120
+ await this.batch([{ key, value }]);
121
+ }
122
+
123
+ async delete(key: Uint8Array): Promise<void> {
124
+ const prefixed = makeWorkflowKey(key);
125
+ await this.#sql.run("DELETE FROM _rivet_wf_kv WHERE key = ?", [
126
+ prefixed,
127
+ ]);
128
+ }
129
+
130
+ async deletePrefix(prefix: Uint8Array): Promise<void> {
131
+ const start = makeWorkflowKey(prefix);
132
+ const end = computeUpperBound(start);
133
+ if (end) {
134
+ await this.#sql.run(
135
+ "DELETE FROM _rivet_wf_kv WHERE key >= ? AND key < ?",
136
+ [start, end],
137
+ );
138
+ return;
139
+ }
140
+ const entries = await this.listRaw(start);
141
+ await this.deleteRawKeys(
142
+ entries
143
+ .filter(([key]) => keyStartsWith(key, start))
144
+ .map(([key]) => key),
145
+ );
146
+ }
147
+
148
+ async deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {
149
+ const prefixedStart = makeWorkflowKey(start);
150
+ const prefixedEnd = makeWorkflowKey(end);
151
+ await this.#sql.run(
152
+ "DELETE FROM _rivet_wf_kv WHERE key >= ? AND key < ?",
153
+ [prefixedStart, prefixedEnd],
154
+ );
155
+ }
156
+
157
+ async list(prefix: Uint8Array): Promise<KVEntry[]> {
158
+ const prefixed = makeWorkflowKey(prefix);
159
+ const entries = await this.listRaw(prefixed);
160
+ return entries
161
+ .filter(([key]) => keyStartsWith(key, prefixed))
162
+ .map(([key, value]: KVEntryTuple) => ({
163
+ key: stripWorkflowKey(key),
164
+ value,
165
+ }));
166
+ }
167
+
168
+ async batch(writes: KVWrite[]): Promise<void> {
169
+ if (writes.length === 0) return;
170
+ for (const chunk of chunkWorkflowWrites(writes)) {
171
+ await this.#sql.executeBatch(
172
+ chunk.map(({ key, value }) => ({
173
+ sql: "INSERT INTO _rivet_wf_kv (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value",
174
+ params: [makeWorkflowKey(key), value],
175
+ })),
176
+ );
177
+ }
178
+ }
179
+
180
+ async listRaw(prefix: Uint8Array): Promise<KVEntryTuple[]> {
181
+ const end = computeUpperBound(prefix);
182
+ const result = end
183
+ ? await this.#sql.query(
184
+ "SELECT key, value FROM _rivet_wf_kv WHERE key >= ? AND key < ? ORDER BY key ASC",
185
+ [prefix, end],
186
+ )
187
+ : await this.#sql.query(
188
+ "SELECT key, value FROM _rivet_wf_kv WHERE key >= ? ORDER BY key ASC",
189
+ [prefix],
190
+ );
191
+ return result.rows.map((row) => [
192
+ normalizeSqlBlob(row[0]),
193
+ normalizeSqlBlob(row[1]),
194
+ ]);
195
+ }
196
+
197
+ async deleteRawKeys(keys: Uint8Array[]): Promise<void> {
198
+ for (
199
+ let start = 0;
200
+ start < keys.length;
201
+ start += WORKFLOW_SQLITE_MAX_BATCH_ROWS
202
+ ) {
203
+ await this.#sql.executeBatch(
204
+ keys
205
+ .slice(start, start + WORKFLOW_SQLITE_MAX_BATCH_ROWS)
206
+ .map((key) => ({
207
+ sql: "DELETE FROM _rivet_wf_kv WHERE key = ?",
208
+ params: [key],
209
+ })),
210
+ );
211
+ }
212
+ }
213
+ }
214
+
215
+ export function chunkWorkflowWrites(writes: KVWrite[]): KVWrite[][] {
216
+ const chunks: KVWrite[][] = [];
217
+ let chunk: KVWrite[] = [];
218
+ let chunkBytes = 0;
219
+ for (const write of writes) {
220
+ const writeBytes =
221
+ WORKFLOW_STORAGE_PREFIX.length +
222
+ write.key.length +
223
+ write.value.length;
224
+ if (
225
+ chunk.length > 0 &&
226
+ (chunk.length >= WORKFLOW_SQLITE_MAX_BATCH_ROWS ||
227
+ chunkBytes + writeBytes > WORKFLOW_SQLITE_MAX_BATCH_BYTES)
228
+ ) {
229
+ chunks.push(chunk);
230
+ chunk = [];
231
+ chunkBytes = 0;
232
+ }
233
+ chunk.push(write);
234
+ chunkBytes += writeBytes;
235
+ }
236
+ if (chunk.length > 0) chunks.push(chunk);
237
+ return chunks;
238
+ }
239
+
240
+ function keyStartsWith(key: Uint8Array, prefix: Uint8Array): boolean {
241
+ if (key.length < prefix.length) return false;
242
+ for (let i = 0; i < prefix.length; i++) {
243
+ if (key[i] !== prefix[i]) return false;
244
+ }
245
+ return true;
246
+ }
247
+
44
248
  class ActorWorkflowMessageDriver implements WorkflowMessageDriver {
45
249
  #actor: AnyStaticActorInstance;
46
250
  #runCtx: RunContext<any, any, any, any, any, any, any, any>;
@@ -113,10 +317,12 @@ class ActorWorkflowMessageDriver implements WorkflowMessageDriver {
113
317
  }
114
318
 
115
319
  export class ActorWorkflowDriver implements EngineDriver {
320
+ readonly atomicBatch = true;
116
321
  readonly workerPollInterval = 100;
117
322
  readonly messageDriver: WorkflowMessageDriver;
118
323
  #actor: AnyStaticActorInstance;
119
324
  #runCtx: RunContext<any, any, any, any, any, any, any, any>;
325
+ #storage: WorkflowStorage;
120
326
 
121
327
  constructor(
122
328
  actor: AnyStaticActorInstance,
@@ -125,97 +331,42 @@ export class ActorWorkflowDriver implements EngineDriver {
125
331
  this.#actor = actor;
126
332
  this.#runCtx = runCtx;
127
333
  this.messageDriver = new ActorWorkflowMessageDriver(actor, runCtx);
334
+ this.#storage = new WorkflowStorage(runtimeSqlFromContext(runCtx));
128
335
  }
129
336
 
130
337
  async get(key: Uint8Array): Promise<Uint8Array | null> {
131
- const [value] = await this.#runCtx.internalKeepAwake(
132
- this.#actor.driver.kvBatchGet(this.#actor.id, [
133
- makeWorkflowKey(key),
134
- ]),
135
- );
136
- return value ?? null;
338
+ return await this.#runCtx.internalKeepAwake(this.#storage.get(key));
137
339
  }
138
340
 
139
341
  async set(key: Uint8Array, value: Uint8Array): Promise<void> {
140
- await this.#runCtx.internalKeepAwake(
141
- this.#actor.driver.kvBatchPut(this.#actor.id, [
142
- [makeWorkflowKey(key), value],
143
- ]),
144
- );
342
+ await this.#runCtx.internalKeepAwake(this.#storage.set(key, value));
145
343
  }
146
344
 
147
345
  async delete(key: Uint8Array): Promise<void> {
148
- await this.#runCtx.internalKeepAwake(
149
- this.#actor.driver.kvBatchDelete(this.#actor.id, [
150
- makeWorkflowKey(key),
151
- ]),
152
- );
346
+ await this.#runCtx.internalKeepAwake(this.#storage.delete(key));
153
347
  }
154
348
 
155
349
  async deletePrefix(prefix: Uint8Array): Promise<void> {
156
- const start = makeWorkflowKey(prefix);
157
- const end = computeUpperBound(start);
158
- if (end) {
159
- await this.#runCtx.internalKeepAwake(
160
- this.#actor.driver.kvDeleteRange(this.#actor.id, start, end),
161
- );
162
- } else {
163
- const entries = await this.#runCtx.internalKeepAwake(
164
- this.#actor.driver.kvListPrefix(this.#actor.id, start),
165
- );
166
- if (entries.length === 0) {
167
- return;
168
- }
169
- await this.#runCtx.internalKeepAwake(
170
- this.#actor.driver.kvBatchDelete(
171
- this.#actor.id,
172
- entries.map(([key]: KVEntryTuple) => key),
173
- ),
174
- );
175
- }
350
+ await this.#runCtx.internalKeepAwake(
351
+ this.#storage.deletePrefix(prefix),
352
+ );
176
353
  }
177
354
 
178
355
  async deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {
179
356
  await this.#runCtx.internalKeepAwake(
180
- this.#actor.driver.kvDeleteRange(
181
- this.#actor.id,
182
- makeWorkflowKey(start),
183
- makeWorkflowKey(end),
184
- ),
357
+ this.#storage.deleteRange(start, end),
185
358
  );
186
359
  }
187
360
 
188
361
  async list(prefix: Uint8Array): Promise<KVEntry[]> {
189
- const entries = await this.#runCtx.internalKeepAwake(
190
- this.#actor.driver.kvListPrefix(
191
- this.#actor.id,
192
- makeWorkflowKey(prefix),
193
- ),
194
- );
195
- return entries.map(([key, value]: KVEntryTuple) => ({
196
- key: stripWorkflowKey(key),
197
- value,
198
- }));
362
+ return await this.#runCtx.internalKeepAwake(this.#storage.list(prefix));
199
363
  }
200
364
 
201
365
  async batch(writes: KVWrite[]): Promise<void> {
202
366
  if (writes.length === 0) return;
203
367
 
204
- // Flush actor state together with workflow state to ensure atomicity.
205
- // If the server crashes after workflow flush, actor state must also be persisted.
206
368
  await this.#runCtx.internalKeepAwake(
207
- Promise.all([
208
- this.#actor.driver.kvBatchPut(
209
- this.#actor.id,
210
- writes.map(({ key, value }) => [
211
- makeWorkflowKey(key),
212
- value,
213
- ]),
214
- ),
215
- this.#actor.stateManager.saveState({
216
- immediate: true,
217
- }),
218
- ]),
369
+ this.#actor.stateManager.saveStateAndWorkflowBatch(writes),
219
370
  );
220
371
  }
221
372
 
@@ -267,68 +418,38 @@ export class ActorWorkflowControlDriver implements EngineDriver {
267
418
  readonly messageDriver: WorkflowMessageDriver =
268
419
  new NoopWorkflowMessageDriver();
269
420
  #actor: AnyStaticActorInstance;
421
+ #storage: WorkflowStorage;
270
422
 
271
- constructor(actor: AnyStaticActorInstance) {
423
+ constructor(
424
+ actor: AnyStaticActorInstance,
425
+ runCtx?: RunContext<any, any, any, any, any, any, any, any>,
426
+ ) {
272
427
  this.#actor = actor;
428
+ this.#storage = new WorkflowStorage(runtimeSqlFromContext(runCtx));
273
429
  }
274
430
 
275
431
  async get(key: Uint8Array): Promise<Uint8Array | null> {
276
- const [value] = await this.#actor.driver.kvBatchGet(this.#actor.id, [
277
- makeWorkflowKey(key),
278
- ]);
279
- return value ?? null;
432
+ return await this.#storage.get(key);
280
433
  }
281
434
 
282
435
  async set(key: Uint8Array, value: Uint8Array): Promise<void> {
283
- await this.#actor.driver.kvBatchPut(this.#actor.id, [
284
- [makeWorkflowKey(key), value],
285
- ]);
436
+ await this.#storage.set(key, value);
286
437
  }
287
438
 
288
439
  async delete(key: Uint8Array): Promise<void> {
289
- await this.#actor.driver.kvBatchDelete(this.#actor.id, [
290
- makeWorkflowKey(key),
291
- ]);
440
+ await this.#storage.delete(key);
292
441
  }
293
442
 
294
443
  async deletePrefix(prefix: Uint8Array): Promise<void> {
295
- const start = makeWorkflowKey(prefix);
296
- const end = computeUpperBound(start);
297
- if (end) {
298
- await this.#actor.driver.kvDeleteRange(this.#actor.id, start, end);
299
- return;
300
- }
301
-
302
- const entries = await this.#actor.driver.kvListPrefix(
303
- this.#actor.id,
304
- start,
305
- );
306
- if (entries.length === 0) {
307
- return;
308
- }
309
- await this.#actor.driver.kvBatchDelete(
310
- this.#actor.id,
311
- entries.map(([key]: KVEntryTuple) => key),
312
- );
444
+ await this.#storage.deletePrefix(prefix);
313
445
  }
314
446
 
315
447
  async deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {
316
- await this.#actor.driver.kvDeleteRange(
317
- this.#actor.id,
318
- makeWorkflowKey(start),
319
- makeWorkflowKey(end),
320
- );
448
+ await this.#storage.deleteRange(start, end);
321
449
  }
322
450
 
323
451
  async list(prefix: Uint8Array): Promise<KVEntry[]> {
324
- const entries = await this.#actor.driver.kvListPrefix(
325
- this.#actor.id,
326
- makeWorkflowKey(prefix),
327
- );
328
- return entries.map(([key, value]: KVEntryTuple) => ({
329
- key: stripWorkflowKey(key),
330
- value,
331
- }));
452
+ return await this.#storage.list(prefix);
332
453
  }
333
454
 
334
455
  async batch(writes: KVWrite[]): Promise<void> {
@@ -336,10 +457,7 @@ export class ActorWorkflowControlDriver implements EngineDriver {
336
457
  return;
337
458
  }
338
459
 
339
- await this.#actor.driver.kvBatchPut(
340
- this.#actor.id,
341
- writes.map(({ key, value }) => [makeWorkflowKey(key), value]),
342
- );
460
+ await this.#storage.batch(writes);
343
461
  }
344
462
 
345
463
  async setAlarm(_workflowId: string, wakeAt: number): Promise<void> {
@@ -6,8 +6,8 @@ import {
6
6
  RaceError,
7
7
  RollbackCheckpointError,
8
8
  RollbackError,
9
- replayWorkflowFromStep,
10
9
  type RunWorkflowOptions,
10
+ replayWorkflowFromStep,
11
11
  runWorkflow,
12
12
  StepExhaustedError,
13
13
  type WorkflowErrorEvent,
@@ -201,7 +201,7 @@ export function workflow<
201
201
  const workflowInspector = getWorkflowInspector(actor.id);
202
202
 
203
203
  const driver = new ActorWorkflowDriver(actor, runCtx);
204
- const controlDriver = new ActorWorkflowControlDriver(actor);
204
+ const controlDriver = new ActorWorkflowControlDriver(actor, runCtx);
205
205
  workflowInspector.setReplayFromStep(async (entryId) => {
206
206
  const workflowState = await workflowInspector.adapter.getState();
207
207
  if (
@@ -212,7 +212,7 @@ export function workflow<
212
212
  throw workflowReplayInFlightError();
213
213
  }
214
214
 
215
- let snapshot;
215
+ let snapshot: Awaited<ReturnType<typeof replayWorkflowFromStep>>;
216
216
  try {
217
217
  snapshot = await replayWorkflowFromStep(
218
218
  actor.id,
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-3MHDOUD7.cjs","../../src/actor/config.ts"],"names":[],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-3MHDOUD7.cjs","sourcesContent":[null,"import { z } from \"zod/v4\";\nimport type { Client } from \"@/client/client\";\nimport type {\n\tAnyDatabaseProvider,\n\tInferDatabaseClient,\n} from \"@/common/database/config\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport type { Registry } from \"@/registry\";\nimport type { BaseActorDefinition } from \"./definition\";\nimport type {\n\tEventSchemaConfig,\n\tInferQueueCompleteMap,\n\tInferSchemaMap,\n\tPrimitiveSchema,\n\tQueueSchemaConfig,\n} from \"./schema\";\n\nexport const DEFAULT_SLEEP_GRACE_PERIOD = 15_000;\n\nexport const ACTOR_CONTEXT_INTERNAL_SYMBOL = Symbol(\n\t\"rivetkit.actor_context_internal\",\n);\nexport const RAW_STATE_SYMBOL = Symbol(\"rivetkit.raw_state\");\nexport const CONN_DRIVER_SYMBOL = Symbol(\"rivetkit.conn_driver\");\nexport const CONN_STATE_MANAGER_SYMBOL = Symbol(\"rivetkit.conn_state_manager\");\n\nexport interface ActorLogger {\n\tlevel: any;\n\tfatal: any;\n\ttrace: any;\n\tsilent: any;\n\tmsgPrefix: any;\n\tdebug: any;\n\tinfo: any;\n\twarn: any;\n\terror: any;\n\t[key: string]: any;\n}\n\ntype ActorKvValueType = \"text\" | \"arrayBuffer\" | \"binary\";\ntype ActorKvKeyType = \"text\" | \"binary\";\ntype ActorKvValueTypeMap = {\n\ttext: string;\n\tarrayBuffer: ArrayBuffer;\n\tbinary: Uint8Array;\n};\ntype ActorKvKeyTypeMap = {\n\ttext: string;\n\tbinary: Uint8Array;\n};\ntype ActorKvValueOptions<T extends ActorKvValueType = \"text\"> = {\n\ttype?: T;\n};\ntype ActorKvListOptions<\n\tT extends ActorKvValueType = \"text\",\n\tK extends ActorKvKeyType = \"text\",\n> = ActorKvValueOptions<T> & {\n\tkeyType?: K;\n\treverse?: boolean;\n\tlimit?: number;\n};\n\ntype ActorClientFor<T> = T extends Registry<any> ? Client<T> : T;\n\n/**\n * @deprecated Actor KV is deprecated. Use embedded SQLite (`c.db` / `c.sql`)\n * or actor state instead.\n */\nexport interface ActorKv {\n\tget<T extends ActorKvValueType = \"text\">(\n\t\tkey: Uint8Array | string,\n\t\toptions?: ActorKvValueOptions<T>,\n\t): Promise<ActorKvValueTypeMap[T] | null>;\n\tput<T extends ActorKvValueType = \"text\">(\n\t\tkey: Uint8Array | string,\n\t\tvalue: Uint8Array | string | ArrayBuffer,\n\t\toptions?: ActorKvValueOptions<T>,\n\t): Promise<void>;\n\tdelete(key: Uint8Array | string): Promise<void>;\n\tbatchPut(entries: [Uint8Array, Uint8Array][]): Promise<void>;\n\tbatchGet(keys: Uint8Array[]): Promise<(Uint8Array | null)[]>;\n\tbatchDelete(keys: Uint8Array[]): Promise<void>;\n\tdeleteRange(start: Uint8Array, end: Uint8Array): Promise<void>;\n\tlistPrefix<\n\t\tT extends ActorKvValueType = \"text\",\n\t\tK extends ActorKvKeyType = \"text\",\n\t>(\n\t\tprefix: Uint8Array | string,\n\t\toptions?: ActorKvListOptions<T, K>,\n\t): Promise<Array<[ActorKvKeyTypeMap[K], ActorKvValueTypeMap[T]]>>;\n\tlistRange<\n\t\tT extends ActorKvValueType = \"text\",\n\t\tK extends ActorKvKeyType = \"text\",\n\t>(\n\t\tstart: Uint8Array | string,\n\t\tend: Uint8Array | string,\n\t\toptions?: ActorKvListOptions<T, K>,\n\t): Promise<Array<[ActorKvKeyTypeMap[K], ActorKvValueTypeMap[T]]>>;\n\tlist<\n\t\tT extends ActorKvValueType = \"text\",\n\t\tK extends ActorKvKeyType = \"text\",\n\t>(\n\t\tprefix: Uint8Array | string,\n\t\toptions?: ActorKvListOptions<T, K>,\n\t): Promise<Array<[ActorKvKeyTypeMap[K], ActorKvValueTypeMap[T]]>>;\n\t[key: string]: any;\n}\n\nexport interface ActorSchedule {\n\tafter(duration: number, action: string, ...args: unknown[]): Promise<void>;\n\tat(timestamp: number, action: string, ...args: unknown[]): Promise<void>;\n\t[key: string]: any;\n}\n\nexport type QueueMessageOf<Name extends string, Body> = {\n\tid: number | bigint;\n\tname: Name;\n\tbody: Body;\n\tcreatedAt: number;\n\t[key: string]: unknown;\n};\n\nexport type QueueName<TQueues extends QueueSchemaConfig> = keyof TQueues &\n\tstring;\nexport type QueueFilterName<TQueues extends QueueSchemaConfig> =\n\tkeyof TQueues extends never ? string : QueueName<TQueues>;\n\ntype QueueMessageForName<\n\tTQueues extends QueueSchemaConfig,\n\tTName extends QueueFilterName<TQueues>,\n> = keyof TQueues extends never\n\t? QueueMessageOf<string, unknown>\n\t: TName extends QueueName<TQueues>\n\t\t? QueueMessageOf<TName, InferSchemaMap<TQueues>[TName]>\n\t\t: never;\n\ntype QueueCompleteArgs<T> = undefined extends T\n\t? [response?: T]\n\t: [response: T];\n\ntype QueueCompleteArgsForName<\n\tTQueues extends QueueSchemaConfig,\n\tTName extends QueueFilterName<TQueues>,\n> = keyof TQueues extends never\n\t? [response?: unknown]\n\t: TName extends QueueName<TQueues>\n\t\t? [InferQueueCompleteMap<TQueues>[TName]] extends [never]\n\t\t\t? [response?: unknown]\n\t\t\t: QueueCompleteArgs<InferQueueCompleteMap<TQueues>[TName]>\n\t\t: [response?: unknown];\n\ntype QueueCompletableMessageForName<\n\tTQueues extends QueueSchemaConfig,\n\tTName extends QueueFilterName<TQueues>,\n> = QueueMessageForName<TQueues, TName> & {\n\tcomplete(...args: QueueCompleteArgsForName<TQueues, TName>): Promise<void>;\n};\n\ntype QueueCompletionResultForName<\n\tTQueues extends QueueSchemaConfig,\n\tTName extends QueueFilterName<TQueues>,\n> = keyof TQueues extends never\n\t? unknown | undefined\n\t: TName extends QueueName<TQueues>\n\t\t? InferQueueCompleteMap<TQueues>[TName] | undefined\n\t\t: unknown | undefined;\n\nexport type QueueResultMessageForName<\n\tTQueues extends QueueSchemaConfig,\n\tTName extends QueueFilterName<TQueues>,\n\tTCompletable extends boolean,\n> = TCompletable extends true\n\t? QueueCompletableMessageForName<TQueues, TName>\n\t: QueueMessageForName<TQueues, TName>;\n\nexport interface QueueNextOptions<\n\tTName extends string = string,\n\tTCompletable extends boolean = boolean,\n> {\n\tnames?: readonly TName[];\n\ttimeout?: number;\n\tsignal?: AbortSignal;\n\tcompletable?: TCompletable;\n}\n\nexport interface QueueNextBatchOptions<\n\tTName extends string = string,\n\tTCompletable extends boolean = boolean,\n> {\n\tnames?: readonly TName[];\n\tcount?: number;\n\ttimeout?: number;\n\tsignal?: AbortSignal;\n\tcompletable?: TCompletable;\n}\n\nexport interface QueueWaitOptions<TCompletable extends boolean = boolean> {\n\ttimeout?: number;\n\tsignal?: AbortSignal;\n\tcompletable?: TCompletable;\n}\n\nexport interface QueueEnqueueAndWaitOptions {\n\ttimeout?: number;\n\tsignal?: AbortSignal;\n}\n\nexport interface QueueTryNextOptions<\n\tTName extends string = string,\n\tTCompletable extends boolean = boolean,\n> {\n\tnames?: readonly TName[];\n\tcompletable?: TCompletable;\n}\n\nexport interface QueueTryNextBatchOptions<\n\tTName extends string = string,\n\tTCompletable extends boolean = boolean,\n> {\n\tnames?: readonly TName[];\n\tcount?: number;\n\tcompletable?: TCompletable;\n}\n\nexport interface QueueIterOptions<\n\tTName extends string = string,\n\tTCompletable extends boolean = boolean,\n> {\n\tnames?: readonly TName[];\n\tsignal?: AbortSignal;\n\tcompletable?: TCompletable;\n}\n\nexport interface ActorQueue<\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\tsend<TName extends QueueFilterName<TQueues>>(\n\t\tname: TName,\n\t\tbody: QueueMessageForName<TQueues, TName>[\"body\"],\n\t): Promise<any>;\n\tnext<\n\t\tconst TName extends QueueFilterName<TQueues>,\n\t\tconst TCompletable extends boolean = false,\n\t>(opts?: QueueNextOptions<TName, TCompletable>): Promise<any>;\n\tnextBatch<\n\t\tconst TName extends QueueFilterName<TQueues>,\n\t\tconst TCompletable extends boolean = false,\n\t>(opts?: QueueNextBatchOptions<TName, TCompletable>): Promise<any[]>;\n\twaitForNames<\n\t\tconst TName extends QueueFilterName<TQueues>,\n\t\tconst TCompletable extends boolean = false,\n\t>(\n\t\tnames: readonly TName[],\n\t\topts?: QueueWaitOptions<TCompletable>,\n\t): Promise<any>;\n\tenqueueAndWait<const TName extends QueueFilterName<TQueues>>(\n\t\tname: TName,\n\t\tbody: QueueMessageForName<TQueues, TName>[\"body\"],\n\t\topts?: QueueEnqueueAndWaitOptions,\n\t): Promise<QueueCompletionResultForName<TQueues, TName>>;\n\ttryNext<\n\t\tconst TName extends QueueFilterName<TQueues>,\n\t\tconst TCompletable extends boolean = false,\n\t>(opts?: QueueTryNextOptions<TName, TCompletable>): Promise<any>;\n\ttryNextBatch<\n\t\tconst TName extends QueueFilterName<TQueues>,\n\t\tconst TCompletable extends boolean = false,\n\t>(opts?: QueueTryNextBatchOptions<TName, TCompletable>): Promise<any[]>;\n\titer<\n\t\tconst TName extends QueueFilterName<TQueues>,\n\t\tconst TCompletable extends boolean = false,\n\t>(opts?: QueueIterOptions<TName, TCompletable>): AsyncIterable<any>;\n\t[key: string]: any;\n}\n\nexport interface Conn<\n\t_TState = unknown,\n\tTConnParams = unknown,\n\tTConnState = unknown,\n\t_TVars = unknown,\n\t_TInput = unknown,\n\t_TDatabase extends AnyDatabaseProvider = AnyDatabaseProvider,\n\t_TEvents extends EventSchemaConfig = Record<never, never>,\n\t_TQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\tid: string;\n\tparams: TConnParams;\n\tstate: TConnState;\n\tisHibernatable: boolean;\n\tsend(name: string, ...args: any[]): void;\n\tdisconnect(reason?: string): Promise<void>;\n\t[key: string]: any;\n}\n\nexport type AnyConn = Conn<any, any, any, any, any, any, any, any>;\n\nexport interface ActorContext<\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[ACTOR_CONTEXT_INTERNAL_SYMBOL]?: unknown;\n\t/** Returns the raw unwrapped state without the write-through proxy. */\n\t[RAW_STATE_SYMBOL](): TState;\n\tstate: TState;\n\tvars: TVars;\n\t/**\n\t * @deprecated Actor KV is deprecated. Use embedded SQLite (`db` / `sql`)\n\t * or actor state instead.\n\t */\n\treadonly kv: ActorKv;\n\treadonly db: InferDatabaseClient<TDatabase>;\n\treadonly schedule: ActorSchedule;\n\treadonly queue: ActorQueue<TQueues>;\n\treadonly actorId: string;\n\treadonly name: string;\n\treadonly key: string[];\n\treadonly region: string;\n\treadonly conns: Map<\n\t\tstring,\n\t\tConn<\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\treadonly log: ActorLogger;\n\treadonly abortSignal: AbortSignal;\n\treadonly aborted: boolean;\n\treadonly request?: Request;\n\t/** @deprecated No-op. Always returns `false`. Use `keepAwake(promise)` or `waitUntil(promise)` instead. Will be removed in 2.2.0. */\n\treadonly preventSleep: boolean;\n\tbroadcast(name: string, ...args: any[]): void;\n\tsaveState(opts?: { immediate?: boolean; maxWait?: number }): Promise<void>;\n\tkeepAwake<T>(promise: Promise<T>): Promise<T>;\n\twaitUntil(promise: Promise<unknown>): void;\n\t/** @deprecated No-op. Use `keepAwake(promise)` to hold the actor awake for a specific promise. Will be removed in 2.2.0. */\n\tsetPreventSleep(preventSleep: boolean): void;\n\tsleep(): void;\n\tdestroy(): void;\n\tclient<T = any>(): ActorClientFor<T>;\n\t[key: string]: any;\n}\n\nexport type ActionContext<\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> = ActorContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> & {\n\tconn: Conn<\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 BeforeActionResponseContext<\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> = ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type BeforeConnectContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> = ActorContext<\n\tTState,\n\tunknown,\n\tunknown,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type ConnectContext<\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> = ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type CreateConnStateContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> = ActorContext<\n\tTState,\n\tunknown,\n\tunknown,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type CreateContext<\n\tTState,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> = ActorContext<\n\tTState,\n\tunknown,\n\tunknown,\n\tunknown,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type CreateVarsContext<\n\tTState,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> = CreateContext<TState, TInput, TDatabase, TEvents, TQueues>;\n\nexport type DestroyContext<\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> = ActorContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type DisconnectContext<\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> = ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type RequestContext<\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> = ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type RunContext<\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> = ActorContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type SleepContext<\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> = RunContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type StateChangeContext<\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> = RunContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type WakeContext<\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> = RunContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type MigrateContext<\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> = WakeContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type WebSocketContext<\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> = ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n>;\n\nexport type ActorContextOf<\n\tAD extends BaseActorDefinition<any, any, any, any, any, any, any, any, any>,\n> =\n\tAD extends BaseActorDefinition<\n\t\tinfer TState,\n\t\tinfer TConnParams,\n\t\tinfer TConnState,\n\t\tinfer TVars,\n\t\tinfer TInput,\n\t\tinfer TDatabase,\n\t\tinfer TEvents,\n\t\tinfer TQueues,\n\t\tany\n\t>\n\t\t? ActorContext<\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: never;\n\nexport interface ActorTypes<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> {\n\tstate?: TState;\n\tconnParams?: TConnParams;\n\tconnState?: TConnState;\n\tvars?: TVars;\n\tinput?: TInput;\n\tdatabase?: TDatabase;\n}\n\n// Helper for validating function types - accepts generic for specific function signatures\nconst zFunction = <\n\tT extends (...args: any[]) => any = (...args: unknown[]) => unknown,\n>() => z.custom<T>((val) => typeof val === \"function\");\n\nexport type InspectorUnsubscribe = () => void;\n\nexport interface WorkflowInspectorConfig<THistory = unknown> {\n\tgetHistory: () => THistory | null;\n\tonHistoryUpdated?: (\n\t\tlistener: (history: THistory) => void,\n\t) => InspectorUnsubscribe;\n\treplayFromStep?: (entryId?: string) => Promise<THistory | null>;\n}\n\nexport interface RunInspectorConfig<THistory = unknown> {\n\tworkflow?: WorkflowInspectorConfig<THistory>;\n}\n\nconst WorkflowInspectorConfigSchema = z.object({\n\tgetHistory: zFunction<WorkflowInspectorConfig<unknown>[\"getHistory\"]>(),\n\tonHistoryUpdated:\n\t\tzFunction<\n\t\t\tNonNullable<WorkflowInspectorConfig<unknown>[\"onHistoryUpdated\"]>\n\t\t>().optional(),\n\treplayFromStep:\n\t\tzFunction<\n\t\t\tNonNullable<WorkflowInspectorConfig<unknown>[\"replayFromStep\"]>\n\t\t>().optional(),\n});\n\nconst RunInspectorConfigSchema = z\n\t.object({\n\t\tworkflow: WorkflowInspectorConfigSchema.optional(),\n\t})\n\t.optional();\n\n/**\n * Built-in inspector tabs the dashboard ships. Used to validate\n * `hidden: true` entries and reject custom-tab ids that collide with\n * a built-in.\n */\nexport const BUILTIN_INSPECTOR_TAB_IDS = [\n\t\"workflow\",\n\t\"database\",\n\t\"state\",\n\t\"queue\",\n\t\"connections\",\n\t\"console\",\n] as const;\n\nexport const BuiltinInspectorTabIdSchema = z.enum(BUILTIN_INSPECTOR_TAB_IDS);\n\n// Custom tab id grammar — mirrored in Rust at\n// `rivetkit-rust/packages/rivetkit-core/src/inspector/tabs.rs`. Slashes are\n// forbidden because the runtime splits `/inspector/custom-tabs/<id>/<rest>`\n// on the first `/`.\nconst CUSTOM_INSPECTOR_TAB_ID_RE = /^[A-Za-z0-9_-]+$/;\n\nexport const CustomInspectorTabEntrySchema = z\n\t.object({\n\t\tid: z\n\t\t\t.string()\n\t\t\t.regex(\n\t\t\t\tCUSTOM_INSPECTOR_TAB_ID_RE,\n\t\t\t\t\"inspector.tabs[].id must contain only letters, digits, underscore, or dash\",\n\t\t\t),\n\t\tlabel: z.string().min(1),\n\t\tsource: z.string().min(1),\n\t\t/**\n\t\t * Optional icon id. The dashboard maps strings to glyphs (see its\n\t\t * icon registry); unknown ids fall back to a generic icon.\n\t\t */\n\t\ticon: z.string().min(1).optional(),\n\t\thidden: z.literal(false).optional(),\n\t})\n\t.strict();\n\nexport const HideInspectorTabEntrySchema = z\n\t.object({\n\t\tid: BuiltinInspectorTabIdSchema,\n\t\thidden: z.literal(true),\n\t})\n\t.strict();\n\nexport const InspectorTabEntrySchema = z.union([\n\tCustomInspectorTabEntrySchema,\n\tHideInspectorTabEntrySchema,\n]);\n\nexport const ActorInspectorConfigSchema = z\n\t.object({\n\t\ttabs: z.array(InspectorTabEntrySchema).default(() => []),\n\t})\n\t.strict()\n\t.refine(\n\t\t(data) => {\n\t\t\tconst ids = data.tabs.map((t) => t.id);\n\t\t\treturn new Set(ids).size === ids.length;\n\t\t},\n\t\t{ message: \"Duplicate id in inspector.tabs\", path: [\"tabs\"] },\n\t)\n\t.refine(\n\t\t(data) => {\n\t\t\t// A custom entry's id must not collide with a built-in id.\n\t\t\tconst builtinSet = new Set(BUILTIN_INSPECTOR_TAB_IDS);\n\t\t\treturn data.tabs.every(\n\t\t\t\t(t) => t.hidden === true || !builtinSet.has(t.id as any),\n\t\t\t);\n\t\t},\n\t\t{\n\t\t\tmessage:\n\t\t\t\t\"Custom inspector tab id collides with a built-in (use hidden: true to hide a built-in)\",\n\t\t\tpath: [\"tabs\"],\n\t\t},\n\t);\n\nexport type ActorInspectorConfig = z.input<typeof ActorInspectorConfigSchema>;\n\n// Schema for run handler with metadata\nexport const RunConfigSchema = z.object({\n\t/** Display name for the actor in the Inspector UI. */\n\tname: z.string().optional(),\n\t/** Icon for the actor in the Inspector UI. Can be an emoji or FontAwesome icon name. */\n\ticon: z.string().optional(),\n\t/** The run handler function. */\n\trun: zFunction(),\n\t/** Inspector integration for long-running run handlers. */\n\tinspector: RunInspectorConfigSchema.optional(),\n});\ntype RunConfigRuntime = z.infer<typeof RunConfigSchema>;\nexport type RunConfig<\n\tTState = unknown,\n\tTConnParams = unknown,\n\tTConnState = unknown,\n\tTVars = unknown,\n\tTInput = unknown,\n\tTDatabase extends AnyDatabaseProvider = AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> = Omit<RunConfigRuntime, \"run\"> & {\n\trun: (\n\t\tc: 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) => void | Promise<void>;\n};\n\ntype AnyRunConfig = RunConfig<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tAnyDatabaseProvider,\n\tany,\n\tany\n>;\n\nexport const RUN_FUNCTION_CONFIG_SYMBOL = Symbol.for(\n\t\"rivetkit.run_function_config\",\n);\n\ninterface RunFunctionConfig {\n\tname?: string;\n\ticon?: string;\n\tinspector?: RunInspectorConfig;\n\tinspectorFactory?: (actor: unknown) => RunInspectorConfig | undefined;\n\t/** Release any per-actor inspector state held for this actor id. */\n\tdisposeInspector?: (actorId: string) => void;\n}\n\ntype RunFunctionWithConfig = ((...args: any[]) => any) & {\n\t[RUN_FUNCTION_CONFIG_SYMBOL]?: RunFunctionConfig;\n};\n\n// Run can be either a function or an object with name/icon/run\nconst zRunHandler = z.union([zFunction(), RunConfigSchema]).optional();\n\n/** Extract the run function from either a function or RunConfig object. */\nexport function getRunFunction(\n\trun: ((...args: any[]) => any) | AnyRunConfig | undefined,\n): ((...args: any[]) => any) | undefined {\n\tif (!run) return undefined;\n\tif (typeof run === \"function\") return run;\n\treturn run.run;\n}\n\n/** Extract run metadata (name/icon) from RunConfig if provided. */\nexport function getRunMetadata(\n\trun: ((...args: any[]) => any) | AnyRunConfig | undefined,\n): { name?: string; icon?: string } {\n\tif (!run) return {};\n\tif (typeof run === \"function\") {\n\t\tconst config = (run as RunFunctionWithConfig)[\n\t\t\tRUN_FUNCTION_CONFIG_SYMBOL\n\t\t];\n\t\tif (!config) return {};\n\t\treturn { name: config.name, icon: config.icon };\n\t}\n\treturn { name: run.name, icon: run.icon };\n}\n\n/** Extract run inspector configuration if provided. */\nexport function getRunInspectorConfig(\n\trun: ((...args: any[]) => any) | AnyRunConfig | undefined,\n\tactor?: unknown,\n): RunInspectorConfig | undefined {\n\tif (!run) return undefined;\n\tif (typeof run === \"function\") {\n\t\tconst config = (run as RunFunctionWithConfig)[\n\t\t\tRUN_FUNCTION_CONFIG_SYMBOL\n\t\t];\n\t\treturn config?.inspectorFactory\n\t\t\t? config.inspectorFactory(actor)\n\t\t\t: config?.inspector;\n\t}\n\treturn run.inspector;\n}\n\n/** Release per-actor inspector state for a destroyed actor, if the run handler registered a disposer. */\nexport function disposeRunInspector(\n\trun: ((...args: any[]) => any) | AnyRunConfig | undefined,\n\tactorId: string,\n): void {\n\tif (!run || typeof run !== \"function\") {\n\t\treturn;\n\t}\n\tconst config = (run as RunFunctionWithConfig)[RUN_FUNCTION_CONFIG_SYMBOL];\n\tconfig?.disposeInspector?.(actorId);\n}\n\n// This schema is used to validate the input at runtime. The generic types are defined below in `ActorConfig`.\n//\n// We don't use Zod generics with `z.custom` because:\n// (a) there seems to be a weird bug in either Zod, tsup, or TSC that causese external packages to have different types from `z.infer` than from within the same package and\n// (b) it makes the type definitions incredibly difficult to read as opposed to vanilla TypeScript.\nconst GlobalActorOptionsBaseSchema = z\n\t.object({\n\t\t/** Display name for the actor in the Inspector UI. */\n\t\tname: z.string().optional(),\n\t\t/** Icon for the actor in the Inspector UI. Can be an emoji or FontAwesome icon name. */\n\t\ticon: z.string().optional(),\n\t\t/**\n\t\t * Can hibernate WebSockets for onWebSocket.\n\t\t *\n\t\t * WebSockets using actions/events are hibernatable by default.\n\t\t *\n\t\t * @experimental\n\t\t **/\n\t\tcanHibernateWebSocket: z\n\t\t\t.union([z.boolean(), zFunction<(request: Request) => boolean>()])\n\t\t\t.default(false),\n\t})\n\t.strict();\n\nexport const GlobalActorOptionsSchema = GlobalActorOptionsBaseSchema.prefault(\n\t() => ({}),\n);\n\nexport type GlobalActorOptions = z.infer<typeof GlobalActorOptionsSchema>;\nexport type GlobalActorOptionsInput = z.input<typeof GlobalActorOptionsSchema>;\n\nconst InstanceActorOptionsBaseSchema = z\n\t.object({\n\t\tcreateVarsTimeout: z.number().positive().default(5000),\n\t\tcreateConnStateTimeout: z.number().positive().default(5000),\n\t\tonBeforeConnectTimeout: z.number().positive().default(5000),\n\t\tonConnectTimeout: z.number().positive().default(5000),\n\t\tonMigrateTimeout: z.number().positive().default(30_000),\n\t\tsleepGracePeriod: z\n\t\t\t.number()\n\t\t\t.positive()\n\t\t\t.default(DEFAULT_SLEEP_GRACE_PERIOD),\n\t\t/** @deprecated `onDestroyTimeout` is folded into `sleepGracePeriod`, which now bounds the entire graceful shutdown window for both sleep and destroy. Will be removed in 2.2.0. */\n\t\tonDestroyTimeout: z.number().positive().optional(),\n\t\t/** @deprecated `waitUntilTimeout` is folded into `sleepGracePeriod`, which now bounds the entire graceful shutdown window for both sleep and destroy. Will be removed in 2.2.0. */\n\t\twaitUntilTimeout: z.number().positive().optional(),\n\t\tstateSaveInterval: z.number().positive().default(1_000),\n\t\tactionTimeout: z.number().positive().default(60_000),\n\t\tconnectionLivenessTimeout: z.number().positive().default(2500),\n\t\tconnectionLivenessInterval: z.number().positive().default(5000),\n\t\t/** @deprecated Use `c.keepAwake(promise)` to scope keep-awake to a specific operation, or keep `noSleep` for actors that must stay awake indefinitely. Will be removed in 2.2.0. */\n\t\tnoSleep: z.boolean().default(false),\n\t\tsleepTimeout: z.number().positive().default(30_000),\n\t\tmaxQueueSize: z.number().positive().default(1000),\n\t\tmaxQueueMessageSize: z\n\t\t\t.number()\n\t\t\t.positive()\n\t\t\t.default(64 * 1024),\n\t\t/** Override RivetKit's workflow preload budget for this actor. Set to 0 to disable workflow preloading. */\n\t\tpreloadMaxWorkflowBytes: z.number().nonnegative().optional(),\n\t\t/** Override RivetKit's connections preload budget for this actor. Set to 0 to disable connections preloading. */\n\t\tpreloadMaxConnectionsBytes: z.number().nonnegative().optional(),\n\t})\n\t.strict();\n\nexport const InstanceActorOptionsSchema =\n\tInstanceActorOptionsBaseSchema.prefault(() => ({}));\n\nexport type InstanceActorOptions = z.infer<typeof InstanceActorOptionsSchema>;\nexport type InstanceActorOptionsInput = z.input<\n\ttypeof InstanceActorOptionsSchema\n>;\n\nexport const ActorOptionsSchema = GlobalActorOptionsBaseSchema.extend(\n\tInstanceActorOptionsBaseSchema.shape,\n)\n\t.strict()\n\t.prefault(() => ({}));\n\nexport type ActorOptions = z.infer<typeof ActorOptionsSchema>;\nexport type ActorOptionsInput = z.input<typeof ActorOptionsSchema>;\n\nexport const ActorConfigSchema = z\n\t.object({\n\t\tonCreate: zFunction().optional(),\n\t\tonDestroy: zFunction().optional(),\n\t\tonMigrate: zFunction().optional(),\n\t\tonWake: zFunction().optional(),\n\t\tonSleep: zFunction().optional(),\n\t\trun: zRunHandler,\n\t\tonStateChange: zFunction().optional(),\n\t\tonBeforeConnect: zFunction().optional(),\n\t\tonConnect: zFunction().optional(),\n\t\tonDisconnect: zFunction().optional(),\n\t\tonBeforeActionResponse: zFunction().optional(),\n\t\tonRequest: zFunction().optional(),\n\t\tonWebSocket: zFunction().optional(),\n\t\tactions: z.record(z.string(), zFunction()).default(() => ({})),\n\t\tactionInputSchemas: z.record(z.string(), z.any()).optional(),\n\t\tconnParamsSchema: z.any().optional(),\n\t\tevents: z.record(z.string(), z.any()).optional(),\n\t\tqueues: z.record(z.string(), z.any()).optional(),\n\t\tstate: z.any().optional(),\n\t\tcreateState: zFunction().optional(),\n\t\tconnState: z.any().optional(),\n\t\tcreateConnState: zFunction().optional(),\n\t\tvars: z.any().optional(),\n\t\tdb: z.any().optional(),\n\t\tcreateVars: zFunction().optional(),\n\t\toptions: ActorOptionsSchema,\n\t\tinspector: ActorInspectorConfigSchema.optional(),\n\t})\n\t.strict()\n\t.refine(\n\t\t(data) => !(data.state !== undefined && data.createState !== undefined),\n\t\t{\n\t\t\tmessage: \"Cannot define both 'state' and 'createState'\",\n\t\t\tpath: [\"state\"],\n\t\t},\n\t)\n\t.refine(\n\t\t(data) =>\n\t\t\t!(\n\t\t\t\tdata.connState !== undefined &&\n\t\t\t\tdata.createConnState !== undefined\n\t\t\t),\n\t\t{\n\t\t\tmessage: \"Cannot define both 'connState' and 'createConnState'\",\n\t\t\tpath: [\"connState\"],\n\t\t},\n\t)\n\t.refine(\n\t\t(data) => !(data.vars !== undefined && data.createVars !== undefined),\n\t\t{\n\t\t\tmessage: \"Cannot define both 'vars' and 'createVars'\",\n\t\t\tpath: [\"vars\"],\n\t\t},\n\t);\n\n// Creates state config\n//\n// This must have only one or the other or else TState will not be able to be inferred\n//\n// Data returned from this handler will be available on `c.state`.\ntype CreateState<\n\tTState,\n\t_TConnParams,\n\t_TConnState,\n\t_TVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> =\n\t| { state: TState }\n\t| {\n\t\t\tcreateState: (\n\t\t\t\tc: CreateContext<TState, TInput, TDatabase, TEvents, TQueues>,\n\t\t\t\tinput: TInput,\n\t\t\t) => TState | Promise<TState>;\n\t }\n\t| Record<never, never>;\n\n// Creates connection state config\n//\n// This must have only one or the other or else TState will not be able to be inferred\n//\n// Data returned from this handler will be available on `c.conn.state`.\n// The pending connection is not visible in `c.conns` until this succeeds.\ntype CreateConnState<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> =\n\t| { connState: TConnState }\n\t| {\n\t\t\tcreateConnState: (\n\t\t\t\tc: CreateConnStateContext<\n\t\t\t\t\tTState,\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\t>,\n\t\t\t\tparams: TConnParams,\n\t\t\t) => TConnState | Promise<TConnState>;\n\t }\n\t| Record<never, never>;\n\n// Creates vars config\n//\n// This must have only one or the other or else TState will not be able to be inferred\n/**\n * @experimental\n */\ntype CreateVars<\n\tTState,\n\t_TConnParams,\n\t_TConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> =\n\t| {\n\t\t\t/**\n\t\t\t * @experimental\n\t\t\t */\n\t\t\tvars: TVars;\n\t }\n\t| {\n\t\t\t/**\n\t\t\t * @experimental\n\t\t\t */\n\t\t\tcreateVars: (\n\t\t\t\tc: CreateVarsContext<\n\t\t\t\t\tTState,\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\t>,\n\t\t\t\tdriverCtx: any,\n\t\t\t) => TVars | Promise<TVars>;\n\t }\n\t| Record<never, never>;\n\nexport interface Actions<\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[Action: string]: (\n\t\tc: ActionContext<\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\t...args: any[]\n\t) => any;\n}\n\n//export type ActorConfig<TState, TConnParams, TConnState, TVars, TInput, TAuthData> = BaseActorConfig<TState, TConnParams, TConnState, TVars, TInput, TAuthData> &\n//\tActorConfigLifecycle<TState, TConnParams, TConnState, TVars, TInput, TAuthData> &\n//\tCreateState<TState, TConnParams, TConnState, TVars, TInput, TAuthData> &\n//\tCreateConnState<TState, TConnParams, TConnState, TVars, TInput, TAuthData>;\n\n/**\n * @experimental\n */\nexport type AuthIntent = \"get\" | \"create\" | \"connect\" | \"action\" | \"message\";\n\ninterface BaseActorConfig<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n\tTActions extends Actions<\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\t/**\n\t * Called when the actor is first initialized.\n\t *\n\t * Use this hook to initialize your actor's state.\n\t * This is called before any other lifecycle hooks.\n\t */\n\tonCreate?: (\n\t\tc: CreateContext<TState, TInput, TDatabase, TEvents, TQueues>,\n\t\tinput: TInput,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor is destroyed.\n\t */\n\tonDestroy?: (\n\t\tc: DestroyContext<\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) => void | Promise<void>;\n\n\t/**\n\t * Called on every actor start after persisted state loads and before onWake.\n\t *\n\t * Use this hook for repeatable schema migrations or other startup work that\n\t * must run on both first boot and wake.\n\t */\n\tonMigrate?: (\n\t\tc: MigrateContext<\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\tisNew: boolean,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor is started and ready to receive connections and action.\n\t *\n\t * Use this hook to initialize resources needed for the actor's operation\n\t * (timers, external connections, etc.)\n\t *\n\t * @returns Void or a Promise that resolves when startup is complete\n\t */\n\tonWake?: (\n\t\tc: WakeContext<\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) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor is stopping or sleeping.\n\t *\n\t * Use this hook to clean up resources, save state, or perform\n\t * any shutdown operations before the actor sleeps or stops.\n\t *\n\t * Not supported on all platforms.\n\t *\n\t * @returns Void or a Promise that resolves when shutdown is complete\n\t */\n\tonSleep?: (\n\t\tc: SleepContext<\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) => void | Promise<void>;\n\n\t/**\n\t * Called after the actor starts up. Does not block actor startup.\n\t *\n\t * Use this for background tasks like:\n\t * - Reading from queues in a loop\n\t * - Tick loops for periodic work\n\t * - Custom workflow logic\n\t *\n\t * **Important:** The actor may go to sleep at any time during the `run`\n\t * handler. Wrap work that must keep the actor awake with\n\t * `c.keepAwake(promise)` to block idle sleep and shutdown finalize until\n\t * the promise settles, or use `c.waitUntil(promise)` to let the graceful\n\t * shutdown window (`sleepGracePeriod`) cover deferred work.\n\t *\n\t * The handler receives an abort signal via `c.abortSignal` and a\n\t * `c.aborted` alias. Use these to gracefully exit when shutdown starts.\n\t *\n\t * If this handler exits, the actor will follow the normal idle sleep timeout\n\t * once it becomes idle.\n\t * If this handler throws, the actor logs the error and then sleeps once it\n\t * becomes idle.\n\t * Call `c.destroy()` explicitly if a run handler should destroy the actor.\n\t *\n\t * Can be either a function or a RunConfig object with optional name/icon metadata.\n\t *\n\t * @returns Void or a Promise.\n\t */\n\trun?:\n\t\t| ((\n\t\t\t\tc: RunContext<\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\t>,\n\t\t ) => void | Promise<void>)\n\t\t| RunConfig<\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 >;\n\n\t/**\n\t * Called when the actor's state changes.\n\t *\n\t * Use this hook to react to state changes, such as updating\n\t * external systems or triggering events.\n\t *\n\t * State changes made within this hook will NOT trigger\n\t * another onStateChange call, preventing infinite recursion.\n\t *\n\t * @param newState The updated state\n\t */\n\tonStateChange?: (\n\t\tc: StateChangeContext<\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\tnewState: TState,\n\t) => void;\n\n\t/**\n\t * Called before a client connects to the actor.\n\t *\n\t * Use this hook to determine if a connection should be accepted\n\t * and to validate client-provided parameters. The pending connection\n\t * is not visible in `c.conns` while this hook runs.\n\t *\n\t * @param opts Connection parameters including client-provided data\n\t * @returns Void or a Promise.\n\t * @throws Throw an error to reject the connection\n\t */\n\tonBeforeConnect?: (\n\t\tc: BeforeConnectContext<\n\t\t\tTState,\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\tparams: TConnParams,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when a client successfully connects to the actor.\n\t *\n\t * Use this hook to perform actions when a connection is established,\n\t * such as sending initial data or updating the actor's state. The\n\t * connection is visible in `c.conns` before this hook runs.\n\t *\n\t * @param conn The connection object\n\t * @returns Void or a Promise that resolves when connection handling is complete\n\t */\n\tonConnect?: (\n\t\tc: ConnectContext<\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\tconn: Conn<\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) => void | Promise<void>;\n\n\t/**\n\t * Called when a client disconnects from the actor.\n\t *\n\t * Use this hook to clean up resources associated with the connection\n\t * or update the actor's state.\n\t *\n\t * @param conn The connection that is being closed\n\t * @returns Void or a Promise that resolves when disconnect handling is complete\n\t */\n\tonDisconnect?: (\n\t\tc: DisconnectContext<\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\tconn: Conn<\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) => void | Promise<void>;\n\n\t/**\n\t * Called before sending an action response to the client.\n\t *\n\t * Use this hook to modify or transform the output of an action before it's sent\n\t * to the client. This is useful for formatting responses, adding metadata,\n\t * or applying transformations to the output.\n\t *\n\t * @param name The name of the action that was called\n\t * @param args The arguments that were passed to the action\n\t * @param output The output that will be sent to the client\n\t * @returns The modified output to send to the client\n\t */\n\tonBeforeActionResponse?: <Out>(\n\t\tc: BeforeActionResponseContext<\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\tname: string,\n\t\targs: unknown[],\n\t\toutput: Out,\n\t) => Out | Promise<Out>;\n\n\t/**\n\t * Called when a raw HTTP request is made to the actor.\n\t *\n\t * This handler receives raw HTTP requests made to `/actors/{actorName}/http/*` endpoints.\n\t * Use this hook to handle custom HTTP patterns, REST APIs, or other HTTP-based protocols.\n\t *\n\t * @param c The request context with access to the connection\n\t * @param request The raw HTTP request object\n\t * @param opts Additional options\n\t * @returns A Response object to send back, or void to continue with default routing\n\t */\n\tonRequest?: (\n\t\tc: RequestContext<\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\trequest: Request,\n\t) => Response | Promise<Response>;\n\n\t/**\n\t * Called when a raw WebSocket connection is established to the actor.\n\t *\n\t * This handler receives WebSocket connections made to `/actors/{actorName}/websocket/*` endpoints.\n\t * Use this hook to handle custom WebSocket protocols, binary streams, or other WebSocket-based communication.\n\t *\n\t * @param c The WebSocket context with access to the connection\n\t * @param websocket The actor-facing raw WebSocket connection\n\t * @param opts Additional options including the original HTTP upgrade request\n\t */\n\tonWebSocket?: (\n\t\tc: WebSocketContext<\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\twebsocket: UniversalWebSocket,\n\t) => void | Promise<void>;\n\n\tactions?: TActions;\n\n\t/**\n\t * Optional schema map for validating action argument tuples in native runtimes.\n\t */\n\tactionInputSchemas?: Record<string, PrimitiveSchema>;\n\n\t/**\n\t * Optional schema for validating connection params in native runtimes.\n\t */\n\tconnParamsSchema?: PrimitiveSchema;\n\n\t/**\n\t * Schema map for events broadcasted by this actor.\n\t */\n\tevents?: TEvents;\n\n\t/**\n\t * Schema map for queue payloads sent by this actor.\n\t */\n\tqueues?: TQueues;\n}\n\ntype ActorDatabaseConfig<TDatabase extends AnyDatabaseProvider> =\n\t| {\n\t\t\t/**\n\t\t\t * @experimental\n\t\t\t */\n\t\t\tdb: TDatabase;\n\t }\n\t| Record<never, never>;\n\n// 1. Infer schema\n// 2. Omit keys that we'll manually define (because of generics)\n// 3. Define our own types that have generic constraints\nexport type ActorConfig<\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\tTActions extends Actions<\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> = Actions<\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> = Omit<\n\tz.infer<typeof ActorConfigSchema>,\n\t| \"actions\"\n\t| \"events\"\n\t| \"queues\"\n\t| \"onCreate\"\n\t| \"onDestroy\"\n\t| \"onMigrate\"\n\t| \"onWake\"\n\t| \"onSleep\"\n\t| \"run\"\n\t| \"onStateChange\"\n\t| \"onBeforeConnect\"\n\t| \"onConnect\"\n\t| \"onDisconnect\"\n\t| \"onBeforeActionResponse\"\n\t| \"onRequest\"\n\t| \"onWebSocket\"\n\t| \"state\"\n\t| \"createState\"\n\t| \"connState\"\n\t| \"createConnState\"\n\t| \"vars\"\n\t| \"createVars\"\n\t| \"db\"\n> &\n\tBaseActorConfig<\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\tTActions\n\t> &\n\tCreateState<\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\tCreateConnState<\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\tCreateVars<\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\tActorDatabaseConfig<TDatabase>;\n\n// See description on `ActorConfig`\nexport type ActorConfigInput<\n\tTState = undefined,\n\tTConnParams = undefined,\n\tTConnState = undefined,\n\tTVars = undefined,\n\tTInput = undefined,\n\tTDatabase extends AnyDatabaseProvider = undefined,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n\tTActions extends Actions<\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> = Record<never, never>,\n> = {\n\ttypes?: ActorTypes<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n} & Omit<\n\tz.input<typeof ActorConfigSchema>,\n\t| \"actions\"\n\t| \"events\"\n\t| \"queues\"\n\t| \"onCreate\"\n\t| \"onDestroy\"\n\t| \"onMigrate\"\n\t| \"onWake\"\n\t| \"onSleep\"\n\t| \"run\"\n\t| \"onStateChange\"\n\t| \"onBeforeConnect\"\n\t| \"onConnect\"\n\t| \"onDisconnect\"\n\t| \"onBeforeActionResponse\"\n\t| \"onRequest\"\n\t| \"onWebSocket\"\n\t| \"state\"\n\t| \"createState\"\n\t| \"connState\"\n\t| \"createConnState\"\n\t| \"vars\"\n\t| \"createVars\"\n\t| \"db\"\n> &\n\tBaseActorConfig<\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\tTActions\n\t> &\n\tCreateState<\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\tCreateConnState<\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\tCreateVars<\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\tActorDatabaseConfig<TDatabase>;\n\n// For testing type definitions:\nexport function test<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n\tTActions extends Actions<\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\tinput: ActorConfigInput<\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\tTActions\n\t>,\n): ActorConfig<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {\n\tconst config = ActorConfigSchema.parse(input) as ActorConfig<\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\treturn config;\n}\n\n// MARK: Documentation Schema\n// This schema is JSON-serializable for documentation generation.\n// It excludes function types and focuses on the configurable options.\n\nexport const DocActorOptionsSchema = z\n\t.object({\n\t\tname: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Display name for the actor in the Inspector UI.\"),\n\t\ticon: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Icon for the actor in the Inspector UI. Can be an emoji (e.g., '🚀') or FontAwesome icon name (e.g., 'rocket').\",\n\t\t\t),\n\t\tcreateVarsTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for createVars handler. Default: 5000\"),\n\t\tcreateConnStateTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Timeout in ms for createConnState handler. Default: 5000\",\n\t\t\t),\n\t\tonMigrateTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for onMigrate handler. Default: 30000\"),\n\t\tonBeforeConnectTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Timeout in ms for onBeforeConnect handler. Default: 5000\",\n\t\t\t),\n\t\tonConnectTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for onConnect handler. Default: 5000\"),\n\t\tsleepGracePeriod: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t`Max time in ms for the graceful shutdown window. Covers lifecycle hooks (onSleep, onDestroy), the run handler wait, async raw WebSocket handlers, disconnect callbacks, and final state serialization. Default: ${DEFAULT_SLEEP_GRACE_PERIOD}.`,\n\t\t\t),\n\t\tonDestroyTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Deprecated. Folded into sleepGracePeriod, which now bounds the entire graceful shutdown window for both sleep and destroy. Will be removed in 2.2.0.\",\n\t\t\t),\n\t\twaitUntilTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Deprecated. Folded into sleepGracePeriod, which now bounds the entire graceful shutdown window for both sleep and destroy. Will be removed in 2.2.0.\",\n\t\t\t),\n\t\tstateSaveInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in ms between automatic state saves. Default: 1000\",\n\t\t\t),\n\t\tactionTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for action handlers. Default: 60000\"),\n\t\tconnectionLivenessTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Timeout in ms for connection liveness checks. Default: 2500\",\n\t\t\t),\n\t\tconnectionLivenessInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in ms between connection liveness checks. Default: 5000\",\n\t\t\t),\n\t\tnoSleep: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Deprecated. If true, the actor will never sleep. Use c.keepAwake(promise) to scope keep-awake to a specific operation instead. Default: false\",\n\t\t\t),\n\t\tsleepTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Time in ms of inactivity before the actor sleeps. Default: 30000\",\n\t\t\t),\n\t\tmaxQueueSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum number of queue messages before rejecting new messages. Default: 1000\",\n\t\t\t),\n\t\tmaxQueueMessageSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum size of each queue message in bytes. Default: 65536\",\n\t\t\t),\n\t\tcanHibernateWebSocket: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Whether WebSockets using onWebSocket can be hibernated. WebSockets using actions/events are hibernatable by default. Default: false\",\n\t\t\t),\n\t\tpreloadMaxWorkflowBytes: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Override RivetKit's workflow preload budget for this actor. Set to 0 to disable workflow preloading.\",\n\t\t\t),\n\t\tpreloadMaxConnectionsBytes: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Override RivetKit's connections preload budget for this actor. Set to 0 to disable connections preloading.\",\n\t\t\t),\n\t})\n\t.describe(\"Actor options for timeouts and behavior configuration.\");\n\nexport const DocActorConfigSchema = z\n\t.object({\n\t\tstate: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Initial state value for the actor. Cannot be used with createState.\",\n\t\t\t),\n\t\tcreateState: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Function to create initial state. Receives context and input. Cannot be used with state.\",\n\t\t\t),\n\t\tconnState: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Initial connection state value. Cannot be used with createConnState.\",\n\t\t\t),\n\t\tcreateConnState: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Function to create connection state. Receives context and connection params. The pending connection is not visible in c.conns until this succeeds. Cannot be used with connState.\",\n\t\t\t),\n\t\tvars: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Initial ephemeral variables value. Cannot be used with createVars.\",\n\t\t\t),\n\t\tcreateVars: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Function to create ephemeral variables. Receives context and driver context. Cannot be used with vars.\",\n\t\t\t),\n\t\tdb: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Database provider instance for the actor.\"),\n\t\tonCreate: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor is first initialized. Use to initialize state.\",\n\t\t\t),\n\t\tonDestroy: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Called when the actor is destroyed.\"),\n\t\tonMigrate: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called on every actor start after persisted state loads and before onWake. Use for repeatable schema migrations.\",\n\t\t\t),\n\t\tonWake: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor wakes up and is ready to receive connections and actions.\",\n\t\t\t),\n\t\tonSleep: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor is stopping or sleeping. Use to clean up resources.\",\n\t\t\t),\n\t\trun: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called after actor starts. Does not block startup. Use for background tasks like queue processing or tick loops. If it exits, the actor follows the normal idle sleep timeout once idle. If it throws, the actor logs the error and then follows the normal idle sleep timeout once idle.\",\n\t\t\t),\n\t\tonStateChange: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor's state changes. State changes within this hook won't trigger recursion.\",\n\t\t\t),\n\t\tonBeforeConnect: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called before a client connects. Throw an error to reject the connection. The pending connection is not visible in c.conns while this runs.\",\n\t\t\t),\n\t\tonConnect: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when a client successfully connects. The connection is visible in c.conns before this runs.\",\n\t\t\t),\n\t\tonDisconnect: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Called when a client disconnects.\"),\n\t\tonBeforeActionResponse: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called before sending an action response. Use to transform output.\",\n\t\t\t),\n\t\tonRequest: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called for raw HTTP requests to /actors/{name}/http/* endpoints.\",\n\t\t\t),\n\t\tonWebSocket: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called for raw WebSocket connections to /actors/{name}/websocket/* endpoints.\",\n\t\t\t),\n\t\tactions: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Map of action name to handler function. Defaults to an empty object.\",\n\t\t\t),\n\t\tactionInputSchemas: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Optional schema map for validating action argument tuples in native runtimes.\",\n\t\t\t),\n\t\tconnParamsSchema: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Optional schema for validating connection params in native runtimes.\",\n\t\t\t),\n\t\tevents: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\"Map of event names to schemas.\"),\n\t\tqueues: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\"Map of queue names to schemas.\"),\n\t\toptions: DocActorOptionsSchema.optional(),\n\t})\n\t.describe(\"Actor configuration passed to the actor() function.\");\n"]}