@dexto/image-bundler 1.5.7 ā 1.6.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.
- package/.turbo/turbo-build.log +8 -8
- package/CHANGELOG.md +66 -0
- package/README.md +45 -0
- package/dist/cli.js +411 -221
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +66 -2
- package/dist/index.js +407 -210
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/src/bundler.ts +278 -92
- package/src/cli.ts +4 -12
- package/src/generator.ts +223 -204
- package/src/image-definition/types.ts +72 -0
- package/src/image-definition/validate-image-definition.ts +70 -0
- package/src/index.ts +2 -1
- package/src/types.ts +1 -1
- package/test/bundle.integration.test.ts +253 -0
- package/tsconfig.json +5 -1
- package/tsup.config.ts +6 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/bundler.ts","../src/generator.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI for bundling Dexto base images\n */\n\n// Suppress experimental warnings (e.g., Type Stripping)\nprocess.removeAllListeners('warning');\nprocess.on('warning', (warning) => {\n if (warning.name !== 'ExperimentalWarning') {\n console.warn(warning);\n }\n});\n\nimport { Command } from 'commander';\nimport { bundle } from './bundler.js';\nimport { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport pc from 'picocolors';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read version from package.json\nconst packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\n\nconst program = new Command();\n\nprogram.name('dexto-bundle').description('Bundle Dexto base images').version(packageJson.version);\n\nprogram\n .command('build')\n .description('Build a base image from dexto.image.ts')\n .option('-i, --image <path>', 'Path to dexto.image.ts file', 'dexto.image.ts')\n .option('-o, --out <dir>', 'Output directory', 'dist')\n .option('--sourcemap', 'Generate source maps', false)\n .option('--minify', 'Minify output', false)\n .action(async (options) => {\n try {\n console.log(pc.cyan('š Dexto Image Bundler\\n'));\n\n const result = await bundle({\n imagePath: options.image,\n outDir: options.out,\n sourcemap: options.sourcemap,\n minify: options.minify,\n });\n\n console.log(pc.green('\\n⨠Build successful!\\n'));\n console.log(pc.bold('Image Details:'));\n console.log(` Name: ${result.metadata.name}`);\n console.log(` Version: ${result.metadata.version}`);\n console.log(` Target: ${result.metadata.target}`);\n console.log(` Built at: ${result.metadata.builtAt}`);\n console.log(` Core: v${result.metadata.coreVersion}`);\n\n if (result.metadata.constraints.length > 0) {\n console.log(` Constraints: ${result.metadata.constraints.join(', ')}`);\n }\n\n if (result.warnings.length > 0) {\n console.log(pc.yellow('\\nā ļø Warnings:'));\n result.warnings.forEach((w) => console.log(` - ${w}`));\n }\n\n // Read package.json to get the actual package name\n const packageJsonPath = join(process.cwd(), 'package.json');\n let packageName = result.metadata.name;\n try {\n if (readFileSync) {\n const pkgJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n packageName = pkgJson.name || result.metadata.name;\n }\n } catch {\n // Use metadata name as fallback\n }\n\n console.log(pc.green('\\nā
Image is ready to use!'));\n console.log(' To use this image in an app:');\n console.log(\n pc.dim(\n ` 1. Install it: pnpm add ${packageName}@file:../${packageName.split('/').pop()}`\n )\n );\n console.log(pc.dim(` 2. Import it: import { createAgent } from '${packageName}';`));\n console.log(pc.dim(`\\n Or publish to npm and install normally.`));\n } catch (error) {\n console.error(pc.red('\\nā Build failed:'), error);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","/**\n * Main bundler logic\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, statSync } from 'node:fs';\nimport { dirname, join, resolve, relative, extname } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { validateImageDefinition } from '@dexto/core';\nimport type { ImageDefinition } from '@dexto/core';\nimport type { BundleOptions, BundleResult } from './types.js';\nimport { generateEntryPoint } from './generator.js';\nimport ts from 'typescript';\n\n/**\n * Bundle a Dexto base image\n */\nexport async function bundle(options: BundleOptions): Promise<BundleResult> {\n const warnings: string[] = [];\n\n // 1. Load and validate image definition\n console.log(`š¦ Loading image definition from ${options.imagePath}`);\n const definition = await loadImageDefinition(options.imagePath);\n\n console.log(`ā
Loaded image: ${definition.name} v${definition.version}`);\n\n // 2. Validate definition\n console.log(`š Validating image definition...`);\n try {\n validateImageDefinition(definition);\n console.log(`ā
Image definition is valid`);\n } catch (error) {\n throw new Error(`Image validation failed: ${error}`);\n }\n\n // 3. Get core version (from package.json)\n const coreVersion = getCoreVersion();\n\n // 3.5. Discover providers from convention-based folders\n console.log(`š Discovering providers from folders...`);\n const imageDir = dirname(options.imagePath);\n const discoveredProviders = discoverProviders(imageDir);\n console.log(`ā
Discovered ${discoveredProviders.totalCount} provider(s)`);\n\n // 4. Generate code\n console.log(`šØ Generating entry point...`);\n const generated = generateEntryPoint(definition, coreVersion, discoveredProviders);\n\n // 5. Ensure output directory exists\n const outDir = resolve(options.outDir);\n if (!existsSync(outDir)) {\n mkdirSync(outDir, { recursive: true });\n }\n\n // 5.5. Compile provider category folders\n console.log(`šØ Compiling provider source files...`);\n const categories = ['blob-store', 'tools', 'compaction', 'plugins'];\n let compiledCount = 0;\n\n for (const category of categories) {\n const categoryDir = join(imageDir, category);\n if (existsSync(categoryDir)) {\n compileSourceFiles(categoryDir, join(outDir, category));\n compiledCount++;\n }\n }\n\n if (compiledCount > 0) {\n console.log(\n `ā
Compiled ${compiledCount} provider categor${compiledCount === 1 ? 'y' : 'ies'}`\n );\n }\n\n // 6. Write generated files\n const entryFile = join(outDir, 'index.js');\n const typesFile = join(outDir, 'index.d.ts');\n\n console.log(`š Writing ${entryFile}...`);\n writeFileSync(entryFile, generated.js, 'utf-8');\n\n console.log(`š Writing ${typesFile}...`);\n writeFileSync(typesFile, generated.dts, 'utf-8');\n\n // 7. Generate package.json exports\n updatePackageJson(dirname(options.imagePath), outDir);\n\n console.log(`⨠Build complete!`);\n console.log(` Entry: ${entryFile}`);\n console.log(` Types: ${typesFile}`);\n\n const metadata = {\n name: definition.name,\n version: definition.version,\n description: definition.description,\n target: definition.target || 'custom',\n constraints: definition.constraints || [],\n builtAt: new Date().toISOString(),\n coreVersion,\n };\n\n return {\n entryFile,\n typesFile,\n metadata,\n warnings,\n };\n}\n\n/**\n * Load image definition from file\n */\nasync function loadImageDefinition(imagePath: string): Promise<ImageDefinition> {\n const absolutePath = resolve(imagePath);\n\n if (!existsSync(absolutePath)) {\n throw new Error(`Image file not found: ${absolutePath}`);\n }\n\n try {\n // Convert to file:// URL for ESM import\n const fileUrl = pathToFileURL(absolutePath).href;\n\n // Dynamic import\n const module = await import(fileUrl);\n\n // Get default export\n const definition = module.default as ImageDefinition;\n\n if (!definition) {\n throw new Error('Image file must have a default export');\n }\n\n return definition;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to load image definition: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Get @dexto/core version\n */\nfunction getCoreVersion(): string {\n try {\n // Try to read from node_modules\n const corePackageJson = join(process.cwd(), 'node_modules/@dexto/core/package.json');\n if (existsSync(corePackageJson)) {\n const pkg = JSON.parse(readFileSync(corePackageJson, 'utf-8'));\n return pkg.version;\n }\n\n // Fallback to workspace version\n return '1.0.0';\n } catch {\n return '1.0.0';\n }\n}\n\n/**\n * Update or create package.json with proper exports\n */\nfunction updatePackageJson(imageDir: string, outDir: string): void {\n const packageJsonPath = join(imageDir, 'package.json');\n\n if (!existsSync(packageJsonPath)) {\n console.log(`ā ļø No package.json found, skipping exports update`);\n return;\n }\n\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\n // Update exports\n pkg.exports = {\n '.': {\n types: './dist/index.d.ts',\n import: './dist/index.js',\n },\n };\n\n // Update main and types fields\n pkg.main = './dist/index.js';\n pkg.types = './dist/index.d.ts';\n\n writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2), 'utf-8');\n console.log(`ā
Updated package.json exports`);\n } catch (error) {\n console.warn(`ā ļø Failed to update package.json: ${error}`);\n }\n}\n\n/**\n * Compile TypeScript source files to JavaScript\n */\nfunction compileSourceFiles(srcDir: string, outDir: string): void {\n // Find all .ts files\n const tsFiles = findTypeScriptFiles(srcDir);\n\n if (tsFiles.length === 0) {\n console.log(` No TypeScript files found in ${srcDir}`);\n return;\n }\n\n console.log(` Found ${tsFiles.length} TypeScript file(s) to compile`);\n\n // TypeScript compiler options\n const compilerOptions: ts.CompilerOptions = {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n outDir: outDir,\n rootDir: srcDir, // Use srcDir as root\n declaration: true,\n esModuleInterop: true,\n skipLibCheck: true,\n strict: true,\n resolveJsonModule: true,\n };\n\n // Create program\n const program = ts.createProgram(tsFiles, compilerOptions);\n\n // Emit compiled files\n const emitResult = program.emit();\n\n // Check for errors\n const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);\n\n if (allDiagnostics.length > 0) {\n allDiagnostics.forEach((diagnostic) => {\n if (diagnostic.file) {\n const { line, character } = ts.getLineAndCharacterOfPosition(\n diagnostic.file,\n diagnostic.start!\n );\n const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n console.error(\n ` ${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`\n );\n } else {\n console.error(\n ` ${ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n')}`\n );\n }\n });\n\n if (emitResult.emitSkipped) {\n throw new Error('TypeScript compilation failed');\n }\n }\n}\n\n/**\n * Recursively find all TypeScript files in a directory\n */\nfunction findTypeScriptFiles(dir: string): string[] {\n const files: string[] = [];\n\n function walk(currentDir: string) {\n const entries = readdirSync(currentDir);\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isDirectory()) {\n walk(fullPath);\n } else if (stat.isFile() && extname(entry) === '.ts') {\n files.push(fullPath);\n }\n }\n }\n\n walk(dir);\n return files;\n}\n\n/**\n * Provider discovery result for a single category\n */\nexport interface DiscoveredProviders {\n blobStore: string[];\n customTools: string[];\n compaction: string[];\n plugins: string[];\n totalCount: number;\n}\n\n/**\n * Discover providers from convention-based folder structure\n *\n * Convention (folder-based with index.ts):\n * tools/ - CustomToolProvider folders\n * weather/ - Provider folder\n * index.ts - Provider implementation (auto-discovered)\n * helpers.ts - Optional helper files\n * types.ts - Optional type definitions\n * blob-store/ - BlobStoreProvider folders\n * compaction/ - CompactionProvider folders\n * plugins/ - PluginProvider folders\n *\n * Naming Convention (Node.js standard):\n * <folder>/index.ts - Auto-discovered and registered\n * <folder>/other.ts - Ignored unless imported by index.ts\n */\nfunction discoverProviders(imageDir: string): DiscoveredProviders {\n const result: DiscoveredProviders = {\n blobStore: [],\n customTools: [],\n compaction: [],\n plugins: [],\n totalCount: 0,\n };\n\n // Category mapping: folder name -> property name\n const categories = {\n 'blob-store': 'blobStore',\n tools: 'customTools',\n compaction: 'compaction',\n plugins: 'plugins',\n } as const;\n\n for (const [folderName, propName] of Object.entries(categories)) {\n const categoryDir = join(imageDir, folderName);\n\n if (!existsSync(categoryDir)) {\n continue;\n }\n\n // Find all provider folders (those with index.ts)\n const providerFolders = readdirSync(categoryDir)\n .filter((entry) => {\n const entryPath = join(categoryDir, entry);\n const stat = statSync(entryPath);\n\n // Must be a directory\n if (!stat.isDirectory()) {\n return false;\n }\n\n // Must contain index.ts\n const indexPath = join(entryPath, 'index.ts');\n return existsSync(indexPath);\n })\n .map((folder) => {\n // Return relative path for imports\n return `./${folderName}/${folder}/index.js`;\n });\n\n if (providerFolders.length > 0) {\n result[propName as keyof Omit<DiscoveredProviders, 'totalCount'>].push(\n ...providerFolders\n );\n result.totalCount += providerFolders.length;\n console.log(` Found ${providerFolders.length} provider(s) in ${folderName}/`);\n }\n }\n\n return result;\n}\n","/**\n * Code generator for base images\n *\n * Transforms image definitions into importable packages with:\n * - Side-effect provider registration\n * - createAgent() factory\n * - Utility exports\n * - Metadata exports\n */\n\nimport type { ImageDefinition } from '@dexto/core';\nimport type { GeneratedCode } from './types.js';\nimport type { DiscoveredProviders } from './bundler.js';\n\n/**\n * Generate JavaScript entry point for an image\n */\nexport function generateEntryPoint(\n definition: ImageDefinition,\n coreVersion: string,\n discoveredProviders?: DiscoveredProviders\n): GeneratedCode {\n // Generate imports section\n const imports = generateImports(definition, discoveredProviders);\n\n // Generate provider registration section\n const registrations = generateProviderRegistrations(definition, discoveredProviders);\n\n // Generate factory function\n const factory = generateFactory();\n\n // Generate utility exports\n const utilityExports = generateUtilityExports(definition);\n\n // Generate metadata export\n const metadata = generateMetadata(definition, coreVersion);\n\n // Combine all sections\n const js = `// AUTO-GENERATED by @dexto/bundler\n// Do not edit this file directly. Edit dexto.image.ts instead.\n\n${imports}\n\n${registrations}\n\n${factory}\n\n${utilityExports}\n\n${metadata}\n`;\n\n // Generate TypeScript definitions\n const dts = generateTypeDefinitions(definition);\n\n return { js, dts };\n}\n\nfunction generateImports(\n definition: ImageDefinition,\n discoveredProviders?: DiscoveredProviders\n): string {\n const imports: string[] = [];\n\n // Import base image first (if extending) - triggers side-effect provider registration\n if (definition.extends) {\n imports.push(`// Import base image for provider registration (side effect)`);\n imports.push(`import '${definition.extends}';`);\n imports.push(``);\n }\n\n // Core imports\n imports.push(`import { DextoAgent } from '@dexto/core';`);\n\n // Always import all registries since we re-export them in generateFactory()\n // This ensures the re-exports don't reference unimported identifiers\n imports.push(\n `import { customToolRegistry, pluginRegistry, compactionRegistry, blobStoreRegistry } from '@dexto/core';`\n );\n\n // Import discovered providers\n if (discoveredProviders) {\n const categories = [\n { key: 'blobStore', label: 'Blob Storage' },\n { key: 'customTools', label: 'Custom Tools' },\n { key: 'compaction', label: 'Compaction' },\n { key: 'plugins', label: 'Plugins' },\n ] as const;\n\n for (const { key, label } of categories) {\n const providers = discoveredProviders[key];\n if (providers.length > 0) {\n imports.push(``);\n imports.push(`// ${label} providers (auto-discovered)`);\n providers.forEach((path, index) => {\n const varName = `${key}Provider${index}`;\n imports.push(`import * as ${varName} from '${path}';`);\n });\n }\n }\n }\n\n return imports.join('\\n');\n}\n\nfunction generateProviderRegistrations(\n definition: ImageDefinition,\n discoveredProviders?: DiscoveredProviders\n): string {\n const registrations: string[] = [];\n\n if (definition.extends) {\n registrations.push(\n `// Base image providers already registered via import of '${definition.extends}'`\n );\n registrations.push('');\n }\n\n registrations.push('// SIDE EFFECT: Register providers on import');\n registrations.push('');\n\n // Auto-register discovered providers\n if (discoveredProviders) {\n const categoryMap = [\n { key: 'blobStore', registry: 'blobStoreRegistry', label: 'Blob Storage' },\n { key: 'customTools', registry: 'customToolRegistry', label: 'Custom Tools' },\n { key: 'compaction', registry: 'compactionRegistry', label: 'Compaction' },\n { key: 'plugins', registry: 'pluginRegistry', label: 'Plugins' },\n ] as const;\n\n for (const { key, registry, label } of categoryMap) {\n const providers = discoveredProviders[key];\n if (providers.length === 0) continue;\n\n registrations.push(`// Auto-register ${label} providers`);\n providers.forEach((path, index) => {\n const varName = `${key}Provider${index}`;\n registrations.push(`// From ${path}`);\n registrations.push(`for (const exported of Object.values(${varName})) {`);\n registrations.push(\n ` if (exported && typeof exported === 'object' && 'type' in exported && 'create' in exported) {`\n );\n registrations.push(` try {`);\n registrations.push(` ${registry}.register(exported);`);\n registrations.push(\n ` console.log(\\`ā Registered ${key}: \\${exported.type}\\`);`\n );\n registrations.push(` } catch (err) {`);\n registrations.push(` // Ignore duplicate registration errors`);\n registrations.push(\n ` if (!err.message?.includes('already registered')) throw err;`\n );\n registrations.push(` }`);\n registrations.push(` }`);\n registrations.push(`}`);\n });\n registrations.push('');\n }\n }\n\n // Handle manual registration functions (backwards compatibility)\n for (const [category, config] of Object.entries(definition.providers)) {\n if (!config) continue;\n\n if (config.register) {\n // Async registration function with duplicate prevention\n registrations.push(`// Register ${category} via custom function (from dexto.image.ts)`);\n registrations.push(`await (async () => {`);\n registrations.push(` try {`);\n registrations.push(\n ` ${config.register\n .toString()\n .replace(/^async\\s*\\(\\)\\s*=>\\s*{/, '')\n .replace(/}$/, '')}`\n );\n registrations.push(` } catch (err) {`);\n registrations.push(` // Ignore duplicate registration errors`);\n registrations.push(` if (!err.message?.includes('already registered')) {`);\n registrations.push(` throw err;`);\n registrations.push(` }`);\n registrations.push(` }`);\n registrations.push(`})();`);\n registrations.push('');\n }\n }\n\n return registrations.join('\\n');\n}\n\nfunction generateFactory(): string {\n return `/**\n * Create a Dexto agent using this image's registered providers.\n *\n * @param config - Agent configuration\n * @param configPath - Optional path to config file\n * @returns DextoAgent instance with providers already registered\n */\nexport function createAgent(config, configPath) {\n return new DextoAgent(config, configPath);\n}\n\n/**\n * Re-export registries for runtime customization.\n * This allows apps to add custom providers without depending on @dexto/core directly.\n */\nexport {\n customToolRegistry,\n pluginRegistry,\n compactionRegistry,\n blobStoreRegistry,\n} from '@dexto/core';`;\n}\n\nfunction generateUtilityExports(definition: ImageDefinition): string {\n const sections: string[] = [];\n\n // Generate wildcard utility exports\n if (definition.utils && Object.keys(definition.utils).length > 0) {\n sections.push('// Utility exports');\n for (const [name, path] of Object.entries(definition.utils)) {\n sections.push(`export * from '${path}';`);\n }\n }\n\n // Generate selective named exports (filter out type-only exports for runtime JS)\n if (definition.exports && Object.keys(definition.exports).length > 0) {\n if (sections.length > 0) sections.push('');\n sections.push('// Selective package re-exports');\n for (const [packageName, exports] of Object.entries(definition.exports)) {\n // Check for wildcard re-export\n if (exports.length === 1 && exports[0] === '*') {\n sections.push(`export * from '${packageName}';`);\n continue;\n }\n\n // Filter out type-only exports (those starting with 'type ')\n const runtimeExports = exports.filter((exp) => !exp.startsWith('type '));\n if (runtimeExports.length > 0) {\n sections.push(`export {`);\n sections.push(` ${runtimeExports.join(',\\n ')}`);\n sections.push(`} from '${packageName}';`);\n }\n }\n }\n\n if (sections.length === 0) {\n return '// No utilities or exports defined for this image';\n }\n\n return sections.join('\\n');\n}\n\nfunction generateMetadata(definition: ImageDefinition, coreVersion: string): string {\n const metadata: Record<string, any> = {\n name: definition.name,\n version: definition.version,\n description: definition.description,\n target: definition.target || 'custom',\n constraints: definition.constraints || [],\n builtAt: new Date().toISOString(),\n coreVersion: coreVersion,\n };\n\n // Include extends information if present\n if (definition.extends) {\n metadata.extends = definition.extends;\n }\n\n // Include bundled plugins if present\n if (definition.bundledPlugins && definition.bundledPlugins.length > 0) {\n metadata.bundledPlugins = definition.bundledPlugins;\n }\n\n return `/**\n * Image metadata\n * Generated at build time\n */\nexport const imageMetadata = ${JSON.stringify(metadata, null, 4)};`;\n}\n\nfunction generateTypeDefinitions(definition: ImageDefinition): string {\n const sections: string[] = [];\n\n // Wildcard utility exports\n if (definition.utils && Object.keys(definition.utils).length > 0) {\n sections.push('// Utility re-exports');\n for (const path of Object.values(definition.utils)) {\n sections.push(`export * from '${path}';`);\n }\n }\n\n // Selective named exports\n if (definition.exports && Object.keys(definition.exports).length > 0) {\n if (sections.length > 0) sections.push('');\n sections.push('// Selective package re-exports');\n for (const [packageName, exports] of Object.entries(definition.exports)) {\n // Check for wildcard re-export\n if (exports.length === 1 && exports[0] === '*') {\n sections.push(`export * from '${packageName}';`);\n continue;\n }\n\n sections.push(`export {`);\n sections.push(` ${exports.join(',\\n ')}`);\n sections.push(`} from '${packageName}';`);\n }\n }\n\n const utilityExports = sections.length > 0 ? '\\n\\n' + sections.join('\\n') : '';\n\n return `// AUTO-GENERATED TypeScript definitions\n// Do not edit this file directly\n\nimport type { DextoAgent, AgentConfig, ImageMetadata } from '@dexto/core';\n\n/**\n * Create a Dexto agent using this image's registered providers.\n */\nexport declare function createAgent(config: AgentConfig, configPath?: string): DextoAgent;\n\n/**\n * Image metadata\n */\nexport declare const imageMetadata: ImageMetadata;\n\n/**\n * Re-exported registries for runtime customization\n */\nexport {\n customToolRegistry,\n pluginRegistry,\n compactionRegistry,\n blobStoreRegistry,\n} from '@dexto/core';${utilityExports}\n`;\n}\n"],"mappings":"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","names":["program","readFileSync","join","dirname","__filename","__dirname"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/bundler.ts","../src/image-definition/validate-image-definition.ts","../src/generator.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI for bundling Dexto base images\n */\n\nimport { Command } from 'commander';\nimport { bundle } from './bundler.js';\nimport { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport pc from 'picocolors';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read version from package.json\nconst packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\n\nconst program = new Command();\n\nprogram.name('dexto-bundle').description('Bundle Dexto base images').version(packageJson.version);\n\nprogram\n .command('build')\n .description('Build a base image from dexto.image.ts')\n .option('-i, --image <path>', 'Path to dexto.image.ts file', 'dexto.image.ts')\n .option('-o, --out <dir>', 'Output directory', 'dist')\n .option('--sourcemap', 'Generate source maps', false)\n .option('--minify', 'Minify output', false)\n .action(async (options) => {\n try {\n console.log(pc.cyan('š Dexto Image Bundler\\n'));\n\n const result = await bundle({\n imagePath: options.image,\n outDir: options.out,\n sourcemap: options.sourcemap,\n minify: options.minify,\n });\n\n console.log(pc.green('\\n⨠Build successful!\\n'));\n console.log(pc.bold('Image Details:'));\n console.log(` Name: ${result.metadata.name}`);\n console.log(` Version: ${result.metadata.version}`);\n console.log(` Target: ${result.metadata.target}`);\n console.log(` Built at: ${result.metadata.builtAt}`);\n console.log(` Core: v${result.metadata.coreVersion}`);\n\n if (result.metadata.constraints.length > 0) {\n console.log(` Constraints: ${result.metadata.constraints.join(', ')}`);\n }\n\n if (result.warnings.length > 0) {\n console.log(pc.yellow('\\nā ļø Warnings:'));\n result.warnings.forEach((w) => console.log(` - ${w}`));\n }\n\n // Read package.json to get the actual package name\n const packageJsonPath = join(process.cwd(), 'package.json');\n let packageName = result.metadata.name;\n try {\n if (readFileSync) {\n const pkgJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n packageName = pkgJson.name || result.metadata.name;\n }\n } catch {\n // Use metadata name as fallback\n }\n\n console.log(pc.green('\\nā
Image is ready to use!'));\n console.log(' Install into the Dexto CLI:');\n console.log(pc.dim(' 1. Install: dexto image install .'));\n console.log(\n pc.dim(\n ` 2. Use it: set \\`image: \"${packageName}\"\\` in your agent config (or pass --image in the CLI)`\n )\n );\n console.log(pc.dim('\\n Or publish to npm and install by package name.'));\n } catch (error) {\n console.error(pc.red('\\nā Build failed:'), error);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","/**\n * Main bundler logic\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, statSync } from 'node:fs';\nimport { mkdtemp, rm } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { dirname, join, resolve, extname } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { validateImageDefinition } from './image-definition/validate-image-definition.js';\nimport type { ImageDefinition } from './image-definition/types.js';\nimport type { BundleOptions, BundleResult } from './types.js';\nimport { generateEntryPoint } from './generator.js';\nimport { build } from 'esbuild';\nimport ts from 'typescript';\n\n/**\n * Bundle a Dexto base image\n */\nexport async function bundle(options: BundleOptions): Promise<BundleResult> {\n const warnings: string[] = [];\n\n // 1. Load and validate image definition\n console.log(`š¦ Loading image definition from ${options.imagePath}`);\n const definition = await loadImageDefinition(options.imagePath);\n\n console.log(`ā
Loaded image: ${definition.name} v${definition.version}`);\n\n // 2. Validate definition\n console.log(`š Validating image definition...`);\n try {\n validateImageDefinition(definition);\n console.log(`ā
Image definition is valid`);\n } catch (error) {\n throw new Error(`Image validation failed: ${error}`);\n }\n\n // 3. Get core version (from package.json)\n const coreVersion = getCoreVersion();\n\n // 3.5. Discover factories from convention-based folders\n console.log(`š Discovering factories from folders...`);\n const imageDir = dirname(options.imagePath);\n const discoveredFactories = discoverFactories(imageDir, warnings);\n console.log(`ā
Discovered ${discoveredFactories.totalCount} factory(ies)`);\n\n // 4. Generate code\n console.log(`šØ Generating entry point...`);\n const generated = generateEntryPoint(definition, discoveredFactories);\n\n // 5. Ensure output directory exists\n const outDir = resolve(options.outDir);\n if (!existsSync(outDir)) {\n mkdirSync(outDir, { recursive: true });\n }\n\n // 5.5. Compile factory folders\n console.log(`šØ Compiling factory source files...`);\n let compiledCount = 0;\n\n // tools/\n const toolsDir = join(imageDir, 'tools');\n if (existsSync(toolsDir)) {\n compileSourceFiles(toolsDir, join(outDir, 'tools'));\n compiledCount++;\n }\n\n // hooks/\n const hooksDir = join(imageDir, 'hooks');\n if (existsSync(hooksDir)) {\n compileSourceFiles(hooksDir, join(outDir, 'hooks'));\n compiledCount++;\n }\n\n // compaction/\n const compactionDir = join(imageDir, 'compaction');\n if (existsSync(compactionDir)) {\n compileSourceFiles(compactionDir, join(outDir, 'compaction'));\n compiledCount++;\n }\n\n // storage/blob/\n const storageBlobDir = join(imageDir, 'storage', 'blob');\n if (existsSync(storageBlobDir)) {\n compileSourceFiles(storageBlobDir, join(outDir, 'storage', 'blob'));\n compiledCount++;\n }\n\n // storage/database/\n const storageDatabaseDir = join(imageDir, 'storage', 'database');\n if (existsSync(storageDatabaseDir)) {\n compileSourceFiles(storageDatabaseDir, join(outDir, 'storage', 'database'));\n compiledCount++;\n }\n\n // storage/cache/\n const storageCacheDir = join(imageDir, 'storage', 'cache');\n if (existsSync(storageCacheDir)) {\n compileSourceFiles(storageCacheDir, join(outDir, 'storage', 'cache'));\n compiledCount++;\n }\n\n if (compiledCount > 0) {\n console.log(\n `ā
Compiled ${compiledCount} factory categor${compiledCount === 1 ? 'y' : 'ies'}`\n );\n }\n\n // 5.6. Validate discovered factories export the required contract\n console.log(`š Validating factory exports...`);\n await validateDiscoveredFactories(outDir, discoveredFactories);\n\n // 6. Write generated files\n const entryFile = join(outDir, 'index.js');\n const typesFile = join(outDir, 'index.d.ts');\n\n console.log(`š Writing ${entryFile}...`);\n writeFileSync(entryFile, generated.js, 'utf-8');\n\n console.log(`š Writing ${typesFile}...`);\n writeFileSync(typesFile, generated.dts, 'utf-8');\n\n // 7. Generate package.json exports\n updatePackageJson(dirname(options.imagePath), outDir);\n\n console.log(`⨠Build complete!`);\n console.log(` Entry: ${entryFile}`);\n console.log(` Types: ${typesFile}`);\n\n const metadata = {\n name: definition.name,\n version: definition.version,\n description: definition.description,\n target: definition.target || 'custom',\n constraints: definition.constraints || [],\n builtAt: new Date().toISOString(),\n coreVersion,\n };\n\n return {\n entryFile,\n typesFile,\n metadata,\n warnings,\n };\n}\n\n/**\n * Load image definition from file\n */\nasync function loadImageDefinition(imagePath: string): Promise<ImageDefinition> {\n const absolutePath = resolve(imagePath);\n\n if (!existsSync(absolutePath)) {\n throw new Error(`Image file not found: ${absolutePath}`);\n }\n\n try {\n const imageDir = dirname(absolutePath);\n const tempDir = await mkdtemp(join(imageDir, '.dexto-image-definition-'));\n const compiledPath = join(tempDir, 'dexto.image.mjs');\n\n try {\n await build({\n entryPoints: [absolutePath],\n outfile: compiledPath,\n bundle: true,\n platform: 'node',\n format: 'esm',\n target: 'node20',\n packages: 'external',\n logLevel: 'silent',\n });\n\n const module = await import(pathToFileURL(compiledPath).href);\n\n // Get default export\n const definition = module.default as ImageDefinition;\n\n if (!definition) {\n throw new Error('Image file must have a default export');\n }\n\n return definition;\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to load image definition: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Get @dexto/core version\n */\nfunction getCoreVersion(): string {\n try {\n const require = createRequire(import.meta.url);\n const pkg = require('@dexto/core/package.json') as { version?: unknown };\n return typeof pkg.version === 'string' ? pkg.version : '1.0.0';\n } catch {\n return '1.0.0';\n }\n}\n\n/**\n * Update or create package.json with proper exports\n */\nfunction updatePackageJson(imageDir: string, outDir: string): void {\n const packageJsonPath = join(imageDir, 'package.json');\n\n if (!existsSync(packageJsonPath)) {\n console.log(`ā ļø No package.json found, skipping exports update`);\n return;\n }\n\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\n // Update exports\n pkg.exports = {\n '.': {\n types: './dist/index.d.ts',\n import: './dist/index.js',\n },\n };\n\n // Update main and types fields\n pkg.main = './dist/index.js';\n pkg.types = './dist/index.d.ts';\n\n writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2), 'utf-8');\n console.log(`ā
Updated package.json exports`);\n } catch (error) {\n console.warn(`ā ļø Failed to update package.json: ${error}`);\n }\n}\n\n/**\n * Compile TypeScript source files to JavaScript\n */\nfunction compileSourceFiles(srcDir: string, outDir: string): void {\n // Find all .ts files\n const tsFiles = findTypeScriptFiles(srcDir);\n\n if (tsFiles.length === 0) {\n console.log(` No TypeScript files found in ${srcDir}`);\n return;\n }\n\n console.log(` Found ${tsFiles.length} TypeScript file(s) to compile`);\n\n // TypeScript compiler options\n const compilerOptions: ts.CompilerOptions = {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n outDir: outDir,\n rootDir: srcDir, // Use srcDir as root\n declaration: true,\n esModuleInterop: true,\n skipLibCheck: true,\n strict: true,\n resolveJsonModule: true,\n };\n\n // Create program\n const program = ts.createProgram(tsFiles, compilerOptions);\n\n // Emit compiled files\n const emitResult = program.emit();\n\n // Check for errors\n const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);\n\n if (allDiagnostics.length > 0) {\n allDiagnostics.forEach((diagnostic) => {\n if (diagnostic.file) {\n const { line, character } = ts.getLineAndCharacterOfPosition(\n diagnostic.file,\n diagnostic.start!\n );\n const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n console.error(\n ` ${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`\n );\n } else {\n console.error(\n ` ${ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n')}`\n );\n }\n });\n\n if (emitResult.emitSkipped) {\n throw new Error('TypeScript compilation failed');\n }\n }\n}\n\n/**\n * Recursively find all TypeScript files in a directory\n */\nfunction findTypeScriptFiles(dir: string): string[] {\n const files: string[] = [];\n\n function walk(currentDir: string) {\n const entries = readdirSync(currentDir);\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isDirectory()) {\n walk(fullPath);\n } else if (stat.isFile() && extname(entry) === '.ts') {\n files.push(fullPath);\n }\n }\n }\n\n walk(dir);\n return files;\n}\n\n/**\n * Factory discovery result for a single category\n */\nexport interface DiscoveredFactory {\n type: string;\n importPath: string;\n}\n\nexport interface DiscoveredFactories {\n tools: DiscoveredFactory[];\n storage: {\n blob: DiscoveredFactory[];\n database: DiscoveredFactory[];\n cache: DiscoveredFactory[];\n };\n hooks: DiscoveredFactory[];\n compaction: DiscoveredFactory[];\n totalCount: number;\n}\n\n/**\n * Discover factories from convention-based folder structure\n *\n * Convention (folder-based with index.ts):\n * tools/ - ToolFactory folders\n * weather/ - Factory folder\n * index.ts - Factory implementation (auto-discovered)\n * helpers.ts - Optional helper files\n * types.ts - Optional type definitions\n * compaction/ - CompactionFactory folders\n * hooks/ - HookFactory folders\n * storage/blob/ - BlobStoreFactory folders\n * storage/cache/ - CacheFactory folders\n * storage/database/ - DatabaseFactory folders\n *\n * Naming Convention (Node.js standard):\n * <folder>/index.ts - Auto-discovered and registered\n * <folder>/other.ts - Ignored unless imported by index.ts\n */\nfunction discoverFactories(imageDir: string, warnings: string[]): DiscoveredFactories {\n const result: DiscoveredFactories = {\n tools: [],\n storage: {\n blob: [],\n database: [],\n cache: [],\n },\n hooks: [],\n compaction: [],\n totalCount: 0,\n };\n\n const discoverFolder = (options: {\n srcDir: string;\n importBase: string;\n label: string;\n }): DiscoveredFactory[] => {\n const { srcDir, importBase, label } = options;\n\n if (!existsSync(srcDir)) {\n return [];\n }\n\n const factoryFolders = readdirSync(srcDir).filter((entry) => {\n const entryPath = join(srcDir, entry);\n const stat = statSync(entryPath);\n if (!stat.isDirectory()) {\n return false;\n }\n\n const indexPath = join(entryPath, 'index.ts');\n return existsSync(indexPath);\n });\n\n if (factoryFolders.length > 0) {\n console.log(` Found ${factoryFolders.length} factory(ies) in ${label}`);\n }\n\n return factoryFolders.map((type) => ({\n type,\n importPath: `./${importBase}/${type}/index.js`,\n }));\n };\n\n // tools/\n result.tools = discoverFolder({\n srcDir: join(imageDir, 'tools'),\n importBase: 'tools',\n label: 'tools/',\n });\n\n // hooks/\n result.hooks = discoverFolder({\n srcDir: join(imageDir, 'hooks'),\n importBase: 'hooks',\n label: 'hooks/',\n });\n\n // compaction/\n result.compaction = discoverFolder({\n srcDir: join(imageDir, 'compaction'),\n importBase: 'compaction',\n label: 'compaction/',\n });\n\n // storage/blob/\n result.storage.blob = discoverFolder({\n srcDir: join(imageDir, 'storage', 'blob'),\n importBase: 'storage/blob',\n label: 'storage/blob/',\n });\n\n // storage/database/\n result.storage.database = discoverFolder({\n srcDir: join(imageDir, 'storage', 'database'),\n importBase: 'storage/database',\n label: 'storage/database/',\n });\n\n // storage/cache/\n result.storage.cache = discoverFolder({\n srcDir: join(imageDir, 'storage', 'cache'),\n importBase: 'storage/cache',\n label: 'storage/cache/',\n });\n\n result.totalCount =\n result.tools.length +\n result.hooks.length +\n result.compaction.length +\n result.storage.blob.length +\n result.storage.database.length +\n result.storage.cache.length;\n\n if (result.totalCount === 0) {\n warnings.push(\n 'No factories discovered from convention folders. This image will not be able to resolve tools/storage unless it extends a base image.'\n );\n }\n\n return result;\n}\n\nasync function validateFactoryExport(options: {\n outDir: string;\n kind: string;\n entry: DiscoveredFactory;\n}): Promise<void> {\n const { outDir, kind, entry } = options;\n\n const absolutePath = resolve(outDir, entry.importPath);\n const fileUrl = pathToFileURL(absolutePath).href;\n\n let module: unknown;\n try {\n module = await import(fileUrl);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to import ${kind} factory '${entry.type}' (${entry.importPath}): ${message}`\n );\n }\n\n if (!module || typeof module !== 'object') {\n throw new Error(\n `Invalid ${kind} factory '${entry.type}' (${entry.importPath}): expected an object module export`\n );\n }\n\n const factory = (module as Record<string, unknown>).factory;\n if (!factory || typeof factory !== 'object') {\n throw new Error(\n `Invalid ${kind} factory '${entry.type}' (${entry.importPath}): missing 'factory' export`\n );\n }\n\n const configSchema = (factory as Record<string, unknown>).configSchema;\n const create = (factory as Record<string, unknown>).create;\n\n const parse = (configSchema as { parse?: unknown } | null | undefined)?.parse;\n if (!configSchema || typeof configSchema !== 'object' || typeof parse !== 'function') {\n throw new Error(\n `Invalid ${kind} factory '${entry.type}' (${entry.importPath}): factory.configSchema must be a Zod schema`\n );\n }\n\n if (typeof create !== 'function') {\n throw new Error(\n `Invalid ${kind} factory '${entry.type}' (${entry.importPath}): factory.create must be a function`\n );\n }\n}\n\nasync function validateDiscoveredFactories(\n outDir: string,\n discovered: DiscoveredFactories\n): Promise<void> {\n const validations: Array<Promise<void>> = [];\n\n for (const entry of discovered.tools) {\n validations.push(validateFactoryExport({ outDir, kind: 'tool', entry }));\n }\n for (const entry of discovered.hooks) {\n validations.push(validateFactoryExport({ outDir, kind: 'hook', entry }));\n }\n for (const entry of discovered.compaction) {\n validations.push(validateFactoryExport({ outDir, kind: 'compaction', entry }));\n }\n for (const entry of discovered.storage.blob) {\n validations.push(validateFactoryExport({ outDir, kind: 'storage.blob', entry }));\n }\n for (const entry of discovered.storage.database) {\n validations.push(validateFactoryExport({ outDir, kind: 'storage.database', entry }));\n }\n for (const entry of discovered.storage.cache) {\n validations.push(validateFactoryExport({ outDir, kind: 'storage.cache', entry }));\n }\n\n await Promise.all(validations);\n}\n","import type { ImageDefinition } from './types.js';\n\n/**\n * Validate an image definition.\n * Throws if the definition is invalid.\n *\n * Used by bundler to validate images before building.\n */\nexport function validateImageDefinition(definition: ImageDefinition): void {\n // Basic validation\n if (!definition.name || typeof definition.name !== 'string') {\n throw new Error('Image name must be a non-empty string');\n }\n\n if (!definition.version || typeof definition.version !== 'string') {\n throw new Error('Image version must be a non-empty string');\n }\n\n if (!definition.description || typeof definition.description !== 'string') {\n throw new Error('Image description must be a non-empty string');\n }\n\n // Validate version format (basic semver check)\n const versionRegex = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$/;\n if (!versionRegex.test(definition.version)) {\n throw new Error(\n `Image version '${definition.version}' is not valid semver. Expected format: x.y.z`\n );\n }\n\n // Validate target if provided\n if (definition.target !== undefined) {\n if (typeof definition.target !== 'string' || definition.target.trim().length === 0) {\n throw new Error(`Image target must be a non-empty string when provided`);\n }\n }\n\n if (definition.constraints) {\n if (!Array.isArray(definition.constraints)) {\n throw new Error('Image constraints must be an array');\n }\n\n for (const constraint of definition.constraints) {\n if (typeof constraint !== 'string' || constraint.trim().length === 0) {\n throw new Error(`Image constraint must be a non-empty string`);\n }\n }\n }\n\n // Validate utils if provided\n if (definition.utils) {\n for (const [name, path] of Object.entries(definition.utils)) {\n if (typeof path !== 'string') {\n throw new Error(`Utility '${name}' path must be a string`);\n }\n if (!path.startsWith('./')) {\n throw new Error(\n `Utility '${name}' path must be relative (start with './'). Got: ${path}`\n );\n }\n }\n }\n\n // Validate extends if provided\n if (definition.extends) {\n if (typeof definition.extends !== 'string') {\n throw new Error('Image extends must be a string (parent image name)');\n }\n }\n}\n","/**\n * Code generator for images\n *\n * Transforms image definitions + convention folders into importable packages with:\n * - A typed `DextoImage` default export (no side effects)\n * - Optional utility re-exports\n */\n\nimport type { ImageDefinition } from './image-definition/types.js';\nimport type { GeneratedCode } from './types.js';\nimport type { DiscoveredFactories } from './bundler.js';\n\n/**\n * Generate JavaScript entry point for an image\n */\nexport function generateEntryPoint(\n definition: ImageDefinition,\n discoveredFactories: DiscoveredFactories\n): GeneratedCode {\n const imports = generateImports(definition, discoveredFactories);\n const helpers = definition.extends ? generateHelpers() : '';\n const imageModule = generateImageModule(definition, discoveredFactories);\n const utilityExports = generateUtilityExports(definition);\n\n const js = `// AUTO-GENERATED by @dexto/image-bundler\n// Do not edit this file directly. Edit dexto.image.ts instead.\n\n${imports}\n\n${helpers}\n\n${imageModule}\n\n${utilityExports}\n`;\n\n // Generate TypeScript definitions\n const dts = generateTypeDefinitions(definition);\n\n return { js, dts };\n}\n\nfunction sanitizeIdentifier(value: string): string {\n const sanitized = value.replace(/[^a-zA-Z0-9_$]/g, '_');\n if (/^[a-zA-Z_$]/.test(sanitized)) {\n return sanitized;\n }\n return `_${sanitized}`;\n}\n\nfunction toFactoryImportSymbol(prefix: string, type: string): string {\n return sanitizeIdentifier(`${prefix}_${type}`);\n}\n\nfunction generateImports(\n definition: ImageDefinition,\n discoveredFactories: DiscoveredFactories\n): string {\n const imports: string[] = [];\n\n if (definition.extends) {\n imports.push(`import baseImage from '${definition.extends}';`);\n }\n\n imports.push(`import { defaultLoggerFactory } from '@dexto/core';`);\n\n const toolProviders = [...discoveredFactories.tools].sort((a, b) =>\n a.type.localeCompare(b.type)\n );\n const hookProviders = [...discoveredFactories.hooks].sort((a, b) =>\n a.type.localeCompare(b.type)\n );\n const compactionProviders = [...discoveredFactories.compaction].sort((a, b) =>\n a.type.localeCompare(b.type)\n );\n const blobProviders = [...discoveredFactories.storage.blob].sort((a, b) =>\n a.type.localeCompare(b.type)\n );\n const databaseProviders = [...discoveredFactories.storage.database].sort((a, b) =>\n a.type.localeCompare(b.type)\n );\n const cacheProviders = [...discoveredFactories.storage.cache].sort((a, b) =>\n a.type.localeCompare(b.type)\n );\n\n if (\n toolProviders.length > 0 ||\n hookProviders.length > 0 ||\n compactionProviders.length > 0 ||\n blobProviders.length > 0 ||\n databaseProviders.length > 0 ||\n cacheProviders.length > 0\n ) {\n imports.push('');\n imports.push('// Factories (convention folders; each must `export const factory = ...`)');\n }\n\n for (const entry of toolProviders) {\n const symbol = toFactoryImportSymbol('tools', entry.type);\n imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);\n }\n for (const entry of hookProviders) {\n const symbol = toFactoryImportSymbol('hooks', entry.type);\n imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);\n }\n for (const entry of compactionProviders) {\n const symbol = toFactoryImportSymbol('compaction', entry.type);\n imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);\n }\n for (const entry of blobProviders) {\n const symbol = toFactoryImportSymbol('storage_blob', entry.type);\n imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);\n }\n for (const entry of databaseProviders) {\n const symbol = toFactoryImportSymbol('storage_database', entry.type);\n imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);\n }\n for (const entry of cacheProviders) {\n const symbol = toFactoryImportSymbol('storage_cache', entry.type);\n imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);\n }\n\n return imports.join('\\n');\n}\n\nfunction generateHelpers(): string {\n return `function isPlainObject(value) {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction mergeImageDefaults(baseDefaults, overrideDefaults) {\n if (!baseDefaults) return overrideDefaults;\n if (!overrideDefaults) return baseDefaults;\n\n const merged = { ...baseDefaults, ...overrideDefaults };\n for (const [key, baseValue] of Object.entries(baseDefaults)) {\n const overrideValue = overrideDefaults[key];\n if (!isPlainObject(baseValue) || !isPlainObject(overrideValue)) {\n continue;\n }\n merged[key] = {\n ...baseValue,\n ...overrideValue,\n };\n }\n return merged;\n}`;\n}\n\nfunction generateUtilityExports(definition: ImageDefinition): string {\n const sections: string[] = [];\n\n // Generate wildcard utility exports\n if (definition.utils && Object.keys(definition.utils).length > 0) {\n sections.push('// Utility exports');\n for (const [name, path] of Object.entries(definition.utils)) {\n sections.push(`export * from '${path}';`);\n }\n }\n\n // Generate selective named exports (filter out type-only exports for runtime JS)\n if (definition.exports && Object.keys(definition.exports).length > 0) {\n if (sections.length > 0) sections.push('');\n sections.push('// Selective package re-exports');\n for (const [packageName, exports] of Object.entries(definition.exports)) {\n // Check for wildcard re-export\n if (exports.length === 1 && exports[0] === '*') {\n sections.push(`export * from '${packageName}';`);\n continue;\n }\n\n // Filter out type-only exports (those starting with 'type ')\n const runtimeExports = exports.filter((exp) => !exp.startsWith('type '));\n if (runtimeExports.length > 0) {\n sections.push(`export {`);\n sections.push(` ${runtimeExports.join(',\\n ')}`);\n sections.push(`} from '${packageName}';`);\n }\n }\n }\n\n if (sections.length === 0) {\n return '// No utilities or exports defined for this image';\n }\n\n return sections.join('\\n');\n}\n\nfunction generateImageModule(\n definition: ImageDefinition,\n discoveredFactories: DiscoveredFactories\n): string {\n const derivedDefaults =\n definition.defaults !== undefined\n ? JSON.stringify(definition.defaults, null, 4)\n : 'undefined';\n\n const toolsEntries = discoveredFactories.tools\n .slice()\n .sort((a, b) => a.type.localeCompare(b.type))\n .map((entry) => {\n const symbol = toFactoryImportSymbol('tools', entry.type);\n return ` ${JSON.stringify(entry.type)}: ${symbol},`;\n });\n\n const hookEntries = discoveredFactories.hooks\n .slice()\n .sort((a, b) => a.type.localeCompare(b.type))\n .map((entry) => {\n const symbol = toFactoryImportSymbol('hooks', entry.type);\n return ` ${JSON.stringify(entry.type)}: ${symbol},`;\n });\n\n const compactionEntries = discoveredFactories.compaction\n .slice()\n .sort((a, b) => a.type.localeCompare(b.type))\n .map((entry) => {\n const symbol = toFactoryImportSymbol('compaction', entry.type);\n return ` ${JSON.stringify(entry.type)}: ${symbol},`;\n });\n\n const blobEntries = discoveredFactories.storage.blob\n .slice()\n .sort((a, b) => a.type.localeCompare(b.type))\n .map((entry) => {\n const symbol = toFactoryImportSymbol('storage_blob', entry.type);\n return ` ${JSON.stringify(entry.type)}: ${symbol},`;\n });\n\n const databaseEntries = discoveredFactories.storage.database\n .slice()\n .sort((a, b) => a.type.localeCompare(b.type))\n .map((entry) => {\n const symbol = toFactoryImportSymbol('storage_database', entry.type);\n return ` ${JSON.stringify(entry.type)}: ${symbol},`;\n });\n\n const cacheEntries = discoveredFactories.storage.cache\n .slice()\n .sort((a, b) => a.type.localeCompare(b.type))\n .map((entry) => {\n const symbol = toFactoryImportSymbol('storage_cache', entry.type);\n return ` ${JSON.stringify(entry.type)}: ${symbol},`;\n });\n\n const metadataLines: string[] = [];\n metadataLines.push(` name: ${JSON.stringify(definition.name)},`);\n metadataLines.push(` version: ${JSON.stringify(definition.version)},`);\n metadataLines.push(` description: ${JSON.stringify(definition.description)},`);\n\n if (definition.target !== undefined) {\n metadataLines.push(` target: ${JSON.stringify(definition.target)},`);\n } else if (definition.extends) {\n metadataLines.push(` target: baseImage.metadata.target,`);\n }\n\n if (definition.extends) {\n const derivedConstraints = JSON.stringify(definition.constraints ?? []);\n metadataLines.push(\n ` constraints: Array.from(new Set([...(baseImage.metadata.constraints ?? []), ...${derivedConstraints}])),`\n );\n } else if (definition.constraints !== undefined) {\n metadataLines.push(` constraints: ${JSON.stringify(definition.constraints)},`);\n }\n\n const defaultsExpression = definition.extends\n ? `mergeImageDefaults(baseImage.defaults, ${derivedDefaults})`\n : derivedDefaults;\n\n const toolsSpread = definition.extends ? ` ...baseImage.tools,\\n` : '';\n const hooksSpread = definition.extends ? ` ...baseImage.hooks,\\n` : '';\n const compactionSpread = definition.extends ? ` ...baseImage.compaction,\\n` : '';\n\n const blobSpread = definition.extends ? ` ...baseImage.storage.blob,\\n` : '';\n const databaseSpread = definition.extends ? ` ...baseImage.storage.database,\\n` : '';\n const cacheSpread = definition.extends ? ` ...baseImage.storage.cache,\\n` : '';\n\n const loggerExpression = definition.extends\n ? `baseImage.logger ?? defaultLoggerFactory`\n : `defaultLoggerFactory`;\n\n return `const image = {\n metadata: {\n${metadataLines.join('\\n')}\n },\n defaults: ${defaultsExpression},\n tools: {\n${toolsSpread}${toolsEntries.join('\\n')}\n },\n storage: {\n blob: {\n${blobSpread}${blobEntries.join('\\n')}\n },\n database: {\n${databaseSpread}${databaseEntries.join('\\n')}\n },\n cache: {\n${cacheSpread}${cacheEntries.join('\\n')}\n },\n },\n hooks: {\n${hooksSpread}${hookEntries.join('\\n')}\n },\n compaction: {\n${compactionSpread}${compactionEntries.join('\\n')}\n },\n logger: ${loggerExpression},\n};\n\nexport default image;`;\n}\n\nfunction generateTypeDefinitions(definition: ImageDefinition): string {\n const sections: string[] = [];\n\n // Wildcard utility exports\n if (definition.utils && Object.keys(definition.utils).length > 0) {\n sections.push('// Utility re-exports');\n for (const path of Object.values(definition.utils)) {\n sections.push(`export * from '${path}';`);\n }\n }\n\n // Selective named exports\n if (definition.exports && Object.keys(definition.exports).length > 0) {\n if (sections.length > 0) sections.push('');\n sections.push('// Selective package re-exports');\n for (const [packageName, exports] of Object.entries(definition.exports)) {\n // Check for wildcard re-export\n if (exports.length === 1 && exports[0] === '*') {\n sections.push(`export * from '${packageName}';`);\n continue;\n }\n\n sections.push(`export {`);\n sections.push(` ${exports.join(',\\n ')}`);\n sections.push(`} from '${packageName}';`);\n }\n }\n\n const utilityExports = sections.length > 0 ? '\\n\\n' + sections.join('\\n') : '';\n\n return `// AUTO-GENERATED TypeScript definitions\n// Do not edit this file directly\n\n\timport type { DextoImage } from '@dexto/agent-config';\n\n\t/**\n\t * Typed image module (no side effects)\n\t */\n\t\tdeclare const image: DextoImage;\n\t\texport default image;\n${utilityExports}\n\t`;\n}\n"],"mappings":"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","names":["require","program","readFileSync","join","dirname","__filename","__dirname"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,68 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ImageDefaults } from '@dexto/agent-config';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Image Definition Types (bundler-only)
|
|
5
|
+
*
|
|
6
|
+
* The bundler consumes a `dexto.image.ts` file that declares metadata and defaults.
|
|
7
|
+
* Concrete tools/storage/hooks/compaction factories are discovered from convention folders
|
|
8
|
+
* and must `export const factory = ...` from their `index.ts`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Image definition structure consumed by `@dexto/image-bundler`.
|
|
13
|
+
*
|
|
14
|
+
* Note: Provider factories are discovered from folders; this file is metadata + defaults only.
|
|
15
|
+
*/
|
|
16
|
+
interface ImageDefinition {
|
|
17
|
+
/** Unique name for this image (e.g., 'image-local') */
|
|
18
|
+
name: string;
|
|
19
|
+
/** Semantic version of this image */
|
|
20
|
+
version: string;
|
|
21
|
+
/** Brief description of this image's purpose */
|
|
22
|
+
description: string;
|
|
23
|
+
/** Target deployment environment (for documentation and validation) */
|
|
24
|
+
target?: string;
|
|
25
|
+
/** Runtime constraints this image requires (for validation and error messages) */
|
|
26
|
+
constraints?: string[];
|
|
27
|
+
/** Parent image package name to extend (optional) */
|
|
28
|
+
extends?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Default configuration values (merged into agent config; config wins).
|
|
31
|
+
*
|
|
32
|
+
* This must match the `AgentConfig` shape. Unknown fields will be rejected by schema validation.
|
|
33
|
+
*/
|
|
34
|
+
defaults?: ImageDefaults;
|
|
35
|
+
/**
|
|
36
|
+
* Utility exports (optional).
|
|
37
|
+
* Maps export name to file path (relative to image root).
|
|
38
|
+
*/
|
|
39
|
+
utils?: Record<string, string>;
|
|
40
|
+
/**
|
|
41
|
+
* Selective named exports from packages (optional).
|
|
42
|
+
*/
|
|
43
|
+
exports?: Record<string, string[]>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Metadata about a built image (generated by bundler).
|
|
47
|
+
*/
|
|
48
|
+
interface ImageMetadata {
|
|
49
|
+
/** Image name */
|
|
50
|
+
name: string;
|
|
51
|
+
/** Image version */
|
|
52
|
+
version: string;
|
|
53
|
+
/** Description */
|
|
54
|
+
description: string;
|
|
55
|
+
/** Target environment */
|
|
56
|
+
target?: string;
|
|
57
|
+
/** Runtime constraints */
|
|
58
|
+
constraints: string[];
|
|
59
|
+
/** Build timestamp */
|
|
60
|
+
builtAt: string;
|
|
61
|
+
/** Core version this image was built for */
|
|
62
|
+
coreVersion: string;
|
|
63
|
+
/** Base image this extends (if any) */
|
|
64
|
+
extends?: string;
|
|
65
|
+
}
|
|
2
66
|
|
|
3
67
|
interface BundleOptions {
|
|
4
68
|
/** Path to dexto.image.ts file */
|
|
@@ -36,4 +100,4 @@ interface GeneratedCode {
|
|
|
36
100
|
*/
|
|
37
101
|
declare function bundle(options: BundleOptions): Promise<BundleResult>;
|
|
38
102
|
|
|
39
|
-
export { type BundleOptions, type BundleResult, type GeneratedCode, bundle };
|
|
103
|
+
export { type BundleOptions, type BundleResult, type GeneratedCode, type ImageDefinition, type ImageMetadata, bundle };
|