@dexto/image-bundler 1.7.2 → 1.8.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @dexto/image-bundler@1.7.2 build /home/runner/work/dexto/dexto/packages/image-bundler
2
+ > @dexto/image-bundler@1.8.0 build /home/runner/work/dexto/dexto/packages/image-bundler
3
3
  > tsup && node ../../scripts/clean-tsbuildinfo.mjs && tsc -b tsconfig.json --emitDeclarationOnly
4
4
 
5
5
  CLI Building entry: src/cli.ts, src/index.ts
@@ -9,11 +9,11 @@
9
9
  CLI Target: es2022
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
- ESM dist/cli.js 26.79 KB
13
- ESM dist/index.js 24.16 KB
14
- ESM dist/cli.js.map 52.96 KB
15
- ESM dist/index.js.map 47.86 KB
16
- ESM ⚡️ Build success in 87ms
12
+ ESM dist/cli.js 23.18 KB
13
+ ESM dist/index.js 20.55 KB
14
+ ESM dist/cli.js.map 45.77 KB
15
+ ESM dist/index.js.map 40.66 KB
16
+ ESM ⚡️ Build success in 95ms
17
17
  DTS Build start
18
- DTS ⚡️ Build success in 10657ms
19
- DTS dist/index.d.ts 2.97 KB
18
+ DTS ⚡️ Build success in 10970ms
19
+ DTS dist/index.d.ts 3.05 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @dexto/image-bundler
2
2
 
3
+ ## 1.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 241875a: Rebuild runtime storage, skills, workspace-backed tools, and turn execution architecture.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [241875a]
12
+ - @dexto/agent-config@1.8.0
13
+ - @dexto/core@1.8.0
14
+
3
15
  ## 1.7.2
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -2,8 +2,10 @@
2
2
 
3
3
  Bundler for convention-based Dexto images.
4
4
 
5
- It consumes a `dexto.image.ts` (metadata + defaults) and a convention folder layout (tools/storage/hooks/compaction),
5
+ It consumes a `dexto.image.ts` (metadata + defaults) and a convention folder layout (tools/hooks/compaction),
6
6
  then produces a distributable package that **default-exports a typed `DextoImage`** (no side effects, no registries).
7
+ The image is the boundary where tools, stores, workspace handles, and skill sources are supplied to
8
+ hosts.
7
9
 
8
10
  ## CLI
9
11
 
@@ -24,9 +26,6 @@ Each `<type>/index.ts` must export a `factory` constant with `{ configSchema, cr
24
26
 
25
27
  ```
26
28
  tools/<type>/index.ts
27
- storage/blob/<type>/index.ts
28
- storage/database/<type>/index.ts
29
- storage/cache/<type>/index.ts
30
29
  hooks/<type>/index.ts
31
30
  compaction/<type>/index.ts
