@giselles-ai/sandkit 0.1.0

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 (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +163 -0
  3. package/dist/adapters/drizzle.d.ts +83 -0
  4. package/dist/adapters/drizzle.js +9 -0
  5. package/dist/adapters/drizzle.js.map +1 -0
  6. package/dist/adapters/memory.d.ts +6 -0
  7. package/dist/adapters/memory.js +8 -0
  8. package/dist/adapters/memory.js.map +1 -0
  9. package/dist/adapters/sqlite-bun.d.ts +7 -0
  10. package/dist/adapters/sqlite-bun.js +8 -0
  11. package/dist/adapters/sqlite-bun.js.map +1 -0
  12. package/dist/bin.js +697 -0
  13. package/dist/bin.js.map +1 -0
  14. package/dist/chunk-7DLK7LOM.js +44 -0
  15. package/dist/chunk-7DLK7LOM.js.map +1 -0
  16. package/dist/chunk-BDPTYR6V.js +407 -0
  17. package/dist/chunk-BDPTYR6V.js.map +1 -0
  18. package/dist/chunk-CSOBTLWV.js +202 -0
  19. package/dist/chunk-CSOBTLWV.js.map +1 -0
  20. package/dist/chunk-DLGUA3H7.js +9 -0
  21. package/dist/chunk-DLGUA3H7.js.map +1 -0
  22. package/dist/chunk-FSDVHEEX.js +45 -0
  23. package/dist/chunk-FSDVHEEX.js.map +1 -0
  24. package/dist/chunk-HVYCAAZQ.js +25 -0
  25. package/dist/chunk-HVYCAAZQ.js.map +1 -0
  26. package/dist/chunk-LC3IYBAL.js +100 -0
  27. package/dist/chunk-LC3IYBAL.js.map +1 -0
  28. package/dist/chunk-REGOUXVI.js +58 -0
  29. package/dist/chunk-REGOUXVI.js.map +1 -0
  30. package/dist/chunk-RMMOQD5Y.js +211 -0
  31. package/dist/chunk-RMMOQD5Y.js.map +1 -0
  32. package/dist/chunk-UDFWES6J.js +486 -0
  33. package/dist/chunk-UDFWES6J.js.map +1 -0
  34. package/dist/chunk-VISDS5T7.js +202 -0
  35. package/dist/chunk-VISDS5T7.js.map +1 -0
  36. package/dist/chunk-XM4HGRXW.js +37 -0
  37. package/dist/chunk-XM4HGRXW.js.map +1 -0
  38. package/dist/cli/index.d.ts +19 -0
  39. package/dist/cli/index.js +397 -0
  40. package/dist/cli/index.js.map +1 -0
  41. package/dist/index.d.ts +78 -0
  42. package/dist/index.js +1102 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/integrations/mock.d.ts +19 -0
  45. package/dist/integrations/mock.js +207 -0
  46. package/dist/integrations/mock.js.map +1 -0
  47. package/dist/integrations/vercel.d.ts +7 -0
  48. package/dist/integrations/vercel.js +400 -0
  49. package/dist/integrations/vercel.js.map +1 -0
  50. package/dist/policies/ai-gateway.d.ts +15 -0
  51. package/dist/policies/ai-gateway.js +12 -0
  52. package/dist/policies/ai-gateway.js.map +1 -0
  53. package/dist/policies/codex.d.ts +10 -0
  54. package/dist/policies/codex.js +12 -0
  55. package/dist/policies/codex.js.map +1 -0
  56. package/dist/policies/gemini.d.ts +10 -0
  57. package/dist/policies/gemini.js +12 -0
  58. package/dist/policies/gemini.js.map +1 -0
  59. package/dist/schema/index.d.ts +60 -0
  60. package/dist/schema/index.js +31 -0
  61. package/dist/schema/index.js.map +1 -0
  62. package/dist/types-BCgprbo8.d.ts +47 -0
  63. package/dist/types-BEKQnjeb.d.ts +139 -0
  64. package/dist/types-Cy36bS1j.d.ts +138 -0
  65. package/package.json +126 -0
@@ -0,0 +1,486 @@
1
+ import {
2
+ createId
3
+ } from "./chunk-DLGUA3H7.js";
4
+
5
+ // src/adapters/sqlite-bun.ts
6
+ var workspaceStatuses = /* @__PURE__ */ new Set(["active", "inactive", "archived"]);
7
+ var runStatuses = /* @__PURE__ */ new Set(["started", "succeeded", "failed"]);
8
+ function corruptionError(table, column, reason) {
9
+ return new Error(`Sandkit durable state corruption in ${table}.${column}: ${reason}`);
10
+ }
11
+ function toJsonString(value) {
12
+ return JSON.stringify(value);
13
+ }
14
+ function parseJsonColumn(table, column, value) {
15
+ try {
16
+ return JSON.parse(value);
17
+ } catch (error) {
18
+ throw corruptionError(table, column, error instanceof Error ? error.message : "invalid JSON");
19
+ }
20
+ }
21
+ function readWorkspaceStatus(value) {
22
+ if (workspaceStatuses.has(value)) {
23
+ return value;
24
+ }
25
+ throw corruptionError("sandkit_workspaces", "status", `unexpected value "${value}"`);
26
+ }
27
+ function readRunStatus(value) {
28
+ if (runStatuses.has(value)) {
29
+ return value;
30
+ }
31
+ throw corruptionError("sandkit_runs", "status", `unexpected value "${value}"`);
32
+ }
33
+ function readRunArgs(value) {
34
+ if (value === null) {
35
+ return void 0;
36
+ }
37
+ const parsed = parseJsonColumn("sandkit_runs", "args", value);
38
+ if (Array.isArray(parsed) && parsed.every((entry) => typeof entry === "string")) {
39
+ return parsed;
40
+ }
41
+ throw corruptionError("sandkit_runs", "args", "expected JSON string array");
42
+ }
43
+ function readProviderCommit(value) {
44
+ if (value === null) {
45
+ return void 0;
46
+ }
47
+ return parseJsonColumn("sandkit_runs", "provider_commit", value);
48
+ }
49
+ function readWorkspaceSetupState(value) {
50
+ const parsed = parseJsonColumn("sandkit_setup_states", "state", value);
51
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
52
+ const candidate = parsed;
53
+ if (typeof candidate.kind === "string" && typeof candidate.sessionId === "string") {
54
+ return {
55
+ kind: candidate.kind,
56
+ sessionId: candidate.sessionId,
57
+ state: candidate.state
58
+ };
59
+ }
60
+ }
61
+ throw corruptionError("sandkit_setup_states", "state", "expected persisted sandbox state object");
62
+ }
63
+ function toRunRecord(row) {
64
+ return {
65
+ id: row.id,
66
+ workspaceId: row.workspace_id,
67
+ provider: row.provider,
68
+ executionTargetId: row.execution_target_id,
69
+ command: row.command,
70
+ args: readRunArgs(row.args),
71
+ status: readRunStatus(row.status),
72
+ exitCode: row.exit_code ?? void 0,
73
+ stdout: row.stdout ?? void 0,
74
+ stderr: row.stderr ?? void 0,
75
+ startedAt: row.started_at,
76
+ finishedAt: row.finished_at ?? void 0,
77
+ policySnapshotId: row.policy_snapshot_id ?? void 0,
78
+ providerCommit: readProviderCommit(row.provider_commit)
79
+ };
80
+ }
81
+ function createSqliteRunStore(db) {
82
+ return {
83
+ async createRun(input) {
84
+ const now = (/* @__PURE__ */ new Date()).toISOString();
85
+ const id = input.id && input.id.trim().length > 0 ? input.id.trim() : createId("run");
86
+ const startedAt = input.startedAt ?? now;
87
+ db.query(
88
+ `
89
+ INSERT INTO sandkit_runs (
90
+ id,
91
+ workspace_id,
92
+ provider,
93
+ execution_target_id,
94
+ command,
95
+ args,
96
+ status,
97
+ policy_snapshot_id,
98
+ provider_commit,
99
+ started_at,
100
+ finished_at
101
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
102
+ `
103
+ ).run(
104
+ id,
105
+ input.workspaceId,
106
+ input.provider,
107
+ input.executionTargetId,
108
+ input.command,
109
+ input.args === null || input.args === void 0 ? null : toJsonString(input.args),
110
+ input.status ?? "started",
111
+ input.policySnapshotId ?? null,
112
+ null,
113
+ startedAt,
114
+ null
115
+ );
116
+ return {
117
+ id,
118
+ workspaceId: input.workspaceId,
119
+ provider: input.provider,
120
+ executionTargetId: input.executionTargetId,
121
+ command: input.command,
122
+ args: input.args ?? [],
123
+ status: input.status ?? "started",
124
+ startedAt,
125
+ policySnapshotId: input.policySnapshotId ?? void 0
126
+ };
127
+ },
128
+ async finishRun(id, input) {
129
+ const current = await getRun(db, id);
130
+ if (!current) {
131
+ throw new Error(`Run with id "${id}" does not exist`);
132
+ }
133
+ const next = {
134
+ ...current,
135
+ status: input.status,
136
+ finishedAt: input.finishedAt,
137
+ exitCode: input.exitCode ?? current.exitCode,
138
+ stdout: input.stdout ?? current.stdout,
139
+ stderr: input.stderr ?? current.stderr,
140
+ providerCommit: input.providerCommit ?? current.providerCommit
141
+ };
142
+ db.query(
143
+ `
144
+ UPDATE sandkit_runs
145
+ SET status = ?,
146
+ exit_code = ?,
147
+ stdout = ?,
148
+ stderr = ?,
149
+ finished_at = ?,
150
+ provider_commit = ?
151
+ WHERE id = ?
152
+ `
153
+ ).run(
154
+ next.status,
155
+ next.exitCode ?? null,
156
+ next.stdout ?? null,
157
+ next.stderr ?? null,
158
+ next.finishedAt ?? null,
159
+ next.providerCommit === void 0 ? null : toJsonString(next.providerCommit),
160
+ id
161
+ );
162
+ return next;
163
+ }
164
+ };
165
+ }
166
+ async function getRun(db, id) {
167
+ const row = db.query(
168
+ `
169
+ SELECT id,
170
+ workspace_id,
171
+ provider,
172
+ execution_target_id,
173
+ command,
174
+ args,
175
+ status,
176
+ policy_snapshot_id,
177
+ provider_commit,
178
+ exit_code,
179
+ stdout,
180
+ stderr,
181
+ started_at,
182
+ finished_at
183
+ FROM sandkit_runs
184
+ WHERE id = ?
185
+ LIMIT 1
186
+ `
187
+ ).get(id);
188
+ return row ? toRunRecord(row) : null;
189
+ }
190
+ function createPolicySnapshotStore(db) {
191
+ return {
192
+ async createPolicySnapshot(input) {
193
+ const now = (/* @__PURE__ */ new Date()).toISOString();
194
+ const id = input.id && input.id.trim().length > 0 ? input.id.trim() : createId("policy-snapshot");
195
+ db.query(
196
+ `
197
+ INSERT INTO sandkit_policies (
198
+ id,
199
+ workspace_id,
200
+ policy_id,
201
+ config,
202
+ created_at
203
+ ) VALUES (?, ?, ?, ?, ?)
204
+ `
205
+ ).run(
206
+ id,
207
+ input.workspaceId,
208
+ input.policyId,
209
+ toJsonString(input.config),
210
+ input.createdAt ?? now
211
+ );
212
+ return {
213
+ id,
214
+ workspaceId: input.workspaceId,
215
+ policyId: input.policyId,
216
+ config: input.config,
217
+ createdAt: input.createdAt ?? now
218
+ };
219
+ }
220
+ };
221
+ }
222
+ function createSqliteSetupStateStore(db) {
223
+ const getCreatedAt = async (id) => {
224
+ const row = db.query(
225
+ `
226
+ SELECT createdAt
227
+ FROM sandkit_setup_states
228
+ WHERE id = ?
229
+ LIMIT 1
230
+ `
231
+ ).get(id);
232
+ return row ? row.createdAt : null;
233
+ };
234
+ return {
235
+ async getSetupState(id) {
236
+ const row = db.query(
237
+ `
238
+ SELECT id, state, createdAt, updatedAt
239
+ FROM sandkit_setup_states
240
+ WHERE id = ?
241
+ LIMIT 1
242
+ `
243
+ ).get(id);
244
+ if (!row) {
245
+ return null;
246
+ }
247
+ const parsed = readWorkspaceSetupState(row.state);
248
+ return {
249
+ id: row.id,
250
+ state: parsed,
251
+ createdAt: row.createdAt,
252
+ updatedAt: row.updatedAt
253
+ };
254
+ },
255
+ async putSetupState(input) {
256
+ const now = (/* @__PURE__ */ new Date()).toISOString();
257
+ const existing = await getCreatedAt(input.id);
258
+ if (existing) {
259
+ db.query(
260
+ `
261
+ UPDATE sandkit_setup_states
262
+ SET state = ?, updatedAt = ?
263
+ WHERE id = ?
264
+ `
265
+ ).run(toJsonString(input.state), now, input.id);
266
+ return {
267
+ id: input.id,
268
+ state: input.state,
269
+ createdAt: existing,
270
+ updatedAt: now
271
+ };
272
+ }
273
+ db.query(
274
+ `
275
+ INSERT INTO sandkit_setup_states (id, state, createdAt, updatedAt)
276
+ VALUES (?, ?, ?, ?)
277
+ `
278
+ ).run(input.id, toJsonString(input.state), now, now);
279
+ return {
280
+ id: input.id,
281
+ state: input.state,
282
+ createdAt: now,
283
+ updatedAt: now
284
+ };
285
+ },
286
+ async deleteSetupState(id) {
287
+ db.query(`DELETE FROM sandkit_setup_states WHERE id = ?`).run(id);
288
+ }
289
+ };
290
+ }
291
+ var BunSqliteWorkspaceAdapter = class {
292
+ #db;
293
+ constructor(db) {
294
+ this.#db = db;
295
+ this.#migrate();
296
+ }
297
+ get id() {
298
+ return "sqlite-bun";
299
+ }
300
+ get workspaces() {
301
+ return {
302
+ createWorkspace: this.createWorkspace.bind(this),
303
+ getWorkspace: this.getWorkspace.bind(this),
304
+ updateWorkspace: this.updateWorkspace.bind(this)
305
+ };
306
+ }
307
+ get runs() {
308
+ return createSqliteRunStore(this.#db);
309
+ }
310
+ get policySnapshots() {
311
+ return createPolicySnapshotStore(this.#db);
312
+ }
313
+ get setupStates() {
314
+ return createSqliteSetupStateStore(this.#db);
315
+ }
316
+ async createWorkspace(input = {}) {
317
+ const now = (/* @__PURE__ */ new Date()).toISOString();
318
+ const id = input.id && input.id.trim().length > 0 ? input.id : createId("workspace");
319
+ this.#db.query(
320
+ `
321
+ INSERT INTO sandkit_workspaces (
322
+ id,
323
+ name,
324
+ metadata,
325
+ status,
326
+ sandboxId,
327
+ lastResumedAt,
328
+ createdAt,
329
+ updatedAt
330
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
331
+ `
332
+ ).run(
333
+ id,
334
+ input.name ?? "default",
335
+ input.metadata ? JSON.stringify(input.metadata) : null,
336
+ input.status ?? "active",
337
+ input.sandboxId ?? null,
338
+ input.lastResumedAt ?? null,
339
+ now,
340
+ now
341
+ );
342
+ return {
343
+ id,
344
+ name: input.name ?? "default",
345
+ metadata: input.metadata,
346
+ status: input.status ?? "active",
347
+ sandboxId: input.sandboxId ?? void 0,
348
+ lastResumedAt: input.lastResumedAt,
349
+ createdAt: now,
350
+ updatedAt: now
351
+ };
352
+ }
353
+ async getWorkspace(id) {
354
+ const row = this.#db.query(
355
+ `
356
+ SELECT id, name, metadata, status, sandboxId, lastResumedAt, createdAt, updatedAt
357
+ FROM sandkit_workspaces
358
+ WHERE id = ?
359
+ `
360
+ ).get(id);
361
+ if (!row) {
362
+ return null;
363
+ }
364
+ return this.#toRecord(row);
365
+ }
366
+ async updateWorkspace(id, input) {
367
+ const current = await this.getWorkspace(id);
368
+ if (!current) {
369
+ throw new Error(`Workspace with id "${id}" does not exist`);
370
+ }
371
+ const next = {
372
+ ...current,
373
+ name: input.name === void 0 ? current.name : input.name,
374
+ metadata: input.metadata === void 0 ? current.metadata : {
375
+ ...current.metadata,
376
+ ...input.metadata
377
+ },
378
+ status: input.status ?? current.status,
379
+ sandboxId: input.sandboxId === null ? void 0 : input.sandboxId ?? current.sandboxId,
380
+ lastResumedAt: input.lastResumedAt === null ? void 0 : input.lastResumedAt ?? current.lastResumedAt,
381
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
382
+ };
383
+ this.#db.query(
384
+ `
385
+ UPDATE sandkit_workspaces
386
+ SET name = ?,
387
+ metadata = ?,
388
+ status = ?,
389
+ sandboxId = ?,
390
+ lastResumedAt = ?,
391
+ updatedAt = ?
392
+ WHERE id = ?
393
+ `
394
+ ).run(
395
+ next.name ?? null,
396
+ next.metadata ? JSON.stringify(next.metadata) : null,
397
+ next.status,
398
+ next.sandboxId ?? null,
399
+ next.lastResumedAt ?? null,
400
+ next.updatedAt,
401
+ id
402
+ );
403
+ return next;
404
+ }
405
+ #toRecord(row) {
406
+ let metadata;
407
+ if (row.metadata !== null) {
408
+ const parsed = parseJsonColumn("sandkit_workspaces", "metadata", row.metadata);
409
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
410
+ metadata = parsed;
411
+ } else {
412
+ throw corruptionError("sandkit_workspaces", "metadata", "expected JSON object");
413
+ }
414
+ }
415
+ return {
416
+ id: row.id,
417
+ name: row.name ?? void 0,
418
+ metadata,
419
+ status: readWorkspaceStatus(row.status),
420
+ sandboxId: row.sandboxId ?? void 0,
421
+ lastResumedAt: row.lastResumedAt ?? void 0,
422
+ createdAt: row.createdAt,
423
+ updatedAt: row.updatedAt
424
+ };
425
+ }
426
+ #migrate() {
427
+ this.#db.run(`
428
+ CREATE TABLE IF NOT EXISTS sandkit_workspaces (
429
+ id TEXT PRIMARY KEY NOT NULL,
430
+ name TEXT,
431
+ metadata TEXT,
432
+ status TEXT NOT NULL,
433
+ sandboxId TEXT,
434
+ lastResumedAt TEXT,
435
+ createdAt TEXT NOT NULL,
436
+ updatedAt TEXT NOT NULL
437
+ )
438
+ `);
439
+ this.#db.run(`
440
+ CREATE TABLE IF NOT EXISTS sandkit_policies (
441
+ id TEXT PRIMARY KEY NOT NULL,
442
+ workspace_id TEXT NOT NULL,
443
+ policy_id TEXT NOT NULL,
444
+ config TEXT NOT NULL,
445
+ created_at TEXT NOT NULL,
446
+ FOREIGN KEY(workspace_id) REFERENCES sandkit_workspaces(id)
447
+ )
448
+ `);
449
+ this.#db.run(`
450
+ CREATE TABLE IF NOT EXISTS sandkit_setup_states (
451
+ id TEXT PRIMARY KEY NOT NULL,
452
+ state TEXT NOT NULL,
453
+ createdAt TEXT NOT NULL,
454
+ updatedAt TEXT NOT NULL
455
+ )
456
+ `);
457
+ this.#db.run(`
458
+ CREATE TABLE IF NOT EXISTS sandkit_runs (
459
+ id TEXT PRIMARY KEY NOT NULL,
460
+ workspace_id TEXT NOT NULL,
461
+ provider TEXT NOT NULL,
462
+ execution_target_id TEXT NOT NULL,
463
+ command TEXT NOT NULL,
464
+ args TEXT,
465
+ status TEXT NOT NULL,
466
+ policy_snapshot_id TEXT,
467
+ provider_commit TEXT,
468
+ exit_code INTEGER,
469
+ stdout TEXT,
470
+ stderr TEXT,
471
+ started_at TEXT NOT NULL,
472
+ finished_at TEXT,
473
+ FOREIGN KEY(workspace_id) REFERENCES sandkit_workspaces(id),
474
+ FOREIGN KEY(policy_snapshot_id) REFERENCES sandkit_policies(id)
475
+ )
476
+ `);
477
+ }
478
+ };
479
+ function createBunSqliteAdapter(db) {
480
+ return new BunSqliteWorkspaceAdapter(db);
481
+ }
482
+
483
+ export {
484
+ createBunSqliteAdapter
485
+ };
486
+ //# sourceMappingURL=chunk-UDFWES6J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/sqlite-bun.ts"],"sourcesContent":["import type { Database } from \"bun:sqlite\";\n\nimport { createId } from \"../core/ids.ts\";\nimport type {\n SandkitAdapter,\n WorkspaceCreateInput,\n WorkspaceMetadata,\n WorkspaceRecord,\n SharedSetupStateValue,\n WorkspaceUpdateInput,\n RunStatus,\n WorkspaceStatus,\n SharedSetupState,\n SetupStateRecord,\n SetupStatePutInput,\n RunAdapter,\n RunCreateInput,\n RunFinishInput,\n RunRecord,\n PolicySnapshotAdapter,\n PolicySnapshotCreateInput,\n PolicySnapshotRecord,\n} from \"./types\";\n\nconst workspaceStatuses = new Set<WorkspaceStatus>([\"active\", \"inactive\", \"archived\"]);\nconst runStatuses = new Set<RunStatus>([\"started\", \"succeeded\", \"failed\"]);\n\nfunction corruptionError(table: string, column: string, reason: string): Error {\n return new Error(`Sandkit durable state corruption in ${table}.${column}: ${reason}`);\n}\n\ninterface SqliteWorkspaceRow {\n id: string;\n name: string | null;\n metadata: string | null;\n status: WorkspaceStatus;\n sandboxId: string | null;\n lastResumedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface SqliteSetupStateRow {\n id: string;\n state: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface SqliteRunRow {\n id: string;\n workspace_id: string;\n provider: string;\n execution_target_id: string;\n command: string;\n args: string | null;\n status: string;\n policy_snapshot_id: string | null;\n provider_commit: string | null;\n exit_code: number | null;\n stdout: string | null;\n stderr: string | null;\n started_at: string;\n finished_at: string | null;\n}\n\nfunction toJsonString(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction parseJsonColumn(table: string, column: string, value: string): unknown {\n try {\n return JSON.parse(value);\n } catch (error) {\n throw corruptionError(table, column, error instanceof Error ? error.message : \"invalid JSON\");\n }\n}\n\nfunction readWorkspaceStatus(value: string): WorkspaceStatus {\n if (workspaceStatuses.has(value as WorkspaceStatus)) {\n return value as WorkspaceStatus;\n }\n throw corruptionError(\"sandkit_workspaces\", \"status\", `unexpected value \"${value}\"`);\n}\n\nfunction readRunStatus(value: string): RunStatus {\n if (runStatuses.has(value as RunStatus)) {\n return value as RunStatus;\n }\n throw corruptionError(\"sandkit_runs\", \"status\", `unexpected value \"${value}\"`);\n}\n\nfunction readRunArgs(value: string | null): readonly string[] | undefined {\n if (value === null) {\n return undefined;\n }\n\n const parsed = parseJsonColumn(\"sandkit_runs\", \"args\", value);\n if (Array.isArray(parsed) && parsed.every((entry) => typeof entry === \"string\")) {\n return parsed;\n }\n\n throw corruptionError(\"sandkit_runs\", \"args\", \"expected JSON string array\");\n}\n\nfunction readProviderCommit(value: string | null): unknown {\n if (value === null) {\n return undefined;\n }\n\n return parseJsonColumn(\"sandkit_runs\", \"provider_commit\", value);\n}\n\nfunction readWorkspaceSetupState(value: string): SharedSetupState {\n const parsed = parseJsonColumn(\"sandkit_setup_states\", \"state\", value);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n const candidate = parsed as { kind?: unknown; sessionId?: unknown; state?: unknown };\n if (typeof candidate.kind === \"string\" && typeof candidate.sessionId === \"string\") {\n return {\n kind: candidate.kind,\n sessionId: candidate.sessionId,\n state: candidate.state as SharedSetupStateValue,\n };\n }\n }\n\n throw corruptionError(\"sandkit_setup_states\", \"state\", \"expected persisted sandbox state object\");\n}\n\nfunction toRunRecord(row: SqliteRunRow): RunRecord {\n return {\n id: row.id,\n workspaceId: row.workspace_id,\n provider: row.provider,\n executionTargetId: row.execution_target_id,\n command: row.command,\n args: readRunArgs(row.args),\n status: readRunStatus(row.status),\n exitCode: row.exit_code ?? undefined,\n stdout: row.stdout ?? undefined,\n stderr: row.stderr ?? undefined,\n startedAt: row.started_at,\n finishedAt: row.finished_at ?? undefined,\n policySnapshotId: row.policy_snapshot_id ?? undefined,\n providerCommit: readProviderCommit(row.provider_commit),\n };\n}\n\nfunction createSqliteRunStore(db: Database): RunAdapter {\n return {\n async createRun(input: RunCreateInput): Promise<RunRecord> {\n const now = new Date().toISOString();\n const id = input.id && input.id.trim().length > 0 ? input.id.trim() : createId(\"run\");\n const startedAt = input.startedAt ?? now;\n\n db.query(\n `\n INSERT INTO sandkit_runs (\n id,\n workspace_id,\n provider,\n execution_target_id,\n command,\n args,\n status,\n policy_snapshot_id,\n provider_commit,\n started_at,\n finished_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n ).run(\n id,\n input.workspaceId,\n input.provider,\n input.executionTargetId,\n input.command,\n input.args === null || input.args === undefined ? null : toJsonString(input.args),\n input.status ?? \"started\",\n input.policySnapshotId ?? null,\n null,\n startedAt,\n null,\n );\n\n return {\n id,\n workspaceId: input.workspaceId,\n provider: input.provider,\n executionTargetId: input.executionTargetId,\n command: input.command,\n args: input.args ?? [],\n status: input.status ?? \"started\",\n startedAt,\n policySnapshotId: input.policySnapshotId ?? undefined,\n };\n },\n async finishRun(id: string, input: RunFinishInput): Promise<RunRecord> {\n const current = await getRun(db, id);\n if (!current) {\n throw new Error(`Run with id \"${id}\" does not exist`);\n }\n\n const next: RunRecord = {\n ...current,\n status: input.status,\n finishedAt: input.finishedAt,\n exitCode: input.exitCode ?? current.exitCode,\n stdout: input.stdout ?? current.stdout,\n stderr: input.stderr ?? current.stderr,\n providerCommit: input.providerCommit ?? current.providerCommit,\n };\n\n db.query(\n `\n UPDATE sandkit_runs\n SET status = ?,\n exit_code = ?,\n stdout = ?,\n stderr = ?,\n finished_at = ?,\n provider_commit = ?\n WHERE id = ?\n `,\n ).run(\n next.status,\n next.exitCode ?? null,\n next.stdout ?? null,\n next.stderr ?? null,\n next.finishedAt ?? null,\n next.providerCommit === undefined ? null : toJsonString(next.providerCommit),\n id,\n );\n\n return next;\n },\n };\n}\n\nasync function getRun(db: Database, id: string): Promise<RunRecord | null> {\n const row = db\n .query<SqliteRunRow, [string]>(\n `\n SELECT id,\n workspace_id,\n provider,\n execution_target_id,\n command,\n args,\n status,\n policy_snapshot_id,\n provider_commit,\n exit_code,\n stdout,\n stderr,\n started_at,\n finished_at\n FROM sandkit_runs\n WHERE id = ?\n LIMIT 1\n `,\n )\n .get(id);\n\n return row ? toRunRecord(row) : null;\n}\n\nfunction createPolicySnapshotStore(db: Database): PolicySnapshotAdapter {\n return {\n async createPolicySnapshot(input: PolicySnapshotCreateInput): Promise<PolicySnapshotRecord> {\n const now = new Date().toISOString();\n const id =\n input.id && input.id.trim().length > 0 ? input.id.trim() : createId(\"policy-snapshot\");\n\n db.query(\n `\n INSERT INTO sandkit_policies (\n id,\n workspace_id,\n policy_id,\n config,\n created_at\n ) VALUES (?, ?, ?, ?, ?)\n `,\n ).run(\n id,\n input.workspaceId,\n input.policyId,\n toJsonString(input.config),\n input.createdAt ?? now,\n );\n\n return {\n id,\n workspaceId: input.workspaceId,\n policyId: input.policyId,\n config: input.config,\n createdAt: input.createdAt ?? now,\n };\n },\n };\n}\n\nfunction createSqliteSetupStateStore(db: Database): {\n getSetupState: (id: string) => Promise<SetupStateRecord | null>;\n putSetupState: (input: SetupStatePutInput) => Promise<SetupStateRecord>;\n deleteSetupState: (id: string) => Promise<void>;\n} {\n const getCreatedAt = async (id: string): Promise<string | null> => {\n const row = db\n .query<{ createdAt: string }, [string]>(\n `\n SELECT createdAt\n FROM sandkit_setup_states\n WHERE id = ?\n LIMIT 1\n `,\n )\n .get(id);\n\n return row ? row.createdAt : null;\n };\n\n return {\n async getSetupState(id: string): Promise<SetupStateRecord | null> {\n const row = db\n .query<SqliteSetupStateRow, [string]>(\n `\n SELECT id, state, createdAt, updatedAt\n FROM sandkit_setup_states\n WHERE id = ?\n LIMIT 1\n `,\n )\n .get(id);\n\n if (!row) {\n return null;\n }\n\n const parsed = readWorkspaceSetupState(row.state);\n return {\n id: row.id,\n state: parsed,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n },\n async putSetupState(input: SetupStatePutInput): Promise<SetupStateRecord> {\n const now = new Date().toISOString();\n const existing = await getCreatedAt(input.id);\n if (existing) {\n db.query(\n `\n UPDATE sandkit_setup_states\n SET state = ?, updatedAt = ?\n WHERE id = ?\n `,\n ).run(toJsonString(input.state), now, input.id);\n\n return {\n id: input.id,\n state: input.state,\n createdAt: existing,\n updatedAt: now,\n };\n }\n\n db.query(\n `\n INSERT INTO sandkit_setup_states (id, state, createdAt, updatedAt)\n VALUES (?, ?, ?, ?)\n `,\n ).run(input.id, toJsonString(input.state), now, now);\n\n return {\n id: input.id,\n state: input.state,\n createdAt: now,\n updatedAt: now,\n };\n },\n async deleteSetupState(id: string): Promise<void> {\n db.query(`DELETE FROM sandkit_setup_states WHERE id = ?`).run(id);\n },\n };\n}\n\nclass BunSqliteWorkspaceAdapter implements SandkitAdapter {\n readonly #db: Database;\n\n constructor(db: Database) {\n this.#db = db;\n this.#migrate();\n }\n\n get id(): string {\n return \"sqlite-bun\";\n }\n\n get workspaces() {\n return {\n createWorkspace: this.createWorkspace.bind(this),\n getWorkspace: this.getWorkspace.bind(this),\n updateWorkspace: this.updateWorkspace.bind(this),\n };\n }\n\n get runs() {\n return createSqliteRunStore(this.#db);\n }\n\n get policySnapshots() {\n return createPolicySnapshotStore(this.#db);\n }\n\n get setupStates() {\n return createSqliteSetupStateStore(this.#db);\n }\n\n async createWorkspace(input: WorkspaceCreateInput = {}): Promise<WorkspaceRecord> {\n const now = new Date().toISOString();\n const id = input.id && input.id.trim().length > 0 ? input.id : createId(\"workspace\");\n\n this.#db\n .query(\n `\n INSERT INTO sandkit_workspaces (\n id,\n name,\n metadata,\n status,\n sandboxId,\n lastResumedAt,\n createdAt,\n updatedAt\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `,\n )\n .run(\n id,\n input.name ?? \"default\",\n input.metadata ? JSON.stringify(input.metadata) : null,\n input.status ?? \"active\",\n input.sandboxId ?? null,\n input.lastResumedAt ?? null,\n now,\n now,\n );\n\n return {\n id,\n name: input.name ?? \"default\",\n metadata: input.metadata,\n status: input.status ?? \"active\",\n sandboxId: input.sandboxId ?? undefined,\n lastResumedAt: input.lastResumedAt,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n async getWorkspace(id: string): Promise<WorkspaceRecord | null> {\n const row = this.#db\n .query<SqliteWorkspaceRow, [string]>(\n `\n SELECT id, name, metadata, status, sandboxId, lastResumedAt, createdAt, updatedAt\n FROM sandkit_workspaces\n WHERE id = ?\n `,\n )\n .get(id);\n\n if (!row) {\n return null;\n }\n\n return this.#toRecord(row);\n }\n\n async updateWorkspace(id: string, input: WorkspaceUpdateInput): Promise<WorkspaceRecord> {\n const current = await this.getWorkspace(id);\n if (!current) {\n throw new Error(`Workspace with id \"${id}\" does not exist`);\n }\n\n const next: WorkspaceRecord = {\n ...current,\n name: input.name === undefined ? current.name : input.name,\n metadata:\n input.metadata === undefined\n ? current.metadata\n : {\n ...current.metadata,\n ...input.metadata,\n },\n status: input.status ?? current.status,\n sandboxId: input.sandboxId === null ? undefined : (input.sandboxId ?? current.sandboxId),\n lastResumedAt:\n input.lastResumedAt === null ? undefined : (input.lastResumedAt ?? current.lastResumedAt),\n updatedAt: new Date().toISOString(),\n };\n\n this.#db\n .query(\n `\n UPDATE sandkit_workspaces\n SET name = ?,\n metadata = ?,\n status = ?,\n sandboxId = ?,\n lastResumedAt = ?,\n updatedAt = ?\n WHERE id = ?\n `,\n )\n .run(\n next.name ?? null,\n next.metadata ? JSON.stringify(next.metadata) : null,\n next.status,\n next.sandboxId ?? null,\n next.lastResumedAt ?? null,\n next.updatedAt,\n id,\n );\n\n return next;\n }\n\n #toRecord(row: SqliteWorkspaceRow): WorkspaceRecord {\n let metadata: WorkspaceMetadata | undefined;\n if (row.metadata !== null) {\n const parsed = parseJsonColumn(\"sandkit_workspaces\", \"metadata\", row.metadata);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n metadata = parsed as WorkspaceMetadata;\n } else {\n throw corruptionError(\"sandkit_workspaces\", \"metadata\", \"expected JSON object\");\n }\n }\n\n return {\n id: row.id,\n name: row.name ?? undefined,\n metadata,\n status: readWorkspaceStatus(row.status),\n sandboxId: row.sandboxId ?? undefined,\n lastResumedAt: row.lastResumedAt ?? undefined,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n }\n\n #migrate(): void {\n this.#db.run(`\n CREATE TABLE IF NOT EXISTS sandkit_workspaces (\n id TEXT PRIMARY KEY NOT NULL,\n name TEXT,\n metadata TEXT,\n status TEXT NOT NULL,\n sandboxId TEXT,\n lastResumedAt TEXT,\n createdAt TEXT NOT NULL,\n updatedAt TEXT NOT NULL\n )\n `);\n this.#db.run(`\n CREATE TABLE IF NOT EXISTS sandkit_policies (\n id TEXT PRIMARY KEY NOT NULL,\n workspace_id TEXT NOT NULL,\n policy_id TEXT NOT NULL,\n config TEXT NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY(workspace_id) REFERENCES sandkit_workspaces(id)\n )\n `);\n this.#db.run(`\n CREATE TABLE IF NOT EXISTS sandkit_setup_states (\n id TEXT PRIMARY KEY NOT NULL,\n state TEXT NOT NULL,\n createdAt TEXT NOT NULL,\n updatedAt TEXT NOT NULL\n )\n `);\n this.#db.run(`\n CREATE TABLE IF NOT EXISTS sandkit_runs (\n id TEXT PRIMARY KEY NOT NULL,\n workspace_id TEXT NOT NULL,\n provider TEXT NOT NULL,\n execution_target_id TEXT NOT NULL,\n command TEXT NOT NULL,\n args TEXT,\n status TEXT NOT NULL,\n policy_snapshot_id TEXT,\n provider_commit TEXT,\n exit_code INTEGER,\n stdout TEXT,\n stderr TEXT,\n started_at TEXT NOT NULL,\n finished_at TEXT,\n FOREIGN KEY(workspace_id) REFERENCES sandkit_workspaces(id),\n FOREIGN KEY(policy_snapshot_id) REFERENCES sandkit_policies(id)\n )\n `);\n }\n}\n\nexport function createBunSqliteAdapter(db: Database): SandkitAdapter {\n return new BunSqliteWorkspaceAdapter(db);\n}\n"],"mappings":"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","names":[]}