db4ai 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/chunk-3DWAMVV5.js +305 -0
  2. package/dist/chunk-3DWAMVV5.js.map +1 -0
  3. package/dist/chunk-COTPYBYM.js +618 -0
  4. package/dist/chunk-COTPYBYM.js.map +1 -0
  5. package/dist/chunk-EERD6CDF.js +735 -0
  6. package/dist/chunk-EERD6CDF.js.map +1 -0
  7. package/dist/chunk-FUF4HJTC.js +758 -0
  8. package/dist/chunk-FUF4HJTC.js.map +1 -0
  9. package/dist/chunk-JLL6FH5L.js +16 -0
  10. package/dist/chunk-JLL6FH5L.js.map +1 -0
  11. package/dist/chunk-JXFW6AIT.js +192 -0
  12. package/dist/chunk-JXFW6AIT.js.map +1 -0
  13. package/dist/chunk-XLSYCQPG.js +854 -0
  14. package/dist/chunk-XLSYCQPG.js.map +1 -0
  15. package/dist/chunk-Y5IXAS7F.js +569 -0
  16. package/dist/chunk-Y5IXAS7F.js.map +1 -0
  17. package/dist/cli/bin.d.ts +13 -12
  18. package/dist/cli/bin.js +277 -307
  19. package/dist/cli/bin.js.map +1 -1
  20. package/dist/cli/dashboard/index.d.ts +295 -14
  21. package/dist/cli/dashboard/index.js +60 -15
  22. package/dist/cli/dashboard/index.js.map +1 -1
  23. package/dist/cli/index.d.ts +10 -16
  24. package/dist/cli/index.js +94 -47
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/runtime/index.d.ts +52 -23
  27. package/dist/cli/runtime/index.js +10 -704
  28. package/dist/cli/runtime/index.js.map +1 -1
  29. package/dist/cli/scanner/index.d.ts +17 -15
  30. package/dist/cli/scanner/index.js +8 -639
  31. package/dist/cli/scanner/index.js.map +1 -1
  32. package/dist/cli/seed/index.d.ts +16 -12
  33. package/dist/cli/seed/index.js +12 -773
  34. package/dist/cli/seed/index.js.map +1 -1
  35. package/dist/cli/sync/index.d.ts +54 -53
  36. package/dist/cli/sync/index.js +23 -704
  37. package/dist/cli/sync/index.js.map +1 -1
  38. package/dist/cli/terminal.d.ts +9 -8
  39. package/dist/cli/terminal.js +6 -209
  40. package/dist/cli/terminal.js.map +1 -1
  41. package/dist/cli/workflow/index.d.ts +18 -10
  42. package/dist/cli/workflow/index.js +6 -307
  43. package/dist/cli/workflow/index.js.map +1 -1
  44. package/dist/handlers.d.ts +10 -9
  45. package/dist/handlers.js +6 -38
  46. package/dist/handlers.js.map +1 -1
  47. package/dist/index.d.ts +120 -118
  48. package/dist/index.js +1963 -3125
  49. package/dist/index.js.map +1 -1
  50. package/package.json +3 -4
  51. package/dist/cli/bin.d.ts.map +0 -1
  52. package/dist/cli/dashboard/App.d.ts +0 -16
  53. package/dist/cli/dashboard/App.d.ts.map +0 -1
  54. package/dist/cli/dashboard/App.js +0 -116
  55. package/dist/cli/dashboard/App.js.map +0 -1
  56. package/dist/cli/dashboard/components/index.d.ts +0 -70
  57. package/dist/cli/dashboard/components/index.d.ts.map +0 -1
  58. package/dist/cli/dashboard/components/index.js +0 -192
  59. package/dist/cli/dashboard/components/index.js.map +0 -1
  60. package/dist/cli/dashboard/hooks/index.d.ts +0 -76
  61. package/dist/cli/dashboard/hooks/index.d.ts.map +0 -1
  62. package/dist/cli/dashboard/hooks/index.js +0 -201
  63. package/dist/cli/dashboard/hooks/index.js.map +0 -1
  64. package/dist/cli/dashboard/index.d.ts.map +0 -1
  65. package/dist/cli/dashboard/types.d.ts +0 -84
  66. package/dist/cli/dashboard/types.d.ts.map +0 -1
  67. package/dist/cli/dashboard/types.js +0 -5
  68. package/dist/cli/dashboard/types.js.map +0 -1
  69. package/dist/cli/dashboard/views/index.d.ts +0 -51
  70. package/dist/cli/dashboard/views/index.d.ts.map +0 -1
  71. package/dist/cli/dashboard/views/index.js +0 -72
  72. package/dist/cli/dashboard/views/index.js.map +0 -1
  73. package/dist/cli/index.d.ts.map +0 -1
  74. package/dist/cli/runtime/index.d.ts.map +0 -1
  75. package/dist/cli/scanner/index.d.ts.map +0 -1
  76. package/dist/cli/seed/index.d.ts.map +0 -1
  77. package/dist/cli/sync/index.d.ts.map +0 -1
  78. package/dist/cli/terminal.d.ts.map +0 -1
  79. package/dist/cli/workflow/index.d.ts.map +0 -1
  80. package/dist/errors.d.ts +0 -43
  81. package/dist/errors.d.ts.map +0 -1
  82. package/dist/errors.js +0 -47
  83. package/dist/errors.js.map +0 -1
  84. package/dist/handlers.d.ts.map +0 -1
  85. package/dist/index.d.ts.map +0 -1
  86. package/dist/types.d.ts +0 -276
  87. package/dist/types.d.ts.map +0 -1
  88. package/dist/types.js +0 -12
  89. package/dist/types.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../cli/seed/index.ts"],"sourcesContent":["/**\n * Module 15: Seed Runner\n *\n * Executes static and generated seeds with progress tracking.\n *\n * Two seed types:\n * - Static (Seed()): Load from API or inline data, apply transforms, mark readOnly\n * - Generated (Generate()): Use LLM, apply constraints/variations, handle cascading\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SeedProgress {\n seedName: string\n type: string\n phase: 'static' | 'generated'\n current: number\n total: number\n percentage: number\n rate?: number\n eta?: number\n}\n\nexport interface SeedResult {\n success: boolean\n created: number\n skipped: number\n errors: SeedErrorInfo[]\n partial: boolean\n duration: number\n resumeToken?: string\n dryRun?: boolean\n wouldCreate?: Record<string, number>\n executionOrder?: string[]\n}\n\nexport interface SeedErrorInfo {\n message: string\n position?: number\n entity?: unknown\n}\n\nexport class SeedError extends Error {\n seedName?: string\n type?: string\n position?: number\n\n constructor(\n message: string,\n context?: { seedName?: string; type?: string; position?: number }\n ) {\n super(message)\n this.name = 'SeedError'\n if (context) {\n this.seedName = context.seedName\n this.type = context.type\n this.position = context.position\n }\n }\n}\n\n// Base config shared by both seed types\ninterface BaseSeedConfig {\n type: string\n readOnly?: boolean\n concurrency?: number\n}\n\n// Static seed configuration\nexport interface SeedConfig extends BaseSeedConfig {\n kind: 'static'\n data?: Array<Record<string, unknown>>\n source?: string\n headers?: Record<string, string>\n dataPath?: string\n nextPath?: string\n retries?: number\n transform?: (data: unknown) => unknown[] | Promise<unknown[]>\n fieldMapping?: Record<string, string>\n}\n\n// Generated seed configuration\nexport interface GenerateConfig extends BaseSeedConfig {\n kind: 'generated'\n count?: number\n ids?: string[]\n prompt: string\n constraints?: Record<string, unknown>\n variations?: Array<{ weight?: number; [key: string]: unknown }>\n cascade?: boolean\n cascadeDepth?: number\n cascadeReuse?: boolean\n}\n\n// Input types for helper functions\ninterface SeedInput {\n type: string\n data?: Array<Record<string, unknown>>\n source?: string\n headers?: Record<string, string>\n dataPath?: string\n nextPath?: string\n retries?: number\n transform?: (data: unknown) => unknown[] | Promise<unknown[]>\n fieldMapping?: Record<string, string>\n readOnly?: boolean\n concurrency?: number\n}\n\ninterface GenerateInput {\n type: string\n count?: number\n ids?: string[]\n prompt: string\n constraints?: Record<string, unknown>\n variations?: Array<{ weight?: number; [key: string]: unknown }>\n cascade?: boolean\n cascadeDepth?: number\n cascadeReuse?: boolean\n readOnly?: boolean\n concurrency?: number\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nexport function Seed(input: SeedInput): SeedConfig {\n if (!input.data && !input.source) {\n throw new SeedError('Static seed must have data or source')\n }\n return {\n kind: 'static',\n type: input.type,\n data: input.data,\n source: input.source,\n headers: input.headers,\n dataPath: input.dataPath,\n nextPath: input.nextPath,\n retries: input.retries,\n transform: input.transform,\n fieldMapping: input.fieldMapping,\n readOnly: input.readOnly,\n concurrency: input.concurrency,\n }\n}\n\nexport function Generate(input: GenerateInput): GenerateConfig {\n // Default count to 1 if neither count nor ids is provided\n const count = input.count ?? (input.ids ? undefined : 1)\n\n // Validate that at least one of count or ids is resolvable\n // Only throw if after defaulting, we still don't have a valid count\n if (count === undefined && !input.ids) {\n throw new SeedError('Generated seed must have count or ids')\n }\n\n return {\n kind: 'generated',\n type: input.type,\n count,\n ids: input.ids,\n prompt: input.prompt,\n constraints: input.constraints,\n variations: input.variations,\n cascade: input.cascade,\n cascadeDepth: input.cascadeDepth,\n cascadeReuse: input.cascadeReuse,\n readOnly: input.readOnly,\n concurrency: input.concurrency,\n }\n}\n\n// =============================================================================\n// Database Interface\n// =============================================================================\n\ninterface DB {\n schema: Record<string, unknown>\n get: (type: string, id: string) => Promise<unknown>\n create: (type: string, data: unknown) => Promise<unknown>\n list: (type: string) => Promise<unknown[]>\n generate: (config: {\n type: string\n id?: string\n prompt?: string\n constraints?: Record<string, unknown>\n [key: string]: unknown\n }) => Promise<unknown>\n clear: (type: string) => Promise<void>\n}\n\n// =============================================================================\n// Storage Interface\n// =============================================================================\n\ninterface Storage {\n get: (key: string) => Promise<string | undefined>\n set: (key: string, value: string) => Promise<void>\n}\n\n// =============================================================================\n// Runner Options\n// =============================================================================\n\ninterface RunnerOptions {\n seeds: Record<string, SeedConfig | GenerateConfig>\n onProgress?: (progress: SeedProgress) => void\n onCheckpoint?: (position: number) => void\n onWarning?: (message: string) => void\n onEntity?: (type: string, data: unknown) => void\n beforeSeed?: (\n seedName: string,\n config: SeedConfig | GenerateConfig\n ) => SeedConfig | GenerateConfig | null | undefined | void\n afterSeed?: (seedName: string, result: SeedResult) => void\n continueOnError?: boolean\n timeout?: number\n order?: string[]\n validateSchema?: boolean | 'warn'\n concurrency?: number\n dryRun?: boolean\n skipExisting?: boolean\n storage?: Storage\n persist?: boolean\n /** Enable caching of seed results to avoid re-processing */\n enableCache?: boolean\n /** Batch size for insertions (default: 1 for sequential) */\n batchSize?: number\n}\n\ninterface RunOptions {\n resume?: string\n cascade?: boolean\n}\n\ninterface ResetOptions {\n cascade?: boolean\n preserveReadOnly?: boolean\n}\n\n// =============================================================================\n// Seed Runner Interface\n// =============================================================================\n\nexport interface SeedRunner {\n run: (seedName: string, options?: RunOptions) => Promise<SeedResult>\n runAll: () => Promise<SeedResult>\n reset: (seedName: string, options?: ResetOptions) => Promise<SeedResult>\n resetAll: (options?: ResetOptions) => Promise<SeedResult>\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\nexport function createSeedRunner(db: DB, options: RunnerOptions): SeedRunner {\n const {\n seeds,\n onProgress,\n onCheckpoint,\n onWarning,\n onEntity,\n beforeSeed,\n afterSeed,\n continueOnError = false,\n timeout,\n order,\n validateSchema = false,\n concurrency: globalConcurrency = 1,\n dryRun = false,\n skipExisting = false,\n storage,\n persist = false,\n enableCache = false,\n batchSize = 1,\n } = options\n\n // =============================================================================\n // Seed Result Cache\n // =============================================================================\n\n /** Cache for seed results to avoid re-processing */\n const seedResultCache = new Map<string, SeedResult>()\n\n /** Cache for entity existence checks to reduce db.get calls */\n const entityExistsCache = new Map<string, boolean>()\n\n /** Get cache key for entity existence */\n function getEntityCacheKey(type: string, id: string): string {\n return `${type}:${id}`\n }\n\n /** Check if entity exists (with caching) */\n async function checkEntityExists(type: string, id: string): Promise<boolean> {\n const cacheKey = getEntityCacheKey(type, id)\n\n if (enableCache && entityExistsCache.has(cacheKey)) {\n return entityExistsCache.get(cacheKey)!\n }\n\n const existing = await db.get(type, id)\n const exists = existing !== null && existing !== undefined\n\n if (enableCache) {\n entityExistsCache.set(cacheKey, exists)\n }\n\n return exists\n }\n\n /** Mark entity as existing in cache */\n function markEntityCreated(type: string, id: string): void {\n if (enableCache) {\n entityExistsCache.set(getEntityCacheKey(type, id), true)\n }\n }\n\n /** Clear caches */\n function clearCaches(): void {\n seedResultCache.clear()\n entityExistsCache.clear()\n }\n\n // =============================================================================\n // Batch Processing\n // =============================================================================\n\n /** Batch accumulator for optimized insertions */\n interface BatchItem {\n type: string\n data: Record<string, unknown>\n position: number\n }\n\n /** Process a batch of entities */\n async function processBatch(\n batch: BatchItem[],\n seedName: string,\n total: number,\n phase: 'static' | 'generated',\n startTime: number\n ): Promise<number> {\n if (batch.length === 0) return 0\n\n let createdCount = 0\n\n // Process each item in the batch\n // Note: If db.create supported batch operations, we'd use that here\n // For now, we parallelize within the batch for performance\n await Promise.all(\n batch.map(async (item) => {\n await db.create(item.type, item.data)\n markEntityCreated(item.type, item.data.id as string)\n createdCount++\n\n if (onEntity) {\n onEntity(item.type, item.data)\n }\n\n reportProgress(seedName, item.type, phase, item.position, total, startTime)\n })\n )\n\n return createdCount\n }\n\n // =============================================================================\n // Progress Reporting (extracted to reduce duplication)\n // =============================================================================\n\n /** Report progress for entity creation */\n function reportProgress(\n seedName: string,\n type: string,\n phase: 'static' | 'generated',\n position: number,\n total: number,\n startTime: number\n ): void {\n if (onCheckpoint) {\n onCheckpoint(position)\n }\n\n if (onProgress) {\n const elapsedMs = Date.now() - startTime\n const rate = position / (elapsedMs / 1000)\n const eta = total > position\n ? Math.round((elapsedMs / position) * (total - position))\n : 0\n\n onProgress({\n seedName,\n type,\n phase,\n current: position,\n total,\n percentage: Math.round((position / total) * 100),\n rate,\n eta,\n })\n }\n }\n\n /** Persist checkpoint state to storage */\n async function persistCheckpoint(\n seedName: string,\n position: number,\n total: number\n ): Promise<void> {\n if (persist && storage) {\n await storage.set(\n `seed:${seedName}:state`,\n JSON.stringify({ position, total })\n )\n }\n }\n\n // Helper: Extract references from schema type definition\n function extractReferences(typeDef: unknown): Array<{ type: string; fuzzy: boolean; field: string }> {\n const refs: Array<{ type: string; fuzzy: boolean; field: string }> = []\n if (!typeDef || typeof typeDef !== 'object') return refs\n\n for (const [field, value] of Object.entries(typeDef)) {\n if (typeof value === 'string') {\n // Match patterns like '->Type', '~>Type', '->Type[]', '->Type?'\n const hardMatch = value.match(/^->([A-Z][a-zA-Z0-9]*)/)\n if (hardMatch) {\n refs.push({ type: hardMatch[1], fuzzy: false, field })\n }\n const fuzzyMatch = value.match(/^~>([A-Z][a-zA-Z0-9]*)/)\n if (fuzzyMatch) {\n refs.push({ type: fuzzyMatch[1], fuzzy: true, field })\n }\n }\n }\n return refs\n }\n\n // Helper: Get reference type names only (for backward compatibility)\n function extractReferenceTypes(typeDef: unknown): string[] {\n return extractReferences(typeDef).map(r => r.type)\n }\n\n // Helper: Check if type is readOnly\n function isReadOnlyType(typeName: string): boolean {\n const typeDef = db.schema[typeName]\n if (typeDef && typeof typeDef === 'object' && '_readOnly' in typeDef) {\n return !!(typeDef as Record<string, unknown>)._readOnly\n }\n return false\n }\n\n // Helper: Get seed's type name\n function getSeedType(config: SeedConfig | GenerateConfig): string {\n return config.type\n }\n\n // Helper: Topological sort for dependency order\n function computeExecutionOrder(): string[] {\n const seedNames = Object.keys(seeds)\n\n // Build dependency graph\n const deps = new Map<string, Set<string>>()\n const typeToSeed = new Map<string, string>()\n\n for (const name of seedNames) {\n deps.set(name, new Set())\n typeToSeed.set(getSeedType(seeds[name]), name)\n }\n\n // Add dependencies based on schema references\n for (const name of seedNames) {\n const config = seeds[name]\n const typeDef = db.schema[config.type]\n const refs = extractReferenceTypes(typeDef)\n\n for (const ref of refs) {\n const depSeed = typeToSeed.get(ref)\n if (depSeed && depSeed !== name) {\n deps.get(name)!.add(depSeed)\n }\n }\n }\n\n // Static seeds should come first (add implicit dependencies)\n const staticSeeds = seedNames.filter((n) => seeds[n].kind === 'static')\n const generatedSeeds = seedNames.filter((n) => seeds[n].kind === 'generated')\n\n for (const gen of generatedSeeds) {\n for (const stat of staticSeeds) {\n if (!deps.get(gen)!.has(stat)) {\n // Only add if there's a potential reference or just ordering preference\n deps.get(gen)!.add(stat)\n }\n }\n }\n\n // Topological sort with cycle detection\n const result: string[] = []\n const visited = new Set<string>()\n const visiting = new Set<string>()\n\n function visit(name: string): void {\n if (visited.has(name)) return\n if (visiting.has(name)) {\n throw new SeedError(`Circular dependency detected involving seed \"${name}\"`)\n }\n\n visiting.add(name)\n\n for (const dep of deps.get(name) || []) {\n visit(dep)\n }\n\n visiting.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of seedNames) {\n visit(name)\n }\n\n return result\n }\n\n // Helper: Apply field mapping\n function applyFieldMapping(\n data: Record<string, unknown>,\n mapping: Record<string, string>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [from, to] of Object.entries(mapping)) {\n if (from in data) {\n result[to] = data[from]\n }\n }\n // Copy unmapped fields\n for (const [key, value] of Object.entries(data)) {\n if (!(key in mapping)) {\n result[key] = value\n }\n }\n return result\n }\n\n // Helper: Extract data from JSON using simple path\n function extractDataPath(data: unknown, path: string): unknown[] {\n if (!path.startsWith('$.')) return Array.isArray(data) ? data : []\n const key = path.slice(2)\n if (data && typeof data === 'object' && key in data) {\n const result = (data as Record<string, unknown>)[key]\n return Array.isArray(result) ? result : []\n }\n return []\n }\n\n // Helper: Extract next URL from response\n function extractNextPath(data: unknown, path: string): string | null {\n if (!path.startsWith('$.')) return null\n const key = path.slice(2)\n if (data && typeof data === 'object' && key in data) {\n const result = (data as Record<string, unknown>)[key]\n return typeof result === 'string' ? result : null\n }\n return null\n }\n\n // Helper: Fetch with retry\n async function fetchWithRetry(\n url: string,\n headers?: Record<string, string>,\n retries = 1\n ): Promise<Response> {\n let lastError: Error | undefined\n for (let i = 0; i < retries; i++) {\n try {\n // Only pass options if we have headers to avoid passing undefined\n const response = headers\n ? await fetch(url, { headers })\n : await fetch(url)\n if (response.ok) return response\n if (i === retries - 1) {\n throw new SeedError(\n `API request failed: ${response.status} ${response.statusText}`\n )\n }\n } catch (error) {\n lastError = error as Error\n if (i === retries - 1) {\n throw lastError\n }\n }\n }\n throw lastError || new SeedError('Fetch failed')\n }\n\n // Helper: Run with timeout\n function withTimeout<T>(promise: Promise<T>, ms?: number): Promise<T> {\n if (!ms) return promise\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new SeedError('Operation timeout exceeded'))\n }, ms)\n promise\n .then((result) => {\n clearTimeout(timer)\n resolve(result)\n })\n .catch((error) => {\n clearTimeout(timer)\n reject(error)\n })\n })\n }\n\n // Helper: Run tasks with concurrency limit\n async function runWithConcurrency<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n limit: number\n ): Promise<R[]> {\n const results: R[] = new Array(items.length)\n let currentIndex = 0\n\n async function runNext(): Promise<void> {\n while (currentIndex < items.length) {\n const index = currentIndex++\n results[index] = await fn(items[index], index)\n }\n }\n\n const workers = Array.from({ length: Math.min(limit, items.length) }, () =>\n runNext()\n )\n await Promise.all(workers)\n return results\n }\n\n // Helper: Select variation based on weights\n function selectVariation(\n variations: Array<{ weight?: number; [key: string]: unknown }>,\n index: number,\n total: number\n ): Record<string, unknown> {\n if (variations.length === 0) return {}\n\n // Normalize weights\n const totalWeight = variations.reduce((sum, v) => sum + (v.weight ?? 1), 0)\n const normalizedWeights = variations.map((v) => (v.weight ?? 1) / totalWeight)\n\n // Distribute evenly based on index when possible\n let cumulative = 0\n const position = index / total\n\n for (let i = 0; i < variations.length; i++) {\n cumulative += normalizedWeights[i]\n if (position < cumulative || i === variations.length - 1) {\n const { weight: _, ...rest } = variations[i]\n return rest\n }\n }\n\n const { weight: _, ...rest } = variations[0]\n return rest\n }\n\n // Helper: Cascade generate referenced entities recursively\n async function cascadeGenerate(\n typeName: string,\n result: unknown,\n remainingDepth: number,\n reuse: boolean,\n visited: Set<string>\n ): Promise<void> {\n if (remainingDepth <= 0) return\n\n const typeDef = db.schema[typeName]\n const refs = extractReferences(typeDef)\n\n for (const ref of refs) {\n // Skip already visited types to prevent infinite loops\n const visitKey = `${typeName}:${ref.field}:${ref.type}`\n if (visited.has(visitKey)) continue\n visited.add(visitKey)\n\n // For fuzzy references, list existing entities for matching\n // This happens even for readOnly types since we're matching, not generating\n if (ref.fuzzy) {\n await db.list(ref.type)\n // Don't generate for fuzzy references, just list for matching\n continue\n }\n\n // Skip readOnly types for hard references (we can't generate them)\n if (isReadOnlyType(ref.type)) continue\n\n // Check if we need to create the referenced entity\n const refId =\n result && typeof result === 'object'\n ? ((result as Record<string, unknown>)[ref.field] as string)\n : undefined\n\n if (reuse && refId) {\n const existing = await db.get(ref.type, refId)\n if (existing) continue\n }\n\n // Generate referenced entity\n const generatedRef = await db.generate({\n type: ref.type,\n prompt: `${ref.type} for ${typeName}`,\n })\n\n // Recursively cascade if we have depth left\n if (remainingDepth > 1) {\n await cascadeGenerate(\n ref.type,\n generatedRef,\n remainingDepth - 1,\n reuse,\n visited\n )\n }\n }\n }\n\n // Helper: Validate schema\n function validateSchemaField(\n typeName: string,\n fieldName: string,\n strict: boolean\n ): boolean {\n const typeDef = db.schema[typeName]\n if (!typeDef || typeof typeDef !== 'object') {\n if (strict) {\n throw new SeedError(`Type \"${typeName}\" not found in schema`)\n }\n return false\n }\n\n if (fieldName === 'weight') return true // Special case for variations\n\n if (!(fieldName in typeDef)) {\n if (strict) {\n throw new SeedError(`Field \"${fieldName}\" not found in ${typeName}`)\n }\n if (onWarning) {\n onWarning(`Field \"${fieldName}\" not found in ${typeName}`)\n }\n return false\n }\n return true\n }\n\n // Run a single seed\n async function runSeed(\n seedName: string,\n config: SeedConfig | GenerateConfig,\n runOpts?: RunOptions\n ): Promise<SeedResult> {\n const startTime = Date.now()\n const errors: SeedErrorInfo[] = []\n let created = 0\n let skipped = 0\n let partial = false\n let resumeToken: string | undefined\n\n // Parse resume token\n let startPosition = 0\n if (runOpts?.resume) {\n try {\n const resumeData = JSON.parse(\n Buffer.from(runOpts.resume, 'base64').toString()\n )\n if (resumeData[seedName]?.position) {\n startPosition = resumeData[seedName].position\n }\n } catch {\n // Invalid resume token, start from beginning\n }\n }\n\n // Validate type exists in schema\n if (validateSchema === true) {\n if (!db.schema[config.type]) {\n throw new SeedError(`Type \"${config.type}\" not found in schema`, {\n seedName,\n type: config.type,\n })\n }\n }\n\n const phase: 'static' | 'generated' = config.kind === 'static' ? 'static' : 'generated'\n\n if (config.kind === 'static') {\n // Static seed\n let data: unknown[]\n\n if (config.data) {\n data = [...config.data]\n // Apply transform to inline data\n if (config.transform) {\n data = (await config.transform(data)) as unknown[]\n }\n } else if (config.source) {\n // Fetch from API\n let allData: unknown[] = []\n let url: string | null = config.source\n\n while (url) {\n const response = await fetchWithRetry(url, config.headers, config.retries || 1)\n const json = await response.json()\n\n // If there's a transform, apply it to the raw response\n // The transform is responsible for extracting the data array\n if (config.transform) {\n const transformed = (await config.transform(json)) as unknown[]\n allData = allData.concat(transformed)\n // Check for pagination after transform\n if (config.nextPath) {\n url = extractNextPath(json, config.nextPath)\n } else {\n url = null\n }\n } else if (config.dataPath) {\n const pageData = extractDataPath(json, config.dataPath)\n allData = allData.concat(pageData)\n // Check for pagination\n if (config.nextPath) {\n url = extractNextPath(json, config.nextPath)\n } else {\n url = null\n }\n } else if (Array.isArray(json)) {\n allData = allData.concat(json)\n url = null\n } else if (json.data && Array.isArray(json.data)) {\n allData = allData.concat(json.data)\n url = null\n } else {\n allData.push(json)\n url = null\n }\n }\n\n data = allData\n } else {\n data = []\n }\n\n // Apply field mapping\n if (config.fieldMapping) {\n data = data.map((item) =>\n applyFieldMapping(item as Record<string, unknown>, config.fieldMapping!)\n )\n }\n\n const total = data.length\n const concurrency = config.concurrency ?? globalConcurrency\n\n // Process items\n const processItem = async (item: Record<string, unknown>, index: number) => {\n const position = index + 1\n\n // Check if entity already exists (using cache when enabled)\n const id = (item as Record<string, unknown>).id as string | undefined\n if (id) {\n const exists = await checkEntityExists(config.type, id)\n if (exists) {\n skipped++\n return\n }\n }\n\n // Add readOnly flag if needed\n const entityData: Record<string, unknown> = config.readOnly ? { ...item, _readOnly: true } : { ...item }\n\n // Generate ID if not provided\n if (!entityData.id) {\n const name = entityData.name as string | undefined\n entityData.id = name\n ? name.toLowerCase().replace(/\\s+/g, '-')\n : `${config.type.toLowerCase()}-${Date.now()}-${Math.random().toString(36).slice(2)}`\n }\n\n if (!dryRun) {\n await db.create(config.type, entityData)\n // Mark entity as created in cache\n markEntityCreated(config.type, entityData.id as string)\n if (onEntity) {\n onEntity(config.type, entityData)\n }\n }\n\n created++\n\n // Report progress using extracted helper\n reportProgress(seedName, config.type, phase, position, total, startTime)\n\n // Persist checkpoint state\n await persistCheckpoint(seedName, position, total)\n }\n\n if (concurrency > 1) {\n await runWithConcurrency(\n data as Record<string, unknown>[],\n processItem,\n concurrency\n )\n } else {\n for (let i = 0; i < data.length; i++) {\n await processItem(data[i] as Record<string, unknown>, i)\n }\n }\n } else {\n // Generated seed\n const count = config.ids?.length ?? config.count ?? 1\n const total = count - startPosition\n const concurrency = config.concurrency ?? globalConcurrency\n\n // Validate constraints\n if (validateSchema && config.constraints) {\n const strict = validateSchema === true\n for (const field of Object.keys(config.constraints)) {\n validateSchemaField(config.type, field, strict)\n }\n }\n\n // Validate variations\n if (validateSchema && config.variations) {\n const strict = validateSchema === true\n for (const variation of config.variations) {\n for (const field of Object.keys(variation)) {\n if (field !== 'weight') {\n validateSchemaField(config.type, field, strict)\n }\n }\n }\n }\n\n // Resolve reference constraints\n let resolvedConstraints = config.constraints ? { ...config.constraints } : undefined\n if (resolvedConstraints) {\n for (const [key, value] of Object.entries(resolvedConstraints)) {\n if (value && typeof value === 'object' && 'ref' in value) {\n const refType = (value as { ref: string }).ref\n await db.list(refType)\n // Keep constraint as-is for generation\n }\n }\n }\n\n // Generate entities\n const generateEntity = async (index: number): Promise<void> => {\n const actualIndex = startPosition + index\n const position = actualIndex + 1\n\n // Get ID (from ids array or generate)\n const id = config.ids?.[actualIndex]\n\n // Check if entity already exists (using cache when enabled)\n if (skipExisting && id) {\n const exists = await checkEntityExists(config.type, id)\n if (exists) {\n skipped++\n return\n }\n }\n\n // Apply variation\n let variationProps: Record<string, unknown> = {}\n if (config.variations && config.variations.length > 0) {\n variationProps = selectVariation(config.variations, actualIndex, count)\n }\n\n try {\n const generateConfig: Record<string, unknown> = {\n type: config.type,\n prompt: config.prompt,\n constraints: resolvedConstraints,\n ...variationProps,\n }\n\n if (id) {\n generateConfig.id = id\n }\n\n if (!dryRun) {\n const result = await withTimeout(\n db.generate(generateConfig as Parameters<DB['generate']>[0]),\n timeout\n )\n\n // Handle cascading\n if (config.cascade) {\n await cascadeGenerate(\n config.type,\n result,\n config.cascadeDepth ?? Infinity,\n config.cascadeReuse ?? false,\n new Set<string>()\n )\n }\n\n if (onEntity) {\n onEntity(config.type, result)\n }\n }\n\n created++\n\n // Report progress using extracted helper\n reportProgress(seedName, config.type, phase, position, count, startTime)\n\n // Persist checkpoint state\n await persistCheckpoint(seedName, position, count)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const errorInfo: SeedErrorInfo = {\n message: errorMessage,\n position,\n }\n\n // Check for interrupt\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code: string }).code === 'INTERRUPTED'\n ) {\n partial = true\n resumeToken = Buffer.from(\n JSON.stringify({ [seedName]: { position } })\n ).toString('base64')\n errors.push(errorInfo)\n return\n }\n\n if (continueOnError) {\n errors.push(errorInfo)\n } else {\n throw new SeedError(errorMessage, {\n seedName,\n type: config.type,\n position,\n })\n }\n }\n }\n\n if (concurrency > 1) {\n const indices = Array.from({ length: total }, (_, i) => i)\n await runWithConcurrency(indices, generateEntity, concurrency)\n } else {\n for (let i = 0; i < total; i++) {\n await generateEntity(i)\n }\n }\n }\n\n return {\n success: errors.length === 0,\n created,\n skipped,\n errors,\n partial,\n duration: Date.now() - startTime,\n resumeToken,\n }\n }\n\n // Run single seed\n async function run(seedName: string, runOpts?: RunOptions): Promise<SeedResult> {\n const config = seeds[seedName]\n if (!config) {\n throw new SeedError(`Seed \"${seedName}\" not found`, { seedName })\n }\n\n // Validate config\n if (!config.kind) {\n throw new SeedError(`Invalid seed configuration for \"${seedName}\"`, { seedName })\n }\n\n // Call beforeSeed hook\n let effectiveConfig: SeedConfig | GenerateConfig | null = config\n if (beforeSeed) {\n const hookResult = beforeSeed(seedName, config)\n if (hookResult === null) {\n // Skip this seed\n return {\n success: true,\n created: 0,\n skipped: 0,\n errors: [],\n partial: false,\n duration: 0,\n }\n }\n if (hookResult) {\n effectiveConfig = hookResult\n }\n }\n\n const result = await runSeed(seedName, effectiveConfig, runOpts)\n\n // Call afterSeed hook\n if (afterSeed) {\n afterSeed(seedName, result)\n }\n\n return result\n }\n\n // Run all seeds\n async function runAll(): Promise<SeedResult> {\n const startTime = Date.now()\n const executionOrder = order ?? computeExecutionOrder()\n\n if (dryRun) {\n const wouldCreate: Record<string, number> = {}\n\n for (const seedName of executionOrder) {\n const config = seeds[seedName]\n\n // Validate type exists in schema\n if (validateSchema === true) {\n if (!db.schema[config.type]) {\n throw new SeedError(`Type \"${config.type}\" not found in schema`, {\n seedName,\n type: config.type,\n })\n }\n }\n\n if (config.kind === 'static') {\n wouldCreate[config.type] = config.data?.length ?? 0\n } else {\n wouldCreate[config.type] = config.ids?.length ?? config.count ?? 1\n }\n }\n\n return {\n success: true,\n created: 0,\n skipped: 0,\n errors: [],\n partial: false,\n duration: Date.now() - startTime,\n dryRun: true,\n wouldCreate,\n executionOrder,\n }\n }\n\n let totalCreated = 0\n let totalSkipped = 0\n const allErrors: SeedErrorInfo[] = []\n\n for (const seedName of executionOrder) {\n const result = await run(seedName)\n totalCreated += result.created\n totalSkipped += result.skipped\n allErrors.push(...result.errors)\n }\n\n return {\n success: allErrors.length === 0,\n created: totalCreated,\n skipped: totalSkipped,\n errors: allErrors,\n partial: false,\n duration: Date.now() - startTime,\n }\n }\n\n // Reset single seed\n async function reset(\n seedName: string,\n resetOpts?: ResetOptions\n ): Promise<SeedResult> {\n const config = seeds[seedName]\n if (!config) {\n throw new SeedError(`Seed \"${seedName}\" not found`, { seedName })\n }\n\n // Clear the type\n await db.clear(config.type)\n\n // Clear cascaded types if requested\n if (resetOpts?.cascade) {\n const typeDef = db.schema[config.type]\n const refs = extractReferenceTypes(typeDef)\n\n for (const refType of refs) {\n if (!isReadOnlyType(refType)) {\n await db.clear(refType)\n }\n }\n }\n\n // Re-run the seed\n return run(seedName)\n }\n\n // Reset all seeds\n async function resetAll(resetOpts?: ResetOptions): Promise<SeedResult> {\n // Clear all types\n for (const seedName of Object.keys(seeds)) {\n const config = seeds[seedName]\n\n // Skip readOnly if preserveReadOnly is true\n if (resetOpts?.preserveReadOnly && config.readOnly) {\n continue\n }\n\n await db.clear(config.type)\n }\n\n // Run all seeds\n return runAll()\n }\n\n return {\n run,\n runAll,\n reset,\n resetAll,\n }\n}\n"],"mappings":"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","names":["_","rest"]}