rivetkit 2.3.3 → 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-34P567PO.cjs → chunk-4XKED5P5.cjs} +145 -176
  14. package/dist/tsup/chunk-4XKED5P5.cjs.map +1 -0
  15. package/dist/tsup/{chunk-PYO2U53V.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-BLDO2FKO.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-CXRPENO3.js → chunk-GAV4PKFT.js} +15 -46
  24. package/dist/tsup/{chunk-CXRPENO3.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-YUEC5SEY.cjs → chunk-M3FCXL3Q.cjs} +3 -3
  28. package/dist/tsup/{chunk-YUEC5SEY.cjs.map → chunk-M3FCXL3Q.cjs.map} +1 -1
  29. package/dist/tsup/{chunk-KEKWJECX.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-DFA7SYSW.js → chunk-NIC3QLKL.js} +3 -3
  33. package/dist/tsup/{chunk-BZM4PMFS.js → chunk-P4OGQ4JL.js} +5 -7
  34. package/dist/tsup/{chunk-BZM4PMFS.js.map → chunk-P4OGQ4JL.js.map} +1 -1
  35. package/dist/tsup/{chunk-NT2NK3VT.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-TYLP3U4Y.cjs → chunk-TNIWIUNV.cjs} +9 -11
  39. package/dist/tsup/chunk-TNIWIUNV.cjs.map +1 -0
  40. package/dist/tsup/{chunk-S644FL73.cjs → chunk-TR5NLR5V.cjs} +4 -4
  41. package/dist/tsup/{chunk-S644FL73.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-X63ROSOG.cjs → chunk-UJ2FQY63.cjs} +7 -7
  45. package/dist/tsup/{chunk-X63ROSOG.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-34P567PO.cjs.map +0 -1
  144. package/dist/tsup/chunk-3MHDOUD7.cjs.map +0 -1
  145. package/dist/tsup/chunk-APW73HCH.cjs +0 -382
  146. package/dist/tsup/chunk-APW73HCH.cjs.map +0 -1
  147. package/dist/tsup/chunk-BLDO2FKO.js.map +0 -1
  148. package/dist/tsup/chunk-DHXWD4DF.js +0 -382
  149. package/dist/tsup/chunk-DHXWD4DF.js.map +0 -1
  150. package/dist/tsup/chunk-JZ7TWV65.js.map +0 -1
  151. package/dist/tsup/chunk-PYO2U53V.cjs.map +0 -1
  152. package/dist/tsup/chunk-TYLP3U4Y.cjs.map +0 -1
  153. package/dist/tsup/chunk-VE2X4KMG.cjs.map +0 -1
  154. package/dist/tsup/chunk-XIX5DOZN.js.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-KEKWJECX.js.map → chunk-MGTSVSUC.js.map} +0 -0
  160. /package/dist/tsup/{chunk-DFA7SYSW.js.map → chunk-NIC3QLKL.js.map} +0 -0
  161. /package/dist/tsup/{chunk-NT2NK3VT.js.map → chunk-PAG6G46L.js.map} +0 -0
package/src/db/drizzle.ts CHANGED
@@ -8,8 +8,15 @@ import type {
8
8
  DatabaseProviderContext,
9
9
  RawAccess,
10
10
  SqliteDatabase,
11
+ SqliteTransactionDatabase,
11
12
  } from "@/common/database/config";
12
- import { toSqliteBindings } from "@/common/database/shared";
13
+ import { getLogger } from "@/common/log";
14
+ import {
15
+ isManualTransactionControl,
16
+ MIGRATION_TRANSACTION_TIMEOUT_MS,
17
+ toSqliteBindings,
18
+ validateTransactionTimeout,
19
+ } from "@/common/database/shared";
13
20
  import { sha256Hex } from "@/utils/crypto";
14
21
 
15
22
  export type { SQLiteTable } from "drizzle-orm/sqlite-core";
@@ -28,8 +35,16 @@ export {
28
35
  } from "drizzle-orm/sqlite-core";
29
36
 
30
37
  type DrizzleSchema = Record<string, unknown>;