32
31
  ```
@@ -36,8 +35,11 @@ compaction/<type>/index.ts
36
35
  The generated default export matches `@dexto/agent-config`’s `DextoImage` interface:
37
36
 
38
37
  - `metadata` + optional `defaults`
39
- - `tools`, `storage.*`, `hooks`, `compaction` factory maps (keyed by config `type`)
38
+ - `tools`, `hooks`, `compaction` factory maps (keyed by config `type`)
39
+ - `storage.createStores` inherited from the base image, or a generated placeholder for custom base images
40
40
  - `logger` factory
41
+ - optional `workspace.create` for `WorkspaceHandleProvider`
42
+ - optional `skills.create` for `SkillSource` instances consumed by `SkillManager`
41
43
 
42
44
  ## Related
43
45
 
package/dist/cli.js CHANGED
@@ -106,16 +106,7 @@ function generateImports(definition, discoveredFactories) {
106
106
  const compactionProviders = [...discoveredFactories.compaction].sort(
107
107
  (a, b) => a.type.localeCompare(b.type)
108
108
  );
109
- const blobProviders = [...discoveredFactories.storage.blob].sort(
110
- (a, b) => a.type.localeCompare(b.type)
111
- );
112
- const databaseProviders = [...discoveredFactories.storage.database].sort(
113
- (a, b) => a.type.localeCompare(b.type)
114
- );
115
- const cacheProviders = [...discoveredFactories.storage.cache].sort(
116
- (a, b) => a.type.localeCompare(b.type)
117
- );
118
- if (toolProviders.length > 0 || hookProviders.length > 0 || compactionProviders.length > 0 || blobProviders.length > 0 || databaseProviders.length > 0 || cacheProviders.length > 0) {
109
+ if (toolProviders.length > 0 || hookProviders.length > 0 || compactionProviders.length > 0) {
119
110
  imports.push("");
120
111
  imports.push("// Factories (convention folders; each must `export const factory = ...`)");
121
112
  }
@@ -131,18 +122,6 @@ function generateImports(definition, discoveredFactories) {
131
122
  const symbol = toFactoryImportSymbol("compaction", entry.type);
132
123
  imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);
133
124
  }
134
- for (const entry of blobProviders) {
135
- const symbol = toFactoryImportSymbol("storage_blob", entry.type);
136
- imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);
137
- }
138
- for (const entry of databaseProviders) {
139
- const symbol = toFactoryImportSymbol("storage_database", entry.type);
140
- imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);
141
- }
142
- for (const entry of cacheProviders) {
143
- const symbol = toFactoryImportSymbol("storage_cache", entry.type);
144
- imports.push(`import { factory as ${symbol} } from '${entry.importPath}';`);
145
- }
146
125
  return imports.join("\n");
147
126
  }
148
127
  function generateHelpers() {
@@ -211,18 +190,6 @@ function generateImageModule(definition, discoveredFactories) {
211
190
  const symbol = toFactoryImportSymbol("compaction", entry.type);
212
191
  return ` ${JSON.stringify(entry.type)}: ${symbol},`;
213
192
  });
214
- const blobEntries = discoveredFactories.storage.blob.slice().sort((a, b) => a.type.localeCompare(b.type)).map((entry) => {
215
- const symbol = toFactoryImportSymbol("storage_blob", entry.type);
216
- return ` ${JSON.stringify(entry.type)}: ${symbol},`;
217
- });
218
- const databaseEntries = discoveredFactories.storage.database.slice().sort((a, b) => a.type.localeCompare(b.type)).map((entry) => {
219
- const symbol = toFactoryImportSymbol("storage_database", entry.type);
220
- return ` ${JSON.stringify(entry.type)}: ${symbol},`;
221
- });
222
- const cacheEntries = discoveredFactories.storage.cache.slice().sort((a, b) => a.type.localeCompare(b.type)).map((entry) => {
223
- const symbol = toFactoryImportSymbol("storage_cache", entry.type);
224
- return ` ${JSON.stringify(entry.type)}: ${symbol},`;
225
- });
226
193
  const metadataLines = [];
227
194
  metadataLines.push(` name: ${JSON.stringify(definition.name)},`);
228
195
  metadataLines.push(` version: ${JSON.stringify(definition.version)},`);
@@ -247,12 +214,12 @@ function generateImageModule(definition, discoveredFactories) {
247
214
  ` : "";
248
215
  const compactionSpread = definition.extends ? ` ...baseImage.compaction,
249
216
  ` : "";
250
- const blobSpread = definition.extends ? ` ...baseImage.storage.blob,
251
- ` : "";
252
- const databaseSpread = definition.extends ? ` ...baseImage.storage.database,
253
- ` : "";
254
- const cacheSpread = definition.extends ? ` ...baseImage.storage.cache,
255
- ` : "";
217
+ const storageExpression = definition.extends ? `baseImage.storage` : `{
218
+ configSchema: { parse: (config) => config },
219
+ createStores: () => {
220
+ throw new Error('This generated image does not define storage. Extend an image with storage or provide a storage implementation.');
221
+ },
222
+ }`;
256
223
  const loggerExpression = definition.extends ? `baseImage.logger ?? defaultLoggerFactory` : `defaultLoggerFactory`;
