@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 @@
1
+ {"version":3,"sources":["../src/cli/generate.ts","../src/schema/generate.ts","../src/schema/model.ts","../src/cli/discovery.ts","../src/cli/index.ts","../src/cli/bin.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nimport { createGeneratePayload } from \"../schema/generate\";\nimport { createModelSnapshot } from \"../schema/model\";\nimport { resolveProviderWithDiscovery } from \"./discovery\";\nimport type {\n SandkitGenerateArgs,\n SandkitGenerateResolvedArgs,\n SandkitGenerateResult,\n} from \"./types\";\n\nfunction usage() {\n return [\n \"Usage: sandkit generate [--adapter drizzle] [--dialect <sqlite|postgresql|pg>] [--out <file>] [--stdout]\",\n \"Example: npx @giselles-ai/sandkit generate --dialect sqlite --stdout\",\n \"Example: npx @giselles-ai/sandkit generate --adapter drizzle --dialect postgresql --stdout\",\n \"If --stdout is omitted, output is shown to console by default.\",\n \"Default output file: db/schema/sandkit.ts\",\n ].join(\"\\n\");\n}\n\nexport function parseGenerateArgs(argv: string[]): SandkitGenerateArgs {\n let provider: SandkitGenerateArgs[\"provider\"];\n let dialect: SandkitGenerateArgs[\"dialect\"];\n let adapter: SandkitGenerateArgs[\"adapter\"];\n let out: string | undefined;\n let stdout = false;\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--adapter\") {\n const next = argv[i + 1];\n if (next === \"drizzle\") {\n adapter = next;\n i++;\n continue;\n }\n throw new Error(\"Unsupported --adapter value. Use --adapter drizzle.\");\n }\n if (arg === \"--provider\") {\n const next = argv[i + 1];\n if (next === \"sqlite\" || next === \"postgresql\" || next === \"mysql\") {\n provider = next;\n i++;\n continue;\n }\n throw new Error(`Invalid provider: ${next}`);\n }\n if (arg === \"--dialect\") {\n const next = argv[i + 1];\n if (next === \"sqlite\" || next === \"postgresql\" || next === \"pg\") {\n dialect = next === \"pg\" ? \"postgresql\" : next;\n i++;\n continue;\n }\n throw new Error(`Invalid dialect: ${next}`);\n }\n if (arg === \"--out\") {\n const next = argv[i + 1];\n if (!next) {\n throw new Error(\"Missing --out path\");\n }\n out = next;\n i++;\n continue;\n }\n if (arg === \"--stdout\") {\n stdout = true;\n continue;\n }\n if (arg === \"--help\" || arg === \"-h\") {\n throw new Error(usage());\n }\n if (arg === \"generate\") {\n continue;\n }\n throw new Error(`Unknown option: ${arg}`);\n }\n\n return {\n provider,\n dialect,\n adapter,\n out,\n stdout,\n };\n}\n\nexport function runGenerateCommand(options: SandkitGenerateResolvedArgs): SandkitGenerateResult {\n const snapshot = createModelSnapshot(options.provider);\n const payload = createGeneratePayload(options.provider, snapshot.model);\n const defaultOutputFile =\n options.adapter === \"drizzle\" || options.adapter === undefined\n ? \"db/schema/sandkit.ts\"\n : `sandkit-schema.${options.provider}.ts`;\n const outputFile = options.out ?? defaultOutputFile;\n\n const result: SandkitGenerateResult = {\n command: \"generate\",\n provider: options.provider,\n outputTarget: options.stdout ? \"stdout\" : \"file\",\n outputFile: options.stdout ? null : outputFile,\n payload: {\n generatedAt: payload.generatedAt,\n summary: payload.summary,\n schemaText: payload.schemaText,\n },\n };\n\n if (!options.stdout) {\n mkdirSync(dirname(outputFile), { recursive: true });\n writeFileSync(outputFile, payload.schemaText, \"utf8\");\n }\n\n return result;\n}\n\nexport async function runCliGenerate(argv: string[]): Promise<SandkitGenerateResult> {\n const options = parseGenerateArgs(argv);\n const discovered = await resolveProviderWithDiscovery({\n provider: options.provider,\n adapter: options.adapter,\n dialect: options.dialect,\n stdout: false,\n out: options.out,\n });\n\n return runGenerateCommand({\n provider: discovered.provider,\n adapter: discovered.adapter,\n dialect: options.dialect,\n out: options.out,\n stdout: options.stdout,\n });\n}\n","import type { SandkitSchemaModel, SandkitDialect } from \"./model\";\n\ninterface TypedColumnExpr {\n type: string;\n options?: string;\n}\n\ntype SchemaTypeMap = Record<\n string,\n {\n text: TypedColumnExpr;\n integer: TypedColumnExpr;\n boolean: TypedColumnExpr;\n json: TypedColumnExpr;\n timestamp: TypedColumnExpr;\n }\n>;\n\nconst typeMap: SchemaTypeMap = {\n sqlite: {\n text: { type: \"text\" },\n integer: { type: \"integer\" },\n boolean: { type: \"integer\", options: \"{ mode: 'boolean' }\" },\n json: { type: \"text\", options: \"{ mode: 'json' }\" },\n timestamp: { type: \"integer\", options: \"{ mode: 'timestamp_ms' }\" },\n },\n postgresql: {\n text: { type: \"text\" },\n integer: { type: \"integer\" },\n boolean: { type: \"boolean\" },\n json: { type: \"jsonb\" },\n timestamp: { type: \"timestamp\" },\n },\n mysql: {\n text: { type: \"text\" },\n integer: { type: \"int\" },\n boolean: { type: \"boolean\" },\n json: { type: \"json\" },\n timestamp: { type: \"timestamp\" },\n },\n} as const;\n\nconst tableFactoryByDialect = {\n sqlite: \"sqliteTable\",\n postgresql: \"pgTable\",\n mysql: \"mysqlTable\",\n} as const;\n\nexport function renderTextSchema(model: SandkitSchemaModel): string {\n const exportNameByTable = new Map(\n model.tables.map((table) => [table.name, table.exportName ?? table.name]),\n );\n\n const entries = model.tables\n .map((table) => {\n const builder = tableFactoryByDialect[model.dialect];\n const tableExpr =\n model.dialect === \"sqlite\"\n ? `${builder}(\"${table.name}\", {`\n : `${builder}(\"${table.name}\", {\\n`;\n\n const row = table.columns\n .map((column) => {\n const mappedDialect = typeMap[model.dialect];\n if (!mappedDialect) {\n throw new Error(`Unsupported dialect \"${model.dialect}\"`);\n }\n\n const mappedType = mappedDialect[column.type];\n if (!mappedType) {\n throw new Error(\n `Unsupported column type \"${column.type}\" for dialect \"${model.dialect}\"`,\n );\n }\n\n const optionsSuffix = mappedType.options ? `, ${mappedType.options}` : \"\";\n const defaultValue = column.defaultValue === null ? \"default null\" : \"\";\n const required = column.nullable === true ? \"\" : \".notNull()\";\n const unique = column.unique ? \".unique()\" : \"\";\n const primary = column.primaryKey ? \".primaryKey()\" : \"\";\n const ref = column.references\n ? `.references(() => ${\n exportNameByTable.get(column.references.table) ?? column.references.table\n }.${column.references.field})`\n : \"\";\n return ` ${column.name}: ${mappedType.type}(\"${column.name}\"${optionsSuffix})${required}${defaultValue}${unique}${primary}${ref}`;\n })\n .join(\",\\n\");\n\n const rows = row ? `\\n${row}\\n` : \"\\n\";\n const exportName = table.exportName ?? table.name;\n return `export const ${exportName} = ${tableExpr}${rows}});`;\n })\n .join(\"\\n\\n\");\n\n const imports = {\n sqlite: 'import { integer, sqliteTable, text } from \"drizzle-orm/sqlite-core\";',\n postgresql:\n 'import { boolean, integer, jsonb, pgTable, text, timestamp } from \"drizzle-orm/pg-core\";',\n mysql:\n 'import { boolean, int, json, mysqlTable, text, timestamp } from \"drizzle-orm/mysql-core\";',\n } as const;\n\n return `// This file is generated from Sandkit schema model.\\n// Provider: ${model.dialect}\\n// Version: ${model.version}\\n\\n${imports[model.dialect]}\\n\\n${entries}\\n\\nexport const sandkitSchema = {\\n${model.tables\n .map((table) => {\n const exportName = table.exportName ?? table.name;\n return ` ${exportName},`;\n })\n .join(\"\\n\")}\\n};\\n`;\n}\n\nexport function createGeneratePayload(dialect: SandkitDialect, model: SandkitSchemaModel) {\n return {\n dialect,\n generatedAt: new Date().toISOString(),\n summary: {\n tableCount: model.tables.length,\n tableNames: model.tables.map((table) => table.name),\n },\n schemaText: renderTextSchema(model),\n };\n}\n","export type SandkitDialect = \"sqlite\" | \"postgresql\" | \"mysql\";\n\nexport type SandkitColumnType = \"text\" | \"integer\" | \"boolean\" | \"json\" | \"timestamp\";\n\nexport interface SandkitColumn {\n name: string;\n type: SandkitColumnType;\n nullable?: boolean;\n primaryKey?: boolean;\n unique?: boolean;\n defaultValue?: string | number | boolean | null;\n comment?: string;\n references?: {\n table: string;\n field: string;\n };\n}\n\nexport interface SandkitIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n}\n\nexport interface SandkitTable {\n name: string;\n schema?: string;\n comment?: string;\n exportName?: string;\n columns: SandkitColumn[];\n indexes?: SandkitIndex[];\n}\n\nexport interface SandkitSchemaModel {\n name: string;\n version: number;\n dialect: SandkitDialect;\n tables: SandkitTable[];\n}\n\nconst nowIso = () => new Date().toISOString();\n\nconst baseSchemaName = \"sandkit\";\nconst tablePrefix = \"sandkit_\";\n\nexport const sandkitWorkspaceExport = \"sandkitWorkspaces\";\nexport const sandkitRunExport = \"sandkitRuns\";\nexport const sandkitPolicyExport = \"sandkitPolicies\";\nexport const sandkitSetupStateExport = \"sandkitSetupStates\";\n\nexport const sandkitWorkspaceTable: SandkitTable = {\n name: `${tablePrefix}workspaces`,\n exportName: sandkitWorkspaceExport,\n comment: \"Persistent workspace metadata.\",\n columns: [\n {\n name: \"id\",\n type: \"text\",\n primaryKey: true,\n nullable: false,\n comment: \"Workspace identifier.\",\n },\n {\n name: \"metadata\",\n type: \"json\",\n nullable: true,\n comment: \"Durable workspace metadata, including sandbox lifecycle state.\",\n },\n {\n name: \"sandboxId\",\n type: \"text\",\n nullable: true,\n comment: \"Stable id returned by the sandbox provider.\",\n },\n { name: \"status\", type: \"text\", nullable: false },\n { name: \"name\", type: \"text\", nullable: true },\n {\n name: \"lastResumedAt\",\n type: \"timestamp\",\n nullable: true,\n comment: \"Most recent point when Sandkit resolved a concrete sandbox session.\",\n },\n { name: \"createdAt\", type: \"timestamp\", nullable: false },\n { name: \"updatedAt\", type: \"timestamp\", nullable: false },\n ],\n indexes: [{ name: \"workspaces_status_idx\", columns: [\"status\"] }],\n};\n\nexport const sandkitRunTable: SandkitTable = {\n name: `${tablePrefix}runs`,\n exportName: sandkitRunExport,\n comment: \"Execution facts for unit-of-work runs.\",\n columns: [\n {\n name: \"id\",\n type: \"text\",\n primaryKey: true,\n nullable: false,\n comment: \"Run identifier.\",\n },\n {\n name: \"workspace_id\",\n type: \"text\",\n nullable: false,\n comment: \"FK to workspace.\",\n references: {\n table: sandkitWorkspaceTable.name,\n field: \"id\",\n },\n },\n { name: \"command\", type: \"text\", nullable: false },\n {\n name: \"args\",\n type: \"json\",\n nullable: true,\n comment: \"Arguments for the executed command.\",\n },\n {\n name: \"provider\",\n type: \"text\",\n nullable: false,\n comment: \"Driver identity used for execution (e.g. vercel-sandbox, mock).\",\n },\n {\n name: \"execution_target_id\",\n type: \"text\",\n nullable: false,\n comment: \"Driver execution target used by the command run.\",\n },\n {\n name: \"status\",\n type: \"text\",\n nullable: false,\n comment: \"Unit status.\",\n },\n {\n name: \"policy_snapshot_id\",\n type: \"text\",\n nullable: true,\n comment: \"FK to policy snapshot row.\",\n },\n {\n name: \"provider_commit\",\n type: \"json\",\n nullable: true,\n comment: \"Provider durability metadata at run completion.\",\n },\n { name: \"exit_code\", type: \"integer\", nullable: true },\n { name: \"stdout\", type: \"text\", nullable: true },\n { name: \"stderr\", type: \"text\", nullable: true },\n { name: \"started_at\", type: \"timestamp\", nullable: false },\n { name: \"finished_at\", type: \"timestamp\", nullable: true },\n ],\n indexes: [\n { name: \"runs_workspace_id_idx\", columns: [\"workspace_id\"] },\n { name: \"runs_finished_at_idx\", columns: [\"finished_at\"] },\n { name: \"runs_status_idx\", columns: [\"status\"] },\n ],\n};\n\nexport const sandkitPolicyTable: SandkitTable = {\n name: `${tablePrefix}policies`,\n exportName: sandkitPolicyExport,\n comment: \"Network policy snapshots and source of truth.\",\n columns: [\n {\n name: \"id\",\n type: \"text\",\n primaryKey: true,\n nullable: false,\n },\n {\n name: \"workspace_id\",\n type: \"text\",\n nullable: false,\n comment: \"FK to workspace.\",\n references: {\n table: sandkitWorkspaceTable.name,\n field: \"id\",\n },\n },\n { name: \"policy_id\", type: \"text\", nullable: false },\n { name: \"config\", type: \"json\", nullable: false },\n { name: \"created_at\", type: \"timestamp\", nullable: false },\n ],\n indexes: [{ name: \"policies_workspace_id_idx\", columns: [\"workspace_id\"] }],\n};\n\nexport const sandkitSetupStateTable: SandkitTable = {\n name: `${tablePrefix}setup_states`,\n exportName: sandkitSetupStateExport,\n comment: \"Durable shared setup state shared by all workspaces on one adapter.\",\n columns: [\n {\n name: \"id\",\n type: \"text\",\n primaryKey: true,\n nullable: false,\n comment: \"Shared setup state identifier.\",\n },\n {\n name: \"state\",\n type: \"json\",\n nullable: false,\n comment: \"Serialized durable setup snapshot state.\",\n },\n { name: \"createdAt\", type: \"timestamp\", nullable: false },\n { name: \"updatedAt\", type: \"timestamp\", nullable: false },\n ],\n};\n\nexport function createSandkitSchemaModel(dialect: SandkitDialect = \"sqlite\"): SandkitSchemaModel {\n const schemaName = dialect === \"postgresql\" ? `${baseSchemaName}_schema` : baseSchemaName;\n return {\n name: schemaName,\n version: 4,\n dialect,\n tables: [\n {\n ...sandkitWorkspaceTable,\n schema: dialect === \"postgresql\" ? \"public\" : undefined,\n },\n {\n ...sandkitRunTable,\n schema: dialect === \"postgresql\" ? \"public\" : undefined,\n },\n {\n ...sandkitPolicyTable,\n schema: dialect === \"postgresql\" ? \"public\" : undefined,\n },\n {\n ...sandkitSetupStateTable,\n schema: dialect === \"postgresql\" ? \"public\" : undefined,\n },\n ],\n };\n}\n\nexport function createModelSnapshot(dialect: SandkitDialect = \"sqlite\"): {\n model: SandkitSchemaModel;\n generatedAt: string;\n} {\n return {\n model: createSandkitSchemaModel(dialect),\n generatedAt: nowIso(),\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\n\nimport type { SandkitDialect } from \"../schema/model\";\nimport type { SandkitGenerateArgs } from \"./types\";\n\ntype SupportedAdapter = \"drizzle\";\n\nconst drizzleConfigFiles = [\n \"drizzle.config.ts\",\n \"drizzle.config.js\",\n \"drizzle.config.mjs\",\n \"drizzle.config.cjs\",\n \"drizzle.config.mts\",\n \"drizzle.config.cts\",\n \"drizzle.config.json\",\n \"drizzle.config.yaml\",\n \"drizzle.config.yml\",\n] as const;\n\nconst drizzleDependency = \"drizzle-orm\";\n\ninterface ProviderEvidenceScore {\n provider: SandkitDialect;\n weight: number;\n}\n\nexport interface DiscoveryEvidence {\n source: string;\n signal: string;\n provider?: SandkitDialect;\n score: number;\n}\n\nexport interface DiscoveryHint {\n adapter: SupportedAdapter;\n provider: SandkitDialect;\n confidence: number;\n evidence: DiscoveryEvidence[];\n prompted: boolean;\n}\n\nfunction parsePackageJsonDependencies(\n packagePath: string,\n evidence: DiscoveryEvidence[],\n): ProviderEvidenceScore[] {\n if (!existsSync(packagePath)) {\n return [];\n }\n\n let packageData: {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n } = {};\n try {\n packageData = JSON.parse(readFileSync(packagePath, \"utf8\"));\n } catch {\n return [];\n }\n\n const dependencies = { ...packageData.dependencies, ...packageData.devDependencies };\n const depNames = Object.keys(dependencies);\n\n if (!depNames.includes(drizzleDependency)) {\n return [];\n }\n\n evidence.push({\n source: \"package.json\",\n signal: \"Dependency `drizzle-orm` found.\",\n score: 1.1,\n });\n\n const sqliteSignals = (\n [\n [\"better-sqlite3\", \"sqlite\"],\n [\"libsql\", \"sqlite\"],\n [\"@libsql/client\", \"sqlite\"],\n [\"@turso\", \"sqlite\"],\n ] as const\n ).flatMap<ProviderEvidenceScore>(([name, provider]) =>\n depNames.some((dep) => dep.includes(name)) ? [{ provider, weight: 1.6 }] : [],\n );\n\n const postgresSignals = (\n [\n [\"pg\", \"postgresql\"],\n [\"postgres\", \"postgresql\"],\n [\"@vercel/postgres\", \"postgresql\"],\n [\"@neondatabase/serverless\", \"postgresql\"],\n ] as const\n ).flatMap<ProviderEvidenceScore>(([name, provider]) =>\n depNames.some((dep) => dep.includes(name)) ? [{ provider, weight: 1.6 }] : [],\n );\n\n const addSignals = (signals: ProviderEvidenceScore[]) =>\n signals.forEach((entry) =>\n evidence.push({\n source: \"package.json\",\n signal: `Dependency implies ${entry.provider} driver usage (${entry.provider} signal).`,\n provider: entry.provider,\n score: entry.weight,\n }),\n );\n\n addSignals(sqliteSignals);\n addSignals(postgresSignals);\n\n return [...sqliteSignals, ...postgresSignals];\n}\n\nfunction inspectDrizzleConfig(cwd: string, evidence: DiscoveryEvidence[]): ProviderEvidenceScore[] {\n const results: ProviderEvidenceScore[] = [];\n\n for (const filename of drizzleConfigFiles) {\n const configPath = join(cwd, filename);\n if (!existsSync(configPath)) {\n continue;\n }\n\n let text = \"\";\n try {\n text = readFileSync(configPath, \"utf8\");\n } catch {\n continue;\n }\n\n evidence.push({\n source: filename,\n signal: `Found drizzle config file: ${filename}.`,\n score: 0.6,\n });\n\n if (/dialect\\s*:\\s*[\"']sqlite[\"']/i.test(text)) {\n evidence.push({\n source: filename,\n signal: \"Drizzle config sets dialect to sqlite.\",\n provider: \"sqlite\",\n score: 3,\n });\n return [{ provider: \"sqlite\", weight: 3 }];\n }\n\n if (/dialect\\s*:\\s*[\"']postgresql[\"']/i.test(text)) {\n evidence.push({\n source: filename,\n signal: \"Drizzle config sets dialect to postgresql.\",\n provider: \"postgresql\",\n score: 3,\n });\n return [{ provider: \"postgresql\", weight: 3 }];\n }\n\n if (/dialect\\s*:\\s*[\"']mysql[\"']/i.test(text)) {\n evidence.push({\n source: filename,\n signal: \"Drizzle config sets dialect to mysql.\",\n provider: \"mysql\",\n score: 3,\n });\n return [{ provider: \"mysql\", weight: 3 }];\n }\n\n const dbUrlMatch = text.match(/url\\s*:\\s*[\"'`](.*?)[\"'`]/i);\n if (dbUrlMatch?.[1]) {\n const url = dbUrlMatch[1].toLowerCase();\n if (url.includes(\"turso\") || url.includes(\"libsql\") || url.includes(\"sqlite\")) {\n evidence.push({\n source: filename,\n signal: \"Drizzle config DB URL contains sqlite/libsql/turso hints.\",\n provider: \"sqlite\",\n score: 2,\n });\n results.push({ provider: \"sqlite\", weight: 2 });\n }\n\n if (url.includes(\"postgres\")) {\n evidence.push({\n source: filename,\n signal: \"Drizzle config DB URL contains postgres hints.\",\n provider: \"postgresql\",\n score: 2,\n });\n results.push({ provider: \"postgresql\", weight: 2 });\n }\n }\n }\n\n return results;\n}\n\nfunction collectEvidence(cwd: string): {\n evidence: DiscoveryEvidence[];\n isDrizzleProject: boolean;\n} {\n const evidence: DiscoveryEvidence[] = [];\n const packageSignals = parsePackageJsonDependencies(join(cwd, \"package.json\"), evidence);\n const drizzleSignals = inspectDrizzleConfig(cwd, evidence);\n return {\n evidence,\n isDrizzleProject: packageSignals.length > 0 || drizzleSignals.length > 0,\n };\n}\n\nfunction rankProviderSignals(evidence: DiscoveryEvidence[]): {\n provider?: SandkitDialect;\n confidence: number;\n} {\n const totals: Record<SandkitDialect, number> = { sqlite: 0, postgresql: 0, mysql: 0 };\n\n for (const item of evidence) {\n if (!item.provider) continue;\n totals[item.provider] += item.score;\n }\n\n const ranked = (Object.entries(totals) as [SandkitDialect, number][])\n .sort((a, b) => b[1] - a[1])\n .filter((entry) => entry[1] > 0);\n\n if (ranked.length === 0) {\n return { provider: undefined, confidence: 0 };\n }\n\n const [winner, winnerScore] = ranked[0]!;\n const secondScore = ranked[1]?.[1] ?? 0;\n const confidence = winnerScore === 0 ? 0 : winnerScore / (winnerScore + secondScore);\n return { provider: winner, confidence };\n}\n\nfunction promptWithChoices(question: string, options: string[], fallback: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(question, (answer) => {\n rl.close();\n const normalized = answer.trim().toLowerCase();\n if (options.includes(normalized)) {\n resolve(normalized);\n return;\n }\n resolve(fallback);\n });\n });\n}\n\nexport async function resolveProviderWithDiscovery(\n options: SandkitGenerateArgs,\n cwd = process.cwd(),\n): Promise<DiscoveryHint> {\n const requestedProvider = options.provider ?? options.dialect;\n const normalizedProvider = requestedProvider === \"pg\" ? \"postgresql\" : requestedProvider;\n\n if (normalizedProvider) {\n if (\n normalizedProvider !== \"sqlite\" &&\n normalizedProvider !== \"postgresql\" &&\n normalizedProvider !== \"mysql\"\n ) {\n throw new Error(\"Invalid provider. Use one of: sqlite, postgresql, mysql.\");\n }\n return {\n adapter: \"drizzle\",\n provider: normalizedProvider,\n confidence: 1,\n evidence: [\n {\n source: \"cli\",\n signal: `Provider explicitly set as ${normalizedProvider}.`,\n provider: normalizedProvider,\n score: 100,\n },\n ],\n prompted: false,\n };\n }\n\n if (options.adapter && options.adapter !== \"drizzle\") {\n throw new Error(\"Unsupported adapter. This release supports --adapter drizzle only.\");\n }\n\n const { evidence, isDrizzleProject } = collectEvidence(cwd);\n const inference = rankProviderSignals(evidence);\n const adapter: SupportedAdapter = isDrizzleProject ? \"drizzle\" : \"drizzle\";\n\n if (!isDrizzleProject) {\n throw new Error(\n \"Could not detect a drizzle project from this directory. \" +\n \"Run inside a Drizzle project and pass --dialect/--adapter explicitly if needed.\",\n );\n }\n\n if (inference.provider && inference.confidence >= 0.75) {\n return {\n adapter,\n provider: inference.provider,\n confidence: inference.confidence,\n evidence,\n prompted: false,\n };\n }\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\n \"Could not infer database provider confidently. \" +\n \"Re-run with --dialect <sqlite|postgresql|pg>.\",\n );\n }\n\n const prompt = await promptWithChoices(\n `Could not infer the database provider from repo signals.\\n` +\n `Select provider [sqlite|postgresql|mysql] (default sqlite): `,\n [\"sqlite\", \"postgresql\", \"mysql\"],\n \"sqlite\",\n );\n return {\n adapter,\n provider: prompt as SandkitDialect,\n confidence: inference.confidence,\n evidence,\n prompted: true,\n };\n}\n","import { parseGenerateArgs, runCliGenerate } from \"./generate\";\nimport type { SandkitCliCommand, SandkitGenerateArgs, SandkitGenerateResult } from \"./types\";\n\nfunction buildHelp() {\n return [\n \"Sandkit CLI\",\n \"Commands: generate\",\n \"\",\n \" sandkit generate [--adapter drizzle] [--dialect <sqlite|postgresql|pg>] [--stdout] [--out file]\",\n \"\",\n \"When --stdout is set, output is returned in memory and printed by caller.\",\n ].join(\"\\n\");\n}\n\nfunction parseArgs(\n argv: string[],\n): { command: SandkitCliCommand; rest: string[] } & SandkitGenerateArgs {\n if (argv.length === 0 || argv.includes(\"--help\") || argv.includes(\"-h\")) {\n throw new Error(buildHelp());\n }\n\n const command = argv[0] as SandkitCliCommand;\n if (command !== \"generate\") {\n throw new Error(`Unknown command: ${command}`);\n }\n\n const rest = argv.slice(1);\n const commandOptions = parseGenerateArgs(rest);\n return { command, ...commandOptions, rest };\n}\n\nexport type SandkitRunResult = SandkitGenerateResult;\n\nexport async function runCli(argv = process.argv.slice(2)): Promise<SandkitRunResult> {\n const parsed = parseArgs(argv);\n if (parsed.command === \"generate\") {\n const { rest } = parsed;\n return runCliGenerate(rest);\n }\n\n throw new Error(`Unhandled command: ${parsed.command}`);\n}\n","#!/usr/bin/env node\n\nimport { runCli } from \"./index.js\";\n\nconst args = process.argv.slice(2);\n\ntry {\n const result = await runCli(args);\n if (result.outputTarget === \"stdout\") {\n process.stdout.write(`${result.payload.schemaText}\\n`);\n }\n} catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`${message}\\n`);\n process.exitCode = 1;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,44 @@
1
+ import {
2
+ allowService
3
+ } from "./chunk-VISDS5T7.js";
4
+
5
+ // src/policies/gemini.ts
6
+ var GEMINI_DOMAINS = ["ai.google.dev", "*.ai.google.dev", "generativelanguage.googleapis.com"];
7
+ function resolveGeminiCredential(options) {
8
+ if (options === void 0) {
9
+ return { kind: "default" };
10
+ }
11
+ if (typeof options.apiKey !== "string" || options.apiKey.trim().length === 0) {
12
+ throw new Error(
13
+ 'gemini(...) explicit override requires a non-empty "apiKey". Omit the options object to use GEMINI_API_KEY.'
14
+ );
15
+ }
16
+ return { kind: "value", value: options.apiKey };
17
+ }
18
+ function resolveGeminiDefaultApiKey() {
19
+ return process.env.GEMINI_API_KEY;
20
+ }
21
+ function gemini(options) {
22
+ return {
23
+ id: "gemini",
24
+ name: "Gemini",
25
+ description: "Allow outbound access commonly needed by Gemini clients.",
26
+ domains: GEMINI_DOMAINS,
27
+ headers: [
28
+ {
29
+ headerName: "x-goog-api-key",
30
+ credential: resolveGeminiCredential(options)
31
+ }
32
+ ]
33
+ };
34
+ }
35
+ function allowGemini() {
36
+ return allowService(gemini());
37
+ }
38
+
39
+ export {
40
+ resolveGeminiDefaultApiKey,
41
+ gemini,
42
+ allowGemini
43
+ };
44
+ //# sourceMappingURL=chunk-7DLK7LOM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/policies/gemini.ts"],"sourcesContent":["import { allowService } from \"./dsl.ts\";\nimport type { PolicyServiceDescriptor, WorkspacePolicy } from \"./types.ts\";\n\nconst GEMINI_DOMAINS = [\"ai.google.dev\", \"*.ai.google.dev\", \"generativelanguage.googleapis.com\"];\n\nexport interface GeminiOptions {\n readonly apiKey?: string;\n}\n\nfunction resolveGeminiCredential(options?: GeminiOptions) {\n if (options === undefined) {\n return { kind: \"default\" } as const;\n }\n\n if (typeof options.apiKey !== \"string\" || options.apiKey.trim().length === 0) {\n throw new Error(\n 'gemini(...) explicit override requires a non-empty \"apiKey\". Omit the options object to use GEMINI_API_KEY.',\n );\n }\n\n return { kind: \"value\", value: options.apiKey } as const;\n}\n\nexport function resolveGeminiDefaultApiKey(): string | undefined {\n return process.env.GEMINI_API_KEY;\n}\n\nexport function gemini(options?: GeminiOptions): PolicyServiceDescriptor {\n return {\n id: \"gemini\",\n name: \"Gemini\",\n description: \"Allow outbound access commonly needed by Gemini clients.\",\n domains: GEMINI_DOMAINS,\n headers: [\n {\n headerName: \"x-goog-api-key\",\n credential: resolveGeminiCredential(options),\n },\n ],\n };\n}\n\nexport function allowGemini(): WorkspacePolicy {\n return allowService(gemini());\n}\n"],"mappings":";;;;;AAGA,IAAM,iBAAiB,CAAC,iBAAiB,mBAAmB,mCAAmC;AAM/F,SAAS,wBAAwB,SAAyB;AACxD,MAAI,YAAY,QAAW;AACzB,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,MAAI,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO,KAAK,EAAE,WAAW,GAAG;AAC5E,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,SAAS,OAAO,QAAQ,OAAO;AAChD;AAEO,SAAS,6BAAiD;AAC/D,SAAO,QAAQ,IAAI;AACrB;AAEO,SAAS,OAAO,SAAkD;AACvE,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,MACP;AAAA,QACE,YAAY;AAAA,QACZ,YAAY,wBAAwB,OAAO;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,cAA+B;AAC7C,SAAO,aAAa,OAAO,CAAC;AAC9B;","names":[]}
@@ -0,0 +1,407 @@
1
+ import {
2
+ sandkitPolicyExport,
3
+ sandkitRunExport,
4
+ sandkitSetupStateExport,
5
+ sandkitWorkspaceExport
6
+ } from "./chunk-RMMOQD5Y.js";
7
+ import {
8
+ createId
9
+ } from "./chunk-DLGUA3H7.js";
10
+
11
+ // src/adapters/drizzle.ts
12
+ import { eq } from "drizzle-orm";
13
+ var defaultWorkspaceStatus = "active";
14
+ var defaultWorkspaceName = "default";
15
+ var workspaceStatuses = /* @__PURE__ */ new Set(["active", "inactive", "archived"]);
16
+ var runStatuses = /* @__PURE__ */ new Set(["started", "succeeded", "failed"]);
17
+ function corruptionError(table, column, reason) {
18
+ return new Error(`Sandkit durable state corruption in ${table}.${column}: ${reason}`);
19
+ }
20
+ function parseJsonOrThrow(table, column, value) {
21
+ try {
22
+ return JSON.parse(value);
23
+ } catch (error) {
24
+ throw corruptionError(table, column, error instanceof Error ? error.message : "invalid JSON");
25
+ }
26
+ }
27
+ function readJsonColumn(table, column, value) {
28
+ if (value === null || value === void 0) {
29
+ return void 0;
30
+ }
31
+ if (typeof value === "string") {
32
+ return parseJsonOrThrow(table, column, value);
33
+ }
34
+ return value;
35
+ }
36
+ function readWorkspaceStatus(value) {
37
+ if (workspaceStatuses.has(value)) {
38
+ return value;
39
+ }
40
+ throw corruptionError("sandkit_workspaces", "status", `unexpected value "${value}"`);
41
+ }
42
+ function readRunStatus(value) {
43
+ if (runStatuses.has(value)) {
44
+ return value;
45
+ }
46
+ throw corruptionError("sandkit_runs", "status", `unexpected value "${value}"`);
47
+ }
48
+ function toWorkspaceRow(workspace) {
49
+ return {
50
+ id: workspace.id,
51
+ name: workspace.name ?? defaultWorkspaceName,
52
+ metadata: workspace.metadata ? JSON.stringify(workspace.metadata) : null,
53
+ status: workspace.status,
54
+ sandboxId: workspace.sandboxId ?? null,
55
+ lastResumedAt: workspace.lastResumedAt ?? null,
56
+ createdAt: workspace.createdAt,
57
+ updatedAt: workspace.updatedAt
58
+ };
59
+ }
60
+ function toDriverTimestamp(value) {
61
+ if (value === null) {
62
+ return null;
63
+ }
64
+ if (typeof value === "string") {
65
+ return new Date(value);
66
+ }
67
+ return new Date(value);
68
+ }
69
+ function toIsoTimestamp(value) {
70
+ if (typeof value === "number") {
71
+ return new Date(value).toISOString();
72
+ }
73
+ if (value instanceof Date) {
74
+ return value.toISOString();
75
+ }
76
+ return value;
77
+ }
78
+ function toWorkspaceInsertValues(row) {
79
+ return {
80
+ id: row.id,
81
+ name: row.name,
82
+ metadata: row.metadata,
83
+ status: row.status,
84
+ sandboxId: row.sandboxId,
85
+ lastResumedAt: toDriverTimestamp(row.lastResumedAt ?? null),
86
+ createdAt: toDriverTimestamp(row.createdAt),
87
+ updatedAt: toDriverTimestamp(row.updatedAt)
88
+ };
89
+ }
90
+ function readMetadata(value) {
91
+ const parsed = readJsonColumn("sandkit_workspaces", "metadata", value);
92
+ if (parsed === void 0) {
93
+ return void 0;
94
+ }
95
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
96
+ return parsed;
97
+ }
98
+ throw corruptionError("sandkit_workspaces", "metadata", "expected JSON object");
99
+ }
100
+ function readSetupState(value) {
101
+ const parsed = readJsonColumn("sandkit_setup_states", "state", value);
102
+ if (parsed === void 0) {
103
+ throw corruptionError(
104
+ "sandkit_setup_states",
105
+ "state",
106
+ "expected persisted sandbox state object"
107
+ );
108
+ }
109
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
110
+ const candidate = parsed;
111
+ if (typeof candidate.kind === "string" && typeof candidate.sessionId === "string") {
112
+ return {
113
+ kind: candidate.kind,
114
+ sessionId: candidate.sessionId,
115
+ state: candidate.state
116
+ };
117
+ }
118
+ }
119
+ throw corruptionError("sandkit_setup_states", "state", "expected persisted sandbox state object");
120
+ }
121
+ function toWorkspaceRecord(row) {
122
+ return {
123
+ id: row.id,
124
+ name: row.name ?? void 0,
125
+ metadata: readMetadata(row.metadata),
126
+ status: readWorkspaceStatus(row.status),
127
+ sandboxId: row.sandboxId ?? void 0,
128
+ lastResumedAt: row.lastResumedAt === null ? void 0 : toIsoTimestamp(row.lastResumedAt),
129
+ createdAt: toIsoTimestamp(row.createdAt),
130
+ updatedAt: toIsoTimestamp(row.updatedAt)
131
+ };
132
+ }
133
+ function readRunArgs(value) {
134
+ const parsed = readJsonColumn("sandkit_runs", "args", value);
135
+ if (parsed === void 0) {
136
+ return void 0;
137
+ }
138
+ if (Array.isArray(parsed) && parsed.every((entry) => typeof entry === "string")) {
139
+ return parsed;
140
+ }
141
+ throw corruptionError("sandkit_runs", "args", "expected JSON string array");
142
+ }
143
+ function readProviderCommit(value) {
144
+ return readJsonColumn("sandkit_runs", "provider_commit", value);
145
+ }
146
+ function toRunRecord(row) {
147
+ return {
148
+ id: row.id,
149
+ workspaceId: row.workspace_id,
150
+ provider: row.provider,
151
+ executionTargetId: row.execution_target_id,
152
+ command: row.command,
153
+ args: readRunArgs(row.args),
154
+ status: readRunStatus(row.status),
155
+ exitCode: row.exit_code ?? void 0,
156
+ stdout: row.stdout ?? void 0,
157
+ stderr: row.stderr ?? void 0,
158
+ startedAt: toIsoTimestamp(row.started_at),
159
+ finishedAt: row.finished_at === null ? void 0 : toIsoTimestamp(row.finished_at),
160
+ policySnapshotId: row.policy_snapshot_id ?? void 0,
161
+ providerCommit: readProviderCommit(row.provider_commit)
162
+ };
163
+ }
164
+ function toRunInsertValues(input, workspaceId) {
165
+ return {
166
+ id: input.id,
167
+ workspace_id: workspaceId,
168
+ provider: input.provider,
169
+ execution_target_id: input.executionTargetId,
170
+ command: input.command,
171
+ args: input.args ? JSON.stringify(input.args) : null,
172
+ status: input.status,
173
+ policy_snapshot_id: input.policySnapshotId ?? null,
174
+ provider_commit: input.providerCommit === void 0 ? null : JSON.stringify(input.providerCommit),
175
+ started_at: toDriverTimestamp(input.startedAt),
176
+ exit_code: input.exitCode ?? null,
177
+ stdout: input.stdout ?? null,
178
+ stderr: input.stderr ?? null,
179
+ finished_at: input.finishedAt ? toDriverTimestamp(input.finishedAt) : null
180
+ };
181
+ }
182
+ async function selectWorkspaceById(db, workspaces, id) {
183
+ const rows = await db.select().from(workspaces).where(eq(workspaces.id, id)).limit(1);
184
+ const row = rows[0];
185
+ return row ? toWorkspaceRecord(row) : null;
186
+ }
187
+ async function selectRunById(db, runs, id) {
188
+ const rows = await db.select().from(runs).where(eq(runs.id, id)).limit(1);
189
+ const row = rows[0];
190
+ return row ? toRunRecord(row) : null;
191
+ }
192
+ async function selectSetupStateById(db, setupStates, id) {
193
+ const rows = await db.select().from(setupStates).where(eq(setupStates.id, id)).limit(1);
194
+ const row = rows[0];
195
+ return row ? toSetupStateRecord(row) : null;
196
+ }
197
+ function toSetupStateRecord(row) {
198
+ return {
199
+ id: row.id,
200
+ state: readSetupState(row.state),
201
+ createdAt: toIsoTimestamp(row.createdAt),
202
+ updatedAt: toIsoTimestamp(row.updatedAt)
203
+ };
204
+ }
205
+ function resolveTable(db, override, canonicalName, fallbackName) {
206
+ if (override) {
207
+ return override;
208
+ }
209
+ const fullSchema = db._?.fullSchema;
210
+ if (!fullSchema) {
211
+ throw new Error(
212
+ "Sandkit drizzleAdapter requires a Drizzle database with schema metadata to auto-resolve tables."
213
+ );
214
+ }
215
+ const canonical = fullSchema[canonicalName] ?? fullSchema[fallbackName] ?? fullSchema[fallbackName.replace("_", "")];
216
+ if (!canonical) {
217
+ throw new Error(
218
+ `Sandkit drizzleAdapter could not find "${canonicalName}" in drizzle schema. Generate schema with Sandkit defaults and pass the canonical table explicitly if auto-resolution fails.`
219
+ );
220
+ }
221
+ return canonical;
222
+ }
223
+ function drizzleAdapter(db, options) {
224
+ const resolvedWorkspaces = resolveTable(
225
+ db,
226
+ options.workspaces,
227
+ sandkitWorkspaceExport,
228
+ "sandkit_workspaces"
229
+ );
230
+ const resolvedRuns = resolveTable(db, options.runs, sandkitRunExport, "sandkit_runs");
231
+ const resolvedPolicySnapshots = resolveTable(
232
+ db,
233
+ options.policySnapshots,
234
+ sandkitPolicyExport,
235
+ "sandkit_policies"
236
+ );
237
+ const resolvedSetupStates = resolveTable(
238
+ db,
239
+ options.setupStates,
240
+ sandkitSetupStateExport,
241
+ "sandkit_setup_states"
242
+ );
243
+ const adapterId = options.id ?? `drizzle-${options.provider}`;
244
+ return {
245
+ id: adapterId,
246
+ workspaces: {
247
+ async createWorkspace(input = {}) {
248
+ const now = (/* @__PURE__ */ new Date()).toISOString();
249
+ const id = input.id?.trim() ? input.id.trim() : createId("workspace");
250
+ const workspace = {
251
+ id,
252
+ name: input.name ?? defaultWorkspaceName,
253
+ metadata: input.metadata ? { ...input.metadata } : void 0,
254
+ status: input.status ?? defaultWorkspaceStatus,
255
+ sandboxId: input.sandboxId === "" ? void 0 : input.sandboxId?.trim() || void 0,
256
+ lastResumedAt: input.lastResumedAt,
257
+ createdAt: now,
258
+ updatedAt: now
259
+ };
260
+ await db.insert(resolvedWorkspaces).values(toWorkspaceInsertValues(toWorkspaceRow(workspace)));
261
+ return workspace;
262
+ },
263
+ async getWorkspace(id) {
264
+ return selectWorkspaceById(db, resolvedWorkspaces, id);
265
+ },
266
+ async updateWorkspace(id, input) {
267
+ const current = await selectWorkspaceById(db, resolvedWorkspaces, id);
268
+ if (!current) {
269
+ throw new Error(`Workspace with id "${id}" does not exist`);
270
+ }
271
+ const next = {
272
+ ...current,
273
+ name: input.name ?? current.name,
274
+ metadata: input.metadata === void 0 ? current.metadata : {
275
+ ...current.metadata,
276
+ ...input.metadata
277
+ },
278
+ status: input.status ?? current.status,
279
+ sandboxId: input.sandboxId === null ? void 0 : input.sandboxId ?? current.sandboxId,
280
+ lastResumedAt: input.lastResumedAt === null ? void 0 : input.lastResumedAt ?? current.lastResumedAt,
281
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
282
+ };
283
+ await db.update(resolvedWorkspaces).set({
284
+ name: next.name ?? null,
285
+ metadata: next.metadata ? JSON.stringify(next.metadata) : null,
286
+ status: next.status,
287
+ sandboxId: next.sandboxId ?? null,
288
+ lastResumedAt: toDriverTimestamp(next.lastResumedAt ?? null),
289
+ updatedAt: toDriverTimestamp(next.updatedAt)
290
+ }).where(eq(resolvedWorkspaces.id, id));
291
+ return next;
292
+ }
293
+ },
294
+ setupStates: {
295
+ async getSetupState(id) {
296
+ return selectSetupStateById(db, resolvedSetupStates, id);
297
+ },
298
+ async putSetupState(input) {
299
+ const now = (/* @__PURE__ */ new Date()).toISOString();
300
+ const existing = await selectSetupStateById(db, resolvedSetupStates, input.id);
301
+ if (existing) {
302
+ await db.update(resolvedSetupStates).set({
303
+ state: JSON.stringify(input.state),
304
+ updatedAt: toDriverTimestamp(now)
305
+ }).where(eq(resolvedSetupStates.id, input.id));
306
+ return {
307
+ id: input.id,
308
+ state: input.state,
309
+ createdAt: existing.createdAt,
310
+ updatedAt: now
311
+ };
312
+ }
313
+ await db.insert(resolvedSetupStates).values({
314
+ id: input.id,
315
+ state: JSON.stringify(input.state),
316
+ createdAt: toDriverTimestamp(now),
317
+ updatedAt: toDriverTimestamp(now)
318
+ });
319
+ return {
320
+ id: input.id,
321
+ state: input.state,
322
+ createdAt: now,
323
+ updatedAt: now
324
+ };
325
+ },
326
+ async deleteSetupState(id) {
327
+ await db.delete(resolvedSetupStates).where(eq(resolvedSetupStates.id, id));
328
+ }
329
+ },
330
+ runs: {
331
+ async createRun(input) {
332
+ const now = (/* @__PURE__ */ new Date()).toISOString();
333
+ const id = input.id?.trim() ? input.id.trim() : createId("run");
334
+ const run = {
335
+ id,
336
+ workspaceId: input.workspaceId,
337
+ provider: input.provider,
338
+ executionTargetId: input.executionTargetId,
339
+ command: input.command,
340
+ args: input.args ?? [],
341
+ status: input.status ?? "started",
342
+ startedAt: input.startedAt ?? now,
343
+ policySnapshotId: input.policySnapshotId ?? void 0,
344
+ exitCode: void 0,
345
+ stdout: void 0,
346
+ stderr: void 0
347
+ };
348
+ await db.insert(resolvedRuns).values(toRunInsertValues(run, input.workspaceId));
349
+ return run;
350
+ },
351
+ async finishRun(id, input) {
352
+ const current = await selectRunById(db, resolvedRuns, id);
353
+ if (!current) {
354
+ throw new Error(`Run with id "${id}" does not exist`);
355
+ }
356
+ const next = {
357
+ ...current,
358
+ status: input.status,
359
+ finishedAt: input.finishedAt,
360
+ exitCode: input.exitCode ?? current.exitCode,
361
+ stdout: input.stdout ?? current.stdout,
362
+ stderr: input.stderr ?? current.stderr,
363
+ providerCommit: input.providerCommit ?? current.providerCommit
364
+ };
365
+ await db.update(resolvedRuns).set({
366
+ status: next.status,
367
+ exit_code: next.exitCode ?? null,
368
+ stdout: next.stdout ?? null,
369
+ stderr: next.stderr ?? null,
370
+ finished_at: toDriverTimestamp(next.finishedAt ?? null),
371
+ provider_commit: next.providerCommit === void 0 ? null : JSON.stringify(next.providerCommit)
372
+ }).where(eq(resolvedRuns.id, id));
373
+ return next;
374
+ }
375
+ },
376
+ policySnapshots: {
377
+ async createPolicySnapshot(input) {
378
+ const now = (/* @__PURE__ */ new Date()).toISOString();
379
+ const id = input.id?.trim() ? input.id.trim() : createId("policy-snapshot");
380
+ const createdAt = input.createdAt ?? now;
381
+ const record = {
382
+ id,
383
+ workspaceId: input.workspaceId,
384
+ policyId: input.policyId,
385
+ config: input.config,
386
+ createdAt
387
+ };
388
+ await db.insert(resolvedPolicySnapshots).values({
389
+ id,
390
+ workspace_id: record.workspaceId,
391
+ policy_id: record.policyId,
392
+ config: JSON.stringify(record.config),
393
+ created_at: toDriverTimestamp(createdAt)
394
+ });
395
+ return {
396
+ ...record,
397
+ id
398
+ };
399
+ }
400
+ }
401
+ };
402
+ }
403
+
404
+ export {
405
+ drizzleAdapter
406
+ };
407
+ //# sourceMappingURL=chunk-BDPTYR6V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/drizzle.ts"],"sourcesContent":["import { eq } from \"drizzle-orm\";\nimport type { SQLWrapper } from \"drizzle-orm\";\n\nimport { createId } from \"../core/ids.ts\";\nimport {\n sandkitPolicyExport,\n sandkitRunExport,\n sandkitSetupStateExport,\n sandkitWorkspaceExport,\n} from \"../schema/model.ts\";\nimport type {\n SandkitAdapter,\n WorkspaceCreateInput,\n WorkspaceRecord,\n WorkspaceMetadata,\n SharedSetupState,\n SharedSetupStateValue,\n SetupStateRecord,\n SetupStatePutInput,\n WorkspaceStatus,\n WorkspaceUpdateInput,\n RunCreateInput,\n RunFinishInput,\n RunRecord,\n PolicySnapshotCreateInput,\n PolicySnapshotRecord,\n RunStatus,\n} from \"./types.ts\";\n\ninterface DrizzleWorkspaceTableShape {\n readonly id: SQLWrapper;\n readonly name: unknown;\n readonly metadata: unknown;\n readonly status: unknown;\n readonly sandboxId: unknown;\n readonly lastResumedAt: unknown;\n readonly createdAt: unknown;\n readonly updatedAt: unknown;\n}\n\ninterface DrizzleRunTableShape {\n readonly id: SQLWrapper;\n readonly workspace_id: unknown;\n readonly provider: unknown;\n readonly execution_target_id: unknown;\n readonly command: unknown;\n readonly args: unknown;\n readonly status: unknown;\n readonly policy_snapshot_id: unknown;\n readonly provider_commit: unknown;\n readonly exit_code: unknown;\n readonly stdout: unknown;\n readonly stderr: unknown;\n readonly started_at: unknown;\n readonly finished_at: unknown;\n}\n\ninterface DrizzlePolicySnapshotTableShape {\n readonly id: SQLWrapper;\n readonly workspace_id: unknown;\n readonly policy_id: unknown;\n readonly config: unknown;\n readonly created_at: unknown;\n}\n\ninterface DrizzleSetupStateTableShape {\n readonly id: SQLWrapper;\n readonly state: unknown;\n readonly createdAt: unknown;\n readonly updatedAt: unknown;\n}\n\ninterface DrizzleSchemaMap {\n [key: string]: unknown;\n}\n\ninterface DrizzleMetadata {\n readonly fullSchema?: DrizzleSchemaMap;\n}\n\ninterface DrizzleDatabaseLike {\n select(): {\n from(table: object): {\n where(condition: unknown): {\n limit(limit: number): Promise<unknown[]>;\n };\n };\n };\n insert(table: object): {\n values(value: Record<string, unknown>): Promise<unknown>;\n };\n update(table: object): {\n set(value: Record<string, unknown>): {\n where(condition: unknown): Promise<unknown>;\n };\n };\n delete(table: object): {\n where(condition: unknown): Promise<unknown>;\n };\n readonly _?: DrizzleMetadata;\n}\n\ninterface DrizzleWorkspaceRow {\n id: string;\n name: string | null;\n metadata: unknown;\n status: WorkspaceStatus;\n sandboxId: string | null;\n lastResumedAt: string | number | Date | null;\n createdAt: string | number | Date;\n updatedAt: string | number | Date;\n}\n\ninterface DrizzleSetupStateRow {\n id: string;\n state: unknown;\n createdAt: string | number | Date;\n updatedAt: string | number | Date;\n}\n\ninterface DrizzleRunRow {\n id: string;\n workspace_id: string;\n provider: string;\n execution_target_id: string;\n command: string;\n args: unknown;\n status: string;\n policy_snapshot_id: string | null;\n provider_commit: unknown;\n exit_code: number | null;\n stdout: string | null;\n stderr: string | null;\n started_at: string | number | Date;\n finished_at: string | number | Date | null;\n}\n\nconst defaultWorkspaceStatus = \"active\";\nconst defaultWorkspaceName = \"default\";\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\nfunction parseJsonOrThrow(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 readJsonColumn(table: string, column: string, value: unknown): unknown {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n return parseJsonOrThrow(table, column, value);\n }\n\n return value;\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 toWorkspaceRow(workspace: WorkspaceRecord): DrizzleWorkspaceRow {\n return {\n id: workspace.id,\n name: workspace.name ?? defaultWorkspaceName,\n metadata: workspace.metadata ? JSON.stringify(workspace.metadata) : null,\n status: workspace.status,\n sandboxId: workspace.sandboxId ?? null,\n lastResumedAt: workspace.lastResumedAt ?? null,\n createdAt: workspace.createdAt,\n updatedAt: workspace.updatedAt,\n };\n}\n\nfunction toDriverTimestamp(value: string | number | Date | null): Date | null {\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"string\") {\n return new Date(value);\n }\n\n return new Date(value);\n}\n\nfunction toIsoTimestamp(value: string | number | Date): string {\n if (typeof value === \"number\") {\n return new Date(value).toISOString();\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n return value;\n}\n\nfunction toWorkspaceInsertValues(row: DrizzleWorkspaceRow): Record<string, unknown> {\n return {\n id: row.id,\n name: row.name,\n metadata: row.metadata,\n status: row.status,\n sandboxId: row.sandboxId,\n lastResumedAt: toDriverTimestamp(row.lastResumedAt ?? null),\n createdAt: toDriverTimestamp(row.createdAt),\n updatedAt: toDriverTimestamp(row.updatedAt),\n };\n}\n\nfunction readMetadata(value: unknown): WorkspaceRecord[\"metadata\"] {\n const parsed = readJsonColumn(\"sandkit_workspaces\", \"metadata\", value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed as WorkspaceMetadata;\n }\n\n throw corruptionError(\"sandkit_workspaces\", \"metadata\", \"expected JSON object\");\n}\n\nfunction readSetupState(value: unknown): SharedSetupState {\n const parsed = readJsonColumn(\"sandkit_setup_states\", \"state\", value);\n if (parsed === undefined) {\n throw corruptionError(\n \"sandkit_setup_states\",\n \"state\",\n \"expected persisted sandbox state object\",\n );\n }\n\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 toWorkspaceRecord(row: DrizzleWorkspaceRow): WorkspaceRecord {\n return {\n id: row.id,\n name: row.name ?? undefined,\n metadata: readMetadata(row.metadata),\n status: readWorkspaceStatus(row.status),\n sandboxId: row.sandboxId ?? undefined,\n lastResumedAt: row.lastResumedAt === null ? undefined : toIsoTimestamp(row.lastResumedAt),\n createdAt: toIsoTimestamp(row.createdAt),\n updatedAt: toIsoTimestamp(row.updatedAt),\n };\n}\n\nfunction readRunArgs(value: unknown): readonly string[] | undefined {\n const parsed = readJsonColumn(\"sandkit_runs\", \"args\", value);\n if (parsed === undefined) {\n return undefined;\n }\n\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: unknown): unknown {\n return readJsonColumn(\"sandkit_runs\", \"provider_commit\", value);\n}\n\nfunction toRunRecord(row: DrizzleRunRow): 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: toIsoTimestamp(row.started_at),\n finishedAt: row.finished_at === null ? undefined : toIsoTimestamp(row.finished_at),\n policySnapshotId: row.policy_snapshot_id ?? undefined,\n providerCommit: readProviderCommit(row.provider_commit),\n };\n}\n\nfunction toRunInsertValues(input: RunRecord, workspaceId: string): Record<string, unknown> {\n return {\n id: input.id,\n workspace_id: workspaceId,\n provider: input.provider,\n execution_target_id: input.executionTargetId,\n command: input.command,\n args: input.args ? JSON.stringify(input.args) : null,\n status: input.status,\n policy_snapshot_id: input.policySnapshotId ?? null,\n provider_commit:\n input.providerCommit === undefined ? null : JSON.stringify(input.providerCommit),\n started_at: toDriverTimestamp(input.startedAt),\n exit_code: input.exitCode ?? null,\n stdout: input.stdout ?? null,\n stderr: input.stderr ?? null,\n finished_at: input.finishedAt ? toDriverTimestamp(input.finishedAt) : null,\n };\n}\n\nasync function selectWorkspaceById<TWorkspaces extends DrizzleWorkspaceTableShape>(\n db: DrizzleDatabaseLike,\n workspaces: TWorkspaces,\n id: string,\n): Promise<WorkspaceRecord | null> {\n const rows = await db\n .select()\n .from(workspaces as object)\n .where(eq(workspaces.id, id))\n .limit(1);\n\n const row = rows[0] as DrizzleWorkspaceRow | undefined;\n return row ? toWorkspaceRecord(row) : null;\n}\n\nasync function selectRunById<TRuns extends DrizzleRunTableShape>(\n db: DrizzleDatabaseLike,\n runs: TRuns,\n id: string,\n): Promise<RunRecord | null> {\n const rows = await db\n .select()\n .from(runs as object)\n .where(eq(runs.id, id))\n .limit(1);\n\n const row = rows[0] as DrizzleRunRow | undefined;\n return row ? toRunRecord(row) : null;\n}\n\nasync function selectSetupStateById<TSetupStates extends DrizzleSetupStateTableShape>(\n db: DrizzleDatabaseLike,\n setupStates: TSetupStates,\n id: string,\n): Promise<SetupStateRecord | null> {\n const rows = await db\n .select()\n .from(setupStates as object)\n .where(eq(setupStates.id, id))\n .limit(1);\n\n const row = rows[0] as DrizzleSetupStateRow | undefined;\n return row ? toSetupStateRecord(row) : null;\n}\n\nfunction toSetupStateRecord(row: DrizzleSetupStateRow): SetupStateRecord {\n return {\n id: row.id,\n state: readSetupState(row.state),\n createdAt: toIsoTimestamp(row.createdAt),\n updatedAt: toIsoTimestamp(row.updatedAt),\n };\n}\n\nfunction resolveTable<TTable>(\n db: DrizzleDatabaseLike,\n override: TTable | undefined,\n canonicalName: string,\n fallbackName: string,\n): TTable {\n if (override) {\n return override;\n }\n\n const fullSchema = db._?.fullSchema;\n if (!fullSchema) {\n throw new Error(\n \"Sandkit drizzleAdapter requires a Drizzle database with schema metadata to auto-resolve tables.\",\n );\n }\n\n const canonical =\n fullSchema[canonicalName] ??\n fullSchema[fallbackName] ??\n fullSchema[fallbackName.replace(\"_\", \"\")];\n if (!canonical) {\n throw new Error(\n `Sandkit drizzleAdapter could not find \"${canonicalName}\" in drizzle schema. ` +\n `Generate schema with Sandkit defaults and pass the canonical table explicitly if auto-resolution fails.`,\n );\n }\n\n return canonical as TTable;\n}\n\nexport interface DrizzleAdapterOptions<\n TWorkspaces extends DrizzleWorkspaceTableShape,\n TRuns extends DrizzleRunTableShape,\n TPolicySnapshots extends DrizzlePolicySnapshotTableShape,\n TSetupStates extends DrizzleSetupStateTableShape = DrizzleSetupStateTableShape,\n> {\n provider: \"sqlite\" | \"postgresql\" | \"mysql\";\n workspaces?: TWorkspaces;\n runs?: TRuns;\n policySnapshots?: TPolicySnapshots;\n setupStates?: TSetupStates;\n id?: string;\n}\n\nexport function drizzleAdapter<\n TWorkspaces extends DrizzleWorkspaceTableShape,\n TRuns extends DrizzleRunTableShape,\n TPolicySnapshots extends DrizzlePolicySnapshotTableShape,\n TSetupStates extends DrizzleSetupStateTableShape = DrizzleSetupStateTableShape,\n>(\n db: DrizzleDatabaseLike,\n options: DrizzleAdapterOptions<TWorkspaces, TRuns, TPolicySnapshots, TSetupStates>,\n): SandkitAdapter {\n const resolvedWorkspaces = resolveTable(\n db,\n options.workspaces,\n sandkitWorkspaceExport,\n \"sandkit_workspaces\",\n );\n const resolvedRuns = resolveTable(db, options.runs, sandkitRunExport, \"sandkit_runs\");\n const resolvedPolicySnapshots = resolveTable(\n db,\n options.policySnapshots,\n sandkitPolicyExport,\n \"sandkit_policies\",\n );\n const resolvedSetupStates = resolveTable(\n db,\n options.setupStates,\n sandkitSetupStateExport,\n \"sandkit_setup_states\",\n );\n const adapterId = options.id ?? `drizzle-${options.provider}`;\n\n return {\n id: adapterId,\n workspaces: {\n async createWorkspace(input: WorkspaceCreateInput = {}) {\n const now = new Date().toISOString();\n const id = input.id?.trim() ? input.id.trim() : createId(\"workspace\");\n\n const workspace: WorkspaceRecord = {\n id,\n name: input.name ?? defaultWorkspaceName,\n metadata: input.metadata ? { ...input.metadata } : undefined,\n status: input.status ?? defaultWorkspaceStatus,\n sandboxId: input.sandboxId === \"\" ? undefined : input.sandboxId?.trim() || undefined,\n lastResumedAt: input.lastResumedAt,\n createdAt: now,\n updatedAt: now,\n };\n\n await db\n .insert(resolvedWorkspaces as object)\n .values(toWorkspaceInsertValues(toWorkspaceRow(workspace)));\n return workspace;\n },\n\n async getWorkspace(id: string) {\n return selectWorkspaceById(db, resolvedWorkspaces, id);\n },\n\n async updateWorkspace(id: string, input: WorkspaceUpdateInput) {\n const current = await selectWorkspaceById(db, resolvedWorkspaces, 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 ?? current.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\n ? undefined\n : (input.lastResumedAt ?? current.lastResumedAt),\n updatedAt: new Date().toISOString(),\n };\n\n await db\n .update(resolvedWorkspaces as object)\n .set({\n name: next.name ?? null,\n metadata: next.metadata ? JSON.stringify(next.metadata) : null,\n status: next.status,\n sandboxId: next.sandboxId ?? null,\n lastResumedAt: toDriverTimestamp(next.lastResumedAt ?? null),\n updatedAt: toDriverTimestamp(next.updatedAt),\n })\n .where(eq(resolvedWorkspaces.id, id));\n\n return next;\n },\n },\n setupStates: {\n async getSetupState(id: string) {\n return selectSetupStateById(db, resolvedSetupStates, id);\n },\n\n async putSetupState(input: SetupStatePutInput): Promise<SetupStateRecord> {\n const now = new Date().toISOString();\n const existing = await selectSetupStateById(db, resolvedSetupStates, input.id);\n\n if (existing) {\n await db\n .update(resolvedSetupStates as object)\n .set({\n state: JSON.stringify(input.state),\n updatedAt: toDriverTimestamp(now),\n })\n .where(eq(resolvedSetupStates.id, input.id));\n\n return {\n id: input.id,\n state: input.state,\n createdAt: existing.createdAt,\n updatedAt: now,\n };\n }\n\n await db.insert(resolvedSetupStates as object).values({\n id: input.id,\n state: JSON.stringify(input.state),\n createdAt: toDriverTimestamp(now),\n updatedAt: toDriverTimestamp(now),\n });\n\n return {\n id: input.id,\n state: input.state,\n createdAt: now,\n updatedAt: now,\n };\n },\n\n async deleteSetupState(id: string): Promise<void> {\n await db.delete(resolvedSetupStates as object).where(eq(resolvedSetupStates.id, id));\n },\n },\n runs: {\n async createRun(input: RunCreateInput): Promise<RunRecord> {\n const now = new Date().toISOString();\n const id = input.id?.trim() ? input.id.trim() : createId(\"run\");\n const run: RunRecord = {\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: input.startedAt ?? now,\n policySnapshotId: input.policySnapshotId ?? undefined,\n exitCode: undefined,\n stdout: undefined,\n stderr: undefined,\n };\n\n await db.insert(resolvedRuns as object).values(toRunInsertValues(run, input.workspaceId));\n return run;\n },\n\n async finishRun(id: string, input: RunFinishInput): Promise<RunRecord> {\n const current = await selectRunById(db, resolvedRuns, 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 await db\n .update(resolvedRuns as object)\n .set({\n status: next.status,\n exit_code: next.exitCode ?? null,\n stdout: next.stdout ?? null,\n stderr: next.stderr ?? null,\n finished_at: toDriverTimestamp(next.finishedAt ?? null),\n provider_commit:\n next.providerCommit === undefined ? null : JSON.stringify(next.providerCommit),\n })\n .where(eq((resolvedRuns as DrizzleRunTableShape).id, id));\n\n return next;\n },\n },\n policySnapshots: {\n async createPolicySnapshot(input: PolicySnapshotCreateInput): Promise<PolicySnapshotRecord> {\n const now = new Date().toISOString();\n const id = input.id?.trim() ? input.id.trim() : createId(\"policy-snapshot\");\n const createdAt = input.createdAt ?? now;\n const record: Omit<PolicySnapshotRecord, \"id\"> & { id: string } = {\n id,\n workspaceId: input.workspaceId,\n policyId: input.policyId,\n config: input.config,\n createdAt,\n };\n\n await db.insert(resolvedPolicySnapshots as object).values({\n id,\n workspace_id: record.workspaceId,\n policy_id: record.policyId,\n config: JSON.stringify(record.config),\n created_at: toDriverTimestamp(createdAt),\n });\n\n return {\n ...record,\n id,\n };\n },\n },\n };\n}\n\nexport type DrizzleWorkspaceTable = DrizzleWorkspaceTableShape;\nexport type DrizzleRunTable = DrizzleRunTableShape;\n"],"mappings":"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","names":[]}