@walkeros/cli 2.1.1 → 2.2.0-next-1772811722420
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 +23 -0
- package/dist/cli.js +1308 -1156
- package/dist/examples/flow-complete.json +47 -5
- package/dist/index.d.ts +2211 -400
- package/dist/index.js +454 -393
- package/dist/index.js.map +1 -1
- package/dist/runtime/main.js +507 -367
- package/examples/flow-complete.json +47 -5
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/cli-logger.ts","../src/lib/config-file.ts","../src/core/auth.ts","../src/version.ts","../src/commands/run/heartbeat.ts","../src/commands/bundle/index.ts","../src/core/index.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/core/stdin.ts","../src/core/sse.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/upload.ts","../src/commands/bundle/stats.ts","../src/core/api-client.ts","../src/commands/simulate/simulator.ts","../src/commands/simulate/env-loader.ts","../src/commands/simulate/source-simulator.ts","../src/commands/simulate/index.ts","../src/commands/simulate/example-loader.ts","../src/commands/simulate/compare.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/schemas/validate.ts","../src/schemas/bundle.ts","../src/schemas/simulate.ts","../src/schemas/push.ts","../src/commands/run/utils.ts","../src/commands/run/execution.ts","../src/runtime/runner.ts","../src/runtime/heartbeat.ts","../src/commands/validate/index.ts","../src/commands/validate/validators/contract.ts","../src/commands/validate/validators/event.ts","../src/commands/validate/validators/flow.ts","../src/commands/validate/validators/mapping.ts","../src/commands/validate/validators/entry.ts","../src/commands/login/index.ts","../src/commands/logout/index.ts","../src/commands/auth/index.ts","../src/commands/projects/index.ts","../src/commands/flows/index.ts","../src/commands/deploy/index.ts","../src/commands/deployments/index.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk';\nimport { createLogger, Level } from '@walkeros/core';\nimport type { Logger } from '@walkeros/core';\n\nexport interface CLILoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n stderr?: boolean;\n}\n\n/**\n * Create a core Logger.Instance with CLI-appropriate behavior.\n *\n * Replaces the old CLI logger, adaptLogger, and createCollectorLoggerConfig.\n * One factory, one logger type, DRY.\n *\n * Behavior:\n * - ERROR: always shown (chalk red, via console.error) unless --json\n * - WARN: shown unless --silent or --json\n * - INFO: shown unless --silent or --json\n * - DEBUG: shown only with --verbose (and not --silent/--json)\n * - json(): shown unless --silent\n */\nexport function createCLILogger(\n options: CLILoggerOptions = {},\n): Logger.Instance {\n const {\n verbose = false,\n silent = false,\n json = false,\n stderr = false,\n } = options;\n const out = stderr ? console.error : console.log;\n\n return createLogger({\n // Let handler control visibility — pass everything through\n level: Level.DEBUG,\n handler: (level, message, _context, scope) => {\n // Build formatted message\n const scopePath = scope.length > 0 ? `[${scope.join(':')}] ` : '';\n const fullMessage = `${scopePath}${message}`;\n\n // ERROR: always shown unless json mode\n if (level === Level.ERROR) {\n if (!json) console.error(chalk.red(fullMessage));\n return;\n }\n\n // Non-errors suppressed in silent or json mode\n if (silent || json) return;\n\n // DEBUG: only with verbose\n if (level === Level.DEBUG) {\n if (!verbose) return;\n out(` ${fullMessage}`);\n return;\n }\n\n // WARN / INFO: normal output\n out(fullMessage);\n },\n jsonHandler: (data) => {\n if (!silent) out(JSON.stringify(data, null, 2));\n },\n });\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n existsSync,\n} from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport interface WalkerOSConfig {\n token: string;\n email: string;\n appUrl: string;\n}\n\n/**\n * Get the config directory path, respecting XDG_CONFIG_HOME\n */\nexport function getConfigDir(): string {\n const xdgConfig = process.env.XDG_CONFIG_HOME;\n const base = xdgConfig || join(homedir(), '.config');\n return join(base, 'walkeros');\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(): string {\n return join(getConfigDir(), 'config.json');\n}\n\n/**\n * Read the stored config, or null if not found\n */\nexport function readConfig(): WalkerOSConfig | null {\n const configPath = getConfigPath();\n try {\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content) as WalkerOSConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Write config to disk with 0600 permissions\n */\nexport function writeConfig(config: WalkerOSConfig): void {\n const dir = getConfigDir();\n mkdirSync(dir, { recursive: true });\n\n const configPath = getConfigPath();\n writeFileSync(configPath, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\n/**\n * Delete the config file (logout)\n */\nexport function deleteConfig(): boolean {\n const configPath = getConfigPath();\n if (existsSync(configPath)) {\n unlinkSync(configPath);\n return true;\n }\n return false;\n}\n\n/**\n * Resolve the API token using priority order:\n * 1. WALKEROS_TOKEN env var\n * 2. Config file (~/.config/walkeros/config.json)\n * 3. null (not authenticated)\n */\nexport function resolveToken(): {\n token: string;\n source: 'env' | 'config';\n} | null {\n const envToken = process.env.WALKEROS_TOKEN;\n if (envToken) return { token: envToken, source: 'env' };\n\n const config = readConfig();\n if (config?.token) return { token: config.token, source: 'config' };\n\n return null;\n}\n\n/**\n * Resolve the deploy token for container/heartbeat auth.\n * Only checks WALKEROS_DEPLOY_TOKEN env var (never stored in config file).\n */\nexport function resolveDeployToken(): string | null {\n return process.env.WALKEROS_DEPLOY_TOKEN ?? null;\n}\n\n/**\n * Resolve the app URL using priority order:\n * 1. WALKEROS_APP_URL env var\n * 2. Config file appUrl\n * 3. Default\n */\nexport function resolveAppUrl(): string {\n const envUrl = process.env.WALKEROS_APP_URL;\n if (envUrl) return envUrl;\n\n const config = readConfig();\n if (config?.appUrl) return config.appUrl;\n\n return 'https://app.walkeros.io';\n}\n","import {\n resolveToken,\n resolveAppUrl,\n resolveDeployToken,\n} from '../lib/config-file.js';\n\nexport function getToken(): string | undefined {\n const result = resolveToken();\n return result?.token;\n}\n\nexport function getAuthHeaders(): Record<string, string> {\n const token = getToken();\n if (!token) return {};\n return { Authorization: `Bearer ${token}` };\n}\n\nexport async function authenticatedFetch(\n url: string,\n init?: RequestInit,\n): Promise<Response> {\n const authHeaders = getAuthHeaders();\n const existingHeaders =\n init?.headers instanceof Headers\n ? Object.fromEntries(init.headers.entries())\n : Array.isArray(init?.headers)\n ? Object.fromEntries(init.headers)\n : (init?.headers ?? {});\n\n return fetch(url, {\n ...init,\n headers: { ...existingHeaders, ...authHeaders },\n });\n}\n\n/**\n * Fetch with deploy token priority for heartbeat calls.\n * Priority: WALKEROS_DEPLOY_TOKEN > WALKEROS_TOKEN > config file\n */\nexport async function deployAuthenticatedFetch(\n url: string,\n init?: RequestInit,\n): Promise<Response> {\n const deployToken = resolveDeployToken();\n const token = deployToken ?? getToken();\n\n if (!token)\n throw new Error(\n 'No authentication token available. Set WALKEROS_DEPLOY_TOKEN or run walkeros auth login.',\n );\n\n const existingHeaders =\n init?.headers instanceof Headers\n ? Object.fromEntries(init.headers.entries())\n : Array.isArray(init?.headers)\n ? Object.fromEntries(init.headers)\n : (init?.headers ?? {});\n\n return fetch(url, {\n ...init,\n headers: { ...existingHeaders, Authorization: `Bearer ${token}` },\n });\n}\n\nexport function resolveBaseUrl(): string {\n return resolveAppUrl();\n}\n\nexport function requireProjectId(): string {\n const projectId = process.env.WALKEROS_PROJECT_ID;\n if (!projectId) throw new Error('WALKEROS_PROJECT_ID not set.');\n return projectId;\n}\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","import { randomUUID } from 'crypto';\nimport {\n deployAuthenticatedFetch,\n requireProjectId,\n resolveBaseUrl,\n} from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { VERSION } from '../../version.js';\n\nexport interface HeartbeatOptions {\n deployment: string; // slug\n projectId?: string;\n url: string; // public URL of this server\n healthEndpoint?: string; // default: /health\n heartbeatInterval?: number; // seconds, default: 60\n}\n\nexport async function startHeartbeat(options: HeartbeatOptions) {\n const projectId = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n const instanceId = randomUUID();\n const healthEndpoint = options.healthEndpoint ?? '/health';\n const intervalSec = options.heartbeatInterval ?? 60;\n const log = createCLILogger();\n const startTime = Date.now();\n\n const heartbeatUrl = `${base}/api/projects/${projectId}/deployments/${options.deployment}/heartbeat`;\n\n // 1. Initial heartbeat (acts as registration)\n const initResponse = await deployAuthenticatedFetch(heartbeatUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n url: options.url,\n healthEndpoint,\n instanceId,\n cliVersion: VERSION,\n }),\n });\n\n if (!initResponse.ok) {\n const err = await initResponse.json().catch(() => ({}));\n throw new Error(\n (err as { error?: { message?: string } }).error?.message ||\n `Initial heartbeat failed (${initResponse.status})`,\n );\n }\n\n const initData = (await initResponse.json()) as {\n ack: boolean;\n deploymentId: string;\n action: string;\n };\n log.info(\n `Registered as ${instanceId} on deployment ${options.deployment} (${initData.deploymentId})`,\n );\n\n // 2. Ongoing heartbeat loop\n const heartbeatTimer = setInterval(async () => {\n try {\n const resp = await deployAuthenticatedFetch(heartbeatUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n instanceId,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n cliVersion: VERSION,\n metadata: {\n nodeVersion: process.version,\n platform: process.platform,\n },\n }),\n });\n\n if (resp.ok) {\n const data = (await resp.json()) as {\n action: string;\n versionNumber?: number;\n bundleUrl?: string;\n };\n if (data.action === 'update' && data.bundleUrl) {\n log.info(\n `Update available: version ${data.versionNumber}, downloading from ${data.bundleUrl}`,\n );\n // TODO: Hot-reload bundle from bundleUrl\n } else if (data.action === 'stop') {\n log.info('Received stop signal from server, shutting down...');\n await cleanup();\n process.exit(0);\n }\n }\n } catch (err) {\n log.error(\n `Heartbeat failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n );\n }\n }, intervalSec * 1000);\n\n // 3. Cleanup on shutdown\n const cleanup = async () => {\n clearInterval(heartbeatTimer);\n try {\n await deployAuthenticatedFetch(heartbeatUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n instanceId,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n shutting_down: true,\n }),\n });\n } catch {\n // Best effort\n }\n };\n\n process.on('SIGTERM', async () => {\n await cleanup();\n process.exit(0);\n });\n process.on('SIGINT', async () => {\n await cleanup();\n process.exit(0);\n });\n\n return { instanceId, deploymentId: initData.deploymentId, cleanup };\n}\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 { getPlatform } from '@walkeros/core';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n createTimer,\n createSuccessOutput,\n createErrorOutput,\n getErrorMessage,\n resolveAsset,\n getTmpPath,\n isStdinPiped,\n readStdin,\n writeResult,\n} from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n loadAllFlows,\n type LoadConfigResult,\n} from '../../config/index.js';\nimport { isUrl } from '../../config/utils.js';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { bundleCore } from './bundler.js';\nimport { uploadBundleToUrl, sanitizeUrl } from './upload.js';\nimport { displayStats, createStatsSummary } from './stats.js';\nimport { createApiClient } from '../../core/api-client.js';\n\nexport interface BundleCommandOptions {\n config?: string;\n output?: string;\n flow?: string;\n all?: boolean;\n stats?: boolean;\n json?: boolean;\n cache?: boolean;\n verbose?: boolean;\n silent?: boolean;\n dockerfile?: boolean | string;\n}\n\n/**\n * Resolve -o path: if directory, use platform-default filename.\n */\nfunction resolveOutputPath(output: string, buildOptions: BuildOptions): string {\n const resolved = path.resolve(output);\n const ext = path.extname(resolved);\n if (output.endsWith('/') || output.endsWith(path.sep) || !ext) {\n const filename =\n buildOptions.platform === 'browser' ? 'walker.js' : 'bundle.mjs';\n return path.join(resolved, filename);\n }\n return resolved;\n}\n\nexport async function bundleCommand(\n options: BundleCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n // When writing to stdout, redirect all logs to stderr\n const writingToStdout = !options.output;\n const logger = createCLILogger({\n ...options,\n stderr: writingToStdout,\n });\n\n try {\n // Validate flag combinations\n if (options.flow && options.all) {\n throw new Error('Cannot use both --flow and --all flags together');\n }\n if (options.all && writingToStdout) {\n throw new Error(\n 'Cannot use --all without --output (multiple bundles need file output)',\n );\n }\n\n // Step 1: Load config — from stdin or file\n let rawConfig: unknown;\n let configPath: string;\n\n if (isStdinPiped() && !options.config) {\n const stdinContent = await readStdin();\n try {\n rawConfig = JSON.parse(stdinContent);\n } catch {\n throw new Error('Invalid JSON received on stdin');\n }\n configPath = path.resolve(process.cwd(), 'stdin.config.json');\n } else {\n const file = options.config || 'bundle.config.json';\n configPath = resolveAsset(file, 'config');\n rawConfig = await loadJsonConfig(configPath);\n }\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 // Resolve output path\n const outputIsUrl = options.output ? isUrl(options.output) : false;\n const uploadUrl = outputIsUrl ? options.output : undefined;\n\n if (outputIsUrl) {\n // URL output: bundle to temp file, upload after\n const ext = buildOptions.platform === 'browser' ? '.js' : '.mjs';\n buildOptions.output = getTmpPath(\n undefined,\n `url-bundle-${Date.now()}${ext}`,\n );\n } else if (options.output) {\n buildOptions.output = resolveOutputPath(options.output, buildOptions);\n } else {\n // Stdout mode: bundle to temp file, then write to stdout\n const ext = buildOptions.platform === 'browser' ? '.js' : '.mjs';\n buildOptions.output = getTmpPath(undefined, 'stdout-bundle' + ext);\n }\n\n // Log flow being built\n if (isMultiFlow || options.all) {\n logger.info(`Bundling flow: ${flowName}...`);\n } else {\n logger.info('Bundling...');\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({ flowName, success: true, stats });\n\n // Upload to URL if output was a presigned URL\n if (uploadUrl) {\n await uploadBundleToUrl(buildOptions.output, uploadUrl);\n logger.info(`Uploaded to: ${sanitizeUrl(uploadUrl)}`);\n await fs.remove(buildOptions.output);\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 // Write bundle content to stdout if no -o and not --json\n // (--json writes JSON metadata to stdout instead)\n if (writingToStdout && !options.json) {\n const bundleContent = await fs.readFile(buildOptions.output);\n await writeResult(bundleContent, {});\n }\n\n // Dockerfile only with -o\n if (options.dockerfile && options.output) {\n const platform = getPlatform(flowConfig);\n if (platform) {\n const outputDir = path.dirname(buildOptions.output);\n const customFile =\n typeof options.dockerfile === 'string'\n ? options.dockerfile\n : undefined;\n await generateDockerfile(outputDir, platform, logger, customFile);\n }\n }\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n results.push({ flowName, success: false, error: errorMessage });\n\n if (!options.all) {\n throw error;\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 const jsonResult =\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 // JSON metadata is the result — write to stdout directly\n await writeResult(JSON.stringify(jsonResult, null, 2) + '\\n', {\n output: options.output,\n });\n } else {\n if (options.all) {\n logger.info(\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\n process.exit(0);\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const jsonError = createErrorOutput(errorMessage, duration);\n await writeResult(JSON.stringify(jsonError, null, 2) + '\\n', {\n output: options.output,\n });\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 = createCLILogger(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 or copy a Dockerfile for the bundled flow.\n *\n * Two modes:\n * - Generate mode: Creates a Dockerfile based on platform (web/server)\n * - Copy mode: Copies a custom Dockerfile if provided and exists\n *\n * @param outputDir - Directory to write the Dockerfile (dist/)\n * @param platform - Platform type ('web' or 'server')\n * @param logger - Logger instance for output\n * @param customFile - Optional path to custom Dockerfile to copy\n */\nasync function generateDockerfile(\n outputDir: string,\n platform: 'web' | 'server',\n logger: ReturnType<typeof createCLILogger>,\n customFile?: string,\n): Promise<void> {\n const destPath = path.join(outputDir, 'Dockerfile');\n\n // Copy mode: use custom file if it exists\n if (customFile && (await fs.pathExists(customFile))) {\n await fs.copy(customFile, destPath);\n logger.info(`Dockerfile: ${destPath} (copied from ${customFile})`);\n return;\n }\n\n // Generate mode: create based on platform\n const isWeb = platform === 'web';\n const bundleFile = isWeb ? 'walker.js' : 'bundle.mjs';\n\n const dockerfile = `# Generated by walkeros CLI\nFROM walkeros/flow:latest\n\nCOPY ${bundleFile} /app/flow/${bundleFile}\n\nENV BUNDLE=/app/flow/${bundleFile}\n\nEXPOSE 8080\n`;\n\n await fs.writeFile(destPath, dockerfile);\n logger.info(`Dockerfile: ${destPath}`);\n}\n\n/**\n * Bundle a flow remotely using the walkerOS cloud service.\n */\nexport async function bundleRemote(options: {\n content: Record<string, unknown>;\n flowName?: string;\n}) {\n const client = createApiClient();\n const body: Record<string, unknown> = { flow: options.content };\n if (options.flowName) body.flowName = options.flowName;\n const { data, error, response } = await client.POST('/api/bundle', {\n body: body as unknown as Record<string, never>,\n parseAs: 'text',\n });\n if (error)\n throw new Error(typeof error === 'string' ? error : 'Bundle failed');\n const js = data as unknown as string;\n const statsHeader = response.headers.get('X-Bundle-Stats');\n return {\n bundle: js,\n size: js.length,\n stats: statsHeader ? JSON.parse(statsHeader) : undefined,\n };\n}\n","export * from './cli-logger.js';\nexport * from './timer.js';\nexport * from './output.js';\nexport * from './tmp.js';\nexport * from './asset-resolver.js';\nexport * from './utils.js';\nexport * from './local-packages.js';\nexport * from './input-detector.js';\nexport * from './stdin.js';\nexport { getToken, getAuthHeaders, authenticatedFetch } from './auth.js';\nexport { parseSSEEvents } from './sse.js';\nexport type { SSEEvent, SSEParseResult } from './sse.js';\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\nimport fs from 'fs-extra';\nimport path from 'path';\n\n/**\n * Write command result to stdout or file.\n * Used by all commands to implement -o/--output flag.\n */\nexport async function writeResult(\n content: string | Buffer,\n options: { output?: string },\n): Promise<void> {\n if (options.output) {\n const outputPath = path.resolve(options.output);\n await fs.ensureDir(path.dirname(outputPath));\n await fs.writeFile(outputPath, content);\n } else {\n process.stdout.write(content);\n process.stdout.write('\\n');\n }\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 os.tmpdir() by default.\n */\n\nimport os from 'os';\nimport path from 'path';\n\nconst DEFAULT_TMP_ROOT = os.tmpdir();\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() // → \"/tmp\"\n * getTmpPath(undefined, 'entry.js') // → \"/tmp/entry.js\"\n * getTmpPath(undefined, 'cache', 'builds') // → \"/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 * Create a temp path resolver with the root directory baked in.\n *\n * Use this at entry points to capture the temp root once, then pass\n * the resolver to downstream functions. This prevents the class of bugs\n * where callers forget to pass tmpDir.\n *\n * @param tmpDir - Custom temp directory (optional, defaults to os.tmpdir())\n * @returns A function that resolves paths within the temp directory\n *\n * @example\n * ```typescript\n * const tmp = createTmpResolver(buildOptions.tempDir);\n * const cacheDir = tmp('cache', 'packages'); // root is baked in\n * ```\n */\nexport type TmpResolver = (...segments: string[]) => string;\n\nexport function createTmpResolver(tmpDir?: string): TmpResolver {\n const root = tmpDir || DEFAULT_TMP_ROOT;\n const absoluteRoot = path.isAbsolute(root) ? root : path.resolve(root);\n return (...segments: string[]) => 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';\nimport { authenticatedFetch } from '../core/auth.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 authenticatedFetch(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 '@walkeros/core';\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.Instance,\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.Instance,\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';\nimport { authenticatedFetch } from './auth.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 authenticatedFetch(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","export function isStdinPiped(): boolean {\n return !process.stdin.isTTY;\n}\n\nexport async function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const content = Buffer.concat(chunks).toString('utf-8');\n if (!content.trim()) {\n throw new Error('No input received on stdin');\n }\n return content;\n}\n","export interface SSEEvent {\n type: string;\n data: string;\n}\n\nexport interface SSEParseResult {\n parsed: SSEEvent[];\n remainder: string;\n}\n\nexport function parseSSEEvents(buffer: string): SSEParseResult {\n const events: SSEEvent[] = [];\n const blocks = buffer.split('\\n\\n');\n const remainder = blocks.pop() || '';\n\n for (const block of blocks) {\n if (!block.trim()) continue;\n\n let eventType = 'message'; // SSE default per spec\n const dataLines: string[] = [];\n\n for (const line of block.split('\\n')) {\n if (line.startsWith('event:')) {\n eventType = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice(5).trimStart());\n }\n // Ignore: comments (:), id:, retry:\n }\n\n if (dataLines.length > 0) {\n events.push({ type: eventType, data: dataLines.join('\\n') });\n }\n }\n\n return { parsed: events, remainder };\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 // Resolve with deferred mode first (markers don't affect platform detection)\n let flowConfig = getFlowConfig(setup, flowName, { deferred: true });\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 // For web: re-resolve without deferred to bake values at build time\n if (platform === 'web') {\n flowConfig = getFlowConfig(setup, flowName);\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, ENV_MARKER_PREFIX } from '@walkeros/core';\n\n/**\n * Type guard to check if a code value is an InlineCode object.\n * InlineCode has { push: string, type?: string, init?: string }\n */\nfunction isInlineCode(code: unknown): code is Flow.InlineCode {\n return (\n code !== null &&\n typeof code === 'object' &&\n !Array.isArray(code) &&\n 'push' in code\n );\n}\n\n/**\n * Validates that a reference has either package XOR code, not both or neither.\n * Throws descriptive error for invalid configurations.\n */\nfunction validateReference(\n type: string,\n name: string,\n ref: { package?: string; code?: unknown },\n): void {\n const hasPackage = !!ref.package;\n const hasCode = isInlineCode(ref.code);\n\n if (hasPackage && hasCode) {\n throw new Error(\n `${type} \"${name}\": Cannot specify both package and code. Use one or the other.`,\n );\n }\n if (!hasPackage && !hasCode) {\n throw new Error(`${type} \"${name}\": Must specify either package or code.`);\n }\n}\n\n/**\n * Generates inline code for any component type (source, destination, transformer).\n * Handles $code: prefix for push/init functions.\n *\n * @param inline - InlineCode object with push, optional init, optional type\n * @param config - Component configuration\n * @param env - Optional environment configuration\n * @param chain - Optional chain value (next for sources/transformers, before for destinations)\n * @param chainPropertyName - Name of chain property in output ('next' | 'before')\n * @param isDestination - Whether this is a destination (uses different code structure)\n */\nfunction generateInlineCode(\n inline: Flow.InlineCode,\n config: object,\n env?: object,\n chain?: string | string[],\n chainPropertyName?: 'next' | 'before',\n isDestination?: boolean,\n): string {\n const pushFn = inline.push.replace('$code:', '');\n const initFn = inline.init ? inline.init.replace('$code:', '') : undefined;\n const typeLine = inline.type ? `type: '${inline.type}',` : '';\n const chainLine =\n chain && chainPropertyName\n ? `${chainPropertyName}: ${JSON.stringify(chain)},`\n : '';\n\n // Destinations have a different structure - code is the instance directly\n if (isDestination) {\n return `{\n code: {\n ${typeLine}\n config: ${JSON.stringify(config || {})},\n ${initFn ? `init: ${initFn},` : ''}\n push: ${pushFn}\n },\n config: ${JSON.stringify(config || {})},\n env: ${JSON.stringify(env || {})}${\n chain\n ? `,\n ${chainLine.slice(0, -1)}`\n : ''\n }\n }`;\n }\n\n // Sources and transformers use factory pattern\n return `{\n code: async (context) => ({\n ${typeLine}\n config: context.config,\n ${initFn ? `init: ${initFn},` : ''}\n push: ${pushFn}\n }),\n config: ${JSON.stringify(config || {})},\n env: ${JSON.stringify(env || {})}${\n chain\n ? `,\n ${chainLine.slice(0, -1)}`\n : ''\n }\n }`;\n}\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { downloadPackages } from './package-manager.js';\nimport type { Logger } from '@walkeros/core';\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.Instance,\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\n/**\n * Validates flow config and warns about deprecated features.\n * Returns true if there are any issues that should stop the build.\n *\n * Note: We use (code as unknown) === true to check for deprecated code: true\n * because the type no longer includes true, but runtime values may still have it.\n */\nfunction validateFlowConfig(\n flowConfig: Flow.Config,\n logger: Logger.Instance,\n): boolean {\n let hasDeprecatedCodeTrue = false;\n\n // Check sources for code: true (deprecated, removed from types)\n const sources = flowConfig.sources || {};\n for (const [sourceId, source] of Object.entries(sources)) {\n if (\n source &&\n typeof source === 'object' &&\n (source.code as unknown) === true\n ) {\n logger.warn(\n `DEPRECATED: Source \"${sourceId}\" uses code: true which is no longer supported. ` +\n `Use $code: prefix in config values or create a source package instead.`,\n );\n hasDeprecatedCodeTrue = true;\n }\n }\n\n // Check destinations for code: true (deprecated, removed from types)\n const destinations = flowConfig.destinations || {};\n for (const [destId, dest] of Object.entries(destinations)) {\n if (dest && typeof dest === 'object' && (dest.code as unknown) === true) {\n logger.warn(\n `DEPRECATED: Destination \"${destId}\" uses code: true which is no longer supported. ` +\n `Use $code: prefix in config values or create a destination package instead.`,\n );\n hasDeprecatedCodeTrue = true;\n }\n }\n\n // Check transformers for code: true (deprecated, removed from types)\n const transformers = flowConfig.transformers || {};\n for (const [transformerId, transformer] of Object.entries(transformers)) {\n if (\n transformer &&\n typeof transformer === 'object' &&\n (transformer.code as unknown) === true\n ) {\n logger.warn(\n `DEPRECATED: Transformer \"${transformerId}\" uses code: true which is no longer supported. ` +\n `Use $code: prefix in config values or create a transformer package instead.`,\n );\n hasDeprecatedCodeTrue = true;\n }\n }\n\n if (hasDeprecatedCodeTrue) {\n logger.warn(\n `See https://www.elbwalker.com/docs/walkeros/getting-started/flow for migration guide.`,\n );\n }\n\n return hasDeprecatedCodeTrue;\n}\n\nexport async function bundleCore(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n logger: Logger.Instance,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n\n // Validate flow config and warn about deprecated features\n const hasDeprecatedFeatures = validateFlowConfig(flowConfig, logger);\n if (hasDeprecatedFeatures) {\n logger.warn('Skipping deprecated code: true entries from bundle.');\n }\n\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, TEMP_DIR);\n if (cached) {\n const cachedBuild = await getCachedBuild(configContent, TEMP_DIR);\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.info(`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 // Check user code for wildcard imports (same logic as collectBundleStats)\n const hasWildcardImports = /import\\s+\\*\\s+as\\s+\\w+\\s+from/.test(\n buildOptions.code || '',\n );\n return {\n totalSize: stats.size,\n packages: packageStats,\n buildTime: Date.now() - bundleStartTime,\n treeshakingEffective: !hasWildcardImports,\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 1.5: Auto-add collector if sources/destinations exist but collector not specified\n const hasSourcesOrDests =\n Object.keys(\n (flowConfig as unknown as { sources?: Record<string, unknown> })\n .sources || {},\n ).length > 0 ||\n Object.keys(\n (flowConfig as unknown as { destinations?: Record<string, unknown> })\n .destinations || {},\n ).length > 0;\n\n if (hasSourcesOrDests && !buildOptions.packages['@walkeros/collector']) {\n buildOptions.packages['@walkeros/collector'] = {};\n }\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 TEMP_DIR,\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 } finally {\n // Clean up esbuild worker threads to allow process to exit\n await esbuild.stop();\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.info(`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, TEMP_DIR);\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.Instance,\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 must be resolvable at runtime from the bundle's location.\n // In Docker: installed at /app/node_modules/ via local CLI install.\n // Outside Docker: user must install express/cors where Node can find them.\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 // Skip if code: true (uses built-in inline code destination)\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'code' in destConfig &&\n destConfig.code === true\n ) {\n continue;\n }\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 // Skip if code: true (uses built-in inline code source)\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'code' in sourceConfig &&\n sourceConfig.code === true\n ) {\n continue;\n }\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 transformer packages from flow configuration.\n * Extracts package names from transformers that have explicit 'package' field.\n */\nexport function detectTransformerPackages(\n flowConfig: Flow.Config,\n): Set<string> {\n const transformerPackages = new Set<string>();\n const transformers = (\n flowConfig as unknown as { transformers?: Record<string, unknown> }\n ).transformers;\n\n if (transformers) {\n for (const [transformerKey, transformerConfig] of Object.entries(\n transformers,\n )) {\n // Skip if code: true (uses built-in inline code transformer)\n if (\n typeof transformerConfig === 'object' &&\n transformerConfig !== null &&\n 'code' in transformerConfig &&\n transformerConfig.code === true\n ) {\n continue;\n }\n // Require explicit package field\n if (\n typeof transformerConfig === 'object' &&\n transformerConfig !== null &&\n 'package' in transformerConfig &&\n typeof transformerConfig.package === 'string'\n ) {\n transformerPackages.add(transformerConfig.package);\n }\n }\n }\n\n return transformerPackages;\n}\n\n/**\n * Detects explicit code imports from destinations, sources, and transformers.\n * Returns a map of package names to sets of export names.\n */\nexport function 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 // Skip code: true (built-in inline code)\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'code' in destConfig &&\n destConfig.code === true\n ) {\n continue;\n }\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 // Skip code: true (built-in inline code)\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'code' in sourceConfig &&\n sourceConfig.code === true\n ) {\n continue;\n }\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 // Check transformers\n const transformers = (\n flowConfig as unknown as { transformers?: Record<string, unknown> }\n ).transformers;\n\n if (transformers) {\n for (const [transformerKey, transformerConfig] of Object.entries(\n transformers,\n )) {\n // Skip code: true (built-in inline code)\n if (\n typeof transformerConfig === 'object' &&\n transformerConfig !== null &&\n 'code' in transformerConfig &&\n transformerConfig.code === true\n ) {\n continue;\n }\n if (\n typeof transformerConfig === 'object' &&\n transformerConfig !== null &&\n 'package' in transformerConfig &&\n typeof transformerConfig.package === 'string' &&\n 'code' in transformerConfig &&\n typeof transformerConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n const isAutoGenerated = transformerConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(transformerConfig.package)) {\n explicitCodeImports.set(transformerConfig.package, new Set());\n }\n explicitCodeImports\n .get(transformerConfig.package)!\n .add(transformerConfig.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 transformerPackages: Set<string>,\n explicitCodeImports: Map<string, Set<string>>,\n): ImportGenerationResult {\n const importStatements: string[] = [];\n const examplesMappings: string[] = [];\n const usedPackages = new Set([\n ...destinationPackages,\n ...sourcePackages,\n ...transformerPackages,\n ]);\n\n for (const [packageName, packageConfig] of Object.entries(packages)) {\n const isUsedByDestOrSource = usedPackages.has(packageName);\n const hasExplicitCode = explicitCodeImports.has(packageName);\n\n // Track what named imports we'll generate to avoid duplicates\n const namedImportsToGenerate: string[] = [];\n\n // 1. Generate default import for packages used by sources/destinations\n // UNLESS explicit code is specified (allows packages without default export)\n if (isUsedByDestOrSource && !hasExplicitCode) {\n const varName = packageNameToVariable(packageName);\n importStatements.push(`import ${varName} from '${packageName}';`);\n }\n\n // 2. Generate named import for explicit code (packages without default export)\n if (hasExplicitCode) {\n const codes = Array.from(explicitCodeImports.get(packageName)!);\n namedImportsToGenerate.push(...codes);\n }\n\n // 3. Process imports list (utilities and special syntax)\n if (packageConfig.imports && packageConfig.imports.length > 0) {\n const uniqueImports = [...new Set(packageConfig.imports)];\n\n // Handle special \"default as X\" syntax\n for (const imp of uniqueImports) {\n if (imp.startsWith('default as ')) {\n // Only generate default import if not already generated above\n if (!isUsedByDestOrSource || hasExplicitCode) {\n const defaultImportName = imp.replace('default as ', '');\n importStatements.push(\n `import ${defaultImportName} from '${packageName}';`,\n );\n }\n } else {\n // Add to named imports if not already in explicit code\n if (!namedImportsToGenerate.includes(imp)) {\n namedImportsToGenerate.push(imp);\n }\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 const examplesVarName = examplesImport.split(' as ')[1];\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 }\n\n // 4. Auto-import startFlow from collector (always required for flows)\n if (\n packageName === '@walkeros/collector' &&\n !namedImportsToGenerate.includes('startFlow')\n ) {\n namedImportsToGenerate.push('startFlow');\n }\n\n // 5. Generate combined named imports statement\n if (namedImportsToGenerate.length > 0) {\n const importList = namedImportsToGenerate.join(', ');\n importStatements.push(`import { ${importList} } from '${packageName}';`);\n }\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, sources, and transformers\n const destinationPackages = detectDestinationPackages(flowConfig);\n const sourcePackages = detectSourcePackages(flowConfig);\n const transformerPackages = detectTransformerPackages(flowConfig);\n const explicitCodeImports = detectExplicitCodeImports(flowConfig);\n\n // Generate import statements\n const { importStatements } = generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n transformerPackages,\n explicitCodeImports,\n );\n\n const importsCode = importStatements.join('\\n');\n const hasFlow =\n Object.values(flowConfig.sources || {}).some(\n (s) => s.package || isInlineCode(s.code),\n ) ||\n Object.values(flowConfig.destinations || {}).some(\n (d) => d.package || isInlineCode(d.code),\n );\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 {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n next?: string | string[];\n }\n >;\n destinations?: Record<\n string,\n {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n before?: string | string[];\n }\n >;\n transformers?: Record<\n string,\n {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n next?: string;\n }\n >;\n collector?: unknown;\n };\n\n const sources = flowWithProps.sources || {};\n const destinations = flowWithProps.destinations || {};\n const transformers = flowWithProps.transformers || {};\n\n // Validate references before processing (skip deprecated code: true entries)\n Object.entries(sources).forEach(([name, source]) => {\n if ((source.code as unknown) !== true) {\n validateReference('Source', name, source);\n }\n });\n\n Object.entries(destinations).forEach(([name, dest]) => {\n if ((dest.code as unknown) !== true) {\n validateReference('Destination', name, dest);\n }\n });\n\n Object.entries(transformers).forEach(([name, transformer]) => {\n if ((transformer.code as unknown) !== true) {\n validateReference('Transformer', name, transformer);\n }\n });\n\n // Build sources (skip deprecated code: true entries)\n const sourcesEntries = Object.entries(sources)\n .filter(\n ([, source]) =>\n (source.code as unknown) !== true &&\n (source.package || isInlineCode(source.code)),\n )\n .map(([key, source]) => {\n // Handle inline code object\n if (isInlineCode(source.code)) {\n return ` ${key}: ${generateInlineCode(source.code, (source.config as object) || {}, source.env as object, source.next, 'next')}`;\n }\n\n // Handle package-based source\n let codeVar: string;\n if (\n source.code &&\n typeof source.code === 'string' &&\n explicitCodeImports.has(source.package!)\n ) {\n codeVar = source.code;\n } else {\n codeVar = packageNameToVariable(source.package!);\n }\n\n const configStr = source.config\n ? processConfigValue(source.config)\n : '{}';\n const envStr = source.env\n ? `,\\n env: ${processConfigValue(source.env)}`\n : '';\n // Include 'next' for source transformer chains\n const nextStr = source.next\n ? `,\\n next: ${JSON.stringify(source.next)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}${nextStr}\\n }`;\n });\n\n // Build destinations (skip deprecated code: true entries)\n const destinationsEntries = Object.entries(destinations)\n .filter(\n ([, dest]) =>\n (dest.code as unknown) !== true &&\n (dest.package || isInlineCode(dest.code)),\n )\n .map(([key, dest]) => {\n // Handle inline code object\n if (isInlineCode(dest.code)) {\n return ` ${key}: ${generateInlineCode(dest.code, (dest.config as object) || {}, dest.env as object, dest.before, 'before', true)}`;\n }\n\n // Handle package-based destination\n let codeVar: string;\n if (\n dest.code &&\n typeof dest.code === 'string' &&\n explicitCodeImports.has(dest.package!)\n ) {\n codeVar = dest.code;\n } else {\n codeVar = packageNameToVariable(dest.package!);\n }\n\n const configStr = dest.config ? processConfigValue(dest.config) : '{}';\n const envStr = dest.env\n ? `,\\n env: ${processConfigValue(dest.env)}`\n : '';\n // Include 'before' for destination transformer chains\n const beforeStr = dest.before\n ? `,\\n before: ${JSON.stringify(dest.before)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}${beforeStr}\\n }`;\n });\n\n // Build transformers (skip deprecated code: true entries)\n const transformersEntries = Object.entries(transformers)\n .filter(\n ([, transformer]) =>\n (transformer.code as unknown) !== true &&\n (transformer.package || isInlineCode(transformer.code)),\n )\n .map(([key, transformer]) => {\n // Handle inline code object\n if (isInlineCode(transformer.code)) {\n return ` ${key}: ${generateInlineCode(transformer.code, (transformer.config as object) || {}, transformer.env as object, transformer.next, 'next')}`;\n }\n\n // Handle package-based transformer\n let codeVar: string;\n if (\n transformer.code &&\n typeof transformer.code === 'string' &&\n explicitCodeImports.has(transformer.package!)\n ) {\n codeVar = transformer.code;\n } else {\n codeVar = packageNameToVariable(transformer.package!);\n }\n\n const configStr = transformer.config\n ? processConfigValue(transformer.config)\n : '{}';\n const envStr = transformer.env\n ? `,\\n env: ${processConfigValue(transformer.env)}`\n : '';\n // Include 'next' for transformer chains (top-level, consistent with before)\n const nextStr = transformer.next\n ? `,\\n next: ${JSON.stringify(transformer.next)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}${nextStr}\\n }`;\n });\n\n // Build collector\n const collectorStr = flowWithProps.collector\n ? `,\\n ...${processConfigValue(flowWithProps.collector)}`\n : '';\n\n // Build transformers section (only if transformers exist)\n const transformersStr =\n transformersEntries.length > 0\n ? `,\\n transformers: {\\n${transformersEntries.join(',\\n')}\\n }`\n : '';\n\n return `{\n sources: {\n${sourcesEntries.join(',\\n')}\n },\n destinations: {\n${destinationsEntries.join(',\\n')}\n }${transformersStr}${collectorStr}\n}`;\n}\n\n/**\n * Process config value for serialization.\n * Handles $code: prefix to output raw JavaScript instead of quoted strings.\n */\nfunction processConfigValue(value: unknown): string {\n return serializeWithCode(value, 0);\n}\n\n/**\n * Serialize a value, handling $code: prefix for inline JavaScript.\n * Values starting with \"$code:\" are output as raw JS (no quotes).\n */\nexport function serializeWithCode(value: unknown, indent: number): string {\n const spaces = ' '.repeat(indent);\n const nextSpaces = ' '.repeat(indent + 1);\n\n // Handle $code: prefix - output raw JavaScript\n if (typeof value === 'string') {\n if (value.startsWith('$code:')) {\n return value.slice(6); // Strip prefix, output raw JS\n }\n\n // Deferred env markers → raw process.env expressions in bundle output\n // The marker regex uses a negative lookahead (?!__WALKEROS_ENV) to stop\n // the default value capture BEFORE the next marker prefix. Without this,\n // `__WALKEROS_ENV:A://__WALKEROS_ENV:B` would be parsed as one marker\n // with A's default consuming the entire rest of the string.\n const esc = ENV_MARKER_PREFIX.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const markerRe = new RegExp(\n esc +\n '([a-zA-Z_][a-zA-Z0-9_]*)' +\n '(?::(' +\n '(?:(?!' +\n esc +\n ')[^\\\\s\"\\'])' +\n '*))?',\n 'g',\n );\n\n if (markerRe.test(value)) {\n markerRe.lastIndex = 0; // reset after test()\n\n // Pure marker (entire string is one marker)\n const pureRe = new RegExp(\n '^' +\n esc +\n '([a-zA-Z_][a-zA-Z0-9_]*)' +\n '(?::(' +\n '(?:(?!' +\n esc +\n ')[^\\\\s\"\\'])' +\n '*))?$',\n );\n const pureMatch = value.match(pureRe);\n if (pureMatch) {\n const [, name, defaultValue] = pureMatch;\n return defaultValue !== undefined\n ? `process.env[${JSON.stringify(name)}] ?? ${JSON.stringify(defaultValue)}`\n : `process.env[${JSON.stringify(name)}]`;\n }\n\n // Mixed content → template literal\n // Escape backticks and non-interpolation $ in static parts to prevent\n // broken/exploitable template literals (e.g. \"Price is $5\" → \"$5\" would\n // be interpreted as ${5} without escaping).\n const segments: string[] = [];\n let lastIndex = 0;\n markerRe.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = markerRe.exec(value)) !== null) {\n // Static text before this marker — escape ` and $\n const staticPart = value\n .slice(lastIndex, m.index)\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$(?!{)/g, '\\\\$');\n const [, name, defaultValue] = m;\n const envExpr =\n defaultValue !== undefined\n ? `\\${process.env[${JSON.stringify(name)}] ?? ${JSON.stringify(defaultValue)}}`\n : `\\${process.env[${JSON.stringify(name)}]}`;\n segments.push(staticPart + envExpr);\n lastIndex = m.index + m[0].length;\n }\n // Trailing static text\n const trailing = value\n .slice(lastIndex)\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$(?!{)/g, '\\\\$');\n segments.push(trailing);\n return '`' + segments.join('') + '`';\n }\n\n return JSON.stringify(value);\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n if (value.length === 0) return '[]';\n const items = value.map(\n (v) => nextSpaces + serializeWithCode(v, indent + 1),\n );\n return `[\\n${items.join(',\\n')}\\n${spaces}]`;\n }\n\n // Handle objects\n if (value !== null && typeof value === 'object') {\n const entries = Object.entries(value);\n if (entries.length === 0) return '{}';\n const props = entries.map(\n ([k, v]) =>\n `${nextSpaces}${JSON.stringify(k)}: ${serializeWithCode(v, indent + 1)}`,\n );\n return `{\\n${props.join(',\\n')}\\n${spaces}}`;\n }\n\n // Handle primitives (numbers, booleans, null)\n return JSON.stringify(value);\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 // When runner provides external server, strip port from sources\n // so they don't self-listen (runner owns the port)\n if (context.externalServer && config.sources) {\n for (const src of Object.values(config.sources)) {\n if (src.config && src.config.settings && 'port' in src.config.settings) {\n delete src.config.settings.port;\n }\n }\n }\n\n const result = await startFlow(config);\n\n // Discover httpHandler from initialized sources (duck-typing, no source-type coupling)\n const httpSource = Object.values(result.collector.sources || {})\n .find(s => 'httpHandler' in s && typeof s.httpHandler === 'function');\n\n return { ...result, httpHandler: httpSource ? httpSource.httpHandler : undefined };\n}`;\n }\n}\n","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { resolveLocalPackage, copyLocalPackage } from '../../core/index.js';\nimport type { Logger } from '@walkeros/core';\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 let timer: ReturnType<typeof setTimeout>;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(errorMessage)), ms);\n });\n try {\n return await Promise.race([promise, timeout]);\n } finally {\n clearTimeout(timer!);\n }\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.Instance,\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.Instance,\n useCache = true,\n configDir?: string, // For resolving relative local paths\n tmpDir?: string,\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 const cachedPath = await getCachedPackagePath(pkg, tmpDir);\n\n if (useCache && (await isPackageCached(pkg, tmpDir))) {\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(tmpDir, '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 URL Upload\n *\n * Handles uploading bundle output to presigned URLs (e.g., S3).\n */\n\nimport fs from 'fs-extra';\n\n/**\n * Strip query parameters from a URL for safe logging.\n * Presigned URLs contain sensitive tokens in query params.\n */\nexport function sanitizeUrl(url: string): string {\n return url.split('?')[0];\n}\n\n/**\n * Upload a bundle file to a URL via HTTP PUT.\n *\n * @param filePath - Path to the bundle file to upload\n * @param url - Presigned URL to PUT the bundle to\n * @param timeoutMs - Request timeout in milliseconds (default: 30000)\n */\nexport async function uploadBundleToUrl(\n filePath: string,\n url: string,\n timeoutMs = 30_000,\n): Promise<void> {\n const bundleContent = await fs.readFile(filePath);\n\n const doUpload = async (attempt: number): Promise<void> => {\n const response = await fetch(url, {\n method: 'PUT',\n body: bundleContent,\n headers: {\n 'Content-Type': 'application/javascript',\n 'Content-Length': String(bundleContent.length),\n },\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (response.status >= 500 && attempt === 1) {\n return doUpload(2);\n }\n\n if (!response.ok) {\n throw new Error(\n `Upload failed: ${response.status} ${response.statusText}`,\n );\n }\n };\n\n await doUpload(1);\n}\n","/**\n * Bundle statistics display utilities\n */\nimport { formatBytes } from '../../core/index.js';\nimport type { BundleStats } from './bundler.js';\nimport type { Logger } from '@walkeros/core';\n\n/**\n * Display detailed bundle statistics to console\n */\nexport function displayStats(\n stats: BundleStats,\n logger: Logger.Instance,\n): 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 createClient from 'openapi-fetch';\nimport type { paths } from '../types/api.gen.js';\nimport { getToken, resolveBaseUrl } from './auth.js';\n\nexport function createApiClient() {\n const token = getToken();\n if (!token) throw new Error('WALKEROS_TOKEN not set.');\n\n return createClient<paths>({\n baseUrl: resolveBaseUrl(),\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n });\n}\n","import fs from 'fs-extra';\nimport type { Destination, Logger, Simulation, WalkerOS } from '@walkeros/core';\nimport { Level } from '@walkeros/core';\nimport { simulate } from '@walkeros/collector';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n detectInput,\n type Platform,\n} from '../../core/index.js';\nimport { loadFlowConfig, isObject } from '../../config/index.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadDestinationEnvs } from './env-loader.js';\nimport type { SimulateCommandOptions, SimulationResult } from './types.js';\n\nfunction createCollectorLoggerConfigInline(\n logger: Logger.Instance,\n verbose?: boolean,\n): Logger.Config {\n return {\n level: verbose ? Level.DEBUG : Level.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 if (level === Level.ERROR) {\n logger.error(`${scopePath}${message}${contextStr}`);\n } else {\n logger.debug(`${scopePath}${message}${contextStr}`);\n }\n },\n };\n}\n\n/**\n * Convert Simulation.Call[] to CLI's usage format\n */\nfunction callsToUsage(\n destName: string,\n calls: Simulation.Call[],\n): Record<\n string,\n Array<{ type: 'call'; path: string; args: unknown[]; timestamp: number }>\n> {\n if (!calls.length) return {};\n return {\n [destName]: calls.map((c) => ({\n type: 'call' as const,\n path: c.fn,\n args: c.args,\n timestamp: c.ts,\n })),\n };\n}\n\n/**\n * Main simulation orchestrator\n */\nexport async function simulateCore(\n inputPath: string,\n event: unknown,\n options: Pick<\n SimulateCommandOptions,\n 'flow' | 'json' | 'verbose' | 'silent' | 'platform' | 'step'\n > = {},\n): Promise<SimulationResult> {\n const logger = createCLILogger({\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 flow: options.flow,\n step: options.step,\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: Record<string, unknown> = {\n result: result.elbResult,\n usage: result.usage,\n duration: result.duration,\n };\n if (result.capturedEvents) {\n output.capturedEvents = result.capturedEvents;\n }\n if (result.exampleMatch) {\n output.exampleMatch = result.exampleMatch;\n }\n return JSON.stringify(output, null, 2);\n }\n\n const lines: string[] = [];\n\n if (result.success) {\n lines.push('Simulation completed');\n } else {\n lines.push(`Simulation failed: ${result.error}`);\n }\n\n if (result.capturedEvents) {\n lines.push(`Captured ${result.capturedEvents.length} event(s)`);\n for (const evt of result.capturedEvents) {\n lines.push(` - ${(evt as { name?: string }).name || 'unknown'}`);\n }\n }\n\n if (result.exampleMatch) {\n const em = result.exampleMatch;\n if (em.match) {\n lines.push(`Example \"${em.name}\" (${em.step}): PASS`);\n } else {\n lines.push(`Example \"${em.name}\" (${em.step}): FAIL`);\n if (em.diff) {\n lines.push(em.diff);\n }\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Execute simulation using destination-provided mock environments.\n * Only accepts Flow.Setup config files.\n */\nexport async function executeSimulation(\n event: unknown,\n inputPath: string,\n platformOverride?: Platform,\n options: {\n flow?: string;\n step?: string;\n logger?: Logger.Instance;\n verbose?: boolean;\n } = {},\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 ? createCollectorLoggerConfigInline(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 throw new Error(\n `Input \"${inputPath}\" is not valid JSON config. ` +\n 'simulate only accepts Flow.Setup config files.',\n );\n }\n\n return await executeConfigSimulation(\n detected.content,\n inputPath,\n typedEvent,\n tempDir,\n startTime,\n collectorLoggerConfig,\n options.flow,\n options.step,\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 * Parse step target into type + name.\n * E.g., \"destination.gtag\" → { type: \"destination\", name: \"gtag\" }\n */\nfunction parseStepTarget(\n stepTarget: string | undefined,\n flowConfig: Record<string, unknown>,\n): {\n type: 'destination' | 'transformer';\n name: string;\n config: Record<string, unknown>;\n} {\n if (stepTarget) {\n const dotIndex = stepTarget.indexOf('.');\n if (dotIndex > -1) {\n const type = stepTarget.substring(0, dotIndex) as\n | 'destination'\n | 'transformer';\n const name = stepTarget.substring(dotIndex + 1);\n const section = (flowConfig as Record<string, Record<string, unknown>>)[\n type + 's'\n ];\n if (!section?.[name]) {\n throw new Error(`Step \"${stepTarget}\" not found in flow config`);\n }\n return { type, name, config: section[name] as Record<string, unknown> };\n }\n }\n\n // Default: first destination\n const destinations = (\n flowConfig as { destinations?: Record<string, unknown> }\n ).destinations;\n if (destinations) {\n const [name, config] = Object.entries(destinations)[0];\n return {\n type: 'destination',\n name,\n config: config as Record<string, unknown>,\n };\n }\n\n throw new Error('No destination found in flow config');\n}\n\n/**\n * Execute simulation from config JSON using unified simulate().\n * Uses direct package imports instead of bundling.\n */\nasync function executeConfigSimulation(\n _content: string,\n configPath: string,\n typedEvent: { name: string; data?: unknown },\n tempDir: string,\n startTime: number,\n loggerConfig?: Logger.Config,\n flowName?: string,\n stepTarget?: string,\n): Promise<SimulationResult> {\n // Load config\n const { flowConfig } = await loadFlowConfig(configPath, {\n flowName,\n });\n\n // Parse step target\n const step = parseStepTarget(\n stepTarget,\n flowConfig as unknown as Record<string, unknown>,\n );\n\n if (step.type === 'destination') {\n const packageName = step.config.package as string;\n if (!packageName) {\n throw new Error(`Destination \"${step.name}\" has no package field`);\n }\n\n // Load destination code\n const destModule = await import(packageName);\n const code: Destination.Instance =\n destModule.default || Object.values(destModule)[0];\n\n // Load env mocks from /dev exports\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n const envs = await loadDestinationEnvs(destinations || {});\n const destEnv = envs[step.name];\n\n const result = await simulate({\n step: 'destination',\n name: step.name,\n code,\n event: typedEvent as WalkerOS.DeepPartialEvent,\n config: step.config.config as Record<string, unknown>,\n env: destEnv?.push,\n track: destEnv?.simulation,\n });\n\n const duration = Date.now() - startTime;\n\n return {\n success: !result.error,\n error: result.error?.message,\n usage: callsToUsage(step.name, result.calls),\n duration,\n logs: [],\n };\n }\n\n if (step.type === 'transformer') {\n const packageName = step.config.package as string;\n if (!packageName) {\n throw new Error(`Transformer \"${step.name}\" has no package field`);\n }\n\n // Load transformer code\n const mod = await import(packageName);\n const code = mod.default || Object.values(mod)[0];\n\n const result = await simulate({\n step: 'transformer',\n name: step.name,\n code,\n event: typedEvent as WalkerOS.DeepPartialEvent,\n config: step.config.config as Record<string, unknown>,\n });\n\n const duration = Date.now() - startTime;\n\n return {\n success: !result.error,\n error: result.error?.message,\n capturedEvents: result.events,\n duration,\n usage: {},\n logs: [],\n };\n }\n\n throw new Error(`Unknown step type: ${step.type}`);\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 { JSDOM, VirtualConsole } from 'jsdom';\nimport { simulate } from '@walkeros/collector';\nimport type { Source } from '@walkeros/core';\nimport type { SimulationResult } from './types.js';\nimport { getErrorMessage } from '../../core/index.js';\n\ninterface SourceSimulationOptions {\n flow?: string;\n sourceStep: string;\n json?: boolean;\n verbose?: boolean;\n silent?: boolean;\n}\n\n/**\n * Load source code and optional setup from an npm package.\n */\nasync function loadSourcePackage(\n packageName: string,\n): Promise<{ code: Source.Init; setup?: Source.SetupFn }> {\n const mainModule = await import(packageName);\n const code = mainModule.default || Object.values(mainModule)[0];\n if (!code || typeof code !== 'function') {\n throw new Error(`Package ${packageName} missing source init function`);\n }\n\n let setup: Source.SetupFn | undefined;\n try {\n const devModule = await import(`${packageName}/dev`);\n const examples = devModule.examples || devModule.default?.examples;\n if (examples?.setup && typeof examples.setup === 'function') {\n setup = examples.setup;\n }\n } catch {\n // No dev exports — skip\n }\n\n return { code, setup };\n}\n\n/**\n * Simulate a source using JSDOM + unified simulate().\n */\nexport async function simulateSourceCLI(\n flowConfig: Record<string, unknown>,\n setupInput: unknown,\n options: SourceSimulationOptions,\n): Promise<SimulationResult> {\n const startTime = Date.now();\n\n try {\n const sources = (\n flowConfig as {\n sources?: Record<\n string,\n { package?: string; config?: Record<string, unknown> }\n >;\n }\n ).sources;\n if (!sources) {\n throw new Error('Flow config has no sources');\n }\n\n const sourceConfig = sources[options.sourceStep];\n if (!sourceConfig) {\n const available = Object.keys(sources).join(', ');\n throw new Error(\n `Source \"${options.sourceStep}\" not found. Available: ${available}`,\n );\n }\n if (!sourceConfig.package) {\n throw new Error(`Source \"${options.sourceStep}\" has no package field`);\n }\n\n // Load source code + setup\n const { code, setup } = await loadSourcePackage(sourceConfig.package);\n\n // Create JSDOM\n const virtualConsole = new VirtualConsole();\n const dom = new JSDOM(\n '<!DOCTYPE html><html><head></head><body></body></html>',\n {\n url: 'http://localhost',\n runScripts: 'dangerously',\n pretendToBeVisual: true,\n virtualConsole,\n },\n );\n\n const env: Source.SimulationEnv = {\n window: dom.window as unknown as Window & typeof globalThis,\n document: dom.window.document as unknown as Document,\n localStorage: dom.window.localStorage as unknown as Storage,\n };\n\n // Use unified simulate()\n const result = await simulate({\n step: 'source',\n name: options.sourceStep,\n code,\n config: sourceConfig.config || {},\n setup,\n input: setupInput,\n env,\n });\n\n // Cleanup\n dom.window.close();\n\n return {\n success: !result.error,\n error: result.error?.message,\n capturedEvents: result.events,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n error: getErrorMessage(error),\n duration: Date.now() - startTime,\n };\n }\n}\n","import { simulateCore, formatSimulationResult } from './simulator.js';\nimport { simulateSourceCLI } from './source-simulator.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n getTmpPath,\n isStdinPiped,\n readStdin,\n writeResult,\n} from '../../core/index.js';\nimport { loadJsonFromSource, loadJsonConfig } from '../../config/index.js';\nimport { validateFlowSetup } from '../../config/validators.js';\nimport { findExample } from './example-loader.js';\nimport { compareOutput } from './compare.js';\nimport type {\n SimulateCommandOptions,\n ExampleMatch,\n SimulationResult,\n} from './types.js';\nimport type { SimulateOptions, Platform } from '../../schemas/simulate.js';\nimport type { Flow } from '@walkeros/core';\n\n/**\n * CLI command handler for simulate command\n */\nexport async function simulateCommand(\n options: SimulateCommandOptions,\n): Promise<void> {\n const logger = createCLILogger({ ...options, stderr: true });\n const startTime = Date.now();\n\n try {\n // Resolve config: stdin > argument > default\n let config: string;\n if (isStdinPiped() && !options.config) {\n const stdinContent = await readStdin();\n // Write stdin to temp file for simulateCore (expects file path)\n const fs = await import('fs-extra');\n const path = await import('path');\n const tmpPath = getTmpPath(undefined, 'stdin-simulate.json');\n await fs.default.ensureDir(path.default.dirname(tmpPath));\n await fs.default.writeFile(tmpPath, stdinContent, 'utf-8');\n config = tmpPath;\n } else {\n config = options.config || 'bundle.config.json';\n }\n\n // Load event: from --example or from --event\n let event: unknown;\n let exampleContext:\n | { stepType: string; stepName: string; expected: unknown }\n | undefined;\n\n if (options.example) {\n // Load raw config to access examples (before getFlowConfig strips them)\n const rawConfig = await loadJsonConfig<Flow.Setup>(config);\n const setup = validateFlowSetup(rawConfig);\n\n // Resolve flow name\n const flowNames = Object.keys(setup.flows);\n let flowName = options.flow;\n if (!flowName) {\n if (flowNames.length === 1) {\n flowName = flowNames[0];\n } else {\n throw new Error(\n `Multiple flows found. Use --flow to specify which flow contains the example.\\n` +\n `Available flows: ${flowNames.join(', ')}`,\n );\n }\n }\n\n const flowConfig = setup.flows[flowName];\n if (!flowConfig) {\n throw new Error(\n `Flow \"${flowName}\" not found. Available: ${flowNames.join(', ')}`,\n );\n }\n\n // Find the example in the raw config\n const found = findExample(flowConfig, options.example, options.step);\n\n if (found.example.in === undefined) {\n throw new Error(\n `Example \"${options.example}\" in ${found.stepType}.${found.stepName} has no \"in\" value`,\n );\n }\n\n event = found.example.in;\n exampleContext = {\n stepType: found.stepType,\n stepName: found.stepName,\n expected: found.example.out,\n };\n } else {\n event = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n }\n\n // Detect source simulation\n const isSourceSimulation =\n exampleContext?.stepType === 'source' ||\n options.step?.startsWith('source.');\n\n let result: SimulationResult;\n\n if (isSourceSimulation) {\n // Source simulation: load flow config and use shared simulateSource\n const rawConfig = await loadJsonConfig<Flow.Setup>(config);\n const setup = validateFlowSetup(rawConfig);\n const flowNames = Object.keys(setup.flows);\n const flowName =\n options.flow || (flowNames.length === 1 ? flowNames[0] : undefined);\n if (!flowName) {\n throw new Error(\n `Multiple flows found. Use --flow to specify which flow.\\n` +\n `Available: ${flowNames.join(', ')}`,\n );\n }\n const flowConfig = setup.flows[flowName];\n if (!flowConfig) {\n throw new Error(\n `Flow \"${flowName}\" not found. Available: ${flowNames.join(', ')}`,\n );\n }\n\n const sourceStep =\n exampleContext?.stepName || options.step!.substring('source.'.length);\n\n result = await simulateSourceCLI(\n flowConfig as unknown as Record<string, unknown>,\n event,\n {\n flow: options.flow,\n sourceStep,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n },\n );\n } else {\n // Standard simulation (destination/transformer)\n const stepTarget = exampleContext\n ? `${exampleContext.stepType}.${exampleContext.stepName}`\n : options.step;\n result = await simulateCore(config, event, {\n flow: options.flow,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n step: stepTarget,\n });\n }\n\n // Compare output against example if --example was used\n let exampleMatch: ExampleMatch | undefined;\n if (exampleContext && result.success) {\n const stepKey = `${exampleContext.stepType}.${exampleContext.stepName}`;\n\n if (exampleContext.expected === false) {\n // out: false means the event should be filtered (not reach the destination)\n const calls = result.usage?.[exampleContext.stepName];\n const wasFiltered = !calls || calls.length === 0;\n exampleMatch = {\n name: options.example!,\n step: stepKey,\n expected: false,\n actual: wasFiltered ? false : calls,\n match: wasFiltered,\n diff: wasFiltered\n ? undefined\n : `Expected event to be filtered, but ${calls!.length} API call(s) were made`,\n };\n } else if (exampleContext.expected !== undefined) {\n // Compare actual usage against expected output\n const actual = result.usage?.[exampleContext.stepName] ?? [];\n exampleMatch = {\n name: options.example!,\n step: stepKey,\n ...compareOutput(exampleContext.expected, actual),\n };\n }\n }\n\n // Add duration and example match to result\n const resultWithDuration = {\n ...result,\n duration: (Date.now() - startTime) / 1000,\n ...(exampleMatch ? { exampleMatch } : {}),\n };\n\n // Format and write result\n const formatted = formatSimulationResult(resultWithDuration, {\n json: options.json,\n });\n await writeResult(formatted + '\\n', { output: options.output });\n\n const exitCode =\n !result.success || (exampleMatch && !exampleMatch.match) ? 1 : 0;\n process.exit(exitCode);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const errorOutput = JSON.stringify(\n {\n success: false,\n error: errorMessage,\n duration: (Date.now() - startTime) / 1000,\n },\n null,\n 2,\n );\n await writeResult(errorOutput + '\\n', { output: options.output });\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: SimulateOptions & {\n flow?: string;\n platform?: Platform;\n example?: string;\n step?: string;\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 let resolvedEvent = event;\n let exampleContext:\n | { stepType: string; stepName: string; expected: unknown }\n | undefined;\n\n // If --example is provided, load the example from the raw config\n if (options.example) {\n const rawConfig = await loadJsonConfig<Flow.Setup>(configOrPath);\n const setup = validateFlowSetup(rawConfig);\n\n const flowNames = Object.keys(setup.flows);\n let flowName = options.flow;\n if (!flowName) {\n if (flowNames.length === 1) {\n flowName = flowNames[0];\n } else {\n throw new Error(\n `Multiple flows found. Use --flow to specify which flow contains the example.\\n` +\n `Available flows: ${flowNames.join(', ')}`,\n );\n }\n }\n\n const flowConfig = setup.flows[flowName];\n if (!flowConfig) {\n throw new Error(\n `Flow \"${flowName}\" not found. Available: ${flowNames.join(', ')}`,\n );\n }\n\n const found = findExample(flowConfig, options.example, options.step);\n if (found.example.in === undefined) {\n throw new Error(\n `Example \"${options.example}\" in ${found.stepType}.${found.stepName} has no \"in\" value`,\n );\n }\n\n resolvedEvent = found.example.in;\n exampleContext = {\n stepType: found.stepType,\n stepName: found.stepName,\n expected: found.example.out,\n };\n }\n\n // Call core simulator\n const result = await simulateCore(configOrPath, resolvedEvent, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n flow: options.flow,\n platform: options.platform,\n });\n\n // Compare output against example if --example was used\n if (exampleContext && result.success) {\n const stepKey = `${exampleContext.stepType}.${exampleContext.stepName}`;\n\n if (exampleContext.expected === false) {\n const calls = result.usage?.[exampleContext.stepName];\n const wasFiltered = !calls || calls.length === 0;\n result.exampleMatch = {\n name: options.example!,\n step: stepKey,\n expected: false,\n actual: wasFiltered ? false : calls,\n match: wasFiltered,\n diff: wasFiltered\n ? undefined\n : `Expected event to be filtered, but ${calls!.length} API call(s) were made`,\n };\n } else if (exampleContext.expected !== undefined) {\n const actual = result.usage?.[exampleContext.stepName] ?? [];\n result.exampleMatch = {\n name: options.example!,\n step: stepKey,\n ...compareOutput(exampleContext.expected, actual),\n };\n }\n }\n\n return result;\n}\n\n// Re-export types and utilities for testing\nexport * from './types.js';\nexport * from './simulator.js';\nexport { findExample } from './example-loader.js';\nexport { compareOutput } from './compare.js';\n","import type { Flow } from '@walkeros/core';\n\nexport type StepType = 'source' | 'transformer' | 'destination';\n\nexport interface ExampleLookupResult {\n stepType: StepType;\n stepName: string;\n exampleName: string;\n example: { in?: unknown; mapping?: unknown; out?: unknown };\n}\n\n/**\n * Find a named example in a flow config.\n *\n * Searches sources, transformers, and destinations for a matching example.\n * If --step is provided (e.g. \"destination.gtag\"), looks only in that step.\n * If not, searches all steps and errors if ambiguous.\n *\n * @param config - Raw (unresolved) flow config with examples intact\n * @param exampleName - Name of the example to find\n * @param stepTarget - Optional step target in \"type.name\" format\n * @returns The found example with its location\n */\nexport function findExample(\n config: Flow.Config,\n exampleName: string,\n stepTarget?: string,\n): ExampleLookupResult {\n if (stepTarget) {\n return findExampleInStep(config, exampleName, stepTarget);\n }\n\n return findExampleAcrossSteps(config, exampleName);\n}\n\nfunction findExampleInStep(\n config: Flow.Config,\n exampleName: string,\n stepTarget: string,\n): ExampleLookupResult {\n const dotIndex = stepTarget.indexOf('.');\n if (dotIndex === -1) {\n throw new Error(\n `Invalid --step format: \"${stepTarget}\". Expected \"type.name\" (e.g. \"destination.gtag\")`,\n );\n }\n\n const type = stepTarget.substring(0, dotIndex) as StepType;\n const name = stepTarget.substring(dotIndex + 1);\n\n const stepMap = getStepMap(config, type);\n if (!stepMap) {\n throw new Error(`No ${type}s found in flow config`);\n }\n\n const step = stepMap[name];\n if (!step) {\n const available = Object.keys(stepMap).join(', ');\n throw new Error(`${type} \"${name}\" not found. Available: ${available}`);\n }\n\n const examples = (step as { examples?: Record<string, unknown> }).examples;\n if (!examples || !examples[exampleName]) {\n const available = examples ? Object.keys(examples).join(', ') : 'none';\n throw new Error(\n `Example \"${exampleName}\" not found in ${type} \"${name}\". Available: ${available}`,\n );\n }\n\n return {\n stepType: type,\n stepName: name,\n exampleName,\n example: examples[exampleName] as {\n in?: unknown;\n mapping?: unknown;\n out?: unknown;\n },\n };\n}\n\nfunction findExampleAcrossSteps(\n config: Flow.Config,\n exampleName: string,\n): ExampleLookupResult {\n const matches: ExampleLookupResult[] = [];\n\n const stepTypes: StepType[] = ['source', 'transformer', 'destination'];\n\n for (const type of stepTypes) {\n const stepMap = getStepMap(config, type);\n if (!stepMap) continue;\n\n for (const [name, step] of Object.entries(stepMap)) {\n const examples = (step as { examples?: Record<string, unknown> })\n .examples;\n if (examples && examples[exampleName]) {\n matches.push({\n stepType: type,\n stepName: name,\n exampleName,\n example: examples[exampleName] as {\n in?: unknown;\n mapping?: unknown;\n out?: unknown;\n },\n });\n }\n }\n }\n\n if (matches.length === 0) {\n throw new Error(`Example \"${exampleName}\" not found in any step`);\n }\n\n if (matches.length > 1) {\n const locations = matches\n .map((m) => `${m.stepType}.${m.stepName}`)\n .join(', ');\n throw new Error(\n `Example \"${exampleName}\" found in multiple steps: ${locations}. Use --step to disambiguate.`,\n );\n }\n\n return matches[0];\n}\n\nfunction getStepMap(\n config: Flow.Config,\n type: StepType,\n): Record<string, unknown> | undefined {\n switch (type) {\n case 'source':\n return config.sources as Record<string, unknown> | undefined;\n case 'transformer':\n return config.transformers as Record<string, unknown> | undefined;\n case 'destination':\n return config.destinations as Record<string, unknown> | undefined;\n default:\n throw new Error(\n `Invalid step type: \"${type}\". Must be \"source\", \"transformer\", or \"destination\"`,\n );\n }\n}\n","/**\n * Compare simulation output against expected example output.\n */\nexport function compareOutput(\n expected: unknown,\n actual: unknown,\n): { expected: unknown; actual: unknown; match: boolean; diff?: string } {\n const expectedStr = JSON.stringify(expected, null, 2);\n const actualStr = JSON.stringify(actual, null, 2);\n\n if (expectedStr === actualStr) {\n return { expected, actual, match: true };\n }\n\n return {\n expected,\n actual,\n match: false,\n diff: `Expected:\\n${expectedStr}\\n\\nActual:\\n${actualStr}`,\n };\n}\n","import path from 'path';\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport { getPlatform, type Elb } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n detectInput,\n isStdinPiped,\n readStdin,\n writeResult,\n type Platform,\n} from '../../core/index.js';\nimport { Level, type Logger } from '@walkeros/core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadFlowConfig, loadJsonFromSource } from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport type { PushCommandOptions, PushResult } from './types.js';\nimport type { PushOptions } from '../../schemas/push.js';\n\nfunction createCollectorLoggerConfig(\n logger: Logger.Instance,\n verbose?: boolean,\n): Logger.Config {\n return {\n level: verbose ? Level.DEBUG : Level.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 if (level === Level.ERROR) {\n logger.error(`${scopePath}${message}${contextStr}`);\n } else {\n logger.debug(`${scopePath}${message}${contextStr}`);\n }\n },\n };\n}\n\n/**\n * Core push logic without CLI concerns (no process.exit, no output formatting)\n */\nasync function pushCore(\n inputPath: string,\n event: unknown,\n options: {\n flow?: string;\n json?: boolean;\n verbose?: boolean;\n silent?: boolean;\n platform?: string;\n } = {},\n): Promise<PushResult> {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n const startTime = Date.now();\n let tempDir: string | undefined;\n\n try {\n // Load event if string (file path or URL)\n let loadedEvent = event;\n if (typeof event === 'string') {\n loadedEvent = await loadJsonFromSource(event, { name: 'event' });\n }\n\n // Validate event format using Zod schema\n const eventResult = schemas.PartialEventSchema.safeParse(loadedEvent);\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 const validatedEvent: { name: string; data: Record<string, unknown> } = {\n name: parsedEvent.name,\n data: (parsedEvent.data || {}) as Record<string, unknown>,\n };\n\n if (!validatedEvent.name.includes(' ')) {\n logger.info(\n `Warning: Event name \"${validatedEvent.name}\" should follow \"ENTITY ACTION\" format (e.g., \"page view\")`,\n );\n }\n\n // Detect input type\n logger.debug('Detecting input type');\n const detected = await detectInput(\n inputPath,\n options.platform as Platform | undefined,\n );\n\n let result: PushResult;\n\n if (detected.type === 'config') {\n result = await executeConfigPush(\n {\n config: inputPath,\n flow: options.flow,\n verbose: options.verbose,\n } as PushCommandOptions,\n validatedEvent,\n logger,\n (dir) => {\n tempDir = dir;\n },\n );\n } else {\n result = await executeBundlePush(\n detected.content,\n detected.platform,\n validatedEvent,\n logger,\n (dir) => {\n tempDir = dir;\n },\n { logger: createCollectorLoggerConfig(logger, options.verbose) },\n );\n }\n\n return result;\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {});\n }\n }\n}\n\n/**\n * CLI command handler for push command\n */\nexport async function pushCommand(options: PushCommandOptions): Promise<void> {\n const logger = createCLILogger({ ...options, stderr: true });\n const startTime = Date.now();\n\n try {\n // Resolve config: stdin > argument > default\n let config: string;\n if (isStdinPiped() && !options.config) {\n const stdinContent = await readStdin();\n // Write stdin to temp file for pushCore (expects file path)\n const tmpPath = getTmpPath(undefined, 'stdin-push.json');\n await fs.ensureDir(path.dirname(tmpPath));\n await fs.writeFile(tmpPath, stdinContent, 'utf-8');\n config = tmpPath;\n } else {\n config = options.config || 'bundle.config.json';\n }\n\n const event = await loadJsonFromSource(options.event, { name: 'event' });\n\n const result = await pushCore(config, event, {\n flow: options.flow,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n platform: options.platform,\n });\n\n const duration = Date.now() - startTime;\n\n // Format result\n let output: string;\n if (options.json) {\n output = JSON.stringify(\n {\n success: result.success,\n event: result.elbResult,\n duration,\n },\n null,\n 2,\n );\n } else {\n const lines: string[] = [];\n if (result.success) {\n lines.push('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 lines.push(` Event ID: ${pushResult.id}`);\n if ('entity' in pushResult && pushResult.entity)\n lines.push(` Entity: ${pushResult.entity}`);\n if ('action' in pushResult && pushResult.action)\n lines.push(` Action: ${pushResult.action}`);\n }\n lines.push(` Duration: ${duration}ms`);\n } else {\n lines.push(`Error: ${result.error}`);\n }\n output = lines.join('\\n');\n }\n\n // Write to file or stdout\n await writeResult(output + '\\n', { output: options.output });\n\n process.exit(result.success ? 0 : 1);\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const errorOutput = JSON.stringify(\n { success: false, error: errorMessage, duration },\n null,\n 2,\n );\n await writeResult(errorOutput + '\\n', { output: options.output });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n}\n\n/**\n * High-level push function for programmatic usage.\n *\n * WARNING: This makes real API calls to real endpoints.\n * Events will be sent to configured destinations (analytics, CRM, etc.).\n *\n * @param configOrPath - Path to flow configuration file or pre-built bundle\n * @param event - Event object to push\n * @param options - Push 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 Push result with success status, elb result, and duration\n *\n * @example\n * ```typescript\n * const result = await push('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n * ```\n */\nexport async function push(\n configOrPath: string | unknown,\n event: unknown,\n options: PushOptions & { flow?: string; platform?: Platform } = {},\n): Promise<PushResult> {\n if (typeof configOrPath !== 'string') {\n throw new Error(\n 'push() 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 return await pushCore(configOrPath, event, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n flow: options.flow,\n platform: options.platform,\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.Instance,\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 = getTmpPath(\n undefined,\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 return executeServerPush(tempPath, validatedEvent, logger, 60000, {\n logger: createCollectorLoggerConfig(logger, options.verbose),\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.Instance,\n setTempDir: (dir: string) => void,\n context: { logger?: Logger.Config } = {},\n): Promise<PushResult> {\n // Write bundle to temp file\n const tempDir = getTmpPath(\n undefined,\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.Instance,\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.info(`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.Instance,\n timeout: number = 60000, // 60 second default timeout\n context: { logger?: Logger.Config } = {},\n): Promise<PushResult> {\n const startTime = Date.now();\n\n let timer: ReturnType<typeof setTimeout>;\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = 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.info(`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 } finally {\n clearTimeout(timer!);\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 { createCLILogger } from '../../core/cli-logger.js';\nimport { createTimer, getErrorMessage } from '../../core/index.js';\nimport { validateFlowFile, validatePort } from './validators.js';\nimport { prepareBundleForRun, isPreBuiltConfig } from './utils.js';\nimport { executeRunLocal } from './execution.js';\nimport type { RunCommandOptions, RunOptions, RunResult } from './types.js';\n\n/**\n * CLI command function for `walkeros run`\n *\n * @param options - Command options\n */\nexport async function runCommand(options: RunCommandOptions): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCLILogger(options);\n\n try {\n // Step 1: Validate inputs\n const configPath = validateFlowFile(options.config);\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Step 1b: Pre-flight check for server runtime dependencies\n const runtimeDeps = ['express', 'cors'];\n for (const dep of runtimeDeps) {\n try {\n require.resolve(dep);\n } catch {\n logger.error(\n `Missing runtime dependency \"${dep}\"\\n` +\n `Server flows require express and cors when running outside Docker.\\n` +\n `Run: npm install express cors`,\n );\n process.exit(1);\n }\n }\n\n // Step 2: Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(configPath);\n\n let flowPath: string;\n\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 // Step 3: Start heartbeat if deployment is specified\n if (options.deployment) {\n const { startHeartbeat } = await import('./heartbeat.js');\n await startHeartbeat({\n deployment: options.deployment,\n projectId: options.project,\n url: options.url || `http://localhost:${options.port || 8080}`,\n healthEndpoint: options.healthEndpoint,\n heartbeatInterval: options.heartbeatInterval,\n });\n }\n\n // Step 4: Execute locally using runtime module\n logger.info('Starting flow...');\n\n await executeRunLocal(flowPath, {\n port: options.port,\n host: options.host,\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 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 options - Run options\n * @returns Run result\n *\n * @example\n * ```typescript\n * // Run with JSON config (bundles automatically)\n * await run({\n * config: './flow.json',\n * port: 8080\n * });\n *\n * // Run with pre-built bundle\n * await run({\n * config: './flow.mjs',\n * port: 8080\n * });\n * ```\n */\nexport async function run(options: RunOptions): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\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 // Pre-flight check for server runtime dependencies\n const runtimeDeps = ['express', 'cors'];\n for (const dep of runtimeDeps) {\n try {\n require.resolve(dep);\n } catch {\n throw new Error(\n `Missing runtime dependency \"${dep}\". ` +\n `Server flows require express and cors when running outside Docker. ` +\n `Run: npm install express cors`,\n );\n }\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(flowPath, {\n port: options.port,\n host: options.host,\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 { 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 { PortSchema } from '../../schemas/index.js';\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 * 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 { 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 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 * Validate Command Schemas\n *\n * Zod schemas for validate command parameter validation.\n */\n\nimport { z } from '@walkeros/core/dev';\n\n/**\n * Validation type schema.\n *\n * @remarks\n * Validates the type of validation to perform.\n * - `contract`: Validate a data contract\n * - `event`: Validate a walkerOS event object\n * - `flow`: Validate a flow configuration file\n * - `mapping`: Validate mapping rules\n */\nexport const ValidationTypeSchema = z\n .enum(['contract', 'event', 'flow', 'mapping'])\n .describe('Validation type: \"event\", \"flow\", \"mapping\", or \"contract\"');\n\nexport type ValidationType = z.infer<typeof ValidationTypeSchema>;\n\n/**\n * Validate options schema.\n *\n * @remarks\n * Options for the programmatic validate() API.\n */\nexport const ValidateOptionsSchema = z.object({\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n path: z\n .string()\n .optional()\n .describe(\n 'Entry path for package schema validation (e.g., \"destinations.snowplow\", \"sources.browser\")',\n ),\n});\n\nexport type ValidateOptions = z.infer<typeof ValidateOptionsSchema>;\n\n/**\n * Raw shape for MCP SDK compatibility (ZodRawShapeCompat).\n *\n * @remarks\n * MCP SDK's registerTool expects raw shapes (Record<string, ZodType>)\n * rather than ZodObject instances. Define shape first, then wrap.\n */\nexport const ValidateInputShape = {\n type: ValidationTypeSchema,\n input: z\n .string()\n .min(1)\n .describe('JSON string, file path, or URL to validate'),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n path: z\n .string()\n .optional()\n .describe(\n 'Entry path for package schema validation (e.g., \"destinations.snowplow\"). When provided, validates the entry against its package JSON Schema instead of using --type.',\n ),\n};\n\n/**\n * Validate input schema for MCP tools.\n *\n * @remarks\n * Full input schema including type and input source.\n */\nexport const ValidateInputSchema = z.object(ValidateInputShape);\n\nexport type ValidateInput = z.infer<typeof ValidateInputSchema>;\n","/**\n * Bundle Command Schemas\n *\n * Zod schemas for bundle command parameter validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { FilePathSchema } from './primitives';\n\n/**\n * Bundle options schema.\n *\n * @remarks\n * Options for the programmatic bundle() API.\n */\nexport const BundleOptionsSchema = z.object({\n silent: z.boolean().optional().describe('Suppress all output'),\n verbose: z.boolean().optional().describe('Enable verbose logging'),\n stats: z\n .boolean()\n .optional()\n .default(true)\n .describe('Return bundle statistics'),\n cache: z\n .boolean()\n .optional()\n .default(true)\n .describe('Enable package caching'),\n flowName: z.string().optional().describe('Flow name for multi-flow configs'),\n});\n\nexport type BundleOptions = z.infer<typeof BundleOptionsSchema>;\n\n/**\n * Raw shape for MCP SDK compatibility (ZodRawShapeCompat).\n *\n * @remarks\n * MCP SDK's registerTool expects raw shapes (Record<string, ZodType>)\n * rather than ZodObject instances. Define shape first, then wrap.\n */\nexport const BundleInputShape = {\n configPath: FilePathSchema.describe(\n 'Path to flow configuration file (JSON or JavaScript)',\n ),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n stats: z\n .boolean()\n .optional()\n .default(true)\n .describe('Return bundle statistics'),\n output: z\n .string()\n .optional()\n .describe('Output file path (defaults to config-defined)'),\n};\n\n/**\n * Bundle input schema for MCP tools.\n *\n * @remarks\n * Full input schema including config path and options.\n */\nexport const BundleInputSchema = z.object(BundleInputShape);\n\nexport type BundleInput = z.infer<typeof BundleInputSchema>;\n","/**\n * Simulate Command Schemas\n *\n * Zod schemas for simulate command parameter validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { FilePathSchema } from './primitives';\n\n/**\n * Platform schema.\n *\n * @remarks\n * Validates platform type for event simulation.\n */\nexport const PlatformSchema = z\n .enum(['web', 'server'])\n .describe('Platform type for event processing');\n\nexport type Platform = z.infer<typeof PlatformSchema>;\n\n/**\n * Simulate options schema.\n *\n * @remarks\n * Options for the programmatic simulate() API.\n */\nexport const SimulateOptionsSchema = z.object({\n silent: z.boolean().optional().describe('Suppress all output'),\n verbose: z.boolean().optional().describe('Enable verbose logging'),\n json: z.boolean().optional().describe('Format output as JSON'),\n});\n\nexport type SimulateOptions = z.infer<typeof SimulateOptionsSchema>;\n\n/**\n * Raw shape for MCP SDK compatibility (ZodRawShapeCompat).\n *\n * @remarks\n * MCP SDK's registerTool expects raw shapes (Record<string, ZodType>)\n * rather than ZodObject instances. Define shape first, then wrap.\n */\nexport const SimulateInputShape = {\n configPath: FilePathSchema.describe('Path to flow configuration file'),\n event: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Event as JSON string, file path, or URL. Optional when example is provided.',\n ),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n platform: PlatformSchema.optional().describe('Override platform detection'),\n example: z\n .string()\n .optional()\n .describe(\n 'Name of a step example to use as event input (uses its \"in\" value)',\n ),\n step: z\n .string()\n .optional()\n .describe(\n 'Step target in type.name format (e.g. \"destination.gtag\") to narrow example lookup',\n ),\n};\n\n/**\n * Simulate input schema for MCP tools.\n *\n * @remarks\n * Full input schema including config path, event, and options.\n */\nexport const SimulateInputSchema = z.object(SimulateInputShape);\n\nexport type SimulateInput = z.infer<typeof SimulateInputSchema>;\n","/**\n * Push Command Schemas\n *\n * Zod schemas for push command parameter validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { FilePathSchema } from './primitives';\nimport { PlatformSchema } from './simulate';\n\n/**\n * Push options schema.\n *\n * @remarks\n * Options for the programmatic push() API.\n */\nexport const PushOptionsSchema = z.object({\n silent: z.boolean().optional().describe('Suppress all output'),\n verbose: z.boolean().optional().describe('Enable verbose logging'),\n json: z.boolean().optional().describe('Format output as JSON'),\n});\n\nexport type PushOptions = z.infer<typeof PushOptionsSchema>;\n\n/**\n * Raw shape for MCP SDK compatibility (ZodRawShapeCompat).\n *\n * @remarks\n * MCP SDK's registerTool expects raw shapes (Record<string, ZodType>)\n * rather than ZodObject instances. Define shape first, then wrap.\n */\nexport const PushInputShape = {\n configPath: FilePathSchema.describe('Path to flow configuration file'),\n event: z.string().min(1).describe('Event as JSON string, file path, or URL'),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n platform: PlatformSchema.optional().describe('Override platform detection'),\n};\n\n/**\n * Push input schema for MCP tools.\n *\n * @remarks\n * Full input schema including config path, event, and options.\n */\nexport const PushInputSchema = z.object(PushInputShape);\n\nexport type PushInput = z.infer<typeof PushInputSchema>;\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';\nimport { getTmpPath } from '../../core/index.js';\n\n/**\n * Prepares a JSON config file for execution by bundling it to a temporary location.\n *\n * Creates bundle in os.tmpdir() (e.g. /tmp) by default.\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 flowName?: string;\n },\n): Promise<string> {\n // Create temp directory in os.tmpdir()\n const tempDir = getTmpPath(\n undefined,\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 flowName: options.flowName,\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 } from '../../runtime/index.js';\nimport { runFlow } 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 flowPath - Path to flow bundle\n * @param options - Runtime options\n */\nexport async function executeRunLocal(\n flowPath: string,\n options: {\n port?: number;\n host?: string;\n },\n): Promise<void> {\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config, logger.scope('runner'), loggerConfig);\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 { Collector, Logger } from '@walkeros/core';\nimport type { HealthServer } from './health-server.js';\n\nexport interface RuntimeConfig {\n port?: number;\n host?: string;\n}\n\nexport interface FlowHandle {\n collector: {\n command?: (cmd: string) => Promise<void>;\n status?: Collector.Status;\n };\n file: string;\n httpHandler?: (...args: unknown[]) => void;\n}\n\n/**\n * Load a pre-built flow bundle and return a handle for managing it.\n */\nexport async function loadFlow(\n file: string,\n config: RuntimeConfig | undefined,\n logger: Logger.Instance,\n loggerConfig?: Logger.Config,\n healthServer?: HealthServer,\n): Promise<FlowHandle> {\n const absolutePath = resolve(file);\n const flowDir = dirname(absolutePath);\n process.chdir(flowDir);\n\n const fileUrl = pathToFileURL(absolutePath).href;\n\n // Bust Node.js module cache by appending query param\n const module = await import(`${fileUrl}?t=${Date.now()}`);\n\n if (!module.default || typeof module.default !== 'function') {\n throw new Error(\n `Invalid flow bundle: ${file} must export a default function`,\n );\n }\n\n const flowContext = {\n ...config,\n ...(loggerConfig ? { logger: loggerConfig } : {}),\n ...(healthServer ? { externalServer: true } : {}),\n };\n const result = await module.default(flowContext);\n\n if (!result || !result.collector) {\n throw new Error(`Invalid flow bundle: ${file} must return { collector }`);\n }\n\n // Mount flow's httpHandler onto runner's health server (opaque — no type inspection)\n if (healthServer && typeof result.httpHandler === 'function') {\n healthServer.setFlowHandler(result.httpHandler);\n }\n\n return {\n collector: {\n command: result.collector.command,\n status: result.collector.status,\n },\n file,\n httpHandler: result.httpHandler,\n };\n}\n\n/**\n * Swap the running flow to a new bundle. Shuts down old flow FIRST to release\n * the port, then loads the new bundle. Brief downtime is acceptable for Mode C.\n */\nexport async function swapFlow(\n currentHandle: FlowHandle,\n newFile: string,\n config: RuntimeConfig | undefined,\n logger: Logger.Instance,\n loggerConfig?: Logger.Config,\n healthServer?: HealthServer,\n): Promise<FlowHandle> {\n logger.info('Shutting down current flow for hot-swap...');\n\n // Detach old handler — health endpoints still work during swap\n if (healthServer) {\n healthServer.setFlowHandler(null);\n }\n\n // Delegate to collector's shutdown command (destroys sources, destinations, transformers)\n try {\n if (currentHandle.collector.command) {\n await currentHandle.collector.command('shutdown');\n }\n } catch (error) {\n logger.debug(`Shutdown warning: ${error}`);\n }\n\n // Load new flow — mounts new handler onto same server\n const newHandle = await loadFlow(\n newFile,\n config,\n logger,\n loggerConfig,\n healthServer,\n );\n\n logger.info('Flow swapped successfully');\n return newHandle;\n}\n\n/**\n * Run a pre-built flow bundle (legacy API — kept for backward compatibility)\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 handle = await loadFlow(file, config, logger, loggerConfig);\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 // Hard safety valve — force exit if shutdown takes too long\n const forceTimer = setTimeout(() => {\n logger.error('Shutdown timed out, forcing exit');\n process.exit(1);\n }, 15000);\n\n try {\n if (handle.collector.command) {\n await handle.collector.command('shutdown');\n }\n logger.info('Shutdown complete');\n clearTimeout(forceTimer);\n process.exit(0);\n } catch (error) {\n clearTimeout(forceTimer);\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","import { randomBytes } from 'crypto';\nimport { VERSION } from '../version.js';\nimport type { Collector, Logger } from '@walkeros/core';\n\nexport interface CounterPayload {\n eventsIn: number;\n eventsOut: number;\n eventsFailed: number;\n destinations: Record<\n string,\n { count: number; failed: number; duration: number }\n >;\n}\n\nexport interface CounterSnapshot {\n in: number;\n out: number;\n failed: number;\n destinations: Record<\n string,\n { count: number; failed: number; duration: number }\n >;\n}\n\nexport function computeCounterDelta(\n current: CounterSnapshot,\n last: CounterSnapshot,\n): CounterPayload {\n const destinations: CounterPayload['destinations'] = {};\n for (const [name, dest] of Object.entries(current.destinations)) {\n const prev = last.destinations[name] || {\n count: 0,\n failed: 0,\n duration: 0,\n };\n destinations[name] = {\n count: dest.count - prev.count,\n failed: dest.failed - prev.failed,\n duration: dest.duration - prev.duration,\n };\n }\n return {\n eventsIn: current.in - last.in,\n eventsOut: current.out - last.out,\n eventsFailed: current.failed - last.failed,\n destinations,\n };\n}\n\nconst instanceId = randomBytes(8).toString('hex');\n\nexport function getInstanceId(): string {\n return instanceId;\n}\n\nexport interface HeartbeatConfig {\n appUrl: string;\n token: string;\n projectId: string;\n flowId?: string;\n deploymentId?: string;\n configVersion?: string;\n intervalMs: number;\n getCounters?: () => Collector.Status | undefined;\n}\n\nexport interface HeartbeatHandle {\n start(): void;\n stop(): void;\n sendOnce(): Promise<void>;\n updateConfigVersion(version: string): void;\n}\n\nexport function createHeartbeat(\n config: HeartbeatConfig,\n logger: Logger.Instance,\n): HeartbeatHandle {\n let timer: ReturnType<typeof setInterval> | null = null;\n const startTime = Date.now();\n let configVersion = config.configVersion;\n\n let lastReported: CounterSnapshot = {\n in: 0,\n out: 0,\n failed: 0,\n destinations: {},\n };\n\n async function sendOnce(): Promise<void> {\n try {\n // Read current counters and compute delta\n let counters: CounterPayload | undefined;\n const status = config.getCounters?.();\n if (status) {\n const current: CounterSnapshot = {\n in: status.in,\n out: status.out,\n failed: status.failed,\n destinations: { ...status.destinations },\n };\n counters = computeCounterDelta(current, lastReported);\n }\n\n const response = await fetch(\n `${config.appUrl}/api/projects/${config.projectId}/runners/heartbeat`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${config.token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n instanceId,\n flowId: config.flowId,\n ...(config.deploymentId && {\n deploymentId: config.deploymentId,\n }),\n configVersion,\n cliVersion: VERSION,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n ...(counters && { counters }),\n }),\n signal: AbortSignal.timeout(10_000),\n },\n );\n\n // Update snapshot only on success so deltas accumulate on failure\n if (response.ok && status) {\n lastReported = {\n in: status.in,\n out: status.out,\n failed: status.failed,\n destinations: { ...status.destinations },\n };\n }\n\n if (response.status === 401 || response.status === 403) {\n logger.error(\n `Heartbeat auth failed (${response.status}). Token may have expired — redeploy to rotate.`,\n );\n }\n } catch (error) {\n // Deltas accumulate on failure — next successful send includes them\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(`Heartbeat failed: ${message}`);\n }\n }\n\n function start(): void {\n sendOnce();\n const jitter = config.intervalMs * 0.1 * (Math.random() * 2 - 1);\n timer = setInterval(() => sendOnce(), config.intervalMs + jitter);\n }\n\n function stop(): void {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n\n function updateConfigVersion(version: string): void {\n configVersion = version;\n }\n\n return { start, stop, sendOnce, updateConfigVersion };\n}\n","// walkerOS/packages/cli/src/commands/validate/index.ts\n\nimport chalk from 'chalk';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n isStdinPiped,\n readStdin,\n writeResult,\n} from '../../core/index.js';\nimport { loadJsonFromSource } from '../../config/index.js';\nimport {\n validateContract,\n validateEvent,\n validateFlow,\n validateMapping,\n} from './validators/index.js';\nimport { validateEntry } from './validators/entry.js';\nimport type {\n ValidateCommandOptions,\n ValidateResult,\n ValidationType,\n} from './types.js';\n\n/**\n * Programmatic API for validation.\n * Can be called directly from code or MCP server.\n */\nexport async function validate(\n type: ValidationType,\n input: unknown,\n options: { flow?: string; path?: string } = {},\n): Promise<ValidateResult> {\n // Path-based entry validation takes priority\n if (options.path) {\n return validateEntry(options.path, input as Record<string, unknown>);\n }\n\n switch (type) {\n case 'contract':\n return validateContract(input);\n case 'event':\n return validateEvent(input);\n case 'flow':\n return validateFlow(input, { flow: options.flow });\n case 'mapping':\n return validateMapping(input);\n default:\n throw new Error(`Unknown validation type: ${type}`);\n }\n}\n\n/**\n * Format validation result for CLI output.\n */\nfunction formatResult(\n result: ValidateResult,\n options: { json?: boolean; verbose?: boolean },\n): string {\n if (options.json) {\n return JSON.stringify(result, null, 2);\n }\n\n const lines: string[] = [];\n lines.push('');\n lines.push(`Validating ${result.type}...`);\n lines.push('');\n\n // Show details if verbose\n if (options.verbose && Object.keys(result.details).length > 0) {\n lines.push('Details:');\n for (const [key, value] of Object.entries(result.details)) {\n lines.push(` ${key}: ${JSON.stringify(value)}`);\n }\n lines.push('');\n }\n\n lines.push('Validation Results:');\n\n // Errors\n for (const error of result.errors) {\n lines.push(chalk.red(` ✗ ${error.path}: ${error.message}`));\n }\n\n // Warnings\n for (const warning of result.warnings) {\n lines.push(chalk.yellow(` ⚠ ${warning.path}: ${warning.message}`));\n if (warning.suggestion) {\n lines.push(chalk.gray(` → ${warning.suggestion}`));\n }\n }\n\n // Success items (count based on lack of errors for checked fields)\n if (result.valid) {\n lines.push(chalk.green(` ✓ All checks passed`));\n }\n\n lines.push('');\n lines.push(\n `Summary: ${result.errors.length} error(s), ${result.warnings.length} warning(s)`,\n );\n\n return lines.join('\\n');\n}\n\n/**\n * CLI command handler for validate command.\n */\nexport async function validateCommand(\n options: ValidateCommandOptions,\n): Promise<void> {\n // Result always goes to stdout; logs to stderr\n const logger = createCLILogger({ ...options, stderr: true });\n\n try {\n // Load input: stdin > argument > error\n let input: unknown;\n if (isStdinPiped() && !options.input) {\n const stdinContent = await readStdin();\n try {\n input = JSON.parse(stdinContent);\n } catch {\n throw new Error('Invalid JSON received on stdin');\n }\n } else {\n input = await loadJsonFromSource(options.input, {\n name: options.type,\n required: true,\n });\n }\n\n // Run validation\n const result = await validate(options.type, input, {\n flow: options.flow,\n path: options.path,\n });\n\n // Format and write result\n const formatted = formatResult(result, {\n json: options.json,\n verbose: options.verbose,\n });\n await writeResult(formatted + '\\n', { output: options.output });\n\n // Exit code based on result\n if (!result.valid) {\n process.exit(1);\n }\n if (options.strict && result.warnings.length > 0) {\n process.exit(2);\n }\n process.exit(0);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const errorOutput = JSON.stringify(\n {\n valid: false,\n type: options.type,\n errors: [\n { path: 'input', message: errorMessage, code: 'INPUT_ERROR' },\n ],\n warnings: [],\n details: {},\n },\n null,\n 2,\n );\n await writeResult(errorOutput + '\\n', { output: options.output });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n process.exit(3);\n }\n}\n\n// Re-export types\nexport * from './types.js';\nexport {\n validateContract,\n validateEvent,\n validateFlow,\n validateMapping,\n} from './validators/index.js';\nexport { validateEntry } from './validators/entry.js';\n","import type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nexport function validateContract(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n errors.push({\n path: 'root',\n message: 'Contract must be an object',\n code: 'INVALID_CONTRACT',\n });\n return { valid: false, type: 'contract', errors, warnings, details };\n }\n\n const contract = input as Record<string, unknown>;\n let entityCount = 0;\n let actionCount = 0;\n\n // Validate $tagging if present\n if ('$tagging' in contract) {\n const tagging = contract.$tagging;\n if (\n typeof tagging !== 'number' ||\n !Number.isInteger(tagging) ||\n tagging < 0\n ) {\n errors.push({\n path: '$tagging',\n message: '$tagging must be a non-negative integer',\n value: tagging,\n code: 'INVALID_TAGGING',\n });\n } else {\n details.tagging = tagging;\n }\n }\n\n // Validate entity-action entries\n for (const [entityKey, entityValue] of Object.entries(contract)) {\n // Skip metadata keys\n if (entityKey.startsWith('$')) continue;\n\n // Validate entity key\n if (entityKey.trim() === '') {\n errors.push({\n path: entityKey,\n message: 'Entity key cannot be empty',\n code: 'INVALID_ENTITY_KEY',\n });\n continue;\n }\n\n if (typeof entityValue !== 'object' || entityValue === null) {\n errors.push({\n path: entityKey,\n message: `Entity \"${entityKey}\" must be an object of action entries`,\n value: entityValue,\n code: 'INVALID_ENTITY',\n });\n continue;\n }\n\n entityCount++;\n const actions = entityValue as Record<string, unknown>;\n\n for (const [actionKey, actionValue] of Object.entries(actions)) {\n // Validate action key\n if (actionKey.trim() === '') {\n errors.push({\n path: `${entityKey}.${actionKey}`,\n message: 'Action key cannot be empty',\n code: 'INVALID_ACTION_KEY',\n });\n continue;\n }\n\n // Validate action value is a JSON Schema object\n if (\n typeof actionValue !== 'object' ||\n actionValue === null ||\n Array.isArray(actionValue)\n ) {\n errors.push({\n path: `${entityKey}.${actionKey}`,\n message: `Contract entry must be a JSON Schema object`,\n value: typeof actionValue,\n code: 'INVALID_SCHEMA_ENTRY',\n });\n continue;\n }\n\n actionCount++;\n }\n }\n\n details.entityCount = entityCount;\n details.actionCount = actionCount;\n\n return {\n valid: errors.length === 0,\n type: 'contract',\n errors,\n warnings,\n details,\n };\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/event.ts\n\nimport { schemas } from '@walkeros/core/dev';\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst { PartialEventSchema } = schemas;\n\nexport function validateEvent(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n // Type guard for object access\n const event = (\n typeof input === 'object' && input !== null ? input : {}\n ) as Record<string, unknown>;\n\n // 1. Check for name field existence\n if (!('name' in event) || event.name === undefined) {\n errors.push({\n path: 'name',\n message: 'Event must have a name field',\n code: 'MISSING_EVENT_NAME',\n });\n } else if (typeof event.name !== 'string' || event.name.trim() === '') {\n errors.push({\n path: 'name',\n message: 'Event name cannot be empty',\n value: event.name,\n code: 'EMPTY_EVENT_NAME',\n });\n } else {\n // 2. Validate entity-action format (must contain space)\n const name = event.name as string;\n if (!name.includes(' ')) {\n errors.push({\n path: 'name',\n message:\n 'Event name must be \"entity action\" format with space (e.g., \"page view\")',\n value: name,\n code: 'INVALID_EVENT_NAME',\n });\n details.entity = null;\n details.action = null;\n } else {\n // Extract entity and action (last word is action, rest is entity)\n // Normalize whitespace: trim and split on one-or-more whitespace\n const parts = name.trim().split(/\\s+/);\n const action = parts.pop()!;\n const entity = parts.join(' ');\n details.entity = entity;\n details.action = action;\n }\n }\n\n // 3. Validate against Zod schema for structural validation\n const zodResult = PartialEventSchema.safeParse(input);\n if (!zodResult.success) {\n for (const issue of zodResult.error.issues) {\n const path = issue.path.join('.');\n // Skip name errors (we handle those above with better messages)\n if (path === 'name') continue;\n\n errors.push({\n path: path || 'root',\n message: issue.message,\n code: 'SCHEMA_VALIDATION',\n });\n }\n }\n\n // 4. Warnings for best practices\n if (!event.consent) {\n warnings.push({\n path: 'consent',\n message: 'No consent object provided',\n suggestion:\n 'Consider adding a consent object for GDPR/privacy compliance',\n });\n }\n\n details.hasConsent = !!event.consent;\n details.hasData = !!event.data;\n details.hasContext = !!event.context;\n\n return {\n valid: errors.length === 0,\n type: 'event',\n errors,\n warnings,\n details,\n };\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/flow.ts\n\nimport type { Flow } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst { validateFlowSetup } = schemas;\n\ninterface FlowValidateOptions {\n flow?: string;\n}\n\nexport function validateFlow(\n input: unknown,\n options: FlowValidateOptions = {},\n): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n // 1. Serialize to JSON for core validator\n // Core's validateFlowSetup takes a JSON string, but CLI receives parsed objects.\n // Re-serializing is the bridge between the two interfaces.\n let json: string;\n try {\n json = JSON.stringify(input, null, 2);\n } catch {\n errors.push({\n path: 'root',\n message: 'Input cannot be serialized to JSON',\n code: 'SERIALIZATION_ERROR',\n });\n return { valid: false, type: 'flow', errors, warnings, details };\n }\n\n // 2. Run core validation (Zod schema + reference checking)\n const coreResult = validateFlowSetup(json);\n\n // 3. Map core errors -> CLI ValidationError\n for (const issue of coreResult.errors) {\n errors.push({\n path: issue.path || 'root',\n message: issue.message,\n code: 'SCHEMA_VALIDATION',\n });\n }\n\n // 4. Map core warnings -> CLI ValidationWarning\n for (const issue of coreResult.warnings) {\n warnings.push({\n path: issue.path || 'root',\n message: issue.message,\n });\n }\n\n // 5. CLI-specific: check for empty flows\n const config = (\n typeof input === 'object' && input !== null ? input : {}\n ) as Record<string, unknown>;\n\n const flows = config.flows as Record<string, unknown> | undefined;\n if (flows && typeof flows === 'object' && Object.keys(flows).length === 0) {\n errors.push({\n path: 'flows',\n message: 'At least one flow is required',\n code: 'EMPTY_FLOWS',\n });\n }\n\n // 6. Extract flow details\n if (flows && typeof flows === 'object') {\n const flowNames = Object.keys(flows);\n details.flowNames = flowNames;\n details.flowCount = flowNames.length;\n\n // 7. Validate specific flow if requested\n if (options.flow) {\n if (!flowNames.includes(options.flow)) {\n errors.push({\n path: 'flows',\n message: `Flow \"${options.flow}\" not found. Available: ${flowNames.join(', ')}`,\n code: 'FLOW_NOT_FOUND',\n });\n } else {\n details.validatedFlow = options.flow;\n }\n }\n }\n\n // 8. CLI-specific: warn about packages without version\n const packages = config.packages as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (packages && typeof packages === 'object') {\n for (const [pkgName, pkgConfig] of Object.entries(packages)) {\n if (!pkgConfig.version && !pkgConfig.path) {\n warnings.push({\n path: `packages.${pkgName}`,\n message: `Package \"${pkgName}\" has no version specified`,\n suggestion: 'Consider specifying a version for reproducible builds',\n });\n }\n }\n details.packageCount = Object.keys(packages).length;\n }\n\n // 9. Expose core's IntelliSense context in details (bonus for MCP consumers)\n if (coreResult.context) {\n details.context = coreResult.context;\n }\n\n // 10. Deep validation: cross-step example compatibility\n if (flows && typeof flows === 'object' && errors.length === 0) {\n const flowNames = Object.keys(flows);\n const flowsToCheck = options.flow ? [options.flow] : flowNames;\n\n let totalConnections = 0;\n for (const name of flowsToCheck) {\n const flowConfig = (flows as Record<string, Flow.Config>)[name];\n if (!flowConfig) continue;\n\n checkExampleCoverage(flowConfig, warnings);\n\n const connections = buildConnectionGraph(flowConfig);\n for (const conn of connections) {\n checkCompatibility(conn, errors, warnings);\n }\n totalConnections += connections.length;\n\n // Contract compliance\n const setupContract = config.contract as Flow.Contract | undefined;\n if (setupContract || flowConfig.contract) {\n checkContractCompliance(\n flowConfig,\n setupContract,\n flowConfig.contract,\n warnings,\n );\n }\n }\n details.connectionsChecked = totalConnections;\n }\n\n return {\n valid: errors.length === 0,\n type: 'flow',\n errors,\n warnings,\n details,\n };\n}\n\n// --- Deep validation helpers ---\n\ninterface StepInfo {\n type: 'source' | 'transformer' | 'destination';\n name: string;\n examples: Flow.StepExamples;\n}\n\ninterface StepConnection {\n from: StepInfo;\n to: StepInfo;\n}\n\nfunction checkExampleCoverage(\n config: Flow.Config,\n warnings: ValidationWarning[],\n): void {\n const stepTypes = [\n { key: 'sources' as const, type: 'source' },\n { key: 'transformers' as const, type: 'transformer' },\n { key: 'destinations' as const, type: 'destination' },\n ];\n\n for (const { key, type } of stepTypes) {\n const refs = config[key];\n if (!refs) continue;\n for (const [name, ref] of Object.entries(refs)) {\n if (!ref.examples || Object.keys(ref.examples).length === 0) {\n warnings.push({\n path: `${type}.${name}`,\n message: `Step has no examples`,\n suggestion: `Add examples to ${type}.${name} for testing and documentation`,\n });\n }\n }\n }\n}\n\nfunction buildConnectionGraph(config: Flow.Config): StepConnection[] {\n const connections: StepConnection[] = [];\n\n // Source → next transformer\n for (const [name, source] of Object.entries(config.sources || {})) {\n if (!source.next || !source.examples) continue;\n const nextNames = Array.isArray(source.next) ? source.next : [source.next];\n for (const nextName of nextNames) {\n const transformer = config.transformers?.[nextName];\n if (transformer?.examples) {\n connections.push({\n from: { type: 'source', name, examples: source.examples },\n to: {\n type: 'transformer',\n name: nextName,\n examples: transformer.examples,\n },\n });\n }\n }\n }\n\n // Transformer → next transformer\n for (const [name, transformer] of Object.entries(config.transformers || {})) {\n if (!transformer.next || !transformer.examples) continue;\n const nextNames = Array.isArray(transformer.next)\n ? transformer.next\n : [transformer.next];\n for (const nextName of nextNames) {\n const nextTransformer = config.transformers?.[nextName];\n if (nextTransformer?.examples) {\n connections.push({\n from: {\n type: 'transformer',\n name,\n examples: transformer.examples,\n },\n to: {\n type: 'transformer',\n name: nextName,\n examples: nextTransformer.examples,\n },\n });\n }\n }\n }\n\n // Destination.before → transformer chain → destination\n for (const [name, dest] of Object.entries(config.destinations || {})) {\n if (!dest.before || !dest.examples) continue;\n const beforeNames = Array.isArray(dest.before)\n ? dest.before\n : [dest.before];\n for (const beforeName of beforeNames) {\n const transformer = config.transformers?.[beforeName];\n if (transformer?.examples) {\n connections.push({\n from: {\n type: 'transformer',\n name: beforeName,\n examples: transformer.examples,\n },\n to: { type: 'destination', name, examples: dest.examples },\n });\n }\n }\n }\n\n return connections;\n}\n\nfunction checkCompatibility(\n conn: StepConnection,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n const fromOuts = Object.entries(conn.from.examples)\n .filter(([, ex]) => ex.out !== undefined && ex.out !== false)\n .map(([name, ex]) => ({ name, value: ex.out }));\n\n const toIns = Object.entries(conn.to.examples)\n .filter(([, ex]) => ex.in !== undefined)\n .map(([name, ex]) => ({ name, value: ex.in }));\n\n const path = `${conn.from.type}.${conn.from.name} → ${conn.to.type}.${conn.to.name}`;\n\n if (fromOuts.length === 0 || toIns.length === 0) {\n warnings.push({\n path,\n message: 'Cannot check compatibility: missing out or in examples',\n suggestion:\n 'Add out examples to the source step or in examples to the target step',\n });\n return;\n }\n\n let hasMatch = false;\n for (const out of fromOuts) {\n for (const inp of toIns) {\n if (isStructurallyCompatible(out.value, inp.value)) {\n hasMatch = true;\n break;\n }\n }\n if (hasMatch) break;\n }\n\n if (!hasMatch) {\n errors.push({\n path,\n message: 'No compatible out/in pair found between connected steps',\n code: 'INCOMPATIBLE_EXAMPLES',\n });\n }\n}\n\nfunction isStructurallyCompatible(a: unknown, b: unknown): boolean {\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) && Array.isArray(b)) return true;\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n const shared = keysA.filter((k) => keysB.includes(k));\n return shared.length >= Math.min(keysA.length, keysB.length) * 0.5;\n }\n return true;\n}\n\nfunction checkContractCompliance(\n config: Flow.Config,\n setupContract: Flow.Contract | undefined,\n flowContract: Flow.Contract | undefined,\n warnings: ValidationWarning[],\n): void {\n for (const [name, dest] of Object.entries(config.destinations || {})) {\n if (!dest.examples) continue;\n\n for (const [exName, example] of Object.entries(dest.examples)) {\n if (!example.in || typeof example.in !== 'object') continue;\n\n const event = example.in as { entity?: string; action?: string };\n if (!event.entity || !event.action) continue;\n\n const contract =\n (flowContract?.[event.entity] as Record<string, unknown> | undefined) ||\n (setupContract?.[event.entity] as Record<string, unknown> | undefined);\n if (!contract || typeof contract !== 'object') continue;\n\n const actionSchema = contract[event.action] || contract['*'];\n if (actionSchema) {\n warnings.push({\n path: `destination.${name}.examples.${exName}`,\n message: `Example has contract for ${event.entity}.${event.action}`,\n suggestion: 'Verify example data matches contract schema',\n });\n }\n }\n }\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/mapping.ts\n\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nexport function validateMapping(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n // Must be an object\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n errors.push({\n path: 'root',\n message: 'Mapping must be an object with event patterns as keys',\n code: 'INVALID_MAPPING_TYPE',\n });\n return { valid: false, type: 'mapping', errors, warnings, details };\n }\n\n const mapping = input as Record<string, unknown>;\n const patterns = Object.keys(mapping);\n details.eventPatterns = patterns;\n details.patternCount = patterns.length;\n\n // Validate each event pattern\n patterns.forEach((pattern, index) => {\n // Check pattern format: must be \"entity action\", contain wildcard, or be \"*\"\n const isWildcard = pattern.includes('*');\n const hasSpace = pattern.includes(' ');\n\n if (!isWildcard && !hasSpace) {\n errors.push({\n path: pattern,\n message: `Invalid event pattern \"${pattern}\". Must be \"entity action\" format or contain wildcard (*)`,\n code: 'INVALID_EVENT_PATTERN',\n });\n }\n\n // Warn if catch-all is not last\n if (pattern === '*' && index !== patterns.length - 1) {\n warnings.push({\n path: '*',\n message: 'Catch-all pattern (*) should be last',\n suggestion:\n 'Move the catch-all pattern (*) to last position for predictable matching',\n });\n }\n\n // Validate rule structure (accepts single rule object or array of rules)\n const rule = mapping[pattern];\n const isValidRule = Array.isArray(rule)\n ? rule.every((r) => typeof r === 'object' && r !== null)\n : typeof rule === 'object' && rule !== null;\n\n if (!isValidRule) {\n errors.push({\n path: pattern,\n message: 'Mapping rule must be an object or array of objects',\n code: 'INVALID_RULE_TYPE',\n });\n }\n });\n\n return {\n valid: errors.length === 0,\n type: 'mapping',\n errors,\n warnings,\n details,\n };\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/entry.ts\n\nimport Ajv from 'ajv';\nimport { fetchPackageSchema } from '@walkeros/core';\nimport type { ValidateResult, ValidationError } from '../types.js';\n\nconst SECTIONS = ['destinations', 'sources', 'transformers'] as const;\n\n/**\n * Parse dot-notation path into [section, key].\n * If no section prefix, search all sections.\n */\nfunction resolveEntry(\n path: string,\n flowConfig: Record<string, unknown>,\n): { section: string; key: string; entry: Record<string, unknown> } | string {\n const flows = flowConfig.flows as Record<string, Record<string, unknown>>;\n if (!flows || typeof flows !== 'object') return 'No flows found in config';\n\n // Use first flow\n const flowName = Object.keys(flows)[0];\n const flow = flows[flowName];\n if (!flow) return `Flow \"${flowName}\" is empty`;\n\n const parts = path.split('.');\n\n if (parts.length === 2) {\n const [section, key] = parts;\n if (!SECTIONS.includes(section as (typeof SECTIONS)[number])) {\n return `Unknown section \"${section}\". Must be one of: ${SECTIONS.join(', ')}`;\n }\n const sectionData = flow[section] as Record<string, unknown> | undefined;\n if (!sectionData || !(key in sectionData)) {\n return `Entry \"${key}\" not found in ${section}`;\n }\n return {\n section,\n key,\n entry: sectionData[key] as Record<string, unknown>,\n };\n }\n\n if (parts.length === 1) {\n const key = parts[0];\n const matches: { section: string; entry: Record<string, unknown> }[] = [];\n\n for (const section of SECTIONS) {\n const sectionData = flow[section] as Record<string, unknown> | undefined;\n if (sectionData && key in sectionData) {\n matches.push({\n section,\n entry: sectionData[key] as Record<string, unknown>,\n });\n }\n }\n\n if (matches.length === 0) {\n return `Entry \"${key}\" not found in any section`;\n }\n if (matches.length > 1) {\n const sections = matches.map((m) => m.section).join(', ');\n return `Ambiguous key \"${key}\" found in multiple sections: ${sections}. Use dot-notation (e.g., destinations.${key})`;\n }\n return { section: matches[0].section, key, entry: matches[0].entry };\n }\n\n return `Invalid path \"${path}\". Use \"section.key\" or just \"key\"`;\n}\n\n/**\n * Validate a specific entry (destination/source/transformer) in a flow config\n * against its package's published JSON Schema.\n */\nexport async function validateEntry(\n path: string,\n flowConfig: Record<string, unknown>,\n): Promise<ValidateResult> {\n // Step 1: Resolve the entry\n const resolved = resolveEntry(path, flowConfig);\n if (typeof resolved === 'string') {\n return {\n valid: false,\n type: 'entry',\n errors: [{ path, message: resolved, code: 'ENTRY_VALIDATION' }],\n warnings: [],\n details: {},\n };\n }\n\n const { section, key, entry } = resolved;\n\n // Step 2: Check for package field\n const packageName = entry.package as string | undefined;\n if (!packageName) {\n return {\n valid: true,\n type: 'entry',\n errors: [],\n warnings: [],\n details: {\n section,\n key,\n skipped: true,\n reason: 'No package field — skipping remote schema validation',\n },\n };\n }\n\n // Step 3: Fetch schema from CDN\n let schemas: Record<string, unknown>;\n try {\n const info = await fetchPackageSchema(packageName);\n schemas = info.schemas;\n } catch (error) {\n return {\n valid: false,\n type: 'entry',\n errors: [\n {\n path,\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'ENTRY_VALIDATION',\n },\n ],\n warnings: [],\n details: { section, key, package: packageName },\n };\n }\n\n // Step 4: Validate settings against schema\n const settingsSchema = schemas?.settings;\n if (!settingsSchema) {\n return {\n valid: true,\n type: 'entry',\n errors: [],\n warnings: [],\n details: { section, key, note: 'Package has no settings schema' },\n };\n }\n\n const config = entry.config as Record<string, unknown> | undefined;\n const settings = config?.settings;\n\n const ajv = new Ajv({ allErrors: true });\n const validate = ajv.compile(settingsSchema as object);\n const isValid = validate(settings || {});\n\n if (!isValid) {\n const errors: ValidationError[] = (validate.errors || []).map((e) => ({\n path: e.instancePath || '/',\n message: e.message || 'Unknown error',\n code: e.keyword,\n }));\n\n return {\n valid: false,\n type: 'entry',\n errors,\n warnings: [],\n details: { section, key, package: packageName },\n };\n }\n\n return {\n valid: true,\n type: 'entry',\n errors: [],\n warnings: [],\n details: { section, key, package: packageName },\n };\n}\n","import { hostname } from 'os';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n writeConfig,\n resolveAppUrl,\n getConfigPath,\n} from '../../lib/config-file.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\nexport interface LoginCommandOptions extends GlobalOptions {\n url?: string;\n json?: boolean;\n}\n\nexport interface LoginResult {\n success: boolean;\n email?: string;\n configPath?: string;\n error?: string;\n}\n\nexport interface LoginOptions {\n url?: string;\n /** Override browser opener for testing */\n openUrl?: (url: string) => Promise<void>;\n /** Override fetch for testing */\n fetch?: typeof globalThis.fetch;\n /** Max poll attempts before giving up (for testing) */\n maxPollAttempts?: number;\n}\n\nconst POLL_TIMEOUT_BUFFER_MS = 5000;\n\nasync function openInBrowser(url: string): Promise<void> {\n const { default: open } = await import('open');\n await open(url);\n}\n\nexport async function loginCommand(\n options: LoginCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n\n try {\n const result = await login({ url: options.url });\n\n if (options.json) {\n logger.json(result);\n } else if (result.success) {\n logger.info(`Logged in as ${result.email}`);\n logger.info(`Token stored in ${result.configPath}`);\n }\n\n process.exit(result.success ? 0 : 1);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n logger.json({ success: false, error: message });\n } else {\n logger.error(message);\n }\n\n process.exit(1);\n }\n}\n\nexport async function login(options: LoginOptions = {}): Promise<LoginResult> {\n const appUrl = options.url || resolveAppUrl();\n const f = options.fetch ?? globalThis.fetch;\n\n // 1. Request device code\n const codeResponse = await f(`${appUrl}/api/auth/device/code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n });\n\n if (!codeResponse.ok) {\n return { success: false, error: 'Failed to request device code' };\n }\n\n const {\n deviceCode,\n userCode,\n verificationUri,\n verificationUriComplete,\n expiresIn,\n interval,\n } = await codeResponse.json();\n\n // 2. Display code and open browser\n const prompt = (msg: string) => process.stderr.write(msg + '\\n');\n prompt(`\\n! Your one-time code: ${userCode}`);\n prompt(` Authorize here: ${verificationUriComplete || verificationUri}\\n`);\n\n const opener = options.openUrl ?? openInBrowser;\n try {\n await opener(verificationUriComplete || verificationUri);\n prompt(' Opening browser...');\n } catch {\n prompt(' Could not open browser. Visit the URL manually.');\n }\n\n prompt(' Waiting for authorization... (press Ctrl+C to cancel)\\n');\n\n // 3. Poll for token\n const deadline = Date.now() + expiresIn * 1000 + POLL_TIMEOUT_BUFFER_MS;\n let pollInterval = (interval ?? 5) * 1000;\n const maxAttempts = options.maxPollAttempts ?? Infinity;\n let attempts = 0;\n\n while (Date.now() < deadline && attempts < maxAttempts) {\n attempts++;\n await new Promise((r) => setTimeout(r, pollInterval));\n\n const tokenResponse = await f(`${appUrl}/api/auth/device/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ deviceCode, hostname: hostname() }),\n });\n\n const data = await tokenResponse.json();\n\n if (tokenResponse.ok && data.token) {\n // 4. Store config\n writeConfig({ token: data.token, email: data.email, appUrl });\n const configPath = getConfigPath();\n return { success: true, email: data.email, configPath };\n }\n\n if (data.error === 'authorization_pending') continue;\n if (data.error === 'slow_down') {\n pollInterval += 5000;\n continue;\n }\n\n // Any other error: expired, denied, etc.\n return { success: false, error: data.error || 'Authorization failed' };\n }\n\n return {\n success: false,\n error: 'Authorization timed out. Please try again.',\n };\n}\n","import { createCLILogger } from '../../core/cli-logger.js';\nimport { deleteConfig, getConfigPath } from '../../lib/config-file.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\nexport interface LogoutCommandOptions extends GlobalOptions {\n json?: boolean;\n}\n\nexport async function logoutCommand(\n options: LogoutCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n\n const deleted = deleteConfig();\n const configPath = getConfigPath();\n\n if (options.json) {\n logger.json({ success: true, deleted });\n } else if (deleted) {\n logger.info(`Logged out. Token removed from ${configPath}`);\n } else {\n logger.info('No stored credentials found.');\n }\n\n process.exit(0);\n}\n\nexport async function logout(): Promise<{ deleted: boolean }> {\n const deleted = deleteConfig();\n return { deleted };\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport async function whoami() {\n const client = createApiClient();\n const { data, error } = await client.GET('/api/auth/whoami');\n if (error) throw new Error(error.error?.message || 'Not authenticated');\n return data;\n}\n\n// === CLI Command Handler ===\n\nexport interface WhoamiCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n}\n\nexport async function whoamiCommand(\n options: WhoamiCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n try {\n const result = await whoami();\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n } else {\n const data = result as Record<string, unknown>;\n if (data.email) logger.info(`${data.email}`);\n if (data.userId) logger.info(`User: ${data.userId}`);\n if (data.projectId) logger.info(`Project: ${data.projectId}`);\n }\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport async function listProjects() {\n const client = createApiClient();\n const { data, error } = await client.GET('/api/projects');\n if (error) throw new Error(error.error?.message || 'Failed to list projects');\n return data;\n}\n\nexport async function getProject(options: { projectId?: string } = {}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.GET('/api/projects/{projectId}', {\n params: { path: { projectId: id } },\n });\n if (error) throw new Error(error.error?.message || 'Failed to get project');\n return data;\n}\n\nexport async function createProject(options: { name: string }) {\n const client = createApiClient();\n const { data, error } = await client.POST('/api/projects', {\n body: { name: options.name },\n });\n if (error)\n throw new Error(error.error?.message || 'Failed to create project');\n return data;\n}\n\nexport async function updateProject(options: {\n projectId?: string;\n name: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.PATCH('/api/projects/{projectId}', {\n params: { path: { projectId: id } },\n body: { name: options.name },\n });\n if (error)\n throw new Error(error.error?.message || 'Failed to update project');\n return data;\n}\n\nexport async function deleteProject(options: { projectId?: string } = {}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.DELETE('/api/projects/{projectId}', {\n params: { path: { projectId: id } },\n });\n if (error)\n throw new Error(error.error?.message || 'Failed to delete project');\n return data ?? { success: true };\n}\n\n// === CLI Command Handlers ===\n\ninterface ProjectsCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n project?: string;\n name?: string;\n}\n\nasync function handleResult(\n fn: () => Promise<unknown>,\n options: ProjectsCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport async function listProjectsCommand(\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(() => listProjects(), options);\n}\n\nexport async function getProjectCommand(\n projectId: string | undefined,\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getProject({ projectId: projectId ?? options.project }),\n options,\n );\n}\n\nexport async function createProjectCommand(\n name: string,\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(() => createProject({ name }), options);\n}\n\nexport async function updateProjectCommand(\n projectId: string | undefined,\n options: ProjectsCommandOptions,\n): Promise<void> {\n const name = options.name;\n if (!name) {\n throw new Error('Missing required option: --name <name>');\n }\n await handleResult(\n () =>\n updateProject({\n projectId: projectId ?? options.project,\n name,\n }),\n options,\n );\n}\n\nexport async function deleteProjectCommand(\n projectId: string | undefined,\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteProject({ projectId: projectId ?? options.project }),\n options,\n );\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport { isStdinPiped, readStdin } from '../../core/stdin.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport interface ListFlowsOptions {\n projectId?: string;\n sort?: 'name' | 'updated_at' | 'created_at';\n order?: 'asc' | 'desc';\n includeDeleted?: boolean;\n}\n\nexport async function listFlows(options: ListFlowsOptions = {}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.GET('/api/projects/{projectId}/flows', {\n params: {\n path: { projectId: id },\n query: {\n sort: options.sort,\n order: options.order,\n include_deleted: options.includeDeleted ? 'true' : undefined,\n },\n },\n });\n if (error) throw new Error(error.error?.message || 'Failed to list flows');\n return data;\n}\n\nexport async function getFlow(options: { flowId: string; projectId?: string }) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.GET(\n '/api/projects/{projectId}/flows/{flowId}',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n },\n );\n if (error) throw new Error(error.error?.message || 'Failed to get flow');\n return data;\n}\n\nexport async function createFlow(options: {\n name: string;\n content: Record<string, unknown>;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.POST('/api/projects/{projectId}/flows', {\n params: { path: { projectId: id } },\n // Content is user-provided JSON; server validates the full schema\n body: { name: options.name, content: options.content } as never,\n });\n if (error) throw new Error(error.error?.message || 'Failed to create flow');\n return data;\n}\n\nexport async function updateFlow(options: {\n flowId: string;\n name?: string;\n content?: Record<string, unknown>;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const body: Record<string, unknown> = {};\n if (options.name !== undefined) body.name = options.name;\n if (options.content !== undefined) body.content = options.content;\n const { data, error } = await client.PATCH(\n '/api/projects/{projectId}/flows/{flowId}',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n // Dynamically constructed body; server validates the full schema\n body: body as never,\n },\n );\n if (error) throw new Error(error.error?.message || 'Failed to update flow');\n return data;\n}\n\nexport async function deleteFlow(options: {\n flowId: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.DELETE(\n '/api/projects/{projectId}/flows/{flowId}',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n },\n );\n if (error) throw new Error(error.error?.message || 'Failed to delete flow');\n return data ?? { success: true };\n}\n\nexport async function duplicateFlow(options: {\n flowId: string;\n name?: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.POST(\n '/api/projects/{projectId}/flows/{flowId}/duplicate',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n body: { name: options.name },\n },\n );\n if (error)\n throw new Error(error.error?.message || 'Failed to duplicate flow');\n return data;\n}\n\n// === CLI Command Handlers ===\n\ninterface FlowsCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n project?: string;\n}\n\nasync function handleResult(\n fn: () => Promise<unknown>,\n options: FlowsCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport async function listFlowsCommand(\n options: FlowsCommandOptions & {\n sort?: string;\n order?: string;\n includeDeleted?: boolean;\n },\n): Promise<void> {\n await handleResult(\n () =>\n listFlows({\n projectId: options.project,\n sort: options.sort as ListFlowsOptions['sort'],\n order: options.order as ListFlowsOptions['order'],\n includeDeleted: options.includeDeleted,\n }),\n options,\n );\n}\n\nexport async function getFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function createFlowCommand(\n name: string,\n options: FlowsCommandOptions & { content?: string },\n): Promise<void> {\n const content = options.content\n ? JSON.parse(options.content)\n : JSON.parse(await readFlowStdin());\n await handleResult(\n () => createFlow({ name, content, projectId: options.project }),\n options,\n );\n}\n\nexport async function updateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string; content?: string },\n): Promise<void> {\n const content = options.content ? JSON.parse(options.content) : undefined;\n await handleResult(\n () =>\n updateFlow({\n flowId,\n name: options.name,\n content,\n projectId: options.project,\n }),\n options,\n );\n}\n\nexport async function deleteFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function duplicateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string },\n): Promise<void> {\n await handleResult(\n () =>\n duplicateFlow({ flowId, name: options.name, projectId: options.project }),\n options,\n );\n}\n\nasync function readFlowStdin(): Promise<string> {\n if (!isStdinPiped()) {\n throw new Error('Content required: use --content or pipe via stdin');\n }\n return readStdin();\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport {\n authenticatedFetch,\n requireProjectId,\n resolveBaseUrl,\n} from '../../core/auth.js';\nimport { parseSSEEvents } from '../../core/sse.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\nimport { getFlow } from '../flows/index.js';\n\n// === Helpers ===\n\nasync function resolveConfigId(options: {\n flowId: string;\n projectId: string;\n flowName: string;\n}): Promise<string> {\n const flow = await getFlow({\n flowId: options.flowId,\n projectId: options.projectId,\n });\n const configs = (flow as { configs?: Array<{ id: string; name: string }> })\n .configs;\n if (!configs?.length) {\n throw new Error('Flow has no configs.');\n }\n const match = configs.find((c) => c.name === options.flowName);\n if (!match) {\n throw new Error(\n `Flow \"${options.flowName}\" not found. Available: ${configs.map((c) => c.name).join(', ')}`,\n );\n }\n return match.id;\n}\n\nasync function getAvailableFlowNames(options: {\n flowId: string;\n projectId: string;\n}): Promise<string[]> {\n const flow = await getFlow({\n flowId: options.flowId,\n projectId: options.projectId,\n });\n const configs = (flow as { configs?: Array<{ name: string }> }).configs;\n return configs?.map((c) => c.name) ?? [];\n}\n\n// === SSE Streaming ===\n\ninterface DeploymentResult {\n status: string;\n substatus?: string | null;\n type?: string;\n containerUrl?: string | null;\n publicUrl?: string | null;\n errorMessage?: string | null;\n [key: string]: unknown;\n}\n\nexport async function streamDeploymentStatus(\n projectId: string,\n deploymentId: string,\n options: {\n timeout?: number;\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n },\n): Promise<DeploymentResult> {\n const base = resolveBaseUrl();\n const timeoutMs = options.timeout ?? 120_000;\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${projectId}/deployments/${deploymentId}/stream`,\n {\n headers: { Accept: 'text/event-stream' },\n signal: options.signal ?? AbortSignal.timeout(timeoutMs),\n },\n );\n\n if (!response.ok) throw new Error(`Stream failed: ${response.status}`);\n if (!response.body) throw new Error('No response body');\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let result: DeploymentResult | null = null;\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const { parsed, remainder } = parseSSEEvents(buffer);\n buffer = remainder;\n\n for (const event of parsed) {\n if (event.type === 'status') {\n const data = JSON.parse(event.data);\n result = data;\n options.onStatus?.(data.status, data.substatus ?? null);\n }\n if (event.type === 'done') {\n return result!;\n }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n\n if (!result) throw new Error('Stream ended without terminal status');\n return result;\n}\n\n// === Programmatic API ===\n\nexport interface DeployOptions {\n flowId: string;\n projectId?: string;\n wait?: boolean;\n flowName?: string;\n timeout?: number; // ms, default 120_000\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n}\n\nexport async function deploy(options: DeployOptions) {\n const projectId = options.projectId ?? requireProjectId();\n const client = createApiClient();\n\n if (options.flowName) {\n const configId = await resolveConfigId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n return deployConfig({\n ...options,\n projectId,\n configId,\n timeout: options.timeout,\n signal: options.signal,\n onStatus: options.onStatus,\n });\n }\n\n // Legacy path\n const { data, error } = await client.POST(\n '/api/projects/{projectId}/flows/{flowId}/deploy',\n { params: { path: { projectId, flowId: options.flowId } } },\n );\n\n if (error) {\n const msg = error.error?.message || 'Failed to start deployment';\n const code = error.error?.code;\n if (code === 'AMBIGUOUS_CONFIG') {\n const names = await getAvailableFlowNames({\n flowId: options.flowId,\n projectId,\n });\n throw new Error(\n `This flow has multiple configs. Use --flow <name> to specify one.\\n` +\n `Available: ${names.join(', ')}`,\n );\n }\n throw new Error(msg);\n }\n\n if (!options.wait) return data;\n\n // Stream deployment status via SSE\n const result = await streamDeploymentStatus(projectId, data.deploymentId, {\n timeout: options.timeout,\n signal: options.signal,\n onStatus: options.onStatus,\n });\n\n return { ...data, ...result };\n}\n\n// TODO: Replace with typed client.POST() once api.gen.d.ts includes per-config routes\nasync function deployConfig(options: {\n flowId: string;\n projectId: string;\n configId: string;\n wait?: boolean;\n timeout?: number;\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n}) {\n const { flowId, projectId, configId } = options;\n const base = resolveBaseUrl();\n\n // 1. Trigger per-config deploy\n const response = await authenticatedFetch(\n `${base}/api/projects/${projectId}/flows/${flowId}/configs/${configId}/deploy`,\n { method: 'POST' },\n );\n if (!response.ok) {\n const body: { error?: { message?: string } } = await response\n .json()\n .catch(() => ({}));\n throw new Error(\n body.error?.message || `Deploy failed (${response.status})`,\n );\n }\n\n const data = await response.json();\n if (!options.wait) return data;\n\n // 2. Stream deployment status via SSE\n const result = await streamDeploymentStatus(projectId, data.deploymentId, {\n timeout: options.timeout,\n signal: options.signal,\n onStatus: options.onStatus,\n });\n\n return { ...data, ...result };\n}\n\nexport async function getDeployment(options: {\n flowId: string;\n projectId?: string;\n flowName?: string;\n}) {\n const projectId = options.projectId ?? requireProjectId();\n\n if (options.flowName) {\n const configId = await resolveConfigId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n const base = resolveBaseUrl();\n const response = await authenticatedFetch(\n `${base}/api/projects/${projectId}/flows/${options.flowId}/configs/${configId}/deploy`,\n );\n if (!response.ok) {\n const body: { error?: { message?: string } } = await response\n .json()\n .catch(() => ({}));\n throw new Error(body.error?.message || 'Failed to get deployment');\n }\n return response.json();\n }\n\n const client = createApiClient();\n\n const { data, error } = await client.GET(\n '/api/projects/{projectId}/flows/{flowId}/deploy',\n { params: { path: { projectId, flowId: options.flowId } } },\n );\n if (error)\n throw new Error(error.error?.message || 'Failed to get deployment');\n return data;\n}\n\n// === CLI Commands ===\n\ninterface DeployCommandOptions extends GlobalOptions {\n project?: string;\n flow?: string;\n wait?: boolean;\n timeout?: string;\n output?: string;\n json?: boolean;\n}\n\nconst statusLabels: Record<string, string> = {\n bundling: 'Building bundle...',\n 'bundling:building': 'Building bundle...',\n 'bundling:publishing': 'Publishing to web...',\n deploying: 'Deploying container...',\n 'deploying:provisioning': 'Provisioning container...',\n 'deploying:starting': 'Starting container...',\n active: 'Container is live',\n published: 'Published',\n failed: 'Deployment failed',\n};\n\nexport async function deployCommand(\n flowId: string,\n options: DeployCommandOptions,\n) {\n const log = createCLILogger(options);\n\n const timeoutMs = options.timeout\n ? parseInt(options.timeout, 10) * 1000\n : undefined;\n\n try {\n const result = await deploy({\n flowId,\n projectId: options.project,\n flowName: options.flow,\n wait: options.wait !== false,\n timeout: timeoutMs,\n onStatus: options.json\n ? undefined\n : (status, substatus) => {\n const key = substatus ? `${status}:${substatus}` : status;\n log.info(\n statusLabels[key] || statusLabels[status] || `Status: ${status}`,\n );\n },\n });\n\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n return;\n }\n\n const r = result as Record<string, unknown>;\n\n if (r.status === 'published') {\n log.info(`Published: ${r.publicUrl}`);\n } else if (r.status === 'active') {\n log.info(`Active: ${r.containerUrl}`);\n } else if (r.status === 'failed') {\n log.error(`Failed: ${r.errorMessage || 'Unknown error'}`);\n process.exit(1);\n } else if (r.status === 'bundling') {\n log.info(`Deployment started: ${r.deploymentId} (${r.type})`);\n } else {\n log.info(`Status: ${r.status}`);\n }\n } catch (err) {\n log.error(err instanceof Error ? err.message : 'Deploy failed');\n process.exit(1);\n }\n}\n\nexport async function getDeploymentCommand(\n flowId: string,\n options: DeployCommandOptions,\n) {\n const log = createCLILogger(options);\n\n try {\n const result = await getDeployment({\n flowId,\n projectId: options.project,\n flowName: options.flow,\n });\n\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n return;\n }\n\n if (!result) {\n log.info('No deployment found');\n return;\n }\n\n const r = result as Record<string, unknown>;\n log.info(`Deployment: ${r.id}`);\n log.info(`Type: ${r.type}`);\n log.info(`Status: ${r.status}`);\n if (r.containerUrl) log.info(`Endpoint: ${r.containerUrl}`);\n if (r.publicUrl) log.info(`URL: ${r.publicUrl}`);\n if (r.errorMessage) log.error(`Error: ${r.errorMessage}`);\n } catch (err) {\n log.error(err instanceof Error ? err.message : 'Failed to get deployment');\n process.exit(1);\n }\n}\n","import { getPlatform } from '@walkeros/core';\nimport {\n authenticatedFetch,\n requireProjectId,\n resolveBaseUrl,\n} from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport { loadFlowConfig } from '../../config/loader.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport interface ListDeploymentsOptions {\n projectId?: string;\n type?: 'web' | 'server';\n status?: string;\n}\n\nexport async function listDeployments(options: ListDeploymentsOptions = {}) {\n const id = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n const params = new URLSearchParams();\n if (options.type) params.set('type', options.type);\n if (options.status) params.set('status', options.status);\n const qs = params.toString();\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${id}/deployments${qs ? `?${qs}` : ''}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n 'Failed to list deployments',\n );\n }\n return response.json();\n}\n\nexport async function getDeploymentBySlug(options: {\n slug: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${id}/deployments/${options.slug}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n 'Failed to get deployment',\n );\n }\n return response.json();\n}\n\nexport async function createDeployment(options: {\n type: 'web' | 'server';\n label?: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${id}/deployments`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ type: options.type, label: options.label }),\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n 'Failed to create deployment',\n );\n }\n return response.json();\n}\n\nexport async function deleteDeployment(options: {\n slug: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${id}/deployments/${options.slug}`,\n { method: 'DELETE' },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n 'Failed to delete deployment',\n );\n }\n const data = await response.json().catch(() => null);\n return data ?? { success: true };\n}\n\n// === CLI Command Handlers ===\n\ninterface DeploymentsCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n project?: string;\n type?: string;\n status?: string;\n label?: string;\n}\n\nasync function handleResult(\n fn: () => Promise<unknown>,\n options: DeploymentsCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport async function listDeploymentsCommand(\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () =>\n listDeployments({\n projectId: options.project,\n type: options.type as ListDeploymentsOptions['type'],\n status: options.status,\n }),\n options,\n );\n}\n\nexport async function getDeploymentBySlugCommand(\n slug: string,\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getDeploymentBySlug({ slug, projectId: options.project }),\n options,\n );\n}\n\nexport async function createDeploymentCommand(\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () =>\n createDeployment({\n type: options.type as 'web' | 'server',\n label: options.label,\n projectId: options.project,\n }),\n options,\n );\n}\n\nexport async function deleteDeploymentCommand(\n slug: string,\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteDeployment({ slug, projectId: options.project }),\n options,\n );\n}\n\nexport async function createDeployCommand(\n config: string | undefined,\n options: DeploymentsCommandOptions & { flow?: string },\n): Promise<void> {\n const log = createCLILogger(options);\n\n try {\n let type: 'web' | 'server';\n\n if (!config) {\n log.error(\n 'Config required. Provide a flow config file or remote flow ID (cfg_xxx).',\n );\n process.exit(1);\n }\n\n // Detect: local file path vs remote flow ID\n const isRemoteFlow = config.startsWith('cfg_');\n\n if (isRemoteFlow) {\n // Fetch flow from API to determine type\n const id = options.project ?? requireProjectId();\n const base = resolveBaseUrl();\n const resp = await authenticatedFetch(\n `${base}/api/projects/${id}/flows/${config}`,\n );\n if (!resp.ok) {\n const body = await resp.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n `Failed to fetch flow ${config}`,\n );\n }\n const flow = (await resp.json()) as { content?: unknown };\n if (!flow.content) throw new Error('Flow has no content');\n\n const content = flow.content as { flows?: Record<string, unknown> };\n const flows = content.flows;\n if (!flows) throw new Error('Invalid flow content: missing flows');\n const flowName = options.flow ?? Object.keys(flows)[0];\n if (!flowName) throw new Error('No flows found in config');\n const flowConfig = flows[flowName];\n if (!flowConfig || typeof flowConfig !== 'object')\n throw new Error('Invalid flow config');\n\n if ('web' in flowConfig) type = 'web';\n else if ('server' in flowConfig) type = 'server';\n else throw new Error('Flow must have \"web\" or \"server\" key');\n } else {\n // Local file: use config loader + core getPlatform\n const result = await loadFlowConfig(config, {\n flowName: options.flow,\n });\n type = getPlatform(result.flowConfig);\n }\n\n // Create deployment via API\n const deployment = await createDeployment({\n type,\n label: options.label,\n projectId: options.project,\n });\n\n const result = deployment as Record<string, unknown>;\n\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n return;\n }\n\n // Human-readable output\n log.info(`Deployment created: ${result.id}`);\n log.info(` Slug: ${result.slug}`);\n log.info(` Type: ${result.type}`);\n if (result.deployToken) {\n log.info(` Token: ${result.deployToken}`);\n log.warn(' Save this token — it will not be shown again.');\n }\n log.info('');\n log.info('Run locally:');\n log.info(\n ` walkeros run ${isRemoteFlow ? 'flow.json' : config} --deploy ${result.id}`,\n );\n log.info('');\n log.info('Docker:');\n log.info(\n ` docker run -e WALKEROS_DEPLOY_TOKEN=${result.deployToken ?? '<token>'} \\\\`,\n );\n log.info(' -e WALKEROS_APP_URL=https://app.walkeros.io \\\\');\n log.info(' walkeros/flow:latest');\n } catch (err) {\n log.error(\n err instanceof Error ? err.message : 'Failed to create deployment',\n );\n process.exit(1);\n }\n}\n","// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand } from './commands/bundle/index.js';\nexport { simulateCommand } from './commands/simulate/index.js';\nexport { pushCommand } from './commands/push/index.js';\nexport { runCommand } from './commands/run/index.js';\nexport { validateCommand } from './commands/validate/index.js';\nexport { loginCommand } from './commands/login/index.js';\nexport { logoutCommand } from './commands/logout/index.js';\nexport { whoamiCommand } from './commands/auth/index.js';\nexport {\n listProjectsCommand,\n getProjectCommand,\n createProjectCommand,\n updateProjectCommand,\n deleteProjectCommand,\n} from './commands/projects/index.js';\nexport {\n listFlowsCommand,\n getFlowCommand,\n createFlowCommand,\n updateFlowCommand,\n deleteFlowCommand,\n duplicateFlowCommand,\n} from './commands/flows/index.js';\nexport {\n deployCommand,\n getDeploymentCommand,\n} from './commands/deploy/index.js';\nexport {\n createDeployCommand,\n listDeploymentsCommand,\n getDeploymentBySlugCommand,\n createDeploymentCommand,\n deleteDeploymentCommand,\n} from './commands/deployments/index.js';\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle, bundleRemote } from './commands/bundle/index.js';\nexport { simulate } from './commands/simulate/index.js';\nexport { push } from './commands/push/index.js';\nexport { run } from './commands/run/index.js';\nexport { validate } from './commands/validate/index.js';\nexport {\n getToken,\n getAuthHeaders,\n deployAuthenticatedFetch,\n requireProjectId,\n resolveBaseUrl,\n} from './core/auth.js';\nexport { createApiClient } from './core/api-client.js';\nexport {\n listProjects,\n getProject,\n createProject,\n updateProject,\n deleteProject,\n} from './commands/projects/index.js';\nexport { whoami } from './commands/auth/index.js';\nexport {\n listFlows,\n getFlow,\n createFlow,\n updateFlow,\n deleteFlow,\n duplicateFlow,\n} from './commands/flows/index.js';\nexport { deploy, getDeployment } from './commands/deploy/index.js';\nexport {\n listDeployments,\n getDeploymentBySlug,\n createDeployment,\n deleteDeployment,\n} from './commands/deployments/index.js';\nexport type { ListFlowsOptions } from './commands/flows/index.js';\nexport type { DeployOptions } from './commands/deploy/index.js';\nexport type { ListDeploymentsOptions } from './commands/deployments/index.js';\nexport { parseSSEEvents } from './core/sse.js';\nexport type { SSEEvent, SSEParseResult } from './core/sse.js';\n\n// === Utilities ===\n// Export utilities for programmatic usage\nexport { loadJsonConfig } from './config/utils.js';\nexport { findExample } from './commands/simulate/example-loader.js';\nexport { compareOutput } from './commands/simulate/compare.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 {\n SimulationResult,\n ExampleMatch,\n} from './commands/simulate/types.js';\nexport type { ExampleLookupResult } from './commands/simulate/example-loader.js';\nexport type { PushResult } from './commands/push/types.js';\nexport type {\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './commands/run/index.js';\nexport type { GlobalOptions } from './types/global.js';\nexport type {\n ValidateResult,\n ValidationType,\n ValidationError,\n ValidationWarning,\n} from './commands/validate/types.js';\n"],"mappings":"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","names":["readFileSync","fileURLToPath","dirname","join","p","instanceId","path","fs","getPlatform","path","existsSync","path","fs","path","fs","path","path","fs","path","existsSync","path","fs","logger","fs","fs","path","path","fs","path","fs","path","fs","path","fs","input","_","path","fs","c","logger","p","fs","path","path","fs","logger","path","fs","stats","s","d","m","v","k","fs","logger","path","logger","fs","getPlatform","r","fs","Level","logger","Level","c","fs","loggerConfig","m","logger","fs","path","path","JSDOM","VirtualConsole","fs","getPlatform","schemas","Level","logger","Level","schemas","fs","path","getPlatform","VirtualConsole","JSDOM","_","resolve","path","existsSync","z","z","z","z","z","z","z","z","z","z","existsSync","path","fs","fs","path","createLogger","Level","logger","loggerConfig","logger","loggerConfig","Level","createLogger","logger","path","startHeartbeat","chalk","schemas","path","schemas","validateFlowSetup","path","a","b","k","r","path","m","schemas","validate","e","chalk","logger","logger","f","r","logger","logger","fn","logger","handleResult","fn","logger","c","r","getPlatform","handleResult","fn","logger","result","getPlatform"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/cli-logger.ts","../src/lib/config-file.ts","../src/core/auth.ts","../src/version.ts","../src/commands/run/heartbeat.ts","../src/commands/bundle/index.ts","../src/core/index.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/core/stdin.ts","../src/core/sse.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/upload.ts","../src/commands/bundle/stats.ts","../src/core/api-client.ts","../src/commands/bundle/dockerfile.ts","../src/commands/simulate/simulator.ts","../src/commands/simulate/env-loader.ts","../src/commands/simulate/source-simulator.ts","../src/commands/simulate/index.ts","../src/commands/simulate/example-loader.ts","../src/commands/simulate/compare.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/schemas/validate.ts","../src/schemas/bundle.ts","../src/schemas/simulate.ts","../src/schemas/push.ts","../src/commands/run/utils.ts","../src/commands/run/execution.ts","../src/runtime/runner.ts","../src/runtime/heartbeat.ts","../src/commands/validate/index.ts","../src/commands/validate/validators/contract.ts","../src/commands/validate/validators/event.ts","../src/commands/validate/validators/flow.ts","../src/commands/validate/validators/mapping.ts","../src/commands/validate/validators/entry.ts","../src/commands/login/index.ts","../src/commands/logout/index.ts","../src/commands/auth/index.ts","../src/commands/projects/index.ts","../src/commands/flows/index.ts","../src/commands/deploy/index.ts","../src/commands/deployments/index.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk';\nimport { createLogger, Level } from '@walkeros/core';\nimport type { Logger } from '@walkeros/core';\n\nexport interface CLILoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n stderr?: boolean;\n}\n\n/**\n * Create a core Logger.Instance with CLI-appropriate behavior.\n *\n * Replaces the old CLI logger, adaptLogger, and createCollectorLoggerConfig.\n * One factory, one logger type, DRY.\n *\n * Behavior:\n * - ERROR: always shown (chalk red, via console.error) unless --json\n * - WARN: shown unless --silent or --json\n * - INFO: shown unless --silent or --json\n * - DEBUG: shown only with --verbose (and not --silent/--json)\n * - json(): shown unless --silent\n */\nexport function createCLILogger(\n options: CLILoggerOptions = {},\n): Logger.Instance {\n const {\n verbose = false,\n silent = false,\n json = false,\n stderr = false,\n } = options;\n const out = stderr ? console.error : console.log;\n\n return createLogger({\n // Let handler control visibility — pass everything through\n level: Level.DEBUG,\n handler: (level, message, _context, scope) => {\n // Build formatted message\n const scopePath = scope.length > 0 ? `[${scope.join(':')}] ` : '';\n const fullMessage = `${scopePath}${message}`;\n\n // ERROR: always shown unless json mode\n if (level === Level.ERROR) {\n if (!json) console.error(chalk.red(fullMessage));\n return;\n }\n\n // Non-errors suppressed in silent or json mode\n if (silent || json) return;\n\n // DEBUG: only with verbose\n if (level === Level.DEBUG) {\n if (!verbose) return;\n out(` ${fullMessage}`);\n return;\n }\n\n // WARN / INFO: normal output\n out(fullMessage);\n },\n jsonHandler: (data) => {\n if (!silent) out(JSON.stringify(data, null, 2));\n },\n });\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n existsSync,\n} from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport interface WalkerOSConfig {\n token: string;\n email: string;\n appUrl: string;\n}\n\n/**\n * Get the config directory path, respecting XDG_CONFIG_HOME\n */\nexport function getConfigDir(): string {\n const xdgConfig = process.env.XDG_CONFIG_HOME;\n const base = xdgConfig || join(homedir(), '.config');\n return join(base, 'walkeros');\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(): string {\n return join(getConfigDir(), 'config.json');\n}\n\n/**\n * Read the stored config, or null if not found\n */\nexport function readConfig(): WalkerOSConfig | null {\n const configPath = getConfigPath();\n try {\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content) as WalkerOSConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Write config to disk with 0600 permissions\n */\nexport function writeConfig(config: WalkerOSConfig): void {\n const dir = getConfigDir();\n mkdirSync(dir, { recursive: true });\n\n const configPath = getConfigPath();\n writeFileSync(configPath, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\n/**\n * Delete the config file (logout)\n */\nexport function deleteConfig(): boolean {\n const configPath = getConfigPath();\n if (existsSync(configPath)) {\n unlinkSync(configPath);\n return true;\n }\n return false;\n}\n\n/**\n * Resolve the API token using priority order:\n * 1. WALKEROS_TOKEN env var\n * 2. Config file (~/.config/walkeros/config.json)\n * 3. null (not authenticated)\n */\nexport function resolveToken(): {\n token: string;\n source: 'env' | 'config';\n} | null {\n const envToken = process.env.WALKEROS_TOKEN;\n if (envToken) return { token: envToken, source: 'env' };\n\n const config = readConfig();\n if (config?.token) return { token: config.token, source: 'config' };\n\n return null;\n}\n\n/**\n * Resolve the deploy token for container/heartbeat auth.\n * Only checks WALKEROS_DEPLOY_TOKEN env var (never stored in config file).\n */\nexport function resolveDeployToken(): string | null {\n return process.env.WALKEROS_DEPLOY_TOKEN ?? null;\n}\n\n/**\n * Resolve the app URL using priority order:\n * 1. WALKEROS_APP_URL env var\n * 2. Config file appUrl\n * 3. Default\n */\nexport function resolveAppUrl(): string {\n const envUrl = process.env.WALKEROS_APP_URL;\n if (envUrl) return envUrl;\n\n const config = readConfig();\n if (config?.appUrl) return config.appUrl;\n\n return 'https://app.walkeros.io';\n}\n","import {\n resolveToken,\n resolveAppUrl,\n resolveDeployToken,\n} from '../lib/config-file.js';\n\nexport function getToken(): string | undefined {\n const result = resolveToken();\n return result?.token;\n}\n\nexport function getAuthHeaders(): Record<string, string> {\n const token = getToken();\n if (!token) return {};\n return { Authorization: `Bearer ${token}` };\n}\n\nexport async function authenticatedFetch(\n url: string,\n init?: RequestInit,\n): Promise<Response> {\n const authHeaders = getAuthHeaders();\n const existingHeaders =\n init?.headers instanceof Headers\n ? Object.fromEntries(init.headers.entries())\n : Array.isArray(init?.headers)\n ? Object.fromEntries(init.headers)\n : (init?.headers ?? {});\n\n return fetch(url, {\n ...init,\n headers: { ...existingHeaders, ...authHeaders },\n });\n}\n\n/**\n * Fetch with deploy token priority for heartbeat calls.\n * Priority: WALKEROS_DEPLOY_TOKEN > WALKEROS_TOKEN > config file\n */\nexport async function deployAuthenticatedFetch(\n url: string,\n init?: RequestInit,\n): Promise<Response> {\n const deployToken = resolveDeployToken();\n const token = deployToken ?? getToken();\n\n if (!token)\n throw new Error(\n 'No authentication token available. Set WALKEROS_DEPLOY_TOKEN or run walkeros auth login.',\n );\n\n const existingHeaders =\n init?.headers instanceof Headers\n ? Object.fromEntries(init.headers.entries())\n : Array.isArray(init?.headers)\n ? Object.fromEntries(init.headers)\n : (init?.headers ?? {});\n\n return fetch(url, {\n ...init,\n headers: { ...existingHeaders, Authorization: `Bearer ${token}` },\n });\n}\n\nexport function resolveBaseUrl(): string {\n return resolveAppUrl();\n}\n\nexport function requireProjectId(): string {\n const projectId = process.env.WALKEROS_PROJECT_ID;\n if (!projectId) throw new Error('WALKEROS_PROJECT_ID not set.');\n return projectId;\n}\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","import { randomUUID } from 'crypto';\nimport {\n deployAuthenticatedFetch,\n requireProjectId,\n resolveBaseUrl,\n} from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { VERSION } from '../../version.js';\n\nexport interface HeartbeatOptions {\n deployment: string; // slug\n projectId?: string;\n url: string; // public URL of this server\n healthEndpoint?: string; // default: /health\n heartbeatInterval?: number; // seconds, default: 60\n}\n\nexport async function startHeartbeat(options: HeartbeatOptions) {\n const projectId = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n const instanceId = randomUUID();\n const healthEndpoint = options.healthEndpoint ?? '/health';\n const intervalSec = options.heartbeatInterval ?? 60;\n const log = createCLILogger();\n const startTime = Date.now();\n\n const heartbeatUrl = `${base}/api/projects/${projectId}/deployments/${options.deployment}/heartbeat`;\n\n // 1. Initial heartbeat (acts as registration)\n const initResponse = await deployAuthenticatedFetch(heartbeatUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n url: options.url,\n healthEndpoint,\n instanceId,\n cliVersion: VERSION,\n }),\n });\n\n if (!initResponse.ok) {\n const err = await initResponse.json().catch(() => ({}));\n throw new Error(\n (err as { error?: { message?: string } }).error?.message ||\n `Initial heartbeat failed (${initResponse.status})`,\n );\n }\n\n const initData = (await initResponse.json()) as {\n ack: boolean;\n deploymentId: string;\n action: string;\n };\n log.info(\n `Registered as ${instanceId} on deployment ${options.deployment} (${initData.deploymentId})`,\n );\n\n // 2. Ongoing heartbeat loop\n const heartbeatTimer = setInterval(async () => {\n try {\n const resp = await deployAuthenticatedFetch(heartbeatUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n instanceId,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n cliVersion: VERSION,\n metadata: {\n nodeVersion: process.version,\n platform: process.platform,\n },\n }),\n });\n\n if (resp.ok) {\n const data = (await resp.json()) as {\n action: string;\n versionNumber?: number;\n bundleUrl?: string;\n };\n if (data.action === 'update' && data.bundleUrl) {\n log.info(\n `Update available: version ${data.versionNumber}, downloading from ${data.bundleUrl}`,\n );\n // TODO: Hot-reload bundle from bundleUrl\n } else if (data.action === 'stop') {\n log.info('Received stop signal from server, shutting down...');\n await cleanup();\n process.exit(0);\n }\n }\n } catch (err) {\n log.error(\n `Heartbeat failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n );\n }\n }, intervalSec * 1000);\n\n // 3. Cleanup on shutdown\n const cleanup = async () => {\n clearInterval(heartbeatTimer);\n try {\n await deployAuthenticatedFetch(heartbeatUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n instanceId,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n shutting_down: true,\n }),\n });\n } catch {\n // Best effort\n }\n };\n\n process.on('SIGTERM', async () => {\n await cleanup();\n process.exit(0);\n });\n process.on('SIGINT', async () => {\n await cleanup();\n process.exit(0);\n });\n\n return { instanceId, deploymentId: initData.deploymentId, cleanup };\n}\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 { getPlatform } from '@walkeros/core';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n createTimer,\n createSuccessOutput,\n createErrorOutput,\n getErrorMessage,\n resolveAsset,\n getTmpPath,\n isStdinPiped,\n readStdin,\n writeResult,\n} from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n loadAllFlows,\n type LoadConfigResult,\n} from '../../config/index.js';\nimport { isUrl } from '../../config/utils.js';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { bundleCore } from './bundler.js';\nimport { uploadBundleToUrl, sanitizeUrl } from './upload.js';\nimport { displayStats, createStatsSummary } from './stats.js';\nimport { createApiClient } from '../../core/api-client.js';\nimport { generateDockerfile } from './dockerfile.js';\n\nexport interface BundleCommandOptions {\n config?: string;\n output?: string;\n flow?: string;\n all?: boolean;\n stats?: boolean;\n json?: boolean;\n cache?: boolean;\n verbose?: boolean;\n silent?: boolean;\n dockerfile?: boolean | string;\n}\n\n/**\n * Resolve -o path: if directory, use platform-default filename.\n */\nfunction resolveOutputPath(output: string, buildOptions: BuildOptions): string {\n const resolved = path.resolve(output);\n const ext = path.extname(resolved);\n if (output.endsWith('/') || output.endsWith(path.sep) || !ext) {\n const filename =\n buildOptions.platform === 'browser' ? 'walker.js' : 'bundle.mjs';\n return path.join(resolved, filename);\n }\n return resolved;\n}\n\nexport async function bundleCommand(\n options: BundleCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n // When writing to stdout, redirect all logs to stderr\n const writingToStdout = !options.output;\n const logger = createCLILogger({\n ...options,\n stderr: writingToStdout,\n });\n\n try {\n // Validate flag combinations\n if (options.flow && options.all) {\n throw new Error('Cannot use both --flow and --all flags together');\n }\n if (options.all && writingToStdout) {\n throw new Error(\n 'Cannot use --all without --output (multiple bundles need file output)',\n );\n }\n\n // Step 1: Load config — from stdin or file\n let rawConfig: unknown;\n let configPath: string;\n\n if (isStdinPiped() && !options.config) {\n const stdinContent = await readStdin();\n try {\n rawConfig = JSON.parse(stdinContent);\n } catch {\n throw new Error('Invalid JSON received on stdin');\n }\n configPath = path.resolve(process.cwd(), 'stdin.config.json');\n } else {\n const file = options.config || 'bundle.config.json';\n configPath = resolveAsset(file, 'config');\n rawConfig = await loadJsonConfig(configPath);\n }\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 // Resolve output path\n const outputIsUrl = options.output ? isUrl(options.output) : false;\n const uploadUrl = outputIsUrl ? options.output : undefined;\n\n if (outputIsUrl) {\n // URL output: bundle to temp file, upload after\n const ext = buildOptions.platform === 'browser' ? '.js' : '.mjs';\n buildOptions.output = getTmpPath(\n undefined,\n `url-bundle-${Date.now()}${ext}`,\n );\n } else if (options.output) {\n buildOptions.output = resolveOutputPath(options.output, buildOptions);\n } else {\n // Stdout mode: bundle to temp file, then write to stdout\n const ext = buildOptions.platform === 'browser' ? '.js' : '.mjs';\n buildOptions.output = getTmpPath(undefined, 'stdout-bundle' + ext);\n }\n\n // Log flow being built\n if (isMultiFlow || options.all) {\n logger.info(`Bundling flow: ${flowName}...`);\n } else {\n logger.info('Bundling...');\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({ flowName, success: true, stats });\n\n // Upload to URL if output was a presigned URL\n if (uploadUrl) {\n await uploadBundleToUrl(buildOptions.output, uploadUrl);\n logger.info(`Uploaded to: ${sanitizeUrl(uploadUrl)}`);\n await fs.remove(buildOptions.output);\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 // Write bundle content to stdout if no -o and not --json\n // (--json writes JSON metadata to stdout instead)\n if (writingToStdout && !options.json) {\n const bundleContent = await fs.readFile(buildOptions.output);\n await writeResult(bundleContent, {});\n }\n\n // Dockerfile only with -o\n if (options.dockerfile && options.output) {\n const platform = getPlatform(flowConfig);\n if (platform) {\n const outputDir = path.dirname(buildOptions.output);\n const customFile =\n typeof options.dockerfile === 'string'\n ? options.dockerfile\n : undefined;\n await generateDockerfile(\n outputDir,\n platform,\n logger,\n customFile,\n buildOptions.include,\n );\n }\n }\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n results.push({ flowName, success: false, error: errorMessage });\n\n if (!options.all) {\n throw error;\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 const jsonResult =\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 // JSON metadata is the result — write to stdout directly\n await writeResult(JSON.stringify(jsonResult, null, 2) + '\\n', {\n output: options.output,\n });\n } else {\n if (options.all) {\n logger.info(\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\n process.exit(0);\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const jsonError = createErrorOutput(errorMessage, duration);\n await writeResult(JSON.stringify(jsonError, null, 2) + '\\n', {\n output: options.output,\n });\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 = createCLILogger(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 * Bundle a flow remotely using the walkerOS cloud service.\n */\nexport async function bundleRemote(options: {\n content: Record<string, unknown>;\n flowName?: string;\n}) {\n const client = createApiClient();\n const body: Record<string, unknown> = { flow: options.content };\n if (options.flowName) body.flowName = options.flowName;\n const { data, error, response } = await client.POST('/api/bundle', {\n body: body as unknown as Record<string, never>,\n parseAs: 'text',\n });\n if (error)\n throw new Error(typeof error === 'string' ? error : 'Bundle failed');\n const js = data as unknown as string;\n const statsHeader = response.headers.get('X-Bundle-Stats');\n return {\n bundle: js,\n size: js.length,\n stats: statsHeader ? JSON.parse(statsHeader) : undefined,\n };\n}\n","export * from './cli-logger.js';\nexport * from './timer.js';\nexport * from './output.js';\nexport * from './tmp.js';\nexport * from './asset-resolver.js';\nexport * from './utils.js';\nexport * from './local-packages.js';\nexport * from './input-detector.js';\nexport * from './stdin.js';\nexport { getToken, getAuthHeaders, authenticatedFetch } from './auth.js';\nexport { parseSSEEvents } from './sse.js';\nexport type { SSEEvent, SSEParseResult } from './sse.js';\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\nimport fs from 'fs-extra';\nimport path from 'path';\n\n/**\n * Write command result to stdout or file.\n * Used by all commands to implement -o/--output flag.\n */\nexport async function writeResult(\n content: string | Buffer,\n options: { output?: string },\n): Promise<void> {\n if (options.output) {\n const outputPath = path.resolve(options.output);\n await fs.ensureDir(path.dirname(outputPath));\n await fs.writeFile(outputPath, content);\n } else {\n process.stdout.write(content);\n process.stdout.write('\\n');\n }\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 os.tmpdir() by default.\n */\n\nimport os from 'os';\nimport path from 'path';\n\nconst DEFAULT_TMP_ROOT = os.tmpdir();\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() // → \"/tmp\"\n * getTmpPath(undefined, 'entry.js') // → \"/tmp/entry.js\"\n * getTmpPath(undefined, 'cache', 'builds') // → \"/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 * Create a temp path resolver with the root directory baked in.\n *\n * Use this at entry points to capture the temp root once, then pass\n * the resolver to downstream functions. This prevents the class of bugs\n * where callers forget to pass tmpDir.\n *\n * @param tmpDir - Custom temp directory (optional, defaults to os.tmpdir())\n * @returns A function that resolves paths within the temp directory\n *\n * @example\n * ```typescript\n * const tmp = createTmpResolver(buildOptions.tempDir);\n * const cacheDir = tmp('cache', 'packages'); // root is baked in\n * ```\n */\nexport type TmpResolver = (...segments: string[]) => string;\n\nexport function createTmpResolver(tmpDir?: string): TmpResolver {\n const root = tmpDir || DEFAULT_TMP_ROOT;\n const absoluteRoot = path.isAbsolute(root) ? root : path.resolve(root);\n return (...segments: string[]) => 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';\nimport { authenticatedFetch } from '../core/auth.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 authenticatedFetch(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 '@walkeros/core';\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.Instance,\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.Instance,\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';\nimport { authenticatedFetch } from './auth.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 authenticatedFetch(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","export function isStdinPiped(): boolean {\n return !process.stdin.isTTY;\n}\n\nexport async function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const content = Buffer.concat(chunks).toString('utf-8');\n if (!content.trim()) {\n throw new Error('No input received on stdin');\n }\n return content;\n}\n","export interface SSEEvent {\n type: string;\n data: string;\n}\n\nexport interface SSEParseResult {\n parsed: SSEEvent[];\n remainder: string;\n}\n\nexport function parseSSEEvents(buffer: string): SSEParseResult {\n const events: SSEEvent[] = [];\n const blocks = buffer.split('\\n\\n');\n const remainder = blocks.pop() || '';\n\n for (const block of blocks) {\n if (!block.trim()) continue;\n\n let eventType = 'message'; // SSE default per spec\n const dataLines: string[] = [];\n\n for (const line of block.split('\\n')) {\n if (line.startsWith('event:')) {\n eventType = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice(5).trimStart());\n }\n // Ignore: comments (:), id:, retry:\n }\n\n if (dataLines.length > 0) {\n events.push({ type: eventType, data: dataLines.join('\\n') });\n }\n }\n\n return { parsed: events, remainder };\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 // Resolve with deferred mode first (markers don't affect platform detection)\n let flowConfig = getFlowConfig(setup, flowName, { deferred: true });\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 // For web: re-resolve without deferred to bake values at build time\n if (platform === 'web') {\n flowConfig = getFlowConfig(setup, flowName);\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, ENV_MARKER_PREFIX } from '@walkeros/core';\n\n/**\n * Type guard to check if a code value is an InlineCode object.\n * InlineCode has { push: string, type?: string, init?: string }\n */\nfunction isInlineCode(code: unknown): code is Flow.InlineCode {\n return (\n code !== null &&\n typeof code === 'object' &&\n !Array.isArray(code) &&\n 'push' in code\n );\n}\n\n/**\n * Validates that a reference has either package XOR code, not both or neither.\n * Throws descriptive error for invalid configurations.\n */\nfunction validateReference(\n type: string,\n name: string,\n ref: { package?: string; code?: unknown },\n): void {\n const hasPackage = !!ref.package;\n const hasCode = isInlineCode(ref.code);\n\n if (hasPackage && hasCode) {\n throw new Error(\n `${type} \"${name}\": Cannot specify both package and code. Use one or the other.`,\n );\n }\n if (!hasPackage && !hasCode) {\n throw new Error(`${type} \"${name}\": Must specify either package or code.`);\n }\n}\n\n/**\n * Generates inline code for any component type (source, destination, transformer).\n * Handles $code: prefix for push/init functions.\n *\n * @param inline - InlineCode object with push, optional init, optional type\n * @param config - Component configuration\n * @param env - Optional environment configuration\n * @param chain - Optional chain value (next for sources/transformers, before for destinations)\n * @param chainPropertyName - Name of chain property in output ('next' | 'before')\n * @param isDestination - Whether this is a destination (uses different code structure)\n */\nfunction generateInlineCode(\n inline: Flow.InlineCode,\n config: object,\n env?: object,\n chain?: string | string[],\n chainPropertyName?: 'next' | 'before',\n isDestination?: boolean,\n): string {\n const pushFn = inline.push.replace('$code:', '');\n const initFn = inline.init ? inline.init.replace('$code:', '') : undefined;\n const typeLine = inline.type ? `type: '${inline.type}',` : '';\n const chainLine =\n chain && chainPropertyName\n ? `${chainPropertyName}: ${JSON.stringify(chain)},`\n : '';\n\n // Destinations have a different structure - code is the instance directly\n if (isDestination) {\n return `{\n code: {\n ${typeLine}\n config: ${JSON.stringify(config || {})},\n ${initFn ? `init: ${initFn},` : ''}\n push: ${pushFn}\n },\n config: ${JSON.stringify(config || {})},\n env: ${JSON.stringify(env || {})}${\n chain\n ? `,\n ${chainLine.slice(0, -1)}`\n : ''\n }\n }`;\n }\n\n // Sources and transformers use factory pattern\n return `{\n code: async (context) => ({\n ${typeLine}\n config: context.config,\n ${initFn ? `init: ${initFn},` : ''}\n push: ${pushFn}\n }),\n config: ${JSON.stringify(config || {})},\n env: ${JSON.stringify(env || {})}${\n chain\n ? `,\n ${chainLine.slice(0, -1)}`\n : ''\n }\n }`;\n}\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { downloadPackages } from './package-manager.js';\nimport type { Logger } from '@walkeros/core';\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 */\nexport async function copyIncludes(\n includes: string[],\n sourceDir: string,\n outputDir: string,\n logger: Logger.Instance,\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 // Detect circular copies: source contains output or output contains source\n const resolvedOutput = path.resolve(outputDir);\n const resolvedSource = path.resolve(sourcePath);\n if (\n resolvedSource === resolvedOutput ||\n resolvedOutput.startsWith(resolvedSource + path.sep) ||\n resolvedSource.startsWith(resolvedOutput + path.sep)\n ) {\n throw new Error(\n `Circular include detected: \"${include}\" resolves to \"${resolvedSource}\" which overlaps with output directory \"${resolvedOutput}\"`,\n );\n }\n\n if (await fs.pathExists(sourcePath)) {\n await fs.copy(sourcePath, destPath);\n logger.debug(`Copied ${include} to output`);\n } else {\n logger.warn(`Include folder not found: ${include}`);\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\n/**\n * Validates flow config and warns about deprecated features.\n * Returns true if there are any issues that should stop the build.\n *\n * Note: We use (code as unknown) === true to check for deprecated code: true\n * because the type no longer includes true, but runtime values may still have it.\n */\nfunction validateFlowConfig(\n flowConfig: Flow.Config,\n logger: Logger.Instance,\n): boolean {\n let hasDeprecatedCodeTrue = false;\n\n // Check sources for code: true (deprecated, removed from types)\n const sources = flowConfig.sources || {};\n for (const [sourceId, source] of Object.entries(sources)) {\n if (\n source &&\n typeof source === 'object' &&\n (source.code as unknown) === true\n ) {\n logger.warn(\n `DEPRECATED: Source \"${sourceId}\" uses code: true which is no longer supported. ` +\n `Use $code: prefix in config values or create a source package instead.`,\n );\n hasDeprecatedCodeTrue = true;\n }\n }\n\n // Check destinations for code: true (deprecated, removed from types)\n const destinations = flowConfig.destinations || {};\n for (const [destId, dest] of Object.entries(destinations)) {\n if (dest && typeof dest === 'object' && (dest.code as unknown) === true) {\n logger.warn(\n `DEPRECATED: Destination \"${destId}\" uses code: true which is no longer supported. ` +\n `Use $code: prefix in config values or create a destination package instead.`,\n );\n hasDeprecatedCodeTrue = true;\n }\n }\n\n // Check transformers for code: true (deprecated, removed from types)\n const transformers = flowConfig.transformers || {};\n for (const [transformerId, transformer] of Object.entries(transformers)) {\n if (\n transformer &&\n typeof transformer === 'object' &&\n (transformer.code as unknown) === true\n ) {\n logger.warn(\n `DEPRECATED: Transformer \"${transformerId}\" uses code: true which is no longer supported. ` +\n `Use $code: prefix in config values or create a transformer package instead.`,\n );\n hasDeprecatedCodeTrue = true;\n }\n }\n\n if (hasDeprecatedCodeTrue) {\n logger.warn(\n `See https://www.elbwalker.com/docs/walkeros/getting-started/flow for migration guide.`,\n );\n }\n\n return hasDeprecatedCodeTrue;\n}\n\nexport async function bundleCore(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n logger: Logger.Instance,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n\n // Validate flow config and warn about deprecated features\n const hasDeprecatedFeatures = validateFlowConfig(flowConfig, logger);\n if (hasDeprecatedFeatures) {\n logger.warn('Skipping deprecated code: true entries from bundle.');\n }\n\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, TEMP_DIR);\n if (cached) {\n const cachedBuild = await getCachedBuild(configContent, TEMP_DIR);\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.info(`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 // Check user code for wildcard imports (same logic as collectBundleStats)\n const hasWildcardImports = /import\\s+\\*\\s+as\\s+\\w+\\s+from/.test(\n buildOptions.code || '',\n );\n return {\n totalSize: stats.size,\n packages: packageStats,\n buildTime: Date.now() - bundleStartTime,\n treeshakingEffective: !hasWildcardImports,\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 1.5: Auto-add collector if sources/destinations exist but collector not specified\n const hasSourcesOrDests =\n Object.keys(\n (flowConfig as unknown as { sources?: Record<string, unknown> })\n .sources || {},\n ).length > 0 ||\n Object.keys(\n (flowConfig as unknown as { destinations?: Record<string, unknown> })\n .destinations || {},\n ).length > 0;\n\n if (hasSourcesOrDests && !buildOptions.packages['@walkeros/collector']) {\n buildOptions.packages['@walkeros/collector'] = {};\n }\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 TEMP_DIR,\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 } finally {\n // Clean up esbuild worker threads to allow process to exit\n await esbuild.stop();\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.info(`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, TEMP_DIR);\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.Instance,\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 must be resolvable at runtime from the bundle's location.\n // In Docker: installed at /app/node_modules/ via local CLI install.\n // Outside Docker: user must install express/cors where Node can find them.\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 // Skip if code: true (uses built-in inline code destination)\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'code' in destConfig &&\n destConfig.code === true\n ) {\n continue;\n }\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 // Skip if code: true (uses built-in inline code source)\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'code' in sourceConfig &&\n sourceConfig.code === true\n ) {\n continue;\n }\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 transformer packages from flow configuration.\n * Extracts package names from transformers that have explicit 'package' field.\n */\nexport function detectTransformerPackages(\n flowConfig: Flow.Config,\n): Set<string> {\n const transformerPackages = new Set<string>();\n const transformers = (\n flowConfig as unknown as { transformers?: Record<string, unknown> }\n ).transformers;\n\n if (transformers) {\n for (const [transformerKey, transformerConfig] of Object.entries(\n transformers,\n )) {\n // Skip if code: true (uses built-in inline code transformer)\n if (\n typeof transformerConfig === 'object' &&\n transformerConfig !== null &&\n 'code' in transformerConfig &&\n transformerConfig.code === true\n ) {\n continue;\n }\n // Require explicit package field\n if (\n typeof transformerConfig === 'object' &&\n transformerConfig !== null &&\n 'package' in transformerConfig &&\n typeof transformerConfig.package === 'string'\n ) {\n transformerPackages.add(transformerConfig.package);\n }\n }\n }\n\n return transformerPackages;\n}\n\n/**\n * Detects store packages from flow configuration.\n * Extracts package names from stores that have explicit 'package' field.\n */\nexport function detectStorePackages(flowConfig: Flow.Config): Set<string> {\n const storePackages = new Set<string>();\n const stores = (flowConfig as unknown as { stores?: Record<string, unknown> })\n .stores;\n\n if (stores) {\n for (const [, storeConfig] of Object.entries(stores)) {\n if (\n typeof storeConfig === 'object' &&\n storeConfig !== null &&\n 'package' in storeConfig &&\n typeof storeConfig.package === 'string'\n ) {\n storePackages.add(storeConfig.package);\n }\n }\n }\n\n return storePackages;\n}\n\n/**\n * Detects explicit code imports from destinations, sources, and transformers.\n * Returns a map of package names to sets of export names.\n */\nexport function 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 // Skip code: true (built-in inline code)\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'code' in destConfig &&\n destConfig.code === true\n ) {\n continue;\n }\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 // Skip code: true (built-in inline code)\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'code' in sourceConfig &&\n sourceConfig.code === true\n ) {\n continue;\n }\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 // Check transformers\n const transformers = (\n flowConfig as unknown as { transformers?: Record<string, unknown> }\n ).transformers;\n\n if (transformers) {\n for (const [transformerKey, transformerConfig] of Object.entries(\n transformers,\n )) {\n // Skip code: true (built-in inline code)\n if (\n typeof transformerConfig === 'object' &&\n transformerConfig !== null &&\n 'code' in transformerConfig &&\n transformerConfig.code === true\n ) {\n continue;\n }\n if (\n typeof transformerConfig === 'object' &&\n transformerConfig !== null &&\n 'package' in transformerConfig &&\n typeof transformerConfig.package === 'string' &&\n 'code' in transformerConfig &&\n typeof transformerConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n const isAutoGenerated = transformerConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(transformerConfig.package)) {\n explicitCodeImports.set(transformerConfig.package, new Set());\n }\n explicitCodeImports\n .get(transformerConfig.package)!\n .add(transformerConfig.code);\n }\n }\n }\n }\n\n // Check stores\n const stores = (flowConfig as unknown as { stores?: Record<string, unknown> })\n .stores;\n\n if (stores) {\n for (const [, storeConfig] of Object.entries(stores)) {\n if (\n typeof storeConfig === 'object' &&\n storeConfig !== null &&\n 'package' in storeConfig &&\n typeof storeConfig.package === 'string' &&\n 'code' in storeConfig &&\n typeof storeConfig.code === 'string'\n ) {\n const isAutoGenerated = storeConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(storeConfig.package)) {\n explicitCodeImports.set(storeConfig.package, new Set());\n }\n explicitCodeImports.get(storeConfig.package)!.add(storeConfig.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 transformerPackages: Set<string>,\n storePackages: Set<string>,\n explicitCodeImports: Map<string, Set<string>>,\n): ImportGenerationResult {\n const importStatements: string[] = [];\n const examplesMappings: string[] = [];\n const usedPackages = new Set([\n ...destinationPackages,\n ...sourcePackages,\n ...transformerPackages,\n ...storePackages,\n ]);\n\n for (const [packageName, packageConfig] of Object.entries(packages)) {\n const isUsedByDestOrSource = usedPackages.has(packageName);\n const hasExplicitCode = explicitCodeImports.has(packageName);\n\n // Track what named imports we'll generate to avoid duplicates\n const namedImportsToGenerate: string[] = [];\n\n // 1. Generate default import for packages used by sources/destinations\n // UNLESS explicit code is specified (allows packages without default export)\n if (isUsedByDestOrSource && !hasExplicitCode) {\n const varName = packageNameToVariable(packageName);\n importStatements.push(`import ${varName} from '${packageName}';`);\n }\n\n // 2. Generate named import for explicit code (packages without default export)\n if (hasExplicitCode) {\n const codes = Array.from(explicitCodeImports.get(packageName)!);\n namedImportsToGenerate.push(...codes);\n }\n\n // 3. Process imports list (utilities and special syntax)\n if (packageConfig.imports && packageConfig.imports.length > 0) {\n const uniqueImports = [...new Set(packageConfig.imports)];\n\n // Handle special \"default as X\" syntax\n for (const imp of uniqueImports) {\n if (imp.startsWith('default as ')) {\n // Only generate default import if not already generated above\n if (!isUsedByDestOrSource || hasExplicitCode) {\n const defaultImportName = imp.replace('default as ', '');\n importStatements.push(\n `import ${defaultImportName} from '${packageName}';`,\n );\n }\n } else {\n // Add to named imports if not already in explicit code\n if (!namedImportsToGenerate.includes(imp)) {\n namedImportsToGenerate.push(imp);\n }\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 const examplesVarName = examplesImport.split(' as ')[1];\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 }\n\n // 4. Auto-import startFlow from collector (always required for flows)\n if (\n packageName === '@walkeros/collector' &&\n !namedImportsToGenerate.includes('startFlow')\n ) {\n namedImportsToGenerate.push('startFlow');\n }\n\n // 5. Generate combined named imports statement\n if (namedImportsToGenerate.length > 0) {\n const importList = namedImportsToGenerate.join(', ');\n importStatements.push(`import { ${importList} } from '${packageName}';`);\n }\n\n // Examples are no longer auto-imported - simulator loads them dynamically\n }\n\n return { importStatements, examplesMappings };\n}\n\nconst VALID_JS_IDENTIFIER = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\n/**\n * Validates that component names are valid JavaScript identifiers.\n * The bundler generates JS where flow config keys become property names,\n * so keys like \"gtag-wrapper\" would cause esbuild syntax errors.\n * Catches this early with a helpful error message suggesting camelCase.\n */\nexport function validateComponentNames(\n components: Record<string, unknown>,\n section: string,\n): void {\n for (const name of Object.keys(components)) {\n if (!VALID_JS_IDENTIFIER.test(name)) {\n throw new Error(\n `Invalid ${section} name \"${name}\": must be a valid JavaScript identifier (use camelCase, e.g., \"${name.replace(/-([a-z])/g, (_, c) => c.toUpperCase())}\")`,\n );\n }\n }\n}\n\n/**\n * Validates all $store: references point to defined stores.\n * Throws descriptive error on mismatch.\n */\nfunction validateStoreReferences(\n flowConfig: Flow.Config,\n storeIds: Set<string>,\n): void {\n const refs: Array<{ ref: string; location: string }> = [];\n\n function collectRefs(obj: unknown, path: string) {\n if (typeof obj === 'string' && obj.startsWith('$store:')) {\n refs.push({ ref: obj.slice(7), location: path });\n } else if (obj && typeof obj === 'object') {\n for (const [key, val] of Object.entries(obj as Record<string, unknown>)) {\n collectRefs(val, `${path}.${key}`);\n }\n }\n }\n\n // Scan all component env/config values\n for (const [section, components] of Object.entries({\n sources: flowConfig.sources || {},\n destinations: flowConfig.destinations || {},\n transformers: flowConfig.transformers || {},\n })) {\n for (const [id, component] of Object.entries(\n components as Record<string, Record<string, unknown>>,\n )) {\n collectRefs(component, `${section}.${id}`);\n }\n }\n\n for (const { ref, location } of refs) {\n if (!storeIds.has(ref)) {\n const available =\n storeIds.size > 0\n ? `Available stores: ${Array.from(storeIds).join(', ')}`\n : 'No stores defined';\n throw new Error(\n `Store reference \"$store:${ref}\" in ${location} — store \"${ref}\" not found. ${available}`,\n );\n }\n }\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, sources, transformers, and stores\n const destinationPackages = detectDestinationPackages(flowConfig);\n const sourcePackages = detectSourcePackages(flowConfig);\n const transformerPackages = detectTransformerPackages(flowConfig);\n const storePackages = detectStorePackages(flowConfig);\n const explicitCodeImports = detectExplicitCodeImports(flowConfig);\n\n // Validate $store: references before code generation\n const storeIds = new Set(\n Object.keys(\n (flowConfig as unknown as { stores?: Record<string, unknown> }).stores ||\n {},\n ),\n );\n validateStoreReferences(flowConfig, storeIds);\n\n // Validate component names are valid JS identifiers (they become property names in generated code)\n const flowWithSections = flowConfig as unknown as {\n sources?: Record<string, unknown>;\n destinations?: Record<string, unknown>;\n transformers?: Record<string, unknown>;\n stores?: Record<string, unknown>;\n };\n if (flowWithSections.sources)\n validateComponentNames(flowWithSections.sources, 'sources');\n if (flowWithSections.destinations)\n validateComponentNames(flowWithSections.destinations, 'destinations');\n if (flowWithSections.transformers)\n validateComponentNames(flowWithSections.transformers, 'transformers');\n if (flowWithSections.stores)\n validateComponentNames(flowWithSections.stores, 'stores');\n\n // Generate import statements\n const { importStatements } = generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n transformerPackages,\n storePackages,\n explicitCodeImports,\n );\n\n const importsCode = importStatements.join('\\n');\n const hasFlow =\n Object.values(flowConfig.sources || {}).some(\n (s) => s.package || isInlineCode(s.code),\n ) ||\n Object.values(flowConfig.destinations || {}).some(\n (d) => d.package || isInlineCode(d.code),\n );\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 {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n next?: string | string[];\n }\n >;\n destinations?: Record<\n string,\n {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n before?: string | string[];\n }\n >;\n transformers?: Record<\n string,\n {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n next?: string;\n }\n >;\n stores?: Record<\n string,\n {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n }\n >;\n collector?: unknown;\n };\n\n const sources = flowWithProps.sources || {};\n const destinations = flowWithProps.destinations || {};\n const transformers = flowWithProps.transformers || {};\n const stores = flowWithProps.stores || {};\n\n // Validate references before processing (skip deprecated code: true entries)\n Object.entries(sources).forEach(([name, source]) => {\n if ((source.code as unknown) !== true) {\n validateReference('Source', name, source);\n }\n });\n\n Object.entries(destinations).forEach(([name, dest]) => {\n if ((dest.code as unknown) !== true) {\n validateReference('Destination', name, dest);\n }\n });\n\n Object.entries(transformers).forEach(([name, transformer]) => {\n if ((transformer.code as unknown) !== true) {\n validateReference('Transformer', name, transformer);\n }\n });\n\n // Build sources (skip deprecated code: true entries)\n const sourcesEntries = Object.entries(sources)\n .filter(\n ([, source]) =>\n (source.code as unknown) !== true &&\n (source.package || isInlineCode(source.code)),\n )\n .map(([key, source]) => {\n // Handle inline code object\n if (isInlineCode(source.code)) {\n return ` ${key}: ${generateInlineCode(source.code, (source.config as object) || {}, source.env as object, source.next, 'next')}`;\n }\n\n // Handle package-based source\n let codeVar: string;\n if (\n source.code &&\n typeof source.code === 'string' &&\n explicitCodeImports.has(source.package!)\n ) {\n codeVar = source.code;\n } else {\n codeVar = packageNameToVariable(source.package!);\n }\n\n const configStr = source.config\n ? processConfigValue(source.config)\n : '{}';\n const envStr = source.env\n ? `,\\n env: ${processConfigValue(source.env)}`\n : '';\n // Include 'next' for source transformer chains\n const nextStr = source.next\n ? `,\\n next: ${JSON.stringify(source.next)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}${nextStr}\\n }`;\n });\n\n // Build destinations (skip deprecated code: true entries)\n const destinationsEntries = Object.entries(destinations)\n .filter(\n ([, dest]) =>\n (dest.code as unknown) !== true &&\n (dest.package || isInlineCode(dest.code)),\n )\n .map(([key, dest]) => {\n // Handle inline code object\n if (isInlineCode(dest.code)) {\n return ` ${key}: ${generateInlineCode(dest.code, (dest.config as object) || {}, dest.env as object, dest.before, 'before', true)}`;\n }\n\n // Handle package-based destination\n let codeVar: string;\n if (\n dest.code &&\n typeof dest.code === 'string' &&\n explicitCodeImports.has(dest.package!)\n ) {\n codeVar = dest.code;\n } else {\n codeVar = packageNameToVariable(dest.package!);\n }\n\n const configStr = dest.config ? processConfigValue(dest.config) : '{}';\n const envStr = dest.env\n ? `,\\n env: ${processConfigValue(dest.env)}`\n : '';\n // Include 'before' for destination transformer chains\n const beforeStr = dest.before\n ? `,\\n before: ${JSON.stringify(dest.before)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}${beforeStr}\\n }`;\n });\n\n // Build transformers (skip deprecated code: true entries)\n const transformersEntries = Object.entries(transformers)\n .filter(\n ([, transformer]) =>\n (transformer.code as unknown) !== true &&\n (transformer.package || isInlineCode(transformer.code)),\n )\n .map(([key, transformer]) => {\n // Handle inline code object\n if (isInlineCode(transformer.code)) {\n return ` ${key}: ${generateInlineCode(transformer.code, (transformer.config as object) || {}, transformer.env as object, transformer.next, 'next')}`;\n }\n\n // Handle package-based transformer\n let codeVar: string;\n if (\n transformer.code &&\n typeof transformer.code === 'string' &&\n explicitCodeImports.has(transformer.package!)\n ) {\n codeVar = transformer.code;\n } else {\n codeVar = packageNameToVariable(transformer.package!);\n }\n\n const configStr = transformer.config\n ? processConfigValue(transformer.config)\n : '{}';\n const envStr = transformer.env\n ? `,\\n env: ${processConfigValue(transformer.env)}`\n : '';\n // Include 'next' for transformer chains (top-level, consistent with before)\n const nextStr = transformer.next\n ? `,\\n next: ${JSON.stringify(transformer.next)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}${nextStr}\\n }`;\n });\n\n // Build stores\n Object.entries(stores).forEach(([name, store]) => {\n if (store.package || isInlineCode(store.code)) {\n validateReference('Store', name, store);\n }\n });\n\n const storesEntries = Object.entries(stores)\n .filter(([, store]) => store.package || isInlineCode(store.code))\n .map(([key, store]) => {\n if (isInlineCode(store.code)) {\n return ` ${key}: ${generateInlineCode(store.code, (store.config as object) || {}, store.env as object)}`;\n }\n\n let codeVar: string;\n if (\n store.code &&\n typeof store.code === 'string' &&\n explicitCodeImports.has(store.package!)\n ) {\n codeVar = store.code;\n } else {\n codeVar = packageNameToVariable(store.package!);\n }\n\n const configStr = store.config ? processConfigValue(store.config) : '{}';\n const envStr = store.env\n ? `,\\n env: ${processConfigValue(store.env)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}\\n }`;\n });\n\n // Build collector\n const collectorStr = flowWithProps.collector\n ? `,\\n ...${processConfigValue(flowWithProps.collector)}`\n : '';\n\n // Build transformers section (only if transformers exist)\n const transformersStr =\n transformersEntries.length > 0\n ? `,\\n transformers: {\\n${transformersEntries.join(',\\n')}\\n }`\n : '';\n\n // Build stores section (only if stores exist)\n const storesStr =\n storesEntries.length > 0\n ? `,\\n stores: {\\n${storesEntries.join(',\\n')}\\n }`\n : '';\n\n return `{\n sources: {\n${sourcesEntries.join(',\\n')}\n },\n destinations: {\n${destinationsEntries.join(',\\n')}\n }${transformersStr}${storesStr}${collectorStr}\n}`;\n}\n\n/**\n * Process config value for serialization.\n * Handles $code: prefix to output raw JavaScript instead of quoted strings.\n */\nfunction processConfigValue(value: unknown): string {\n return serializeWithCode(value, 0);\n}\n\n/**\n * Serialize a value, handling $code: prefix for inline JavaScript.\n * Values starting with \"$code:\" are output as raw JS (no quotes).\n */\nexport function serializeWithCode(value: unknown, indent: number): string {\n const spaces = ' '.repeat(indent);\n const nextSpaces = ' '.repeat(indent + 1);\n\n // Handle $code: and $store: prefixes - output raw JavaScript\n if (typeof value === 'string') {\n if (value.startsWith('$store:')) {\n const storeId = value.slice(7);\n return `stores.${storeId}`;\n }\n\n if (value.startsWith('$code:')) {\n return value.slice(6); // Strip prefix, output raw JS\n }\n\n // Deferred env markers → raw process.env expressions in bundle output\n // The marker regex uses a negative lookahead (?!__WALKEROS_ENV) to stop\n // the default value capture BEFORE the next marker prefix. Without this,\n // `__WALKEROS_ENV:A://__WALKEROS_ENV:B` would be parsed as one marker\n // with A's default consuming the entire rest of the string.\n const esc = ENV_MARKER_PREFIX.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const markerRe = new RegExp(\n esc +\n '([a-zA-Z_][a-zA-Z0-9_]*)' +\n '(?::(' +\n '(?:(?!' +\n esc +\n ')[^\\\\s\"\\'])' +\n '*))?',\n 'g',\n );\n\n if (markerRe.test(value)) {\n markerRe.lastIndex = 0; // reset after test()\n\n // Pure marker (entire string is one marker)\n const pureRe = new RegExp(\n '^' +\n esc +\n '([a-zA-Z_][a-zA-Z0-9_]*)' +\n '(?::(' +\n '(?:(?!' +\n esc +\n ')[^\\\\s\"\\'])' +\n '*))?$',\n );\n const pureMatch = value.match(pureRe);\n if (pureMatch) {\n const [, name, defaultValue] = pureMatch;\n return defaultValue !== undefined\n ? `process.env[${JSON.stringify(name)}] ?? ${JSON.stringify(defaultValue)}`\n : `process.env[${JSON.stringify(name)}]`;\n }\n\n // Mixed content → template literal\n // Escape backticks and non-interpolation $ in static parts to prevent\n // broken/exploitable template literals (e.g. \"Price is $5\" → \"$5\" would\n // be interpreted as ${5} without escaping).\n const segments: string[] = [];\n let lastIndex = 0;\n markerRe.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = markerRe.exec(value)) !== null) {\n // Static text before this marker — escape ` and $\n const staticPart = value\n .slice(lastIndex, m.index)\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$(?!{)/g, '\\\\$');\n const [, name, defaultValue] = m;\n const envExpr =\n defaultValue !== undefined\n ? `\\${process.env[${JSON.stringify(name)}] ?? ${JSON.stringify(defaultValue)}}`\n : `\\${process.env[${JSON.stringify(name)}]}`;\n segments.push(staticPart + envExpr);\n lastIndex = m.index + m[0].length;\n }\n // Trailing static text\n const trailing = value\n .slice(lastIndex)\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$(?!{)/g, '\\\\$');\n segments.push(trailing);\n return '`' + segments.join('') + '`';\n }\n\n return JSON.stringify(value);\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n if (value.length === 0) return '[]';\n const items = value.map(\n (v) => nextSpaces + serializeWithCode(v, indent + 1),\n );\n return `[\\n${items.join(',\\n')}\\n${spaces}]`;\n }\n\n // Handle objects\n if (value !== null && typeof value === 'object') {\n const entries = Object.entries(value);\n if (entries.length === 0) return '{}';\n const props = entries.map(\n ([k, v]) =>\n `${nextSpaces}${JSON.stringify(k)}: ${serializeWithCode(v, indent + 1)}`,\n );\n return `{\\n${props.join(',\\n')}\\n${spaces}}`;\n }\n\n // Handle primitives (numbers, booleans, null)\n return JSON.stringify(value);\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 // When runner provides external server, strip port from sources\n // so they don't self-listen (runner owns the port)\n if (context.externalServer && config.sources) {\n for (const src of Object.values(config.sources)) {\n if (src.config && src.config.settings && 'port' in src.config.settings) {\n delete src.config.settings.port;\n }\n }\n }\n\n const result = await startFlow(config);\n\n // Discover httpHandler from initialized sources (duck-typing, no source-type coupling)\n const httpSource = Object.values(result.collector.sources || {})\n .find(s => 'httpHandler' in s && typeof s.httpHandler === 'function');\n\n return { ...result, httpHandler: httpSource ? httpSource.httpHandler : undefined };\n}`;\n }\n}\n","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { resolveLocalPackage, copyLocalPackage } from '../../core/index.js';\nimport type { Logger } from '@walkeros/core';\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 let timer: ReturnType<typeof setTimeout>;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(errorMessage)), ms);\n });\n try {\n return await Promise.race([promise, timeout]);\n } finally {\n clearTimeout(timer!);\n }\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.Instance,\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.Instance,\n useCache = true,\n configDir?: string, // For resolving relative local paths\n tmpDir?: string,\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 const cachedPath = await getCachedPackagePath(pkg, tmpDir);\n\n if (useCache && (await isPackageCached(pkg, tmpDir))) {\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(tmpDir, '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 URL Upload\n *\n * Handles uploading bundle output to presigned URLs (e.g., S3).\n */\n\nimport fs from 'fs-extra';\n\n/**\n * Strip query parameters from a URL for safe logging.\n * Presigned URLs contain sensitive tokens in query params.\n */\nexport function sanitizeUrl(url: string): string {\n return url.split('?')[0];\n}\n\n/**\n * Upload a bundle file to a URL via HTTP PUT.\n *\n * @param filePath - Path to the bundle file to upload\n * @param url - Presigned URL to PUT the bundle to\n * @param timeoutMs - Request timeout in milliseconds (default: 30000)\n */\nexport async function uploadBundleToUrl(\n filePath: string,\n url: string,\n timeoutMs = 30_000,\n): Promise<void> {\n const bundleContent = await fs.readFile(filePath);\n\n const doUpload = async (attempt: number): Promise<void> => {\n const response = await fetch(url, {\n method: 'PUT',\n body: bundleContent,\n headers: {\n 'Content-Type': 'application/javascript',\n 'Content-Length': String(bundleContent.length),\n },\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (response.status >= 500 && attempt === 1) {\n return doUpload(2);\n }\n\n if (!response.ok) {\n throw new Error(\n `Upload failed: ${response.status} ${response.statusText}`,\n );\n }\n };\n\n await doUpload(1);\n}\n","/**\n * Bundle statistics display utilities\n */\nimport { formatBytes } from '../../core/index.js';\nimport type { BundleStats } from './bundler.js';\nimport type { Logger } from '@walkeros/core';\n\n/**\n * Display detailed bundle statistics to console\n */\nexport function displayStats(\n stats: BundleStats,\n logger: Logger.Instance,\n): 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 createClient from 'openapi-fetch';\nimport type { paths } from '../types/api.gen.js';\nimport { getToken, resolveBaseUrl } from './auth.js';\n\nexport function createApiClient() {\n const token = getToken();\n if (!token) throw new Error('WALKEROS_TOKEN not set.');\n\n return createClient<paths>({\n baseUrl: resolveBaseUrl(),\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n });\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Logger } from '@walkeros/core';\n\nexport function buildDockerfileContent(\n platform: 'web' | 'server',\n includedFolders: string[],\n): string {\n const bundleFile = platform === 'web' ? 'walker.js' : 'bundle.mjs';\n\n const lines = [\n '# Generated by walkeros CLI',\n 'FROM walkeros/flow:latest',\n '',\n `COPY ${bundleFile} /app/flow/${bundleFile}`,\n ];\n\n for (const folder of includedFolders) {\n const name = path.basename(folder);\n lines.push(`COPY ${name}/ /app/flow/${name}/`);\n }\n\n lines.push('', `ENV BUNDLE=/app/flow/${bundleFile}`, '', 'EXPOSE 8080', '');\n\n return lines.join('\\n');\n}\n\nexport async function generateDockerfile(\n outputDir: string,\n platform: 'web' | 'server',\n logger: Logger.Instance,\n customFile?: string,\n includedFolders?: string[],\n): Promise<void> {\n const destPath = path.join(outputDir, 'Dockerfile');\n\n // Copy mode: use custom file if it exists\n if (customFile && (await fs.pathExists(customFile))) {\n await fs.copy(customFile, destPath);\n logger.info(`Dockerfile: ${destPath} (copied from ${customFile})`);\n return;\n }\n\n // Generate mode\n const dockerfile = buildDockerfileContent(platform, includedFolders || []);\n await fs.writeFile(destPath, dockerfile);\n logger.info(`Dockerfile: ${destPath}`);\n}\n","import fs from 'fs-extra';\nimport type { Destination, Simulation, WalkerOS } from '@walkeros/core';\nimport { simulate } from '@walkeros/collector';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n detectInput,\n type Platform,\n} from '../../core/index.js';\nimport { loadFlowConfig, isObject } from '../../config/index.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadDestinationEnvs } from './env-loader.js';\nimport type { SimulateCommandOptions, SimulationResult } from './types.js';\n\n/**\n * Convert Simulation.Call[] to CLI's usage format\n */\nfunction callsToUsage(\n destName: string,\n calls: Simulation.Call[],\n): Record<\n string,\n Array<{ type: 'call'; path: string; args: unknown[]; timestamp: number }>\n> {\n if (!calls.length) return {};\n return {\n [destName]: calls.map((c) => ({\n type: 'call' as const,\n path: c.fn,\n args: c.args,\n timestamp: c.ts,\n })),\n };\n}\n\n/**\n * Main simulation orchestrator\n */\nexport async function simulateCore(\n inputPath: string,\n event: unknown,\n options: Pick<\n SimulateCommandOptions,\n 'flow' | 'json' | 'verbose' | 'silent' | 'platform' | 'step'\n > = {},\n): Promise<SimulationResult> {\n const logger = createCLILogger({\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 flow: options.flow,\n step: options.step,\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: Record<string, unknown> = {\n result: result.elbResult,\n usage: result.usage,\n duration: result.duration,\n };\n if (result.capturedEvents) {\n output.capturedEvents = result.capturedEvents;\n }\n if (result.exampleMatch) {\n output.exampleMatch = result.exampleMatch;\n }\n return JSON.stringify(output, null, 2);\n }\n\n const lines: string[] = [];\n\n if (result.success) {\n lines.push('Simulation completed');\n } else {\n lines.push(`Simulation failed: ${result.error}`);\n }\n\n if (result.capturedEvents) {\n lines.push(`Captured ${result.capturedEvents.length} event(s)`);\n for (const evt of result.capturedEvents) {\n lines.push(` - ${(evt as { name?: string }).name || 'unknown'}`);\n }\n }\n\n if (result.exampleMatch) {\n const em = result.exampleMatch;\n if (em.match) {\n lines.push(`Example \"${em.name}\" (${em.step}): PASS`);\n } else {\n lines.push(`Example \"${em.name}\" (${em.step}): FAIL`);\n if (em.diff) {\n lines.push(em.diff);\n }\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Execute simulation using destination-provided mock environments.\n * Only accepts Flow.Setup config files.\n */\nexport async function executeSimulation(\n event: unknown,\n inputPath: string,\n platformOverride?: Platform,\n options: {\n flow?: string;\n step?: string;\n verbose?: boolean;\n } = {},\n): Promise<SimulationResult> {\n const startTime = Date.now();\n const tempDir = getTmpPath();\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 throw new Error(\n `Input \"${inputPath}\" is not valid JSON config. ` +\n 'simulate only accepts Flow.Setup config files.',\n );\n }\n\n return await executeConfigSimulation(\n detected.content,\n inputPath,\n typedEvent,\n tempDir,\n startTime,\n options.flow,\n options.step,\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 * Parse step target into type + name.\n * E.g., \"destination.gtag\" → { type: \"destination\", name: \"gtag\" }\n */\nfunction parseStepTarget(\n stepTarget: string | undefined,\n flowConfig: Record<string, unknown>,\n): {\n type: 'destination' | 'transformer';\n name: string;\n config: Record<string, unknown>;\n} {\n if (stepTarget) {\n const dotIndex = stepTarget.indexOf('.');\n if (dotIndex > -1) {\n const type = stepTarget.substring(0, dotIndex) as\n | 'destination'\n | 'transformer';\n const name = stepTarget.substring(dotIndex + 1);\n const section = (flowConfig as Record<string, Record<string, unknown>>)[\n type + 's'\n ];\n if (!section?.[name]) {\n throw new Error(`Step \"${stepTarget}\" not found in flow config`);\n }\n return { type, name, config: section[name] as Record<string, unknown> };\n }\n }\n\n // Default: first destination\n const destinations = (\n flowConfig as { destinations?: Record<string, unknown> }\n ).destinations;\n if (destinations) {\n const [name, config] = Object.entries(destinations)[0];\n return {\n type: 'destination',\n name,\n config: config as Record<string, unknown>,\n };\n }\n\n throw new Error('No destination found in flow config');\n}\n\n/**\n * Execute simulation from config JSON using unified simulate().\n * Uses direct package imports instead of bundling.\n */\nasync function executeConfigSimulation(\n _content: string,\n configPath: string,\n typedEvent: { name: string; data?: unknown },\n tempDir: string,\n startTime: number,\n flowName?: string,\n stepTarget?: string,\n): Promise<SimulationResult> {\n // Load config\n const { flowConfig } = await loadFlowConfig(configPath, {\n flowName,\n });\n\n // Parse step target\n const step = parseStepTarget(\n stepTarget,\n flowConfig as unknown as Record<string, unknown>,\n );\n\n if (step.type === 'destination') {\n const packageName = step.config.package as string;\n if (!packageName) {\n throw new Error(`Destination \"${step.name}\" has no package field`);\n }\n\n // Load destination code\n const destModule = await import(packageName);\n const code: Destination.Instance =\n destModule.default || Object.values(destModule)[0];\n\n // Load env mocks from /dev exports\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n const envs = await loadDestinationEnvs(destinations || {});\n const destEnv = envs[step.name];\n\n const result = await simulate({\n step: 'destination',\n name: step.name,\n code,\n event: typedEvent as WalkerOS.DeepPartialEvent,\n config: step.config.config as Record<string, unknown>,\n env: destEnv?.push,\n track: destEnv?.simulation,\n });\n\n const duration = Date.now() - startTime;\n\n return {\n success: !result.error,\n error: result.error?.message,\n usage: callsToUsage(step.name, result.calls),\n duration,\n logs: [],\n };\n }\n\n if (step.type === 'transformer') {\n const packageName = step.config.package as string;\n if (!packageName) {\n throw new Error(`Transformer \"${step.name}\" has no package field`);\n }\n\n // Load transformer code\n const mod = await import(packageName);\n const code = mod.default || Object.values(mod)[0];\n\n const result = await simulate({\n step: 'transformer',\n name: step.name,\n code,\n event: typedEvent as WalkerOS.DeepPartialEvent,\n config: step.config.config as Record<string, unknown>,\n });\n\n const duration = Date.now() - startTime;\n\n return {\n success: !result.error,\n error: result.error?.message,\n capturedEvents: result.events,\n duration,\n usage: {},\n logs: [],\n };\n }\n\n throw new Error(`Unknown step type: ${step.type}`);\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 { JSDOM, VirtualConsole } from 'jsdom';\nimport { simulate } from '@walkeros/collector';\nimport type { Source } from '@walkeros/core';\nimport type { SimulationResult } from './types.js';\nimport { getErrorMessage } from '../../core/index.js';\n\ninterface SourceSimulationOptions {\n flow?: string;\n sourceStep: string;\n json?: boolean;\n verbose?: boolean;\n silent?: boolean;\n}\n\n/**\n * Load source code and optional setup from an npm package.\n */\nasync function loadSourcePackage(\n packageName: string,\n): Promise<{ code: Source.Init; setup?: Source.SetupFn }> {\n const mainModule = await import(packageName);\n const code = mainModule.default || Object.values(mainModule)[0];\n if (!code || typeof code !== 'function') {\n throw new Error(`Package ${packageName} missing source init function`);\n }\n\n let setup: Source.SetupFn | undefined;\n try {\n const devModule = await import(`${packageName}/dev`);\n const examples = devModule.examples || devModule.default?.examples;\n if (examples?.setup && typeof examples.setup === 'function') {\n setup = examples.setup;\n }\n } catch {\n // No dev exports — skip\n }\n\n return { code, setup };\n}\n\n/**\n * Simulate a source using JSDOM + unified simulate().\n */\nexport async function simulateSourceCLI(\n flowConfig: Record<string, unknown>,\n setupInput: unknown,\n options: SourceSimulationOptions,\n): Promise<SimulationResult> {\n const startTime = Date.now();\n\n try {\n const sources = (\n flowConfig as {\n sources?: Record<\n string,\n { package?: string; config?: Record<string, unknown> }\n >;\n }\n ).sources;\n if (!sources) {\n throw new Error('Flow config has no sources');\n }\n\n const sourceConfig = sources[options.sourceStep];\n if (!sourceConfig) {\n const available = Object.keys(sources).join(', ');\n throw new Error(\n `Source \"${options.sourceStep}\" not found. Available: ${available}`,\n );\n }\n if (!sourceConfig.package) {\n throw new Error(`Source \"${options.sourceStep}\" has no package field`);\n }\n\n // Load source code + setup\n const { code, setup } = await loadSourcePackage(sourceConfig.package);\n\n // Create JSDOM\n const virtualConsole = new VirtualConsole();\n const dom = new JSDOM(\n '<!DOCTYPE html><html><head></head><body></body></html>',\n {\n url: 'http://localhost',\n runScripts: 'dangerously',\n pretendToBeVisual: true,\n virtualConsole,\n },\n );\n\n const env: Source.SimulationEnv = {\n window: dom.window as unknown as Window & typeof globalThis,\n document: dom.window.document as unknown as Document,\n localStorage: dom.window.localStorage as unknown as Storage,\n };\n\n // Use unified simulate()\n const result = await simulate({\n step: 'source',\n name: options.sourceStep,\n code,\n config: sourceConfig.config || {},\n setup,\n input: setupInput,\n env,\n });\n\n // Cleanup\n dom.window.close();\n\n return {\n success: !result.error,\n error: result.error?.message,\n capturedEvents: result.events,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n error: getErrorMessage(error),\n duration: Date.now() - startTime,\n };\n }\n}\n","import { simulateCore, formatSimulationResult } from './simulator.js';\nimport { simulateSourceCLI } from './source-simulator.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n getTmpPath,\n isStdinPiped,\n readStdin,\n writeResult,\n} from '../../core/index.js';\nimport { loadJsonFromSource, loadJsonConfig } from '../../config/index.js';\nimport { validateFlowSetup } from '../../config/validators.js';\nimport { findExample } from './example-loader.js';\nimport { compareOutput } from './compare.js';\nimport type { SimulateCommandOptions, SimulationResult } from './types.js';\nimport type { SimulateOptions, Platform } from '../../schemas/simulate.js';\nimport type { Flow } from '@walkeros/core';\n\n/**\n * CLI command handler for simulate command\n */\nexport async function simulateCommand(\n options: SimulateCommandOptions,\n): Promise<void> {\n const logger = createCLILogger({ ...options, stderr: true });\n const startTime = Date.now();\n\n try {\n // Resolve config: stdin > argument > default\n let config: string;\n if (isStdinPiped() && !options.config) {\n const stdinContent = await readStdin();\n const fs = await import('fs-extra');\n const path = await import('path');\n const tmpPath = getTmpPath(undefined, 'stdin-simulate.json');\n await fs.default.ensureDir(path.default.dirname(tmpPath));\n await fs.default.writeFile(tmpPath, stdinContent, 'utf-8');\n config = tmpPath;\n } else {\n config = options.config || 'bundle.config.json';\n }\n\n const result = await simulate(config, options.event, {\n flow: options.flow,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n platform: options.platform,\n example: options.example,\n step: options.step,\n });\n\n // Add duration\n const resultWithDuration = {\n ...result,\n duration: (Date.now() - startTime) / 1000,\n };\n\n // Format and write result\n const formatted = formatSimulationResult(resultWithDuration, {\n json: options.json,\n });\n await writeResult(formatted + '\\n', { output: options.output });\n\n const exitCode =\n !result.success || (result.exampleMatch && !result.exampleMatch.match)\n ? 1\n : 0;\n process.exit(exitCode);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const errorOutput = JSON.stringify(\n {\n success: false,\n error: errorMessage,\n duration: (Date.now() - startTime) / 1000,\n },\n null,\n 2,\n );\n await writeResult(errorOutput + '\\n', { output: options.output });\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: SimulateOptions & {\n flow?: string;\n platform?: Platform;\n example?: string;\n step?: string;\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 // Resolve string event inputs (file paths, URLs, JSON strings)\n let resolvedEvent = event;\n if (typeof event === 'string') {\n resolvedEvent = await loadJsonFromSource(event, { name: 'event' });\n }\n\n let exampleContext:\n | { stepType: string; stepName: string; expected: unknown }\n | undefined;\n\n // If --example is provided, load the example from the raw config\n if (options.example) {\n const rawConfig = await loadJsonConfig<Flow.Setup>(configOrPath);\n const setup = validateFlowSetup(rawConfig);\n\n const flowNames = Object.keys(setup.flows);\n let flowName = options.flow;\n if (!flowName) {\n if (flowNames.length === 1) {\n flowName = flowNames[0];\n } else {\n throw new Error(\n `Multiple flows found. Use --flow to specify which flow contains the example.\\n` +\n `Available flows: ${flowNames.join(', ')}`,\n );\n }\n }\n\n const flowConfig = setup.flows[flowName];\n if (!flowConfig) {\n throw new Error(\n `Flow \"${flowName}\" not found. Available: ${flowNames.join(', ')}`,\n );\n }\n\n const found = findExample(flowConfig, options.example, options.step);\n if (found.example.in === undefined) {\n throw new Error(\n `Example \"${options.example}\" in ${found.stepType}.${found.stepName} has no \"in\" value`,\n );\n }\n\n resolvedEvent = found.example.in;\n exampleContext = {\n stepType: found.stepType,\n stepName: found.stepName,\n expected: found.example.out,\n };\n }\n\n // Detect source simulation\n const isSourceSimulation =\n exampleContext?.stepType === 'source' ||\n options.step?.startsWith('source.');\n\n let result: SimulationResult;\n\n if (isSourceSimulation) {\n // Source simulation needs raw flow config\n const rawConfig = await loadJsonConfig<Flow.Setup>(configOrPath);\n const setup = validateFlowSetup(rawConfig);\n const flowNames = Object.keys(setup.flows);\n const flowName =\n options.flow || (flowNames.length === 1 ? flowNames[0] : undefined);\n if (!flowName) {\n throw new Error(\n `Multiple flows found. Use --flow to specify which flow.\\n` +\n `Available: ${flowNames.join(', ')}`,\n );\n }\n const flowConfig = setup.flows[flowName];\n if (!flowConfig) {\n throw new Error(\n `Flow \"${flowName}\" not found. Available: ${flowNames.join(', ')}`,\n );\n }\n\n const sourceStep =\n exampleContext?.stepName || options.step!.substring('source.'.length);\n\n result = await simulateSourceCLI(\n flowConfig as unknown as Record<string, unknown>,\n resolvedEvent,\n {\n flow: options.flow,\n sourceStep,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n },\n );\n } else {\n // Standard simulation (destination/transformer)\n const stepTarget = exampleContext\n ? `${exampleContext.stepType}.${exampleContext.stepName}`\n : options.step;\n result = await simulateCore(configOrPath, resolvedEvent, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n silent: options.silent ?? false,\n flow: options.flow,\n platform: options.platform,\n step: stepTarget,\n });\n }\n\n // Compare output against example if --example was used\n if (exampleContext && result.success) {\n const stepKey = `${exampleContext.stepType}.${exampleContext.stepName}`;\n\n if (exampleContext.expected === false) {\n const calls = result.usage?.[exampleContext.stepName];\n const wasFiltered = !calls || calls.length === 0;\n result.exampleMatch = {\n name: options.example!,\n step: stepKey,\n expected: false,\n actual: wasFiltered ? false : calls,\n match: wasFiltered,\n diff: wasFiltered\n ? undefined\n : `Expected event to be filtered, but ${calls!.length} API call(s) were made`,\n };\n } else if (exampleContext.expected !== undefined) {\n const actual = result.usage?.[exampleContext.stepName] ?? [];\n result.exampleMatch = {\n name: options.example!,\n step: stepKey,\n ...compareOutput(exampleContext.expected, actual),\n };\n }\n }\n\n return result;\n}\n\n// Re-export types and utilities for testing\nexport * from './types.js';\nexport * from './simulator.js';\nexport { findExample } from './example-loader.js';\nexport { compareOutput } from './compare.js';\n","import type { Flow } from '@walkeros/core';\n\nexport type StepType = 'source' | 'transformer' | 'destination';\n\nexport interface ExampleLookupResult {\n stepType: StepType;\n stepName: string;\n exampleName: string;\n example: { in?: unknown; mapping?: unknown; out?: unknown };\n}\n\n/**\n * Find a named example in a flow config.\n *\n * Searches sources, transformers, and destinations for a matching example.\n * If --step is provided (e.g. \"destination.gtag\"), looks only in that step.\n * If not, searches all steps and errors if ambiguous.\n *\n * @param config - Raw (unresolved) flow config with examples intact\n * @param exampleName - Name of the example to find\n * @param stepTarget - Optional step target in \"type.name\" format\n * @returns The found example with its location\n */\nexport function findExample(\n config: Flow.Config,\n exampleName: string,\n stepTarget?: string,\n): ExampleLookupResult {\n if (stepTarget) {\n return findExampleInStep(config, exampleName, stepTarget);\n }\n\n return findExampleAcrossSteps(config, exampleName);\n}\n\nfunction findExampleInStep(\n config: Flow.Config,\n exampleName: string,\n stepTarget: string,\n): ExampleLookupResult {\n const dotIndex = stepTarget.indexOf('.');\n if (dotIndex === -1) {\n throw new Error(\n `Invalid --step format: \"${stepTarget}\". Expected \"type.name\" (e.g. \"destination.gtag\")`,\n );\n }\n\n const type = stepTarget.substring(0, dotIndex) as StepType;\n const name = stepTarget.substring(dotIndex + 1);\n\n const stepMap = getStepMap(config, type);\n if (!stepMap) {\n throw new Error(`No ${type}s found in flow config`);\n }\n\n const step = stepMap[name];\n if (!step) {\n const available = Object.keys(stepMap).join(', ');\n throw new Error(`${type} \"${name}\" not found. Available: ${available}`);\n }\n\n const examples = (step as { examples?: Record<string, unknown> }).examples;\n if (!examples || !examples[exampleName]) {\n const available = examples ? Object.keys(examples).join(', ') : 'none';\n throw new Error(\n `Example \"${exampleName}\" not found in ${type} \"${name}\". Available: ${available}`,\n );\n }\n\n return {\n stepType: type,\n stepName: name,\n exampleName,\n example: examples[exampleName] as {\n in?: unknown;\n mapping?: unknown;\n out?: unknown;\n },\n };\n}\n\nfunction findExampleAcrossSteps(\n config: Flow.Config,\n exampleName: string,\n): ExampleLookupResult {\n const matches: ExampleLookupResult[] = [];\n\n const stepTypes: StepType[] = ['source', 'transformer', 'destination'];\n\n for (const type of stepTypes) {\n const stepMap = getStepMap(config, type);\n if (!stepMap) continue;\n\n for (const [name, step] of Object.entries(stepMap)) {\n const examples = (step as { examples?: Record<string, unknown> })\n .examples;\n if (examples && examples[exampleName]) {\n matches.push({\n stepType: type,\n stepName: name,\n exampleName,\n example: examples[exampleName] as {\n in?: unknown;\n mapping?: unknown;\n out?: unknown;\n },\n });\n }\n }\n }\n\n if (matches.length === 0) {\n throw new Error(`Example \"${exampleName}\" not found in any step`);\n }\n\n if (matches.length > 1) {\n const locations = matches\n .map((m) => `${m.stepType}.${m.stepName}`)\n .join(', ');\n throw new Error(\n `Example \"${exampleName}\" found in multiple steps: ${locations}. Use --step to disambiguate.`,\n );\n }\n\n return matches[0];\n}\n\nfunction getStepMap(\n config: Flow.Config,\n type: StepType,\n): Record<string, unknown> | undefined {\n switch (type) {\n case 'source':\n return config.sources as Record<string, unknown> | undefined;\n case 'transformer':\n return config.transformers as Record<string, unknown> | undefined;\n case 'destination':\n return config.destinations as Record<string, unknown> | undefined;\n default:\n throw new Error(\n `Invalid step type: \"${type}\". Must be \"source\", \"transformer\", or \"destination\"`,\n );\n }\n}\n","/**\n * Compare simulation output against expected example output.\n */\nexport function compareOutput(\n expected: unknown,\n actual: unknown,\n): { expected: unknown; actual: unknown; match: boolean; diff?: string } {\n const expectedStr = JSON.stringify(expected, null, 2);\n const actualStr = JSON.stringify(actual, null, 2);\n\n if (expectedStr === actualStr) {\n return { expected, actual, match: true };\n }\n\n return {\n expected,\n actual,\n match: false,\n diff: `Expected:\\n${expectedStr}\\n\\nActual:\\n${actualStr}`,\n };\n}\n","import path from 'path';\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport { getPlatform, type Elb } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n detectInput,\n isStdinPiped,\n readStdin,\n writeResult,\n type Platform,\n} from '../../core/index.js';\nimport { Level, type Logger } from '@walkeros/core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadFlowConfig, loadJsonFromSource } from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport type { PushCommandOptions, PushResult } from './types.js';\nimport type { PushOptions } from '../../schemas/push.js';\n\n/**\n * Core push logic without CLI concerns (no process.exit, no output formatting)\n */\nasync function pushCore(\n inputPath: string,\n event: unknown,\n options: {\n flow?: string;\n json?: boolean;\n verbose?: boolean;\n silent?: boolean;\n platform?: string;\n } = {},\n): Promise<PushResult> {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n const startTime = Date.now();\n let tempDir: string | undefined;\n\n try {\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 const validatedEvent: { name: string; data: Record<string, unknown> } = {\n name: parsedEvent.name,\n data: (parsedEvent.data || {}) as Record<string, unknown>,\n };\n\n if (!validatedEvent.name.includes(' ')) {\n logger.info(\n `Warning: Event name \"${validatedEvent.name}\" should follow \"ENTITY ACTION\" format (e.g., \"page view\")`,\n );\n }\n\n // Detect input type\n logger.debug('Detecting input type');\n const detected = await detectInput(\n inputPath,\n options.platform as Platform | undefined,\n );\n\n let result: PushResult;\n\n if (detected.type === 'config') {\n result = await executeConfigPush(\n {\n config: inputPath,\n flow: options.flow,\n verbose: options.verbose,\n } as PushCommandOptions,\n validatedEvent,\n logger,\n (dir) => {\n tempDir = dir;\n },\n );\n } else {\n result = await executeBundlePush(\n detected.content,\n detected.platform,\n validatedEvent,\n logger,\n (dir) => {\n tempDir = dir;\n },\n { logger: { level: options.verbose ? Level.DEBUG : Level.ERROR } },\n );\n }\n\n return result;\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {});\n }\n }\n}\n\n/**\n * CLI command handler for push command\n */\nexport async function pushCommand(options: PushCommandOptions): Promise<void> {\n const logger = createCLILogger({ ...options, stderr: true });\n const startTime = Date.now();\n\n try {\n // Resolve config: stdin > argument > default\n let config: string;\n if (isStdinPiped() && !options.config) {\n const stdinContent = await readStdin();\n // Write stdin to temp file for pushCore (expects file path)\n const tmpPath = getTmpPath(undefined, 'stdin-push.json');\n await fs.ensureDir(path.dirname(tmpPath));\n await fs.writeFile(tmpPath, stdinContent, 'utf-8');\n config = tmpPath;\n } else {\n config = options.config || 'bundle.config.json';\n }\n\n const result = await push(config, options.event, {\n flow: options.flow,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n platform: options.platform as Platform | undefined,\n });\n\n const duration = Date.now() - startTime;\n\n // Format result\n let output: string;\n if (options.json) {\n output = JSON.stringify(\n {\n success: result.success,\n event: result.elbResult,\n duration,\n },\n null,\n 2,\n );\n } else {\n const lines: string[] = [];\n if (result.success) {\n lines.push('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 lines.push(` Event ID: ${pushResult.id}`);\n if ('entity' in pushResult && pushResult.entity)\n lines.push(` Entity: ${pushResult.entity}`);\n if ('action' in pushResult && pushResult.action)\n lines.push(` Action: ${pushResult.action}`);\n }\n lines.push(` Duration: ${duration}ms`);\n } else {\n lines.push(`Error: ${result.error}`);\n }\n output = lines.join('\\n');\n }\n\n // Write to file or stdout\n await writeResult(output + '\\n', { output: options.output });\n\n process.exit(result.success ? 0 : 1);\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const errorOutput = JSON.stringify(\n { success: false, error: errorMessage, duration },\n null,\n 2,\n );\n await writeResult(errorOutput + '\\n', { output: options.output });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n}\n\n/**\n * High-level push function for programmatic usage.\n *\n * WARNING: This makes real API calls to real endpoints.\n * Events will be sent to configured destinations (analytics, CRM, etc.).\n *\n * @param configOrPath - Path to flow configuration file or pre-built bundle\n * @param event - Event object to push\n * @param options - Push 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 Push result with success status, elb result, and duration\n *\n * @example\n * ```typescript\n * const result = await push('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n * ```\n */\nexport async function push(\n configOrPath: string | unknown,\n event: unknown,\n options: PushOptions & { flow?: string; platform?: Platform } = {},\n): Promise<PushResult> {\n if (typeof configOrPath !== 'string') {\n throw new Error(\n 'push() 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 // Resolve string event inputs (file paths, URLs, JSON strings)\n let resolvedEvent = event;\n if (typeof event === 'string') {\n resolvedEvent = await loadJsonFromSource(event, { name: 'event' });\n }\n\n return await pushCore(configOrPath, resolvedEvent, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n silent: options.silent ?? false,\n flow: options.flow,\n platform: options.platform,\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.Instance,\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 = getTmpPath(\n undefined,\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 return executeServerPush(tempPath, validatedEvent, logger, 60000, {\n logger: { level: options.verbose ? Level.DEBUG : Level.ERROR },\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.Instance,\n setTempDir: (dir: string) => void,\n context: { logger?: Logger.Config } = {},\n): Promise<PushResult> {\n // Write bundle to temp file\n const tempDir = getTmpPath(\n undefined,\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.Instance,\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.info(`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.Instance,\n timeout: number = 60000, // 60 second default timeout\n context: { logger?: Logger.Config } = {},\n): Promise<PushResult> {\n const startTime = Date.now();\n\n let timer: ReturnType<typeof setTimeout>;\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = 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.info(`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 } finally {\n clearTimeout(timer!);\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 { createRequire } from 'module';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { createTimer, getErrorMessage } from '../../core/index.js';\nimport { validateFlowFile, validatePort } from './validators.js';\nimport { prepareBundleForRun, isPreBuiltConfig } from './utils.js';\nimport { executeRunLocal } from './execution.js';\nimport type { RunCommandOptions, RunOptions, RunResult } from './types.js';\n\nconst esmRequire = createRequire(import.meta.url);\n\n/**\n * CLI command function for `walkeros run`\n *\n * @param options - Command options\n */\nexport async function runCommand(options: RunCommandOptions): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCLILogger(options);\n\n try {\n // Step 1: Validate inputs\n const configPath = validateFlowFile(options.config);\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Step 1b: Pre-flight check for server runtime dependencies\n const runtimeDeps = ['express', 'cors'];\n for (const dep of runtimeDeps) {\n try {\n esmRequire.resolve(dep);\n } catch {\n logger.error(\n `Missing runtime dependency \"${dep}\"\\n` +\n `Server flows require express and cors when running outside Docker.\\n` +\n `Run: npm install express cors`,\n );\n process.exit(1);\n }\n }\n\n // Step 2: Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(configPath);\n\n let flowPath: string;\n\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 // Step 3: Start heartbeat if deployment is specified\n if (options.deployment) {\n const { startHeartbeat } = await import('./heartbeat.js');\n await startHeartbeat({\n deployment: options.deployment,\n projectId: options.project,\n url: options.url || `http://localhost:${options.port || 8080}`,\n healthEndpoint: options.healthEndpoint,\n heartbeatInterval: options.heartbeatInterval,\n });\n }\n\n // Step 4: Execute locally using runtime module\n logger.info('Starting flow...');\n\n await executeRunLocal(flowPath, {\n port: options.port,\n host: options.host,\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 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 options - Run options\n * @returns Run result\n *\n * @example\n * ```typescript\n * // Run with JSON config (bundles automatically)\n * await run({\n * config: './flow.json',\n * port: 8080\n * });\n *\n * // Run with pre-built bundle\n * await run({\n * config: './flow.mjs',\n * port: 8080\n * });\n * ```\n */\nexport async function run(options: RunOptions): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\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 // Pre-flight check for server runtime dependencies\n const runtimeDeps = ['express', 'cors'];\n for (const dep of runtimeDeps) {\n try {\n esmRequire.resolve(dep);\n } catch {\n throw new Error(\n `Missing runtime dependency \"${dep}\". ` +\n `Server flows require express and cors when running outside Docker. ` +\n `Run: npm install express cors`,\n );\n }\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(flowPath, {\n port: options.port,\n host: options.host,\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 { 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 { PortSchema } from '../../schemas/index.js';\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 * 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 { 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 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 * Validate Command Schemas\n *\n * Zod schemas for validate command parameter validation.\n */\n\nimport { z } from '@walkeros/core/dev';\n\n/**\n * Validation type schema.\n *\n * @remarks\n * Validates the type of validation to perform.\n * - `contract`: Validate a data contract\n * - `event`: Validate a walkerOS event object\n * - `flow`: Validate a flow configuration file\n * - `mapping`: Validate mapping rules\n */\nexport const ValidationTypeSchema = z\n .enum(['contract', 'event', 'flow', 'mapping'])\n .describe('Validation type: \"event\", \"flow\", \"mapping\", or \"contract\"');\n\nexport type ValidationType = z.infer<typeof ValidationTypeSchema>;\n\n/**\n * Validate options schema.\n *\n * @remarks\n * Options for the programmatic validate() API.\n */\nexport const ValidateOptionsSchema = z.object({\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n path: z\n .string()\n .optional()\n .describe(\n 'Entry path for package schema validation (e.g., \"destinations.snowplow\", \"sources.browser\")',\n ),\n});\n\nexport type ValidateOptions = z.infer<typeof ValidateOptionsSchema>;\n\n/**\n * Raw shape for MCP SDK compatibility (ZodRawShapeCompat).\n *\n * @remarks\n * MCP SDK's registerTool expects raw shapes (Record<string, ZodType>)\n * rather than ZodObject instances. Define shape first, then wrap.\n */\nexport const ValidateInputShape = {\n type: ValidationTypeSchema,\n input: z\n .string()\n .min(1)\n .describe('JSON string, file path, or URL to validate'),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n path: z\n .string()\n .optional()\n .describe(\n 'Entry path for package schema validation (e.g., \"destinations.snowplow\"). When provided, validates the entry against its package JSON Schema instead of using --type.',\n ),\n};\n\n/**\n * Validate input schema for MCP tools.\n *\n * @remarks\n * Full input schema including type and input source.\n */\nexport const ValidateInputSchema = z.object(ValidateInputShape);\n\nexport type ValidateInput = z.infer<typeof ValidateInputSchema>;\n","/**\n * Bundle Command Schemas\n *\n * Zod schemas for bundle command parameter validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { FilePathSchema } from './primitives';\n\n/**\n * Bundle options schema.\n *\n * @remarks\n * Options for the programmatic bundle() API.\n */\nexport const BundleOptionsSchema = z.object({\n silent: z.boolean().optional().describe('Suppress all output'),\n verbose: z.boolean().optional().describe('Enable verbose logging'),\n stats: z\n .boolean()\n .optional()\n .default(true)\n .describe('Return bundle statistics'),\n cache: z\n .boolean()\n .optional()\n .default(true)\n .describe('Enable package caching'),\n flowName: z.string().optional().describe('Flow name for multi-flow configs'),\n});\n\nexport type BundleOptions = z.infer<typeof BundleOptionsSchema>;\n\n/**\n * Raw shape for MCP SDK compatibility (ZodRawShapeCompat).\n *\n * @remarks\n * MCP SDK's registerTool expects raw shapes (Record<string, ZodType>)\n * rather than ZodObject instances. Define shape first, then wrap.\n */\nexport const BundleInputShape = {\n configPath: FilePathSchema.describe(\n 'Path to flow configuration file (JSON or JavaScript)',\n ),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n stats: z\n .boolean()\n .optional()\n .default(true)\n .describe('Return bundle statistics'),\n output: z\n .string()\n .optional()\n .describe('Output file path (defaults to config-defined)'),\n};\n\n/**\n * Bundle input schema for MCP tools.\n *\n * @remarks\n * Full input schema including config path and options.\n */\nexport const BundleInputSchema = z.object(BundleInputShape);\n\nexport type BundleInput = z.infer<typeof BundleInputSchema>;\n","/**\n * Simulate Command Schemas\n *\n * Zod schemas for simulate command parameter validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { FilePathSchema } from './primitives';\n\n/**\n * Platform schema.\n *\n * @remarks\n * Validates platform type for event simulation.\n */\nexport const PlatformSchema = z\n .enum(['web', 'server'])\n .describe('Platform type for event processing');\n\nexport type Platform = z.infer<typeof PlatformSchema>;\n\n/**\n * Simulate options schema.\n *\n * @remarks\n * Options for the programmatic simulate() API.\n */\nexport const SimulateOptionsSchema = z.object({\n silent: z.boolean().optional().describe('Suppress all output'),\n verbose: z.boolean().optional().describe('Enable verbose logging'),\n json: z.boolean().optional().describe('Format output as JSON'),\n});\n\nexport type SimulateOptions = z.infer<typeof SimulateOptionsSchema>;\n\n/**\n * Raw shape for MCP SDK compatibility (ZodRawShapeCompat).\n *\n * @remarks\n * MCP SDK's registerTool expects raw shapes (Record<string, ZodType>)\n * rather than ZodObject instances. Define shape first, then wrap.\n */\nexport const SimulateInputShape = {\n configPath: FilePathSchema.describe('Path to flow configuration file'),\n event: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Event as JSON string, file path, or URL. Optional when example is provided.',\n ),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n platform: PlatformSchema.optional().describe('Override platform detection'),\n example: z\n .string()\n .optional()\n .describe(\n 'Name of a step example to use as event input (uses its \"in\" value)',\n ),\n step: z\n .string()\n .optional()\n .describe(\n 'Step target in type.name format (e.g. \"destination.gtag\") to narrow example lookup',\n ),\n};\n\n/**\n * Simulate input schema for MCP tools.\n *\n * @remarks\n * Full input schema including config path, event, and options.\n */\nexport const SimulateInputSchema = z.object(SimulateInputShape);\n\nexport type SimulateInput = z.infer<typeof SimulateInputSchema>;\n","/**\n * Push Command Schemas\n *\n * Zod schemas for push command parameter validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { FilePathSchema } from './primitives';\nimport { PlatformSchema } from './simulate';\n\n/**\n * Push options schema.\n *\n * @remarks\n * Options for the programmatic push() API.\n */\nexport const PushOptionsSchema = z.object({\n silent: z.boolean().optional().describe('Suppress all output'),\n verbose: z.boolean().optional().describe('Enable verbose logging'),\n json: z.boolean().optional().describe('Format output as JSON'),\n});\n\nexport type PushOptions = z.infer<typeof PushOptionsSchema>;\n\n/**\n * Raw shape for MCP SDK compatibility (ZodRawShapeCompat).\n *\n * @remarks\n * MCP SDK's registerTool expects raw shapes (Record<string, ZodType>)\n * rather than ZodObject instances. Define shape first, then wrap.\n */\nexport const PushInputShape = {\n configPath: FilePathSchema.describe('Path to flow configuration file'),\n event: z.string().min(1).describe('Event as JSON string, file path, or URL'),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n platform: PlatformSchema.optional().describe('Override platform detection'),\n};\n\n/**\n * Push input schema for MCP tools.\n *\n * @remarks\n * Full input schema including config path, event, and options.\n */\nexport const PushInputSchema = z.object(PushInputShape);\n\nexport type PushInput = z.infer<typeof PushInputSchema>;\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';\nimport { getTmpPath } from '../../core/index.js';\n\n/**\n * Prepares a JSON config file for execution by bundling it to a temporary location.\n *\n * Creates bundle in os.tmpdir() (e.g. /tmp) by default.\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 flowName?: string;\n },\n): Promise<string> {\n // Create temp directory in os.tmpdir()\n const tempDir = getTmpPath(\n undefined,\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 flowName: options.flowName,\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 } from '../../runtime/index.js';\nimport { runFlow } 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 flowPath - Path to flow bundle\n * @param options - Runtime options\n */\nexport async function executeRunLocal(\n flowPath: string,\n options: {\n port?: number;\n host?: string;\n },\n): Promise<void> {\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config, logger.scope('runner'), loggerConfig);\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 { Collector, Logger } from '@walkeros/core';\nimport type { HealthServer } from './health-server.js';\n\nexport interface RuntimeConfig {\n port?: number;\n host?: string;\n}\n\nexport interface FlowHandle {\n collector: {\n command?: (cmd: string) => Promise<void>;\n status?: Collector.Status;\n };\n file: string;\n httpHandler?: (...args: unknown[]) => void;\n}\n\n/**\n * Load a pre-built flow bundle and return a handle for managing it.\n */\nexport async function loadFlow(\n file: string,\n config: RuntimeConfig | undefined,\n logger: Logger.Instance,\n loggerConfig?: Logger.Config,\n healthServer?: HealthServer,\n): Promise<FlowHandle> {\n const absolutePath = resolve(file);\n const flowDir = dirname(absolutePath);\n process.chdir(flowDir);\n\n const fileUrl = pathToFileURL(absolutePath).href;\n\n // Bust Node.js module cache by appending query param\n const module = await import(`${fileUrl}?t=${Date.now()}`);\n\n if (!module.default || typeof module.default !== 'function') {\n throw new Error(\n `Invalid flow bundle: ${file} must export a default function`,\n );\n }\n\n const flowContext = {\n ...config,\n ...(loggerConfig ? { logger: loggerConfig } : {}),\n ...(healthServer ? { externalServer: true } : {}),\n };\n const result = await module.default(flowContext);\n\n if (!result || !result.collector) {\n throw new Error(`Invalid flow bundle: ${file} must return { collector }`);\n }\n\n // Mount flow's httpHandler onto runner's health server (opaque — no type inspection)\n if (healthServer && typeof result.httpHandler === 'function') {\n healthServer.setFlowHandler(result.httpHandler);\n }\n\n return {\n collector: {\n command: result.collector.command,\n status: result.collector.status,\n },\n file,\n httpHandler: result.httpHandler,\n };\n}\n\n/**\n * Swap the running flow to a new bundle. Shuts down old flow FIRST to release\n * the port, then loads the new bundle. Brief downtime is acceptable for Mode C.\n */\nexport async function swapFlow(\n currentHandle: FlowHandle,\n newFile: string,\n config: RuntimeConfig | undefined,\n logger: Logger.Instance,\n loggerConfig?: Logger.Config,\n healthServer?: HealthServer,\n): Promise<FlowHandle> {\n logger.info('Shutting down current flow for hot-swap...');\n\n // Detach old handler — health endpoints still work during swap\n if (healthServer) {\n healthServer.setFlowHandler(null);\n }\n\n // Delegate to collector's shutdown command (destroys sources, destinations, transformers)\n try {\n if (currentHandle.collector.command) {\n await currentHandle.collector.command('shutdown');\n }\n } catch (error) {\n logger.debug(`Shutdown warning: ${error}`);\n }\n\n // Load new flow — mounts new handler onto same server\n const newHandle = await loadFlow(\n newFile,\n config,\n logger,\n loggerConfig,\n healthServer,\n );\n\n logger.info('Flow swapped successfully');\n return newHandle;\n}\n\n/**\n * Run a pre-built flow bundle (legacy API — kept for backward compatibility)\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 handle = await loadFlow(file, config, logger, loggerConfig);\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 // Hard safety valve — force exit if shutdown takes too long\n const forceTimer = setTimeout(() => {\n logger.error('Shutdown timed out, forcing exit');\n process.exit(1);\n }, 15000);\n\n try {\n if (handle.collector.command) {\n await handle.collector.command('shutdown');\n }\n logger.info('Shutdown complete');\n clearTimeout(forceTimer);\n process.exit(0);\n } catch (error) {\n clearTimeout(forceTimer);\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","import { randomBytes } from 'crypto';\nimport { VERSION } from '../version.js';\nimport type { Collector, Logger } from '@walkeros/core';\n\nexport interface CounterPayload {\n eventsIn: number;\n eventsOut: number;\n eventsFailed: number;\n destinations: Record<\n string,\n { count: number; failed: number; duration: number }\n >;\n}\n\nexport interface CounterSnapshot {\n in: number;\n out: number;\n failed: number;\n destinations: Record<\n string,\n { count: number; failed: number; duration: number }\n >;\n}\n\nexport function computeCounterDelta(\n current: CounterSnapshot,\n last: CounterSnapshot,\n): CounterPayload {\n const destinations: CounterPayload['destinations'] = {};\n for (const [name, dest] of Object.entries(current.destinations)) {\n const prev = last.destinations[name] || {\n count: 0,\n failed: 0,\n duration: 0,\n };\n destinations[name] = {\n count: dest.count - prev.count,\n failed: dest.failed - prev.failed,\n duration: dest.duration - prev.duration,\n };\n }\n return {\n eventsIn: current.in - last.in,\n eventsOut: current.out - last.out,\n eventsFailed: current.failed - last.failed,\n destinations,\n };\n}\n\nconst instanceId = randomBytes(8).toString('hex');\n\nexport function getInstanceId(): string {\n return instanceId;\n}\n\nexport interface HeartbeatConfig {\n appUrl: string;\n token: string;\n projectId: string;\n flowId?: string;\n deploymentId?: string;\n configVersion?: string;\n intervalMs: number;\n getCounters?: () => Collector.Status | undefined;\n}\n\nexport interface HeartbeatHandle {\n start(): void;\n stop(): void;\n sendOnce(): Promise<void>;\n updateConfigVersion(version: string): void;\n}\n\nexport function createHeartbeat(\n config: HeartbeatConfig,\n logger: Logger.Instance,\n): HeartbeatHandle {\n let timer: ReturnType<typeof setInterval> | null = null;\n const startTime = Date.now();\n let configVersion = config.configVersion;\n\n let lastReported: CounterSnapshot = {\n in: 0,\n out: 0,\n failed: 0,\n destinations: {},\n };\n\n async function sendOnce(): Promise<void> {\n try {\n // Read current counters and compute delta\n let counters: CounterPayload | undefined;\n const status = config.getCounters?.();\n if (status) {\n const current: CounterSnapshot = {\n in: status.in,\n out: status.out,\n failed: status.failed,\n destinations: { ...status.destinations },\n };\n counters = computeCounterDelta(current, lastReported);\n }\n\n const response = await fetch(\n `${config.appUrl}/api/projects/${config.projectId}/runners/heartbeat`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${config.token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n instanceId,\n flowId: config.flowId,\n ...(config.deploymentId && {\n deploymentId: config.deploymentId,\n }),\n configVersion,\n cliVersion: VERSION,\n uptime: Math.floor((Date.now() - startTime) / 1000),\n ...(counters && { counters }),\n }),\n signal: AbortSignal.timeout(10_000),\n },\n );\n\n // Update snapshot only on success so deltas accumulate on failure\n if (response.ok && status) {\n lastReported = {\n in: status.in,\n out: status.out,\n failed: status.failed,\n destinations: { ...status.destinations },\n };\n }\n\n if (response.status === 401 || response.status === 403) {\n logger.error(\n `Heartbeat auth failed (${response.status}). Token may have expired — redeploy to rotate.`,\n );\n }\n } catch (error) {\n // Deltas accumulate on failure — next successful send includes them\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(`Heartbeat failed: ${message}`);\n }\n }\n\n function start(): void {\n sendOnce();\n const jitter = config.intervalMs * 0.1 * (Math.random() * 2 - 1);\n timer = setInterval(() => sendOnce(), config.intervalMs + jitter);\n }\n\n function stop(): void {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n\n function updateConfigVersion(version: string): void {\n configVersion = version;\n }\n\n return { start, stop, sendOnce, updateConfigVersion };\n}\n","// walkerOS/packages/cli/src/commands/validate/index.ts\n\nimport chalk from 'chalk';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n isStdinPiped,\n readStdin,\n writeResult,\n} from '../../core/index.js';\nimport { loadJsonFromSource } from '../../config/index.js';\nimport {\n validateContract,\n validateEvent,\n validateFlow,\n validateMapping,\n} from './validators/index.js';\nimport { validateEntry } from './validators/entry.js';\nimport type {\n ValidateCommandOptions,\n ValidateResult,\n ValidationType,\n} from './types.js';\n\n/**\n * Programmatic API for validation.\n * Can be called directly from code or MCP server.\n *\n * Accepts parsed objects, JSON strings, file paths, or URLs as input.\n */\nexport async function validate(\n type: ValidationType,\n input: unknown,\n options: { flow?: string; path?: string } = {},\n): Promise<ValidateResult> {\n // Resolve string inputs (file paths, URLs, JSON strings) to parsed objects\n let resolved = input;\n if (typeof input === 'string') {\n resolved = await loadJsonFromSource(input, {\n name: type,\n required: true,\n });\n }\n\n // Path-based entry validation takes priority\n if (options.path) {\n return validateEntry(options.path, resolved as Record<string, unknown>);\n }\n\n switch (type) {\n case 'contract':\n return validateContract(resolved);\n case 'event':\n return validateEvent(resolved);\n case 'flow':\n return validateFlow(resolved, { flow: options.flow });\n case 'mapping':\n return validateMapping(resolved);\n default:\n throw new Error(`Unknown validation type: ${type}`);\n }\n}\n\n/**\n * Format validation result for CLI output.\n */\nfunction formatResult(\n result: ValidateResult,\n options: { json?: boolean; verbose?: boolean },\n): string {\n if (options.json) {\n return JSON.stringify(result, null, 2);\n }\n\n const lines: string[] = [];\n lines.push('');\n lines.push(`Validating ${result.type}...`);\n lines.push('');\n\n // Show details if verbose\n if (options.verbose && Object.keys(result.details).length > 0) {\n lines.push('Details:');\n for (const [key, value] of Object.entries(result.details)) {\n lines.push(` ${key}: ${JSON.stringify(value)}`);\n }\n lines.push('');\n }\n\n lines.push('Validation Results:');\n\n // Errors\n for (const error of result.errors) {\n lines.push(chalk.red(` ✗ ${error.path}: ${error.message}`));\n }\n\n // Warnings\n for (const warning of result.warnings) {\n lines.push(chalk.yellow(` ⚠ ${warning.path}: ${warning.message}`));\n if (warning.suggestion) {\n lines.push(chalk.gray(` → ${warning.suggestion}`));\n }\n }\n\n // Success items (count based on lack of errors for checked fields)\n if (result.valid) {\n lines.push(chalk.green(` ✓ All checks passed`));\n }\n\n lines.push('');\n lines.push(\n `Summary: ${result.errors.length} error(s), ${result.warnings.length} warning(s)`,\n );\n\n return lines.join('\\n');\n}\n\n/**\n * CLI command handler for validate command.\n */\nexport async function validateCommand(\n options: ValidateCommandOptions,\n): Promise<void> {\n // Result always goes to stdout; logs to stderr\n const logger = createCLILogger({ ...options, stderr: true });\n\n try {\n // Load input: stdin > argument > error\n let input: unknown;\n if (isStdinPiped() && !options.input) {\n const stdinContent = await readStdin();\n try {\n input = JSON.parse(stdinContent);\n } catch {\n throw new Error('Invalid JSON received on stdin');\n }\n } else {\n input = options.input;\n }\n\n // Run validation\n const result = await validate(options.type, input, {\n flow: options.flow,\n path: options.path,\n });\n\n // Format and write result\n const formatted = formatResult(result, {\n json: options.json,\n verbose: options.verbose,\n });\n await writeResult(formatted + '\\n', { output: options.output });\n\n // Exit code based on result\n if (!result.valid) {\n process.exit(1);\n }\n if (options.strict && result.warnings.length > 0) {\n process.exit(2);\n }\n process.exit(0);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const errorOutput = JSON.stringify(\n {\n valid: false,\n type: options.type,\n errors: [\n { path: 'input', message: errorMessage, code: 'INPUT_ERROR' },\n ],\n warnings: [],\n details: {},\n },\n null,\n 2,\n );\n await writeResult(errorOutput + '\\n', { output: options.output });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n process.exit(3);\n }\n}\n\n// Re-export types\nexport * from './types.js';\nexport {\n validateContract,\n validateEvent,\n validateFlow,\n validateMapping,\n} from './validators/index.js';\nexport { validateEntry } from './validators/entry.js';\n","import type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nexport function validateContract(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n errors.push({\n path: 'root',\n message: 'Contract must be an object',\n code: 'INVALID_CONTRACT',\n });\n return { valid: false, type: 'contract', errors, warnings, details };\n }\n\n const contract = input as Record<string, unknown>;\n let entityCount = 0;\n let actionCount = 0;\n\n // Validate $tagging if present\n if ('$tagging' in contract) {\n const tagging = contract.$tagging;\n if (\n typeof tagging !== 'number' ||\n !Number.isInteger(tagging) ||\n tagging < 0\n ) {\n errors.push({\n path: '$tagging',\n message: '$tagging must be a non-negative integer',\n value: tagging,\n code: 'INVALID_TAGGING',\n });\n } else {\n details.tagging = tagging;\n }\n }\n\n // Validate entity-action entries\n for (const [entityKey, entityValue] of Object.entries(contract)) {\n // Skip metadata keys\n if (entityKey.startsWith('$')) continue;\n\n // Validate entity key\n if (entityKey.trim() === '') {\n errors.push({\n path: entityKey,\n message: 'Entity key cannot be empty',\n code: 'INVALID_ENTITY_KEY',\n });\n continue;\n }\n\n if (typeof entityValue !== 'object' || entityValue === null) {\n errors.push({\n path: entityKey,\n message: `Entity \"${entityKey}\" must be an object of action entries`,\n value: entityValue,\n code: 'INVALID_ENTITY',\n });\n continue;\n }\n\n entityCount++;\n const actions = entityValue as Record<string, unknown>;\n\n for (const [actionKey, actionValue] of Object.entries(actions)) {\n // Validate action key\n if (actionKey.trim() === '') {\n errors.push({\n path: `${entityKey}.${actionKey}`,\n message: 'Action key cannot be empty',\n code: 'INVALID_ACTION_KEY',\n });\n continue;\n }\n\n // Validate action value is a JSON Schema object\n if (\n typeof actionValue !== 'object' ||\n actionValue === null ||\n Array.isArray(actionValue)\n ) {\n errors.push({\n path: `${entityKey}.${actionKey}`,\n message: `Contract entry must be a JSON Schema object`,\n value: typeof actionValue,\n code: 'INVALID_SCHEMA_ENTRY',\n });\n continue;\n }\n\n actionCount++;\n }\n }\n\n details.entityCount = entityCount;\n details.actionCount = actionCount;\n\n return {\n valid: errors.length === 0,\n type: 'contract',\n errors,\n warnings,\n details,\n };\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/event.ts\n\nimport { schemas } from '@walkeros/core/dev';\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst { PartialEventSchema } = schemas;\n\nexport function validateEvent(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n // Type guard for object access\n const event = (\n typeof input === 'object' && input !== null ? input : {}\n ) as Record<string, unknown>;\n\n // 1. Check for name field existence\n if (!('name' in event) || event.name === undefined) {\n errors.push({\n path: 'name',\n message: 'Event must have a name field',\n code: 'MISSING_EVENT_NAME',\n });\n } else if (typeof event.name !== 'string' || event.name.trim() === '') {\n errors.push({\n path: 'name',\n message: 'Event name cannot be empty',\n value: event.name,\n code: 'EMPTY_EVENT_NAME',\n });\n } else {\n // 2. Validate entity-action format (must contain space)\n const name = event.name as string;\n if (!name.includes(' ')) {\n errors.push({\n path: 'name',\n message:\n 'Event name must be \"entity action\" format with space (e.g., \"page view\")',\n value: name,\n code: 'INVALID_EVENT_NAME',\n });\n details.entity = null;\n details.action = null;\n } else {\n // Extract entity and action (last word is action, rest is entity)\n // Normalize whitespace: trim and split on one-or-more whitespace\n const parts = name.trim().split(/\\s+/);\n const action = parts.pop()!;\n const entity = parts.join(' ');\n details.entity = entity;\n details.action = action;\n }\n }\n\n // 3. Validate against Zod schema for structural validation\n const zodResult = PartialEventSchema.safeParse(input);\n if (!zodResult.success) {\n for (const issue of zodResult.error.issues) {\n const path = issue.path.join('.');\n // Skip name errors (we handle those above with better messages)\n if (path === 'name') continue;\n\n errors.push({\n path: path || 'root',\n message: issue.message,\n code: 'SCHEMA_VALIDATION',\n });\n }\n }\n\n // 4. Warnings for best practices\n if (!event.consent) {\n warnings.push({\n path: 'consent',\n message: 'No consent object provided',\n suggestion:\n 'Consider adding a consent object for GDPR/privacy compliance',\n });\n }\n\n details.hasConsent = !!event.consent;\n details.hasData = !!event.data;\n details.hasContext = !!event.context;\n\n return {\n valid: errors.length === 0,\n type: 'event',\n errors,\n warnings,\n details,\n };\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/flow.ts\n\nimport type { Flow } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst { validateFlowSetup } = schemas;\n\ninterface FlowValidateOptions {\n flow?: string;\n}\n\nexport function validateFlow(\n input: unknown,\n options: FlowValidateOptions = {},\n): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n // 1. Serialize to JSON for core validator\n // Core's validateFlowSetup takes a JSON string, but CLI receives parsed objects.\n // Re-serializing is the bridge between the two interfaces.\n let json: string;\n try {\n json = JSON.stringify(input, null, 2);\n } catch {\n errors.push({\n path: 'root',\n message: 'Input cannot be serialized to JSON',\n code: 'SERIALIZATION_ERROR',\n });\n return { valid: false, type: 'flow', errors, warnings, details };\n }\n\n // 2. Run core validation (Zod schema + reference checking)\n const coreResult = validateFlowSetup(json);\n\n // 3. Map core errors -> CLI ValidationError\n for (const issue of coreResult.errors) {\n errors.push({\n path: issue.path || 'root',\n message: issue.message,\n code: 'SCHEMA_VALIDATION',\n });\n }\n\n // 4. Map core warnings -> CLI ValidationWarning\n for (const issue of coreResult.warnings) {\n warnings.push({\n path: issue.path || 'root',\n message: issue.message,\n });\n }\n\n // 5. CLI-specific: check for empty flows\n const config = (\n typeof input === 'object' && input !== null ? input : {}\n ) as Record<string, unknown>;\n\n const flows = config.flows as Record<string, unknown> | undefined;\n if (flows && typeof flows === 'object' && Object.keys(flows).length === 0) {\n errors.push({\n path: 'flows',\n message: 'At least one flow is required',\n code: 'EMPTY_FLOWS',\n });\n }\n\n // 6. Extract flow details\n if (flows && typeof flows === 'object') {\n const flowNames = Object.keys(flows);\n details.flowNames = flowNames;\n details.flowCount = flowNames.length;\n\n // 7. Validate specific flow if requested\n if (options.flow) {\n if (!flowNames.includes(options.flow)) {\n errors.push({\n path: 'flows',\n message: `Flow \"${options.flow}\" not found. Available: ${flowNames.join(', ')}`,\n code: 'FLOW_NOT_FOUND',\n });\n } else {\n details.validatedFlow = options.flow;\n }\n }\n }\n\n // 8. CLI-specific: warn about packages without version\n const packages = config.packages as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (packages && typeof packages === 'object') {\n for (const [pkgName, pkgConfig] of Object.entries(packages)) {\n if (!pkgConfig.version && !pkgConfig.path) {\n warnings.push({\n path: `packages.${pkgName}`,\n message: `Package \"${pkgName}\" has no version specified`,\n suggestion: 'Consider specifying a version for reproducible builds',\n });\n }\n }\n details.packageCount = Object.keys(packages).length;\n }\n\n // 9. Expose core's IntelliSense context in details (bonus for MCP consumers)\n if (coreResult.context) {\n details.context = coreResult.context;\n }\n\n // 10. Deep validation: cross-step example compatibility\n if (flows && typeof flows === 'object' && errors.length === 0) {\n const flowNames = Object.keys(flows);\n const flowsToCheck = options.flow ? [options.flow] : flowNames;\n\n let totalConnections = 0;\n for (const name of flowsToCheck) {\n const flowConfig = (flows as Record<string, Flow.Config>)[name];\n if (!flowConfig) continue;\n\n checkExampleCoverage(flowConfig, warnings);\n\n const connections = buildConnectionGraph(flowConfig);\n for (const conn of connections) {\n checkCompatibility(conn, errors, warnings);\n }\n totalConnections += connections.length;\n\n // Contract compliance\n const setupContract = config.contract as Flow.Contract | undefined;\n if (setupContract || flowConfig.contract) {\n checkContractCompliance(\n flowConfig,\n setupContract,\n flowConfig.contract,\n warnings,\n );\n }\n }\n details.connectionsChecked = totalConnections;\n }\n\n return {\n valid: errors.length === 0,\n type: 'flow',\n errors,\n warnings,\n details,\n };\n}\n\n// --- Deep validation helpers ---\n\ninterface StepInfo {\n type: 'source' | 'transformer' | 'destination';\n name: string;\n examples: Flow.StepExamples;\n}\n\ninterface StepConnection {\n from: StepInfo;\n to: StepInfo;\n}\n\nfunction checkExampleCoverage(\n config: Flow.Config,\n warnings: ValidationWarning[],\n): void {\n const stepTypes = [\n { key: 'sources' as const, type: 'source' },\n { key: 'transformers' as const, type: 'transformer' },\n { key: 'destinations' as const, type: 'destination' },\n ];\n\n for (const { key, type } of stepTypes) {\n const refs = config[key];\n if (!refs) continue;\n for (const [name, ref] of Object.entries(refs)) {\n if (!ref.examples || Object.keys(ref.examples).length === 0) {\n warnings.push({\n path: `${type}.${name}`,\n message: `Step has no examples`,\n suggestion: `Add examples to ${type}.${name} for testing and documentation`,\n });\n }\n }\n }\n}\n\nfunction buildConnectionGraph(config: Flow.Config): StepConnection[] {\n const connections: StepConnection[] = [];\n\n // Source → next transformer\n for (const [name, source] of Object.entries(config.sources || {})) {\n if (!source.next || !source.examples) continue;\n const nextNames = Array.isArray(source.next) ? source.next : [source.next];\n for (const nextName of nextNames) {\n const transformer = config.transformers?.[nextName];\n if (transformer?.examples) {\n connections.push({\n from: { type: 'source', name, examples: source.examples },\n to: {\n type: 'transformer',\n name: nextName,\n examples: transformer.examples,\n },\n });\n }\n }\n }\n\n // Transformer → next transformer\n for (const [name, transformer] of Object.entries(config.transformers || {})) {\n if (!transformer.next || !transformer.examples) continue;\n const nextNames = Array.isArray(transformer.next)\n ? transformer.next\n : [transformer.next];\n for (const nextName of nextNames) {\n const nextTransformer = config.transformers?.[nextName];\n if (nextTransformer?.examples) {\n connections.push({\n from: {\n type: 'transformer',\n name,\n examples: transformer.examples,\n },\n to: {\n type: 'transformer',\n name: nextName,\n examples: nextTransformer.examples,\n },\n });\n }\n }\n }\n\n // Destination.before → transformer chain → destination\n for (const [name, dest] of Object.entries(config.destinations || {})) {\n if (!dest.before || !dest.examples) continue;\n const beforeNames = Array.isArray(dest.before)\n ? dest.before\n : [dest.before];\n for (const beforeName of beforeNames) {\n const transformer = config.transformers?.[beforeName];\n if (transformer?.examples) {\n connections.push({\n from: {\n type: 'transformer',\n name: beforeName,\n examples: transformer.examples,\n },\n to: { type: 'destination', name, examples: dest.examples },\n });\n }\n }\n }\n\n return connections;\n}\n\nfunction checkCompatibility(\n conn: StepConnection,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n const fromOuts = Object.entries(conn.from.examples)\n .filter(([, ex]) => ex.out !== undefined && ex.out !== false)\n .map(([name, ex]) => ({ name, value: ex.out }));\n\n const toIns = Object.entries(conn.to.examples)\n .filter(([, ex]) => ex.in !== undefined)\n .map(([name, ex]) => ({ name, value: ex.in }));\n\n const path = `${conn.from.type}.${conn.from.name} → ${conn.to.type}.${conn.to.name}`;\n\n if (fromOuts.length === 0 || toIns.length === 0) {\n warnings.push({\n path,\n message: 'Cannot check compatibility: missing out or in examples',\n suggestion:\n 'Add out examples to the source step or in examples to the target step',\n });\n return;\n }\n\n let hasMatch = false;\n for (const out of fromOuts) {\n for (const inp of toIns) {\n if (isStructurallyCompatible(out.value, inp.value)) {\n hasMatch = true;\n break;\n }\n }\n if (hasMatch) break;\n }\n\n if (!hasMatch) {\n errors.push({\n path,\n message: 'No compatible out/in pair found between connected steps',\n code: 'INCOMPATIBLE_EXAMPLES',\n });\n }\n}\n\nfunction isStructurallyCompatible(a: unknown, b: unknown): boolean {\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) && Array.isArray(b)) return true;\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n const shared = keysA.filter((k) => keysB.includes(k));\n return shared.length >= Math.min(keysA.length, keysB.length) * 0.5;\n }\n return true;\n}\n\nfunction checkContractCompliance(\n config: Flow.Config,\n setupContract: Flow.Contract | undefined,\n flowContract: Flow.Contract | undefined,\n warnings: ValidationWarning[],\n): void {\n for (const [name, dest] of Object.entries(config.destinations || {})) {\n if (!dest.examples) continue;\n\n for (const [exName, example] of Object.entries(dest.examples)) {\n if (!example.in || typeof example.in !== 'object') continue;\n\n const event = example.in as { entity?: string; action?: string };\n if (!event.entity || !event.action) continue;\n\n const contract =\n (flowContract?.[event.entity] as Record<string, unknown> | undefined) ||\n (setupContract?.[event.entity] as Record<string, unknown> | undefined);\n if (!contract || typeof contract !== 'object') continue;\n\n const actionSchema = contract[event.action] || contract['*'];\n if (actionSchema) {\n warnings.push({\n path: `destination.${name}.examples.${exName}`,\n message: `Example has contract for ${event.entity}.${event.action}`,\n suggestion: 'Verify example data matches contract schema',\n });\n }\n }\n }\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/mapping.ts\n\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nexport function validateMapping(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n // Must be an object\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n errors.push({\n path: 'root',\n message: 'Mapping must be an object with event patterns as keys',\n code: 'INVALID_MAPPING_TYPE',\n });\n return { valid: false, type: 'mapping', errors, warnings, details };\n }\n\n const mapping = input as Record<string, unknown>;\n const patterns = Object.keys(mapping);\n details.eventPatterns = patterns;\n details.patternCount = patterns.length;\n\n // Validate each event pattern\n patterns.forEach((pattern, index) => {\n // Check pattern format: must be \"entity action\", contain wildcard, or be \"*\"\n const isWildcard = pattern.includes('*');\n const hasSpace = pattern.includes(' ');\n\n if (!isWildcard && !hasSpace) {\n errors.push({\n path: pattern,\n message: `Invalid event pattern \"${pattern}\". Must be \"entity action\" format or contain wildcard (*)`,\n code: 'INVALID_EVENT_PATTERN',\n });\n }\n\n // Warn if catch-all is not last\n if (pattern === '*' && index !== patterns.length - 1) {\n warnings.push({\n path: '*',\n message: 'Catch-all pattern (*) should be last',\n suggestion:\n 'Move the catch-all pattern (*) to last position for predictable matching',\n });\n }\n\n // Validate rule structure (accepts single rule object or array of rules)\n const rule = mapping[pattern];\n const isValidRule = Array.isArray(rule)\n ? rule.every((r) => typeof r === 'object' && r !== null)\n : typeof rule === 'object' && rule !== null;\n\n if (!isValidRule) {\n errors.push({\n path: pattern,\n message: 'Mapping rule must be an object or array of objects',\n code: 'INVALID_RULE_TYPE',\n });\n }\n });\n\n return {\n valid: errors.length === 0,\n type: 'mapping',\n errors,\n warnings,\n details,\n };\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/entry.ts\n\nimport Ajv from 'ajv';\nimport { fetchPackageSchema } from '@walkeros/core';\nimport type { ValidateResult, ValidationError } from '../types.js';\n\nconst SECTIONS = ['destinations', 'sources', 'transformers'] as const;\n\n/**\n * Parse dot-notation path into [section, key].\n * If no section prefix, search all sections.\n */\nfunction resolveEntry(\n path: string,\n flowConfig: Record<string, unknown>,\n): { section: string; key: string; entry: Record<string, unknown> } | string {\n const flows = flowConfig.flows as Record<string, Record<string, unknown>>;\n if (!flows || typeof flows !== 'object') return 'No flows found in config';\n\n // Use first flow\n const flowName = Object.keys(flows)[0];\n const flow = flows[flowName];\n if (!flow) return `Flow \"${flowName}\" is empty`;\n\n const parts = path.split('.');\n\n if (parts.length === 2) {\n const [section, key] = parts;\n if (!SECTIONS.includes(section as (typeof SECTIONS)[number])) {\n return `Unknown section \"${section}\". Must be one of: ${SECTIONS.join(', ')}`;\n }\n const sectionData = flow[section] as Record<string, unknown> | undefined;\n if (!sectionData || !(key in sectionData)) {\n return `Entry \"${key}\" not found in ${section}`;\n }\n return {\n section,\n key,\n entry: sectionData[key] as Record<string, unknown>,\n };\n }\n\n if (parts.length === 1) {\n const key = parts[0];\n const matches: { section: string; entry: Record<string, unknown> }[] = [];\n\n for (const section of SECTIONS) {\n const sectionData = flow[section] as Record<string, unknown> | undefined;\n if (sectionData && key in sectionData) {\n matches.push({\n section,\n entry: sectionData[key] as Record<string, unknown>,\n });\n }\n }\n\n if (matches.length === 0) {\n return `Entry \"${key}\" not found in any section`;\n }\n if (matches.length > 1) {\n const sections = matches.map((m) => m.section).join(', ');\n return `Ambiguous key \"${key}\" found in multiple sections: ${sections}. Use dot-notation (e.g., destinations.${key})`;\n }\n return { section: matches[0].section, key, entry: matches[0].entry };\n }\n\n return `Invalid path \"${path}\". Use \"section.key\" or just \"key\"`;\n}\n\n/**\n * Validate a specific entry (destination/source/transformer) in a flow config\n * against its package's published JSON Schema.\n */\nexport async function validateEntry(\n path: string,\n flowConfig: Record<string, unknown>,\n): Promise<ValidateResult> {\n // Step 1: Resolve the entry\n const resolved = resolveEntry(path, flowConfig);\n if (typeof resolved === 'string') {\n return {\n valid: false,\n type: 'entry',\n errors: [{ path, message: resolved, code: 'ENTRY_VALIDATION' }],\n warnings: [],\n details: {},\n };\n }\n\n const { section, key, entry } = resolved;\n\n // Step 2: Check for package field\n const packageName = entry.package as string | undefined;\n if (!packageName) {\n return {\n valid: true,\n type: 'entry',\n errors: [],\n warnings: [],\n details: {\n section,\n key,\n skipped: true,\n reason: 'No package field — skipping remote schema validation',\n },\n };\n }\n\n // Step 3: Fetch schema from CDN\n let schemas: Record<string, unknown>;\n try {\n const info = await fetchPackageSchema(packageName);\n schemas = info.schemas;\n } catch (error) {\n return {\n valid: false,\n type: 'entry',\n errors: [\n {\n path,\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'ENTRY_VALIDATION',\n },\n ],\n warnings: [],\n details: { section, key, package: packageName },\n };\n }\n\n // Step 4: Validate settings against schema\n const settingsSchema = schemas?.settings;\n if (!settingsSchema) {\n return {\n valid: true,\n type: 'entry',\n errors: [],\n warnings: [],\n details: { section, key, note: 'Package has no settings schema' },\n };\n }\n\n const config = entry.config as Record<string, unknown> | undefined;\n const settings = config?.settings;\n\n const ajv = new Ajv({ allErrors: true });\n const validate = ajv.compile(settingsSchema as object);\n const isValid = validate(settings || {});\n\n if (!isValid) {\n const errors: ValidationError[] = (validate.errors || []).map((e) => ({\n path: e.instancePath || '/',\n message: e.message || 'Unknown error',\n code: e.keyword,\n }));\n\n return {\n valid: false,\n type: 'entry',\n errors,\n warnings: [],\n details: { section, key, package: packageName },\n };\n }\n\n return {\n valid: true,\n type: 'entry',\n errors: [],\n warnings: [],\n details: { section, key, package: packageName },\n };\n}\n","import { hostname } from 'os';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n writeConfig,\n resolveAppUrl,\n getConfigPath,\n} from '../../lib/config-file.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\nexport interface LoginCommandOptions extends GlobalOptions {\n url?: string;\n json?: boolean;\n}\n\nexport interface LoginResult {\n success: boolean;\n email?: string;\n configPath?: string;\n error?: string;\n}\n\nexport interface LoginOptions {\n url?: string;\n /** Override browser opener for testing */\n openUrl?: (url: string) => Promise<void>;\n /** Override fetch for testing */\n fetch?: typeof globalThis.fetch;\n /** Max poll attempts before giving up (for testing) */\n maxPollAttempts?: number;\n}\n\nconst POLL_TIMEOUT_BUFFER_MS = 5000;\n\nasync function openInBrowser(url: string): Promise<void> {\n const { default: open } = await import('open');\n await open(url);\n}\n\nexport async function loginCommand(\n options: LoginCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n\n try {\n const result = await login({ url: options.url });\n\n if (options.json) {\n logger.json(result);\n } else if (result.success) {\n logger.info(`Logged in as ${result.email}`);\n logger.info(`Token stored in ${result.configPath}`);\n }\n\n process.exit(result.success ? 0 : 1);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n logger.json({ success: false, error: message });\n } else {\n logger.error(message);\n }\n\n process.exit(1);\n }\n}\n\nexport async function login(options: LoginOptions = {}): Promise<LoginResult> {\n const appUrl = options.url || resolveAppUrl();\n const f = options.fetch ?? globalThis.fetch;\n\n // 1. Request device code\n const codeResponse = await f(`${appUrl}/api/auth/device/code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n });\n\n if (!codeResponse.ok) {\n return { success: false, error: 'Failed to request device code' };\n }\n\n const {\n deviceCode,\n userCode,\n verificationUri,\n verificationUriComplete,\n expiresIn,\n interval,\n } = await codeResponse.json();\n\n // 2. Display code and open browser\n const prompt = (msg: string) => process.stderr.write(msg + '\\n');\n prompt(`\\n! Your one-time code: ${userCode}`);\n prompt(` Authorize here: ${verificationUriComplete || verificationUri}\\n`);\n\n const opener = options.openUrl ?? openInBrowser;\n try {\n await opener(verificationUriComplete || verificationUri);\n prompt(' Opening browser...');\n } catch {\n prompt(' Could not open browser. Visit the URL manually.');\n }\n\n prompt(' Waiting for authorization... (press Ctrl+C to cancel)\\n');\n\n // 3. Poll for token\n const deadline = Date.now() + expiresIn * 1000 + POLL_TIMEOUT_BUFFER_MS;\n let pollInterval = (interval ?? 5) * 1000;\n const maxAttempts = options.maxPollAttempts ?? Infinity;\n let attempts = 0;\n\n while (Date.now() < deadline && attempts < maxAttempts) {\n attempts++;\n await new Promise((r) => setTimeout(r, pollInterval));\n\n const tokenResponse = await f(`${appUrl}/api/auth/device/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ deviceCode, hostname: hostname() }),\n });\n\n const data = await tokenResponse.json();\n\n if (tokenResponse.ok && data.token) {\n // 4. Store config\n writeConfig({ token: data.token, email: data.email, appUrl });\n const configPath = getConfigPath();\n return { success: true, email: data.email, configPath };\n }\n\n if (data.error === 'authorization_pending') continue;\n if (data.error === 'slow_down') {\n pollInterval += 5000;\n continue;\n }\n\n // Any other error: expired, denied, etc.\n return { success: false, error: data.error || 'Authorization failed' };\n }\n\n return {\n success: false,\n error: 'Authorization timed out. Please try again.',\n };\n}\n","import { createCLILogger } from '../../core/cli-logger.js';\nimport { deleteConfig, getConfigPath } from '../../lib/config-file.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\nexport interface LogoutCommandOptions extends GlobalOptions {\n json?: boolean;\n}\n\nexport async function logoutCommand(\n options: LogoutCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n\n const deleted = deleteConfig();\n const configPath = getConfigPath();\n\n if (options.json) {\n logger.json({ success: true, deleted });\n } else if (deleted) {\n logger.info(`Logged out. Token removed from ${configPath}`);\n } else {\n logger.info('No stored credentials found.');\n }\n\n process.exit(0);\n}\n\nexport async function logout(): Promise<{ deleted: boolean }> {\n const deleted = deleteConfig();\n return { deleted };\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport async function whoami() {\n const client = createApiClient();\n const { data, error } = await client.GET('/api/auth/whoami');\n if (error) throw new Error(error.error?.message || 'Not authenticated');\n return data;\n}\n\n// === CLI Command Handler ===\n\nexport interface WhoamiCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n}\n\nexport async function whoamiCommand(\n options: WhoamiCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n try {\n const result = await whoami();\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n } else {\n const data = result as Record<string, unknown>;\n if (data.email) logger.info(`${data.email}`);\n if (data.userId) logger.info(`User: ${data.userId}`);\n if (data.projectId) logger.info(`Project: ${data.projectId}`);\n }\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport async function listProjects() {\n const client = createApiClient();\n const { data, error } = await client.GET('/api/projects');\n if (error) throw new Error(error.error?.message || 'Failed to list projects');\n return data;\n}\n\nexport async function getProject(options: { projectId?: string } = {}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.GET('/api/projects/{projectId}', {\n params: { path: { projectId: id } },\n });\n if (error) throw new Error(error.error?.message || 'Failed to get project');\n return data;\n}\n\nexport async function createProject(options: { name: string }) {\n const client = createApiClient();\n const { data, error } = await client.POST('/api/projects', {\n body: { name: options.name },\n });\n if (error)\n throw new Error(error.error?.message || 'Failed to create project');\n return data;\n}\n\nexport async function updateProject(options: {\n projectId?: string;\n name: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.PATCH('/api/projects/{projectId}', {\n params: { path: { projectId: id } },\n body: { name: options.name },\n });\n if (error)\n throw new Error(error.error?.message || 'Failed to update project');\n return data;\n}\n\nexport async function deleteProject(options: { projectId?: string } = {}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.DELETE('/api/projects/{projectId}', {\n params: { path: { projectId: id } },\n });\n if (error)\n throw new Error(error.error?.message || 'Failed to delete project');\n return data ?? { success: true };\n}\n\n// === CLI Command Handlers ===\n\ninterface ProjectsCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n project?: string;\n name?: string;\n}\n\nasync function handleResult(\n fn: () => Promise<unknown>,\n options: ProjectsCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport async function listProjectsCommand(\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(() => listProjects(), options);\n}\n\nexport async function getProjectCommand(\n projectId: string | undefined,\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getProject({ projectId: projectId ?? options.project }),\n options,\n );\n}\n\nexport async function createProjectCommand(\n name: string,\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(() => createProject({ name }), options);\n}\n\nexport async function updateProjectCommand(\n projectId: string | undefined,\n options: ProjectsCommandOptions,\n): Promise<void> {\n const name = options.name;\n if (!name) {\n throw new Error('Missing required option: --name <name>');\n }\n await handleResult(\n () =>\n updateProject({\n projectId: projectId ?? options.project,\n name,\n }),\n options,\n );\n}\n\nexport async function deleteProjectCommand(\n projectId: string | undefined,\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteProject({ projectId: projectId ?? options.project }),\n options,\n );\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport { isStdinPiped, readStdin } from '../../core/stdin.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport interface ListFlowsOptions {\n projectId?: string;\n sort?: 'name' | 'updated_at' | 'created_at';\n order?: 'asc' | 'desc';\n includeDeleted?: boolean;\n}\n\nexport async function listFlows(options: ListFlowsOptions = {}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.GET('/api/projects/{projectId}/flows', {\n params: {\n path: { projectId: id },\n query: {\n sort: options.sort,\n order: options.order,\n include_deleted: options.includeDeleted ? 'true' : undefined,\n },\n },\n });\n if (error) throw new Error(error.error?.message || 'Failed to list flows');\n return data;\n}\n\nexport async function getFlow(options: {\n flowId: string;\n projectId?: string;\n fields?: string[];\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.GET(\n '/api/projects/{projectId}/flows/{flowId}',\n {\n params: {\n path: { projectId: id, flowId: options.flowId },\n query: options.fields ? { fields: options.fields.join(',') } : {},\n },\n },\n );\n if (error) throw new Error(error.error?.message || 'Failed to get flow');\n return data;\n}\n\nexport async function createFlow(options: {\n name: string;\n content: Record<string, unknown>;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.POST('/api/projects/{projectId}/flows', {\n params: { path: { projectId: id } },\n // Content is user-provided JSON; server validates the full schema\n body: { name: options.name, content: options.content } as never,\n });\n if (error) throw new Error(error.error?.message || 'Failed to create flow');\n return data;\n}\n\nexport async function updateFlow(options: {\n flowId: string;\n name?: string;\n content?: Record<string, unknown>;\n projectId?: string;\n mergePatch?: boolean;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const body: Record<string, unknown> = {};\n if (options.name !== undefined) body.name = options.name;\n if (options.content !== undefined) body.content = options.content;\n const { data, error } = await client.PATCH(\n '/api/projects/{projectId}/flows/{flowId}',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n // Dynamically constructed body; server validates the full schema\n body: body as never,\n ...(options.mergePatch && {\n headers: { 'Content-Type': 'application/merge-patch+json' },\n }),\n },\n );\n if (error) throw new Error(error.error?.message || 'Failed to update flow');\n return data;\n}\n\nexport async function deleteFlow(options: {\n flowId: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.DELETE(\n '/api/projects/{projectId}/flows/{flowId}',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n },\n );\n if (error) throw new Error(error.error?.message || 'Failed to delete flow');\n return data ?? { success: true };\n}\n\nexport async function duplicateFlow(options: {\n flowId: string;\n name?: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.POST(\n '/api/projects/{projectId}/flows/{flowId}/duplicate',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n body: { name: options.name },\n },\n );\n if (error)\n throw new Error(error.error?.message || 'Failed to duplicate flow');\n return data;\n}\n\n// === CLI Command Handlers ===\n\ninterface FlowsCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n project?: string;\n}\n\nasync function handleResult(\n fn: () => Promise<unknown>,\n options: FlowsCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport async function listFlowsCommand(\n options: FlowsCommandOptions & {\n sort?: string;\n order?: string;\n includeDeleted?: boolean;\n },\n): Promise<void> {\n await handleResult(\n () =>\n listFlows({\n projectId: options.project,\n sort: options.sort as ListFlowsOptions['sort'],\n order: options.order as ListFlowsOptions['order'],\n includeDeleted: options.includeDeleted,\n }),\n options,\n );\n}\n\nexport async function getFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function createFlowCommand(\n name: string,\n options: FlowsCommandOptions & { content?: string },\n): Promise<void> {\n const content = options.content\n ? JSON.parse(options.content)\n : JSON.parse(await readFlowStdin());\n await handleResult(\n () => createFlow({ name, content, projectId: options.project }),\n options,\n );\n}\n\nexport async function updateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string; content?: string },\n): Promise<void> {\n const content = options.content ? JSON.parse(options.content) : undefined;\n await handleResult(\n () =>\n updateFlow({\n flowId,\n name: options.name,\n content,\n projectId: options.project,\n }),\n options,\n );\n}\n\nexport async function deleteFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function duplicateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string },\n): Promise<void> {\n await handleResult(\n () =>\n duplicateFlow({ flowId, name: options.name, projectId: options.project }),\n options,\n );\n}\n\nasync function readFlowStdin(): Promise<string> {\n if (!isStdinPiped()) {\n throw new Error('Content required: use --content or pipe via stdin');\n }\n return readStdin();\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport {\n authenticatedFetch,\n requireProjectId,\n resolveBaseUrl,\n} from '../../core/auth.js';\nimport { parseSSEEvents } from '../../core/sse.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\nimport { getFlow } from '../flows/index.js';\n\n// === Helpers ===\n\nasync function resolveConfigId(options: {\n flowId: string;\n projectId: string;\n flowName: string;\n}): Promise<string> {\n const flow = await getFlow({\n flowId: options.flowId,\n projectId: options.projectId,\n });\n const configs = (flow as { configs?: Array<{ id: string; name: string }> })\n .configs;\n if (!configs?.length) {\n throw new Error('Flow has no configs.');\n }\n const match = configs.find((c) => c.name === options.flowName);\n if (!match) {\n throw new Error(\n `Flow \"${options.flowName}\" not found. Available: ${configs.map((c) => c.name).join(', ')}`,\n );\n }\n return match.id;\n}\n\nasync function getAvailableFlowNames(options: {\n flowId: string;\n projectId: string;\n}): Promise<string[]> {\n const flow = await getFlow({\n flowId: options.flowId,\n projectId: options.projectId,\n });\n const configs = (flow as { configs?: Array<{ name: string }> }).configs;\n return configs?.map((c) => c.name) ?? [];\n}\n\n// === SSE Streaming ===\n\ninterface DeploymentResult {\n status: string;\n substatus?: string | null;\n type?: string;\n containerUrl?: string | null;\n publicUrl?: string | null;\n errorMessage?: string | null;\n [key: string]: unknown;\n}\n\nexport async function streamDeploymentStatus(\n projectId: string,\n deploymentId: string,\n options: {\n timeout?: number;\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n },\n): Promise<DeploymentResult> {\n const base = resolveBaseUrl();\n const timeoutMs = options.timeout ?? 120_000;\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${projectId}/deployments/${deploymentId}/stream`,\n {\n headers: { Accept: 'text/event-stream' },\n signal: options.signal ?? AbortSignal.timeout(timeoutMs),\n },\n );\n\n if (!response.ok) throw new Error(`Stream failed: ${response.status}`);\n if (!response.body) throw new Error('No response body');\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let result: DeploymentResult | null = null;\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const { parsed, remainder } = parseSSEEvents(buffer);\n buffer = remainder;\n\n for (const event of parsed) {\n if (event.type === 'status') {\n const data = JSON.parse(event.data);\n result = data;\n options.onStatus?.(data.status, data.substatus ?? null);\n }\n if (event.type === 'done') {\n return result!;\n }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n\n if (!result) throw new Error('Stream ended without terminal status');\n return result;\n}\n\n// === Programmatic API ===\n\nexport interface DeployOptions {\n flowId: string;\n projectId?: string;\n wait?: boolean;\n flowName?: string;\n timeout?: number; // ms, default 120_000\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n}\n\nexport async function deploy(options: DeployOptions) {\n const projectId = options.projectId ?? requireProjectId();\n const client = createApiClient();\n\n if (options.flowName) {\n const configId = await resolveConfigId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n return deployConfig({\n ...options,\n projectId,\n configId,\n timeout: options.timeout,\n signal: options.signal,\n onStatus: options.onStatus,\n });\n }\n\n // Legacy path\n const { data, error } = await client.POST(\n '/api/projects/{projectId}/flows/{flowId}/deploy',\n { params: { path: { projectId, flowId: options.flowId } } },\n );\n\n if (error) {\n const msg = error.error?.message || 'Failed to start deployment';\n const code = error.error?.code;\n if (code === 'AMBIGUOUS_CONFIG') {\n const names = await getAvailableFlowNames({\n flowId: options.flowId,\n projectId,\n });\n throw new Error(\n `This flow has multiple configs. Use --flow <name> to specify one.\\n` +\n `Available: ${names.join(', ')}`,\n );\n }\n throw new Error(msg);\n }\n\n if (!options.wait) return data;\n\n // Stream deployment status via SSE\n const result = await streamDeploymentStatus(projectId, data.deploymentId, {\n timeout: options.timeout,\n signal: options.signal,\n onStatus: options.onStatus,\n });\n\n return { ...data, ...result };\n}\n\n// TODO: Replace with typed client.POST() once api.gen.d.ts includes per-config routes\nasync function deployConfig(options: {\n flowId: string;\n projectId: string;\n configId: string;\n wait?: boolean;\n timeout?: number;\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n}) {\n const { flowId, projectId, configId } = options;\n const base = resolveBaseUrl();\n\n // 1. Trigger per-config deploy\n const response = await authenticatedFetch(\n `${base}/api/projects/${projectId}/flows/${flowId}/configs/${configId}/deploy`,\n { method: 'POST' },\n );\n if (!response.ok) {\n const body: { error?: { message?: string } } = await response\n .json()\n .catch(() => ({}));\n throw new Error(\n body.error?.message || `Deploy failed (${response.status})`,\n );\n }\n\n const data = await response.json();\n if (!options.wait) return data;\n\n // 2. Stream deployment status via SSE\n const result = await streamDeploymentStatus(projectId, data.deploymentId, {\n timeout: options.timeout,\n signal: options.signal,\n onStatus: options.onStatus,\n });\n\n return { ...data, ...result };\n}\n\nexport async function getDeployment(options: {\n flowId: string;\n projectId?: string;\n flowName?: string;\n}) {\n const projectId = options.projectId ?? requireProjectId();\n\n if (options.flowName) {\n const configId = await resolveConfigId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n const base = resolveBaseUrl();\n const response = await authenticatedFetch(\n `${base}/api/projects/${projectId}/flows/${options.flowId}/configs/${configId}/deploy`,\n );\n if (!response.ok) {\n const body: { error?: { message?: string } } = await response\n .json()\n .catch(() => ({}));\n throw new Error(body.error?.message || 'Failed to get deployment');\n }\n return response.json();\n }\n\n const client = createApiClient();\n\n const { data, error } = await client.GET(\n '/api/projects/{projectId}/flows/{flowId}/deploy',\n { params: { path: { projectId, flowId: options.flowId } } },\n );\n if (error)\n throw new Error(error.error?.message || 'Failed to get deployment');\n return data;\n}\n\n// === CLI Commands ===\n\ninterface DeployCommandOptions extends GlobalOptions {\n project?: string;\n flow?: string;\n wait?: boolean;\n timeout?: string;\n output?: string;\n json?: boolean;\n}\n\nconst statusLabels: Record<string, string> = {\n bundling: 'Building bundle...',\n 'bundling:building': 'Building bundle...',\n 'bundling:publishing': 'Publishing to web...',\n deploying: 'Deploying container...',\n 'deploying:provisioning': 'Provisioning container...',\n 'deploying:starting': 'Starting container...',\n active: 'Container is live',\n published: 'Published',\n failed: 'Deployment failed',\n};\n\nexport async function deployCommand(\n flowId: string,\n options: DeployCommandOptions,\n) {\n const log = createCLILogger(options);\n\n const timeoutMs = options.timeout\n ? parseInt(options.timeout, 10) * 1000\n : undefined;\n\n try {\n const result = await deploy({\n flowId,\n projectId: options.project,\n flowName: options.flow,\n wait: options.wait !== false,\n timeout: timeoutMs,\n onStatus: options.json\n ? undefined\n : (status, substatus) => {\n const key = substatus ? `${status}:${substatus}` : status;\n log.info(\n statusLabels[key] || statusLabels[status] || `Status: ${status}`,\n );\n },\n });\n\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n return;\n }\n\n const r = result as Record<string, unknown>;\n\n if (r.status === 'published') {\n log.info(`Published: ${r.publicUrl}`);\n } else if (r.status === 'active') {\n log.info(`Active: ${r.containerUrl}`);\n } else if (r.status === 'failed') {\n log.error(`Failed: ${r.errorMessage || 'Unknown error'}`);\n process.exit(1);\n } else if (r.status === 'bundling') {\n log.info(`Deployment started: ${r.deploymentId} (${r.type})`);\n } else {\n log.info(`Status: ${r.status}`);\n }\n } catch (err) {\n log.error(err instanceof Error ? err.message : 'Deploy failed');\n process.exit(1);\n }\n}\n\nexport async function getDeploymentCommand(\n flowId: string,\n options: DeployCommandOptions,\n) {\n const log = createCLILogger(options);\n\n try {\n const result = await getDeployment({\n flowId,\n projectId: options.project,\n flowName: options.flow,\n });\n\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n return;\n }\n\n if (!result) {\n log.info('No deployment found');\n return;\n }\n\n const r = result as Record<string, unknown>;\n log.info(`Deployment: ${r.id}`);\n log.info(`Type: ${r.type}`);\n log.info(`Status: ${r.status}`);\n if (r.containerUrl) log.info(`Endpoint: ${r.containerUrl}`);\n if (r.publicUrl) log.info(`URL: ${r.publicUrl}`);\n if (r.errorMessage) log.error(`Error: ${r.errorMessage}`);\n } catch (err) {\n log.error(err instanceof Error ? err.message : 'Failed to get deployment');\n process.exit(1);\n }\n}\n","import { getPlatform } from '@walkeros/core';\nimport {\n authenticatedFetch,\n requireProjectId,\n resolveBaseUrl,\n} from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport { loadFlowConfig } from '../../config/loader.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport interface ListDeploymentsOptions {\n projectId?: string;\n type?: 'web' | 'server';\n status?: string;\n}\n\nexport async function listDeployments(options: ListDeploymentsOptions = {}) {\n const id = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n const params = new URLSearchParams();\n if (options.type) params.set('type', options.type);\n if (options.status) params.set('status', options.status);\n const qs = params.toString();\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${id}/deployments${qs ? `?${qs}` : ''}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n 'Failed to list deployments',\n );\n }\n return response.json();\n}\n\nexport async function getDeploymentBySlug(options: {\n slug: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${id}/deployments/${options.slug}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n 'Failed to get deployment',\n );\n }\n return response.json();\n}\n\nexport async function createDeployment(options: {\n type: 'web' | 'server';\n label?: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${id}/deployments`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ type: options.type, label: options.label }),\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n 'Failed to create deployment',\n );\n }\n return response.json();\n}\n\nexport async function deleteDeployment(options: {\n slug: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const base = resolveBaseUrl();\n\n const response = await authenticatedFetch(\n `${base}/api/projects/${id}/deployments/${options.slug}`,\n { method: 'DELETE' },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n 'Failed to delete deployment',\n );\n }\n const data = await response.json().catch(() => null);\n return data ?? { success: true };\n}\n\n// === CLI Command Handlers ===\n\ninterface DeploymentsCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n project?: string;\n type?: string;\n status?: string;\n label?: string;\n}\n\nasync function handleResult(\n fn: () => Promise<unknown>,\n options: DeploymentsCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport async function listDeploymentsCommand(\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () =>\n listDeployments({\n projectId: options.project,\n type: options.type as ListDeploymentsOptions['type'],\n status: options.status,\n }),\n options,\n );\n}\n\nexport async function getDeploymentBySlugCommand(\n slug: string,\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getDeploymentBySlug({ slug, projectId: options.project }),\n options,\n );\n}\n\nexport async function createDeploymentCommand(\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () =>\n createDeployment({\n type: options.type as 'web' | 'server',\n label: options.label,\n projectId: options.project,\n }),\n options,\n );\n}\n\nexport async function deleteDeploymentCommand(\n slug: string,\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteDeployment({ slug, projectId: options.project }),\n options,\n );\n}\n\nexport async function createDeployCommand(\n config: string | undefined,\n options: DeploymentsCommandOptions & { flow?: string },\n): Promise<void> {\n const log = createCLILogger(options);\n\n try {\n let type: 'web' | 'server';\n\n if (!config) {\n log.error(\n 'Config required. Provide a flow config file or remote flow ID (cfg_xxx).',\n );\n process.exit(1);\n }\n\n // Detect: local file path vs remote flow ID\n const isRemoteFlow = config.startsWith('cfg_');\n\n if (isRemoteFlow) {\n // Fetch flow from API to determine type\n const id = options.project ?? requireProjectId();\n const base = resolveBaseUrl();\n const resp = await authenticatedFetch(\n `${base}/api/projects/${id}/flows/${config}`,\n );\n if (!resp.ok) {\n const body = await resp.json().catch(() => ({}));\n throw new Error(\n (body as { error?: { message?: string } }).error?.message ||\n `Failed to fetch flow ${config}`,\n );\n }\n const flow = (await resp.json()) as { content?: unknown };\n if (!flow.content) throw new Error('Flow has no content');\n\n const content = flow.content as { flows?: Record<string, unknown> };\n const flows = content.flows;\n if (!flows) throw new Error('Invalid flow content: missing flows');\n const flowName = options.flow ?? Object.keys(flows)[0];\n if (!flowName) throw new Error('No flows found in config');\n const flowConfig = flows[flowName];\n if (!flowConfig || typeof flowConfig !== 'object')\n throw new Error('Invalid flow config');\n\n if ('web' in flowConfig) type = 'web';\n else if ('server' in flowConfig) type = 'server';\n else throw new Error('Flow must have \"web\" or \"server\" key');\n } else {\n // Local file: use config loader + core getPlatform\n const result = await loadFlowConfig(config, {\n flowName: options.flow,\n });\n type = getPlatform(result.flowConfig);\n }\n\n // Create deployment via API\n const deployment = await createDeployment({\n type,\n label: options.label,\n projectId: options.project,\n });\n\n const result = deployment as Record<string, unknown>;\n\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n return;\n }\n\n // Human-readable output\n log.info(`Deployment created: ${result.id}`);\n log.info(` Slug: ${result.slug}`);\n log.info(` Type: ${result.type}`);\n if (result.deployToken) {\n log.info(` Token: ${result.deployToken}`);\n log.warn(' Save this token — it will not be shown again.');\n }\n log.info('');\n log.info('Run locally:');\n log.info(\n ` walkeros run ${isRemoteFlow ? 'flow.json' : config} --deploy ${result.id}`,\n );\n log.info('');\n log.info('Docker:');\n log.info(\n ` docker run -e WALKEROS_DEPLOY_TOKEN=${result.deployToken ?? '<token>'} \\\\`,\n );\n log.info(' -e WALKEROS_APP_URL=https://app.walkeros.io \\\\');\n log.info(' walkeros/flow:latest');\n } catch (err) {\n log.error(\n err instanceof Error ? err.message : 'Failed to create deployment',\n );\n process.exit(1);\n }\n}\n","// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand } from './commands/bundle/index.js';\nexport { simulateCommand } from './commands/simulate/index.js';\nexport { pushCommand } from './commands/push/index.js';\nexport { runCommand } from './commands/run/index.js';\nexport { validateCommand } from './commands/validate/index.js';\nexport { loginCommand } from './commands/login/index.js';\nexport { logoutCommand } from './commands/logout/index.js';\nexport { whoamiCommand } from './commands/auth/index.js';\nexport {\n listProjectsCommand,\n getProjectCommand,\n createProjectCommand,\n updateProjectCommand,\n deleteProjectCommand,\n} from './commands/projects/index.js';\nexport {\n listFlowsCommand,\n getFlowCommand,\n createFlowCommand,\n updateFlowCommand,\n deleteFlowCommand,\n duplicateFlowCommand,\n} from './commands/flows/index.js';\nexport {\n deployCommand,\n getDeploymentCommand,\n} from './commands/deploy/index.js';\nexport {\n createDeployCommand,\n listDeploymentsCommand,\n getDeploymentBySlugCommand,\n createDeploymentCommand,\n deleteDeploymentCommand,\n} from './commands/deployments/index.js';\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle, bundleRemote } from './commands/bundle/index.js';\nexport { simulate } from './commands/simulate/index.js';\nexport { push } from './commands/push/index.js';\nexport { run } from './commands/run/index.js';\nexport { validate } from './commands/validate/index.js';\nexport {\n getToken,\n getAuthHeaders,\n deployAuthenticatedFetch,\n requireProjectId,\n resolveBaseUrl,\n} from './core/auth.js';\nexport { createApiClient } from './core/api-client.js';\nexport {\n listProjects,\n getProject,\n createProject,\n updateProject,\n deleteProject,\n} from './commands/projects/index.js';\nexport { whoami } from './commands/auth/index.js';\nexport {\n listFlows,\n getFlow,\n createFlow,\n updateFlow,\n deleteFlow,\n duplicateFlow,\n} from './commands/flows/index.js';\nexport { deploy, getDeployment } from './commands/deploy/index.js';\nexport {\n listDeployments,\n getDeploymentBySlug,\n createDeployment,\n deleteDeployment,\n} from './commands/deployments/index.js';\nexport type { ListFlowsOptions } from './commands/flows/index.js';\nexport type { DeployOptions } from './commands/deploy/index.js';\nexport type { ListDeploymentsOptions } from './commands/deployments/index.js';\nexport { parseSSEEvents } from './core/sse.js';\nexport type { SSEEvent, SSEParseResult } from './core/sse.js';\n\n// === Utilities ===\n// Export utilities for programmatic usage\nexport { loadJsonConfig } from './config/utils.js';\nexport { findExample } from './commands/simulate/example-loader.js';\nexport { compareOutput } from './commands/simulate/compare.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 {\n SimulationResult,\n ExampleMatch,\n} from './commands/simulate/types.js';\nexport type { ExampleLookupResult } from './commands/simulate/example-loader.js';\nexport type { PushResult } from './commands/push/types.js';\nexport type {\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './commands/run/index.js';\nexport type { GlobalOptions } from './types/global.js';\nexport type {\n ValidateResult,\n ValidationType,\n ValidationError,\n ValidationWarning,\n} from './commands/validate/types.js';\n"],"mappings":"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","names":["readFileSync","fileURLToPath","dirname","join","p","instanceId","path","fs","getPlatform","path","existsSync","path","fs","path","fs","path","path","fs","path","existsSync","path","fs","logger","fs","fs","path","path","fs","path","fs","path","fs","path","fs","input","_","path","fs","c","logger","p","fs","path","path","fs","logger","path","fs","stats","_","c","s","d","m","v","k","fs","logger","path","fs","logger","path","logger","fs","getPlatform","r","fs","c","logger","fs","m","logger","fs","path","path","JSDOM","VirtualConsole","fs","getPlatform","schemas","Level","logger","schemas","Level","fs","path","getPlatform","VirtualConsole","JSDOM","_","resolve","path","existsSync","z","z","z","z","z","z","z","z","z","z","existsSync","path","fs","fs","path","createLogger","Level","logger","loggerConfig","logger","loggerConfig","Level","createLogger","logger","path","startHeartbeat","chalk","schemas","path","schemas","validateFlowSetup","path","a","b","k","r","path","m","schemas","validate","e","chalk","logger","logger","f","r","logger","logger","fn","logger","handleResult","fn","logger","c","r","getPlatform","handleResult","fn","logger","result","getPlatform"]}
|