257
224
  return `const image = {
258
225
  metadata: {
@@ -262,17 +229,7 @@ ${metadataLines.join("\n")}
262
229
  tools: {
263
230
  ${toolsSpread}${toolsEntries.join("\n")}
264
231
  },
265
- storage: {
266
- blob: {
267
- ${blobSpread}${blobEntries.join("\n")}
268
- },
269
- database: {
270
- ${databaseSpread}${databaseEntries.join("\n")}
271
- },
272
- cache: {
273
- ${cacheSpread}${cacheEntries.join("\n")}
274
- },
275
- },
232
+ storage: ${storageExpression},
276
233
  hooks: {
277
234
  ${hooksSpread}${hookEntries.join("\n")}
278
235
  },
@@ -363,21 +320,6 @@ async function bundle(options) {
363
320
  compileSourceFiles(compactionDir, join(outDir, "compaction"));
364
321
  compiledCount++;
365
322
  }
366
- const storageBlobDir = join(imageDir, "storage", "blob");
367
- if (existsSync(storageBlobDir)) {
368
- compileSourceFiles(storageBlobDir, join(outDir, "storage", "blob"));
369
- compiledCount++;
370
- }
371
- const storageDatabaseDir = join(imageDir, "storage", "database");
372
- if (existsSync(storageDatabaseDir)) {
373
- compileSourceFiles(storageDatabaseDir, join(outDir, "storage", "database"));
374
- compiledCount++;
375
- }
376
- const storageCacheDir = join(imageDir, "storage", "cache");
377
- if (existsSync(storageCacheDir)) {
378
- compileSourceFiles(storageCacheDir, join(outDir, "storage", "cache"));
379
- compiledCount++;
380
- }
381
323
  if (compiledCount > 0) {
382
324
  console.log(
383
325
  `\u2705 Compiled ${compiledCount} factory categor${compiledCount === 1 ? "y" : "ies"}`
@@ -543,11 +485,6 @@ function findTypeScriptFiles(dir) {
543
485
  function discoverFactories(imageDir, warnings) {
544
486
  const result = {
545
487
  tools: [],
546
- storage: {
547
- blob: [],
548
- database: [],
549
- cache: []
550
- },
551
488
  hooks: [],
552
489
  compaction: [],
553
490
  totalCount: 0
@@ -589,25 +526,10 @@ function discoverFactories(imageDir, warnings) {
589
526
  importBase: "compaction",
590
527
  label: "compaction/"
591
528
  });
592
- result.storage.blob = discoverFolder({
593
- srcDir: join(imageDir, "storage", "blob"),
594
- importBase: "storage/blob",
595
- label: "storage/blob/"
596
- });
597
- result.storage.database = discoverFolder({
598
- srcDir: join(imageDir, "storage", "database"),
599
- importBase: "storage/database",
600
- label: "storage/database/"
601
- });
602
- result.storage.cache = discoverFolder({
603
- srcDir: join(imageDir, "storage", "cache"),
604
- importBase: "storage/cache",
605
- label: "storage/cache/"
606
- });
607
- result.totalCount = result.tools.length + result.hooks.length + result.compaction.length + result.storage.blob.length + result.storage.database.length + result.storage.cache.length;
529
+ result.totalCount = result.tools.length + result.hooks.length + result.compaction.length;
608
530
  if (result.totalCount === 0) {
609
531
  warnings.push(
610
- "No factories discovered from convention folders. This image will not be able to resolve tools/storage unless it extends a base image."
532
+ "No factories discovered from convention folders. This image will not be able to resolve tools/hooks/compaction unless it extends a base image."
611
533
  );
612
534
  }
613
535
  return result;
@@ -661,15 +583,6 @@ async function validateDiscoveredFactories(outDir, discovered) {
661
583
  for (const entry of discovered.compaction) {
662
584
  validations.push(validateFactoryExport({ outDir, kind: "compaction", entry }));
663
585
  }
664
- for (const entry of discovered.storage.blob) {
665
- validations.push(validateFactoryExport({ outDir, kind: "storage.blob", entry }));
666
- }
667
- for (const entry of discovered.storage.database) {
668
- validations.push(validateFactoryExport({ outDir, kind: "storage.database", entry }));
669
- }
670
- for (const entry of discovered.storage.cache) {
671
- validations.push(validateFactoryExport({ outDir, kind: "storage.cache", entry }));
672
- }
673
586
  await Promise.all(validations);
674
587
  }
675
588
 
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
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"]}
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 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 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 is an image-level createStores implementation, not convention-discovered\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 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 result.totalCount = result.tools.length + result.hooks.length + result.compaction.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/hooks/compaction 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 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 if (toolProviders.length > 0 || hookProviders.length > 0 || compactionProviders.length > 0) {\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 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 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 storageExpression = definition.extends\n ? `baseImage.storage`\n : `{\n configSchema: { parse: (config) => config },\n createStores: () => {\n throw new Error('This generated image does not define storage. Extend an image with storage or provide a storage implementation.');\n },\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: ${storageExpression},\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
@@ -4,7 +4,7 @@ import { ImageDefaults } from '@dexto/agent-config';
4
4
  * Image Definition Types (bundler-only)
5
5
  *
6
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
7
+ * Concrete tools/hooks/compaction factories are discovered from convention folders
8
8
  * and must `export const factory = ...` from their `index.ts`.
9
9
  */
10
10
 
@@ -12,6 +12,7 @@ import { ImageDefaults } from '@dexto/agent-config';
12
12
  * Image definition structure consumed by `@dexto/image-bundler`.
13
13
  *
14
14
  * Note: Provider factories are discovered from folders; this file is metadata + defaults only.
15
+ * Storage is supplied by the runtime image's `storage.createStores` implementation.
15
16
  */
16
17
  interface ImageDefinition {
17
18
  /** Unique name for this image (e.g., 'image-local') */