@dexto/image-bundler 1.5.6 → 1.5.7

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @dexto/image-bundler@1.5.6 build /home/runner/work/dexto/dexto/packages/image-bundler
2
+ > @dexto/image-bundler@1.5.7 build /home/runner/work/dexto/dexto/packages/image-bundler
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: src/cli.ts, src/index.ts
@@ -9,12 +9,12 @@
9
9
  CLI Target: es2022
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
- ESM dist/cli.js 18.61 KB
13
- ESM dist/index.js 15.82 KB
14
- ESM dist/cli.js.map 37.66 KB
15
- ESM dist/index.js.map 32.16 KB
16
- ESM ⚡️ Build success in 88ms
12
+ ESM dist/cli.js 18.74 KB
13
+ ESM dist/index.js 15.96 KB
14
+ ESM dist/cli.js.map 37.92 KB
15
+ ESM dist/index.js.map 32.42 KB
16
+ ESM ⚡️ Build success in 71ms
17
17
  DTS Build start
18
- DTS ⚡️ Build success in 9433ms
18
+ DTS ⚡️ Build success in 10836ms
19
19
  DTS dist/cli.d.ts 20.00 B
20
20
  DTS dist/index.d.ts 965.00 B
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @dexto/image-bundler
2
2
 
3
+ ## 1.5.7
4
+
5
+ ### Patch Changes
6
+
7
+ - c4ae9e7: Added support for skills and plugins. Create a custom plugin for plan tools and skills along with support for Plan mode.
8
+ - Updated dependencies [7de0cbe]
9
+ - Updated dependencies [c4ae9e7]
10
+ - Updated dependencies [a2c7092]
11
+ - Updated dependencies [1e0ac05]
12
+ - Updated dependencies [ee3f1f8]
13
+ - Updated dependencies [1960235]
14
+ - @dexto/core@1.5.7
15
+
3
16
  ## 1.5.6
4
17
 
5
18
  ### Patch Changes
package/dist/cli.js CHANGED
@@ -195,6 +195,9 @@ function generateMetadata(definition, coreVersion) {
195
195
  if (definition.extends) {
196
196
  metadata.extends = definition.extends;
197
197
  }
198
+ if (definition.bundledPlugins && definition.bundledPlugins.length > 0) {
199
+ metadata.bundledPlugins = definition.bundledPlugins;
200
+ }
198
201
  return `/**
199
202
  * Image metadata
200
203
  * Generated at build time
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 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/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"]}
package/dist/index.js CHANGED
@@ -190,6 +190,9 @@ function generateMetadata(definition, coreVersion) {
190
190
  if (definition.extends) {
191
191
  metadata.extends = definition.extends;
192
192
  }
193
+ if (definition.bundledPlugins && definition.bundledPlugins.length > 0) {
194
+ metadata.bundledPlugins = definition.bundledPlugins;
195
+ }
193
196
  return `/**
194
197
  * Image metadata
195
198
  * Generated at build time
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bundler.ts","../src/generator.ts"],"sourcesContent":["/**\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 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":[]}
1
+ {"version":3,"sources":["../src/bundler.ts","../src/generator.ts"],"sourcesContent":["/**\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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dexto/image-bundler",
3
- "version": "1.5.6",
3
+ "version": "1.5.7",
4
4
  "description": "Bundler for Dexto base images",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,7 +18,7 @@
18
18
  "commander": "^12.0.0",
19
19
  "esbuild": "^0.25.0",
20
20
  "picocolors": "^1.0.0",
21
- "@dexto/core": "1.5.6"
21
+ "@dexto/core": "1.5.7"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/node": "^20.11.5",
package/src/generator.ts CHANGED
@@ -266,6 +266,11 @@ function generateMetadata(definition: ImageDefinition, coreVersion: string): str
266
266
  metadata.extends = definition.extends;
267
267
  }
268
268
 
269
+ // Include bundled plugins if present
270
+ if (definition.bundledPlugins && definition.bundledPlugins.length > 0) {
271
+ metadata.bundledPlugins = definition.bundledPlugins;
272
+ }
273
+
269
274
  return `/**
270
275
  * Image metadata
271
276
  * Generated at build time