31
- type DrizzleDatabase<TSchema extends DrizzleSchema> =
32
- SqliteRemoteDatabase<TSchema> & RawAccess;
38
+ type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<
39
+ SqliteRemoteDatabase<TSchema>,
40
+ "transaction"
41
+ > &
42
+ Omit<RawAccess, "transaction"> & {
43
+ transaction: <T>(
44
+ callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T,
45
+ options?: { timeout?: number },
46
+ ) => Promise<T>;
47
+ };
33
48
 
34
49
  interface DrizzleMigrationJournalEntry {
35
50
  idx: number;
@@ -47,6 +62,7 @@ interface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {
47
62
  schema?: TSchema;
48
63
  migrations?: DrizzleMigrations;
49
64
  onMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;
65
+ warnOnManualTransactions?: boolean;
50
66
  }
51
67
 
52
68
  interface DrizzleKitConfig {
@@ -69,6 +85,7 @@ export function db<TSchema extends DrizzleSchema = Record<string, never>>({
69
85
  schema,
70
86
  migrations,
71
87
  onMigrate,
88
+ warnOnManualTransactions = true,
72
89
  }: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<
73
90
  DrizzleDatabase<TSchema>
74
91
  > {
@@ -90,6 +107,7 @@ export function db<TSchema extends DrizzleSchema = Record<string, never>>({
90
107
 
91
108
  const nativeDb = await nativeDatabaseProvider.open(ctx.actorId);
92
109
  let closed = false;
110
+ let manualTransactionWarned = false;
93
111
  const ensureOpen = () => {
94
112
  if (closed) {
95
113
  throw new Error(
@@ -98,107 +116,178 @@ export function db<TSchema extends DrizzleSchema = Record<string, never>>({
98
116
  }
99
117
  };
100
118
 
101
- const runSql = async (
102
- query: string,
103
- params: unknown[],
104
- method: "run" | "all" | "values" | "get",
105
- ) => {
106
- ensureOpen();
119
+ const createDrizzleClient = (
120
+ target: SqliteDatabase | SqliteTransactionDatabase,
121
+ transactionScoped = false,
122
+ ): DrizzleDatabase<TSchema> => {
123
+ const runSql = async (
124
+ query: string,
125
+ params: unknown[],
126
+ method: "run" | "all" | "values" | "get",
127
+ ) => {
128
+ ensureOpen();
129
+ warnForManualTransaction(query, transactionScoped);
107
130
 
108
- const start = performance.now();
109
- const kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;
110
- const kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;
111
- try {
112
- const { rows } = await nativeDb.execute(
131
+ const start = performance.now();
132
+ const kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;
133
+ const kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;
134
+ try {
135
+ const { rows } = await target.execute(
136
+ query,
137
+ toSqliteBindings(params),
138
+ );
139
+ if (method === "run") {
140
+ return { rows: [] };
141
+ }
142
+ if (method === "get") {
143
+ return { rows: rows[0] };
144
+ }
145
+ return { rows };
146
+ } finally {
147
+ const durationMs = performance.now() - start;
148
+ ctx.metrics?.trackSql(query, durationMs);
149
+ if (ctx.metrics) {
150
+ ctx.log?.debug({
151
+ msg: "sql query",
152
+ query: query.slice(0, 120),
153
+ durationMs,
154
+ kvReads:
155
+ ctx.metrics.totalKvReads - kvReadsBefore,
156
+ kvWrites:
157
+ ctx.metrics.totalKvWrites - kvWritesBefore,
158
+ });
159
+ }
160
+ }
161
+ };
162
+
163
+ const callback: RemoteCallback = async (
164
+ query,
165
+ params,
166
+ method,
167
+ ) => {
168
+ return await runSql(query, params, method);
169
+ };
170
+
171
+ const drizzleDb = drizzle(callback, {
172
+ schema,
173
+ }) as unknown as DrizzleDatabase<TSchema>;
174
+ drizzleDb.execute = async <
175
+ TRow extends Record<string, unknown> = Record<
176
+ string,
177
+ unknown
178
+ >,
179
+ >(
180
+ query: string,
181
+ ...args: unknown[]
182
+ ): Promise<TRow[]> => {
183
+ return await executeRaw<TRow>(
184
+ target,
185
+ ctx,
186
+ ensureOpen,
113
187
  query,
114
- toSqliteBindings(params),
188
+ args,
189
+ () =>
190
+ warnForManualTransaction(query, transactionScoped),
115
191
  );
116
- if (method === "run") {
117
- return { rows: [] };
118
- }
119
- if (method === "get") {
120
- return { rows: rows[0] };
192
+ };
193
+ drizzleDb.transaction = async <T>(
194
+ transactionCallback: (
195
+ tx: DrizzleDatabase<TSchema>,
196
+ ) => Promise<T> | T,
197
+ options?: { timeout?: number },
198
+ ): Promise<T> => {
199
+ validateTransactionTimeout(options?.timeout);
200
+ const transaction = await nativeDb.beginTransaction(
201
+ options?.timeout,
202
+ );
203
+ const tx = createDrizzleClient(transaction, true);
204
+ try {
205
+ const result = await transactionCallback(tx);
206
+ await transaction.commit();
207
+ return result;
208
+ } catch (error) {
209
+ try {
210
+ await transaction.rollback();
211
+ } catch {
212
+ // Preserve the callback or commit error after expiry cleanup.
213
+ }
214
+ throw error;
121
215
  }
122
- return { rows };
123
- } finally {
124
- const durationMs = performance.now() - start;
125
- ctx.metrics?.trackSql(query, durationMs);
126
- if (ctx.metrics) {
127
- ctx.log?.debug({
128
- msg: "sql query",
129
- query: query.slice(0, 120),
130
- durationMs,
131
- kvReads: ctx.metrics.totalKvReads - kvReadsBefore,
132
- kvWrites:
133
- ctx.metrics.totalKvWrites - kvWritesBefore,
134
- });
216
+ };
217
+ drizzleDb.close = async () => {
218
+ if (!closed) {
219
+ closed = true;
220
+ await nativeDb.close();
135
221
  }
136
- }
137
- };
222
+ };
138
223
 
139
- const callback: RemoteCallback = async (query, params, method) => {
140
- return await runSql(query, params, method);
224
+ return drizzleDb;
141
225
  };
142
226
 
143
- const drizzleDb = drizzle(callback, {
144
- schema,
145
- }) as DrizzleDatabase<TSchema>;
146
- drizzleDb.execute = async <
147
- TRow extends Record<string, unknown> = Record<string, unknown>,
148
- >(
227
+ const warnForManualTransaction = (
149
228
  query: string,
150
- ...args: unknown[]
151
- ): Promise<TRow[]> => {
152
- return await executeRaw<TRow>(
153
- nativeDb,
154
- ctx,
155
- ensureOpen,
156
- query,
157
- args,
158
- );
159
- };
160
- drizzleDb.close = async () => {
161
- if (!closed) {
162
- closed = true;
163
- await nativeDb.close();
229
+ transactionScoped: boolean,
230
+ ) => {
231
+ if (
232
+ transactionScoped ||
233
+ !warnOnManualTransactions ||
234
+ manualTransactionWarned ||
235
+ hasMultipleStatements(query) ||
236
+ !isManualTransactionControl(query)
237
+ ) {
238
+ return;
164
239
  }
240
+ manualTransactionWarned = true;
241
+ getLogger("database").warn(
242
+ { actorId: ctx.actorId },
243
+ "Manual cross-call SQLite transactions can interleave with other actor work. Use db.transaction() for coordinated transactions. Set warnOnManualTransactions: false in your db(...) configuration to disable this warning.",
244
+ );
165
245
  };
166
246
 
167
- return drizzleDb;
247
+ return createDrizzleClient(nativeDb);
168
248
  },
169
249
  onMigrate: async (client) => {
170
250
  if (!migrations && !onMigrate) {
171
251
  return;
172
252
  }
173
- await withMigrationSavepoint(client, async () => {
253
+ await withMigrationSavepoint(client, async (leased) => {
174
254
  if (migrations) {
175
- await runMigrations(client, migrations);
255
+ await runMigrations(leased, migrations);
176
256
  }
177
257
  if (onMigrate) {
178
- await onMigrate(client);
258
+ await onMigrate(leased);
179
259
  }
180
260
  });
181
261
  },
182
262
  };
183
263
  }
184
264
 
185
- async function withMigrationSavepoint<T>(
186
- client: RawAccess,
187
- callback: () => Promise<T> | T,
265
+ async function withMigrationSavepoint<TSchema extends DrizzleSchema, T>(
266
+ client: DrizzleDatabase<TSchema>,
267
+ callback: (leased: DrizzleDatabase<TSchema>) => Promise<T> | T,
188
268
  ): Promise<T> {
189
- await client.execute("SAVEPOINT __rivet_on_migrate");
190
- try {
191
- const result = await callback();
192
- await client.execute("RELEASE SAVEPOINT __rivet_on_migrate");
193
- return result;
194
- } catch (error) {
195
- try {
196
- await client.execute("ROLLBACK TO SAVEPOINT __rivet_on_migrate");
197
- } finally {
198
- await client.execute("RELEASE SAVEPOINT __rivet_on_migrate");
199
- }
200
- throw error;
201
- }
269
+ return await client.transaction(
270
+ async (leased) => {
271
+ await leased.execute("SAVEPOINT __rivet_on_migrate");
272
+ try {
273
+ const result = await callback(leased);
274
+ await leased.execute("RELEASE SAVEPOINT __rivet_on_migrate");
275
+ return result;
276
+ } catch (error) {
277
+ try {
278
+ await leased.execute(
279
+ "ROLLBACK TO SAVEPOINT __rivet_on_migrate",
280
+ );
281
+ } finally {
282
+ await leased.execute(
283
+ "RELEASE SAVEPOINT __rivet_on_migrate",
284
+ );
285
+ }
286
+ throw error;
287
+ }
288
+ },
289
+ { timeout: MIGRATION_TRANSACTION_TIMEOUT_MS },
290
+ );
202
291
  }
203
292
 
204
293
  async function runMigrations<TSchema extends DrizzleSchema>(
@@ -281,13 +370,15 @@ function rowToObject<TRow extends Record<string, unknown>>(
281
370
  }
282
371
 
283
372
  async function executeRaw<TRow extends Record<string, unknown>>(
284
- db: SqliteDatabase,
373
+ db: SqliteDatabase | SqliteTransactionDatabase,
285
374
  ctx: DatabaseProviderContext,
286
375
  ensureOpen: () => void,
287
376
  query: string,
288
377
  args: unknown[],
378
+ warnForManualTransaction: () => void,
289
379
  ): Promise<TRow[]> {
290
380
  ensureOpen();
381
+ warnForManualTransaction();
291
382
 
292
383
  const start = performance.now();
293
384
  const kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;
@@ -302,7 +393,7 @@ async function executeRaw<TRow extends Record<string, unknown>>(
302
393
  }
303
394
 
304
395
  if (!hasMultipleStatements(query)) {
305
- const { rows, columns } = await db.execute(query);
396
+ const { rows, columns } = await db.execute(query, undefined);
306
397
  return rows.map((row) => rowToObject<TRow>(row, columns));
307
398
  }
308
399
 
@@ -1,4 +1,3 @@
1
- import type { ActorDriver } from "@/actor/driver";
2
1
  import type { Client } from "@/client/client";
3
2
  import type { RegistryConfig } from "@/registry/config";
4
3
  import type { DynamicActorLoader } from "./internal";
@@ -10,7 +9,6 @@ export interface DynamicActorIsolateRuntimeConfig {
10
9
  input: unknown;
11
10
  region: string;
12
11
  loader: DynamicActorLoader;
13
- actorDriver: ActorDriver;
14
12
  inlineClient: Client<any>;
15
13
  test: RegistryConfig["test"];
16
14
  }
@@ -61,21 +61,6 @@ export interface EngineControlClient {
61
61
  * Test-only helper that simulates an abrupt actor crash.
62
62
  */
63
63
  hardCrashActor?(actorId: string): Promise<void>;
64
- kvGet(actorId: string, key: Uint8Array): Promise<string | null>;
65
- kvBatchGet(
66
- actorId: string,
67
- keys: Uint8Array[],
68
- ): Promise<(Uint8Array | null)[]>;
69
- kvBatchPut(
70
- actorId: string,
71
- entries: [Uint8Array, Uint8Array][],
72
- ): Promise<void>;
73
- kvBatchDelete(actorId: string, keys: Uint8Array[]): Promise<void>;
74
- kvDeleteRange(
75
- actorId: string,
76
- start: Uint8Array,
77
- end: Uint8Array,
78
- ): Promise<void>;
79
64
  }
80
65
 
81
66
  export interface RuntimeDisplayInformation {
@@ -40,7 +40,6 @@ import {
40
40
  getActor,
41
41
  getActorByKey,
42
42
  getOrCreateActor,
43
- kvGet,
44
43
  listActorsByName,
45
44
  } from "./api-endpoints";
46
45
  import { EngineApiError, getEndpoint } from "./api-utils";
@@ -372,46 +371,6 @@ export class RemoteEngineControlClient implements EngineControlClient {
372
371
  return await upgradeWebSocket(() => args)(c, noopNext());
373
372
  }
374
373
 
375
- async kvGet(actorId: string, key: Uint8Array): Promise<string | null> {
376
- await this.#metadataPromise;
377
-
378
- logger().debug({ msg: "getting kv value via engine api", key });
379
-
380
- const response = await kvGet(
381
- this.#config,
382
- actorId,
383
- new TextDecoder("utf8").decode(key),
384
- );
385
-
386
- return response.value;
387
- }
388
-
389
- async kvBatchGet(
390
- _actorId: string,
391
- _keys: Uint8Array[],
392
- ): Promise<(Uint8Array | null)[]> {
393
- throw new Error("kvBatchGet not supported on remote engine client");
394
- }
395
-
396
- async kvBatchPut(
397
- _actorId: string,
398
- _entries: [Uint8Array, Uint8Array][],
399
- ): Promise<void> {
400
- throw new Error("kvBatchPut not supported on remote engine client");
401
- }
402
-
403
- async kvBatchDelete(_actorId: string, _keys: Uint8Array[]): Promise<void> {
404
- throw new Error("kvBatchDelete not supported on remote engine client");
405
- }
406
-
407
- async kvDeleteRange(
408
- _actorId: string,
409
- _start: Uint8Array,
410
- _end: Uint8Array,
411
- ): Promise<void> {
412
- throw new Error("kvDeleteRange not supported on remote engine client");
413
- }
414
-
415
374
  displayInformation(): RuntimeDisplayInformation {
416
375
  return { properties: {} };
417
376
  }
@@ -4,22 +4,24 @@ import * as v2 from "@/common/bare/generated/inspector/v2";
4
4
  import * as v3 from "@/common/bare/generated/inspector/v3";
5
5
  import * as v4 from "@/common/bare/generated/inspector/v4";
6
6
  import * as v5 from "@/common/bare/generated/inspector/v5";
7
+ import * as v6 from "@/common/bare/generated/inspector/v6";
7
8
  import {
8
9
  decodeWorkflowHistoryTransport,
9
10
  encodeWorkflowHistoryTransport,
10
11
  } from "@/common/inspector-transport";
11
12
 
12
- export * from "@/common/bare/generated/inspector/v5";
13
+ export * from "@/common/bare/generated/inspector/v6";
13
14
  export { decodeWorkflowHistoryTransport, encodeWorkflowHistoryTransport };
14
15
  export type { WorkflowHistory as TransportWorkflowHistory } from "@/common/bare/transport/v1";
15
16
 
16
- export const CURRENT_VERSION = 5;
17
+ export const CURRENT_VERSION = 6;
17
18
 
18
19
  const EVENTS_DROPPED_ERROR = "inspector.events_dropped";
19
20
  const WORKFLOW_HISTORY_DROPPED_ERROR = "inspector.workflow_history_dropped";
20
21
  const QUEUE_DROPPED_ERROR = "inspector.queue_dropped";
21
22
  const TRACE_DROPPED_ERROR = "inspector.trace_dropped";
22
23
  const DATABASE_DROPPED_ERROR = "inspector.database_dropped";
24
+ const SCHEDULES_DROPPED_ERROR = "inspector.schedules_dropped";
23
25
 
24
26
  const v1ToClientToV2 = (v1Data: v1.ToClient): v2.ToClient => {
25
27
  if (v1Data.body.tag === "Init") {
@@ -187,12 +189,59 @@ const v5ToClientToV4 = (v5Data: v5.ToClient): v4.ToClient => {
187
189
  return v5Data as unknown as v4.ToClient;
188
190
  };
189
191
 
192
+ const v5ToClientToV6 = (v5Data: v5.ToClient): v6.ToClient => {
193
+ if (v5Data.body.tag === "Init") {
194
+ return {
195
+ body: {
196
+ tag: "Init",
197
+ val: { ...v5Data.body.val, schedules: [] },
198
+ },
199
+ };
200
+ }
201
+ return v5Data as unknown as v6.ToClient;
202
+ };
203
+
204
+ const v6ToClientToV5 = (v6Data: v6.ToClient): v5.ToClient => {
205
+ if (v6Data.body.tag === "Init") {
206
+ const { schedules: _schedules, ...rest } = v6Data.body.val;
207
+ return { body: { tag: "Init", val: rest } };
208
+ }
209
+ if (
210
+ v6Data.body.tag === "SchedulesUpdated" ||
211
+ v6Data.body.tag === "SchedulesResponse" ||
212
+ v6Data.body.tag === "ScheduleHistoryResponse" ||
213
+ v6Data.body.tag === "ScheduleDeleteResponse"
214
+ ) {
215
+ return {
216
+ body: {
217
+ tag: "Error",
218
+ val: { message: SCHEDULES_DROPPED_ERROR },
219
+ },
220
+ };
221
+ }
222
+ return v6Data as unknown as v5.ToClient;
223
+ };
224
+
190
225
  const v4ToServerToV5 = (v4Data: v4.ToServer): v5.ToServer =>
191
226
  v4Data as unknown as v5.ToServer;
192
227
 
193
228
  const v5ToServerToV4 = (v5Data: v5.ToServer): v4.ToServer =>
194
229
  v5Data as unknown as v4.ToServer;
195
230
 
231
+ const v5ToServerToV6 = (v5Data: v5.ToServer): v6.ToServer =>
232
+ v5Data as unknown as v6.ToServer;
233
+
234
+ const v6ToServerToV5 = (v6Data: v6.ToServer): v5.ToServer => {
235
+ if (
236
+ v6Data.body.tag === "SchedulesRequest" ||
237
+ v6Data.body.tag === "ScheduleHistoryRequest" ||
238
+ v6Data.body.tag === "ScheduleDeleteRequest"
239
+ ) {
240
+ throw new Error("Cannot convert v6-only schedule requests to v5");
241
+ }
242
+ return v6Data as unknown as v5.ToServer;
243
+ };
244
+
196
245
  const v1ToServerToV2 = (v1Data: v1.ToServer): v2.ToServer => {
197
246
  if (
198
247
  v1Data.body.tag === "EventsRequest" ||
@@ -243,7 +292,7 @@ const v4ToServerToV3 = (v4Data: v4.ToServer): v3.ToServer => {
243
292
  return v4Data as unknown as v3.ToServer;
244
293
  };
245
294
 
246
- export const TO_SERVER_VERSIONED = createVersionedDataHandler<v5.ToServer>({
295
+ export const TO_SERVER_VERSIONED = createVersionedDataHandler<v6.ToServer>({
247
296
  serializeVersion: (data, version) => {
248
297
  switch (version) {
249
298
  case 1:
@@ -255,7 +304,9 @@ export const TO_SERVER_VERSIONED = createVersionedDataHandler<v5.ToServer>({
255
304
  case 4:
256
305
  return v4.encodeToServer(data as unknown as v4.ToServer);
257
306
  case 5:
258
- return v5.encodeToServer(data);
307
+ return v5.encodeToServer(data as unknown as v5.ToServer);
308
+ case 6:
309
+ return v6.encodeToServer(data);
259
310
  default:
260
311
  throw new Error(`Unknown version ${version}`);
261
312
  }
@@ -271,7 +322,9 @@ export const TO_SERVER_VERSIONED = createVersionedDataHandler<v5.ToServer>({
271
322
  case 4:
272
323
  return v4.decodeToServer(bytes) as unknown as v5.ToServer;
273
324
  case 5:
274
- return v5.decodeToServer(bytes);
325
+ return v5.decodeToServer(bytes) as unknown as v6.ToServer;
326
+ case 6:
327
+ return v6.decodeToServer(bytes);
275
328
  default:
276
329
  throw new Error(`Unknown version ${version}`);
277
330
  }
@@ -281,8 +334,10 @@ export const TO_SERVER_VERSIONED = createVersionedDataHandler<v5.ToServer>({
281
334
  v2ToServerToV3,
282
335
  v3ToServerToV4,
283
336
  v4ToServerToV5,
337
+ v5ToServerToV6,
284
338
  ],
285
339
  serializeConverters: () => [
340
+ v6ToServerToV5,
286
341
  v5ToServerToV4,
287
342
  v4ToServerToV3,
288
343
  v3ToServerToV2,
@@ -290,7 +345,7 @@ export const TO_SERVER_VERSIONED = createVersionedDataHandler<v5.ToServer>({
290
345
  ],
291
346
  });
292
347
 
293
- export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v5.ToClient>({
348
+ export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v6.ToClient>({
294
349
  serializeVersion: (data, version) => {
295
350
  switch (version) {
296
351
  case 1:
@@ -302,7 +357,9 @@ export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v5.ToClient>({
302
357
  case 4:
303
358
  return v4.encodeToClient(data as unknown as v4.ToClient);
304
359
  case 5:
305
- return v5.encodeToClient(data);
360
+ return v5.encodeToClient(data as unknown as v5.ToClient);
361
+ case 6:
362
+ return v6.encodeToClient(data);
306
363
  default:
307
364
  throw new Error(`Unknown version ${version}`);
308
365
  }
@@ -318,7 +375,9 @@ export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v5.ToClient>({
318
375
  case 4:
319
376
  return v4.decodeToClient(bytes) as unknown as v5.ToClient;
320
377
  case 5:
321
- return v5.decodeToClient(bytes);
378
+ return v5.decodeToClient(bytes) as unknown as v6.ToClient;
379
+ case 6:
380
+ return v6.decodeToClient(bytes);
322
381
  default:
323
382
  throw new Error(`Unknown version ${version}`);
324
383
  }
@@ -328,8 +387,10 @@ export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v5.ToClient>({
328
387
  v2ToClientToV3,
329
388
  v3ToClientToV4,
330
389
  v4ToClientToV5,
390
+ v5ToClientToV6,
331
391
  ],
332
392
  serializeConverters: () => [
393
+ v6ToClientToV5,
333
394
  v5ToClientToV4,
334
395
  v4ToClientToV3,
335
396
  v3ToClientToV2,
@@ -69,6 +69,7 @@ export type BuiltinInspectorTabId =
69
69
  | "database"
70
70
  | "state"
71
71
  | "queue"
72
+ | "schedules"
72
73
  | "connections"
73
74
  | "console";
74
75
 
@@ -1,15 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { getRunMetadata } from "@/actor/config";
3
- import type {
4
- AnyActorDefinition,
5
- BaseActorDefinition,
6
- } from "@/actor/definition";
7
- import {
8
- KEYS,
9
- queueMessagesPrefix,
10
- queueMetadataKey,
11
- workflowStoragePrefix,
12
- } from "@/actor/keys";
3
+ import type { AnyActorDefinition } from "@/actor/definition";
13
4
  import { buildEngineEndpoint, ENGINE_HOST, ENGINE_PORT } from "@/common/engine";
14
5
  import { type Logger, LogLevelSchema } from "@/common/log";
15
6
  import { VERSION } from "@/utils";
@@ -440,31 +431,6 @@ export function buildActorNames(
440
431
  // Actor options take precedence over run metadata
441
432
  metadata.icon = options.icon ?? runMeta.icon;
442
433
  metadata.name = options.name ?? runMeta.name;
443
- metadata.preload = {
444
- keys: [
445
- Array.from(KEYS.PERSIST_DATA),
446
- Array.from(KEYS.INSPECTOR_TOKEN),
447
- Array.from(queueMetadataKey()),
448
- Array.from(KEYS.LAST_PUSHED_ALARM),
449
- ],
450
- prefixes: [
451
- {
452
- prefix: Array.from(workflowStoragePrefix()),
453
- maxBytes: options.preloadMaxWorkflowBytes ?? 131_072,
454
- partial: false,
455
- },
456
- {
457
- prefix: Array.from(KEYS.CONN_PREFIX),
458
- maxBytes: options.preloadMaxConnectionsBytes ?? 65_536,
459
- partial: false,
460
- },
461
- {
462
- prefix: Array.from(queueMessagesPrefix()),
463
- maxBytes: 65_536,
464
- partial: false,
465
- },
466
- ],
467
- };
468
434
  // Remove undefined values
469
435
  if (!metadata.icon) delete metadata.icon;
470
436
  if (!metadata.name) delete metadata.name;