@walkeros/cli 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @walkeros/cli
2
2
 
3
+ ## 0.6.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [f5120b2]
8
+ - @walkeros/core@0.7.0
9
+ - @walkeros/server-core@0.6.1
10
+
3
11
  ## 0.6.1
4
12
 
5
13
  ### Patch Changes
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/version.ts","../src/commands/bundle/index.ts","../src/core/logger.ts","../src/core/collector-logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/tmp.ts","../src/core/asset-resolver.ts","../src/config/utils.ts","../src/core/utils.ts","../src/core/local-packages.ts","../src/core/input-detector.ts","../src/config/validators.ts","../src/config/build-defaults.ts","../src/config/loader.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/package-manager.ts","../src/core/cache-utils.ts","../src/core/build-cache.ts","../src/commands/bundle/stats.ts","../src/commands/simulate/simulator.ts","../src/commands/simulate/tracker.ts","../src/commands/simulate/jsdom-executor.ts","../src/commands/simulate/node-executor.ts","../src/commands/simulate/env-loader.ts","../src/commands/simulate/index.ts","../src/commands/push/index.ts","../src/commands/run/index.ts","../src/commands/run/validators.ts","../src/schemas/primitives.ts","../src/schemas/run.ts","../src/commands/run/utils.ts","../src/commands/run/execution.ts","../src/runtime/runner.ts","../src/runtime/serve.ts","../src/commands/cache.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { VERSION } from './version.js';\nimport { bundleCommand } from './commands/bundle/index.js';\nimport { simulateCommand } from './commands/simulate/index.js';\nimport { pushCommand } from './commands/push/index.js';\nimport { runCommand } from './commands/run/index.js';\nimport {\n registerCacheCommand,\n registerCleanCommand,\n} from './commands/cache.js';\n\n// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand, simulateCommand, pushCommand, runCommand };\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle } from './commands/bundle/index.js';\nexport { simulate } from './commands/simulate/index.js';\nexport { run } from './commands/run/index.js';\n\n// === Types ===\n// Export types for programmatic usage\n// Config structure uses Flow.Setup and Flow.Config from @walkeros/core\nexport type {\n Flow,\n CLIBuildOptions,\n BuildOptions,\n MinifyOptions,\n} from './types/bundle.js';\nexport type { BundleStats } from './commands/bundle/bundler.js';\nexport type { SimulationResult } from './commands/simulate/types.js';\nexport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './commands/run/index.js';\nexport type { GlobalOptions } from './types/global.js';\n\nconst program = new Command();\n\nprogram\n .name('walkeros')\n .description('walkerOS CLI - Bundle and deploy walkerOS components')\n .version(VERSION);\n\n// Display startup banner before any command runs\nprogram.hook('preAction', (thisCommand, actionCommand) => {\n const options = actionCommand.opts();\n // Skip banner for --silent, --json, or --help flags\n if (!options.silent && !options.json) {\n console.log(chalk.hex('#01b5e2')(`walkerOS v${VERSION}`));\n }\n});\n\n// Bundle command\nprogram\n .command('bundle [file]')\n .description('Bundle NPM packages with custom code')\n .option('-f, --flow <name>', 'flow to build (for multi-flow configs)')\n .option('--all', 'build all flows (for multi-flow configs)')\n .option('-s, --stats', 'show bundle statistics')\n .option('--json', 'output statistics in JSON format (implies --stats)')\n .option('--no-cache', 'disable package caching and download fresh packages')\n .option('-v, --verbose', 'verbose output')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .option('--dockerfile', 'generate Dockerfile alongside bundle')\n .action(async (file, options) => {\n await bundleCommand({\n config: file || 'bundle.config.json',\n flow: options.flow,\n all: options.all,\n stats: options.stats,\n json: options.json,\n cache: options.cache,\n verbose: options.verbose,\n dryRun: options.dryRun,\n silent: options.silent,\n dockerfile: options.dockerfile,\n });\n });\n\n// Simulate command\nprogram\n .command('simulate [file]')\n .description('Simulate event processing and capture API calls')\n .option(\n '-e, --event <source>',\n 'Event to simulate (JSON string, file path, or URL)',\n )\n .option('-p, --platform <platform>', 'Platform override (web or server)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await simulateCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n platform: options.platform,\n json: options.json,\n verbose: options.verbose,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Push command\nprogram\n .command('push [file]')\n .description('Push an event through the flow with real API execution')\n .requiredOption(\n '-e, --event <source>',\n 'Event to push (JSON string, file path, or URL)',\n )\n .option('--flow <name>', 'Flow name (for multi-flow configs)')\n .option('-p, --platform <platform>', 'Platform override (web or server)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('-s, --silent', 'Suppress output')\n .action(async (file, options) => {\n await pushCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n flow: options.flow,\n platform: options.platform,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n });\n });\n\n// Run command with subcommands\nconst runCmd = program\n .command('run')\n .description('Run walkerOS flows in collect or serve mode');\n\n// Run collect subcommand\nrunCmd\n .command('collect [file]')\n .description(\n 'Run collector mode (event collection endpoint). Defaults to server-collect.mjs if no file specified.',\n )\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('collect', {\n config: file || 'server-collect.mjs',\n port: options.port,\n host: options.host,\n json: options.json,\n verbose: options.verbose,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Run serve subcommand\nrunCmd\n .command('serve [file]')\n .description(\n 'Run serve mode (single-file server for browser bundles). Defaults to baked-in web-serve.js if no file specified.',\n )\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--name <filename>', 'Filename in URL (default: walker.js)')\n .option('--path <directory>', 'URL directory path (e.g., libs/v1)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('serve', {\n config: file || 'web-serve.js',\n port: options.port,\n host: options.host,\n serveName: options.name,\n servePath: options.path,\n json: options.json,\n verbose: options.verbose,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Cache command\nregisterCacheCommand(program);\n\n// Clean command\nregisterCleanCommand(program);\n\n// Run the CLI\n// Note: This file is marked as a bin script in package.json,\n// so it's always executed directly (never imported as a library)\nprogram.parse();\n","import { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\nconst versionFilename = fileURLToPath(import.meta.url);\nconst versionDirname = dirname(versionFilename);\n\n/**\n * Find package.json in parent directories\n * Handles both source (src/) and bundled (dist/) contexts\n */\nfunction findPackageJson(): string {\n const paths = [\n join(versionDirname, '../package.json'), // dist/ or src/\n join(versionDirname, '../../package.json'), // src/core/ (not used, but safe)\n ];\n for (const p of paths) {\n try {\n return readFileSync(p, 'utf-8');\n } catch {\n // Continue to next path\n }\n }\n return JSON.stringify({ version: '0.0.0' });\n}\n\n/** CLI package version */\nexport const VERSION: string = JSON.parse(findPackageJson()).version;\n","/**\n * Bundle Command\n *\n * Supports both single-flow and multi-flow builds.\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport {\n createCommandLogger,\n createTimer,\n createSuccessOutput,\n createErrorOutput,\n getErrorMessage,\n resolveAsset,\n} from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n loadAllFlows,\n type LoadConfigResult,\n} from '../../config/index.js';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { bundleCore } from './bundler.js';\nimport { displayStats, createStatsSummary } from './stats.js';\n\nexport interface BundleCommandOptions {\n config: string;\n flow?: string;\n all?: boolean;\n stats?: boolean;\n json?: boolean;\n cache?: boolean;\n verbose?: boolean;\n dryRun?: boolean;\n silent?: boolean;\n dockerfile?: boolean;\n}\n\nexport async function bundleCommand(\n options: BundleCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCommandLogger(options);\n\n // Handle dry-run\n if (options.dryRun) {\n logger.log(`[DRY-RUN] Would execute bundle with config: ${options.config}`);\n return;\n }\n\n try {\n // Validate flag combination\n if (options.flow && options.all) {\n throw new Error('Cannot use both --flow and --all flags together');\n }\n\n // Step 1: Read configuration file\n // Resolve bare names to examples directory, keep paths/URLs as-is\n const configPath = resolveAsset(options.config, 'config');\n const rawConfig = await loadJsonConfig(configPath);\n\n // Step 2: Load configuration(s) based on flags\n const configsToBundle: LoadConfigResult[] = options.all\n ? loadAllFlows(rawConfig, { configPath, logger })\n : [\n loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flow,\n logger,\n }),\n ];\n\n // Step 3: Bundle each configuration\n const results: Array<{\n flowName: string;\n success: boolean;\n stats?: unknown;\n error?: string;\n }> = [];\n\n for (const {\n flowConfig,\n buildOptions,\n flowName,\n isMultiFlow,\n } of configsToBundle) {\n try {\n // Override cache setting from CLI if provided\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // Log flow being built\n const configBasename = path.basename(configPath);\n if (isMultiFlow || options.all) {\n logger.log(`Bundling ${configBasename} (flow: ${flowName})...`);\n } else {\n logger.log(`Bundling ${configBasename}...`);\n }\n\n // Run bundler\n const shouldCollectStats = options.stats || options.json;\n const stats = await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n shouldCollectStats,\n );\n\n results.push({\n flowName,\n success: true,\n stats,\n });\n\n // Show stats if requested (for non-JSON, non-multi builds)\n if (!options.json && !options.all && options.stats && stats) {\n displayStats(stats, logger);\n }\n\n // Generate Dockerfile if requested\n if (options.dockerfile && !options.all) {\n const dockerfilePath = path.join(\n path.dirname(buildOptions.output),\n 'Dockerfile',\n );\n await generateDockerfile(dockerfilePath, buildOptions.output, logger);\n }\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n results.push({\n flowName,\n success: false,\n error: errorMessage,\n });\n\n if (!options.all) {\n throw error; // Re-throw for single flow builds\n }\n }\n }\n\n // Step 4: Report results\n const duration = timer.end() / 1000;\n const successCount = results.filter((r) => r.success).length;\n const failureCount = results.filter((r) => !r.success).length;\n\n if (options.json) {\n // JSON output for CI/CD\n const output =\n failureCount === 0\n ? createSuccessOutput(\n {\n flows: results,\n summary: {\n total: results.length,\n success: successCount,\n failed: failureCount,\n },\n },\n duration,\n )\n : createErrorOutput(\n `${failureCount} flow(s) failed to build`,\n duration,\n );\n logger.json(output);\n } else {\n if (options.all) {\n logger.log(\n `\\nBuild Summary: ${successCount}/${results.length} succeeded`,\n );\n if (failureCount > 0) {\n logger.error(`Failed: ${failureCount}`);\n }\n }\n\n if (failureCount > 0) {\n throw new Error(`${failureCount} flow(s) failed to build`);\n }\n }\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n // JSON error output for CI/CD\n const output = createErrorOutput(errorMessage, duration);\n logger.json(output);\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n process.exit(1);\n }\n}\n\n/**\n * High-level bundle function for programmatic usage.\n *\n * Handles configuration loading, parsing, and logger creation internally.\n *\n * @param configOrPath - Bundle configuration (Flow.Setup) or path to config file\n * @param options - Bundle options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.stats - Collect and return bundle statistics (default: false)\n * @param options.cache - Enable package caching (default: true)\n * @param options.flowName - Flow to use (required for multi-flow configs)\n * @returns Bundle statistics if stats option is true, otherwise void\n *\n * @example\n * ```typescript\n * // With Flow.Setup config object\n * await bundle({\n * version: 1,\n * flows: {\n * default: {\n * web: {},\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * destinations: { api: { code: 'destinationApi' } },\n * }\n * }\n * });\n *\n * // With config file\n * await bundle('./walker.config.json', { stats: true });\n * ```\n */\nexport async function bundle(\n configOrPath: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n stats?: boolean;\n cache?: boolean;\n flowName?: string;\n buildOverrides?: Partial<BuildOptions>;\n } = {},\n): Promise<import('./bundler').BundleStats | void> {\n // 1. Load config if path provided\n let rawConfig: unknown;\n // Use current working directory as base when config is passed as object\n let configPath = path.resolve(process.cwd(), 'walkeros.config.json');\n if (typeof configOrPath === 'string') {\n // Resolve bare names to examples directory, keep paths as-is\n configPath = resolveAsset(configOrPath, 'config');\n rawConfig = await loadJsonConfig(configPath);\n } else {\n rawConfig = configOrPath;\n }\n\n // 2. Load and resolve config using Flow.Setup format\n const { flowConfig, buildOptions } = loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flowName,\n buildOverrides: options.buildOverrides,\n });\n\n // 3. Handle cache option\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // 4. Create logger internally\n const logger = createCommandLogger(options);\n\n // 5. Call core bundler\n return await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n options.stats ?? false,\n );\n}\n\n/**\n * Generate a Dockerfile for the bundled flow.\n *\n * Creates a minimal Dockerfile that:\n * - Uses walkeros/flow:latest as base image\n * - Copies the bundled flow to /app/flow.mjs\n * - Sets required environment variables\n * - Exposes port 8080\n *\n * @param dockerfilePath - Path to write the Dockerfile\n * @param bundleOutput - Path to the bundled flow file\n * @param logger - Logger instance for output\n */\nasync function generateDockerfile(\n dockerfilePath: string,\n bundleOutput: string,\n logger: ReturnType<typeof createCommandLogger>,\n): Promise<void> {\n const bundleFilename = path.basename(bundleOutput);\n\n const dockerfile = `# Generated by walkeros CLI\nFROM walkeros/flow:latest\n\nCOPY ${bundleFilename} /app/flow/bundle.mjs\n\nENV MODE=collect\nENV FLOW=/app/flow/bundle.mjs\n\nEXPOSE 8080\n`;\n\n await fs.writeFile(dockerfilePath, dockerfile);\n logger.log(`Dockerfile: ${dockerfilePath}`);\n}\n","/* eslint-disable no-console */\nimport chalk from 'chalk';\nimport type { GlobalOptions } from '../types/global.js';\n\nconst BRAND_COLOR = '#01b5e2';\n\nexport interface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n}\n\nexport interface Logger {\n log: (...args: unknown[]) => void;\n brand: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n json: (data: unknown) => void;\n // Backward-compatible methods (map to default terminal color per design)\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n gray: (...args: unknown[]) => void;\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { verbose = false, silent = false, json = false } = options;\n\n const shouldLog = !silent && !json;\n const shouldDebug = verbose && !silent && !json;\n\n return {\n log: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n brand: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.hex(BRAND_COLOR)(message));\n }\n },\n\n error: (...args: unknown[]) => {\n if (!json) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.error(chalk.red(message));\n }\n },\n\n debug: (...args: unknown[]) => {\n if (shouldDebug) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(` ${message}`);\n }\n },\n\n json: (data: unknown) => {\n if (!silent) {\n console.log(JSON.stringify(data, null, 2));\n }\n },\n\n // Backward-compatible methods (all use default terminal color per design)\n info: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n success: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n warning: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n warn: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n gray: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n };\n}\n\n/**\n * Create logger from command options\n * Factory function that standardizes logger creation across commands\n *\n * @param options - Command options containing verbose, silent, and json flags\n * @returns Configured logger instance\n */\nexport function createCommandLogger(\n options: GlobalOptions & { json?: boolean },\n): Logger {\n return createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n}\n","import type { Logger as CoreLogger } from '@walkeros/core';\nimport type { Logger } from './logger.js';\n\n/**\n * Create collector logger config that forwards to CLI logger\n *\n * This bridges the CLI logger with the collector's internal logger,\n * allowing collector logs (from destinations, sources, etc.) to be\n * displayed through the CLI's output system.\n *\n * @param cliLogger - The CLI logger instance\n * @param verbose - Whether verbose mode is enabled\n * @returns Logger config for the collector\n */\nexport function createCollectorLoggerConfig(\n cliLogger: Logger,\n verbose?: boolean,\n): CoreLogger.Config {\n return {\n level: verbose ? 'DEBUG' : 'ERROR',\n handler: (level, message, context, scope) => {\n const scopePath = scope.length > 0 ? `[${scope.join(':')}] ` : '';\n const hasContext = Object.keys(context).length > 0;\n const contextStr = hasContext ? ` ${JSON.stringify(context)}` : '';\n\n if (level === 0) {\n // ERROR - always show\n cliLogger.error(`${scopePath}${message}${contextStr}`);\n } else if (verbose) {\n // INFO or DEBUG - only show if verbose\n cliLogger.debug(`${scopePath}${message}${contextStr}`);\n }\n },\n };\n}\n","/**\n * Timer utilities for measuring execution time\n */\n\nexport interface Timer {\n start: () => void;\n end: () => number;\n getElapsed: () => number;\n format: () => string;\n}\n\n/**\n * Create a high-precision timer\n */\nexport function createTimer(): Timer {\n let startTime = 0;\n let endTime = 0;\n\n return {\n start() {\n startTime = Date.now();\n endTime = 0;\n },\n\n end() {\n endTime = Date.now();\n return endTime - startTime;\n },\n\n getElapsed() {\n const currentTime = endTime || Date.now();\n return currentTime - startTime;\n },\n\n format() {\n const elapsed = this.getElapsed();\n return (elapsed / 1000).toFixed(2) + 's';\n },\n };\n}\n","/**\n * Output formatting utilities for CLI commands\n */\n\nexport interface JsonOutput<T = Record<string, unknown>> {\n success: boolean;\n data?: T;\n error?: string;\n duration?: number;\n}\n\n/**\n * Create standardized JSON output for CLI commands\n */\nexport function createJsonOutput<T = Record<string, unknown>>(\n success: boolean,\n data?: T,\n error?: string,\n duration?: number,\n): JsonOutput<T> {\n return {\n success,\n ...(data && { data }),\n ...(error && { error }),\n ...(duration && { duration }),\n };\n}\n\n/**\n * Create success JSON output\n */\nexport function createSuccessOutput<T = Record<string, unknown>>(\n data?: T,\n duration?: number,\n): JsonOutput<T> {\n return createJsonOutput(true, data, undefined, duration);\n}\n\n/**\n * Create error JSON output\n */\nexport function createErrorOutput(\n error: string,\n duration?: number,\n): JsonOutput<never> {\n return createJsonOutput<never>(false, undefined, error, duration);\n}\n\n/**\n * Format bytes to KB with 2 decimal places\n */\nexport function formatBytes(bytes: number): string {\n return (bytes / 1024).toFixed(2);\n}\n\n/**\n * Format file size with appropriate unit\n */\nexport function formatFileSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(2)} ${units[unitIndex]}`;\n}\n","/**\n * Unified Temporary Directory Utility\n *\n * Single source of truth for all temp paths in the CLI.\n * All temp files go to ./.tmp/ relative to current working directory.\n */\n\nimport path from 'path';\n\nconst DEFAULT_TMP_ROOT = '.tmp';\n\n/**\n * Get a path within the temp directory.\n *\n * @param tmpDir - Custom temp directory (optional, for --tmp-dir flag)\n * @param segments - Path segments to join\n * @returns Absolute path within temp directory\n *\n * @example\n * ```typescript\n * getTmpPath() // → \"/cwd/.tmp\"\n * getTmpPath(undefined, 'entry.js') // → \"/cwd/.tmp/entry.js\"\n * getTmpPath(undefined, 'cache', 'builds') // → \"/cwd/.tmp/cache/builds\"\n * getTmpPath('/custom', 'cache') // → \"/custom/cache\"\n * ```\n */\nexport function getTmpPath(tmpDir?: string, ...segments: string[]): string {\n const root = tmpDir || DEFAULT_TMP_ROOT;\n // Always return absolute path (esbuild requirement)\n const absoluteRoot = path.isAbsolute(root) ? root : path.resolve(root);\n return path.join(absoluteRoot, ...segments);\n}\n\n/**\n * Get the default temp root directory.\n */\nexport function getDefaultTmpRoot(): string {\n return DEFAULT_TMP_ROOT;\n}\n","/**\n * Asset Resolver\n *\n * Unified path resolution for package assets (examples) and user assets.\n * Assets are always siblings to the CLI entry point (in dist/ for production).\n */\n\nimport { fileURLToPath } from 'url';\nimport { existsSync } from 'fs';\nimport path from 'path';\nimport { isUrl } from '../config/utils.js';\n\n/**\n * Cached asset directory to avoid repeated filesystem checks\n */\nlet cachedAssetDir: string | undefined;\n\n/**\n * Get the directory containing CLI assets (examples).\n *\n * In production: assets are in dist/ alongside the bundled CLI\n * In development: assets are at package root\n *\n * @returns Absolute path to assets directory\n */\nexport function getAssetDir(): string {\n if (cachedAssetDir) return cachedAssetDir;\n\n const currentFile = fileURLToPath(import.meta.url);\n let dir = path.dirname(currentFile);\n\n // Walk up until we find a directory with examples/ sibling\n while (dir !== path.dirname(dir)) {\n if (existsSync(path.join(dir, 'examples'))) {\n cachedAssetDir = dir;\n return dir;\n }\n dir = path.dirname(dir);\n }\n\n // Fallback to current file's directory (shouldn't happen if build is correct)\n cachedAssetDir = path.dirname(currentFile);\n return cachedAssetDir;\n}\n\n/**\n * Asset type for resolution strategy\n */\nexport type AssetType = 'config' | 'bundle';\n\n/**\n * Resolve asset path using unified strategy\n *\n * Resolution rules:\n * 1. Bare names (no / or \\) → Package asset (examples)\n * 2. Relative paths (./ or ../) → User asset relative to base directory\n * 3. Absolute paths → Use as-is\n *\n * @param assetPath - Path to resolve\n * @param assetType - Type of asset (determines package subdirectory)\n * @param baseDir - Base directory for relative paths (defaults to cwd)\n * @returns Absolute path to asset\n */\nexport function resolveAsset(\n assetPath: string,\n assetType: AssetType,\n baseDir?: string,\n): string {\n // URL → pass through unchanged\n if (isUrl(assetPath)) {\n return assetPath;\n }\n\n // Bare name → package asset (examples directory)\n if (!assetPath.includes('/') && !assetPath.includes('\\\\')) {\n const assetDir = getAssetDir();\n return path.join(assetDir, 'examples', assetPath);\n }\n\n // Absolute path → use as-is\n if (path.isAbsolute(assetPath)) {\n return assetPath;\n }\n\n // Relative path → resolve from base directory\n return path.resolve(baseDir || process.cwd(), assetPath);\n}\n","/**\n * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { getErrorMessage } from '../core/index.js';\nimport { getTmpPath } from '../core/tmp.js';\n\n/**\n * Check if a string is a valid URL\n *\n * @param str - String to check\n * @returns True if string is a valid HTTP/HTTPS URL\n */\nexport function isUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Download a file from a URL to a temporary location\n *\n * @param url - HTTP/HTTPS URL to download\n * @returns Path to downloaded temporary file\n * @throws Error if download fails or response is not OK\n *\n * @example\n * ```typescript\n * const tempPath = await downloadFromUrl('https://example.com/config.json')\n * // Returns: \"/tmp/walkeros-download-1647261462000-abc123.json\"\n * ```\n */\nexport async function downloadFromUrl(url: string): Promise<string> {\n if (!isUrl(url)) {\n throw new Error(`Invalid URL: ${url}`);\n }\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to download ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n // Write to .tmp/downloads/ directory\n const downloadsDir = getTmpPath(undefined, 'downloads');\n await fs.ensureDir(downloadsDir);\n\n // Use a consistent filename - always re-downloaded fresh anyway\n const tempPath = path.join(downloadsDir, 'flow.json');\n await fs.writeFile(tempPath, content, 'utf-8');\n\n return tempPath;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to download from URL: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Substitute environment variables in a string.\n *\n * @param value - String with ${VAR} placeholders\n * @returns String with environment variables substituted\n * @throws Error if environment variable is not found\n *\n * @example\n * ```typescript\n * substituteEnvVariables('${HOME}/config') // \"/Users/name/config\"\n * ```\n */\nexport function substituteEnvVariables(value: string): string {\n return value.replace(/\\${([^}]+)}/g, (_, envVar) => {\n const envValue = process.env[envVar];\n if (!envValue) {\n throw new Error(`Environment variable ${envVar} not found`);\n }\n return envValue;\n });\n}\n\n/**\n * Load and parse JSON configuration file from local path or URL.\n *\n * @param configPath - Path to JSON file or HTTP/HTTPS URL\n * @returns Parsed configuration object and cleanup function\n * @throws Error if file not found, download fails, or invalid JSON\n *\n * @example\n * ```typescript\n * // Local file\n * const config = await loadJsonConfig('./config.json')\n *\n * // Remote URL\n * const config = await loadJsonConfig('https://example.com/config.json')\n * ```\n */\nexport async function loadJsonConfig<T>(configPath: string): Promise<T> {\n let absolutePath: string;\n let isTemporary = false;\n\n // Check if input is a URL\n if (isUrl(configPath)) {\n // Download from URL to temp location\n absolutePath = await downloadFromUrl(configPath);\n isTemporary = true;\n } else {\n // Local file path\n absolutePath = path.resolve(configPath);\n\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(`Configuration file not found: ${absolutePath}`);\n }\n }\n\n try {\n const rawConfig = await fs.readJson(absolutePath);\n return rawConfig as T;\n } catch (error) {\n throw new Error(\n `Invalid JSON in config file: ${configPath}. ${error instanceof Error ? error.message : error}`,\n );\n } finally {\n // Clean up temporary downloaded file\n if (isTemporary) {\n try {\n await fs.remove(absolutePath);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n\n/**\n * Load JSON from inline string, file path, or URL.\n *\n * Supports three input formats:\n * 1. Inline JSON string - parsed directly\n * 2. Local file path - read and parsed\n * 3. HTTP/HTTPS URL - downloaded and parsed\n *\n * Detection priority:\n * 1. URL (http://, https://) → download and parse\n * 2. Existing file path → read and parse\n * 3. Valid JSON string → parse directly\n * 4. Simple string → treat as {name: string} for backward compatibility\n *\n * @param source - JSON string, file path, or URL\n * @param options - Optional configuration\n * @param options.name - Parameter name for error messages (e.g., \"event\", \"config\")\n * @param options.required - Throw error if source is empty (default: false)\n * @param options.fallback - Default value if source is empty\n * @returns Parsed JSON object\n * @throws Error if source is required but empty, or if loading/parsing fails\n *\n * @example\n * ```typescript\n * // Inline JSON\n * await loadJsonFromSource('{\"name\":\"order complete\",\"data\":{}}')\n *\n * // File path\n * await loadJsonFromSource('./examples/event.json')\n *\n * // URL\n * await loadJsonFromSource('https://example.com/event.json')\n *\n * // With options\n * await loadJsonFromSource(input, {\n * name: 'event',\n * required: true,\n * fallback: { name: 'default' }\n * })\n * ```\n */\nexport async function loadJsonFromSource<T = unknown>(\n source: string | undefined,\n options?: {\n name?: string;\n required?: boolean;\n fallback?: T;\n },\n): Promise<T> {\n const paramName = options?.name || 'input';\n\n // Handle empty/undefined input\n if (!source || source.trim() === '') {\n if (options?.required) {\n throw new Error(`${paramName} is required`);\n }\n if (options?.fallback !== undefined) {\n return options.fallback;\n }\n return {} as T;\n }\n\n const trimmedSource = source.trim();\n\n // 1. Check if URL\n if (isUrl(trimmedSource)) {\n try {\n const tempPath = await downloadFromUrl(trimmedSource);\n try {\n const data = await fs.readJson(tempPath);\n return data as T;\n } finally {\n // Clean up temp file\n try {\n await fs.remove(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n }\n } catch (error) {\n throw new Error(\n `Failed to load ${paramName} from URL ${trimmedSource}: ${getErrorMessage(error)}`,\n );\n }\n }\n\n // 2. Check if file path exists\n const resolvedPath = path.resolve(trimmedSource);\n if (await fs.pathExists(resolvedPath)) {\n try {\n const data = await fs.readJson(resolvedPath);\n return data as T;\n } catch (error) {\n throw new Error(\n `Failed to parse ${paramName} from file ${trimmedSource}: ${getErrorMessage(error)}`,\n );\n }\n }\n\n // 3. Try to parse as inline JSON\n try {\n const parsed = JSON.parse(trimmedSource);\n return parsed as T;\n } catch (jsonError) {\n // 4. Fallback: treat as event name string for backward compatibility\n // This allows simple strings like \"page view\" to work\n if (!trimmedSource.startsWith('{') && !trimmedSource.startsWith('[')) {\n return { name: trimmedSource } as T;\n }\n\n // If it looks like JSON but failed to parse, throw helpful error\n throw new Error(\n `Failed to parse ${paramName}. Input appears to be JSON but contains errors: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`,\n );\n }\n}\n","/**\n * Utility functions for the CLI package\n */\n\n/**\n * Extract error message from unknown error type\n * @param error - Unknown error object\n * @returns Error message as string\n */\nexport function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Logger } from './logger.js';\n\nexport interface LocalPackageInfo {\n name: string;\n absolutePath: string;\n distPath: string;\n hasDistFolder: boolean;\n}\n\n/**\n * Resolve and validate a local package path\n */\nexport async function resolveLocalPackage(\n packageName: string,\n localPath: string,\n configDir: string,\n logger: Logger,\n): Promise<LocalPackageInfo> {\n // Resolve relative to config file directory\n const absolutePath = path.isAbsolute(localPath)\n ? localPath\n : path.resolve(configDir, localPath);\n\n // Validate path exists\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(\n `Local package path not found: ${localPath} (resolved to ${absolutePath})`,\n );\n }\n\n // Validate package.json exists\n const pkgJsonPath = path.join(absolutePath, 'package.json');\n if (!(await fs.pathExists(pkgJsonPath))) {\n throw new Error(\n `No package.json found at ${absolutePath}. Is this a valid package directory?`,\n );\n }\n\n // Check for dist folder\n const distPath = path.join(absolutePath, 'dist');\n const hasDistFolder = await fs.pathExists(distPath);\n\n if (!hasDistFolder) {\n logger.warn(\n `⚠️ ${packageName}: No dist/ folder found. Using package root.`,\n );\n }\n\n return {\n name: packageName,\n absolutePath,\n distPath: hasDistFolder ? distPath : absolutePath,\n hasDistFolder,\n };\n}\n\n/**\n * Copy local package to target node_modules directory\n *\n * Copies package.json and dist/ folder to preserve the package structure\n * expected by module resolution (package.json exports reference ./dist/...)\n */\nexport async function copyLocalPackage(\n localPkg: LocalPackageInfo,\n targetDir: string,\n logger: Logger,\n): Promise<string> {\n const packageDir = path.join(targetDir, 'node_modules', localPkg.name);\n\n await fs.ensureDir(path.dirname(packageDir));\n\n // Always copy package.json for module resolution\n await fs.copy(\n path.join(localPkg.absolutePath, 'package.json'),\n path.join(packageDir, 'package.json'),\n );\n\n // Copy dist folder AS dist folder (preserving structure for exports like ./dist/index.mjs)\n if (localPkg.hasDistFolder) {\n await fs.copy(localPkg.distPath, path.join(packageDir, 'dist'));\n } else {\n // No dist folder - copy package root contents (excluding node_modules, etc.)\n const entries = await fs.readdir(localPkg.absolutePath);\n for (const entry of entries) {\n if (!['node_modules', '.turbo', '.git'].includes(entry)) {\n await fs.copy(\n path.join(localPkg.absolutePath, entry),\n path.join(packageDir, entry),\n );\n }\n }\n }\n\n logger.info(`📦 Using local: ${localPkg.name} from ${localPkg.absolutePath}`);\n\n return packageDir;\n}\n","/**\n * Input Detector\n *\n * Detects whether CLI input is a config JSON or pre-built bundle.\n * Supports both local files and URLs.\n */\n\nimport fs from 'fs-extra';\nimport { isUrl } from '../config/utils.js';\n\nexport type InputType = 'config' | 'bundle';\nexport type Platform = 'web' | 'server';\n\nexport interface DetectedInput {\n type: InputType;\n content: string;\n platform?: Platform; // Only set for bundles\n}\n\n/**\n * Detect if input is config JSON or pre-built bundle.\n *\n * Detection: Try JSON.parse, if fails = bundle\n * Platform: .mjs = server, .js = web\n *\n * @param inputPath - Path to file or URL\n * @param platformOverride - Optional platform override\n * @returns Detected input type with content\n */\nexport async function detectInput(\n inputPath: string,\n platformOverride?: Platform,\n): Promise<DetectedInput> {\n // Load content (URL or local file)\n const content = await loadContent(inputPath);\n\n // Try parsing as JSON\n try {\n JSON.parse(content);\n return { type: 'config', content };\n } catch {\n // Not JSON, treat as bundle\n const platform = platformOverride ?? detectPlatformFromPath(inputPath);\n return { type: 'bundle', content, platform };\n }\n}\n\n/**\n * Detect platform from file extension.\n *\n * @param inputPath - Path to file or URL\n * @returns Platform based on extension (.mjs = server, .js = web)\n */\nexport function detectPlatformFromPath(inputPath: string): Platform {\n // Remove query params for URLs\n const cleanPath = inputPath.split('?')[0];\n return cleanPath.endsWith('.mjs') ? 'server' : 'web';\n}\n\n/**\n * Load content from URL or local file.\n *\n * @param inputPath - Path to file or URL\n * @returns File content as string\n */\nasync function loadContent(inputPath: string): Promise<string> {\n if (isUrl(inputPath)) {\n const response = await fetch(inputPath);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${inputPath}: ${response.status}`);\n }\n return response.text();\n }\n return fs.readFile(inputPath, 'utf8');\n}\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n * Uses Zod schemas from @walkeros/core for Flow.Setup validation.\n */\n\nimport type { Flow } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\n\nconst { safeParseSetup } = schemas;\n\n/**\n * Type guard: Check if value is a plain object.\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Detect platform from flow config.\n *\n * Platform is determined by the presence of `web` or `server` key.\n */\nexport function detectPlatform(\n flowConfig: Record<string, unknown>,\n): 'web' | 'server' | undefined {\n if ('web' in flowConfig && flowConfig.web !== undefined) {\n return 'web';\n }\n if ('server' in flowConfig && flowConfig.server !== undefined) {\n return 'server';\n }\n return undefined;\n}\n\n/**\n * Type guard: Check if config is a valid Flow.Setup structure.\n *\n * @remarks\n * Uses Zod validation from @walkeros/core.\n * Returns false instead of throwing on invalid input.\n *\n * @example\n * ```typescript\n * if (isFlowSetup(config)) {\n * const flowConfig = getFlowConfig(config, 'production');\n * }\n * ```\n */\nexport function isFlowSetup(data: unknown): data is Flow.Setup {\n const result = safeParseSetup(data);\n return result.success;\n}\n\n/**\n * Validate Flow.Setup and throw descriptive error if invalid.\n *\n * @remarks\n * Uses Zod validation from @walkeros/core.\n * Provides detailed error messages from Zod.\n *\n * @param data - Raw configuration data\n * @returns Validated Flow.Setup\n * @throws Error with descriptive message if validation fails\n */\nexport function validateFlowSetup(data: unknown): Flow.Setup {\n const result = safeParseSetup(data);\n\n if (!result.success) {\n // Format Zod errors for CLI display\n const errors = result.error.issues\n .map((issue) => {\n const path =\n issue.path.length > 0 ? issue.path.map(String).join('.') : 'root';\n return ` - ${path}: ${issue.message}`;\n })\n .join('\\n');\n\n throw new Error(`Invalid configuration:\\n${errors}`);\n }\n\n // Cast to Flow.Setup since Zod's inferred type is compatible but not identical\n return result.data as Flow.Setup;\n}\n\n/**\n * Get available flow names from a Flow.Setup.\n *\n * @param setup - Flow.Setup configuration\n * @returns Array of flow names\n */\nexport function getAvailableFlows(setup: Flow.Setup): string[] {\n return Object.keys(setup.flows);\n}\n","/**\n * Static Build Defaults\n *\n * Platform-specific build defaults for CLI bundling.\n * Build options are CLI concerns, separate from Flow configuration.\n */\n\nimport type { BuildOptions } from '../types/bundle.js';\n\n/**\n * Build defaults for web platform (browser bundles).\n *\n * @remarks\n * These settings produce browser-compatible IIFE bundles.\n */\nexport const WEB_BUILD_DEFAULTS: Omit<BuildOptions, 'output' | 'packages'> = {\n format: 'iife',\n platform: 'browser',\n target: 'es2020',\n minify: true,\n sourcemap: false,\n cache: true,\n windowCollector: 'collector',\n windowElb: 'elb',\n};\n\n/**\n * Build defaults for server platform (Node.js bundles).\n *\n * @remarks\n * These settings produce Node.js-compatible ESM bundles.\n */\nexport const SERVER_BUILD_DEFAULTS: Omit<BuildOptions, 'output' | 'packages'> =\n {\n format: 'esm',\n platform: 'node',\n target: 'node20',\n minify: true,\n sourcemap: false,\n cache: true,\n };\n\n/**\n * Default output paths by platform.\n */\nexport const DEFAULT_OUTPUT_PATHS = {\n web: './dist/walker.js',\n server: './dist/bundle.mjs',\n} as const;\n\n/**\n * Get build defaults for a platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @returns Platform-specific build defaults\n *\n * @example\n * ```typescript\n * const defaults = getBuildDefaults('web');\n * // { format: 'iife', platform: 'browser', ... }\n * ```\n */\nexport function getBuildDefaults(\n platform: 'web' | 'server',\n): Omit<BuildOptions, 'output' | 'packages'> {\n return platform === 'web' ? WEB_BUILD_DEFAULTS : SERVER_BUILD_DEFAULTS;\n}\n\n/**\n * Get default output path for a platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @returns Default output file path\n */\nexport function getDefaultOutput(platform: 'web' | 'server'): string {\n return DEFAULT_OUTPUT_PATHS[platform];\n}\n","/**\n * Configuration Loader\n *\n * Loads and parses Flow.Setup configurations using core getFlowConfig().\n * Build options are determined by static platform defaults.\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { getFlowConfig, getPlatform, type Flow } from '@walkeros/core';\nimport type { BuildOptions } from '../types/bundle.js';\nimport {\n validateFlowSetup,\n isFlowSetup,\n getAvailableFlows as getFlowNames,\n} from './validators.js';\nimport { getBuildDefaults, getDefaultOutput } from './build-defaults.js';\nimport { isUrl, loadJsonConfig } from './utils.js';\n\n/** Default folder for includes if it exists */\nconst DEFAULT_INCLUDE_FOLDER = './shared';\n\n/**\n * Result of configuration loading.\n */\nexport interface LoadConfigResult {\n /** Runtime event processing configuration */\n flowConfig: Flow.Config;\n /** Build-time configuration */\n buildOptions: BuildOptions;\n /** Name of the selected flow */\n flowName: string;\n /** Whether multiple flows are available */\n isMultiFlow: boolean;\n /** All available flow names */\n availableFlows: string[];\n}\n\n/**\n * Options for loading configuration.\n */\nexport interface LoadConfigOptions {\n /** Path to config file */\n configPath: string;\n /** Flow name to load (required for multi-flow, optional for single-flow) */\n flowName?: string;\n /** CLI build overrides (future: --output, --minify, etc.) */\n buildOverrides?: Partial<BuildOptions>;\n /** Logger for warnings */\n logger?: {\n warn: (message: string) => void;\n info: (message: string) => void;\n };\n}\n\n/**\n * Load and parse bundle configuration.\n *\n * @remarks\n * Uses Flow.Setup from @walkeros/core as the only config format.\n * - Validates config structure\n * - Uses core getFlowConfig() for variable/definition resolution\n * - Determines platform from resolved config\n * - Applies static build defaults based on platform\n *\n * @param rawConfig - Raw configuration object from JSON file\n * @param options - Loading options\n * @returns Parsed configuration with flow and build separated\n *\n * @example\n * ```typescript\n * const config = loadBundleConfig(rawConfig, {\n * configPath: './walkeros.config.json',\n * flowName: 'production',\n * });\n * ```\n */\nexport function loadBundleConfig(\n rawConfig: unknown,\n options: LoadConfigOptions,\n): LoadConfigResult {\n // Validate as Flow.Setup\n const setup = validateFlowSetup(rawConfig);\n const availableFlows = getFlowNames(setup);\n\n // Determine which flow to use\n const flowName = resolveFlow(setup, options.flowName, availableFlows);\n\n // Use core getFlowConfig() for resolution (variables, $refs, cascading)\n const flowConfig = getFlowConfig(setup, flowName);\n\n // Detect platform from resolved config\n const platform = getPlatform(flowConfig);\n if (!platform) {\n throw new Error(\n `Invalid configuration: flow \"${flowName}\" must have a \"web\" or \"server\" key.`,\n );\n }\n\n // Get static build defaults based on platform\n const buildDefaults = getBuildDefaults(platform);\n\n // Extract packages from flowConfig (if present)\n const packages = flowConfig.packages || {};\n\n // Output path: use --output if provided, otherwise default\n // Always relative to cwd, no dynamic resolution\n const output = options.buildOverrides?.output || getDefaultOutput(platform);\n\n // Get config directory for resolving includes and local packages\n // For URLs, use cwd since there's no local config directory\n const configDir = isUrl(options.configPath)\n ? process.cwd()\n : path.dirname(options.configPath);\n\n // Get includes from config or use default if ./shared exists\n let includes = setup.include;\n if (!includes) {\n const defaultIncludePath = path.resolve(configDir, DEFAULT_INCLUDE_FOLDER);\n if (fs.pathExistsSync(defaultIncludePath)) {\n includes = [DEFAULT_INCLUDE_FOLDER];\n }\n }\n\n // Merge build options: defaults + CLI overrides\n const buildOptions: BuildOptions = {\n ...buildDefaults,\n packages,\n output,\n include: includes,\n configDir,\n ...options.buildOverrides,\n };\n\n // Log flow selection\n const isMultiFlow = availableFlows.length > 1;\n if (isMultiFlow && options.logger) {\n options.logger.info(\n `📦 Using flow: ${flowName} (${availableFlows.length} total)`,\n );\n }\n\n return {\n flowConfig,\n buildOptions,\n flowName,\n isMultiFlow,\n availableFlows,\n };\n}\n\n/**\n * Resolve which flow to use.\n *\n * @param setup - Flow.Setup configuration\n * @param requestedFlow - Flow name from CLI (optional)\n * @param available - Available flow names\n * @returns Flow name to use\n * @throws Error if flow selection is invalid\n */\nfunction resolveFlow(\n setup: Flow.Setup,\n requestedFlow: string | undefined,\n available: string[],\n): string {\n // If only one flow, use it automatically\n if (available.length === 1) {\n return available[0];\n }\n\n // Multiple flows require explicit selection\n if (!requestedFlow) {\n throw new Error(\n `Multiple flows found. Please specify a flow using --flow flag.\\n` +\n `Available flows: ${available.join(', ')}`,\n );\n }\n\n // Validate the requested flow exists\n if (!available.includes(requestedFlow)) {\n throw new Error(\n `Flow \"${requestedFlow}\" not found in configuration.\\n` +\n `Available flows: ${available.join(', ')}`,\n );\n }\n\n return requestedFlow;\n}\n\n/**\n * Load all flows from a configuration.\n *\n * @remarks\n * Used by the --all flag to build all flows.\n *\n * @param rawConfig - Raw configuration object\n * @param options - Loading options (without flowName)\n * @returns Array of loaded configurations for all flows\n */\nexport function loadAllFlows(\n rawConfig: unknown,\n options: Omit<LoadConfigOptions, 'flowName'>,\n): LoadConfigResult[] {\n // Validate as Flow.Setup\n const setup = validateFlowSetup(rawConfig);\n const flows = getFlowNames(setup);\n\n if (options.logger) {\n options.logger.info(\n `📦 Loading all ${flows.length} flows: ${flows.join(', ')}`,\n );\n }\n\n // Load each flow\n return flows.map((name) =>\n loadBundleConfig(rawConfig, {\n ...options,\n flowName: name,\n }),\n );\n}\n\n/**\n * Get list of available flows from configuration.\n *\n * @param rawConfig - Raw configuration object\n * @returns Array of flow names\n */\nexport function getAvailableFlows(rawConfig: unknown): string[] {\n if (isFlowSetup(rawConfig)) {\n return getFlowNames(rawConfig);\n }\n return [];\n}\n\n/**\n * Load flow configuration from file or URL.\n *\n * Single entry point for all commands (bundle, simulate, push).\n * Handles URL vs local path detection automatically.\n *\n * @param configPath - Path to config file or URL\n * @param options - Loading options (flowName, logger, buildOverrides)\n * @returns Parsed configuration with flow and build options\n *\n * @example\n * ```typescript\n * const { flowConfig, buildOptions } = await loadFlowConfig('./flow.json');\n * const { flowConfig } = await loadFlowConfig('https://example.com/flow.json');\n * ```\n */\nexport async function loadFlowConfig(\n configPath: string,\n options?: Omit<LoadConfigOptions, 'configPath'>,\n): Promise<LoadConfigResult> {\n const rawConfig = await loadJsonConfig(configPath);\n return loadBundleConfig(rawConfig, { configPath, ...options });\n}\n","import esbuild from 'esbuild';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { packageNameToVariable } from '@walkeros/core';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { downloadPackages } from './package-manager.js';\nimport type { Logger } from '../../core/index.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport {\n isBuildCached,\n getCachedBuild,\n cacheBuild,\n} from '../../core/build-cache.js';\n\nexport interface BundleStats {\n totalSize: number;\n packages: { name: string; size: number }[];\n buildTime: number;\n treeshakingEffective: boolean;\n}\n\n/**\n * Copy included folders to output directory.\n * Used to make credential files and other assets available alongside the bundle.\n */\nasync function copyIncludes(\n includes: string[],\n sourceDir: string,\n outputDir: string,\n logger: Logger,\n): Promise<void> {\n for (const include of includes) {\n const sourcePath = path.resolve(sourceDir, include);\n const folderName = path.basename(include);\n const destPath = path.join(outputDir, folderName);\n\n if (await fs.pathExists(sourcePath)) {\n await fs.copy(sourcePath, destPath);\n logger.debug(`Copied ${include} to output`);\n // TODO: Add logging for copied folders\n } else {\n logger.debug(`Include folder not found: ${include}`);\n // TODO: Add logging for skipped folders (not found)\n }\n }\n}\n\n/**\n * Generate cache key content from flow config and build options.\n * Excludes non-deterministic fields (tempDir, output) from cache key.\n */\nfunction generateCacheKeyContent(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n): string {\n const configForCache = {\n flow: flowConfig,\n build: {\n ...buildOptions,\n // Exclude non-deterministic fields from cache key\n tempDir: undefined,\n output: undefined,\n },\n };\n return JSON.stringify(configForCache);\n}\n\nexport async function bundleCore(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n logger: Logger,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n // Use provided temp dir or default .tmp/\n const TEMP_DIR = buildOptions.tempDir || getTmpPath();\n\n // Check build cache if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowConfig, buildOptions);\n\n const cached = await isBuildCached(configContent);\n if (cached) {\n const cachedBuild = await getCachedBuild(configContent);\n if (cachedBuild) {\n logger.debug('Using cached build');\n\n // Write cached build to output\n const outputPath = path.resolve(buildOptions.output);\n await fs.ensureDir(path.dirname(outputPath));\n await fs.writeFile(outputPath, cachedBuild);\n\n const stats = await fs.stat(outputPath);\n const sizeKB = (stats.size / 1024).toFixed(1);\n logger.log(`Output: ${outputPath} (${sizeKB} KB, cached)`);\n\n // Return stats if requested\n if (showStats) {\n const stats = await fs.stat(outputPath);\n // Generate basic package stats from buildOptions\n const packageStats = Object.entries(buildOptions.packages).map(\n ([name, pkg]) => ({\n name: `${name}@${pkg.version || 'latest'}`,\n size: 0, // Size estimation not available for cached builds\n }),\n );\n return {\n totalSize: stats.size,\n packages: packageStats,\n buildTime: Date.now() - bundleStartTime,\n treeshakingEffective: true,\n };\n }\n return;\n }\n }\n }\n\n try {\n // Step 1: Ensure temporary directory exists\n await fs.ensureDir(TEMP_DIR);\n\n // Step 2: Download packages\n logger.debug('Downloading packages');\n // Convert packages object to array format expected by downloadPackages\n const packagesArray = Object.entries(buildOptions.packages).map(\n ([name, packageConfig]) => ({\n name,\n version: packageConfig.version || 'latest',\n path: packageConfig.path, // Pass local path if defined\n }),\n );\n // downloadPackages adds 'node_modules' subdirectory automatically\n const packagePaths = await downloadPackages(\n packagesArray,\n TEMP_DIR,\n logger,\n buildOptions.cache,\n buildOptions.configDir, // For resolving relative local paths\n );\n\n // Fix @walkeros packages to have proper ESM exports\n // This ensures Node resolves to .mjs files instead of .js (CJS)\n for (const [pkgName, pkgPath] of packagePaths.entries()) {\n if (pkgName.startsWith('@walkeros/')) {\n const pkgJsonPath = path.join(pkgPath, 'package.json');\n const pkgJson = await fs.readJSON(pkgJsonPath);\n\n // Add exports field to force ESM resolution\n if (!pkgJson.exports && pkgJson.module) {\n pkgJson.exports = {\n '.': {\n import: pkgJson.module,\n require: pkgJson.main,\n },\n };\n await fs.writeJSON(pkgJsonPath, pkgJson, { spaces: 2 });\n }\n }\n }\n\n // Step 3: Create package.json to enable ESM in temp directory\n // This ensures Node treats all .js files as ESM and resolves @walkeros packages correctly\n const packageJsonPath = path.join(TEMP_DIR, 'package.json');\n await fs.writeFile(\n packageJsonPath,\n JSON.stringify({ type: 'module' }, null, 2),\n );\n\n // Step 4: Create entry point\n logger.debug('Creating entry point');\n const entryContent = await createEntryPoint(\n flowConfig,\n buildOptions,\n packagePaths,\n );\n const entryPath = path.join(TEMP_DIR, 'entry.js');\n await fs.writeFile(entryPath, entryContent);\n\n // Step 4: Bundle with esbuild\n logger.debug(\n `Running esbuild (target: ${buildOptions.target || 'es2018'}, format: ${buildOptions.format})`,\n );\n const outputPath = path.resolve(buildOptions.output);\n\n // Ensure output directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n const esbuildOptions = createEsbuildOptions(\n buildOptions,\n entryPath,\n outputPath,\n TEMP_DIR,\n packagePaths,\n logger,\n );\n\n try {\n await esbuild.build(esbuildOptions);\n } catch (buildError) {\n // Enhanced error handling for build failures\n throw createBuildError(\n buildError as EsbuildError,\n buildOptions.code || '',\n );\n }\n\n // Get file size and calculate build time\n const outputStats = await fs.stat(outputPath);\n const sizeKB = (outputStats.size / 1024).toFixed(1);\n const buildTime = ((Date.now() - bundleStartTime) / 1000).toFixed(1);\n logger.log(`Output: ${outputPath} (${sizeKB} KB, ${buildTime}s)`);\n\n // Step 5: Cache the build result if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowConfig, buildOptions);\n const buildOutput = await fs.readFile(outputPath, 'utf-8');\n await cacheBuild(configContent, buildOutput);\n logger.debug('Build cached for future use');\n }\n\n // Step 6: Collect stats if requested\n let stats: BundleStats | undefined;\n if (showStats) {\n stats = await collectBundleStats(\n outputPath,\n buildOptions.packages,\n bundleStartTime,\n entryContent,\n );\n }\n\n // Step 7: Copy included folders to output directory\n if (buildOptions.include && buildOptions.include.length > 0) {\n const outputDir = path.dirname(outputPath);\n await copyIncludes(\n buildOptions.include,\n buildOptions.configDir || process.cwd(),\n outputDir,\n logger,\n );\n }\n\n // No auto-cleanup - user runs `walkeros clean` explicitly\n\n return stats;\n } catch (error) {\n throw error;\n }\n}\n\nasync function collectBundleStats(\n outputPath: string,\n packages: BuildOptions['packages'],\n startTime: number,\n entryContent: string,\n): Promise<BundleStats> {\n const stats = await fs.stat(outputPath);\n const totalSize = stats.size;\n const buildTime = Date.now() - startTime;\n\n // Estimate package sizes by analyzing imports in entry content\n const packageStats = Object.entries(packages).map(([name, pkg]) => {\n const importPattern = new RegExp(`from\\\\s+['\"]${name}['\"]`, 'g');\n const namedImportPattern = new RegExp(\n `import\\\\s+\\\\{[^}]*\\\\}\\\\s+from\\\\s+['\"]${name}['\"]`,\n 'g',\n );\n const hasImports =\n importPattern.test(entryContent) || namedImportPattern.test(entryContent);\n\n // Rough estimation: if package is imported, assign proportional size\n const packagesCount = Object.keys(packages).length;\n const estimatedSize = hasImports\n ? Math.floor(totalSize / packagesCount)\n : 0;\n\n return {\n name: `${name}@${pkg.version || 'latest'}`,\n size: estimatedSize,\n };\n });\n\n // Tree-shaking is effective if we use named imports (not wildcard imports)\n const hasWildcardImports = /import\\s+\\*\\s+as\\s+\\w+\\s+from/.test(entryContent);\n const treeshakingEffective = !hasWildcardImports;\n\n return {\n totalSize,\n packages: packageStats,\n buildTime,\n treeshakingEffective,\n };\n}\n\nfunction createEsbuildOptions(\n buildOptions: BuildOptions,\n entryPath: string,\n outputPath: string,\n tempDir: string,\n packagePaths: Map<string, string>,\n logger: Logger,\n): esbuild.BuildOptions {\n // Don't use aliases - they cause esbuild to bundle even external packages\n // Instead, use absWorkingDir to point to temp directory where node_modules is\n const alias: Record<string, string> = {};\n\n const baseOptions: esbuild.BuildOptions = {\n entryPoints: [entryPath],\n bundle: true,\n format: buildOptions.format as esbuild.Format,\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n absWorkingDir: tempDir, // Resolve modules from temp directory\n // alias removed - not needed with absWorkingDir\n mainFields: ['module', 'main'], // Prefer ESM over CJS\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\n sourcemap: buildOptions.sourcemap,\n resolveExtensions: ['.mjs', '.js', '.ts', '.json'], // Prefer .mjs\n\n // Enhanced minification options when minify is enabled\n ...(buildOptions.minify && {\n minifyWhitespace: buildOptions.minifyOptions?.whitespace ?? true,\n minifyIdentifiers: buildOptions.minifyOptions?.identifiers ?? true,\n minifySyntax: buildOptions.minifyOptions?.syntax ?? true,\n legalComments: buildOptions.minifyOptions?.legalComments ?? 'none',\n keepNames: buildOptions.minifyOptions?.keepNames ?? false,\n charset: 'utf8',\n }),\n };\n\n // Platform-specific configurations\n if (buildOptions.platform === 'browser') {\n baseOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n // For browser bundles, let users handle Node.js built-ins as needed\n baseOptions.external = buildOptions.external || [];\n } else if (buildOptions.platform === 'node') {\n // For Node.js bundles, mark Node built-ins as external\n const nodeBuiltins = [\n 'crypto',\n 'fs',\n 'path',\n 'os',\n 'util',\n 'stream',\n 'buffer',\n 'events',\n 'http',\n 'https',\n 'url',\n 'querystring',\n 'zlib',\n ];\n // Mark runtime dependencies as external\n // These packages are installed in the Docker container and should not be bundled\n // - express/cors: Runtime dependencies for server sources\n // Note: zod is bundled inline via @walkeros/core (not marked external)\n // Use wildcard patterns to match both ESM and CJS imports\n const npmPackages = ['express', 'express/*', 'cors', 'cors/*'];\n // All downloaded @walkeros packages will be bundled into the output\n // Only Node.js built-ins and runtime server packages (express/cors) are marked external\n baseOptions.external = buildOptions.external\n ? [...nodeBuiltins, ...npmPackages, ...buildOptions.external]\n : [...nodeBuiltins, ...npmPackages];\n\n // Add createRequire shim for ESM bundles with CJS external dependencies\n // This allows require() calls generated by esbuild to work in ESM context\n if (buildOptions.format === 'esm') {\n baseOptions.banner = {\n js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`,\n };\n }\n }\n\n // Set target if specified\n if (buildOptions.target) {\n baseOptions.target = buildOptions.target;\n } else if (buildOptions.platform === 'node') {\n baseOptions.target = 'node18';\n } else {\n baseOptions.target = 'es2018';\n }\n\n return baseOptions;\n}\n\n/**\n * Detects destination packages from flow configuration.\n * Extracts package names from destinations that have explicit 'package' field.\n */\nfunction detectDestinationPackages(flowConfig: Flow.Config): Set<string> {\n const destinationPackages = new Set<string>();\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string'\n ) {\n destinationPackages.add(destConfig.package);\n }\n // If no package field, skip auto-importing examples for this destination\n }\n }\n\n return destinationPackages;\n}\n\n/**\n * Detects source packages from flow configuration.\n * Extracts package names from sources that have explicit 'package' field.\n */\nfunction detectSourcePackages(flowConfig: Flow.Config): Set<string> {\n const sourcePackages = new Set<string>();\n const sources = (\n flowConfig as unknown as { sources?: Record<string, unknown> }\n ).sources;\n\n if (sources) {\n for (const [sourceKey, sourceConfig] of Object.entries(sources)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'package' in sourceConfig &&\n typeof sourceConfig.package === 'string'\n ) {\n sourcePackages.add(sourceConfig.package);\n }\n }\n }\n\n return sourcePackages;\n}\n\n/**\n * Detects explicit code imports from destinations and sources.\n * Returns a map of package names to sets of export names.\n */\nfunction detectExplicitCodeImports(\n flowConfig: Flow.Config,\n): Map<string, Set<string>> {\n const explicitCodeImports = new Map<string, Set<string>>();\n\n // Check destinations\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string' &&\n 'code' in destConfig &&\n typeof destConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n // Auto-generated code starts with '_' (from packageNameToVariable)\n const isAutoGenerated = destConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(destConfig.package)) {\n explicitCodeImports.set(destConfig.package, new Set());\n }\n explicitCodeImports.get(destConfig.package)!.add(destConfig.code);\n }\n }\n }\n }\n\n // Check sources\n const sources = (\n flowConfig as unknown as { sources?: Record<string, unknown> }\n ).sources;\n\n if (sources) {\n for (const [sourceKey, sourceConfig] of Object.entries(sources)) {\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'package' in sourceConfig &&\n typeof sourceConfig.package === 'string' &&\n 'code' in sourceConfig &&\n typeof sourceConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n // Auto-generated code starts with '_' (from packageNameToVariable)\n const isAutoGenerated = sourceConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(sourceConfig.package)) {\n explicitCodeImports.set(sourceConfig.package, new Set());\n }\n explicitCodeImports.get(sourceConfig.package)!.add(sourceConfig.code);\n }\n }\n }\n }\n\n return explicitCodeImports;\n}\n\ninterface ImportGenerationResult {\n importStatements: string[];\n examplesMappings: string[];\n}\n\n/**\n * Generates import statements and examples mappings from build packages.\n * Handles explicit imports, default imports for destinations/sources, and utility imports.\n */\nfunction generateImportStatements(\n packages: BuildOptions['packages'],\n destinationPackages: Set<string>,\n sourcePackages: Set<string>,\n explicitCodeImports: Map<string, Set<string>>,\n): ImportGenerationResult {\n const importStatements: string[] = [];\n const examplesMappings: string[] = [];\n const usedPackages = new Set([...destinationPackages, ...sourcePackages]);\n\n for (const [packageName, packageConfig] of Object.entries(packages)) {\n const isUsedByDestOrSource = usedPackages.has(packageName);\n const hasExplicitCode = explicitCodeImports.has(packageName);\n\n if (packageConfig.imports && packageConfig.imports.length > 0) {\n // Explicit imports (utilities) - existing logic\n // Remove duplicates within the same package\n const uniqueImports = [...new Set(packageConfig.imports)];\n\n // Handle special \"default as X\" syntax\n const defaultImports: string[] = [];\n const namedImports: string[] = [];\n\n for (const imp of uniqueImports) {\n if (imp.startsWith('default as ')) {\n defaultImports.push(imp.replace('default as ', ''));\n } else {\n namedImports.push(imp);\n }\n }\n\n // Generate import statements\n if (defaultImports.length > 0) {\n for (const defaultImport of defaultImports) {\n importStatements.push(\n `import ${defaultImport} from '${packageName}';`,\n );\n }\n }\n\n if (namedImports.length > 0) {\n const importList = namedImports.join(', ');\n importStatements.push(\n `import { ${importList} } from '${packageName}';`,\n );\n }\n\n // Check if this package imports examples and create mappings\n const examplesImport = uniqueImports.find((imp) =>\n imp.includes('examples as '),\n );\n if (examplesImport) {\n // Extract destination name and examples variable name\n // Format: \"examples as gtagExamples\" -> gtagExamples\n const examplesVarName = examplesImport.split(' as ')[1];\n // Get destination name from package (assumes @walkeros/web-destination-xxx format)\n const destinationMatch = packageName.match(\n /@walkeros\\/web-destination-(.+)$/,\n );\n if (destinationMatch) {\n const destinationName = destinationMatch[1];\n examplesMappings.push(\n ` ${destinationName}: typeof ${examplesVarName} !== 'undefined' ? ${examplesVarName} : undefined`,\n );\n }\n }\n } else if (hasExplicitCode) {\n // Package with explicit code specified in destinations/sources\n // → Generate named imports\n const codes = Array.from(explicitCodeImports.get(packageName)!);\n importStatements.push(\n `import { ${codes.join(', ')} } from '${packageName}';`,\n );\n } else if (isUsedByDestOrSource) {\n // Package used by destination/source but no explicit imports or code\n // → Generate default import\n const varName = packageNameToVariable(packageName);\n importStatements.push(`import ${varName} from '${packageName}';`);\n }\n // If package declared but not used by any dest/source, skip import\n\n // Examples are no longer auto-imported - simulator loads them dynamically\n }\n\n return { importStatements, examplesMappings };\n}\n\n/**\n * Creates the entry point code for the bundle.\n * Generates imports, config object, and platform-specific wrapper programmatically.\n */\nexport async function createEntryPoint(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n packagePaths: Map<string, string>,\n): Promise<string> {\n // Detect packages used by destinations and sources\n const destinationPackages = detectDestinationPackages(flowConfig);\n const sourcePackages = detectSourcePackages(flowConfig);\n const explicitCodeImports = detectExplicitCodeImports(flowConfig);\n\n // Generate import statements\n const { importStatements } = generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n explicitCodeImports,\n );\n\n const importsCode = importStatements.join('\\n');\n const hasFlow = destinationPackages.size > 0 || sourcePackages.size > 0;\n\n // If no sources/destinations, just return user code with imports (no flow wrapper)\n if (!hasFlow) {\n const userCode = buildOptions.code || '';\n return importsCode ? `${importsCode}\\n\\n${userCode}` : userCode;\n }\n\n // Build config object programmatically (DRY - single source of truth)\n const configObject = buildConfigObject(flowConfig, explicitCodeImports);\n\n // Generate platform-specific wrapper\n const wrappedCode = generatePlatformWrapper(\n configObject,\n buildOptions.code || '',\n buildOptions as {\n platform: string;\n windowCollector?: string;\n windowElb?: string;\n },\n );\n\n // Assemble final code\n return importsCode ? `${importsCode}\\n\\n${wrappedCode}` : wrappedCode;\n}\n\ninterface EsbuildError {\n errors?: Array<{\n text: string;\n location?: {\n file: string;\n line: number;\n column: number;\n };\n }>;\n message?: string;\n}\n\nfunction createBuildError(buildError: EsbuildError, code: string): Error {\n if (!buildError.errors || buildError.errors.length === 0) {\n return new Error(`Build failed: ${buildError.message || buildError}`);\n }\n\n const firstError = buildError.errors[0];\n const location = firstError.location;\n\n if (location && location.file && location.file.includes('entry.js')) {\n // Error is in our generated entry point (code)\n const line = location.line;\n const column = location.column;\n const codeLines = code.split('\\n');\n const errorLine = codeLines[line - 1] || '';\n\n return new Error(\n `Code syntax error at line ${line}, column ${column}:\\n` +\n ` ${errorLine}\\n` +\n ` ${' '.repeat(column - 1)}^\\n` +\n `${firstError.text}`,\n );\n }\n\n // Error is in package code or other build issue\n return new Error(\n `Build error: ${firstError.text}\\n` +\n (location\n ? ` at ${location.file}:${location.line}:${location.column}`\n : ''),\n );\n}\n\n/**\n * Build config object string from flow configuration.\n * Respects import strategy decisions from detectExplicitCodeImports.\n */\nexport function buildConfigObject(\n flowConfig: Flow.Config,\n explicitCodeImports: Map<string, Set<string>>,\n): string {\n const flowWithProps = flowConfig as unknown as {\n sources?: Record<\n string,\n { package: string; code?: string; config?: unknown; env?: unknown }\n >;\n destinations?: Record<\n string,\n { package: string; code?: string; config?: unknown; env?: unknown }\n >;\n collector?: unknown;\n };\n\n const sources = flowWithProps.sources || {};\n const destinations = flowWithProps.destinations || {};\n\n // Build sources\n const sourcesEntries = Object.entries(sources).map(([key, source]) => {\n const hasExplicitCode =\n source.code && explicitCodeImports.has(source.package);\n const codeVar = hasExplicitCode\n ? source.code\n : packageNameToVariable(source.package);\n\n const configStr = source.config ? processConfigValue(source.config) : '{}';\n const envStr = source.env\n ? `,\\n env: ${processConfigValue(source.env)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}\\n }`;\n });\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations).map(\n ([key, dest]) => {\n const hasExplicitCode =\n dest.code && explicitCodeImports.has(dest.package);\n const codeVar = hasExplicitCode\n ? dest.code\n : packageNameToVariable(dest.package);\n\n const configStr = dest.config ? processConfigValue(dest.config) : '{}';\n const envStr = dest.env\n ? `,\\n env: ${processConfigValue(dest.env)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}\\n }`;\n },\n );\n\n // Build collector\n const collectorStr = flowWithProps.collector\n ? `,\\n ...${processConfigValue(flowWithProps.collector)}`\n : '';\n\n return `{\n sources: {\n${sourcesEntries.join(',\\n')}\n },\n destinations: {\n${destinationsEntries.join(',\\n')}\n }${collectorStr}\n}`;\n}\n\n/**\n * Process config value for serialization.\n * Uses existing serializer utilities.\n */\nfunction processConfigValue(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\n/**\n * Generate platform-specific wrapper code.\n */\nexport function generatePlatformWrapper(\n configObject: string,\n userCode: string,\n buildOptions: {\n platform: string;\n windowCollector?: string;\n windowElb?: string;\n },\n): string {\n if (buildOptions.platform === 'browser') {\n // Web platform: IIFE with browser globals\n const windowAssignments = [];\n if (buildOptions.windowCollector) {\n windowAssignments.push(\n ` if (typeof window !== 'undefined') window['${buildOptions.windowCollector}'] = collector;`,\n );\n }\n if (buildOptions.windowElb) {\n windowAssignments.push(\n ` if (typeof window !== 'undefined') window['${buildOptions.windowElb}'] = elb;`,\n );\n }\n const assignments =\n windowAssignments.length > 0 ? '\\n' + windowAssignments.join('\\n') : '';\n\n return `(async () => {\n const config = ${configObject};\n\n ${userCode}\n\n const { collector, elb } = await startFlow(config);${assignments}\n})();`;\n } else {\n // Server platform: Export default function\n const codeSection = userCode ? `\\n ${userCode}\\n` : '';\n\n return `export default async function(context = {}) {\n const config = ${configObject};${codeSection}\n // Apply context overrides (e.g., logger config from CLI)\n if (context.logger) {\n config.logger = { ...config.logger, ...context.logger };\n }\n\n return await startFlow(config);\n}`;\n }\n}\n","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport {\n Logger,\n resolveLocalPackage,\n copyLocalPackage,\n} from '../../core/index.js';\nimport { getPackageCacheKey } from '../../core/cache-utils.js';\nimport { getTmpPath } from '../../core/tmp.js';\n\n/** Timeout for individual package downloads (60 seconds) */\nconst PACKAGE_DOWNLOAD_TIMEOUT_MS = 60000;\n\n/**\n * Wraps a promise with a timeout. Rejects with clear error if timeout exceeded.\n */\nasync function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n errorMessage: string,\n): Promise<T> {\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(errorMessage)), ms),\n );\n return Promise.race([promise, timeout]);\n}\n\nexport interface Package {\n name: string;\n version: string;\n path?: string; // Local path to package directory\n}\n\n/**\n * Gets the proper node_modules directory path for a package.\n * Creates standard npm structure: node_modules/@scope/package or node_modules/package\n * Supports multiple versions by appending version to non-scoped packages if needed.\n *\n * @example\n * getPackageDirectory('node_modules', '@walkeros/core', '0.2.0')\n * // → 'node_modules/@walkeros/core'\n *\n * getPackageDirectory('node_modules', 'lodash', '4.17.21')\n * // → 'node_modules/lodash'\n */\nfunction getPackageDirectory(\n baseDir: string,\n packageName: string,\n version: string,\n): string {\n // For scoped packages like @walkeros/core, preserve the scope structure\n // This creates: node_modules/@walkeros/core (standard npm structure)\n return path.join(baseDir, 'node_modules', packageName);\n}\n\nasync function getCachedPackagePath(\n pkg: Package,\n tmpDir?: string,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'packages');\n const cacheKey = await getPackageCacheKey(pkg.name, pkg.version);\n return path.join(cacheDir, cacheKey);\n}\n\nasync function isPackageCached(\n pkg: Package,\n tmpDir?: string,\n): Promise<boolean> {\n const cachedPath = await getCachedPackagePath(pkg, tmpDir);\n return fs.pathExists(cachedPath);\n}\n\nfunction validateNoDuplicatePackages(packages: Package[]): void {\n const packageMap = new Map<string, string[]>();\n\n // Group packages by name and collect their versions\n for (const pkg of packages) {\n if (!packageMap.has(pkg.name)) {\n packageMap.set(pkg.name, []);\n }\n packageMap.get(pkg.name)!.push(pkg.version);\n }\n\n // Check for duplicate packages with different versions\n const conflicts: string[] = [];\n for (const [name, versions] of packageMap.entries()) {\n const uniqueVersions = [...new Set(versions)];\n if (uniqueVersions.length > 1) {\n conflicts.push(`${name}: [${uniqueVersions.join(', ')}]`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(\n `Version conflicts detected:\\n${conflicts.map((c) => ` - ${c}`).join('\\n')}\\n\\n` +\n 'Each package must use the same version across all declarations. ' +\n 'Please update your configuration to use consistent versions.',\n );\n }\n}\n\n/**\n * Recursively resolve and download package dependencies\n */\nasync function resolveDependencies(\n pkg: Package,\n packageDir: string,\n logger: Logger,\n visited: Set<string> = new Set(),\n): Promise<Package[]> {\n const dependencies: Package[] = [];\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (visited.has(pkgKey)) {\n return dependencies;\n }\n visited.add(pkgKey);\n\n try {\n const packageJsonPath = path.join(packageDir, 'package.json');\n if (await fs.pathExists(packageJsonPath)) {\n const packageJson = await fs.readJson(packageJsonPath);\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.peerDependencies,\n };\n\n for (const [name, versionSpec] of Object.entries(deps)) {\n if (typeof versionSpec === 'string') {\n // Use the version spec as-is (pacote will resolve it)\n // This respects the package.json dependency requirements\n dependencies.push({ name, version: versionSpec });\n }\n }\n }\n } catch (error) {\n logger.debug(`Failed to read dependencies for ${pkgKey}: ${error}`);\n }\n\n return dependencies;\n}\n\nexport async function downloadPackages(\n packages: Package[],\n targetDir: string,\n logger: Logger,\n useCache = true,\n configDir?: string, // For resolving relative local paths\n): Promise<Map<string, string>> {\n const packagePaths = new Map<string, string>();\n const downloadQueue: Package[] = [...packages];\n const processed = new Set<string>();\n\n // Track user-specified packages (only these are logged per design)\n const userSpecifiedPackages = new Set(packages.map((p) => p.name));\n\n // Track packages that should use local paths (to prevent npm overwriting them)\n const localPackageMap = new Map<string, string>();\n for (const pkg of packages) {\n if (pkg.path) {\n localPackageMap.set(pkg.name, pkg.path);\n }\n }\n\n // Validate no duplicate packages with different versions in initial list\n validateNoDuplicatePackages(packages);\n\n // Ensure target directory exists\n await fs.ensureDir(targetDir);\n\n while (downloadQueue.length > 0) {\n const pkg = downloadQueue.shift()!;\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (processed.has(pkgKey)) {\n continue;\n }\n processed.add(pkgKey);\n\n // If this package was specified with a local path, use it even if discovered as a dependency\n if (!pkg.path && localPackageMap.has(pkg.name)) {\n pkg.path = localPackageMap.get(pkg.name);\n }\n\n // Handle local packages first\n if (pkg.path) {\n const localPkg = await resolveLocalPackage(\n pkg.name,\n pkg.path,\n configDir || process.cwd(),\n logger,\n );\n const installedPath = await copyLocalPackage(localPkg, targetDir, logger);\n packagePaths.set(pkg.name, installedPath);\n\n // Resolve dependencies from local package\n const deps = await resolveDependencies(pkg, installedPath, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n }\n\n const packageSpec = `${pkg.name}@${pkg.version}`;\n // Use proper node_modules structure: node_modules/@scope/package\n const packageDir = getPackageDirectory(targetDir, pkg.name, pkg.version);\n // Cache always uses the default .tmp/cache/packages location\n const cachedPath = await getCachedPackagePath(pkg);\n\n if (useCache && (await isPackageCached(pkg))) {\n // Only log user-specified packages per design\n if (userSpecifiedPackages.has(pkg.name)) {\n logger.debug(`Downloading ${packageSpec} (cached)`);\n }\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n await fs.copy(cachedPath, packageDir);\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies for cached package too\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n } catch (error) {\n logger.debug(\n `Failed to use cache for ${packageSpec}, downloading fresh: ${error}`,\n );\n }\n }\n\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n\n // Extract package to proper node_modules structure\n // Use environment variable for cache location (Docker-friendly)\n const cacheDir =\n process.env.NPM_CACHE_DIR || getTmpPath(undefined, 'cache', 'npm');\n await withTimeout(\n pacote.extract(packageSpec, packageDir, {\n // Force npm registry download, prevent workspace resolution\n registry: 'https://registry.npmjs.org',\n\n // Force online fetching from registry (don't use cached workspace packages)\n preferOnline: true,\n\n // Cache for performance\n cache: cacheDir,\n\n // Don't resolve relative to workspace context\n where: undefined,\n }),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Package download timed out after ${PACKAGE_DOWNLOAD_TIMEOUT_MS / 1000}s: ${packageSpec}`,\n );\n\n // Only log user-specified packages per design\n if (userSpecifiedPackages.has(pkg.name)) {\n // Get package size for display\n const pkgStats = await fs.stat(path.join(packageDir, 'package.json'));\n const pkgJsonSize = pkgStats.size;\n // Estimate total package size from package.json (rough approximation)\n const sizeKB = (pkgJsonSize / 1024).toFixed(1);\n logger.debug(`Downloading ${packageSpec} (${sizeKB} KB)`);\n }\n\n // Cache the downloaded package for future use\n if (useCache) {\n try {\n await fs.ensureDir(path.dirname(cachedPath));\n await fs.copy(packageDir, cachedPath);\n } catch (cacheError) {\n // Silent cache failures\n }\n }\n\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n } catch (error) {\n throw new Error(`Failed to download ${packageSpec}: ${error}`);\n }\n }\n\n return packagePaths;\n}\n","/**\n * Cache utility functions for hash-based cache keys\n *\n * Implements content-based and date-based cache invalidation for:\n * - NPM package cache (mutable versions include daily date)\n * - Build artifact cache (content + date hashing)\n */\n\nimport { getHashServer } from '@walkeros/server-core';\n\nconst HASH_LENGTH = 12;\n\n/**\n * Check if a version specifier is mutable (can change over time)\n */\nexport function isMutableVersion(version: string): boolean {\n return (\n version === 'latest' ||\n version.includes('^') ||\n version.includes('~') ||\n version.includes('*') ||\n version.includes('x')\n );\n}\n\n/**\n * Get today's date in YYYY-MM-DD format\n */\nexport function getTodayDate(): string {\n return new Date().toISOString().split('T')[0];\n}\n\n/**\n * Generate cache key for npm package.\n * Mutable versions include date for daily invalidation.\n * Exact versions are cached indefinitely.\n */\nexport async function getPackageCacheKey(\n packageName: string,\n version: string,\n date?: string,\n): Promise<string> {\n const safeName = packageName.replace(/\\//g, '-').replace(/@/g, '');\n\n if (isMutableVersion(version)) {\n const dateStr = date ?? getTodayDate();\n const input = `${safeName}@${version}:${dateStr}`;\n return getHashServer(input, HASH_LENGTH);\n }\n\n // Exact version - no date component\n const input = `${safeName}@${version}`;\n return getHashServer(input, HASH_LENGTH);\n}\n\n/**\n * Normalize JSON content for consistent hashing.\n * Handles whitespace and property order variations.\n */\nfunction normalizeJson(content: string): string {\n const parsed = JSON.parse(content);\n return JSON.stringify(parsed);\n}\n\n/**\n * Generate cache key for flow.json configuration.\n * Includes date for daily rebuild guarantee.\n */\nexport async function getFlowConfigCacheKey(\n content: string,\n date?: string,\n): Promise<string> {\n const dateStr = date ?? getTodayDate();\n const normalized = normalizeJson(content);\n const input = `${normalized}:${dateStr}`;\n return getHashServer(input, HASH_LENGTH);\n}\n","/**\n * Build artifact cache for flow.json configurations\n *\n * Caches compiled bundles based on configuration content + date.\n * Enables intelligent cache reuse with daily rebuild guarantee.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { getFlowConfigCacheKey } from './cache-utils.js';\nimport { getTmpPath } from './tmp.js';\n\n/**\n * Get the cache file path for a flow.json configuration\n */\nexport async function getBuildCachePath(\n configContent: string,\n tmpDir?: string,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'builds');\n const cacheKey = await getFlowConfigCacheKey(configContent);\n return path.join(cacheDir, `${cacheKey}.js`);\n}\n\n/**\n * Check if a cached build exists for the given configuration\n */\nexport async function isBuildCached(\n configContent: string,\n tmpDir?: string,\n): Promise<boolean> {\n const cachePath = await getBuildCachePath(configContent, tmpDir);\n return fs.pathExists(cachePath);\n}\n\n/**\n * Store a build artifact in the cache\n */\nexport async function cacheBuild(\n configContent: string,\n buildOutput: string,\n tmpDir?: string,\n): Promise<void> {\n const cachePath = await getBuildCachePath(configContent, tmpDir);\n await fs.ensureDir(path.dirname(cachePath));\n await fs.writeFile(cachePath, buildOutput, 'utf-8');\n}\n\n/**\n * Retrieve a cached build artifact\n */\nexport async function getCachedBuild(\n configContent: string,\n tmpDir?: string,\n): Promise<string | null> {\n const cachePath = await getBuildCachePath(configContent, tmpDir);\n\n if (await fs.pathExists(cachePath)) {\n return await fs.readFile(cachePath, 'utf-8');\n }\n\n return null;\n}\n","/**\n * Bundle statistics display utilities\n */\nimport { formatBytes } from '../../core/index.js';\nimport type { BundleStats } from './bundler.js';\nimport type { Logger } from '../../core/index.js';\n\n/**\n * Display detailed bundle statistics to console\n */\nexport function displayStats(stats: BundleStats, logger: Logger): void {\n logger.info('\\n📊 Bundle Statistics');\n logger.info('─'.repeat(50));\n\n // Total size\n const sizeKB = formatBytes(stats.totalSize);\n logger.info(`Total Size: ${sizeKB} KB`);\n\n // Build time\n const timeSeconds = (stats.buildTime / 1000).toFixed(2);\n logger.info(`Build Time: ${timeSeconds}s`);\n\n // Tree-shaking effectiveness\n const treeshakingStatus = stats.treeshakingEffective\n ? '✅ Effective'\n : '⚠️ Not optimal (consider using named imports)';\n logger.info(`Tree-shaking: ${treeshakingStatus}`);\n\n // Package breakdown\n if (stats.packages.length > 0) {\n logger.info(`\\nPackage Breakdown:`);\n stats.packages.forEach((pkg) => {\n if (pkg.size > 0) {\n const pkgSizeKB = formatBytes(pkg.size);\n logger.info(` • ${pkg.name}: ${pkgSizeKB} KB`);\n }\n });\n }\n\n logger.info('─'.repeat(50));\n}\n\n/**\n * Create stats summary for JSON output\n */\nexport function createStatsSummary(stats: BundleStats) {\n return {\n totalSize: stats.totalSize,\n totalSizeFormatted: `${formatBytes(stats.totalSize)} KB`,\n buildTime: stats.buildTime,\n buildTimeFormatted: `${(stats.buildTime / 1000).toFixed(2)}s`,\n treeshakingEffective: stats.treeshakingEffective,\n packageCount: stats.packages.length,\n packages: stats.packages.map((pkg) => ({\n name: pkg.name,\n size: pkg.size,\n sizeFormatted: `${formatBytes(pkg.size)} KB`,\n })),\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow, Logger as CoreLogger } from '@walkeros/core';\nimport { getPlatform } from '@walkeros/core';\nimport {\n createLogger,\n createCollectorLoggerConfig,\n getErrorMessage,\n detectInput,\n type Logger,\n type Platform,\n} from '../../core/index.js';\nimport {\n loadFlowConfig,\n isObject,\n type BuildOptions,\n} from '../../config/index.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport { CallTracker } from './tracker.js';\nimport { executeInJSDOM } from './jsdom-executor.js';\nimport { executeInNode } from './node-executor.js';\nimport { loadDestinationEnvs } from './env-loader.js';\nimport type { SimulateCommandOptions, SimulationResult } from './types.js';\n\n/**\n * Generate a unique ID for temp files\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Main simulation orchestrator\n */\nexport async function simulateCore(\n inputPath: string,\n event: unknown,\n options: Pick<\n SimulateCommandOptions,\n 'json' | 'verbose' | 'silent' | 'platform'\n > = {},\n): Promise<SimulationResult> {\n const logger = createLogger({\n verbose: options.verbose || false,\n silent: options.silent || false,\n json: options.json || false,\n });\n\n try {\n // Execute simulation\n logger.debug(`Simulating event: ${JSON.stringify(event)}`);\n const result = await executeSimulation(event, inputPath, options.platform, {\n logger,\n verbose: options.verbose,\n });\n\n return result;\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Simple result formatting\n */\nexport function formatSimulationResult(\n result: SimulationResult,\n options: Pick<SimulateCommandOptions, 'json'> = {},\n): string {\n if (options.json) {\n const output = {\n result: result.elbResult,\n usage: result.usage,\n duration: result.duration,\n };\n return JSON.stringify(output, null, 2);\n }\n\n if (result.success) {\n return 'Simulation completed';\n } else {\n return `Simulation failed: ${result.error}`;\n }\n}\n\n/**\n * Execute simulation using destination-provided mock environments.\n * Supports both config JSON and pre-built bundle inputs.\n */\nexport async function executeSimulation(\n event: unknown,\n inputPath: string,\n platformOverride?: Platform,\n options: { logger?: Logger; verbose?: boolean } = {},\n): Promise<SimulationResult> {\n const startTime = Date.now();\n const tempDir = getTmpPath();\n\n // Create collector logger config for forwarding logs\n const collectorLoggerConfig = options.logger\n ? createCollectorLoggerConfig(options.logger, options.verbose)\n : undefined;\n\n try {\n // Ensure temp directory exists\n await fs.ensureDir(tempDir);\n\n // Detect input type first (so file errors appear before event validation errors)\n const detected = await detectInput(inputPath, platformOverride);\n\n // Validate event format\n if (\n !isObject(event) ||\n !('name' in event) ||\n typeof event.name !== 'string'\n ) {\n throw new Error(\n 'Event must be an object with a \"name\" property of type string',\n );\n }\n\n const typedEvent = event as { name: string; data?: unknown };\n\n if (detected.type === 'config') {\n // Config flow: load config, bundle, execute with mocking\n return await executeConfigSimulation(\n detected.content,\n inputPath,\n typedEvent,\n tempDir,\n startTime,\n collectorLoggerConfig,\n );\n } else {\n // Bundle flow: execute directly without mocking\n return await executeBundleSimulation(\n detected.content,\n detected.platform!,\n typedEvent,\n tempDir,\n startTime,\n collectorLoggerConfig,\n );\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n return {\n success: false,\n error: getErrorMessage(error),\n duration,\n };\n } finally {\n // Cleanup temp directory and all its contents\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {\n // Ignore cleanup errors - temp dirs will be cleaned eventually\n });\n }\n }\n}\n\n/**\n * Execute simulation from config JSON (existing behavior with mocking)\n */\nasync function executeConfigSimulation(\n _content: string,\n configPath: string,\n typedEvent: { name: string; data?: unknown },\n tempDir: string,\n startTime: number,\n loggerConfig?: CoreLogger.Config,\n): Promise<SimulationResult> {\n // Load config\n const { flowConfig, buildOptions } = await loadFlowConfig(configPath);\n\n // Detect platform from flowConfig\n const platform = getPlatform(flowConfig);\n\n // Create tracker\n const tracker = new CallTracker();\n\n // Create temporary bundle\n const tempOutput = path.join(\n tempDir,\n `simulation-bundle-${generateId()}.${platform === 'web' ? 'js' : 'mjs'}`,\n );\n\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n // Create build options for simulation - platform-aware bundling\n const simulationBuildOptions: BuildOptions = {\n ...buildOptions,\n code: buildOptions.code || '',\n output: tempOutput,\n tempDir,\n ...(platform === 'web'\n ? {\n format: 'iife' as const,\n platform: 'browser' as const,\n windowCollector: 'collector',\n windowElb: 'elb',\n }\n : {\n format: 'esm' as const,\n platform: 'node' as const,\n }),\n };\n\n // Bundle (downloads packages internally)\n await bundleCore(\n flowConfig,\n simulationBuildOptions,\n createLogger({ silent: true }),\n false,\n );\n\n // Load env examples dynamically from destination packages\n const envs = await loadDestinationEnvs(destinations || {});\n\n // Execute based on platform\n let result;\n if (platform === 'web') {\n result = await executeInJSDOM(\n tempOutput,\n destinations || {},\n typedEvent,\n tracker,\n envs,\n 10000,\n );\n } else {\n result = await executeInNode(\n tempOutput,\n destinations || {},\n typedEvent,\n tracker,\n envs,\n 30000,\n loggerConfig ? { logger: loggerConfig } : {},\n );\n }\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n elbResult: result.elbResult,\n usage: result.usage,\n duration,\n logs: [],\n };\n}\n\n/**\n * Execute simulation from pre-built bundle (no mocking)\n */\nasync function executeBundleSimulation(\n bundleContent: string,\n platform: Platform,\n typedEvent: { name: string; data?: unknown },\n tempDir: string,\n startTime: number,\n loggerConfig?: CoreLogger.Config,\n): Promise<SimulationResult> {\n // Write bundle to temp file\n const tempOutput = path.join(\n tempDir,\n `bundle-${generateId()}.${platform === 'server' ? 'mjs' : 'js'}`,\n );\n await fs.writeFile(tempOutput, bundleContent, 'utf8');\n\n // Create empty tracker (no mocking for pre-built bundles)\n const tracker = new CallTracker();\n\n // Execute based on platform (no destinations/envs for pre-built bundles)\n let result;\n if (platform === 'web') {\n result = await executeInJSDOM(\n tempOutput,\n {},\n typedEvent,\n tracker,\n {},\n 10000,\n );\n } else {\n result = await executeInNode(\n tempOutput,\n {},\n typedEvent,\n tracker,\n {},\n 30000,\n loggerConfig ? { logger: loggerConfig } : {},\n );\n }\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n elbResult: result.elbResult,\n usage: result.usage,\n duration,\n logs: [],\n };\n}\n","/**\n * Call Tracker for Simulation\n *\n * Wraps mock environment functions to track API calls.\n * Used with destination-provided examples/env.ts mocks.\n */\n\nexport interface ApiCall {\n type: 'call';\n path: string;\n args: unknown[];\n timestamp: number;\n}\n\nexport class CallTracker {\n private calls: Map<string, ApiCall[]> = new Map();\n\n /**\n * Wrap a function to track its calls\n */\n wrapFunction(\n name: string,\n fn?: (...args: unknown[]) => unknown,\n ): (...args: unknown[]) => unknown {\n const self = this;\n const targetFn = fn || (() => {});\n\n return new Proxy(targetFn, {\n apply(_target, thisArg, args: unknown[]) {\n self.logCall(name, args);\n return targetFn.apply(thisArg, args);\n },\n });\n }\n\n /**\n * Wrap an environment object, tracking specified paths\n *\n * @param env - Environment object (from destination's examples/env.ts)\n * @param paths - Paths to track (e.g., ['gtag:window.gtag', 'gtag:window.dataLayer.push'])\n */\n wrapEnv<T extends Record<string, unknown>>(env: T, paths: string[]): T {\n const wrapped: Record<string, unknown> = {};\n\n // Deep clone the env object first\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === 'object' && value !== null) {\n wrapped[key] = Array.isArray(value)\n ? [...value]\n : { ...(value as Record<string, unknown>) };\n } else {\n wrapped[key] = value;\n }\n }\n\n // Wrap specified paths\n for (const fullPath of paths) {\n // Parse path: \"gtag:window.gtag\" → destKey=\"gtag\", path=\"window.gtag\"\n const [destKey, ...pathParts] = fullPath.split(':');\n const path = pathParts.join(':');\n\n if (!path) continue;\n\n // Remove \"call:\" prefix if present (from simulation array)\n const cleanPath = path.replace(/^call:/, '');\n const parts = cleanPath.split('.');\n\n let current: Record<string, unknown> = wrapped;\n let source: Record<string, unknown> | undefined = env;\n\n // Navigate to parent object\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n\n if (!current[part]) {\n current[part] = {};\n }\n\n current = current[part] as Record<string, unknown>;\n source =\n source && typeof source[part] === 'object' && source[part] !== null\n ? (source[part] as Record<string, unknown>)\n : undefined;\n }\n\n // Wrap the final property\n const finalKey = parts[parts.length - 1];\n const originalFn = source?.[finalKey];\n\n // Wrap with full path for tracking\n current[finalKey] = this.wrapFunction(\n `${destKey}:${cleanPath}`,\n typeof originalFn === 'function'\n ? (originalFn as (...args: unknown[]) => unknown)\n : undefined,\n );\n }\n\n return wrapped as T;\n }\n\n private logCall(fullPath: string, args: unknown[]): void {\n // Parse \"destKey:api.path\" → destKey and apiPath\n const [destKey, ...pathParts] = fullPath.split(':');\n const apiPath = pathParts.join(':');\n\n if (!this.calls.has(destKey)) {\n this.calls.set(destKey, []);\n }\n\n this.calls.get(destKey)!.push({\n type: 'call',\n path: apiPath,\n args,\n timestamp: Date.now(),\n });\n }\n\n getCalls(): Record<string, ApiCall[]> {\n return Object.fromEntries(this.calls);\n }\n\n reset(): void {\n this.calls.clear();\n }\n}\n","/**\n * JSDOM-based executor for simulating IIFE bundles\n *\n * Executes actual production IIFE bundles in a virtual DOM environment\n * with env-based mocking from destination examples.\n */\n\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport type { Elb } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport type { CallTracker, ApiCall } from './tracker.js';\n\nexport interface ExecutionResult {\n collector: unknown;\n elb: unknown;\n elbResult: Elb.PushResult | undefined;\n usage: Record<string, ApiCall[]>;\n duration: number;\n}\n\ninterface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Build sandbox from destination-provided envs\n *\n * Merges env mocks from each destination's envs, wrapping\n * specified paths with CallTracker for API call tracking.\n */\nfunction buildSandboxFromEnvs(\n envs: Record<string, DestinationEnv>,\n destinations: Record<string, unknown>,\n tracker: CallTracker,\n): { window: Record<string, unknown>; document: Record<string, unknown> } {\n // Base browser APIs (not provided by destinations)\n const baseBrowserMocks = {\n Image: class MockImage {\n src = '';\n onload = (() => {}) as unknown;\n onerror = (() => {}) as unknown;\n },\n fetch: async () => ({ ok: true, json: async () => ({}) }),\n location: { href: 'http://localhost' },\n navigator: { userAgent: 'Mozilla/5.0 (walkerOS Simulation)' },\n };\n\n const sandbox = {\n window: { ...baseBrowserMocks } as Record<string, unknown>,\n document: {} as Record<string, unknown>,\n };\n\n // Add destination-specific env mocks\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n const destEnv = envs[destKey];\n if (!destEnv?.push) continue;\n\n const mockEnv = destEnv.push;\n const trackPaths = destEnv.simulation || [];\n\n // Use existing CallTracker to wrap env\n const trackedEnv = tracker.wrapEnv(\n mockEnv as Record<string, unknown>,\n trackPaths.map((p) => `${destKey}:${p}`),\n );\n\n // Merge window properties\n if (trackedEnv.window && typeof trackedEnv.window === 'object') {\n Object.assign(sandbox.window, trackedEnv.window);\n }\n\n // Merge document properties\n if (trackedEnv.document && typeof trackedEnv.document === 'object') {\n Object.assign(sandbox.document, trackedEnv.document);\n }\n }\n\n return sandbox;\n}\n\n/**\n * Wait for async window property assignment\n *\n * IIFE bundles execute asynchronously and assign to window.\n * This helper polls until the property appears or timeout occurs.\n */\nfunction waitForWindowProperty(\n window: Record<string, unknown>,\n prop: string,\n timeout: number = 5000,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n\n const check = () => {\n if (window[prop] !== undefined) {\n resolve();\n } else if (Date.now() - start > timeout) {\n reject(\n new Error(\n `Timeout waiting for window.${prop}. ` +\n `IIFE may have failed to execute or assign to window.`,\n ),\n );\n } else {\n setImmediate(check);\n }\n };\n\n check();\n });\n}\n\n/**\n * Execute production IIFE bundle in JSDOM with env-based mocking\n *\n * Main orchestration function that:\n * 1. Creates JSDOM virtual DOM\n * 2. Builds sandbox from dynamically loaded envs\n * 3. Executes IIFE in JSDOM\n * 4. Waits for window.collector/elb assignment\n * 5. Runs event through elb\n * 6. Returns tracked API calls\n */\nexport async function executeInJSDOM(\n bundlePath: string,\n destinations: Record<string, unknown>,\n event: { name: string; data?: unknown },\n tracker: CallTracker,\n envs: Record<string, DestinationEnv>,\n timeout: number = 10000,\n): Promise<ExecutionResult> {\n const start = Date.now();\n\n // 1. Create JSDOM virtual DOM with console suppression\n const virtualConsole = new VirtualConsole();\n // Silent mode - don't pipe console output to process stdout/stderr\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously', // Allow script execution\n resources: 'usable',\n virtualConsole,\n });\n\n const { window } = dom;\n\n // 2. Build sandbox from dynamically loaded envs and inject into window\n const sandbox = buildSandboxFromEnvs(envs, destinations, tracker);\n Object.assign(window, sandbox.window);\n Object.assign(window.document, sandbox.document);\n\n // 3. Load and execute bundle code\n const bundleCode = await fs.readFile(bundlePath, 'utf8');\n\n try {\n window.eval(bundleCode);\n } catch (error) {\n throw new Error(`Bundle execution failed: ${getErrorMessage(error)}`);\n }\n\n // 4. Wait for window.collector and window.elb assignments\n try {\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'collector',\n timeout,\n );\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'elb',\n timeout,\n );\n } catch (error) {\n throw new Error(\n `Window property assignment failed: ${getErrorMessage(error)}`,\n );\n }\n\n const { collector, elb } = window as unknown as {\n collector: unknown;\n elb: (name: string, data?: unknown) => Promise<unknown>;\n };\n\n // 5. Run event through elb\n let elbResult: Elb.PushResult | undefined;\n try {\n elbResult = (await elb(event.name, event.data)) as\n | Elb.PushResult\n | undefined;\n } catch (error) {\n throw new Error(`Event execution failed: ${getErrorMessage(error)}`);\n }\n\n // 6. Return results with tracked calls\n return {\n collector,\n elb,\n elbResult,\n usage: tracker.getCalls(),\n duration: Date.now() - start,\n };\n}\n","/**\n * Node.js-based executor for simulating ESM server bundles\n *\n * Executes server bundles via dynamic import with env-based mocking.\n */\n\nimport { pathToFileURL } from 'url';\nimport type { Elb, Logger as CoreLogger } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport type { CallTracker, ApiCall } from './tracker.js';\n\nexport interface ExecutionResult {\n collector: unknown;\n elb: unknown;\n elbResult: Elb.PushResult | undefined;\n usage: Record<string, ApiCall[]>;\n duration: number;\n}\n\ninterface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Build global mocks from destination-provided envs\n */\nfunction buildGlobalMocksFromEnvs(\n envs: Record<string, DestinationEnv>,\n destinations: Record<string, unknown>,\n tracker: CallTracker,\n): Record<string, unknown> {\n const globalMocks: Record<string, unknown> = {};\n\n for (const [destKey] of Object.entries(destinations)) {\n const destEnv = envs[destKey];\n if (!destEnv?.push) continue;\n\n const mockEnv = destEnv.push;\n const trackPaths = destEnv.simulation || [];\n\n const trackedEnv = tracker.wrapEnv(\n mockEnv as Record<string, unknown>,\n trackPaths.map((p) => `${destKey}:${p}`),\n );\n\n Object.assign(globalMocks, trackedEnv);\n }\n\n return globalMocks;\n}\n\n/**\n * Inject mocks into global scope and return cleanup function\n */\nfunction injectGlobalMocks(mocks: Record<string, unknown>): () => void {\n const originalValues: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(mocks)) {\n originalValues[key] = (globalThis as Record<string, unknown>)[key];\n (globalThis as Record<string, unknown>)[key] = value;\n }\n\n return () => {\n for (const [key, value] of Object.entries(originalValues)) {\n if (value === undefined) {\n delete (globalThis as Record<string, unknown>)[key];\n } else {\n (globalThis as Record<string, unknown>)[key] = value;\n }\n }\n };\n}\n\n/**\n * Execute server ESM bundle in Node.js with env-based mocking\n */\nexport async function executeInNode(\n bundlePath: string,\n destinations: Record<string, unknown>,\n event: { name: string; data?: unknown },\n tracker: CallTracker,\n envs: Record<string, DestinationEnv>,\n timeout: number = 30000,\n context: { logger?: CoreLogger.Config } = {},\n): Promise<ExecutionResult> {\n const start = Date.now();\n\n const globalMocks = buildGlobalMocksFromEnvs(envs, destinations, tracker);\n const cleanupMocks = injectGlobalMocks(globalMocks);\n\n try {\n const executeWithTimeout = async (): Promise<ExecutionResult> => {\n // Jest has issues with file:// URLs in dynamic imports, use path directly\n // Outside Jest, use file:// URL with cache-busting to prevent module caching\n const importUrl = process.env.JEST_WORKER_ID\n ? bundlePath\n : `${pathToFileURL(bundlePath).href}?t=${Date.now()}`;\n\n const module = await import(importUrl);\n\n if (!module.default || typeof module.default !== 'function') {\n throw new Error('Bundle does not export default factory function');\n }\n\n const result = await module.default(context);\n\n if (\n !result ||\n !result.collector ||\n typeof result.collector.push !== 'function'\n ) {\n throw new Error(\n 'Factory function did not return valid result with collector',\n );\n }\n\n const { collector, elb } = result;\n\n let elbResult: Elb.PushResult | undefined;\n try {\n // Use collector.push directly (bypasses source handlers, same as push command)\n elbResult = await collector.push({\n name: event.name,\n data: event.data,\n });\n } catch (error) {\n throw new Error(`Event execution failed: ${getErrorMessage(error)}`);\n }\n\n return {\n collector,\n elb,\n elbResult,\n usage: tracker.getCalls(),\n duration: Date.now() - start,\n };\n };\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Server simulation timeout after ${timeout}ms`)),\n timeout,\n );\n });\n\n return await Promise.race([executeWithTimeout(), timeoutPromise]);\n } catch (error) {\n throw new Error(`Node execution failed: ${getErrorMessage(error)}`);\n } finally {\n cleanupMocks();\n }\n}\n","interface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\ninterface DestinationConfig {\n package?: string;\n config?: Record<string, unknown>;\n}\n\n/**\n * Dynamically loads env examples from destination packages.\n *\n * Imports from `/dev` subpath (e.g., '@walkeros/web-destination-gtag/dev')\n * and extracts the `env` object which contains:\n * - push: Mock environment with API functions (gtag, fbq, etc.)\n * - simulation: Array of tracking paths for call verification\n *\n * @param destinations - Destination configuration from flow config\n * @returns Map of destination key to env object\n */\nexport async function loadDestinationEnvs(\n destinations: Record<string, unknown>,\n): Promise<Record<string, DestinationEnv>> {\n const envs: Record<string, DestinationEnv> = {};\n\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n const typedConfig = destConfig as DestinationConfig;\n\n // Skip if no package field\n if (!typedConfig.package) {\n continue;\n }\n\n try {\n // Determine import path\n const packageName = typedConfig.package;\n const isDemoPackage = packageName.includes('-demo');\n const importPath = isDemoPackage ? packageName : `${packageName}/dev`;\n\n // Dynamic import\n const module = await import(importPath);\n\n // Extract env from examples\n const examplesModule = module.examples || module.default?.examples;\n const envModule = examplesModule?.env;\n\n if (envModule?.push) {\n envs[destKey] = {\n init: envModule.init,\n push: envModule.push,\n simulation: envModule.simulation || [],\n };\n }\n } catch {\n // Silently skip destinations without env or invalid packages\n }\n }\n\n return envs;\n}\n","import { simulateCore, formatSimulationResult } from './simulator.js';\nimport { createCommandLogger, getErrorMessage } from '../../core/index.js';\nimport { loadJsonFromSource } from '../../config/index.js';\nimport type { SimulateCommandOptions } from './types.js';\n\n/**\n * CLI command handler for simulate command\n */\nexport async function simulateCommand(\n options: SimulateCommandOptions,\n): Promise<void> {\n const logger = createCommandLogger(options);\n\n // Handle dry-run\n if (options.dryRun) {\n logger.log(\n `[DRY-RUN] Would execute simulate with config: ${options.config}`,\n );\n return;\n }\n\n const startTime = Date.now();\n\n try {\n // Load event from inline JSON, file path, or URL\n const event = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n\n // Execute simulation\n const result = await simulateCore(options.config, event, {\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n });\n\n // Add duration to result\n const resultWithDuration = {\n ...result,\n duration: (Date.now() - startTime) / 1000,\n };\n\n // Output results\n if (options.json) {\n logger.json(resultWithDuration);\n } else {\n const output = formatSimulationResult(resultWithDuration, {\n json: false,\n });\n logger.log(output);\n }\n\n // Exit with error code if simulation failed\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n logger.json({\n success: false,\n error: errorMessage,\n duration: (Date.now() - startTime) / 1000,\n });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n}\n\n/**\n * High-level simulate function for programmatic usage.\n *\n * Handles configuration loading internally and returns structured results.\n *\n * @param configOrPath - Bundle configuration object or path to config file\n * @param event - Event object to simulate\n * @param options - Simulation options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.json - Format output as JSON (default: false)\n * @returns Simulation result with success status, elb result, and usage data\n *\n * @example\n * ```typescript\n * // With config file\n * const result = await simulate('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n *\n * // With config object\n * const result = await simulate(\n * {\n * platform: 'web',\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * code: '...',\n * output: './bundle.js'\n * },\n * { name: 'page view' },\n * { silent: true }\n * );\n * ```\n */\nexport async function simulate(\n configOrPath: string | unknown,\n event: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n json?: boolean;\n } = {},\n): Promise<import('./types').SimulationResult> {\n // simulateCore currently only accepts file paths, so we need to handle that\n // For now, if configOrPath is not a string, throw an error with guidance\n if (typeof configOrPath !== 'string') {\n throw new Error(\n 'simulate() currently only supports config file paths. ' +\n 'Config object support will be added in a future version. ' +\n 'Please provide a path to a configuration file.',\n );\n }\n\n // Call core simulator\n return await simulateCore(configOrPath, event, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n });\n}\n\n// Re-export types and utilities for testing\nexport * from './types.js';\nexport * from './simulator.js';\nexport { executeInNode } from './node-executor.js';\n","import path from 'path';\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport {\n getPlatform,\n type Elb,\n type Logger as CoreLogger,\n} from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport {\n createCommandLogger,\n createCollectorLoggerConfig,\n getErrorMessage,\n detectInput,\n type Logger,\n type Platform,\n} from '../../core/index.js';\nimport { loadFlowConfig, loadJsonFromSource } from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport type { PushCommandOptions, PushResult } from './types.js';\n\n/**\n * CLI command handler for push command\n */\nexport async function pushCommand(options: PushCommandOptions): Promise<void> {\n const logger = createCommandLogger(options);\n const startTime = Date.now();\n let tempDir: string | undefined;\n\n try {\n // Step 1: Load event\n logger.debug('Loading event');\n const event = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n\n // Validate event format using Zod schema\n const eventResult = schemas.PartialEventSchema.safeParse(event);\n if (!eventResult.success) {\n const errors = eventResult.error.issues\n .map((issue) => `${String(issue.path.join('.'))}: ${issue.message}`)\n .join(', ');\n throw new Error(`Invalid event: ${errors}`);\n }\n\n const parsedEvent = eventResult.data as {\n name?: string;\n data?: Record<string, unknown>;\n };\n if (!parsedEvent.name) {\n throw new Error('Invalid event: Missing required \"name\" property');\n }\n\n // Create typed event object for execution\n const validatedEvent: { name: string; data: Record<string, unknown> } = {\n name: parsedEvent.name,\n data: (parsedEvent.data || {}) as Record<string, unknown>,\n };\n\n // Warn about event naming format (walkerOS business logic)\n if (!validatedEvent.name.includes(' ')) {\n logger.log(\n `Warning: Event name \"${validatedEvent.name}\" should follow \"ENTITY ACTION\" format (e.g., \"page view\")`,\n );\n }\n\n // Step 2: Detect input type (config or bundle)\n logger.debug('Detecting input type');\n const detected = await detectInput(options.config, options.platform);\n\n let result: PushResult;\n\n if (detected.type === 'config') {\n // Config flow: load config, bundle, execute\n result = await executeConfigPush(\n options,\n validatedEvent,\n logger,\n (dir) => {\n tempDir = dir;\n },\n );\n } else {\n // Bundle flow: execute directly\n const collectorLoggerConfig = createCollectorLoggerConfig(\n logger,\n options.verbose,\n );\n result = await executeBundlePush(\n detected.content,\n detected.platform!,\n validatedEvent,\n logger,\n (dir) => {\n tempDir = dir;\n },\n { logger: collectorLoggerConfig },\n );\n }\n\n // Step 3: Output results\n const duration = Date.now() - startTime;\n\n if (options.json) {\n logger.json({\n success: result.success,\n event: result.elbResult,\n duration,\n });\n } else {\n // Standard output\n if (result.success) {\n logger.log('Event pushed successfully');\n if (result.elbResult && typeof result.elbResult === 'object') {\n const pushResult = result.elbResult as unknown as Record<\n string,\n unknown\n >;\n if ('id' in pushResult && pushResult.id) {\n logger.log(` Event ID: ${pushResult.id}`);\n }\n if ('entity' in pushResult && pushResult.entity) {\n logger.log(` Entity: ${pushResult.entity}`);\n }\n if ('action' in pushResult && pushResult.action) {\n logger.log(` Action: ${pushResult.action}`);\n }\n }\n logger.log(` Duration: ${duration}ms`);\n } else {\n logger.error(`Error: ${result.error}`);\n process.exit(1);\n }\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n logger.json({\n success: false,\n error: errorMessage,\n duration,\n });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n process.exit(1);\n } finally {\n // Cleanup temp directory\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {\n // Ignore cleanup errors\n });\n }\n }\n}\n\n/**\n * Execute push from config JSON (existing behavior)\n */\nasync function executeConfigPush(\n options: PushCommandOptions,\n validatedEvent: { name: string; data: Record<string, unknown> },\n logger: Logger,\n setTempDir: (dir: string) => void,\n): Promise<PushResult> {\n // Load config\n logger.debug('Loading flow configuration');\n const { flowConfig, buildOptions } = await loadFlowConfig(options.config, {\n flowName: options.flow,\n logger,\n });\n\n const platform = getPlatform(flowConfig);\n\n // Bundle to temp file in config directory (so Node.js can find node_modules)\n logger.debug('Bundling flow configuration');\n const configDir = buildOptions.configDir || process.cwd();\n const tempDir = path.join(\n configDir,\n '.tmp',\n `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n setTempDir(tempDir);\n await fs.ensureDir(tempDir);\n const tempPath = path.join(\n tempDir,\n `bundle.${platform === 'web' ? 'js' : 'mjs'}`,\n );\n\n const pushBuildOptions = {\n ...buildOptions,\n output: tempPath,\n format: platform === 'web' ? ('iife' as const) : ('esm' as const),\n platform: platform === 'web' ? ('browser' as const) : ('node' as const),\n ...(platform === 'web' && {\n windowCollector: 'collector',\n windowElb: 'elb',\n }),\n };\n\n await bundleCore(flowConfig, pushBuildOptions, logger, false);\n\n logger.debug(`Bundle created: ${tempPath}`);\n\n // Execute based on platform\n if (platform === 'web') {\n logger.debug('Executing in web environment (JSDOM)');\n return executeWebPush(tempPath, validatedEvent, logger);\n } else if (platform === 'server') {\n logger.debug('Executing in server environment (Node.js)');\n const collectorLoggerConfig = createCollectorLoggerConfig(\n logger,\n options.verbose,\n );\n return executeServerPush(tempPath, validatedEvent, logger, 60000, {\n logger: collectorLoggerConfig,\n });\n } else {\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\n/**\n * Execute push from pre-built bundle\n */\nasync function executeBundlePush(\n bundleContent: string,\n platform: Platform,\n validatedEvent: { name: string; data: Record<string, unknown> },\n logger: Logger,\n setTempDir: (dir: string) => void,\n context: { logger?: CoreLogger.Config } = {},\n): Promise<PushResult> {\n // Write bundle to temp file\n const tempDir = path.join(\n process.cwd(),\n '.tmp',\n `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n setTempDir(tempDir);\n await fs.ensureDir(tempDir);\n const tempPath = path.join(\n tempDir,\n `bundle.${platform === 'server' ? 'mjs' : 'js'}`,\n );\n await fs.writeFile(tempPath, bundleContent, 'utf8');\n\n logger.debug(`Bundle written to: ${tempPath}`);\n\n // Execute based on platform\n if (platform === 'web') {\n logger.debug('Executing in web environment (JSDOM)');\n return executeWebPush(tempPath, validatedEvent, logger);\n } else {\n logger.debug('Executing in server environment (Node.js)');\n return executeServerPush(tempPath, validatedEvent, logger, 60000, context);\n }\n}\n\n/**\n * Typed event input for push command\n */\ninterface PushEventInput {\n name: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Execute push for web platform using JSDOM with real APIs\n */\nasync function executeWebPush(\n bundlePath: string,\n event: PushEventInput,\n logger: Logger,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // Create JSDOM with silent console\n const virtualConsole = new VirtualConsole();\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously',\n resources: 'usable',\n virtualConsole,\n });\n\n const { window } = dom;\n\n // JSDOM provides fetch natively, no need to inject node-fetch\n\n // Load and execute bundle\n logger.debug('Loading bundle...');\n const bundleCode = await fs.readFile(bundlePath, 'utf8');\n window.eval(bundleCode);\n\n // Wait for window.collector assignment\n logger.debug('Waiting for collector...');\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'collector',\n 5000,\n );\n\n const windowObj = window as unknown as Record<string, unknown>;\n const collector = windowObj.collector as unknown as {\n push: (event: {\n name: string;\n data: Record<string, unknown>;\n }) => Promise<Elb.PushResult>;\n };\n\n // Push event directly to collector (bypasses source handlers)\n logger.log(`Pushing event: ${event.name}`);\n const elbResult = await collector.push({\n name: event.name,\n data: event.data,\n });\n\n return {\n success: true,\n elbResult,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Execute push for server platform using Node.js\n */\nasync function executeServerPush(\n bundlePath: string,\n event: PushEventInput,\n logger: Logger,\n timeout: number = 60000, // 60 second default timeout\n context: { logger?: CoreLogger.Config } = {},\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Server push timeout after ${timeout}ms`)),\n timeout,\n );\n });\n\n // Execute with timeout\n const executePromise = (async () => {\n // Dynamic import of ESM bundle\n logger.debug('Importing bundle...');\n const flowModule = await import(bundlePath);\n\n if (!flowModule.default || typeof flowModule.default !== 'function') {\n throw new Error('Bundle does not export default factory function');\n }\n\n // Call factory function to start flow (pass context for verbose logging)\n logger.debug('Calling factory function...');\n const result = await flowModule.default(context);\n\n if (\n !result ||\n !result.collector ||\n typeof result.collector.push !== 'function'\n ) {\n throw new Error(\n 'Factory function did not return valid result with collector',\n );\n }\n\n const { collector } = result;\n\n // Push event directly to collector (bypasses source handlers)\n logger.log(`Pushing event: ${event.name}`);\n const elbResult = await collector.push({\n name: event.name,\n data: event.data,\n });\n\n return {\n success: true,\n elbResult,\n duration: Date.now() - startTime,\n };\n })();\n\n // Race between execution and timeout\n return await Promise.race([executePromise, timeoutPromise]);\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Wait for window property to be assigned\n */\nfunction waitForWindowProperty(\n window: Record<string, unknown>,\n prop: string,\n timeout: number = 5000,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n\n const check = () => {\n if (window[prop] !== undefined) {\n resolve();\n } else if (Date.now() - start > timeout) {\n reject(\n new Error(\n `Timeout waiting for window.${prop}. IIFE may have failed to execute.`,\n ),\n );\n } else {\n setImmediate(check);\n }\n };\n\n check();\n });\n}\n\n// Export types\nexport type { PushCommandOptions, PushResult };\n","/**\n * Run Command\n *\n * Runs walkerOS flows using local runtime\n */\n\nimport path from 'path';\nimport {\n createCommandLogger,\n createTimer,\n getErrorMessage,\n} from '../../core/index.js';\nimport { validateMode, validateFlowFile, validatePort } from './validators.js';\nimport { prepareBundleForRun, isPreBuiltConfig } from './utils.js';\nimport { executeRunLocal } from './execution.js';\nimport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './types.js';\n\n/**\n * CLI command function for `walkeros run`\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Command options\n */\nexport async function runCommand(\n mode: string,\n options: RunCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCommandLogger(options);\n\n try {\n // Step 1: Validate inputs\n validateMode(mode);\n const configPath = validateFlowFile(options.config);\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Step 2: Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(configPath);\n\n let flowPath: string | null = null;\n\n if (mode === 'collect') {\n if (isPreBuilt) {\n // Use pre-built bundle directly\n flowPath = path.resolve(configPath);\n logger.debug(`Using pre-built flow: ${path.basename(flowPath)}`);\n } else {\n // Bundle JSON config first\n logger.debug('Building flow bundle');\n\n flowPath = await prepareBundleForRun(configPath, {\n verbose: options.verbose,\n silent: options.json || options.silent,\n });\n\n logger.debug('Bundle ready');\n }\n }\n\n // Step 3: Execute locally\n // Handle dry-run\n if (options.dryRun) {\n logger.log(`[DRY-RUN] Would execute locally: run ${mode}`);\n return;\n }\n\n // Execute locally using runtime module\n const modeLabel = mode === 'collect' ? 'Collector' : 'Server';\n logger.log(`Starting ${modeLabel}...`);\n\n await executeRunLocal(mode as 'collect' | 'serve', flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n });\n\n // Note: Server runs forever, so we won't reach here unless it fails\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n logger.json({\n success: false,\n mode,\n error: errorMessage,\n duration,\n });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n process.exit(1);\n }\n}\n\n/**\n * Programmatic run function\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Run options\n * @returns Run result\n *\n * @example\n * ```typescript\n * // Run with JSON config (bundles automatically)\n * await run('collect', {\n * config: './flow.json',\n * port: 8080\n * });\n *\n * // Run with pre-built bundle\n * await run('collect', {\n * config: './flow.mjs',\n * port: 8080\n * });\n * ```\n */\nexport async function run(\n mode: RunMode,\n options: RunOptions,\n): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\n // Validate inputs\n validateMode(mode);\n\n let flowFile: string;\n if (typeof options.config === 'string') {\n flowFile = validateFlowFile(options.config);\n } else {\n throw new Error('Programmatic run() requires config file path');\n }\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(flowFile);\n\n let flowPath: string;\n\n if (isPreBuilt) {\n flowPath = path.resolve(flowFile);\n } else {\n // Bundle JSON config\n flowPath = await prepareBundleForRun(flowFile, {\n verbose: options.verbose,\n silent: true,\n });\n }\n\n // Run the flow using local runtime\n await executeRunLocal(mode, flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n });\n\n // Success (though server runs forever, so we typically don't reach here)\n return {\n success: true,\n exitCode: 0,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n// Export types\nexport type { RunMode, RunCommandOptions, RunOptions, RunResult };\n","/**\n * Run Command Validators\n *\n * Validation logic for run command inputs.\n * Uses Zod schemas for type-safe validation.\n */\n\nimport { existsSync } from 'fs';\nimport { resolveAsset } from '../../core/asset-resolver.js';\nimport {\n RunModeSchema,\n PortSchema,\n type RunMode,\n} from '../../schemas/index.js';\n\n/**\n * Validates run mode using Zod schema.\n *\n * @param mode - Mode to validate\n * @throws Error if mode is invalid\n */\nexport function validateMode(mode: string): asserts mode is RunMode {\n const result = RunModeSchema.safeParse(mode);\n if (!result.success) {\n throw new Error(\n `Invalid mode: \"${mode}\"\\n` +\n ` Valid modes: collect, serve\\n` +\n ` Example: walkeros run collect ./flow.json`,\n );\n }\n}\n\n/**\n * Validates flow file exists.\n *\n * @remarks\n * File existence cannot be validated by Zod, so this remains a custom check.\n *\n * @param filePath - Path to flow configuration file (bare name, relative, or absolute)\n * @returns Absolute path to flow file\n * @throws Error if file doesn't exist\n */\nexport function validateFlowFile(filePath: string): string {\n // Use asset resolver to handle bare names, relative paths, and absolute paths\n const absolutePath = resolveAsset(filePath, 'bundle');\n\n if (!existsSync(absolutePath)) {\n throw new Error(\n `Flow file not found: ${filePath}\\n` +\n ` Resolved path: ${absolutePath}\\n` +\n ` Make sure the file exists and the path is correct`,\n );\n }\n\n return absolutePath;\n}\n\n/**\n * Validates port number using Zod schema.\n *\n * @param port - Port number to validate\n * @throws Error if port is invalid\n */\nexport function validatePort(port: number): void {\n const result = PortSchema.safeParse(port);\n if (!result.success) {\n throw new Error(\n `Invalid port: ${port}\\n` +\n ` Port must be an integer between 1 and 65535\\n` +\n ` Example: --port 8080`,\n );\n }\n}\n","/**\n * CLI Primitive Schemas\n *\n * Basic Zod schemas for CLI parameter validation.\n * Follows walkerOS patterns from @walkeros/core.\n */\n\nimport { z } from '@walkeros/core/dev';\n\n/**\n * Run mode schema.\n *\n * @remarks\n * Validates CLI run mode for the `run` command.\n * - `collect`: Run as event collector\n * - `serve`: Run as HTTP server\n */\nexport const RunModeSchema = z\n .enum(['collect', 'serve'])\n .describe('CLI run mode: collect events or serve HTTP');\n\nexport type RunMode = z.infer<typeof RunModeSchema>;\n\n/**\n * Port number schema.\n *\n * @remarks\n * Validates HTTP server port number.\n * Must be integer between 1-65535.\n */\nexport const PortSchema = z\n .number()\n .int('Port must be an integer')\n .min(1, 'Port must be at least 1')\n .max(65535, 'Port must be at most 65535')\n .describe('HTTP server port number');\n\n/**\n * File path schema.\n *\n * @remarks\n * Basic string validation for file paths.\n * File existence is checked separately (Zod can't check filesystem).\n */\nexport const FilePathSchema = z\n .string()\n .min(1, 'File path cannot be empty')\n .describe('Path to configuration file');\n","/**\n * Run Command Schemas\n *\n * Zod schemas for run command options validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { RunModeSchema, PortSchema, FilePathSchema } from './primitives';\n\n/**\n * Run command options schema.\n *\n * @remarks\n * Validates all options for the `walkeros run` command.\n */\nexport const RunOptionsSchema = z.object({\n mode: RunModeSchema,\n flow: FilePathSchema,\n port: PortSchema.default(8080),\n flowName: z.string().optional().describe('Specific flow name to run'),\n});\n\nexport type RunOptions = z.infer<typeof RunOptionsSchema>;\n","/**\n * Run Command Utilities\n *\n * Shared utilities for the run command\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { bundle } from '../bundle/index.js';\n\n/**\n * Prepares a JSON config file for execution by bundling it to a temporary location.\n *\n * Creates bundle in .tmp/ directory relative to config file (not /tmp)\n * so Node.js module resolution finds node_modules.\n *\n * @param configPath - Path to the JSON configuration file\n * @param options - Bundle options\n * @param options.verbose - Enable verbose logging\n * @param options.silent - Suppress output\n * @returns Path to the bundled output file\n */\nexport async function prepareBundleForRun(\n configPath: string,\n options: {\n verbose?: boolean;\n silent?: boolean;\n },\n): Promise<string> {\n // Create temp directory relative to config (ensures node_modules is findable)\n const configDir = path.dirname(path.resolve(configPath));\n const tempDir = path.join(\n configDir,\n '.tmp',\n `run-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n await fs.ensureDir(tempDir);\n\n // Generate output path in temp directory\n const tempPath = path.join(tempDir, 'bundle.mjs');\n\n // Bundle with proper output override\n await bundle(configPath, {\n cache: true,\n verbose: options.verbose,\n silent: options.silent,\n buildOverrides: {\n output: tempPath,\n format: 'esm',\n platform: 'node',\n },\n });\n\n return tempPath;\n}\n\n/**\n * Checks if a config file is pre-built or needs bundling\n *\n * @param configPath - Path to configuration file\n * @returns True if file is pre-built (js/mjs/cjs), false if needs bundling (json)\n */\nexport function isPreBuiltConfig(configPath: string): boolean {\n return (\n configPath.endsWith('.mjs') ||\n configPath.endsWith('.js') ||\n configPath.endsWith('.cjs')\n );\n}\n","import { createLogger, Level, type Logger } from '@walkeros/core';\nimport type { RuntimeConfig, ServeConfig } from '../../runtime/index.js';\nimport { runFlow, runServeMode } from '../../runtime/index.js';\n\n// Create logger for local execution - DEBUG level when VERBOSE, otherwise INFO\nconst logLevel = process.env.VERBOSE === 'true' ? Level.DEBUG : Level.INFO;\nconst loggerConfig: Logger.Config = { level: logLevel };\nconst logger = createLogger(loggerConfig);\n\n/**\n * Execute run command locally\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to flow bundle (required for collect, optional for serve)\n * @param options - Runtime options\n */\nexport async function executeRunLocal(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n serveName?: string;\n servePath?: string;\n },\n): Promise<void> {\n switch (mode) {\n case 'collect': {\n if (!flowPath) {\n throw new Error('Flow path is required for collect mode');\n }\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config, logger.scope('runner'), loggerConfig);\n break;\n }\n\n case 'serve': {\n const config: ServeConfig = {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n file: flowPath || undefined,\n };\n await runServeMode(config, logger.scope('serve'));\n break;\n }\n\n default:\n throw new Error(`Unknown mode: ${mode}`);\n }\n}\n","/**\n * Runtime executor for pre-built walkerOS flows\n *\n * This module runs pre-built .mjs flow bundles without any build-time operations.\n * All bundling, package downloading, and code generation happens BEFORE this runs.\n */\n\nimport { pathToFileURL } from 'url';\nimport { resolve, dirname } from 'path';\nimport type { Logger } from '@walkeros/core';\n\nexport interface RuntimeConfig {\n port?: number;\n host?: string;\n}\n\n/**\n * Run a pre-built flow bundle\n *\n * @param file - Absolute path to pre-built .mjs flow file\n * @param config - Optional runtime configuration\n * @param logger - Logger instance for output\n * @param loggerConfig - Optional logger config to forward to the flow's collector\n */\nexport async function runFlow(\n file: string,\n config: RuntimeConfig | undefined,\n logger: Logger.Instance,\n loggerConfig?: Logger.Config,\n): Promise<void> {\n logger.info(`Loading flow from ${file}`);\n\n try {\n const absolutePath = resolve(file);\n const flowDir = dirname(absolutePath);\n\n // Change working directory to flow's directory\n // This ensures relative paths (e.g., ./shared/credentials.json) work\n // consistently in both local and Docker execution modes\n process.chdir(flowDir);\n\n const fileUrl = pathToFileURL(absolutePath).href;\n const module = await import(fileUrl);\n\n if (!module.default || typeof module.default !== 'function') {\n logger.throw(\n `Invalid flow bundle: ${file} must export a default function`,\n );\n }\n\n // Execute the flow's factory function with runtime config and logger\n const flowContext = loggerConfig\n ? { ...config, logger: loggerConfig }\n : config;\n const result = await module.default(flowContext);\n\n if (!result || !result.collector) {\n logger.throw(`Invalid flow bundle: ${file} must return { collector }`);\n }\n\n const { collector } = result;\n\n logger.info('Flow running');\n if (config?.port) {\n logger.info(`Port: ${config.port}`);\n }\n\n // Graceful shutdown handler\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down gracefully...`);\n\n try {\n // Use collector's shutdown command if available\n if (collector.command) {\n await collector.command('shutdown');\n }\n logger.info('Shutdown complete');\n process.exit(0);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error during shutdown: ${message}`);\n process.exit(1);\n }\n };\n\n // Register shutdown handlers\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Keep process alive\n await new Promise(() => {});\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Failed to run flow: ${message}`);\n if (error instanceof Error && error.stack) {\n logger.debug('Stack trace:', { stack: error.stack });\n }\n throw error;\n }\n}\n","/**\n * Serve mode - serve single file (typically generated bundle)\n */\n\nimport express from 'express';\nimport { resolve } from 'path';\nimport type { Logger } from '@walkeros/core';\nimport { VERSION } from '../version';\n\nexport interface ServeConfig {\n port?: number;\n host?: string;\n servePath?: string;\n serveName?: string;\n file?: string;\n}\n\n/**\n * Run serve mode - serve single file (typically generated bundle)\n *\n * @param config - Server configuration\n * @param logger - Logger instance for output\n */\nexport async function runServeMode(\n config: ServeConfig | undefined,\n logger: Logger.Instance,\n): Promise<void> {\n // Port priority: ENV variable > config > default\n const port = process.env.PORT\n ? parseInt(process.env.PORT, 10)\n : config?.port || 8080;\n\n // Host priority: ENV variable > config > default\n const host = process.env.HOST || config?.host || '0.0.0.0';\n\n // File path: ENV variable > config > default (resolve to absolute)\n const file = resolve(process.env.FILE || config?.file || './dist/walker.js');\n\n // Serve name (filename in URL): ENV variable > config > default\n const serveName = process.env.SERVE_NAME || config?.serveName || 'walker.js';\n\n // Serve path (URL directory): ENV variable > config > default (empty = root)\n const servePath = process.env.SERVE_PATH || config?.servePath || '';\n\n // Build full URL path\n const urlPath = servePath ? `/${servePath}/${serveName}` : `/${serveName}`;\n\n logger.info('Starting single-file server...');\n logger.info(`File: ${file}`);\n logger.info(`URL: http://${host}:${port}${urlPath}`);\n\n try {\n const app = express();\n\n // Health check\n app.get('/health', (req, res) => {\n res.json({\n status: 'ok',\n version: VERSION,\n timestamp: Date.now(),\n mode: 'serve',\n file: file,\n url: urlPath,\n });\n });\n\n // Serve single file at custom URL path\n app.get(urlPath, (req, res) => {\n // Set content type before streaming\n res.type('application/javascript');\n\n // Allow dotfiles since file paths may include dotfile directories\n res.sendFile(file, { dotfiles: 'allow' }, (err) => {\n if (err && !res.headersSent) {\n const errCode = (err as NodeJS.ErrnoException).code;\n // Express 5 uses HTTP-style errors with status/statusCode\n const errStatus =\n (err as { status?: number; statusCode?: number }).status ||\n (err as { status?: number; statusCode?: number }).statusCode;\n\n // Log errors (except client disconnections)\n if (errCode !== 'ECONNABORTED') {\n logger.error(\n `sendFile error for ${file}: ${err.message} (code: ${errCode}, status: ${errStatus})`,\n );\n }\n\n // Send appropriate error response (check both Node.js codes and HTTP status)\n if (\n errStatus === 404 ||\n errCode === 'ENOENT' ||\n errCode === 'EISDIR' ||\n errCode === 'ENOTDIR'\n ) {\n res.status(404).send('File not found');\n } else if (errCode !== 'ECONNABORTED') {\n res.status(500).send('Internal server error');\n }\n }\n });\n });\n\n // Start server\n const server = app.listen(port, host, () => {\n logger.info(`Server listening on http://${host}:${port}`);\n logger.info(`GET ${urlPath} - Bundle file`);\n logger.info(`GET /health - Health check`);\n });\n\n // Graceful shutdown\n const shutdownHandler = (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n server.close(() => {\n logger.info('Server closed');\n process.exit(0);\n });\n };\n\n process.on('SIGTERM', () => shutdownHandler('SIGTERM'));\n process.on('SIGINT', () => shutdownHandler('SIGINT'));\n\n // Keep process alive\n await new Promise(() => {});\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Server failed: ${message}`);\n process.exit(1);\n }\n}\n","import fs from 'fs-extra';\nimport { Command } from 'commander';\nimport { getTmpPath, getDefaultTmpRoot } from '../core/tmp.js';\nimport { createLogger } from '../core/logger.js';\n\nexport function registerCacheCommand(program: Command): void {\n const cache = program.command('cache').description('Manage the CLI cache');\n\n cache\n .command('clear')\n .description('Clear all cached packages and builds')\n .option('--packages', 'Clear only package cache')\n .option('--builds', 'Clear only build cache')\n .option('--tmp-dir <dir>', 'Custom temp directory')\n .option('--silent', 'Suppress output')\n .action(async (options) => {\n const logger = createLogger({ silent: options.silent });\n const tmpDir = options.tmpDir;\n if (options.packages) {\n await fs.remove(getTmpPath(tmpDir, 'cache', 'packages'));\n logger.log('Package cache cleared');\n } else if (options.builds) {\n await fs.remove(getTmpPath(tmpDir, 'cache', 'builds'));\n logger.log('Build cache cleared');\n } else {\n await fs.remove(getTmpPath(tmpDir, 'cache'));\n logger.log('All caches cleared');\n }\n });\n\n cache\n .command('info')\n .description('Show cache statistics')\n .option('--tmp-dir <dir>', 'Custom temp directory')\n .option('--silent', 'Suppress output')\n .action(async (options) => {\n const logger = createLogger({ silent: options.silent });\n const tmpDir = options.tmpDir;\n const packagesDir = getTmpPath(tmpDir, 'cache', 'packages');\n const buildsDir = getTmpPath(tmpDir, 'cache', 'builds');\n\n const packageCount = await countEntries(packagesDir);\n const buildCount = await countEntries(buildsDir);\n\n logger.log(`Cache directory: ${getTmpPath(tmpDir, 'cache')}`);\n logger.log(`Cached packages: ${packageCount}`);\n logger.log(`Cached builds: ${buildCount}`);\n });\n}\n\n/**\n * Register the clean command to clear entire temp directory\n */\nexport function registerCleanCommand(program: Command): void {\n program\n .command('clean')\n .description('Clear the entire temp directory (.tmp/)')\n .option('--tmp-dir <dir>', 'Custom temp directory')\n .option('--silent', 'Suppress output')\n .action(async (options) => {\n const logger = createLogger({ silent: options.silent });\n const tmpDir = options.tmpDir || getDefaultTmpRoot();\n await fs.remove(tmpDir);\n logger.log(`Temp directory cleared: ${tmpDir}`);\n });\n}\n\nasync function countEntries(dir: string): Promise<number> {\n if (!(await fs.pathExists(dir))) return 0;\n const entries = await fs.readdir(dir);\n return entries.length;\n}\n"],"mappings":"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","names":["chalk","path","fs","fileURLToPath","path","path","path","path","fileURLToPath","path","path","fs","logger","fs","fs","path","path","fs","path","fs","path","fs","path","fs","input","path","fs","logger","fs","path","path","fs","logger","path","fs","stats","logger","logger","path","fs","path","fs","getPlatform","path","fs","resolve","fs","logger","fs","loggerConfig","getPlatform","path","logger","path","JSDOM","VirtualConsole","fs","getPlatform","schemas","logger","schemas","fs","getPlatform","path","VirtualConsole","JSDOM","waitForWindowProperty","resolve","path","existsSync","z","z","existsSync","path","fs","path","fs","createLogger","pathToFileURL","dirname","logger","loggerConfig","resolve","logger","resolve","createLogger","logger","path","fs","program","logger","fs","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/version.ts","../src/commands/bundle/index.ts","../src/core/logger.ts","../src/core/collector-logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/tmp.ts","../src/core/asset-resolver.ts","../src/config/utils.ts","../src/core/utils.ts","../src/core/local-packages.ts","../src/core/input-detector.ts","../src/config/validators.ts","../src/config/build-defaults.ts","../src/config/loader.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/package-manager.ts","../src/core/cache-utils.ts","../src/core/build-cache.ts","../src/commands/bundle/stats.ts","../src/commands/simulate/simulator.ts","../src/commands/simulate/tracker.ts","../src/commands/simulate/jsdom-executor.ts","../src/commands/simulate/node-executor.ts","../src/commands/simulate/env-loader.ts","../src/commands/simulate/index.ts","../src/commands/push/index.ts","../src/commands/run/index.ts","../src/commands/run/validators.ts","../src/schemas/primitives.ts","../src/schemas/run.ts","../src/commands/run/utils.ts","../src/commands/run/execution.ts","../src/runtime/runner.ts","../src/runtime/serve.ts","../src/commands/cache.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { VERSION } from './version.js';\nimport { bundleCommand } from './commands/bundle/index.js';\nimport { simulateCommand } from './commands/simulate/index.js';\nimport { pushCommand } from './commands/push/index.js';\nimport { runCommand } from './commands/run/index.js';\nimport {\n registerCacheCommand,\n registerCleanCommand,\n} from './commands/cache.js';\n\n// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand, simulateCommand, pushCommand, runCommand };\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle } from './commands/bundle/index.js';\nexport { simulate } from './commands/simulate/index.js';\nexport { run } from './commands/run/index.js';\n\n// === Types ===\n// Export types for programmatic usage\n// Config structure uses Flow.Setup and Flow.Config from @walkeros/core\nexport type {\n Flow,\n CLIBuildOptions,\n BuildOptions,\n MinifyOptions,\n} from './types/bundle.js';\nexport type { BundleStats } from './commands/bundle/bundler.js';\nexport type { SimulationResult } from './commands/simulate/types.js';\nexport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './commands/run/index.js';\nexport type { GlobalOptions } from './types/global.js';\n\nconst program = new Command();\n\nprogram\n .name('walkeros')\n .description('walkerOS CLI - Bundle and deploy walkerOS components')\n .version(VERSION);\n\n// Display startup banner before any command runs\nprogram.hook('preAction', (thisCommand, actionCommand) => {\n const options = actionCommand.opts();\n // Skip banner for --silent, --json, or --help flags\n if (!options.silent && !options.json) {\n console.log(chalk.hex('#01b5e2')(`walkerOS v${VERSION}`));\n }\n});\n\n// Bundle command\nprogram\n .command('bundle [file]')\n .description('Bundle NPM packages with custom code')\n .option('-f, --flow <name>', 'flow to build (for multi-flow configs)')\n .option('--all', 'build all flows (for multi-flow configs)')\n .option('-s, --stats', 'show bundle statistics')\n .option('--json', 'output statistics in JSON format (implies --stats)')\n .option('--no-cache', 'disable package caching and download fresh packages')\n .option('-v, --verbose', 'verbose output')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .option('--dockerfile', 'generate Dockerfile alongside bundle')\n .action(async (file, options) => {\n await bundleCommand({\n config: file || 'bundle.config.json',\n flow: options.flow,\n all: options.all,\n stats: options.stats,\n json: options.json,\n cache: options.cache,\n verbose: options.verbose,\n dryRun: options.dryRun,\n silent: options.silent,\n dockerfile: options.dockerfile,\n });\n });\n\n// Simulate command\nprogram\n .command('simulate [file]')\n .description('Simulate event processing and capture API calls')\n .option(\n '-e, --event <source>',\n 'Event to simulate (JSON string, file path, or URL)',\n )\n .option('-p, --platform <platform>', 'Platform override (web or server)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await simulateCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n platform: options.platform,\n json: options.json,\n verbose: options.verbose,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Push command\nprogram\n .command('push [file]')\n .description('Push an event through the flow with real API execution')\n .requiredOption(\n '-e, --event <source>',\n 'Event to push (JSON string, file path, or URL)',\n )\n .option('--flow <name>', 'Flow name (for multi-flow configs)')\n .option('-p, --platform <platform>', 'Platform override (web or server)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('-s, --silent', 'Suppress output')\n .action(async (file, options) => {\n await pushCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n flow: options.flow,\n platform: options.platform,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n });\n });\n\n// Run command with subcommands\nconst runCmd = program\n .command('run')\n .description('Run walkerOS flows in collect or serve mode');\n\n// Run collect subcommand\nrunCmd\n .command('collect [file]')\n .description(\n 'Run collector mode (event collection endpoint). Defaults to server-collect.mjs if no file specified.',\n )\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('collect', {\n config: file || 'server-collect.mjs',\n port: options.port,\n host: options.host,\n json: options.json,\n verbose: options.verbose,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Run serve subcommand\nrunCmd\n .command('serve [file]')\n .description(\n 'Run serve mode (single-file server for browser bundles). Defaults to baked-in web-serve.js if no file specified.',\n )\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--name <filename>', 'Filename in URL (default: walker.js)')\n .option('--path <directory>', 'URL directory path (e.g., libs/v1)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('serve', {\n config: file || 'web-serve.js',\n port: options.port,\n host: options.host,\n serveName: options.name,\n servePath: options.path,\n json: options.json,\n verbose: options.verbose,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Cache command\nregisterCacheCommand(program);\n\n// Clean command\nregisterCleanCommand(program);\n\n// Run the CLI\n// Note: This file is marked as a bin script in package.json,\n// so it's always executed directly (never imported as a library)\nprogram.parse();\n","import { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\nconst versionFilename = fileURLToPath(import.meta.url);\nconst versionDirname = dirname(versionFilename);\n\n/**\n * Find package.json in parent directories\n * Handles both source (src/) and bundled (dist/) contexts\n */\nfunction findPackageJson(): string {\n const paths = [\n join(versionDirname, '../package.json'), // dist/ or src/\n join(versionDirname, '../../package.json'), // src/core/ (not used, but safe)\n ];\n for (const p of paths) {\n try {\n return readFileSync(p, 'utf-8');\n } catch {\n // Continue to next path\n }\n }\n return JSON.stringify({ version: '0.0.0' });\n}\n\n/** CLI package version */\nexport const VERSION: string = JSON.parse(findPackageJson()).version;\n","/**\n * Bundle Command\n *\n * Supports both single-flow and multi-flow builds.\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport {\n createCommandLogger,\n createTimer,\n createSuccessOutput,\n createErrorOutput,\n getErrorMessage,\n resolveAsset,\n} from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n loadAllFlows,\n type LoadConfigResult,\n} from '../../config/index.js';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { bundleCore } from './bundler.js';\nimport { displayStats, createStatsSummary } from './stats.js';\n\nexport interface BundleCommandOptions {\n config: string;\n flow?: string;\n all?: boolean;\n stats?: boolean;\n json?: boolean;\n cache?: boolean;\n verbose?: boolean;\n dryRun?: boolean;\n silent?: boolean;\n dockerfile?: boolean;\n}\n\nexport async function bundleCommand(\n options: BundleCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCommandLogger(options);\n\n // Handle dry-run\n if (options.dryRun) {\n logger.log(`[DRY-RUN] Would execute bundle with config: ${options.config}`);\n return;\n }\n\n try {\n // Validate flag combination\n if (options.flow && options.all) {\n throw new Error('Cannot use both --flow and --all flags together');\n }\n\n // Step 1: Read configuration file\n // Resolve bare names to examples directory, keep paths/URLs as-is\n const configPath = resolveAsset(options.config, 'config');\n const rawConfig = await loadJsonConfig(configPath);\n\n // Step 2: Load configuration(s) based on flags\n const configsToBundle: LoadConfigResult[] = options.all\n ? loadAllFlows(rawConfig, { configPath, logger })\n : [\n loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flow,\n logger,\n }),\n ];\n\n // Step 3: Bundle each configuration\n const results: Array<{\n flowName: string;\n success: boolean;\n stats?: unknown;\n error?: string;\n }> = [];\n\n for (const {\n flowConfig,\n buildOptions,\n flowName,\n isMultiFlow,\n } of configsToBundle) {\n try {\n // Override cache setting from CLI if provided\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // Log flow being built\n const configBasename = path.basename(configPath);\n if (isMultiFlow || options.all) {\n logger.log(`Bundling ${configBasename} (flow: ${flowName})...`);\n } else {\n logger.log(`Bundling ${configBasename}...`);\n }\n\n // Run bundler\n const shouldCollectStats = options.stats || options.json;\n const stats = await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n shouldCollectStats,\n );\n\n results.push({\n flowName,\n success: true,\n stats,\n });\n\n // Show stats if requested (for non-JSON, non-multi builds)\n if (!options.json && !options.all && options.stats && stats) {\n displayStats(stats, logger);\n }\n\n // Generate Dockerfile if requested\n if (options.dockerfile && !options.all) {\n const dockerfilePath = path.join(\n path.dirname(buildOptions.output),\n 'Dockerfile',\n );\n await generateDockerfile(dockerfilePath, buildOptions.output, logger);\n }\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n results.push({\n flowName,\n success: false,\n error: errorMessage,\n });\n\n if (!options.all) {\n throw error; // Re-throw for single flow builds\n }\n }\n }\n\n // Step 4: Report results\n const duration = timer.end() / 1000;\n const successCount = results.filter((r) => r.success).length;\n const failureCount = results.filter((r) => !r.success).length;\n\n if (options.json) {\n // JSON output for CI/CD\n const output =\n failureCount === 0\n ? createSuccessOutput(\n {\n flows: results,\n summary: {\n total: results.length,\n success: successCount,\n failed: failureCount,\n },\n },\n duration,\n )\n : createErrorOutput(\n `${failureCount} flow(s) failed to build`,\n duration,\n );\n logger.json(output);\n } else {\n if (options.all) {\n logger.log(\n `\\nBuild Summary: ${successCount}/${results.length} succeeded`,\n );\n if (failureCount > 0) {\n logger.error(`Failed: ${failureCount}`);\n }\n }\n\n if (failureCount > 0) {\n throw new Error(`${failureCount} flow(s) failed to build`);\n }\n }\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n // JSON error output for CI/CD\n const output = createErrorOutput(errorMessage, duration);\n logger.json(output);\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n process.exit(1);\n }\n}\n\n/**\n * High-level bundle function for programmatic usage.\n *\n * Handles configuration loading, parsing, and logger creation internally.\n *\n * @param configOrPath - Bundle configuration (Flow.Setup) or path to config file\n * @param options - Bundle options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.stats - Collect and return bundle statistics (default: false)\n * @param options.cache - Enable package caching (default: true)\n * @param options.flowName - Flow to use (required for multi-flow configs)\n * @returns Bundle statistics if stats option is true, otherwise void\n *\n * @example\n * ```typescript\n * // With Flow.Setup config object\n * await bundle({\n * version: 1,\n * flows: {\n * default: {\n * web: {},\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * destinations: { api: { code: 'destinationApi' } },\n * }\n * }\n * });\n *\n * // With config file\n * await bundle('./walker.config.json', { stats: true });\n * ```\n */\nexport async function bundle(\n configOrPath: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n stats?: boolean;\n cache?: boolean;\n flowName?: string;\n buildOverrides?: Partial<BuildOptions>;\n } = {},\n): Promise<import('./bundler').BundleStats | void> {\n // 1. Load config if path provided\n let rawConfig: unknown;\n // Use current working directory as base when config is passed as object\n let configPath = path.resolve(process.cwd(), 'walkeros.config.json');\n if (typeof configOrPath === 'string') {\n // Resolve bare names to examples directory, keep paths as-is\n configPath = resolveAsset(configOrPath, 'config');\n rawConfig = await loadJsonConfig(configPath);\n } else {\n rawConfig = configOrPath;\n }\n\n // 2. Load and resolve config using Flow.Setup format\n const { flowConfig, buildOptions } = loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flowName,\n buildOverrides: options.buildOverrides,\n });\n\n // 3. Handle cache option\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // 4. Create logger internally\n const logger = createCommandLogger(options);\n\n // 5. Call core bundler\n return await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n options.stats ?? false,\n );\n}\n\n/**\n * Generate a Dockerfile for the bundled flow.\n *\n * Creates a minimal Dockerfile that:\n * - Uses walkeros/flow:latest as base image\n * - Copies the bundled flow to /app/flow/bundle.mjs\n * - Sets required environment variables\n * - Exposes port 8080\n *\n * @param dockerfilePath - Path to write the Dockerfile\n * @param bundleOutput - Path to the bundled flow file\n * @param logger - Logger instance for output\n */\nasync function generateDockerfile(\n dockerfilePath: string,\n bundleOutput: string,\n logger: ReturnType<typeof createCommandLogger>,\n): Promise<void> {\n const bundleFilename = path.basename(bundleOutput);\n\n const dockerfile = `# Generated by walkeros CLI\nFROM walkeros/flow:latest\n\nCOPY ${bundleFilename} /app/flow/bundle.mjs\n\nENV MODE=collect\nENV FLOW=/app/flow/bundle.mjs\n\nEXPOSE 8080\n`;\n\n await fs.writeFile(dockerfilePath, dockerfile);\n logger.log(`Dockerfile: ${dockerfilePath}`);\n}\n","/* eslint-disable no-console */\nimport chalk from 'chalk';\nimport type { GlobalOptions } from '../types/global.js';\n\nconst BRAND_COLOR = '#01b5e2';\n\nexport interface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n}\n\nexport interface Logger {\n log: (...args: unknown[]) => void;\n brand: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n json: (data: unknown) => void;\n // Backward-compatible methods (map to default terminal color per design)\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n gray: (...args: unknown[]) => void;\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { verbose = false, silent = false, json = false } = options;\n\n const shouldLog = !silent && !json;\n const shouldDebug = verbose && !silent && !json;\n\n return {\n log: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n brand: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.hex(BRAND_COLOR)(message));\n }\n },\n\n error: (...args: unknown[]) => {\n if (!json) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.error(chalk.red(message));\n }\n },\n\n debug: (...args: unknown[]) => {\n if (shouldDebug) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(` ${message}`);\n }\n },\n\n json: (data: unknown) => {\n if (!silent) {\n console.log(JSON.stringify(data, null, 2));\n }\n },\n\n // Backward-compatible methods (all use default terminal color per design)\n info: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n success: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n warning: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n warn: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n gray: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n };\n}\n\n/**\n * Create logger from command options\n * Factory function that standardizes logger creation across commands\n *\n * @param options - Command options containing verbose, silent, and json flags\n * @returns Configured logger instance\n */\nexport function createCommandLogger(\n options: GlobalOptions & { json?: boolean },\n): Logger {\n return createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n}\n","import type { Logger as CoreLogger } from '@walkeros/core';\nimport type { Logger } from './logger.js';\n\n/**\n * Create collector logger config that forwards to CLI logger\n *\n * This bridges the CLI logger with the collector's internal logger,\n * allowing collector logs (from destinations, sources, etc.) to be\n * displayed through the CLI's output system.\n *\n * @param cliLogger - The CLI logger instance\n * @param verbose - Whether verbose mode is enabled\n * @returns Logger config for the collector\n */\nexport function createCollectorLoggerConfig(\n cliLogger: Logger,\n verbose?: boolean,\n): CoreLogger.Config {\n return {\n level: verbose ? 'DEBUG' : 'ERROR',\n handler: (level, message, context, scope) => {\n const scopePath = scope.length > 0 ? `[${scope.join(':')}] ` : '';\n const hasContext = Object.keys(context).length > 0;\n const contextStr = hasContext ? ` ${JSON.stringify(context)}` : '';\n\n if (level === 0) {\n // ERROR - always show\n cliLogger.error(`${scopePath}${message}${contextStr}`);\n } else if (verbose) {\n // INFO or DEBUG - only show if verbose\n cliLogger.debug(`${scopePath}${message}${contextStr}`);\n }\n },\n };\n}\n","/**\n * Timer utilities for measuring execution time\n */\n\nexport interface Timer {\n start: () => void;\n end: () => number;\n getElapsed: () => number;\n format: () => string;\n}\n\n/**\n * Create a high-precision timer\n */\nexport function createTimer(): Timer {\n let startTime = 0;\n let endTime = 0;\n\n return {\n start() {\n startTime = Date.now();\n endTime = 0;\n },\n\n end() {\n endTime = Date.now();\n return endTime - startTime;\n },\n\n getElapsed() {\n const currentTime = endTime || Date.now();\n return currentTime - startTime;\n },\n\n format() {\n const elapsed = this.getElapsed();\n return (elapsed / 1000).toFixed(2) + 's';\n },\n };\n}\n","/**\n * Output formatting utilities for CLI commands\n */\n\nexport interface JsonOutput<T = Record<string, unknown>> {\n success: boolean;\n data?: T;\n error?: string;\n duration?: number;\n}\n\n/**\n * Create standardized JSON output for CLI commands\n */\nexport function createJsonOutput<T = Record<string, unknown>>(\n success: boolean,\n data?: T,\n error?: string,\n duration?: number,\n): JsonOutput<T> {\n return {\n success,\n ...(data && { data }),\n ...(error && { error }),\n ...(duration && { duration }),\n };\n}\n\n/**\n * Create success JSON output\n */\nexport function createSuccessOutput<T = Record<string, unknown>>(\n data?: T,\n duration?: number,\n): JsonOutput<T> {\n return createJsonOutput(true, data, undefined, duration);\n}\n\n/**\n * Create error JSON output\n */\nexport function createErrorOutput(\n error: string,\n duration?: number,\n): JsonOutput<never> {\n return createJsonOutput<never>(false, undefined, error, duration);\n}\n\n/**\n * Format bytes to KB with 2 decimal places\n */\nexport function formatBytes(bytes: number): string {\n return (bytes / 1024).toFixed(2);\n}\n\n/**\n * Format file size with appropriate unit\n */\nexport function formatFileSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(2)} ${units[unitIndex]}`;\n}\n","/**\n * Unified Temporary Directory Utility\n *\n * Single source of truth for all temp paths in the CLI.\n * All temp files go to ./.tmp/ relative to current working directory.\n */\n\nimport path from 'path';\n\nconst DEFAULT_TMP_ROOT = '.tmp';\n\n/**\n * Get a path within the temp directory.\n *\n * @param tmpDir - Custom temp directory (optional, for --tmp-dir flag)\n * @param segments - Path segments to join\n * @returns Absolute path within temp directory\n *\n * @example\n * ```typescript\n * getTmpPath() // → \"/cwd/.tmp\"\n * getTmpPath(undefined, 'entry.js') // → \"/cwd/.tmp/entry.js\"\n * getTmpPath(undefined, 'cache', 'builds') // → \"/cwd/.tmp/cache/builds\"\n * getTmpPath('/custom', 'cache') // → \"/custom/cache\"\n * ```\n */\nexport function getTmpPath(tmpDir?: string, ...segments: string[]): string {\n const root = tmpDir || DEFAULT_TMP_ROOT;\n // Always return absolute path (esbuild requirement)\n const absoluteRoot = path.isAbsolute(root) ? root : path.resolve(root);\n return path.join(absoluteRoot, ...segments);\n}\n\n/**\n * Get the default temp root directory.\n */\nexport function getDefaultTmpRoot(): string {\n return DEFAULT_TMP_ROOT;\n}\n","/**\n * Asset Resolver\n *\n * Unified path resolution for package assets (examples) and user assets.\n * Assets are always siblings to the CLI entry point (in dist/ for production).\n */\n\nimport { fileURLToPath } from 'url';\nimport { existsSync } from 'fs';\nimport path from 'path';\nimport { isUrl } from '../config/utils.js';\n\n/**\n * Cached asset directory to avoid repeated filesystem checks\n */\nlet cachedAssetDir: string | undefined;\n\n/**\n * Get the directory containing CLI assets (examples).\n *\n * In production: assets are in dist/ alongside the bundled CLI\n * In development: assets are at package root\n *\n * @returns Absolute path to assets directory\n */\nexport function getAssetDir(): string {\n if (cachedAssetDir) return cachedAssetDir;\n\n const currentFile = fileURLToPath(import.meta.url);\n let dir = path.dirname(currentFile);\n\n // Walk up until we find a directory with examples/ sibling\n while (dir !== path.dirname(dir)) {\n if (existsSync(path.join(dir, 'examples'))) {\n cachedAssetDir = dir;\n return dir;\n }\n dir = path.dirname(dir);\n }\n\n // Fallback to current file's directory (shouldn't happen if build is correct)\n cachedAssetDir = path.dirname(currentFile);\n return cachedAssetDir;\n}\n\n/**\n * Asset type for resolution strategy\n */\nexport type AssetType = 'config' | 'bundle';\n\n/**\n * Resolve asset path using unified strategy\n *\n * Resolution rules:\n * 1. Bare names (no / or \\) → Package asset (examples)\n * 2. Relative paths (./ or ../) → User asset relative to base directory\n * 3. Absolute paths → Use as-is\n *\n * @param assetPath - Path to resolve\n * @param assetType - Type of asset (determines package subdirectory)\n * @param baseDir - Base directory for relative paths (defaults to cwd)\n * @returns Absolute path to asset\n */\nexport function resolveAsset(\n assetPath: string,\n assetType: AssetType,\n baseDir?: string,\n): string {\n // URL → pass through unchanged\n if (isUrl(assetPath)) {\n return assetPath;\n }\n\n // Bare name → package asset (examples directory)\n if (!assetPath.includes('/') && !assetPath.includes('\\\\')) {\n const assetDir = getAssetDir();\n return path.join(assetDir, 'examples', assetPath);\n }\n\n // Absolute path → use as-is\n if (path.isAbsolute(assetPath)) {\n return assetPath;\n }\n\n // Relative path → resolve from base directory\n return path.resolve(baseDir || process.cwd(), assetPath);\n}\n","/**\n * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { getErrorMessage } from '../core/index.js';\nimport { getTmpPath } from '../core/tmp.js';\n\n/**\n * Check if a string is a valid URL\n *\n * @param str - String to check\n * @returns True if string is a valid HTTP/HTTPS URL\n */\nexport function isUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Download a file from a URL to a temporary location\n *\n * @param url - HTTP/HTTPS URL to download\n * @returns Path to downloaded temporary file\n * @throws Error if download fails or response is not OK\n *\n * @example\n * ```typescript\n * const tempPath = await downloadFromUrl('https://example.com/config.json')\n * // Returns: \"/tmp/walkeros-download-1647261462000-abc123.json\"\n * ```\n */\nexport async function downloadFromUrl(url: string): Promise<string> {\n if (!isUrl(url)) {\n throw new Error(`Invalid URL: ${url}`);\n }\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to download ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n // Write to .tmp/downloads/ directory\n const downloadsDir = getTmpPath(undefined, 'downloads');\n await fs.ensureDir(downloadsDir);\n\n // Use a consistent filename - always re-downloaded fresh anyway\n const tempPath = path.join(downloadsDir, 'flow.json');\n await fs.writeFile(tempPath, content, 'utf-8');\n\n return tempPath;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to download from URL: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Substitute environment variables in a string.\n *\n * @param value - String with ${VAR} placeholders\n * @returns String with environment variables substituted\n * @throws Error if environment variable is not found\n *\n * @example\n * ```typescript\n * substituteEnvVariables('${HOME}/config') // \"/Users/name/config\"\n * ```\n */\nexport function substituteEnvVariables(value: string): string {\n return value.replace(/\\${([^}]+)}/g, (_, envVar) => {\n const envValue = process.env[envVar];\n if (!envValue) {\n throw new Error(`Environment variable ${envVar} not found`);\n }\n return envValue;\n });\n}\n\n/**\n * Load and parse JSON configuration file from local path or URL.\n *\n * @param configPath - Path to JSON file or HTTP/HTTPS URL\n * @returns Parsed configuration object and cleanup function\n * @throws Error if file not found, download fails, or invalid JSON\n *\n * @example\n * ```typescript\n * // Local file\n * const config = await loadJsonConfig('./config.json')\n *\n * // Remote URL\n * const config = await loadJsonConfig('https://example.com/config.json')\n * ```\n */\nexport async function loadJsonConfig<T>(configPath: string): Promise<T> {\n let absolutePath: string;\n let isTemporary = false;\n\n // Check if input is a URL\n if (isUrl(configPath)) {\n // Download from URL to temp location\n absolutePath = await downloadFromUrl(configPath);\n isTemporary = true;\n } else {\n // Local file path\n absolutePath = path.resolve(configPath);\n\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(`Configuration file not found: ${absolutePath}`);\n }\n }\n\n try {\n const rawConfig = await fs.readJson(absolutePath);\n return rawConfig as T;\n } catch (error) {\n throw new Error(\n `Invalid JSON in config file: ${configPath}. ${error instanceof Error ? error.message : error}`,\n );\n } finally {\n // Clean up temporary downloaded file\n if (isTemporary) {\n try {\n await fs.remove(absolutePath);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n\n/**\n * Load JSON from inline string, file path, or URL.\n *\n * Supports three input formats:\n * 1. Inline JSON string - parsed directly\n * 2. Local file path - read and parsed\n * 3. HTTP/HTTPS URL - downloaded and parsed\n *\n * Detection priority:\n * 1. URL (http://, https://) → download and parse\n * 2. Existing file path → read and parse\n * 3. Valid JSON string → parse directly\n * 4. Simple string → treat as {name: string} for backward compatibility\n *\n * @param source - JSON string, file path, or URL\n * @param options - Optional configuration\n * @param options.name - Parameter name for error messages (e.g., \"event\", \"config\")\n * @param options.required - Throw error if source is empty (default: false)\n * @param options.fallback - Default value if source is empty\n * @returns Parsed JSON object\n * @throws Error if source is required but empty, or if loading/parsing fails\n *\n * @example\n * ```typescript\n * // Inline JSON\n * await loadJsonFromSource('{\"name\":\"order complete\",\"data\":{}}')\n *\n * // File path\n * await loadJsonFromSource('./examples/event.json')\n *\n * // URL\n * await loadJsonFromSource('https://example.com/event.json')\n *\n * // With options\n * await loadJsonFromSource(input, {\n * name: 'event',\n * required: true,\n * fallback: { name: 'default' }\n * })\n * ```\n */\nexport async function loadJsonFromSource<T = unknown>(\n source: string | undefined,\n options?: {\n name?: string;\n required?: boolean;\n fallback?: T;\n },\n): Promise<T> {\n const paramName = options?.name || 'input';\n\n // Handle empty/undefined input\n if (!source || source.trim() === '') {\n if (options?.required) {\n throw new Error(`${paramName} is required`);\n }\n if (options?.fallback !== undefined) {\n return options.fallback;\n }\n return {} as T;\n }\n\n const trimmedSource = source.trim();\n\n // 1. Check if URL\n if (isUrl(trimmedSource)) {\n try {\n const tempPath = await downloadFromUrl(trimmedSource);\n try {\n const data = await fs.readJson(tempPath);\n return data as T;\n } finally {\n // Clean up temp file\n try {\n await fs.remove(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n }\n } catch (error) {\n throw new Error(\n `Failed to load ${paramName} from URL ${trimmedSource}: ${getErrorMessage(error)}`,\n );\n }\n }\n\n // 2. Check if file path exists\n const resolvedPath = path.resolve(trimmedSource);\n if (await fs.pathExists(resolvedPath)) {\n try {\n const data = await fs.readJson(resolvedPath);\n return data as T;\n } catch (error) {\n throw new Error(\n `Failed to parse ${paramName} from file ${trimmedSource}: ${getErrorMessage(error)}`,\n );\n }\n }\n\n // 3. Try to parse as inline JSON\n try {\n const parsed = JSON.parse(trimmedSource);\n return parsed as T;\n } catch (jsonError) {\n // 4. Fallback: treat as event name string for backward compatibility\n // This allows simple strings like \"page view\" to work\n if (!trimmedSource.startsWith('{') && !trimmedSource.startsWith('[')) {\n return { name: trimmedSource } as T;\n }\n\n // If it looks like JSON but failed to parse, throw helpful error\n throw new Error(\n `Failed to parse ${paramName}. Input appears to be JSON but contains errors: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`,\n );\n }\n}\n","/**\n * Utility functions for the CLI package\n */\n\n/**\n * Extract error message from unknown error type\n * @param error - Unknown error object\n * @returns Error message as string\n */\nexport function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Logger } from './logger.js';\n\nexport interface LocalPackageInfo {\n name: string;\n absolutePath: string;\n distPath: string;\n hasDistFolder: boolean;\n}\n\n/**\n * Resolve and validate a local package path\n */\nexport async function resolveLocalPackage(\n packageName: string,\n localPath: string,\n configDir: string,\n logger: Logger,\n): Promise<LocalPackageInfo> {\n // Resolve relative to config file directory\n const absolutePath = path.isAbsolute(localPath)\n ? localPath\n : path.resolve(configDir, localPath);\n\n // Validate path exists\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(\n `Local package path not found: ${localPath} (resolved to ${absolutePath})`,\n );\n }\n\n // Validate package.json exists\n const pkgJsonPath = path.join(absolutePath, 'package.json');\n if (!(await fs.pathExists(pkgJsonPath))) {\n throw new Error(\n `No package.json found at ${absolutePath}. Is this a valid package directory?`,\n );\n }\n\n // Check for dist folder\n const distPath = path.join(absolutePath, 'dist');\n const hasDistFolder = await fs.pathExists(distPath);\n\n if (!hasDistFolder) {\n logger.warn(\n `⚠️ ${packageName}: No dist/ folder found. Using package root.`,\n );\n }\n\n return {\n name: packageName,\n absolutePath,\n distPath: hasDistFolder ? distPath : absolutePath,\n hasDistFolder,\n };\n}\n\n/**\n * Copy local package to target node_modules directory\n *\n * Copies package.json and dist/ folder to preserve the package structure\n * expected by module resolution (package.json exports reference ./dist/...)\n */\nexport async function copyLocalPackage(\n localPkg: LocalPackageInfo,\n targetDir: string,\n logger: Logger,\n): Promise<string> {\n const packageDir = path.join(targetDir, 'node_modules', localPkg.name);\n\n await fs.ensureDir(path.dirname(packageDir));\n\n // Always copy package.json for module resolution\n await fs.copy(\n path.join(localPkg.absolutePath, 'package.json'),\n path.join(packageDir, 'package.json'),\n );\n\n // Copy dist folder AS dist folder (preserving structure for exports like ./dist/index.mjs)\n if (localPkg.hasDistFolder) {\n await fs.copy(localPkg.distPath, path.join(packageDir, 'dist'));\n } else {\n // No dist folder - copy package root contents (excluding node_modules, etc.)\n const entries = await fs.readdir(localPkg.absolutePath);\n for (const entry of entries) {\n if (!['node_modules', '.turbo', '.git'].includes(entry)) {\n await fs.copy(\n path.join(localPkg.absolutePath, entry),\n path.join(packageDir, entry),\n );\n }\n }\n }\n\n logger.info(`📦 Using local: ${localPkg.name} from ${localPkg.absolutePath}`);\n\n return packageDir;\n}\n","/**\n * Input Detector\n *\n * Detects whether CLI input is a config JSON or pre-built bundle.\n * Supports both local files and URLs.\n */\n\nimport fs from 'fs-extra';\nimport { isUrl } from '../config/utils.js';\n\nexport type Platform = 'web' | 'server';\n\nexport type DetectedInput =\n | { type: 'config'; content: string }\n | { type: 'bundle'; content: string; platform: Platform };\n\n/**\n * Detect if input is config JSON or pre-built bundle.\n *\n * Detection: Try JSON.parse, if fails = bundle\n * Platform: .mjs = server, .js = web\n *\n * @param inputPath - Path to file or URL\n * @param platformOverride - Optional platform override\n * @returns Detected input type with content\n */\nexport async function detectInput(\n inputPath: string,\n platformOverride?: Platform,\n): Promise<DetectedInput> {\n // Load content (URL or local file)\n const content = await loadContent(inputPath);\n\n // Try parsing as JSON\n try {\n JSON.parse(content);\n return { type: 'config', content };\n } catch {\n // Not JSON, treat as bundle\n const platform = platformOverride ?? detectPlatformFromPath(inputPath);\n return { type: 'bundle', content, platform };\n }\n}\n\n/**\n * Detect platform from file extension.\n *\n * @param inputPath - Path to file or URL\n * @returns Platform based on extension (.mjs = server, .js = web)\n */\nexport function detectPlatformFromPath(inputPath: string): Platform {\n // Remove query params for URLs\n const cleanPath = inputPath.split('?')[0];\n return cleanPath.endsWith('.mjs') ? 'server' : 'web';\n}\n\n/**\n * Load content from URL or local file.\n *\n * @param inputPath - Path to file or URL\n * @returns File content as string\n */\nasync function loadContent(inputPath: string): Promise<string> {\n if (isUrl(inputPath)) {\n const response = await fetch(inputPath);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${inputPath}: ${response.status}`);\n }\n return response.text();\n }\n return fs.readFile(inputPath, 'utf8');\n}\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n * Uses Zod schemas from @walkeros/core for Flow.Setup validation.\n */\n\nimport type { Flow } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\n\nconst { safeParseSetup } = schemas;\n\n/**\n * Type guard: Check if value is a plain object.\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Detect platform from flow config.\n *\n * Platform is determined by the presence of `web` or `server` key.\n */\nexport function detectPlatform(\n flowConfig: Record<string, unknown>,\n): 'web' | 'server' | undefined {\n if ('web' in flowConfig && flowConfig.web !== undefined) {\n return 'web';\n }\n if ('server' in flowConfig && flowConfig.server !== undefined) {\n return 'server';\n }\n return undefined;\n}\n\n/**\n * Type guard: Check if config is a valid Flow.Setup structure.\n *\n * @remarks\n * Uses Zod validation from @walkeros/core.\n * Returns false instead of throwing on invalid input.\n *\n * @example\n * ```typescript\n * if (isFlowSetup(config)) {\n * const flowConfig = getFlowConfig(config, 'production');\n * }\n * ```\n */\nexport function isFlowSetup(data: unknown): data is Flow.Setup {\n const result = safeParseSetup(data);\n return result.success;\n}\n\n/**\n * Validate Flow.Setup and throw descriptive error if invalid.\n *\n * @remarks\n * Uses Zod validation from @walkeros/core.\n * Provides detailed error messages from Zod.\n *\n * @param data - Raw configuration data\n * @returns Validated Flow.Setup\n * @throws Error with descriptive message if validation fails\n */\nexport function validateFlowSetup(data: unknown): Flow.Setup {\n const result = safeParseSetup(data);\n\n if (!result.success) {\n // Format Zod errors for CLI display\n const errors = result.error.issues\n .map((issue) => {\n const path =\n issue.path.length > 0 ? issue.path.map(String).join('.') : 'root';\n return ` - ${path}: ${issue.message}`;\n })\n .join('\\n');\n\n throw new Error(`Invalid configuration:\\n${errors}`);\n }\n\n // Cast to Flow.Setup since Zod's inferred type is compatible but not identical\n return result.data as Flow.Setup;\n}\n\n/**\n * Get available flow names from a Flow.Setup.\n *\n * @param setup - Flow.Setup configuration\n * @returns Array of flow names\n */\nexport function getAvailableFlows(setup: Flow.Setup): string[] {\n return Object.keys(setup.flows);\n}\n","/**\n * Static Build Defaults\n *\n * Platform-specific build defaults for CLI bundling.\n * Build options are CLI concerns, separate from Flow configuration.\n */\n\nimport type { BuildOptions } from '../types/bundle.js';\n\n/**\n * Build defaults for web platform (browser bundles).\n *\n * @remarks\n * These settings produce browser-compatible IIFE bundles.\n */\nexport const WEB_BUILD_DEFAULTS: Omit<BuildOptions, 'output' | 'packages'> = {\n format: 'iife',\n platform: 'browser',\n target: 'es2020',\n minify: true,\n sourcemap: false,\n cache: true,\n windowCollector: 'collector',\n windowElb: 'elb',\n};\n\n/**\n * Build defaults for server platform (Node.js bundles).\n *\n * @remarks\n * These settings produce Node.js-compatible ESM bundles.\n */\nexport const SERVER_BUILD_DEFAULTS: Omit<BuildOptions, 'output' | 'packages'> =\n {\n format: 'esm',\n platform: 'node',\n target: 'node20',\n minify: true,\n sourcemap: false,\n cache: true,\n };\n\n/**\n * Default output paths by platform.\n */\nexport const DEFAULT_OUTPUT_PATHS = {\n web: './dist/walker.js',\n server: './dist/bundle.mjs',\n} as const;\n\n/**\n * Get build defaults for a platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @returns Platform-specific build defaults\n *\n * @example\n * ```typescript\n * const defaults = getBuildDefaults('web');\n * // { format: 'iife', platform: 'browser', ... }\n * ```\n */\nexport function getBuildDefaults(\n platform: 'web' | 'server',\n): Omit<BuildOptions, 'output' | 'packages'> {\n return platform === 'web' ? WEB_BUILD_DEFAULTS : SERVER_BUILD_DEFAULTS;\n}\n\n/**\n * Get default output path for a platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @returns Default output file path\n */\nexport function getDefaultOutput(platform: 'web' | 'server'): string {\n return DEFAULT_OUTPUT_PATHS[platform];\n}\n","/**\n * Configuration Loader\n *\n * Loads and parses Flow.Setup configurations using core getFlowConfig().\n * Build options are determined by static platform defaults.\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { getFlowConfig, getPlatform, type Flow } from '@walkeros/core';\nimport type { BuildOptions } from '../types/bundle.js';\nimport {\n validateFlowSetup,\n isFlowSetup,\n getAvailableFlows as getFlowNames,\n} from './validators.js';\nimport { getBuildDefaults, getDefaultOutput } from './build-defaults.js';\nimport { isUrl, loadJsonConfig } from './utils.js';\n\n/** Default folder for includes if it exists */\nconst DEFAULT_INCLUDE_FOLDER = './shared';\n\n/**\n * Result of configuration loading.\n */\nexport interface LoadConfigResult {\n /** Runtime event processing configuration */\n flowConfig: Flow.Config;\n /** Build-time configuration */\n buildOptions: BuildOptions;\n /** Name of the selected flow */\n flowName: string;\n /** Whether multiple flows are available */\n isMultiFlow: boolean;\n /** All available flow names */\n availableFlows: string[];\n}\n\n/**\n * Options for loading configuration.\n */\nexport interface LoadConfigOptions {\n /** Path to config file */\n configPath: string;\n /** Flow name to load (required for multi-flow, optional for single-flow) */\n flowName?: string;\n /** CLI build overrides (future: --output, --minify, etc.) */\n buildOverrides?: Partial<BuildOptions>;\n /** Logger for warnings */\n logger?: {\n warn: (message: string) => void;\n info: (message: string) => void;\n };\n}\n\n/**\n * Load and parse bundle configuration.\n *\n * @remarks\n * Uses Flow.Setup from @walkeros/core as the only config format.\n * - Validates config structure\n * - Uses core getFlowConfig() for variable/definition resolution\n * - Determines platform from resolved config\n * - Applies static build defaults based on platform\n *\n * @param rawConfig - Raw configuration object from JSON file\n * @param options - Loading options\n * @returns Parsed configuration with flow and build separated\n *\n * @example\n * ```typescript\n * const config = loadBundleConfig(rawConfig, {\n * configPath: './walkeros.config.json',\n * flowName: 'production',\n * });\n * ```\n */\nexport function loadBundleConfig(\n rawConfig: unknown,\n options: LoadConfigOptions,\n): LoadConfigResult {\n // Validate as Flow.Setup\n const setup = validateFlowSetup(rawConfig);\n const availableFlows = getFlowNames(setup);\n\n // Determine which flow to use\n const flowName = resolveFlow(setup, options.flowName, availableFlows);\n\n // Use core getFlowConfig() for resolution (variables, $refs, cascading)\n const flowConfig = getFlowConfig(setup, flowName);\n\n // Detect platform from resolved config\n const platform = getPlatform(flowConfig);\n if (!platform) {\n throw new Error(\n `Invalid configuration: flow \"${flowName}\" must have a \"web\" or \"server\" key.`,\n );\n }\n\n // Get static build defaults based on platform\n const buildDefaults = getBuildDefaults(platform);\n\n // Extract packages from flowConfig (if present)\n const packages = flowConfig.packages || {};\n\n // Output path: use --output if provided, otherwise default\n // Always relative to cwd, no dynamic resolution\n const output = options.buildOverrides?.output || getDefaultOutput(platform);\n\n // Get config directory for resolving includes and local packages\n // For URLs, use cwd since there's no local config directory\n const configDir = isUrl(options.configPath)\n ? process.cwd()\n : path.dirname(options.configPath);\n\n // Get includes from config or use default if ./shared exists\n let includes = setup.include;\n if (!includes) {\n const defaultIncludePath = path.resolve(configDir, DEFAULT_INCLUDE_FOLDER);\n if (fs.pathExistsSync(defaultIncludePath)) {\n includes = [DEFAULT_INCLUDE_FOLDER];\n }\n }\n\n // Merge build options: defaults + CLI overrides\n const buildOptions: BuildOptions = {\n ...buildDefaults,\n packages,\n output,\n include: includes,\n configDir,\n ...options.buildOverrides,\n };\n\n // Log flow selection\n const isMultiFlow = availableFlows.length > 1;\n if (isMultiFlow && options.logger) {\n options.logger.info(\n `📦 Using flow: ${flowName} (${availableFlows.length} total)`,\n );\n }\n\n return {\n flowConfig,\n buildOptions,\n flowName,\n isMultiFlow,\n availableFlows,\n };\n}\n\n/**\n * Resolve which flow to use.\n *\n * @param setup - Flow.Setup configuration\n * @param requestedFlow - Flow name from CLI (optional)\n * @param available - Available flow names\n * @returns Flow name to use\n * @throws Error if flow selection is invalid\n */\nfunction resolveFlow(\n setup: Flow.Setup,\n requestedFlow: string | undefined,\n available: string[],\n): string {\n // If only one flow, use it automatically\n if (available.length === 1) {\n return available[0];\n }\n\n // Multiple flows require explicit selection\n if (!requestedFlow) {\n throw new Error(\n `Multiple flows found. Please specify a flow using --flow flag.\\n` +\n `Available flows: ${available.join(', ')}`,\n );\n }\n\n // Validate the requested flow exists\n if (!available.includes(requestedFlow)) {\n throw new Error(\n `Flow \"${requestedFlow}\" not found in configuration.\\n` +\n `Available flows: ${available.join(', ')}`,\n );\n }\n\n return requestedFlow;\n}\n\n/**\n * Load all flows from a configuration.\n *\n * @remarks\n * Used by the --all flag to build all flows.\n *\n * @param rawConfig - Raw configuration object\n * @param options - Loading options (without flowName)\n * @returns Array of loaded configurations for all flows\n */\nexport function loadAllFlows(\n rawConfig: unknown,\n options: Omit<LoadConfigOptions, 'flowName'>,\n): LoadConfigResult[] {\n // Validate as Flow.Setup\n const setup = validateFlowSetup(rawConfig);\n const flows = getFlowNames(setup);\n\n if (options.logger) {\n options.logger.info(\n `📦 Loading all ${flows.length} flows: ${flows.join(', ')}`,\n );\n }\n\n // Load each flow\n return flows.map((name) =>\n loadBundleConfig(rawConfig, {\n ...options,\n flowName: name,\n }),\n );\n}\n\n/**\n * Get list of available flows from configuration.\n *\n * @param rawConfig - Raw configuration object\n * @returns Array of flow names\n */\nexport function getAvailableFlows(rawConfig: unknown): string[] {\n if (isFlowSetup(rawConfig)) {\n return getFlowNames(rawConfig);\n }\n return [];\n}\n\n/**\n * Load flow configuration from file or URL.\n *\n * Single entry point for all commands (bundle, simulate, push).\n * Handles URL vs local path detection automatically.\n *\n * @param configPath - Path to config file or URL\n * @param options - Loading options (flowName, logger, buildOverrides)\n * @returns Parsed configuration with flow and build options\n *\n * @example\n * ```typescript\n * const { flowConfig, buildOptions } = await loadFlowConfig('./flow.json');\n * const { flowConfig } = await loadFlowConfig('https://example.com/flow.json');\n * ```\n */\nexport async function loadFlowConfig(\n configPath: string,\n options?: Omit<LoadConfigOptions, 'configPath'>,\n): Promise<LoadConfigResult> {\n const rawConfig = await loadJsonConfig(configPath);\n return loadBundleConfig(rawConfig, { configPath, ...options });\n}\n","import esbuild from 'esbuild';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { packageNameToVariable } from '@walkeros/core';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { downloadPackages } from './package-manager.js';\nimport type { Logger } from '../../core/index.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport {\n isBuildCached,\n getCachedBuild,\n cacheBuild,\n} from '../../core/build-cache.js';\n\nexport interface BundleStats {\n totalSize: number;\n packages: { name: string; size: number }[];\n buildTime: number;\n treeshakingEffective: boolean;\n}\n\n/**\n * Copy included folders to output directory.\n * Used to make credential files and other assets available alongside the bundle.\n */\nasync function copyIncludes(\n includes: string[],\n sourceDir: string,\n outputDir: string,\n logger: Logger,\n): Promise<void> {\n for (const include of includes) {\n const sourcePath = path.resolve(sourceDir, include);\n const folderName = path.basename(include);\n const destPath = path.join(outputDir, folderName);\n\n if (await fs.pathExists(sourcePath)) {\n await fs.copy(sourcePath, destPath);\n logger.debug(`Copied ${include} to output`);\n // TODO: Add logging for copied folders\n } else {\n logger.debug(`Include folder not found: ${include}`);\n // TODO: Add logging for skipped folders (not found)\n }\n }\n}\n\n/**\n * Generate cache key content from flow config and build options.\n * Excludes non-deterministic fields (tempDir, output) from cache key.\n */\nfunction generateCacheKeyContent(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n): string {\n const configForCache = {\n flow: flowConfig,\n build: {\n ...buildOptions,\n // Exclude non-deterministic fields from cache key\n tempDir: undefined,\n output: undefined,\n },\n };\n return JSON.stringify(configForCache);\n}\n\nexport async function bundleCore(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n logger: Logger,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n // Use provided temp dir or default .tmp/\n const TEMP_DIR = buildOptions.tempDir || getTmpPath();\n\n // Check build cache if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowConfig, buildOptions);\n\n const cached = await isBuildCached(configContent);\n if (cached) {\n const cachedBuild = await getCachedBuild(configContent);\n if (cachedBuild) {\n logger.debug('Using cached build');\n\n // Write cached build to output\n const outputPath = path.resolve(buildOptions.output);\n await fs.ensureDir(path.dirname(outputPath));\n await fs.writeFile(outputPath, cachedBuild);\n\n const stats = await fs.stat(outputPath);\n const sizeKB = (stats.size / 1024).toFixed(1);\n logger.log(`Output: ${outputPath} (${sizeKB} KB, cached)`);\n\n // Return stats if requested\n if (showStats) {\n const stats = await fs.stat(outputPath);\n // Generate basic package stats from buildOptions\n const packageStats = Object.entries(buildOptions.packages).map(\n ([name, pkg]) => ({\n name: `${name}@${pkg.version || 'latest'}`,\n size: 0, // Size estimation not available for cached builds\n }),\n );\n return {\n totalSize: stats.size,\n packages: packageStats,\n buildTime: Date.now() - bundleStartTime,\n treeshakingEffective: true,\n };\n }\n return;\n }\n }\n }\n\n try {\n // Step 1: Ensure temporary directory exists\n await fs.ensureDir(TEMP_DIR);\n\n // Step 2: Download packages\n logger.debug('Downloading packages');\n // Convert packages object to array format expected by downloadPackages\n const packagesArray = Object.entries(buildOptions.packages).map(\n ([name, packageConfig]) => ({\n name,\n version: packageConfig.version || 'latest',\n path: packageConfig.path, // Pass local path if defined\n }),\n );\n // downloadPackages adds 'node_modules' subdirectory automatically\n const packagePaths = await downloadPackages(\n packagesArray,\n TEMP_DIR,\n logger,\n buildOptions.cache,\n buildOptions.configDir, // For resolving relative local paths\n );\n\n // Fix @walkeros packages to have proper ESM exports\n // This ensures Node resolves to .mjs files instead of .js (CJS)\n for (const [pkgName, pkgPath] of packagePaths.entries()) {\n if (pkgName.startsWith('@walkeros/')) {\n const pkgJsonPath = path.join(pkgPath, 'package.json');\n const pkgJson = await fs.readJSON(pkgJsonPath);\n\n // Add exports field to force ESM resolution\n if (!pkgJson.exports && pkgJson.module) {\n pkgJson.exports = {\n '.': {\n import: pkgJson.module,\n require: pkgJson.main,\n },\n };\n await fs.writeJSON(pkgJsonPath, pkgJson, { spaces: 2 });\n }\n }\n }\n\n // Step 3: Create package.json to enable ESM in temp directory\n // This ensures Node treats all .js files as ESM and resolves @walkeros packages correctly\n const packageJsonPath = path.join(TEMP_DIR, 'package.json');\n await fs.writeFile(\n packageJsonPath,\n JSON.stringify({ type: 'module' }, null, 2),\n );\n\n // Step 4: Create entry point\n logger.debug('Creating entry point');\n const entryContent = await createEntryPoint(\n flowConfig,\n buildOptions,\n packagePaths,\n );\n const entryPath = path.join(TEMP_DIR, 'entry.js');\n await fs.writeFile(entryPath, entryContent);\n\n // Step 4: Bundle with esbuild\n logger.debug(\n `Running esbuild (target: ${buildOptions.target || 'es2018'}, format: ${buildOptions.format})`,\n );\n const outputPath = path.resolve(buildOptions.output);\n\n // Ensure output directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n const esbuildOptions = createEsbuildOptions(\n buildOptions,\n entryPath,\n outputPath,\n TEMP_DIR,\n packagePaths,\n logger,\n );\n\n try {\n await esbuild.build(esbuildOptions);\n } catch (buildError) {\n // Enhanced error handling for build failures\n throw createBuildError(\n buildError as EsbuildError,\n buildOptions.code || '',\n );\n }\n\n // Get file size and calculate build time\n const outputStats = await fs.stat(outputPath);\n const sizeKB = (outputStats.size / 1024).toFixed(1);\n const buildTime = ((Date.now() - bundleStartTime) / 1000).toFixed(1);\n logger.log(`Output: ${outputPath} (${sizeKB} KB, ${buildTime}s)`);\n\n // Step 5: Cache the build result if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowConfig, buildOptions);\n const buildOutput = await fs.readFile(outputPath, 'utf-8');\n await cacheBuild(configContent, buildOutput);\n logger.debug('Build cached for future use');\n }\n\n // Step 6: Collect stats if requested\n let stats: BundleStats | undefined;\n if (showStats) {\n stats = await collectBundleStats(\n outputPath,\n buildOptions.packages,\n bundleStartTime,\n entryContent,\n );\n }\n\n // Step 7: Copy included folders to output directory\n if (buildOptions.include && buildOptions.include.length > 0) {\n const outputDir = path.dirname(outputPath);\n await copyIncludes(\n buildOptions.include,\n buildOptions.configDir || process.cwd(),\n outputDir,\n logger,\n );\n }\n\n // No auto-cleanup - user runs `walkeros clean` explicitly\n\n return stats;\n } catch (error) {\n throw error;\n }\n}\n\nasync function collectBundleStats(\n outputPath: string,\n packages: BuildOptions['packages'],\n startTime: number,\n entryContent: string,\n): Promise<BundleStats> {\n const stats = await fs.stat(outputPath);\n const totalSize = stats.size;\n const buildTime = Date.now() - startTime;\n\n // Estimate package sizes by analyzing imports in entry content\n const packageStats = Object.entries(packages).map(([name, pkg]) => {\n const importPattern = new RegExp(`from\\\\s+['\"]${name}['\"]`, 'g');\n const namedImportPattern = new RegExp(\n `import\\\\s+\\\\{[^}]*\\\\}\\\\s+from\\\\s+['\"]${name}['\"]`,\n 'g',\n );\n const hasImports =\n importPattern.test(entryContent) || namedImportPattern.test(entryContent);\n\n // Rough estimation: if package is imported, assign proportional size\n const packagesCount = Object.keys(packages).length;\n const estimatedSize = hasImports\n ? Math.floor(totalSize / packagesCount)\n : 0;\n\n return {\n name: `${name}@${pkg.version || 'latest'}`,\n size: estimatedSize,\n };\n });\n\n // Tree-shaking is effective if we use named imports (not wildcard imports)\n const hasWildcardImports = /import\\s+\\*\\s+as\\s+\\w+\\s+from/.test(entryContent);\n const treeshakingEffective = !hasWildcardImports;\n\n return {\n totalSize,\n packages: packageStats,\n buildTime,\n treeshakingEffective,\n };\n}\n\nfunction createEsbuildOptions(\n buildOptions: BuildOptions,\n entryPath: string,\n outputPath: string,\n tempDir: string,\n packagePaths: Map<string, string>,\n logger: Logger,\n): esbuild.BuildOptions {\n // Don't use aliases - they cause esbuild to bundle even external packages\n // Instead, use absWorkingDir to point to temp directory where node_modules is\n const alias: Record<string, string> = {};\n\n const baseOptions: esbuild.BuildOptions = {\n entryPoints: [entryPath],\n bundle: true,\n format: buildOptions.format as esbuild.Format,\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n absWorkingDir: tempDir, // Resolve modules from temp directory\n // alias removed - not needed with absWorkingDir\n mainFields: ['module', 'main'], // Prefer ESM over CJS\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\n sourcemap: buildOptions.sourcemap,\n resolveExtensions: ['.mjs', '.js', '.ts', '.json'], // Prefer .mjs\n\n // Enhanced minification options when minify is enabled\n ...(buildOptions.minify && {\n minifyWhitespace: buildOptions.minifyOptions?.whitespace ?? true,\n minifyIdentifiers: buildOptions.minifyOptions?.identifiers ?? true,\n minifySyntax: buildOptions.minifyOptions?.syntax ?? true,\n legalComments: buildOptions.minifyOptions?.legalComments ?? 'none',\n keepNames: buildOptions.minifyOptions?.keepNames ?? false,\n charset: 'utf8',\n }),\n };\n\n // Platform-specific configurations\n if (buildOptions.platform === 'browser') {\n baseOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n // For browser bundles, let users handle Node.js built-ins as needed\n baseOptions.external = buildOptions.external || [];\n } else if (buildOptions.platform === 'node') {\n // For Node.js bundles, mark Node built-ins as external\n const nodeBuiltins = [\n 'crypto',\n 'fs',\n 'path',\n 'os',\n 'util',\n 'stream',\n 'buffer',\n 'events',\n 'http',\n 'https',\n 'url',\n 'querystring',\n 'zlib',\n ];\n // Mark runtime dependencies as external\n // These packages are installed in the Docker container and should not be bundled\n // - express/cors: Runtime dependencies for server sources\n // Note: zod is bundled inline via @walkeros/core (not marked external)\n // Use wildcard patterns to match both ESM and CJS imports\n const npmPackages = ['express', 'express/*', 'cors', 'cors/*'];\n // All downloaded @walkeros packages will be bundled into the output\n // Only Node.js built-ins and runtime server packages (express/cors) are marked external\n baseOptions.external = buildOptions.external\n ? [...nodeBuiltins, ...npmPackages, ...buildOptions.external]\n : [...nodeBuiltins, ...npmPackages];\n\n // Add createRequire shim for ESM bundles with CJS external dependencies\n // This allows require() calls generated by esbuild to work in ESM context\n if (buildOptions.format === 'esm') {\n baseOptions.banner = {\n js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`,\n };\n }\n }\n\n // Set target if specified\n if (buildOptions.target) {\n baseOptions.target = buildOptions.target;\n } else if (buildOptions.platform === 'node') {\n baseOptions.target = 'node18';\n } else {\n baseOptions.target = 'es2018';\n }\n\n return baseOptions;\n}\n\n/**\n * Detects destination packages from flow configuration.\n * Extracts package names from destinations that have explicit 'package' field.\n */\nfunction detectDestinationPackages(flowConfig: Flow.Config): Set<string> {\n const destinationPackages = new Set<string>();\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string'\n ) {\n destinationPackages.add(destConfig.package);\n }\n // If no package field, skip auto-importing examples for this destination\n }\n }\n\n return destinationPackages;\n}\n\n/**\n * Detects source packages from flow configuration.\n * Extracts package names from sources that have explicit 'package' field.\n */\nfunction detectSourcePackages(flowConfig: Flow.Config): Set<string> {\n const sourcePackages = new Set<string>();\n const sources = (\n flowConfig as unknown as { sources?: Record<string, unknown> }\n ).sources;\n\n if (sources) {\n for (const [sourceKey, sourceConfig] of Object.entries(sources)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'package' in sourceConfig &&\n typeof sourceConfig.package === 'string'\n ) {\n sourcePackages.add(sourceConfig.package);\n }\n }\n }\n\n return sourcePackages;\n}\n\n/**\n * Detects explicit code imports from destinations and sources.\n * Returns a map of package names to sets of export names.\n */\nfunction detectExplicitCodeImports(\n flowConfig: Flow.Config,\n): Map<string, Set<string>> {\n const explicitCodeImports = new Map<string, Set<string>>();\n\n // Check destinations\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string' &&\n 'code' in destConfig &&\n typeof destConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n // Auto-generated code starts with '_' (from packageNameToVariable)\n const isAutoGenerated = destConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(destConfig.package)) {\n explicitCodeImports.set(destConfig.package, new Set());\n }\n explicitCodeImports.get(destConfig.package)!.add(destConfig.code);\n }\n }\n }\n }\n\n // Check sources\n const sources = (\n flowConfig as unknown as { sources?: Record<string, unknown> }\n ).sources;\n\n if (sources) {\n for (const [sourceKey, sourceConfig] of Object.entries(sources)) {\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'package' in sourceConfig &&\n typeof sourceConfig.package === 'string' &&\n 'code' in sourceConfig &&\n typeof sourceConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n // Auto-generated code starts with '_' (from packageNameToVariable)\n const isAutoGenerated = sourceConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(sourceConfig.package)) {\n explicitCodeImports.set(sourceConfig.package, new Set());\n }\n explicitCodeImports.get(sourceConfig.package)!.add(sourceConfig.code);\n }\n }\n }\n }\n\n return explicitCodeImports;\n}\n\ninterface ImportGenerationResult {\n importStatements: string[];\n examplesMappings: string[];\n}\n\n/**\n * Generates import statements and examples mappings from build packages.\n * Handles explicit imports, default imports for destinations/sources, and utility imports.\n */\nfunction generateImportStatements(\n packages: BuildOptions['packages'],\n destinationPackages: Set<string>,\n sourcePackages: Set<string>,\n explicitCodeImports: Map<string, Set<string>>,\n): ImportGenerationResult {\n const importStatements: string[] = [];\n const examplesMappings: string[] = [];\n const usedPackages = new Set([...destinationPackages, ...sourcePackages]);\n\n for (const [packageName, packageConfig] of Object.entries(packages)) {\n const isUsedByDestOrSource = usedPackages.has(packageName);\n const hasExplicitCode = explicitCodeImports.has(packageName);\n\n if (packageConfig.imports && packageConfig.imports.length > 0) {\n // Explicit imports (utilities) - existing logic\n // Remove duplicates within the same package\n const uniqueImports = [...new Set(packageConfig.imports)];\n\n // Handle special \"default as X\" syntax\n const defaultImports: string[] = [];\n const namedImports: string[] = [];\n\n for (const imp of uniqueImports) {\n if (imp.startsWith('default as ')) {\n defaultImports.push(imp.replace('default as ', ''));\n } else {\n namedImports.push(imp);\n }\n }\n\n // Generate import statements\n if (defaultImports.length > 0) {\n for (const defaultImport of defaultImports) {\n importStatements.push(\n `import ${defaultImport} from '${packageName}';`,\n );\n }\n }\n\n if (namedImports.length > 0) {\n const importList = namedImports.join(', ');\n importStatements.push(\n `import { ${importList} } from '${packageName}';`,\n );\n }\n\n // Check if this package imports examples and create mappings\n const examplesImport = uniqueImports.find((imp) =>\n imp.includes('examples as '),\n );\n if (examplesImport) {\n // Extract destination name and examples variable name\n // Format: \"examples as gtagExamples\" -> gtagExamples\n const examplesVarName = examplesImport.split(' as ')[1];\n // Get destination name from package (assumes @walkeros/web-destination-xxx format)\n const destinationMatch = packageName.match(\n /@walkeros\\/web-destination-(.+)$/,\n );\n if (destinationMatch) {\n const destinationName = destinationMatch[1];\n examplesMappings.push(\n ` ${destinationName}: typeof ${examplesVarName} !== 'undefined' ? ${examplesVarName} : undefined`,\n );\n }\n }\n } else if (hasExplicitCode) {\n // Package with explicit code specified in destinations/sources\n // → Generate named imports\n const codes = Array.from(explicitCodeImports.get(packageName)!);\n importStatements.push(\n `import { ${codes.join(', ')} } from '${packageName}';`,\n );\n } else if (isUsedByDestOrSource) {\n // Package used by destination/source but no explicit imports or code\n // → Generate default import\n const varName = packageNameToVariable(packageName);\n importStatements.push(`import ${varName} from '${packageName}';`);\n }\n // If package declared but not used by any dest/source, skip import\n\n // Examples are no longer auto-imported - simulator loads them dynamically\n }\n\n return { importStatements, examplesMappings };\n}\n\n/**\n * Creates the entry point code for the bundle.\n * Generates imports, config object, and platform-specific wrapper programmatically.\n */\nexport async function createEntryPoint(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n packagePaths: Map<string, string>,\n): Promise<string> {\n // Detect packages used by destinations and sources\n const destinationPackages = detectDestinationPackages(flowConfig);\n const sourcePackages = detectSourcePackages(flowConfig);\n const explicitCodeImports = detectExplicitCodeImports(flowConfig);\n\n // Generate import statements\n const { importStatements } = generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n explicitCodeImports,\n );\n\n const importsCode = importStatements.join('\\n');\n const hasFlow = destinationPackages.size > 0 || sourcePackages.size > 0;\n\n // If no sources/destinations, just return user code with imports (no flow wrapper)\n if (!hasFlow) {\n const userCode = buildOptions.code || '';\n return importsCode ? `${importsCode}\\n\\n${userCode}` : userCode;\n }\n\n // Build config object programmatically (DRY - single source of truth)\n const configObject = buildConfigObject(flowConfig, explicitCodeImports);\n\n // Generate platform-specific wrapper\n const wrappedCode = generatePlatformWrapper(\n configObject,\n buildOptions.code || '',\n buildOptions as {\n platform: string;\n windowCollector?: string;\n windowElb?: string;\n },\n );\n\n // Assemble final code\n return importsCode ? `${importsCode}\\n\\n${wrappedCode}` : wrappedCode;\n}\n\ninterface EsbuildError {\n errors?: Array<{\n text: string;\n location?: {\n file: string;\n line: number;\n column: number;\n };\n }>;\n message?: string;\n}\n\nfunction createBuildError(buildError: EsbuildError, code: string): Error {\n if (!buildError.errors || buildError.errors.length === 0) {\n return new Error(`Build failed: ${buildError.message || buildError}`);\n }\n\n const firstError = buildError.errors[0];\n const location = firstError.location;\n\n if (location && location.file && location.file.includes('entry.js')) {\n // Error is in our generated entry point (code)\n const line = location.line;\n const column = location.column;\n const codeLines = code.split('\\n');\n const errorLine = codeLines[line - 1] || '';\n\n return new Error(\n `Code syntax error at line ${line}, column ${column}:\\n` +\n ` ${errorLine}\\n` +\n ` ${' '.repeat(column - 1)}^\\n` +\n `${firstError.text}`,\n );\n }\n\n // Error is in package code or other build issue\n return new Error(\n `Build error: ${firstError.text}\\n` +\n (location\n ? ` at ${location.file}:${location.line}:${location.column}`\n : ''),\n );\n}\n\n/**\n * Build config object string from flow configuration.\n * Respects import strategy decisions from detectExplicitCodeImports.\n */\nexport function buildConfigObject(\n flowConfig: Flow.Config,\n explicitCodeImports: Map<string, Set<string>>,\n): string {\n const flowWithProps = flowConfig as unknown as {\n sources?: Record<\n string,\n { package: string; code?: string; config?: unknown; env?: unknown }\n >;\n destinations?: Record<\n string,\n { package: string; code?: string; config?: unknown; env?: unknown }\n >;\n collector?: unknown;\n };\n\n const sources = flowWithProps.sources || {};\n const destinations = flowWithProps.destinations || {};\n\n // Build sources\n const sourcesEntries = Object.entries(sources).map(([key, source]) => {\n const hasExplicitCode =\n source.code && explicitCodeImports.has(source.package);\n const codeVar = hasExplicitCode\n ? source.code\n : packageNameToVariable(source.package);\n\n const configStr = source.config ? processConfigValue(source.config) : '{}';\n const envStr = source.env\n ? `,\\n env: ${processConfigValue(source.env)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}\\n }`;\n });\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations).map(\n ([key, dest]) => {\n const hasExplicitCode =\n dest.code && explicitCodeImports.has(dest.package);\n const codeVar = hasExplicitCode\n ? dest.code\n : packageNameToVariable(dest.package);\n\n const configStr = dest.config ? processConfigValue(dest.config) : '{}';\n const envStr = dest.env\n ? `,\\n env: ${processConfigValue(dest.env)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}\\n }`;\n },\n );\n\n // Build collector\n const collectorStr = flowWithProps.collector\n ? `,\\n ...${processConfigValue(flowWithProps.collector)}`\n : '';\n\n return `{\n sources: {\n${sourcesEntries.join(',\\n')}\n },\n destinations: {\n${destinationsEntries.join(',\\n')}\n }${collectorStr}\n}`;\n}\n\n/**\n * Process config value for serialization.\n * Uses existing serializer utilities.\n */\nfunction processConfigValue(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\n/**\n * Generate platform-specific wrapper code.\n */\nexport function generatePlatformWrapper(\n configObject: string,\n userCode: string,\n buildOptions: {\n platform: string;\n windowCollector?: string;\n windowElb?: string;\n },\n): string {\n if (buildOptions.platform === 'browser') {\n // Web platform: IIFE with browser globals\n const windowAssignments = [];\n if (buildOptions.windowCollector) {\n windowAssignments.push(\n ` if (typeof window !== 'undefined') window['${buildOptions.windowCollector}'] = collector;`,\n );\n }\n if (buildOptions.windowElb) {\n windowAssignments.push(\n ` if (typeof window !== 'undefined') window['${buildOptions.windowElb}'] = elb;`,\n );\n }\n const assignments =\n windowAssignments.length > 0 ? '\\n' + windowAssignments.join('\\n') : '';\n\n return `(async () => {\n const config = ${configObject};\n\n ${userCode}\n\n const { collector, elb } = await startFlow(config);${assignments}\n})();`;\n } else {\n // Server platform: Export default function\n const codeSection = userCode ? `\\n ${userCode}\\n` : '';\n\n return `export default async function(context = {}) {\n const config = ${configObject};${codeSection}\n // Apply context overrides (e.g., logger config from CLI)\n if (context.logger) {\n config.logger = { ...config.logger, ...context.logger };\n }\n\n return await startFlow(config);\n}`;\n }\n}\n","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport {\n Logger,\n resolveLocalPackage,\n copyLocalPackage,\n} from '../../core/index.js';\nimport { getPackageCacheKey } from '../../core/cache-utils.js';\nimport { getTmpPath } from '../../core/tmp.js';\n\n/** Timeout for individual package downloads (60 seconds) */\nconst PACKAGE_DOWNLOAD_TIMEOUT_MS = 60000;\n\n/**\n * Wraps a promise with a timeout. Rejects with clear error if timeout exceeded.\n */\nasync function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n errorMessage: string,\n): Promise<T> {\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(errorMessage)), ms),\n );\n return Promise.race([promise, timeout]);\n}\n\nexport interface Package {\n name: string;\n version: string;\n path?: string; // Local path to package directory\n}\n\n/**\n * Gets the proper node_modules directory path for a package.\n * Creates standard npm structure: node_modules/@scope/package or node_modules/package\n * Supports multiple versions by appending version to non-scoped packages if needed.\n *\n * @example\n * getPackageDirectory('node_modules', '@walkeros/core', '0.2.0')\n * // → 'node_modules/@walkeros/core'\n *\n * getPackageDirectory('node_modules', 'lodash', '4.17.21')\n * // → 'node_modules/lodash'\n */\nfunction getPackageDirectory(\n baseDir: string,\n packageName: string,\n version: string,\n): string {\n // For scoped packages like @walkeros/core, preserve the scope structure\n // This creates: node_modules/@walkeros/core (standard npm structure)\n return path.join(baseDir, 'node_modules', packageName);\n}\n\nasync function getCachedPackagePath(\n pkg: Package,\n tmpDir?: string,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'packages');\n const cacheKey = await getPackageCacheKey(pkg.name, pkg.version);\n return path.join(cacheDir, cacheKey);\n}\n\nasync function isPackageCached(\n pkg: Package,\n tmpDir?: string,\n): Promise<boolean> {\n const cachedPath = await getCachedPackagePath(pkg, tmpDir);\n return fs.pathExists(cachedPath);\n}\n\nfunction validateNoDuplicatePackages(packages: Package[]): void {\n const packageMap = new Map<string, string[]>();\n\n // Group packages by name and collect their versions\n for (const pkg of packages) {\n if (!packageMap.has(pkg.name)) {\n packageMap.set(pkg.name, []);\n }\n packageMap.get(pkg.name)!.push(pkg.version);\n }\n\n // Check for duplicate packages with different versions\n const conflicts: string[] = [];\n for (const [name, versions] of packageMap.entries()) {\n const uniqueVersions = [...new Set(versions)];\n if (uniqueVersions.length > 1) {\n conflicts.push(`${name}: [${uniqueVersions.join(', ')}]`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(\n `Version conflicts detected:\\n${conflicts.map((c) => ` - ${c}`).join('\\n')}\\n\\n` +\n 'Each package must use the same version across all declarations. ' +\n 'Please update your configuration to use consistent versions.',\n );\n }\n}\n\n/**\n * Recursively resolve and download package dependencies\n */\nasync function resolveDependencies(\n pkg: Package,\n packageDir: string,\n logger: Logger,\n visited: Set<string> = new Set(),\n): Promise<Package[]> {\n const dependencies: Package[] = [];\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (visited.has(pkgKey)) {\n return dependencies;\n }\n visited.add(pkgKey);\n\n try {\n const packageJsonPath = path.join(packageDir, 'package.json');\n if (await fs.pathExists(packageJsonPath)) {\n const packageJson = await fs.readJson(packageJsonPath);\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.peerDependencies,\n };\n\n for (const [name, versionSpec] of Object.entries(deps)) {\n if (typeof versionSpec === 'string') {\n // Use the version spec as-is (pacote will resolve it)\n // This respects the package.json dependency requirements\n dependencies.push({ name, version: versionSpec });\n }\n }\n }\n } catch (error) {\n logger.debug(`Failed to read dependencies for ${pkgKey}: ${error}`);\n }\n\n return dependencies;\n}\n\nexport async function downloadPackages(\n packages: Package[],\n targetDir: string,\n logger: Logger,\n useCache = true,\n configDir?: string, // For resolving relative local paths\n): Promise<Map<string, string>> {\n const packagePaths = new Map<string, string>();\n const downloadQueue: Package[] = [...packages];\n const processed = new Set<string>();\n\n // Track user-specified packages (only these are logged per design)\n const userSpecifiedPackages = new Set(packages.map((p) => p.name));\n\n // Track packages that should use local paths (to prevent npm overwriting them)\n const localPackageMap = new Map<string, string>();\n for (const pkg of packages) {\n if (pkg.path) {\n localPackageMap.set(pkg.name, pkg.path);\n }\n }\n\n // Validate no duplicate packages with different versions in initial list\n validateNoDuplicatePackages(packages);\n\n // Ensure target directory exists\n await fs.ensureDir(targetDir);\n\n while (downloadQueue.length > 0) {\n const pkg = downloadQueue.shift()!;\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (processed.has(pkgKey)) {\n continue;\n }\n processed.add(pkgKey);\n\n // If this package was specified with a local path, use it even if discovered as a dependency\n if (!pkg.path && localPackageMap.has(pkg.name)) {\n pkg.path = localPackageMap.get(pkg.name);\n }\n\n // Handle local packages first\n if (pkg.path) {\n const localPkg = await resolveLocalPackage(\n pkg.name,\n pkg.path,\n configDir || process.cwd(),\n logger,\n );\n const installedPath = await copyLocalPackage(localPkg, targetDir, logger);\n packagePaths.set(pkg.name, installedPath);\n\n // Resolve dependencies from local package\n const deps = await resolveDependencies(pkg, installedPath, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n }\n\n const packageSpec = `${pkg.name}@${pkg.version}`;\n // Use proper node_modules structure: node_modules/@scope/package\n const packageDir = getPackageDirectory(targetDir, pkg.name, pkg.version);\n // Cache always uses the default .tmp/cache/packages location\n const cachedPath = await getCachedPackagePath(pkg);\n\n if (useCache && (await isPackageCached(pkg))) {\n // Only log user-specified packages per design\n if (userSpecifiedPackages.has(pkg.name)) {\n logger.debug(`Downloading ${packageSpec} (cached)`);\n }\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n await fs.copy(cachedPath, packageDir);\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies for cached package too\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n } catch (error) {\n logger.debug(\n `Failed to use cache for ${packageSpec}, downloading fresh: ${error}`,\n );\n }\n }\n\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n\n // Extract package to proper node_modules structure\n // Use environment variable for cache location (Docker-friendly)\n const cacheDir =\n process.env.NPM_CACHE_DIR || getTmpPath(undefined, 'cache', 'npm');\n await withTimeout(\n pacote.extract(packageSpec, packageDir, {\n // Force npm registry download, prevent workspace resolution\n registry: 'https://registry.npmjs.org',\n\n // Force online fetching from registry (don't use cached workspace packages)\n preferOnline: true,\n\n // Cache for performance\n cache: cacheDir,\n\n // Don't resolve relative to workspace context\n where: undefined,\n }),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Package download timed out after ${PACKAGE_DOWNLOAD_TIMEOUT_MS / 1000}s: ${packageSpec}`,\n );\n\n // Only log user-specified packages per design\n if (userSpecifiedPackages.has(pkg.name)) {\n // Get package size for display\n const pkgStats = await fs.stat(path.join(packageDir, 'package.json'));\n const pkgJsonSize = pkgStats.size;\n // Estimate total package size from package.json (rough approximation)\n const sizeKB = (pkgJsonSize / 1024).toFixed(1);\n logger.debug(`Downloading ${packageSpec} (${sizeKB} KB)`);\n }\n\n // Cache the downloaded package for future use\n if (useCache) {\n try {\n await fs.ensureDir(path.dirname(cachedPath));\n await fs.copy(packageDir, cachedPath);\n } catch (cacheError) {\n // Silent cache failures\n }\n }\n\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n } catch (error) {\n throw new Error(`Failed to download ${packageSpec}: ${error}`);\n }\n }\n\n return packagePaths;\n}\n","/**\n * Cache utility functions for hash-based cache keys\n *\n * Implements content-based and date-based cache invalidation for:\n * - NPM package cache (mutable versions include daily date)\n * - Build artifact cache (content + date hashing)\n */\n\nimport { getHashServer } from '@walkeros/server-core';\n\nconst HASH_LENGTH = 12;\n\n/**\n * Check if a version specifier is mutable (can change over time)\n */\nexport function isMutableVersion(version: string): boolean {\n return (\n version === 'latest' ||\n version.includes('^') ||\n version.includes('~') ||\n version.includes('*') ||\n version.includes('x')\n );\n}\n\n/**\n * Get today's date in YYYY-MM-DD format\n */\nexport function getTodayDate(): string {\n return new Date().toISOString().split('T')[0];\n}\n\n/**\n * Generate cache key for npm package.\n * Mutable versions include date for daily invalidation.\n * Exact versions are cached indefinitely.\n */\nexport async function getPackageCacheKey(\n packageName: string,\n version: string,\n date?: string,\n): Promise<string> {\n const safeName = packageName.replace(/\\//g, '-').replace(/@/g, '');\n\n if (isMutableVersion(version)) {\n const dateStr = date ?? getTodayDate();\n const input = `${safeName}@${version}:${dateStr}`;\n return getHashServer(input, HASH_LENGTH);\n }\n\n // Exact version - no date component\n const input = `${safeName}@${version}`;\n return getHashServer(input, HASH_LENGTH);\n}\n\n/**\n * Normalize JSON content for consistent hashing.\n * Handles whitespace and property order variations.\n */\nfunction normalizeJson(content: string): string {\n const parsed = JSON.parse(content);\n return JSON.stringify(parsed);\n}\n\n/**\n * Generate cache key for flow.json configuration.\n * Includes date for daily rebuild guarantee.\n */\nexport async function getFlowConfigCacheKey(\n content: string,\n date?: string,\n): Promise<string> {\n const dateStr = date ?? getTodayDate();\n const normalized = normalizeJson(content);\n const input = `${normalized}:${dateStr}`;\n return getHashServer(input, HASH_LENGTH);\n}\n","/**\n * Build artifact cache for flow.json configurations\n *\n * Caches compiled bundles based on configuration content + date.\n * Enables intelligent cache reuse with daily rebuild guarantee.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { getFlowConfigCacheKey } from './cache-utils.js';\nimport { getTmpPath } from './tmp.js';\n\n/**\n * Get the cache file path for a flow.json configuration\n */\nexport async function getBuildCachePath(\n configContent: string,\n tmpDir?: string,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'builds');\n const cacheKey = await getFlowConfigCacheKey(configContent);\n return path.join(cacheDir, `${cacheKey}.js`);\n}\n\n/**\n * Check if a cached build exists for the given configuration\n */\nexport async function isBuildCached(\n configContent: string,\n tmpDir?: string,\n): Promise<boolean> {\n const cachePath = await getBuildCachePath(configContent, tmpDir);\n return fs.pathExists(cachePath);\n}\n\n/**\n * Store a build artifact in the cache\n */\nexport async function cacheBuild(\n configContent: string,\n buildOutput: string,\n tmpDir?: string,\n): Promise<void> {\n const cachePath = await getBuildCachePath(configContent, tmpDir);\n await fs.ensureDir(path.dirname(cachePath));\n await fs.writeFile(cachePath, buildOutput, 'utf-8');\n}\n\n/**\n * Retrieve a cached build artifact\n */\nexport async function getCachedBuild(\n configContent: string,\n tmpDir?: string,\n): Promise<string | null> {\n const cachePath = await getBuildCachePath(configContent, tmpDir);\n\n if (await fs.pathExists(cachePath)) {\n return await fs.readFile(cachePath, 'utf-8');\n }\n\n return null;\n}\n","/**\n * Bundle statistics display utilities\n */\nimport { formatBytes } from '../../core/index.js';\nimport type { BundleStats } from './bundler.js';\nimport type { Logger } from '../../core/index.js';\n\n/**\n * Display detailed bundle statistics to console\n */\nexport function displayStats(stats: BundleStats, logger: Logger): void {\n logger.info('\\n📊 Bundle Statistics');\n logger.info('─'.repeat(50));\n\n // Total size\n const sizeKB = formatBytes(stats.totalSize);\n logger.info(`Total Size: ${sizeKB} KB`);\n\n // Build time\n const timeSeconds = (stats.buildTime / 1000).toFixed(2);\n logger.info(`Build Time: ${timeSeconds}s`);\n\n // Tree-shaking effectiveness\n const treeshakingStatus = stats.treeshakingEffective\n ? '✅ Effective'\n : '⚠️ Not optimal (consider using named imports)';\n logger.info(`Tree-shaking: ${treeshakingStatus}`);\n\n // Package breakdown\n if (stats.packages.length > 0) {\n logger.info(`\\nPackage Breakdown:`);\n stats.packages.forEach((pkg) => {\n if (pkg.size > 0) {\n const pkgSizeKB = formatBytes(pkg.size);\n logger.info(` • ${pkg.name}: ${pkgSizeKB} KB`);\n }\n });\n }\n\n logger.info('─'.repeat(50));\n}\n\n/**\n * Create stats summary for JSON output\n */\nexport function createStatsSummary(stats: BundleStats) {\n return {\n totalSize: stats.totalSize,\n totalSizeFormatted: `${formatBytes(stats.totalSize)} KB`,\n buildTime: stats.buildTime,\n buildTimeFormatted: `${(stats.buildTime / 1000).toFixed(2)}s`,\n treeshakingEffective: stats.treeshakingEffective,\n packageCount: stats.packages.length,\n packages: stats.packages.map((pkg) => ({\n name: pkg.name,\n size: pkg.size,\n sizeFormatted: `${formatBytes(pkg.size)} KB`,\n })),\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow, Logger as CoreLogger } from '@walkeros/core';\nimport { getPlatform } from '@walkeros/core';\nimport {\n createLogger,\n createCollectorLoggerConfig,\n getErrorMessage,\n detectInput,\n type Logger,\n type Platform,\n} from '../../core/index.js';\nimport {\n loadFlowConfig,\n isObject,\n type BuildOptions,\n} from '../../config/index.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport { CallTracker } from './tracker.js';\nimport { executeInJSDOM } from './jsdom-executor.js';\nimport { executeInNode } from './node-executor.js';\nimport { loadDestinationEnvs } from './env-loader.js';\nimport type { SimulateCommandOptions, SimulationResult } from './types.js';\n\n/**\n * Generate a unique ID for temp files\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Main simulation orchestrator\n */\nexport async function simulateCore(\n inputPath: string,\n event: unknown,\n options: Pick<\n SimulateCommandOptions,\n 'json' | 'verbose' | 'silent' | 'platform'\n > = {},\n): Promise<SimulationResult> {\n const logger = createLogger({\n verbose: options.verbose || false,\n silent: options.silent || false,\n json: options.json || false,\n });\n\n try {\n // Execute simulation\n logger.debug(`Simulating event: ${JSON.stringify(event)}`);\n const result = await executeSimulation(event, inputPath, options.platform, {\n logger,\n verbose: options.verbose,\n });\n\n return result;\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Simple result formatting\n */\nexport function formatSimulationResult(\n result: SimulationResult,\n options: Pick<SimulateCommandOptions, 'json'> = {},\n): string {\n if (options.json) {\n const output = {\n result: result.elbResult,\n usage: result.usage,\n duration: result.duration,\n };\n return JSON.stringify(output, null, 2);\n }\n\n if (result.success) {\n return 'Simulation completed';\n } else {\n return `Simulation failed: ${result.error}`;\n }\n}\n\n/**\n * Execute simulation using destination-provided mock environments.\n * Supports both config JSON and pre-built bundle inputs.\n */\nexport async function executeSimulation(\n event: unknown,\n inputPath: string,\n platformOverride?: Platform,\n options: { logger?: Logger; verbose?: boolean } = {},\n): Promise<SimulationResult> {\n const startTime = Date.now();\n const tempDir = getTmpPath();\n\n // Create collector logger config for forwarding logs\n const collectorLoggerConfig = options.logger\n ? createCollectorLoggerConfig(options.logger, options.verbose)\n : undefined;\n\n try {\n // Ensure temp directory exists\n await fs.ensureDir(tempDir);\n\n // Detect input type first (so file errors appear before event validation errors)\n const detected = await detectInput(inputPath, platformOverride);\n\n // Validate event format\n if (\n !isObject(event) ||\n !('name' in event) ||\n typeof event.name !== 'string'\n ) {\n throw new Error(\n 'Event must be an object with a \"name\" property of type string',\n );\n }\n\n const typedEvent = event as { name: string; data?: unknown };\n\n if (detected.type === 'config') {\n // Config flow: load config, bundle, execute with mocking\n return await executeConfigSimulation(\n detected.content,\n inputPath,\n typedEvent,\n tempDir,\n startTime,\n collectorLoggerConfig,\n );\n } else {\n // Bundle flow: execute directly without mocking\n return await executeBundleSimulation(\n detected.content,\n detected.platform!,\n typedEvent,\n tempDir,\n startTime,\n collectorLoggerConfig,\n );\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n return {\n success: false,\n error: getErrorMessage(error),\n duration,\n };\n } finally {\n // Cleanup temp directory and all its contents\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {\n // Ignore cleanup errors - temp dirs will be cleaned eventually\n });\n }\n }\n}\n\n/**\n * Execute simulation from config JSON (existing behavior with mocking)\n */\nasync function executeConfigSimulation(\n _content: string,\n configPath: string,\n typedEvent: { name: string; data?: unknown },\n tempDir: string,\n startTime: number,\n loggerConfig?: CoreLogger.Config,\n): Promise<SimulationResult> {\n // Load config\n const { flowConfig, buildOptions } = await loadFlowConfig(configPath);\n\n // Detect platform from flowConfig\n const platform = getPlatform(flowConfig);\n\n // Create tracker\n const tracker = new CallTracker();\n\n // Create temporary bundle\n const tempOutput = path.join(\n tempDir,\n `simulation-bundle-${generateId()}.${platform === 'web' ? 'js' : 'mjs'}`,\n );\n\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n // Create build options for simulation - platform-aware bundling\n const simulationBuildOptions: BuildOptions = {\n ...buildOptions,\n code: buildOptions.code || '',\n output: tempOutput,\n tempDir,\n ...(platform === 'web'\n ? {\n format: 'iife' as const,\n platform: 'browser' as const,\n windowCollector: 'collector',\n windowElb: 'elb',\n }\n : {\n format: 'esm' as const,\n platform: 'node' as const,\n }),\n };\n\n // Bundle (downloads packages internally)\n await bundleCore(\n flowConfig,\n simulationBuildOptions,\n createLogger({ silent: true }),\n false,\n );\n\n // Load env examples dynamically from destination packages\n const envs = await loadDestinationEnvs(destinations || {});\n\n // Execute based on platform\n let result;\n if (platform === 'web') {\n result = await executeInJSDOM(\n tempOutput,\n destinations || {},\n typedEvent,\n tracker,\n envs,\n 10000,\n );\n } else {\n result = await executeInNode(\n tempOutput,\n destinations || {},\n typedEvent,\n tracker,\n envs,\n 30000,\n loggerConfig ? { logger: loggerConfig } : {},\n );\n }\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n elbResult: result.elbResult,\n usage: result.usage,\n duration,\n logs: [],\n };\n}\n\n/**\n * Execute simulation from pre-built bundle (no mocking)\n */\nasync function executeBundleSimulation(\n bundleContent: string,\n platform: Platform,\n typedEvent: { name: string; data?: unknown },\n tempDir: string,\n startTime: number,\n loggerConfig?: CoreLogger.Config,\n): Promise<SimulationResult> {\n // Write bundle to temp file\n const tempOutput = path.join(\n tempDir,\n `bundle-${generateId()}.${platform === 'server' ? 'mjs' : 'js'}`,\n );\n await fs.writeFile(tempOutput, bundleContent, 'utf8');\n\n // Create empty tracker (no mocking for pre-built bundles)\n const tracker = new CallTracker();\n\n // Execute based on platform (no destinations/envs for pre-built bundles)\n let result;\n if (platform === 'web') {\n result = await executeInJSDOM(\n tempOutput,\n {},\n typedEvent,\n tracker,\n {},\n 10000,\n );\n } else {\n result = await executeInNode(\n tempOutput,\n {},\n typedEvent,\n tracker,\n {},\n 30000,\n loggerConfig ? { logger: loggerConfig } : {},\n );\n }\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n elbResult: result.elbResult,\n usage: result.usage,\n duration,\n logs: [],\n };\n}\n","/**\n * Call Tracker for Simulation\n *\n * Wraps mock environment functions to track API calls.\n * Used with destination-provided examples/env.ts mocks.\n */\n\nexport interface ApiCall {\n type: 'call';\n path: string;\n args: unknown[];\n timestamp: number;\n}\n\nexport class CallTracker {\n private calls: Map<string, ApiCall[]> = new Map();\n\n /**\n * Wrap a function to track its calls\n */\n wrapFunction(\n name: string,\n fn?: (...args: unknown[]) => unknown,\n ): (...args: unknown[]) => unknown {\n const self = this;\n const targetFn = fn || (() => {});\n\n return new Proxy(targetFn, {\n apply(_target, thisArg, args: unknown[]) {\n self.logCall(name, args);\n return targetFn.apply(thisArg, args);\n },\n });\n }\n\n /**\n * Wrap an environment object, tracking specified paths\n *\n * @param env - Environment object (from destination's examples/env.ts)\n * @param paths - Paths to track (e.g., ['gtag:window.gtag', 'gtag:window.dataLayer.push'])\n */\n wrapEnv<T extends Record<string, unknown>>(env: T, paths: string[]): T {\n const wrapped: Record<string, unknown> = {};\n\n // Deep clone the env object first\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === 'object' && value !== null) {\n wrapped[key] = Array.isArray(value)\n ? [...value]\n : { ...(value as Record<string, unknown>) };\n } else {\n wrapped[key] = value;\n }\n }\n\n // Wrap specified paths\n for (const fullPath of paths) {\n // Parse path: \"gtag:window.gtag\" → destKey=\"gtag\", path=\"window.gtag\"\n const [destKey, ...pathParts] = fullPath.split(':');\n const path = pathParts.join(':');\n\n if (!path) continue;\n\n // Remove \"call:\" prefix if present (from simulation array)\n const cleanPath = path.replace(/^call:/, '');\n const parts = cleanPath.split('.');\n\n let current: Record<string, unknown> = wrapped;\n let source: Record<string, unknown> | undefined = env;\n\n // Navigate to parent object\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n\n if (!current[part]) {\n current[part] = {};\n }\n\n current = current[part] as Record<string, unknown>;\n source =\n source && typeof source[part] === 'object' && source[part] !== null\n ? (source[part] as Record<string, unknown>)\n : undefined;\n }\n\n // Wrap the final property\n const finalKey = parts[parts.length - 1];\n const originalFn = source?.[finalKey];\n\n // Wrap with full path for tracking\n current[finalKey] = this.wrapFunction(\n `${destKey}:${cleanPath}`,\n typeof originalFn === 'function'\n ? (originalFn as (...args: unknown[]) => unknown)\n : undefined,\n );\n }\n\n return wrapped as T;\n }\n\n private logCall(fullPath: string, args: unknown[]): void {\n // Parse \"destKey:api.path\" → destKey and apiPath\n const [destKey, ...pathParts] = fullPath.split(':');\n const apiPath = pathParts.join(':');\n\n if (!this.calls.has(destKey)) {\n this.calls.set(destKey, []);\n }\n\n this.calls.get(destKey)!.push({\n type: 'call',\n path: apiPath,\n args,\n timestamp: Date.now(),\n });\n }\n\n getCalls(): Record<string, ApiCall[]> {\n return Object.fromEntries(this.calls);\n }\n\n reset(): void {\n this.calls.clear();\n }\n}\n","/**\n * JSDOM-based executor for simulating IIFE bundles\n *\n * Executes actual production IIFE bundles in a virtual DOM environment\n * with env-based mocking from destination examples.\n */\n\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport type { Elb } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport type { CallTracker, ApiCall } from './tracker.js';\n\nexport interface ExecutionResult {\n collector: unknown;\n elb: unknown;\n elbResult: Elb.PushResult | undefined;\n usage: Record<string, ApiCall[]>;\n duration: number;\n}\n\ninterface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Build sandbox from destination-provided envs\n *\n * Merges env mocks from each destination's envs, wrapping\n * specified paths with CallTracker for API call tracking.\n */\nfunction buildSandboxFromEnvs(\n envs: Record<string, DestinationEnv>,\n destinations: Record<string, unknown>,\n tracker: CallTracker,\n): { window: Record<string, unknown>; document: Record<string, unknown> } {\n // Base browser APIs (not provided by destinations)\n const baseBrowserMocks = {\n Image: class MockImage {\n src = '';\n onload = (() => {}) as unknown;\n onerror = (() => {}) as unknown;\n },\n fetch: async () => ({ ok: true, json: async () => ({}) }),\n location: { href: 'http://localhost' },\n navigator: { userAgent: 'Mozilla/5.0 (walkerOS Simulation)' },\n };\n\n const sandbox = {\n window: { ...baseBrowserMocks } as Record<string, unknown>,\n document: {} as Record<string, unknown>,\n };\n\n // Add destination-specific env mocks\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n const destEnv = envs[destKey];\n if (!destEnv?.push) continue;\n\n const mockEnv = destEnv.push;\n const trackPaths = destEnv.simulation || [];\n\n // Use existing CallTracker to wrap env\n const trackedEnv = tracker.wrapEnv(\n mockEnv as Record<string, unknown>,\n trackPaths.map((p) => `${destKey}:${p}`),\n );\n\n // Merge window properties\n if (trackedEnv.window && typeof trackedEnv.window === 'object') {\n Object.assign(sandbox.window, trackedEnv.window);\n }\n\n // Merge document properties\n if (trackedEnv.document && typeof trackedEnv.document === 'object') {\n Object.assign(sandbox.document, trackedEnv.document);\n }\n }\n\n return sandbox;\n}\n\n/**\n * Wait for async window property assignment\n *\n * IIFE bundles execute asynchronously and assign to window.\n * This helper polls until the property appears or timeout occurs.\n */\nfunction waitForWindowProperty(\n window: Record<string, unknown>,\n prop: string,\n timeout: number = 5000,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n\n const check = () => {\n if (window[prop] !== undefined) {\n resolve();\n } else if (Date.now() - start > timeout) {\n reject(\n new Error(\n `Timeout waiting for window.${prop}. ` +\n `IIFE may have failed to execute or assign to window.`,\n ),\n );\n } else {\n setImmediate(check);\n }\n };\n\n check();\n });\n}\n\n/**\n * Execute production IIFE bundle in JSDOM with env-based mocking\n *\n * Main orchestration function that:\n * 1. Creates JSDOM virtual DOM\n * 2. Builds sandbox from dynamically loaded envs\n * 3. Executes IIFE in JSDOM\n * 4. Waits for window.collector/elb assignment\n * 5. Runs event through elb\n * 6. Returns tracked API calls\n */\nexport async function executeInJSDOM(\n bundlePath: string,\n destinations: Record<string, unknown>,\n event: { name: string; data?: unknown },\n tracker: CallTracker,\n envs: Record<string, DestinationEnv>,\n timeout: number = 10000,\n): Promise<ExecutionResult> {\n const start = Date.now();\n\n // 1. Create JSDOM virtual DOM with console suppression\n const virtualConsole = new VirtualConsole();\n // Silent mode - don't pipe console output to process stdout/stderr\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously', // Allow script execution\n resources: 'usable',\n virtualConsole,\n });\n\n const { window } = dom;\n\n // 2. Build sandbox from dynamically loaded envs and inject into window\n const sandbox = buildSandboxFromEnvs(envs, destinations, tracker);\n Object.assign(window, sandbox.window);\n Object.assign(window.document, sandbox.document);\n\n // 3. Load and execute bundle code\n const bundleCode = await fs.readFile(bundlePath, 'utf8');\n\n try {\n window.eval(bundleCode);\n } catch (error) {\n throw new Error(`Bundle execution failed: ${getErrorMessage(error)}`);\n }\n\n // 4. Wait for window.collector and window.elb assignments\n try {\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'collector',\n timeout,\n );\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'elb',\n timeout,\n );\n } catch (error) {\n throw new Error(\n `Window property assignment failed: ${getErrorMessage(error)}`,\n );\n }\n\n const { collector, elb } = window as unknown as {\n collector: unknown;\n elb: (name: string, data?: unknown) => Promise<unknown>;\n };\n\n // 5. Run event through elb\n let elbResult: Elb.PushResult | undefined;\n try {\n elbResult = (await elb(event.name, event.data)) as\n | Elb.PushResult\n | undefined;\n } catch (error) {\n throw new Error(`Event execution failed: ${getErrorMessage(error)}`);\n }\n\n // 6. Return results with tracked calls\n return {\n collector,\n elb,\n elbResult,\n usage: tracker.getCalls(),\n duration: Date.now() - start,\n };\n}\n","/**\n * Node.js-based executor for simulating ESM server bundles\n *\n * Executes server bundles via dynamic import with env-based mocking.\n */\n\nimport { pathToFileURL } from 'url';\nimport type { Elb, Logger as CoreLogger } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport type { CallTracker, ApiCall } from './tracker.js';\n\nexport interface ExecutionResult {\n collector: unknown;\n elb: unknown;\n elbResult: Elb.PushResult | undefined;\n usage: Record<string, ApiCall[]>;\n duration: number;\n}\n\ninterface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Build global mocks from destination-provided envs\n */\nfunction buildGlobalMocksFromEnvs(\n envs: Record<string, DestinationEnv>,\n destinations: Record<string, unknown>,\n tracker: CallTracker,\n): Record<string, unknown> {\n const globalMocks: Record<string, unknown> = {};\n\n for (const [destKey] of Object.entries(destinations)) {\n const destEnv = envs[destKey];\n if (!destEnv?.push) continue;\n\n const mockEnv = destEnv.push;\n const trackPaths = destEnv.simulation || [];\n\n const trackedEnv = tracker.wrapEnv(\n mockEnv as Record<string, unknown>,\n trackPaths.map((p) => `${destKey}:${p}`),\n );\n\n Object.assign(globalMocks, trackedEnv);\n }\n\n return globalMocks;\n}\n\n/**\n * Inject mocks into global scope and return cleanup function\n */\nfunction injectGlobalMocks(mocks: Record<string, unknown>): () => void {\n const originalValues: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(mocks)) {\n originalValues[key] = (globalThis as Record<string, unknown>)[key];\n (globalThis as Record<string, unknown>)[key] = value;\n }\n\n return () => {\n for (const [key, value] of Object.entries(originalValues)) {\n if (value === undefined) {\n delete (globalThis as Record<string, unknown>)[key];\n } else {\n (globalThis as Record<string, unknown>)[key] = value;\n }\n }\n };\n}\n\n/**\n * Execute server ESM bundle in Node.js with env-based mocking\n */\nexport async function executeInNode(\n bundlePath: string,\n destinations: Record<string, unknown>,\n event: { name: string; data?: unknown },\n tracker: CallTracker,\n envs: Record<string, DestinationEnv>,\n timeout: number = 30000,\n context: { logger?: CoreLogger.Config } = {},\n): Promise<ExecutionResult> {\n const start = Date.now();\n\n const globalMocks = buildGlobalMocksFromEnvs(envs, destinations, tracker);\n const cleanupMocks = injectGlobalMocks(globalMocks);\n\n try {\n const executeWithTimeout = async (): Promise<ExecutionResult> => {\n // Jest has issues with file:// URLs in dynamic imports, use path directly\n // Outside Jest, use file:// URL with cache-busting to prevent module caching\n const importUrl = process.env.JEST_WORKER_ID\n ? bundlePath\n : `${pathToFileURL(bundlePath).href}?t=${Date.now()}`;\n\n const module = await import(importUrl);\n\n if (!module.default || typeof module.default !== 'function') {\n throw new Error('Bundle does not export default factory function');\n }\n\n const result = await module.default(context);\n\n if (\n !result ||\n !result.collector ||\n typeof result.collector.push !== 'function'\n ) {\n throw new Error(\n 'Factory function did not return valid result with collector',\n );\n }\n\n const { collector, elb } = result;\n\n let elbResult: Elb.PushResult | undefined;\n try {\n // Use collector.push directly (bypasses source handlers, same as push command)\n elbResult = await collector.push({\n name: event.name,\n data: event.data,\n });\n } catch (error) {\n throw new Error(`Event execution failed: ${getErrorMessage(error)}`);\n }\n\n return {\n collector,\n elb,\n elbResult,\n usage: tracker.getCalls(),\n duration: Date.now() - start,\n };\n };\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Server simulation timeout after ${timeout}ms`)),\n timeout,\n );\n });\n\n return await Promise.race([executeWithTimeout(), timeoutPromise]);\n } catch (error) {\n throw new Error(`Node execution failed: ${getErrorMessage(error)}`);\n } finally {\n cleanupMocks();\n }\n}\n","interface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\ninterface DestinationConfig {\n package?: string;\n config?: Record<string, unknown>;\n}\n\n/**\n * Dynamically loads env examples from destination packages.\n *\n * Imports from `/dev` subpath (e.g., '@walkeros/web-destination-gtag/dev')\n * and extracts the `env` object which contains:\n * - push: Mock environment with API functions (gtag, fbq, etc.)\n * - simulation: Array of tracking paths for call verification\n *\n * @param destinations - Destination configuration from flow config\n * @returns Map of destination key to env object\n */\nexport async function loadDestinationEnvs(\n destinations: Record<string, unknown>,\n): Promise<Record<string, DestinationEnv>> {\n const envs: Record<string, DestinationEnv> = {};\n\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n const typedConfig = destConfig as DestinationConfig;\n\n // Skip if no package field\n if (!typedConfig.package) {\n continue;\n }\n\n try {\n // Determine import path\n const packageName = typedConfig.package;\n const isDemoPackage = packageName.includes('-demo');\n const importPath = isDemoPackage ? packageName : `${packageName}/dev`;\n\n // Dynamic import\n const module = await import(importPath);\n\n // Extract env from examples\n const examplesModule = module.examples || module.default?.examples;\n const envModule = examplesModule?.env;\n\n if (envModule?.push) {\n envs[destKey] = {\n init: envModule.init,\n push: envModule.push,\n simulation: envModule.simulation || [],\n };\n }\n } catch {\n // Silently skip destinations without env or invalid packages\n }\n }\n\n return envs;\n}\n","import { simulateCore, formatSimulationResult } from './simulator.js';\nimport { createCommandLogger, getErrorMessage } from '../../core/index.js';\nimport { loadJsonFromSource } from '../../config/index.js';\nimport type { SimulateCommandOptions } from './types.js';\n\n/**\n * CLI command handler for simulate command\n */\nexport async function simulateCommand(\n options: SimulateCommandOptions,\n): Promise<void> {\n const logger = createCommandLogger(options);\n\n // Handle dry-run\n if (options.dryRun) {\n logger.log(\n `[DRY-RUN] Would execute simulate with config: ${options.config}`,\n );\n return;\n }\n\n const startTime = Date.now();\n\n try {\n // Load event from inline JSON, file path, or URL\n const event = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n\n // Execute simulation\n const result = await simulateCore(options.config, event, {\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n });\n\n // Add duration to result\n const resultWithDuration = {\n ...result,\n duration: (Date.now() - startTime) / 1000,\n };\n\n // Output results\n if (options.json) {\n logger.json(resultWithDuration);\n } else {\n const output = formatSimulationResult(resultWithDuration, {\n json: false,\n });\n logger.log(output);\n }\n\n // Exit with error code if simulation failed\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n logger.json({\n success: false,\n error: errorMessage,\n duration: (Date.now() - startTime) / 1000,\n });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n}\n\n/**\n * High-level simulate function for programmatic usage.\n *\n * Handles configuration loading internally and returns structured results.\n *\n * @param configOrPath - Bundle configuration object or path to config file\n * @param event - Event object to simulate\n * @param options - Simulation options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.json - Format output as JSON (default: false)\n * @returns Simulation result with success status, elb result, and usage data\n *\n * @example\n * ```typescript\n * // With config file\n * const result = await simulate('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n *\n * // With config object\n * const result = await simulate(\n * {\n * platform: 'web',\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * code: '...',\n * output: './bundle.js'\n * },\n * { name: 'page view' },\n * { silent: true }\n * );\n * ```\n */\nexport async function simulate(\n configOrPath: string | unknown,\n event: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n json?: boolean;\n } = {},\n): Promise<import('./types').SimulationResult> {\n // simulateCore currently only accepts file paths, so we need to handle that\n // For now, if configOrPath is not a string, throw an error with guidance\n if (typeof configOrPath !== 'string') {\n throw new Error(\n 'simulate() currently only supports config file paths. ' +\n 'Config object support will be added in a future version. ' +\n 'Please provide a path to a configuration file.',\n );\n }\n\n // Call core simulator\n return await simulateCore(configOrPath, event, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n });\n}\n\n// Re-export types and utilities for testing\nexport * from './types.js';\nexport * from './simulator.js';\nexport { executeInNode } from './node-executor.js';\n","import path from 'path';\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport {\n getPlatform,\n type Elb,\n type Logger as CoreLogger,\n} from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport {\n createCommandLogger,\n createCollectorLoggerConfig,\n getErrorMessage,\n detectInput,\n type Logger,\n type Platform,\n} from '../../core/index.js';\nimport { loadFlowConfig, loadJsonFromSource } from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport type { PushCommandOptions, PushResult } from './types.js';\n\n/**\n * CLI command handler for push command\n */\nexport async function pushCommand(options: PushCommandOptions): Promise<void> {\n const logger = createCommandLogger(options);\n const startTime = Date.now();\n let tempDir: string | undefined;\n\n try {\n // Step 1: Load event\n logger.debug('Loading event');\n const event = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n\n // Validate event format using Zod schema\n const eventResult = schemas.PartialEventSchema.safeParse(event);\n if (!eventResult.success) {\n const errors = eventResult.error.issues\n .map((issue) => `${String(issue.path.join('.'))}: ${issue.message}`)\n .join(', ');\n throw new Error(`Invalid event: ${errors}`);\n }\n\n const parsedEvent = eventResult.data as {\n name?: string;\n data?: Record<string, unknown>;\n };\n if (!parsedEvent.name) {\n throw new Error('Invalid event: Missing required \"name\" property');\n }\n\n // Create typed event object for execution\n const validatedEvent: { name: string; data: Record<string, unknown> } = {\n name: parsedEvent.name,\n data: (parsedEvent.data || {}) as Record<string, unknown>,\n };\n\n // Warn about event naming format (walkerOS business logic)\n if (!validatedEvent.name.includes(' ')) {\n logger.log(\n `Warning: Event name \"${validatedEvent.name}\" should follow \"ENTITY ACTION\" format (e.g., \"page view\")`,\n );\n }\n\n // Step 2: Detect input type (config or bundle)\n logger.debug('Detecting input type');\n const detected = await detectInput(options.config, options.platform);\n\n let result: PushResult;\n\n if (detected.type === 'config') {\n // Config flow: load config, bundle, execute\n result = await executeConfigPush(\n options,\n validatedEvent,\n logger,\n (dir) => {\n tempDir = dir;\n },\n );\n } else {\n // Bundle flow: execute directly\n const collectorLoggerConfig = createCollectorLoggerConfig(\n logger,\n options.verbose,\n );\n result = await executeBundlePush(\n detected.content,\n detected.platform,\n validatedEvent,\n logger,\n (dir) => {\n tempDir = dir;\n },\n { logger: collectorLoggerConfig },\n );\n }\n\n // Step 3: Output results\n const duration = Date.now() - startTime;\n\n if (options.json) {\n logger.json({\n success: result.success,\n event: result.elbResult,\n duration,\n });\n } else {\n // Standard output\n if (result.success) {\n logger.log('Event pushed successfully');\n if (result.elbResult && typeof result.elbResult === 'object') {\n const pushResult = result.elbResult as unknown as Record<\n string,\n unknown\n >;\n if ('id' in pushResult && pushResult.id) {\n logger.log(` Event ID: ${pushResult.id}`);\n }\n if ('entity' in pushResult && pushResult.entity) {\n logger.log(` Entity: ${pushResult.entity}`);\n }\n if ('action' in pushResult && pushResult.action) {\n logger.log(` Action: ${pushResult.action}`);\n }\n }\n logger.log(` Duration: ${duration}ms`);\n } else {\n logger.error(`Error: ${result.error}`);\n process.exit(1);\n }\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n logger.json({\n success: false,\n error: errorMessage,\n duration,\n });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n process.exit(1);\n } finally {\n // Cleanup temp directory\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {\n // Ignore cleanup errors\n });\n }\n }\n}\n\n/**\n * Execute push from config JSON (existing behavior)\n */\nasync function executeConfigPush(\n options: PushCommandOptions,\n validatedEvent: { name: string; data: Record<string, unknown> },\n logger: Logger,\n setTempDir: (dir: string) => void,\n): Promise<PushResult> {\n // Load config\n logger.debug('Loading flow configuration');\n const { flowConfig, buildOptions } = await loadFlowConfig(options.config, {\n flowName: options.flow,\n logger,\n });\n\n const platform = getPlatform(flowConfig);\n\n // Bundle to temp file in config directory (so Node.js can find node_modules)\n logger.debug('Bundling flow configuration');\n const configDir = buildOptions.configDir || process.cwd();\n const tempDir = path.join(\n configDir,\n '.tmp',\n `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n setTempDir(tempDir);\n await fs.ensureDir(tempDir);\n const tempPath = path.join(\n tempDir,\n `bundle.${platform === 'web' ? 'js' : 'mjs'}`,\n );\n\n const pushBuildOptions = {\n ...buildOptions,\n output: tempPath,\n format: platform === 'web' ? ('iife' as const) : ('esm' as const),\n platform: platform === 'web' ? ('browser' as const) : ('node' as const),\n ...(platform === 'web' && {\n windowCollector: 'collector',\n windowElb: 'elb',\n }),\n };\n\n await bundleCore(flowConfig, pushBuildOptions, logger, false);\n\n logger.debug(`Bundle created: ${tempPath}`);\n\n // Execute based on platform\n if (platform === 'web') {\n logger.debug('Executing in web environment (JSDOM)');\n return executeWebPush(tempPath, validatedEvent, logger);\n } else if (platform === 'server') {\n logger.debug('Executing in server environment (Node.js)');\n const collectorLoggerConfig = createCollectorLoggerConfig(\n logger,\n options.verbose,\n );\n return executeServerPush(tempPath, validatedEvent, logger, 60000, {\n logger: collectorLoggerConfig,\n });\n } else {\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\n/**\n * Execute push from pre-built bundle\n */\nasync function executeBundlePush(\n bundleContent: string,\n platform: Platform,\n validatedEvent: { name: string; data: Record<string, unknown> },\n logger: Logger,\n setTempDir: (dir: string) => void,\n context: { logger?: CoreLogger.Config } = {},\n): Promise<PushResult> {\n // Write bundle to temp file\n const tempDir = path.join(\n process.cwd(),\n '.tmp',\n `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n setTempDir(tempDir);\n await fs.ensureDir(tempDir);\n const tempPath = path.join(\n tempDir,\n `bundle.${platform === 'server' ? 'mjs' : 'js'}`,\n );\n await fs.writeFile(tempPath, bundleContent, 'utf8');\n\n logger.debug(`Bundle written to: ${tempPath}`);\n\n // Execute based on platform\n if (platform === 'web') {\n logger.debug('Executing in web environment (JSDOM)');\n return executeWebPush(tempPath, validatedEvent, logger);\n } else {\n logger.debug('Executing in server environment (Node.js)');\n return executeServerPush(tempPath, validatedEvent, logger, 60000, context);\n }\n}\n\n/**\n * Typed event input for push command\n */\ninterface PushEventInput {\n name: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Execute push for web platform using JSDOM with real APIs\n */\nasync function executeWebPush(\n bundlePath: string,\n event: PushEventInput,\n logger: Logger,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // Create JSDOM with silent console\n const virtualConsole = new VirtualConsole();\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously',\n resources: 'usable',\n virtualConsole,\n });\n\n const { window } = dom;\n\n // JSDOM provides fetch natively, no need to inject node-fetch\n\n // Load and execute bundle\n logger.debug('Loading bundle...');\n const bundleCode = await fs.readFile(bundlePath, 'utf8');\n window.eval(bundleCode);\n\n // Wait for window.collector assignment\n logger.debug('Waiting for collector...');\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'collector',\n 5000,\n );\n\n const windowObj = window as unknown as Record<string, unknown>;\n const collector = windowObj.collector as unknown as {\n push: (event: {\n name: string;\n data: Record<string, unknown>;\n }) => Promise<Elb.PushResult>;\n };\n\n // Push event directly to collector (bypasses source handlers)\n logger.log(`Pushing event: ${event.name}`);\n const elbResult = await collector.push({\n name: event.name,\n data: event.data,\n });\n\n return {\n success: true,\n elbResult,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Execute push for server platform using Node.js\n */\nasync function executeServerPush(\n bundlePath: string,\n event: PushEventInput,\n logger: Logger,\n timeout: number = 60000, // 60 second default timeout\n context: { logger?: CoreLogger.Config } = {},\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Server push timeout after ${timeout}ms`)),\n timeout,\n );\n });\n\n // Execute with timeout\n const executePromise = (async () => {\n // Dynamic import of ESM bundle\n logger.debug('Importing bundle...');\n const flowModule = await import(bundlePath);\n\n if (!flowModule.default || typeof flowModule.default !== 'function') {\n throw new Error('Bundle does not export default factory function');\n }\n\n // Call factory function to start flow (pass context for verbose logging)\n logger.debug('Calling factory function...');\n const result = await flowModule.default(context);\n\n if (\n !result ||\n !result.collector ||\n typeof result.collector.push !== 'function'\n ) {\n throw new Error(\n 'Factory function did not return valid result with collector',\n );\n }\n\n const { collector } = result;\n\n // Push event directly to collector (bypasses source handlers)\n logger.log(`Pushing event: ${event.name}`);\n const elbResult = await collector.push({\n name: event.name,\n data: event.data,\n });\n\n return {\n success: true,\n elbResult,\n duration: Date.now() - startTime,\n };\n })();\n\n // Race between execution and timeout\n return await Promise.race([executePromise, timeoutPromise]);\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Wait for window property to be assigned\n */\nfunction waitForWindowProperty(\n window: Record<string, unknown>,\n prop: string,\n timeout: number = 5000,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n\n const check = () => {\n if (window[prop] !== undefined) {\n resolve();\n } else if (Date.now() - start > timeout) {\n reject(\n new Error(\n `Timeout waiting for window.${prop}. IIFE may have failed to execute.`,\n ),\n );\n } else {\n setImmediate(check);\n }\n };\n\n check();\n });\n}\n\n// Export types\nexport type { PushCommandOptions, PushResult };\n","/**\n * Run Command\n *\n * Runs walkerOS flows using local runtime\n */\n\nimport path from 'path';\nimport {\n createCommandLogger,\n createTimer,\n getErrorMessage,\n} from '../../core/index.js';\nimport { validateMode, validateFlowFile, validatePort } from './validators.js';\nimport { prepareBundleForRun, isPreBuiltConfig } from './utils.js';\nimport { executeRunLocal } from './execution.js';\nimport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './types.js';\n\n/**\n * CLI command function for `walkeros run`\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Command options\n */\nexport async function runCommand(\n mode: string,\n options: RunCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCommandLogger(options);\n\n try {\n // Step 1: Validate inputs\n validateMode(mode);\n const configPath = validateFlowFile(options.config);\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Step 2: Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(configPath);\n\n let flowPath: string | null = null;\n\n if (mode === 'collect') {\n if (isPreBuilt) {\n // Use pre-built bundle directly\n flowPath = path.resolve(configPath);\n logger.debug(`Using pre-built flow: ${path.basename(flowPath)}`);\n } else {\n // Bundle JSON config first\n logger.debug('Building flow bundle');\n\n flowPath = await prepareBundleForRun(configPath, {\n verbose: options.verbose,\n silent: options.json || options.silent,\n });\n\n logger.debug('Bundle ready');\n }\n }\n\n // Step 3: Execute locally\n // Handle dry-run\n if (options.dryRun) {\n logger.log(`[DRY-RUN] Would execute locally: run ${mode}`);\n return;\n }\n\n // Execute locally using runtime module\n const modeLabel = mode === 'collect' ? 'Collector' : 'Server';\n logger.log(`Starting ${modeLabel}...`);\n\n await executeRunLocal(mode as 'collect' | 'serve', flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n });\n\n // Note: Server runs forever, so we won't reach here unless it fails\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n logger.json({\n success: false,\n mode,\n error: errorMessage,\n duration,\n });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n process.exit(1);\n }\n}\n\n/**\n * Programmatic run function\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Run options\n * @returns Run result\n *\n * @example\n * ```typescript\n * // Run with JSON config (bundles automatically)\n * await run('collect', {\n * config: './flow.json',\n * port: 8080\n * });\n *\n * // Run with pre-built bundle\n * await run('collect', {\n * config: './flow.mjs',\n * port: 8080\n * });\n * ```\n */\nexport async function run(\n mode: RunMode,\n options: RunOptions,\n): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\n // Validate inputs\n validateMode(mode);\n\n let flowFile: string;\n if (typeof options.config === 'string') {\n flowFile = validateFlowFile(options.config);\n } else {\n throw new Error('Programmatic run() requires config file path');\n }\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(flowFile);\n\n let flowPath: string;\n\n if (isPreBuilt) {\n flowPath = path.resolve(flowFile);\n } else {\n // Bundle JSON config\n flowPath = await prepareBundleForRun(flowFile, {\n verbose: options.verbose,\n silent: true,\n });\n }\n\n // Run the flow using local runtime\n await executeRunLocal(mode, flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n });\n\n // Success (though server runs forever, so we typically don't reach here)\n return {\n success: true,\n exitCode: 0,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n// Export types\nexport type { RunMode, RunCommandOptions, RunOptions, RunResult };\n","/**\n * Run Command Validators\n *\n * Validation logic for run command inputs.\n * Uses Zod schemas for type-safe validation.\n */\n\nimport { existsSync } from 'fs';\nimport { resolveAsset } from '../../core/asset-resolver.js';\nimport {\n RunModeSchema,\n PortSchema,\n type RunMode,\n} from '../../schemas/index.js';\n\n/**\n * Validates run mode using Zod schema.\n *\n * @param mode - Mode to validate\n * @throws Error if mode is invalid\n */\nexport function validateMode(mode: string): asserts mode is RunMode {\n const result = RunModeSchema.safeParse(mode);\n if (!result.success) {\n throw new Error(\n `Invalid mode: \"${mode}\"\\n` +\n ` Valid modes: collect, serve\\n` +\n ` Example: walkeros run collect ./flow.json`,\n );\n }\n}\n\n/**\n * Validates flow file exists.\n *\n * @remarks\n * File existence cannot be validated by Zod, so this remains a custom check.\n *\n * @param filePath - Path to flow configuration file (bare name, relative, or absolute)\n * @returns Absolute path to flow file\n * @throws Error if file doesn't exist\n */\nexport function validateFlowFile(filePath: string): string {\n // Use asset resolver to handle bare names, relative paths, and absolute paths\n const absolutePath = resolveAsset(filePath, 'bundle');\n\n if (!existsSync(absolutePath)) {\n throw new Error(\n `Flow file not found: ${filePath}\\n` +\n ` Resolved path: ${absolutePath}\\n` +\n ` Make sure the file exists and the path is correct`,\n );\n }\n\n return absolutePath;\n}\n\n/**\n * Validates port number using Zod schema.\n *\n * @param port - Port number to validate\n * @throws Error if port is invalid\n */\nexport function validatePort(port: number): void {\n const result = PortSchema.safeParse(port);\n if (!result.success) {\n throw new Error(\n `Invalid port: ${port}\\n` +\n ` Port must be an integer between 1 and 65535\\n` +\n ` Example: --port 8080`,\n );\n }\n}\n","/**\n * CLI Primitive Schemas\n *\n * Basic Zod schemas for CLI parameter validation.\n * Follows walkerOS patterns from @walkeros/core.\n */\n\nimport { z } from '@walkeros/core/dev';\n\n/**\n * Run mode schema.\n *\n * @remarks\n * Validates CLI run mode for the `run` command.\n * - `collect`: Run as event collector\n * - `serve`: Run as HTTP server\n */\nexport const RunModeSchema = z\n .enum(['collect', 'serve'])\n .describe('CLI run mode: collect events or serve HTTP');\n\nexport type RunMode = z.infer<typeof RunModeSchema>;\n\n/**\n * Port number schema.\n *\n * @remarks\n * Validates HTTP server port number.\n * Must be integer between 1-65535.\n */\nexport const PortSchema = z\n .number()\n .int('Port must be an integer')\n .min(1, 'Port must be at least 1')\n .max(65535, 'Port must be at most 65535')\n .describe('HTTP server port number');\n\n/**\n * File path schema.\n *\n * @remarks\n * Basic string validation for file paths.\n * File existence is checked separately (Zod can't check filesystem).\n */\nexport const FilePathSchema = z\n .string()\n .min(1, 'File path cannot be empty')\n .describe('Path to configuration file');\n","/**\n * Run Command Schemas\n *\n * Zod schemas for run command options validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { RunModeSchema, PortSchema, FilePathSchema } from './primitives';\n\n/**\n * Run command options schema.\n *\n * @remarks\n * Validates all options for the `walkeros run` command.\n */\nexport const RunOptionsSchema = z.object({\n mode: RunModeSchema,\n flow: FilePathSchema,\n port: PortSchema.default(8080),\n flowName: z.string().optional().describe('Specific flow name to run'),\n});\n\nexport type RunOptions = z.infer<typeof RunOptionsSchema>;\n","/**\n * Run Command Utilities\n *\n * Shared utilities for the run command\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { bundle } from '../bundle/index.js';\n\n/**\n * Prepares a JSON config file for execution by bundling it to a temporary location.\n *\n * Creates bundle in .tmp/ directory relative to config file (not /tmp)\n * so Node.js module resolution finds node_modules.\n *\n * @param configPath - Path to the JSON configuration file\n * @param options - Bundle options\n * @param options.verbose - Enable verbose logging\n * @param options.silent - Suppress output\n * @returns Path to the bundled output file\n */\nexport async function prepareBundleForRun(\n configPath: string,\n options: {\n verbose?: boolean;\n silent?: boolean;\n },\n): Promise<string> {\n // Create temp directory relative to config (ensures node_modules is findable)\n const configDir = path.dirname(path.resolve(configPath));\n const tempDir = path.join(\n configDir,\n '.tmp',\n `run-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n await fs.ensureDir(tempDir);\n\n // Generate output path in temp directory\n const tempPath = path.join(tempDir, 'bundle.mjs');\n\n // Bundle with proper output override\n await bundle(configPath, {\n cache: true,\n verbose: options.verbose,\n silent: options.silent,\n buildOverrides: {\n output: tempPath,\n format: 'esm',\n platform: 'node',\n },\n });\n\n return tempPath;\n}\n\n/**\n * Checks if a config file is pre-built or needs bundling\n *\n * @param configPath - Path to configuration file\n * @returns True if file is pre-built (js/mjs/cjs), false if needs bundling (json)\n */\nexport function isPreBuiltConfig(configPath: string): boolean {\n return (\n configPath.endsWith('.mjs') ||\n configPath.endsWith('.js') ||\n configPath.endsWith('.cjs')\n );\n}\n","import { createLogger, Level, type Logger } from '@walkeros/core';\nimport type { RuntimeConfig, ServeConfig } from '../../runtime/index.js';\nimport { runFlow, runServeMode } from '../../runtime/index.js';\n\n// Create logger for local execution - DEBUG level when VERBOSE, otherwise INFO\nconst logLevel = process.env.VERBOSE === 'true' ? Level.DEBUG : Level.INFO;\nconst loggerConfig: Logger.Config = { level: logLevel };\nconst logger = createLogger(loggerConfig);\n\n/**\n * Execute run command locally\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to flow bundle (required for collect, optional for serve)\n * @param options - Runtime options\n */\nexport async function executeRunLocal(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n serveName?: string;\n servePath?: string;\n },\n): Promise<void> {\n switch (mode) {\n case 'collect': {\n if (!flowPath) {\n throw new Error('Flow path is required for collect mode');\n }\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config, logger.scope('runner'), loggerConfig);\n break;\n }\n\n case 'serve': {\n const config: ServeConfig = {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n file: flowPath || undefined,\n };\n await runServeMode(config, logger.scope('serve'));\n break;\n }\n\n default:\n throw new Error(`Unknown mode: ${mode}`);\n }\n}\n","/**\n * Runtime executor for pre-built walkerOS flows\n *\n * This module runs pre-built .mjs flow bundles without any build-time operations.\n * All bundling, package downloading, and code generation happens BEFORE this runs.\n */\n\nimport { pathToFileURL } from 'url';\nimport { resolve, dirname } from 'path';\nimport type { Logger } from '@walkeros/core';\n\nexport interface RuntimeConfig {\n port?: number;\n host?: string;\n}\n\n/**\n * Run a pre-built flow bundle\n *\n * @param file - Absolute path to pre-built .mjs flow file\n * @param config - Optional runtime configuration\n * @param logger - Logger instance for output\n * @param loggerConfig - Optional logger config to forward to the flow's collector\n */\nexport async function runFlow(\n file: string,\n config: RuntimeConfig | undefined,\n logger: Logger.Instance,\n loggerConfig?: Logger.Config,\n): Promise<void> {\n logger.info(`Loading flow from ${file}`);\n\n try {\n const absolutePath = resolve(file);\n const flowDir = dirname(absolutePath);\n\n // Change working directory to flow's directory\n // This ensures relative paths (e.g., ./shared/credentials.json) work\n // consistently in both local and Docker execution modes\n process.chdir(flowDir);\n\n const fileUrl = pathToFileURL(absolutePath).href;\n const module = await import(fileUrl);\n\n if (!module.default || typeof module.default !== 'function') {\n logger.throw(\n `Invalid flow bundle: ${file} must export a default function`,\n );\n }\n\n // Execute the flow's factory function with runtime config and logger\n const flowContext = loggerConfig\n ? { ...config, logger: loggerConfig }\n : config;\n const result = await module.default(flowContext);\n\n if (!result || !result.collector) {\n logger.throw(`Invalid flow bundle: ${file} must return { collector }`);\n }\n\n const { collector } = result;\n\n logger.info('Flow running');\n if (config?.port) {\n logger.info(`Port: ${config.port}`);\n }\n\n // Graceful shutdown handler\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down gracefully...`);\n\n try {\n // Use collector's shutdown command if available\n if (collector.command) {\n await collector.command('shutdown');\n }\n logger.info('Shutdown complete');\n process.exit(0);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error during shutdown: ${message}`);\n process.exit(1);\n }\n };\n\n // Register shutdown handlers\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Keep process alive\n await new Promise(() => {});\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Failed to run flow: ${message}`);\n if (error instanceof Error && error.stack) {\n logger.debug('Stack trace:', { stack: error.stack });\n }\n throw error;\n }\n}\n","/**\n * Serve mode - serve single file (typically generated bundle)\n */\n\nimport express from 'express';\nimport { resolve } from 'path';\nimport type { Logger } from '@walkeros/core';\nimport { VERSION } from '../version';\n\nexport interface ServeConfig {\n port?: number;\n host?: string;\n servePath?: string;\n serveName?: string;\n file?: string;\n}\n\n/**\n * Run serve mode - serve single file (typically generated bundle)\n *\n * @param config - Server configuration\n * @param logger - Logger instance for output\n */\nexport async function runServeMode(\n config: ServeConfig | undefined,\n logger: Logger.Instance,\n): Promise<void> {\n // Port priority: ENV variable > config > default\n const port = process.env.PORT\n ? parseInt(process.env.PORT, 10)\n : config?.port || 8080;\n\n // Host priority: ENV variable > config > default\n const host = process.env.HOST || config?.host || '0.0.0.0';\n\n // File path: ENV variable > config > default (resolve to absolute)\n const file = resolve(process.env.FILE || config?.file || './dist/walker.js');\n\n // Serve name (filename in URL): ENV variable > config > default\n const serveName = process.env.SERVE_NAME || config?.serveName || 'walker.js';\n\n // Serve path (URL directory): ENV variable > config > default (empty = root)\n const servePath = process.env.SERVE_PATH || config?.servePath || '';\n\n // Build full URL path\n const urlPath = servePath ? `/${servePath}/${serveName}` : `/${serveName}`;\n\n logger.info('Starting single-file server...');\n logger.info(`File: ${file}`);\n logger.info(`URL: http://${host}:${port}${urlPath}`);\n\n try {\n const app = express();\n\n // Health check\n app.get('/health', (req, res) => {\n res.json({\n status: 'ok',\n version: VERSION,\n timestamp: Date.now(),\n mode: 'serve',\n file: file,\n url: urlPath,\n });\n });\n\n // Serve single file at custom URL path\n app.get(urlPath, (req, res) => {\n // Set content type before streaming\n res.type('application/javascript');\n\n // Allow dotfiles since file paths may include dotfile directories\n res.sendFile(file, { dotfiles: 'allow' }, (err) => {\n if (err && !res.headersSent) {\n const errCode = (err as NodeJS.ErrnoException).code;\n // Express 5 uses HTTP-style errors with status/statusCode\n const errStatus =\n (err as { status?: number; statusCode?: number }).status ||\n (err as { status?: number; statusCode?: number }).statusCode;\n\n // Log errors (except client disconnections)\n if (errCode !== 'ECONNABORTED') {\n logger.error(\n `sendFile error for ${file}: ${err.message} (code: ${errCode}, status: ${errStatus})`,\n );\n }\n\n // Send appropriate error response (check both Node.js codes and HTTP status)\n if (\n errStatus === 404 ||\n errCode === 'ENOENT' ||\n errCode === 'EISDIR' ||\n errCode === 'ENOTDIR'\n ) {\n res.status(404).send('File not found');\n } else if (errCode !== 'ECONNABORTED') {\n res.status(500).send('Internal server error');\n }\n }\n });\n });\n\n // Start server\n const server = app.listen(port, host, () => {\n logger.info(`Server listening on http://${host}:${port}`);\n logger.info(`GET ${urlPath} - Bundle file`);\n logger.info(`GET /health - Health check`);\n });\n\n // Graceful shutdown\n const shutdownHandler = (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n server.close(() => {\n logger.info('Server closed');\n process.exit(0);\n });\n };\n\n process.on('SIGTERM', () => shutdownHandler('SIGTERM'));\n process.on('SIGINT', () => shutdownHandler('SIGINT'));\n\n // Keep process alive\n await new Promise(() => {});\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Server failed: ${message}`);\n process.exit(1);\n }\n}\n","import fs from 'fs-extra';\nimport { Command } from 'commander';\nimport { getTmpPath, getDefaultTmpRoot } from '../core/tmp.js';\nimport { createLogger } from '../core/logger.js';\n\nexport function registerCacheCommand(program: Command): void {\n const cache = program.command('cache').description('Manage the CLI cache');\n\n cache\n .command('clear')\n .description('Clear all cached packages and builds')\n .option('--packages', 'Clear only package cache')\n .option('--builds', 'Clear only build cache')\n .option('--tmp-dir <dir>', 'Custom temp directory')\n .option('--silent', 'Suppress output')\n .action(async (options) => {\n const logger = createLogger({ silent: options.silent });\n const tmpDir = options.tmpDir;\n if (options.packages) {\n await fs.remove(getTmpPath(tmpDir, 'cache', 'packages'));\n logger.log('Package cache cleared');\n } else if (options.builds) {\n await fs.remove(getTmpPath(tmpDir, 'cache', 'builds'));\n logger.log('Build cache cleared');\n } else {\n await fs.remove(getTmpPath(tmpDir, 'cache'));\n logger.log('All caches cleared');\n }\n });\n\n cache\n .command('info')\n .description('Show cache statistics')\n .option('--tmp-dir <dir>', 'Custom temp directory')\n .option('--silent', 'Suppress output')\n .action(async (options) => {\n const logger = createLogger({ silent: options.silent });\n const tmpDir = options.tmpDir;\n const packagesDir = getTmpPath(tmpDir, 'cache', 'packages');\n const buildsDir = getTmpPath(tmpDir, 'cache', 'builds');\n\n const packageCount = await countEntries(packagesDir);\n const buildCount = await countEntries(buildsDir);\n\n logger.log(`Cache directory: ${getTmpPath(tmpDir, 'cache')}`);\n logger.log(`Cached packages: ${packageCount}`);\n logger.log(`Cached builds: ${buildCount}`);\n });\n}\n\n/**\n * Register the clean command to clear entire temp directory\n */\nexport function registerCleanCommand(program: Command): void {\n program\n .command('clean')\n .description('Clear the entire temp directory (.tmp/)')\n .option('--tmp-dir <dir>', 'Custom temp directory')\n .option('--silent', 'Suppress output')\n .action(async (options) => {\n const logger = createLogger({ silent: options.silent });\n const tmpDir = options.tmpDir || getDefaultTmpRoot();\n await fs.remove(tmpDir);\n logger.log(`Temp directory cleared: ${tmpDir}`);\n });\n}\n\nasync function countEntries(dir: string): Promise<number> {\n if (!(await fs.pathExists(dir))) return 0;\n const entries = await fs.readdir(dir);\n return entries.length;\n}\n"],"mappings":"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","names":["chalk","path","fs","fileURLToPath","path","path","path","path","fileURLToPath","path","path","fs","logger","fs","fs","path","path","fs","path","fs","path","fs","path","fs","input","path","fs","logger","fs","path","path","fs","logger","path","fs","stats","logger","logger","path","fs","path","fs","getPlatform","path","fs","resolve","fs","logger","fs","loggerConfig","getPlatform","path","logger","path","JSDOM","VirtualConsole","fs","getPlatform","schemas","logger","schemas","fs","getPlatform","path","VirtualConsole","JSDOM","waitForWindowProperty","resolve","path","existsSync","z","z","existsSync","path","fs","path","fs","createLogger","pathToFileURL","dirname","logger","loggerConfig","resolve","logger","resolve","createLogger","logger","path","fs","program","logger","fs","chalk"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@walkeros/cli",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "walkerOS CLI - Bundle and deploy walkerOS components",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -33,8 +33,8 @@
33
33
  "docker:publish": "bash scripts/publish-docker.sh"
34
34
  },
35
35
  "dependencies": {
36
- "@walkeros/core": "0.6.0",
37
- "@walkeros/server-core": "0.6.0",
36
+ "@walkeros/core": "0.7.0",
37
+ "@walkeros/server-core": "0.6.1",
38
38
  "chalk": "^5.6.2",
39
39
  "commander": "^14.0.2",
40
40
  "cors": "^2.8.5",