@walkeros/cli 3.2.0-next-1775064795590 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/cli-logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/tmp.ts","../src/lib/config-file.ts","../src/core/http.ts","../src/config/utils.ts","../src/core/asset-resolver.ts","../src/core/utils.ts","../src/core/local-packages.ts","../src/core/input-detector.ts","../src/core/stdin.ts","../src/core/auth.ts","../src/core/sse.ts","../src/core/event-validation.ts","../src/core/package-path.ts","../src/core/index.ts","../src/config/validators.ts","../src/config/build-defaults.ts","../src/config/loader.ts","../src/config/index.ts","../src/commands/bundle/config-classifier.ts","../src/core/cache-utils.ts","../src/commands/bundle/package-manager.ts","../src/core/build-cache.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/upload.ts","../src/commands/bundle/stats.ts","../src/core/api-client.ts","../src/commands/bundle/dockerfile.ts","../src/commands/bundle/index.ts","../src/commands/push/env-loader.ts","../src/runtime/cache.ts","../src/commands/run/utils.ts","../src/index.ts","../src/commands/push/index.ts","../src/commands/push/overrides.ts","../src/commands/push/apply-overrides.ts","../src/commands/push/flow-context.ts","../src/commands/push/async-drain.ts","../src/commands/push/prepare.ts","../src/commands/run/index.ts","../src/runtime/resolve-bundle.ts","../src/runtime/config-fetcher.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/pipeline.ts","../src/runtime/health-server.ts","../src/runtime/runner.ts","../src/runtime/load-bundle.ts","../src/runtime/heartbeat.ts","../src/version.ts","../src/runtime/poller.ts","../src/runtime/secrets-fetcher.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/core/api-error.ts","../src/commands/deploy/index.ts","../src/commands/deployments/index.ts","../src/commands/feedback/index.ts","../src/commands/simulate/example-loader.ts","../src/commands/simulate/compare.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","/**\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","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 anonymousFeedback?: boolean;\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.\n * WALKEROS_APP_URL env var > config file > 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 resolveAppUrl,\n resolveToken,\n resolveDeployToken,\n} from '../lib/config-file.js';\n\n/**\n * Normalize headers from any RequestInit format to a plain object.\n */\nfunction normalizeHeaders(headers?: HeadersInit): Record<string, string> {\n if (!headers) return {};\n if (headers instanceof Headers) return Object.fromEntries(headers.entries());\n if (Array.isArray(headers)) return Object.fromEntries(headers);\n return headers as Record<string, string>;\n}\n\n/**\n * Merge a bearer token into a headers object.\n * Shared by apiFetch, deployFetch, and runtime callers that manage their own tokens.\n */\nexport function mergeAuthHeaders(\n token: string | null | undefined,\n headers?: HeadersInit,\n): Record<string, string> {\n const normalized = normalizeHeaders(headers);\n if (token) normalized.Authorization = `Bearer ${token}`;\n return normalized;\n}\n\n/**\n * Authenticated fetch — resolves base URL + adds auth token.\n * Use for all API calls that require WALKEROS_TOKEN.\n */\nexport async function apiFetch(\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const baseUrl = resolveAppUrl();\n const token = resolveToken()?.token;\n return fetch(`${baseUrl}${path}`, {\n ...init,\n headers: mergeAuthHeaders(token, init?.headers),\n });\n}\n\n/**\n * Unauthenticated fetch — resolves base URL, no auth.\n * Use for public endpoints (login device flow, feedback).\n */\nexport async function publicFetch(\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const baseUrl = resolveAppUrl();\n return fetch(`${baseUrl}${path}`, init);\n}\n\n/**\n * Deploy-authenticated fetch — uses deploy token with fallback to user token.\n * Use for runtime operations (heartbeat, config polling, secrets).\n */\nexport async function deployFetch(\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const baseUrl = resolveAppUrl();\n const token = resolveDeployToken() ?? resolveToken()?.token;\n if (!token)\n throw new Error(\n 'No authentication token available. Set WALKEROS_DEPLOY_TOKEN or run walkeros auth login.',\n );\n return fetch(`${baseUrl}${path}`, {\n ...init,\n headers: mergeAuthHeaders(token, init?.headers),\n });\n}\n","/**\n * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { mergeAuthHeaders } from '../core/http.js';\nimport { resolveToken } from '../lib/config-file.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 * Fetch content from a URL as a string, with auth headers.\n * Shared helper for all URL-loading paths.\n *\n * @param url - HTTP/HTTPS URL to fetch\n * @returns Response body as a string\n * @throws Error if fetch fails or response is not OK\n */\nexport async function fetchContentString(url: string): Promise<string> {\n const token = resolveToken()?.token;\n const response = await fetch(url, {\n headers: mergeAuthHeaders(token),\n });\n if (!response.ok) {\n throw new Error(\n `Failed to fetch ${url}: ${response.status} ${response.statusText}`,\n );\n }\n return response.text();\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 * Resolve raw string content from a URL, file path, or inline string.\n *\n * Detection priority:\n * 1. URL (http://, https://) — download content\n * 2. Existing file path — read file content\n * 3. Inline string — return as-is\n *\n * @param input - URL, file path, or inline string\n * @returns Raw string content and the resolved absolute path (if file-based)\n * @throws Error if file not found or download fails\n */\nasync function resolveContent(input: string): Promise<string> {\n const trimmed = input.trim();\n\n // 1. Check if input is a URL\n if (isUrl(trimmed)) {\n return fetchContentString(trimmed);\n }\n\n // 2. Check if file path exists\n const absolutePath = path.resolve(trimmed);\n if (await fs.pathExists(absolutePath)) {\n return fs.readFile(absolutePath, 'utf-8');\n }\n\n // 3. Inline content — return as-is\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return trimmed;\n }\n\n // 4. Nothing matched — file not found\n throw new Error(`Configuration file not found: ${absolutePath}`);\n}\n\n/**\n * Load configuration from a file path, URL, or inline string.\n *\n * Supports two modes:\n * - `json: true` (default) — resolves content and parses as JSON\n * - `json: false` — resolves content and returns raw string\n *\n * Detection priority:\n * 1. URL (http://, https://) — download content\n * 2. Existing file path — read file content\n * 3. Inline string (starting with { or [) — use directly\n *\n * @param input - Path to file, HTTP/HTTPS URL, or inline string\n * @param options - Optional settings\n * @param options.json - Parse as JSON (default: true)\n * @returns Parsed object (json: true) or raw string (json: false)\n * @throws Error if file not found, download fails, or invalid JSON\n *\n * @example\n * ```typescript\n * // JSON mode (default) — same as loadJsonConfig\n * const config = await loadConfig('./config.json')\n * const config = await loadConfig('https://example.com/config.json')\n * const config = await loadConfig('{\"version\":3,\"flows\":{}}')\n *\n * // Raw string mode — returns file/URL content as string\n * const code = await loadConfig('./bundle.js', { json: false })\n * ```\n */\nexport async function loadConfig<T = unknown>(\n input: string,\n options?: { json?: boolean },\n): Promise<T | string> {\n const json = options?.json !== false; // default true\n\n if (!json) {\n return resolveContent(input);\n }\n\n // JSON mode — resolve content then parse\n const trimmed = input.trim();\n\n try {\n const content = await resolveContent(trimmed);\n\n // Parse the resolved content as JSON\n return JSON.parse(content) as T;\n } catch (error) {\n // Distinguish between JSON parse errors and resolution errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Re-throw resolution errors (file not found, fetch failed) as-is\n if (\n errorMessage.includes('not found') ||\n errorMessage.includes('Failed to fetch')\n ) {\n throw error;\n }\n\n // JSON-looking inline content with parse errors\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n throw new Error(\n `Input appears to be JSON but contains errors: ${errorMessage}`,\n );\n }\n\n // File or URL with invalid JSON content\n throw new Error(`Invalid JSON in config file: ${input}. ${errorMessage}`);\n }\n}\n\n/**\n * Load and parse JSON configuration from a file path, URL, or inline JSON string.\n *\n * Thin wrapper around `loadConfig` with `json: true` (default).\n *\n * Detection priority:\n * 1. URL (http://, https://) — download and parse\n * 2. Existing file path — read and parse\n * 3. Inline JSON string (starting with { or [) — parse directly\n *\n * @param configPath - Path to JSON file, HTTP/HTTPS URL, or inline JSON string\n * @returns Parsed configuration object\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 * // Inline JSON\n * const config = await loadJsonConfig('{\"version\":3,\"flows\":{}}')\n * ```\n */\nexport async function loadJsonConfig<T>(configPath: string): Promise<T> {\n return loadConfig<T>(configPath, { json: true }) as Promise<T>;\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 // 1. Handle empty/undefined input (pre-check)\n if (!source || source.trim() === '') {\n if (options?.required) throw new Error(`${paramName} is required`);\n if (options?.fallback !== undefined) return options.fallback;\n return {} as T;\n }\n\n // 2. Try the strict loader (handles URL, file, inline JSON)\n try {\n return await loadJsonConfig<T>(source);\n } catch (error) {\n const trimmed = source.trim();\n\n // 3. Not JSON-looking? Treat as event name (backward compat)\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return { name: trimmed } as T;\n }\n\n // 4. JSON-looking but invalid -- re-throw with context\n throw new Error(\n `Failed to parse ${paramName}. ${error instanceof Error ? error.message : String(error)}`,\n );\n }\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 * 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 type LocalPackageInfo =\n | { name: string; absolutePath: string; type: 'file' }\n | { name: string; absolutePath: string; type: 'directory' }\n | {\n name: string;\n absolutePath: string;\n type: 'package';\n distPath: string;\n hasDistFolder: boolean;\n };\n\n/**\n * Resolve and validate a local package path.\n *\n * Handles three cases:\n * 1. Single file (with or without extension) → type: 'file'\n * 2. Directory without package.json → type: 'directory'\n * 3. Directory with package.json → type: 'package' (existing behavior)\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 const stat = await fs.stat(absolutePath).catch(() => null);\n\n // Case 1a: Direct file reference (e.g., ./src/decoder.ts)\n if (stat?.isFile()) {\n return { name: packageName, absolutePath, type: 'file' };\n }\n\n // Case 1b: Try with extensions (e.g., ./src/decoder → ./src/decoder.ts)\n if (!stat) {\n for (const ext of ['.ts', '.mjs', '.js', '.json']) {\n const withExt = absolutePath + ext;\n if (await fs.pathExists(withExt)) {\n return { name: packageName, absolutePath: withExt, type: 'file' };\n }\n }\n throw new Error(\n `Local package path not found: ${localPath} (resolved to ${absolutePath})`,\n );\n }\n\n // Path is a directory\n if (stat.isDirectory()) {\n const hasPkgJson = await fs.pathExists(\n path.join(absolutePath, 'package.json'),\n );\n\n if (hasPkgJson) {\n // Case 3: Full package (existing behavior)\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 type: 'package',\n distPath: hasDistFolder ? distPath : absolutePath,\n hasDistFolder,\n };\n }\n\n // Case 2: Directory without package.json\n return { name: packageName, absolutePath, type: 'directory' };\n }\n\n throw new Error(\n `Local package path not found: ${localPath} (resolved to ${absolutePath})`,\n );\n}\n\n/**\n * Copy local package to target node_modules directory.\n *\n * Handles three cases:\n * - file: Copy as index.{ext} with generated package.json\n * - directory: Copy contents with generated package.json\n * - package: Existing behavior (copy package.json + 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 if (localPkg.type === 'file') {\n await fs.ensureDir(packageDir);\n\n // Copy the single file as index (esbuild will resolve it)\n const ext = path.extname(localPkg.absolutePath);\n await fs.copy(localPkg.absolutePath, path.join(packageDir, `index${ext}`));\n\n // Create minimal package.json for module resolution\n await fs.writeJson(path.join(packageDir, 'package.json'), {\n name: localPkg.name,\n main: `./index${ext}`,\n });\n\n logger.info(\n `📦 Using local file: ${localPkg.name} from ${localPkg.absolutePath}`,\n );\n return packageDir;\n }\n\n if (localPkg.type === 'directory') {\n await fs.ensureDir(path.dirname(packageDir));\n\n // Copy directory 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 // Generate minimal package.json for module resolution\n await fs.writeJson(path.join(packageDir, 'package.json'), {\n name: localPkg.name,\n main: './index.ts',\n });\n\n logger.info(\n `📦 Using local dir: ${localPkg.name} from ${localPkg.absolutePath}`,\n );\n return packageDir;\n }\n\n // type === 'package': Existing behavior\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 { fetchContentString, isUrl } from '../config/utils.js';\n\nexport type Platform = 'web' | 'server';\n\nexport type DetectedInput =\n | { type: 'config'; content: string }\n | { type: 'bundle'; content: string; platform: Platform };\n\n/**\n * Detect if input is config JSON or pre-built bundle.\n *\n * Detection: Try JSON.parse, if fails = bundle\n * Platform: .mjs = server, .js = web\n *\n * @param inputPath - Path to file or URL\n * @param platformOverride - Optional platform override\n * @returns Detected input type with content\n */\nexport async function detectInput(\n inputPath: string,\n platformOverride?: Platform,\n): Promise<DetectedInput> {\n // Load content (URL or local file)\n const content = await loadContent(inputPath);\n\n // Try parsing as JSON\n try {\n JSON.parse(content);\n return { type: 'config', content };\n } catch {\n // Not JSON, treat as bundle\n const platform = platformOverride ?? detectPlatformFromPath(inputPath);\n return { type: 'bundle', content, platform };\n }\n}\n\n/**\n * Detect platform from file extension.\n *\n * @param inputPath - Path to file or URL\n * @returns Platform based on extension (.mjs = server, .js = web)\n */\nexport function detectPlatformFromPath(inputPath: string): Platform {\n // Remove query params for URLs\n const cleanPath = inputPath.split('?')[0];\n return cleanPath.endsWith('.mjs') ? 'server' : 'web';\n}\n\n/**\n * Load content from URL or local file.\n *\n * @param inputPath - Path to file or URL\n * @returns File content as string\n */\nasync function loadContent(inputPath: string): Promise<string> {\n if (isUrl(inputPath)) {\n return fetchContentString(inputPath);\n }\n // Inline JSON passthrough: JS bundles never start with { or [\n const trimmed = inputPath.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return trimmed;\n }\n\n return fs.readFile(inputPath, 'utf8');\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { getTmpPath } from './tmp.js';\n\nexport 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\n/**\n * Read stdin content and write to a labeled temp file.\n * Returns the temp file path for downstream functions that expect file paths.\n */\nexport async function readStdinToTempFile(label: string): Promise<string> {\n const content = await readStdin();\n const tmpPath = getTmpPath(undefined, `stdin-${label}.json`);\n await fs.ensureDir(path.dirname(tmpPath));\n await fs.writeFile(tmpPath, content, 'utf-8');\n return tmpPath;\n}\n","import { resolveToken, resolveDeployToken } 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\n/**\n * Resolve token for runtime operations (run command, heartbeat, polling).\n * Priority: WALKEROS_DEPLOY_TOKEN > WALKEROS_TOKEN > config file\n */\nexport function resolveRunToken(): string | null {\n return resolveDeployToken() ?? resolveToken()?.token ?? null;\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","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","import { schemas } from '@walkeros/core/dev';\n\nconst { PartialEventSchema } = schemas;\n\nexport type ValidationLevel = 'strict' | 'standard' | 'minimal';\n\nexport type EventValidationCode =\n | 'NOT_AN_OBJECT'\n | 'MISSING_EVENT_NAME'\n | 'EMPTY_EVENT_NAME'\n | 'INVALID_EVENT_NAME'\n | 'SCHEMA_VALIDATION';\n\nexport interface EventValidationError {\n path: string;\n message: string;\n value?: unknown;\n code: EventValidationCode;\n}\n\nexport interface EventValidationWarning {\n path: string;\n message: string;\n suggestion?: string;\n}\n\nexport interface EventValidationDetails {\n entity?: string | null;\n action?: string | null;\n hasConsent?: boolean;\n hasData?: boolean;\n hasContext?: boolean;\n}\n\nexport interface EventValidationResult {\n valid: boolean;\n errors: EventValidationError[];\n warnings: EventValidationWarning[];\n details: EventValidationDetails;\n}\n\nexport function validateEvent(\n input: unknown,\n level: ValidationLevel = 'strict',\n): EventValidationResult {\n const errors: EventValidationError[] = [];\n const warnings: EventValidationWarning[] = [];\n const details: EventValidationDetails = {};\n\n // All levels: must be an object\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n errors.push({\n path: 'root',\n message: 'Event must be an object',\n code: 'NOT_AN_OBJECT',\n });\n return { valid: false, errors, warnings, details };\n }\n\n const event = input as Record<string, unknown>;\n\n // All levels: name field checks\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 // Entity-action format check (strict + standard only)\n const name = event.name;\n if (!name.includes(' ')) {\n if (level === 'strict') {\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 if (level === 'standard') {\n warnings.push({\n path: 'name',\n message: `Event name \"${name}\" should follow \"ENTITY ACTION\" format (e.g., \"page view\")`,\n });\n details.entity = null;\n details.action = null;\n }\n // minimal: skip entirely\n } else {\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 // Minimal stops here\n if (level === 'minimal') {\n return { valid: errors.length === 0, errors, warnings, details };\n }\n\n // Standard + Strict: Zod schema validation\n const zodResult = PartialEventSchema.safeParse(input);\n if (!zodResult.success) {\n for (const issue of zodResult.error.issues) {\n const issuePath = issue.path.join('.');\n if (issuePath === 'name') continue; // handled above with better messages\n errors.push({\n path: issuePath || 'root',\n message: issue.message,\n code: 'SCHEMA_VALIDATION',\n });\n }\n }\n\n // Strict only: consent warning + details\n if (level === 'strict') {\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 details.hasConsent = !!event.consent;\n details.hasData = !!event.data;\n details.hasContext = !!event.context;\n }\n\n return { valid: errors.length === 0, errors, warnings, details };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport type { Flow } from '@walkeros/core';\n\n/**\n * Resolve a package name to an import path, consulting flow config's\n * packages.path for local overrides.\n *\n * When a package has a `path` field in the flow config, resolves the\n * local filesystem path (relative to configDir). For subpaths (e.g., \"/dev\"),\n * reads the package's exports map to find the actual file path.\n * Otherwise returns the bare package name for standard Node module resolution.\n */\nexport function resolvePackageImportPath(\n packageName: string,\n packages: Flow.Packages | undefined,\n configDir: string,\n subpath?: string,\n): string {\n const entry = packages?.[packageName];\n\n if (entry?.path) {\n const resolved = path.isAbsolute(entry.path)\n ? entry.path\n : path.resolve(configDir, entry.path);\n\n if (!subpath) return resolved;\n\n // Resolve subpath via package.json exports map (e.g., \"./dev\" → \"./dist/dev.mjs\")\n try {\n const pkgJson = JSON.parse(\n fs.readFileSync(path.join(resolved, 'package.json'), 'utf8'),\n );\n const exportKey = `.${subpath.startsWith('/') ? subpath : `/${subpath}`}`;\n const exp = pkgJson.exports?.[exportKey];\n if (exp) {\n const target =\n typeof exp === 'string'\n ? exp\n : exp.import || exp.require || exp.default;\n if (target) return path.join(resolved, target);\n }\n } catch {\n // Fall through to direct path join\n }\n\n return path.join(resolved, subpath.replace(/^\\//, ''));\n }\n\n // No local path — return bare name (with subpath if provided)\n return subpath ? `${packageName}${subpath}` : packageName;\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 } from './auth.js';\nexport {\n apiFetch,\n publicFetch,\n deployFetch,\n mergeAuthHeaders,\n} from './http.js';\nexport { parseSSEEvents } from './sse.js';\nexport type { SSEEvent, SSEParseResult } from './sse.js';\nexport * from './event-validation.js';\nexport * from './package-path.js';\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n * Uses Zod schemas from @walkeros/core for Flow.Config validation.\n */\n\nimport type { Flow } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\n\nconst { safeParseConfig } = 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.Config 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 (isFlowConfig(config)) {\n * const flowSettings = getFlowSettings(config, 'production');\n * }\n * ```\n */\nexport function isFlowConfig(data: unknown): data is Flow.Config {\n const result = safeParseConfig(data);\n return result.success;\n}\n\n/**\n * Validate Flow.Config 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.Config\n * @throws Error with descriptive message if validation fails\n */\nexport function validateFlowConfig(data: unknown): Flow.Config {\n const result = safeParseConfig(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.Config since Zod's inferred type is compatible but not identical\n return result.data as Flow.Config;\n}\n\n/**\n * Get available flow names from a Flow.Config.\n *\n * @param config - Flow.Config configuration\n * @returns Array of flow names\n */\nexport function getAvailableFlows(config: Flow.Config): string[] {\n return Object.keys(config.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: 'walkerOS',\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.Config configurations using core getFlowSettings().\n * Build options are determined by static platform defaults.\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { getFlowSettings, getPlatform, type Flow } from '@walkeros/core';\nimport type { BuildOptions } from '../types/bundle.js';\nimport {\n validateFlowConfig,\n isFlowConfig,\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 flowSettings: Flow.Settings;\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.Config from @walkeros/core as the only config format.\n * - Validates config structure\n * - Uses core getFlowSettings() 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.Config\n const config = validateFlowConfig(rawConfig);\n const availableFlows = getFlowNames(config);\n\n // Determine which flow to use\n const flowName = resolveFlow(config, options.flowName, availableFlows);\n\n // Resolve with deferred mode first (markers don't affect platform detection)\n let flowSettings = getFlowSettings(config, flowName, { deferred: true });\n const platform = getPlatform(flowSettings);\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 flowSettings = getFlowSettings(config, flowName);\n }\n\n // Get static build defaults based on platform\n const buildDefaults = getBuildDefaults(platform);\n\n // Extract packages from flowSettings (if present)\n const packages = flowSettings.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 = config.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 flowSettings,\n buildOptions,\n flowName,\n isMultiFlow,\n availableFlows,\n };\n}\n\n/**\n * Resolve which flow to use.\n *\n * @param config - Flow.Config 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 config: Flow.Config,\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.Config\n const config = validateFlowConfig(rawConfig);\n const flows = getFlowNames(config);\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 (isFlowConfig(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 { flowSettings, buildOptions } = await loadFlowConfig('./flow.json');\n * const { flowSettings } = 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","/**\n * Configuration Module\n *\n * Config format: Flow.Config from @walkeros/core\n * Build options: Static platform defaults from build-defaults.ts\n */\n\n// Type guards and validators\nexport {\n isObject,\n detectPlatform,\n isFlowConfig,\n validateFlowConfig,\n getAvailableFlows as getFlowNames,\n} from './validators.js';\n\n// Build defaults\nexport {\n WEB_BUILD_DEFAULTS,\n SERVER_BUILD_DEFAULTS,\n DEFAULT_OUTPUT_PATHS,\n getBuildDefaults,\n getDefaultOutput,\n} from './build-defaults.js';\n\n// Utility functions\nexport {\n substituteEnvVariables,\n loadConfig,\n loadJsonConfig,\n loadJsonFromSource,\n isUrl,\n} from './utils.js';\n\n// Loader\nexport {\n loadBundleConfig,\n loadAllFlows,\n getAvailableFlows,\n loadFlowConfig,\n} from './loader.js';\nexport type { LoadConfigResult, LoadConfigOptions } from './loader.js';\n\n// Type re-exports\nexport type {\n BuildOptions,\n CLIBuildOptions,\n MinifyOptions,\n Flow,\n} from '../types/bundle.js';\n","/**\n * Check if a config value contains code markers that require esbuild compilation.\n * Returns true if the value (or any nested value) contains:\n * - $code: prefix (raw JS expression)\n * - $store: prefix (JS variable reference)\n * - __WALKEROS_ENV: prefix (process.env expression)\n */\nexport function containsCodeMarkers(value: unknown): boolean {\n if (typeof value === 'string') {\n return (\n value.startsWith('$code:') ||\n value.startsWith('$store:') ||\n value.includes('__WALKEROS_ENV:')\n );\n }\n if (Array.isArray(value)) {\n return value.some(containsCodeMarkers);\n }\n if (value !== null && typeof value === 'object') {\n return Object.values(value as Record<string, unknown>).some(\n containsCodeMarkers,\n );\n }\n return false;\n}\n\n/**\n * Split a step's properties into code-layer (for esbuild) and data-layer (post-build).\n *\n * Code layer: 'code' key always, plus any property containing code markers\n * Data layer: plain JSON values (settings, mappings, chains, etc.)\n *\n * Not applicable to InlineCode steps — those go entirely to the code layer.\n */\nexport function classifyStepProperties(\n step: Record<string, unknown>,\n): { codeProps: Record<string, unknown>; dataProps: Record<string, unknown> } {\n const codeProps: Record<string, unknown> = {};\n const dataProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(step)) {\n if (key === 'code') {\n codeProps[key] = value;\n continue;\n }\n if (containsCodeMarkers(value)) {\n codeProps[key] = value;\n } else {\n dataProps[key] = value;\n }\n }\n\n return { codeProps, dataProps };\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';\nimport semver from 'semver';\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 // Dist tags (latest, next, beta, etc.) are mutable — they can point to\n // different versions over time, so caching must include a date component.\n // A version is immutable only if it's an exact semver (e.g., \"1.2.3\").\n if (semver.valid(version)) return false;\n return true;\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 getFlowSettingsCacheKey(\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","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport semver from 'semver';\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\nconst PACKAGE_DOWNLOAD_TIMEOUT_MS = 60000;\nconst PACOTE_OPTS = {\n registry: 'https://registry.npmjs.org',\n preferOnline: true,\n where: undefined,\n};\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;\n}\n\nexport interface VersionSpec {\n spec: string;\n source: 'direct' | 'dependency' | 'peerDependency';\n from: string;\n optional: boolean;\n localPath?: string;\n}\n\ninterface ResolvedPackage {\n name: string;\n version: string;\n localPath?: string;\n}\n\nfunction getPackageDirectory(baseDir: string, packageName: string): string {\n return path.join(baseDir, 'node_modules', packageName);\n}\n\n// ============================================================\n// Phase 1: Collect all version specs via BFS\n// ============================================================\n\nexport async function collectAllSpecs(\n packages: Package[],\n logger: Logger.Instance,\n configDir?: string,\n): Promise<Map<string, VersionSpec[]>> {\n const allSpecs = new Map<string, VersionSpec[]>();\n const visited = new Set<string>();\n\n interface QueueItem {\n name: string;\n spec: string;\n source: VersionSpec['source'];\n from: string;\n optional: boolean;\n localPath?: string;\n }\n\n const queue: QueueItem[] = packages.map((pkg) => ({\n name: pkg.name,\n spec: pkg.version,\n source: 'direct' as const,\n from: 'flow.json',\n optional: false,\n localPath: pkg.path,\n }));\n\n while (queue.length > 0) {\n const item = queue.shift()!;\n const visitKey = `${item.name}@${item.spec}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\n\n // Record this spec\n if (!allSpecs.has(item.name)) allSpecs.set(item.name, []);\n allSpecs.get(item.name)!.push({\n spec: item.spec,\n source: item.source,\n from: item.from,\n optional: item.optional,\n localPath: item.localPath,\n });\n\n // Resolve transitive deps for local packages by reading package.json\n if (item.localPath) {\n const resolvedPath = path.isAbsolute(item.localPath)\n ? item.localPath\n : path.resolve(configDir || process.cwd(), item.localPath);\n\n // Check if this local path has a package.json (directories only)\n const candidatePath = path.join(resolvedPath, 'package.json');\n const hasPkgJson = await fs.pathExists(candidatePath);\n\n if (hasPkgJson) {\n try {\n const pkgJson = await fs.readJson(candidatePath);\n\n // Queue regular dependencies\n const deps = pkgJson.dependencies || {};\n for (const [depName, depSpec] of Object.entries(deps)) {\n if (typeof depSpec === 'string') {\n queue.push({\n name: depName,\n spec: depSpec,\n source: 'dependency',\n from: item.name,\n optional: false,\n });\n }\n }\n\n // Queue peerDependencies with metadata\n const peerDeps = pkgJson.peerDependencies || {};\n const peerMeta = pkgJson.peerDependenciesMeta || {};\n for (const [depName, depSpec] of Object.entries(peerDeps)) {\n if (typeof depSpec === 'string') {\n const isOptional =\n (peerMeta as Record<string, { optional?: boolean }>)[depName]\n ?.optional === true;\n queue.push({\n name: depName,\n spec: depSpec,\n source: 'peerDependency',\n from: item.name,\n optional: isOptional,\n });\n }\n }\n } catch (error) {\n logger.debug(\n `Failed to read package.json for local package ${item.name}: ${error}`,\n );\n }\n }\n\n continue;\n }\n\n // Fetch manifest from registry\n let manifest: pacote.ManifestResult;\n try {\n manifest = await withTimeout(\n pacote.manifest(`${item.name}@${item.spec}`, PACOTE_OPTS),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Manifest fetch timed out: ${item.name}@${item.spec}`,\n );\n } catch (error) {\n logger.debug(\n `Failed to fetch manifest for ${item.name}@${item.spec}: ${error}`,\n );\n continue;\n }\n\n // Queue regular dependencies\n const m = manifest as unknown as Record<string, unknown>;\n const deps = (m.dependencies as Record<string, string> | undefined) || {};\n for (const [depName, depSpec] of Object.entries(deps)) {\n if (typeof depSpec === 'string') {\n queue.push({\n name: depName,\n spec: depSpec,\n source: 'dependency',\n from: item.name,\n optional: false,\n });\n }\n }\n\n // Queue peerDependencies with metadata\n const peerDeps =\n (m.peerDependencies as Record<string, string> | undefined) || {};\n const peerMeta =\n (m.peerDependenciesMeta as\n | Record<string, { optional?: boolean }>\n | undefined) || {};\n for (const [depName, depSpec] of Object.entries(peerDeps)) {\n if (typeof depSpec === 'string') {\n const isOptional = peerMeta[depName]?.optional === true;\n queue.push({\n name: depName,\n spec: depSpec,\n source: 'peerDependency',\n from: item.name,\n optional: isOptional,\n });\n }\n }\n }\n\n return allSpecs;\n}\n\n// ============================================================\n// Phase 2: Resolve version conflicts\n// ============================================================\n\nconst SOURCE_PRIORITY: Record<VersionSpec['source'], number> = {\n direct: 0,\n dependency: 1,\n peerDependency: 2,\n};\n\nexport function resolveVersionConflicts(\n allSpecs: Map<string, VersionSpec[]>,\n logger: Logger.Instance,\n): Map<string, ResolvedPackage> {\n const resolved = new Map<string, ResolvedPackage>();\n\n for (const [name, specs] of allSpecs) {\n // Local paths always win\n const localSpec = specs.find((s) => s.localPath);\n if (localSpec) {\n resolved.set(name, {\n name,\n version: 'local',\n localPath: localSpec.localPath,\n });\n continue;\n }\n\n // Separate by source\n const nonPeerSpecs = specs.filter((s) => s.source !== 'peerDependency');\n const peerSpecs = specs.filter((s) => s.source === 'peerDependency');\n\n // Determine active specs (what we resolve from)\n let activeSpecs: VersionSpec[];\n if (nonPeerSpecs.length > 0) {\n activeSpecs = nonPeerSpecs;\n } else {\n // Only peerDeps — filter out optional ones\n const requiredPeers = peerSpecs.filter((s) => !s.optional);\n if (requiredPeers.length === 0) {\n logger.debug(`Skipping optional peer dependency: ${name}`);\n continue;\n }\n activeSpecs = requiredPeers;\n }\n\n // Sort by priority (direct first)\n activeSpecs.sort(\n (a, b) => SOURCE_PRIORITY[a.source] - SOURCE_PRIORITY[b.source],\n );\n\n // Direct specs always win — if we have one, use it\n const directSpecs = activeSpecs.filter((s) => s.source === 'direct');\n const directExact = directSpecs.find((s) => semver.valid(s.spec) !== null);\n\n let chosenVersion: string;\n\n if (directExact) {\n // Direct exact version always wins\n chosenVersion = directExact.spec;\n } else if (directSpecs.length > 0) {\n // Direct range/tag — use it\n chosenVersion = directSpecs[0].spec;\n } else {\n // No direct specs — check for conflicts among transitive deps\n const exactVersions = activeSpecs\n .filter((s) => semver.valid(s.spec) !== null)\n .map((s) => s.spec);\n const uniqueExact = [...new Set(exactVersions)];\n\n if (uniqueExact.length > 1) {\n throw new Error(\n `Version conflict for ${name}: ${uniqueExact.join(' vs ')} ` +\n `(from ${activeSpecs.map((s) => `${s.spec} via ${s.from}`).join(', ')})`,\n );\n } else if (uniqueExact.length === 1) {\n chosenVersion = uniqueExact[0];\n } else {\n // All ranges/tags — use the highest-priority spec as-is\n chosenVersion = activeSpecs[0].spec;\n }\n }\n\n // Validate against ALL specs (including peerDeps)\n if (semver.valid(chosenVersion)) {\n for (const spec of specs) {\n if (spec.localPath) continue;\n if (semver.valid(spec.spec)) {\n // Both exact — must match\n if (spec.spec !== chosenVersion) {\n if (spec.source === 'peerDependency') {\n logger.warn(\n `${name}@${chosenVersion} differs from peer constraint ${spec.spec} (from ${spec.from})`,\n );\n }\n }\n } else {\n // Chosen is exact, spec is range — check satisfaction\n if (\n !semver.satisfies(chosenVersion, spec.spec, {\n includePrerelease: true,\n })\n ) {\n if (spec.source === 'peerDependency') {\n logger.warn(\n `${name}@${chosenVersion} may not satisfy peer constraint ${spec.spec} (from ${spec.from})`,\n );\n } else {\n throw new Error(\n `Version conflict: ${name}@${chosenVersion} does not satisfy ` +\n `${spec.spec} required by ${spec.from}`,\n );\n }\n }\n }\n }\n }\n\n resolved.set(name, { name, version: chosenVersion });\n }\n\n return resolved;\n}\n\n// ============================================================\n// Phase 3: Install resolved packages\n// ============================================================\n\nexport async function downloadPackages(\n packages: Package[],\n targetDir: string,\n logger: Logger.Instance,\n useCache = true,\n configDir?: string,\n tmpDir?: string,\n): Promise<Map<string, string>> {\n const packagePaths = new Map<string, string>();\n\n // Track user-specified packages (only these are logged)\n const userSpecifiedPackages = new Set(packages.map((p) => p.name));\n\n // Validate no duplicate packages with different versions in direct list\n validateNoDuplicatePackages(packages);\n\n // Phase 1: Collect all version specs\n logger.debug('Resolving dependencies');\n const allSpecs = await collectAllSpecs(packages, logger, configDir);\n\n // Phase 2: Resolve conflicts\n const resolved = resolveVersionConflicts(allSpecs, logger);\n\n // Phase 3: Install each resolved package exactly once\n await fs.ensureDir(targetDir);\n\n // Track local package paths (to redirect transitive refs to local copies)\n const localPackageMap = new Map<string, string>();\n for (const pkg of packages) {\n if (pkg.path) localPackageMap.set(pkg.name, pkg.path);\n }\n\n for (const [name, pkg] of resolved) {\n // Handle local packages\n if (pkg.localPath || localPackageMap.has(name)) {\n const localPath = pkg.localPath || localPackageMap.get(name)!;\n const localPkg = await resolveLocalPackage(\n name,\n localPath,\n configDir || process.cwd(),\n logger,\n );\n const installedPath = await copyLocalPackage(localPkg, targetDir, logger);\n packagePaths.set(name, installedPath);\n continue;\n }\n\n const packageSpec = `${name}@${pkg.version}`;\n const packageDir = getPackageDirectory(targetDir, name);\n const cachedPath = await getCachedPackagePath(\n { name, version: pkg.version },\n tmpDir,\n );\n\n if (\n useCache &&\n (await isPackageCached({ name, version: pkg.version }, tmpDir))\n ) {\n if (userSpecifiedPackages.has(name)) {\n logger.debug(`Downloading ${packageSpec} (cached)`);\n }\n try {\n await fs.ensureDir(path.dirname(packageDir));\n await fs.copy(cachedPath, packageDir);\n packagePaths.set(name, packageDir);\n continue;\n } catch {\n logger.debug(`Cache miss for ${packageSpec}, downloading fresh`);\n }\n }\n\n try {\n await fs.ensureDir(path.dirname(packageDir));\n const cacheDir =\n process.env.NPM_CACHE_DIR || getTmpPath(tmpDir, 'cache', 'npm');\n await withTimeout(\n pacote.extract(packageSpec, packageDir, {\n ...PACOTE_OPTS,\n cache: cacheDir,\n }),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Package download timed out after ${PACKAGE_DOWNLOAD_TIMEOUT_MS / 1000}s: ${packageSpec}`,\n );\n\n if (userSpecifiedPackages.has(name)) {\n logger.debug(`Downloading ${packageSpec}`);\n }\n\n // Cache for future use\n if (useCache) {\n try {\n await fs.ensureDir(path.dirname(cachedPath));\n await fs.copy(packageDir, cachedPath);\n } catch {\n // Silent cache failures\n }\n }\n\n packagePaths.set(name, packageDir);\n } catch (error) {\n throw new Error(`Failed to download ${packageSpec}: ${error}`);\n }\n }\n\n return packagePaths;\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\nasync function getCachedPackagePath(\n pkg: { name: string; version: string },\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: { name: string; version: string },\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 for (const pkg of packages) {\n if (!packageMap.has(pkg.name)) packageMap.set(pkg.name, []);\n packageMap.get(pkg.name)!.push(pkg.version);\n }\n\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 * 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 { getHashServer } from '@walkeros/server-core';\nimport { getFlowSettingsCacheKey } 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 getFlowSettingsCacheKey(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/**\n * Get the cache file path for compiled code (code-only esbuild output).\n * Uses content-based hashing only (no date component) since code is\n * deterministic for the same packages + esbuild options.\n */\nexport async function getCodeCachePath(\n codeContent: string,\n tmpDir?: string,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'code');\n const cacheKey = await getHashServer(codeContent, 12);\n return path.join(cacheDir, `${cacheKey}.js`);\n}\n\nexport async function isCodeCached(\n codeContent: string,\n tmpDir?: string,\n): Promise<boolean> {\n const cachePath = await getCodeCachePath(codeContent, tmpDir);\n return fs.pathExists(cachePath);\n}\n\nexport async function cacheCode(\n codeContent: string,\n codeOutput: string,\n tmpDir?: string,\n): Promise<void> {\n const cachePath = await getCodeCachePath(codeContent, tmpDir);\n await fs.ensureDir(path.dirname(cachePath));\n await fs.writeFile(cachePath, codeOutput, 'utf-8');\n}\n\nexport async function getCachedCode(\n codeContent: string,\n tmpDir?: string,\n): Promise<string | null> {\n const cachePath = await getCodeCachePath(codeContent, tmpDir);\n if (await fs.pathExists(cachePath)) {\n return fs.readFile(cachePath, 'utf-8');\n }\n return null;\n}\n\n/**\n * Write compiled code to a .mjs file on disk and return the path.\n * Used by the two-stage bundler so stage 2 esbuild can import from stage 1 output.\n * Content-addressed: same code content always maps to the same file path.\n */\nexport async function ensureCodeOnDisk(\n codeContent: string,\n compiledCode: string,\n tmpDir?: string,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'code');\n const cacheKey = await getHashServer(codeContent, 12);\n const cachePath = path.join(cacheDir, `${cacheKey}.mjs`);\n\n if (!(await fs.pathExists(cachePath))) {\n await fs.ensureDir(path.dirname(cachePath));\n await fs.writeFile(cachePath, compiledCode, 'utf-8');\n }\n\n return cachePath;\n}\n","import crypto from 'crypto';\nimport esbuild from 'esbuild';\nimport { builtinModules } from 'module';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { packageNameToVariable, ENV_MARKER_PREFIX } from '@walkeros/core';\nimport {\n classifyStepProperties,\n containsCodeMarkers,\n} from './config-classifier.js';\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 hasCodeReference(code: unknown): boolean {\n return isInlineCode(code) || typeof code === 'string';\n}\n\nfunction validateReference(\n type: string,\n name: string,\n ref: { package?: string; code?: unknown },\n): void {\n const hasPackage = !!ref.package;\n const hasInlineCode = isInlineCode(ref.code);\n const hasCode = hasCodeReference(ref.code);\n\n // Inline code object + package is invalid (ambiguous)\n if (hasPackage && hasInlineCode) {\n throw new Error(\n `${type} \"${name}\": Cannot specify both package and code. Use one or the other.`,\n );\n }\n // String code + package is valid (named import from package)\n // Neither package nor code is invalid\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 getCachedCode,\n cacheCode,\n ensureCodeOnDisk,\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 flowSettings: Flow.Settings,\n buildOptions: BuildOptions,\n): string {\n const configForCache = {\n flow: flowSettings,\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 flowSettings: Flow.Settings,\n logger: Logger.Instance,\n): boolean {\n let hasDeprecatedCodeTrue = false;\n\n // Check sources for code: true (deprecated, removed from types)\n const sources = flowSettings.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 = flowSettings.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 = flowSettings.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 flowSettings: Flow.Settings,\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(flowSettings, logger);\n if (hasDeprecatedFeatures) {\n logger.warn('Skipping deprecated code: true entries from bundle.');\n }\n\n // Per-build isolation: unique working dir, shared cache\n const buildId = crypto.randomUUID();\n const TEMP_DIR =\n buildOptions.tempDir || getTmpPath(undefined, `walkeros-build-${buildId}`);\n const CACHE_DIR = buildOptions.tempDir || getTmpPath();\n\n // Check build cache if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowSettings, buildOptions);\n\n const cached = await isBuildCached(configContent, CACHE_DIR);\n if (cached) {\n const cachedBuild = await getCachedBuild(configContent, CACHE_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 (flowSettings as unknown as { sources?: Record<string, unknown> })\n .sources || {},\n ).length > 0 ||\n Object.keys(\n (flowSettings 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 1.6: Auto-add step packages (sources, destinations, transformers, stores)\n const stepPackages = collectAllStepPackages(flowSettings);\n for (const pkg of stepPackages) {\n const isLocalPath = pkg.startsWith('.') || pkg.startsWith('/');\n\n if (isLocalPath) {\n // Normalize: convert path-based package: to packages section entry\n // This reuses the existing local-path import machinery\n const varName = packageNameToVariable(pkg);\n if (!buildOptions.packages[varName]) {\n buildOptions.packages[varName] = {\n path: pkg,\n imports: [`default as ${varName}`],\n };\n }\n\n // Rewrite all components that reference this path to use code: instead\n for (const section of ['sources', 'destinations', 'transformers', 'stores'] as const) {\n const steps = (flowSettings as Record<string, Record<string, Record<string, unknown>>>)[section];\n if (!steps) continue;\n for (const step of Object.values(steps)) {\n if (step.package === pkg) {\n step.code = varName;\n delete step.package;\n }\n }\n }\n } else if (!buildOptions.packages[pkg]) {\n buildOptions.packages[pkg] = {};\n }\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 CACHE_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 split entry point (code skeleton + data payload)\n logger.debug('Creating entry point');\n const { codeEntry, dataPayload, hasFlow } = await createEntryPoint(\n flowSettings,\n buildOptions,\n packagePaths,\n );\n\n const outputPath = path.resolve(buildOptions.output);\n\n // Ensure output directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n // === LEVEL 2: Two-phase build (code cache) ===\n // Check if we have a cached compilation of this exact code entry\n let compiledCode: string | null = null;\n if (buildOptions.cache !== false) {\n compiledCode = await getCachedCode(codeEntry, CACHE_DIR);\n }\n\n if (compiledCode) {\n logger.debug('Using cached compiled code (config-only change)');\n } else {\n // Cache miss: run esbuild on code-only entry\n logger.debug(\n `Running esbuild (target: ${buildOptions.target || 'es2018'}, format: ${buildOptions.format})`,\n );\n const entryPath = path.join(TEMP_DIR, 'entry.js');\n await fs.writeFile(entryPath, codeEntry);\n\n // minify: false — keep identifiers readable for debugging.\n // Stage 2 esbuild (in generateServerEntry/generateWebEntry) handles\n // final bundling with proper import resolution, so minification here\n // is unnecessary.\n const esbuildOptions = createEsbuildOptions(\n { ...buildOptions, minify: false },\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 compiledCode = await fs.readFile(outputPath, 'utf-8');\n\n // Cache the compiled code for future builds\n if (buildOptions.cache !== false) {\n await cacheCode(codeEntry, compiledCode, CACHE_DIR);\n }\n }\n\n // Write stage 1 output to cache as importable .mjs file\n const stage1Path = await ensureCodeOnDisk(\n codeEntry,\n compiledCode,\n CACHE_DIR,\n );\n\n if (buildOptions.skipWrapper || !hasFlow) {\n // Simulation path or no-flow path: concatenate code + data (no wrapper, no stage 2 esbuild)\n const dataDeclaration = `const __configData = ${dataPayload};\\nexport { __configData };`;\n // For node platform, prepend createRequire banner (stage 1 no longer adds it)\n const banner =\n buildOptions.platform === 'node'\n ? `import { createRequire } from 'module';const require = createRequire(import.meta.url);\\n`\n : '';\n const esmOutput = `${banner}${compiledCode}\\n${dataDeclaration}`;\n await fs.writeFile(outputPath, esmOutput);\n } else {\n // Production path: stage 2 esbuild compilation\n const stage2Entry =\n (buildOptions.platform || 'node') === 'browser'\n ? generateWebEntry(stage1Path, dataPayload, {\n windowCollector: buildOptions.windowCollector,\n windowElb: buildOptions.windowElb,\n })\n : generateServerEntry(stage1Path, dataPayload);\n\n const stage2EntryPath = path.join(TEMP_DIR, 'stage2.mjs');\n await fs.writeFile(stage2EntryPath, stage2Entry);\n\n // Stage 2 esbuild: resolve imports, inline stage 1, minify\n const stage2Options: esbuild.BuildOptions = {\n entryPoints: [stage2EntryPath],\n bundle: true,\n format: 'esm',\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\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 charset: 'utf8',\n }),\n };\n\n // Platform-specific stage 2 options\n if (buildOptions.platform === 'browser') {\n stage2Options.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n stage2Options.target = buildOptions.target || 'es2018';\n } else {\n stage2Options.external = getNodeExternals();\n stage2Options.banner = {\n js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`,\n };\n stage2Options.target = buildOptions.target || 'node18';\n }\n\n try {\n await esbuild.build(stage2Options);\n } finally {\n await esbuild.stop();\n }\n }\n\n // Get file size and calculate build time\n const outputStats = await fs.stat(outputPath);\n const sizeKB = (outputStats.size / 1024).toFixed(1);\n const buildTime = ((Date.now() - bundleStartTime) / 1000).toFixed(1);\n logger.info(`Output: ${outputPath} (${sizeKB} KB, ${buildTime}s)`);\n\n // Cache the full build result if caching is enabled (Level 1 fast path)\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowSettings, buildOptions);\n const buildOutput = await fs.readFile(outputPath, 'utf-8');\n await cacheBuild(configContent, buildOutput, CACHE_DIR);\n logger.debug('Build cached for future use');\n }\n\n // Collect stats if requested\n let stats: BundleStats | undefined;\n if (showStats) {\n stats = await collectBundleStats(\n outputPath,\n buildOptions.packages,\n bundleStartTime,\n codeEntry,\n );\n }\n\n // 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 return stats;\n } catch (error) {\n throw error;\n } finally {\n // Clean up per-build directory (contains entry.js with potential secrets)\n if (!buildOptions.tempDir) {\n fs.remove(TEMP_DIR).catch(() => {});\n }\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: 'esm' as esbuild.Format, // Always ESM — platform wrapper handles final 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 // Only Node.js built-ins are external — everything else gets bundled.\n // This makes server bundles self-contained (no node_modules needed at runtime).\n const nodeExternals = getNodeExternals();\n baseOptions.external = buildOptions.external\n ? [...nodeExternals, ...buildOptions.external]\n : nodeExternals;\n\n // createRequire shim is added in stage 2, not here.\n // Stage 1 produces importable ESM; stage 2 wraps it with the banner.\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 */\n/**\n * Detects packages from a flow config section (sources, destinations, transformers, stores).\n * Extracts package names from steps that have an explicit 'package' field.\n * Skips steps with code: true (inline code).\n */\nexport function detectStepPackages(\n flowSettings: Flow.Settings,\n section: 'sources' | 'destinations' | 'transformers' | 'stores',\n): Set<string> {\n const packages = new Set<string>();\n const steps = (\n flowSettings as unknown as {\n [key: string]: Record<string, unknown> | undefined;\n }\n )[section];\n\n if (steps) {\n for (const [, stepConfig] of Object.entries(steps)) {\n if (typeof stepConfig !== 'object' || stepConfig === null) continue;\n // Skip if code: true (uses built-in inline code)\n if ('code' in stepConfig && stepConfig.code === true) continue;\n // Require explicit package field\n if ('package' in stepConfig && typeof stepConfig.package === 'string') {\n packages.add(stepConfig.package);\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Get the complete list of Node.js built-in modules for esbuild external config.\n * Includes bare names, node: prefixed, and subpath patterns.\n * Only Node builtins — no npm packages.\n */\nexport function getNodeExternals(): string[] {\n const externals: string[] = [];\n for (const mod of builtinModules) {\n if (mod.startsWith('_')) continue; // Skip internal modules\n externals.push(mod, `node:${mod}`, `${mod}/*`, `node:${mod}/*`);\n }\n return externals;\n}\n\n/**\n * Collects all package names declared in flow steps.\n * Returns both npm packages and local paths — caller handles routing.\n */\nexport function collectAllStepPackages(\n flowSettings: Flow.Settings,\n): Set<string> {\n const allPackages = new Set<string>();\n const sections = [\n 'sources',\n 'destinations',\n 'transformers',\n 'stores',\n ] as const;\n\n for (const section of sections) {\n for (const pkg of detectStepPackages(flowSettings, section)) {\n allPackages.add(pkg);\n }\n }\n\n return allPackages;\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 flowSettings: Flow.Settings,\n): Map<string, Set<string>> {\n const explicitCodeImports = new Map<string, Set<string>>();\n\n // Check destinations\n const destinations = (\n flowSettings 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 flowSettings 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 flowSettings 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 = (\n flowSettings 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 flowSettings: Flow.Settings,\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: flowSettings.sources || {},\n destinations: flowSettings.destinations || {},\n transformers: flowSettings.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 flowSettings: Flow.Settings,\n buildOptions: BuildOptions,\n packagePaths: Map<string, string>,\n): Promise<{ codeEntry: string; dataPayload: string; hasFlow: boolean }> {\n // Detect packages used by all step types\n const sourcePackages = detectStepPackages(flowSettings, 'sources');\n const destinationPackages = detectStepPackages(flowSettings, 'destinations');\n const transformerPackages = detectStepPackages(flowSettings, 'transformers');\n const storePackages = detectStepPackages(flowSettings, 'stores');\n const explicitCodeImports = detectExplicitCodeImports(flowSettings);\n\n // Validate $store: references before code generation\n const storeIds = new Set(\n Object.keys(\n (flowSettings as unknown as { stores?: Record<string, unknown> })\n .stores || {},\n ),\n );\n validateStoreReferences(flowSettings, storeIds);\n\n // Validate component names are valid JS identifiers (they become property names in generated code)\n const flowWithSections = flowSettings 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(flowSettings.sources || {}).some(\n (s) => s.package || hasCodeReference(s.code),\n ) ||\n Object.values(flowSettings.destinations || {}).some(\n (d) => d.package || hasCodeReference(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 {\n codeEntry: importsCode ? `${importsCode}\\n\\n${userCode}` : userCode,\n dataPayload: '{}',\n hasFlow: false,\n };\n }\n\n // Build split config object (code skeleton + data payload)\n const { storesDeclaration, codeConfigObject, dataPayload } =\n buildSplitConfigObject(flowSettings, explicitCodeImports);\n\n // Generate platform-agnostic wireConfig module with __data parameter\n const wireConfigModule = generateSplitWireConfigModule(\n storesDeclaration,\n codeConfigObject,\n buildOptions.code || '',\n );\n\n // Return ESM module (imports + wireConfig + startFlow re-export)\n const codeEntry = importsCode\n ? `${importsCode}\\n\\n${wireConfigModule}`\n : wireConfigModule;\n\n return { codeEntry, dataPayload, hasFlow: true };\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 split config object from flow configuration.\n * Produces TWO outputs:\n * - codeConfigObject: skeleton with code references and __data.* placeholders\n * - dataPayload: plain JSON-serializable object with settings, mappings, etc.\n *\n * Inline code steps bypass classification and go entirely to the code skeleton.\n * Package-based steps are split via classifyStepProperties.\n */\nexport function buildSplitConfigObject(\n flowSettings: Flow.Settings,\n explicitCodeImports: Map<string, Set<string>>,\n): {\n storesDeclaration: string;\n codeConfigObject: string;\n dataPayload: string;\n} {\n const flowWithProps = flowSettings as unknown as {\n sources?: Record<\n string,\n {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n before?: string | string[];\n next?: string | string[] | Array<{ match: unknown; next: unknown }>;\n cache?: unknown;\n primary?: boolean;\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 next?: string | string[];\n cache?: unknown;\n }\n >;\n transformers?: Record<\n string,\n {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n before?: string | string[];\n next?: string;\n cache?: unknown;\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 // Data payload accumulator\n const dataPayloadObj: Record<string, Record<string, unknown>> = {};\n\n // Helper to resolve the code variable for a package-based step\n function resolveCodeVar(step: {\n package?: string;\n code?: string | true;\n }): string {\n // String code without package = named import from packages section\n if (step.code && typeof step.code === 'string' && !step.package) {\n return step.code;\n }\n if (\n step.code &&\n typeof step.code === 'string' &&\n step.package &&\n explicitCodeImports.has(step.package)\n ) {\n return step.code;\n }\n return packageNameToVariable(step.package!);\n }\n\n // Helper to build step properties (excluding 'code' and 'package')\n function getStepProps(\n step: Record<string, unknown>,\n ): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(step)) {\n if (key === 'code' || key === 'package') continue;\n if (value !== undefined && value !== null) {\n props[key] = value;\n }\n }\n return props;\n }\n\n // Helper to build a split step entry for the code skeleton\n function buildSplitStepEntry(\n section: string,\n stepId: string,\n step: Record<string, unknown>,\n ): string {\n const codeVar = resolveCodeVar(\n step as { package?: string; code?: string | true },\n );\n const stepProps = getStepProps(step);\n const { codeProps, dataProps } = classifyStepProperties(stepProps);\n\n const codeEntries: string[] = [];\n codeEntries.push(`code: ${codeVar}`);\n\n // Code-layer props (serialized with processConfigValue)\n for (const [key, value] of Object.entries(codeProps)) {\n if (key === 'code') continue; // already handled above\n codeEntries.push(`${key}: ${processConfigValue(value)}`);\n }\n\n // Data-layer prop references\n for (const key of Object.keys(dataProps)) {\n codeEntries.push(`${key}: __data.${section}.${stepId}.${key}`);\n }\n\n // Accumulate data payload\n if (Object.keys(dataProps).length > 0) {\n if (!dataPayloadObj[section]) dataPayloadObj[section] = {};\n dataPayloadObj[section][stepId] = dataProps;\n }\n\n return ` ${stepId}: {\\n ${codeEntries.join(',\\n ')}\\n }`;\n }\n\n // Validate references (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 Object.entries(destinations).forEach(([name, dest]) => {\n if ((dest.code as unknown) !== true) {\n validateReference('Destination', name, dest);\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\n const sourcesEntries = Object.entries(sources)\n .filter(\n ([, source]) =>\n (source.code as unknown) !== true &&\n (source.package || hasCodeReference(source.code)),\n )\n .map(([key, source]) => {\n if (isInlineCode(source.code)) {\n return ` ${key}: ${generateInlineCode(source.code, (source.config as object) || {}, source.env as object, source.next as string | string[] | undefined, 'next')}`;\n }\n return buildSplitStepEntry(\n 'sources',\n key,\n source as Record<string, unknown>,\n );\n });\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations)\n .filter(\n ([, dest]) =>\n (dest.code as unknown) !== true &&\n (dest.package || hasCodeReference(dest.code)),\n )\n .map(([key, dest]) => {\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 return buildSplitStepEntry(\n 'destinations',\n key,\n dest as Record<string, unknown>,\n );\n });\n\n // Build transformers\n const transformersEntries = Object.entries(transformers)\n .filter(\n ([, transformer]) =>\n (transformer.code as unknown) !== true &&\n (transformer.package || hasCodeReference(transformer.code)),\n )\n .map(([key, transformer]) => {\n if (isInlineCode(transformer.code)) {\n return ` ${key}: ${generateInlineCode(transformer.code, (transformer.config as object) || {}, transformer.env as object, transformer.next, 'next')}`;\n }\n return buildSplitStepEntry(\n 'transformers',\n key,\n transformer as Record<string, unknown>,\n );\n });\n\n // Build stores\n Object.entries(stores).forEach(([name, store]) => {\n if (store.package || hasCodeReference(store.code)) {\n validateReference('Store', name, store);\n }\n });\n\n const storesEntries = Object.entries(stores)\n .filter(([, store]) => store.package || hasCodeReference(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 const codeVar = resolveCodeVar(store);\n const storeProps = getStepProps(store as Record<string, unknown>);\n const { codeProps, dataProps } = classifyStepProperties(storeProps);\n\n const codeEntries: string[] = [];\n codeEntries.push(`code: ${codeVar}`);\n\n for (const [propKey, value] of Object.entries(codeProps)) {\n if (propKey === 'code') continue;\n codeEntries.push(`${propKey}: ${processConfigValue(value)}`);\n }\n\n for (const propKey of Object.keys(dataProps)) {\n codeEntries.push(`${propKey}: __data.stores.${key}.${propKey}`);\n }\n\n if (Object.keys(dataProps).length > 0) {\n if (!dataPayloadObj['stores']) dataPayloadObj['stores'] = {};\n dataPayloadObj['stores'][key] = dataProps;\n }\n\n return ` ${key}: {\\n ${codeEntries.join(',\\n ')}\\n }`;\n });\n\n // Build stores declaration\n const storesDeclaration =\n storesEntries.length > 0\n ? `const stores = {\\n${storesEntries.join(',\\n')}\\n};`\n : 'const stores = {};';\n\n // Build collector\n let collectorStr = '';\n if (flowWithProps.collector) {\n if (containsCodeMarkers(flowWithProps.collector)) {\n // Collector has code markers — keep in code skeleton\n collectorStr = `,\\n ...${processConfigValue(flowWithProps.collector)}`;\n } else {\n // Plain collector — put in data payload\n dataPayloadObj['collector'] = flowWithProps.collector as Record<\n string,\n unknown\n >;\n collectorStr = `,\\n ...__data.collector`;\n }\n }\n\n // Build transformers section\n const transformersStr =\n transformersEntries.length > 0\n ? `,\\n transformers: {\\n${transformersEntries.join(',\\n')}\\n }`\n : '';\n\n const codeConfigObject = `{\n sources: {\n${sourcesEntries.join(',\\n')}\n },\n destinations: {\n${destinationsEntries.join(',\\n')}\n }${transformersStr},\n stores${collectorStr}\n}`;\n\n const dataPayload = JSON.stringify(dataPayloadObj, null, 2);\n\n return { storesDeclaration, codeConfigObject, dataPayload };\n}\n\n/**\n * Generate platform-agnostic ESM module with wireConfig(__data) and startFlow re-export.\n * This is the split variant — code skeleton receives data payload at runtime.\n */\nexport function generateSplitWireConfigModule(\n storesDeclaration: string,\n codeConfigObject: string,\n userCode: string,\n): string {\n const codeSection = userCode ? `\\n${userCode}\\n` : '';\n\n return `export function wireConfig(__data) {\n ${storesDeclaration}\n\n const config = ${codeConfigObject};${codeSection}\n\n return config;\n}\n\nexport { startFlow };`;\n}\n\n/**\n * Generate a stage 2 entry file for server bundles.\n * Imports startFlow and wireConfig from the stage 1 .mjs file,\n * embeds the data payload, and exports a factory function.\n */\nexport function generateServerEntry(\n stage1Path: string,\n dataPayload: string,\n): string {\n return `import { startFlow, wireConfig } from '${stage1Path}';\n\nconst __configData = ${dataPayload};\n\nexport default async function(context = {}) {\n const config = wireConfig(__configData);\n\n if (context.logger) config.logger = context.logger;\n\n if (context.sourceSettings && config.sources) {\n for (const src of Object.values(config.sources)) {\n if (src.config?.settings) {\n src.config.settings = { ...src.config.settings, ...context.sourceSettings };\n }\n }\n }\n\n const result = await startFlow(config);\n\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/**\n * Generate a stage 2 entry file for web/browser bundles.\n * Imports startFlow and wireConfig from the stage 1 .mjs file,\n * embeds the data payload, and wraps in an async IIFE with window assignments.\n */\nexport function generateWebEntry(\n stage1Path: string,\n dataPayload: string,\n options: { windowCollector?: string; windowElb?: string } = {},\n): string {\n const assignments: string[] = [];\n if (options.windowCollector) {\n assignments.push(\n ` if (typeof window !== 'undefined') window['${options.windowCollector}'] = collector;`,\n );\n }\n if (options.windowElb) {\n assignments.push(\n ` if (typeof window !== 'undefined') window['${options.windowElb}'] = elb;`,\n );\n }\n const assignmentCode =\n assignments.length > 0 ? '\\n' + assignments.join('\\n') : '';\n\n return `import { startFlow, wireConfig } from '${stage1Path}';\n\nconst __configData = ${dataPayload};\n\n(async () => {\n const { collector, elb } = await startFlow(wireConfig(__configData));${assignmentCode}\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 * 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 } from './auth.js';\nimport { resolveAppUrl } from '../lib/config-file.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: resolveAppUrl(),\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","/**\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 flowSettings,\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 flowSettings,\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(flowSettings);\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();\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();\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.Config) 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.Config 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.Config format\n const { flowSettings, 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 flowSettings,\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","import type { Flow } from '@walkeros/core';\nimport { resolvePackageImportPath } from '../../core/package-path.js';\n\ninterface 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 * @param packages - Flow config packages map for local path resolution\n * @param configDir - Directory of the flow config file\n * @returns Map of destination key to env object\n */\nexport async function loadDestinationEnvs(\n destinations: Record<string, unknown>,\n packages?: Flow.Packages,\n configDir?: string,\n): Promise<Record<string, DestinationEnv>> {\n const envs: Record<string, DestinationEnv> = {};\n const resolveDir = configDir || process.cwd();\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 using package resolver\n const packageName = typedConfig.package;\n const isDemoPackage = packageName.includes('-demo');\n const importPath = isDemoPackage\n ? resolvePackageImportPath(packageName, packages, resolveDir)\n : resolvePackageImportPath(packageName, packages, resolveDir, '/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 {\n existsSync,\n mkdirSync,\n copyFileSync,\n writeFileSync,\n readFileSync,\n} from 'fs';\nimport { join } from 'path';\n\ninterface CacheMeta {\n version: string;\n timestamp: number;\n}\n\nexport function writeCache(\n cacheDir: string,\n bundlePath: string,\n configContent: string,\n version: string,\n): void {\n mkdirSync(cacheDir, { recursive: true });\n copyFileSync(bundlePath, join(cacheDir, 'bundle.mjs'));\n writeFileSync(join(cacheDir, 'config.json'), configContent, 'utf-8');\n const meta: CacheMeta = { version, timestamp: Date.now() };\n writeFileSync(join(cacheDir, 'meta.json'), JSON.stringify(meta), 'utf-8');\n}\n\nexport function readCache(\n cacheDir: string,\n): { bundlePath: string; version: string } | null {\n try {\n const metaPath = join(cacheDir, 'meta.json');\n const bundlePath = join(cacheDir, 'bundle.mjs');\n if (!existsSync(metaPath) || !existsSync(bundlePath)) return null;\n const meta: CacheMeta = JSON.parse(readFileSync(metaPath, 'utf-8'));\n return { bundlePath, version: meta.version };\n } catch {\n return null;\n }\n}\n\nexport function readCacheConfig(cacheDir: string): string | null {\n try {\n const configPath = join(cacheDir, 'config.json');\n if (!existsSync(configPath)) return null;\n return readFileSync(configPath, 'utf-8');\n } catch {\n return null;\n }\n}\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 Object with bundlePath and cleanup function to remove temp directory\n */\nexport async function prepareBundleForRun(\n configPath: string,\n options: {\n verbose?: boolean;\n silent?: boolean;\n flowName?: string;\n },\n): Promise<{ bundlePath: string; cleanup: () => Promise<void> }> {\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 {\n bundlePath: tempPath,\n cleanup: async () => {\n await fs.remove(tempDir);\n },\n };\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","// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand } from './commands/bundle/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';\nexport { feedbackCommand } from './commands/feedback/index.js';\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle, bundleRemote } from './commands/bundle/index.js';\nexport {\n push,\n simulateSource,\n simulateTransformer,\n simulateDestination,\n} from './commands/push/index.js';\nexport type {\n SimulateSourceOptions,\n SimulateTransformerOptions,\n SimulateDestinationOptions,\n} from './commands/push/index.js';\nexport { run } from './commands/run/index.js';\nexport { validate } from './commands/validate/index.js';\nexport { getToken, getAuthHeaders, requireProjectId } from './core/auth.js';\nexport {\n apiFetch,\n publicFetch,\n deployFetch,\n mergeAuthHeaders,\n} from './core/http.js';\nexport { createApiClient } from './core/api-client.js';\nexport { ApiError, throwApiError } from './core/api-error.js';\nexport type { ApiErrorDetail } from './core/api-error.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 { feedback } from './commands/feedback/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 { FeedbackOptions } from './commands/feedback/index.js';\nexport { readConfig, writeConfig } from './lib/config-file.js';\nexport type { WalkerOSConfig } from './lib/config-file.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 { loadConfig, 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.Config and Flow.Settings 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 { 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","import path from 'path';\nimport fs from 'fs-extra';\nimport {\n createIngest,\n getPlatform,\n compileNext,\n resolveNext,\n isRouteArray,\n buildCacheContext,\n} from '@walkeros/core';\nimport {\n transformerInit,\n transformerPush,\n runTransformerChain,\n walkChain,\n extractTransformerNextMap,\n wrapEnv,\n} from '@walkeros/collector';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n detectInput,\n isStdinPiped,\n readStdinToTempFile,\n writeResult,\n type Platform,\n} from '../../core/index.js';\n\nimport type { Logger, WalkerOS } from '@walkeros/core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadFlowConfig, loadJsonFromSource } from '../../config/index.js';\nimport { loadConfig } from '../../config/utils.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport type { NetworkCall, PushCommandOptions, PushResult } from './types.js';\nimport type { PushOptions } from '../../schemas/push.js';\nimport { buildOverrides, type PushOverrides } from './overrides.js';\nimport { applyOverrides } from './apply-overrides.js';\nimport { resolvePackageImportPath } from '../../core/package-path.js';\nimport { withFlowContext } from './flow-context.js';\nimport { prepareFlow } from './prepare.js';\nimport { schemas } from '@walkeros/core/dev';\n\n/**\n * Resolve a before chain config to an ordered array of transformer IDs.\n * Handles both static (string/string[]) and conditional (Route[]) chains,\n * matching the pattern used by source.ts in the collector.\n */\nfunction resolveBeforeChain(\n before: unknown,\n transformers: import('@walkeros/core').Transformer.Transformers,\n ingest?: import('@walkeros/core').Ingest,\n event?: WalkerOS.DeepPartialEvent,\n): string[] {\n if (!before) return [];\n\n const next = before as import('@walkeros/core').Transformer.Next;\n\n if (isRouteArray(next)) {\n const compiled = compileNext(next);\n const resolved = resolveNext(compiled!, buildCacheContext(ingest, event));\n if (!resolved) return [];\n return walkChain(resolved, extractTransformerNextMap(transformers));\n }\n\n return walkChain(\n next as string | string[],\n extractTransformerNextMap(transformers),\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 mock?: string[];\n snapshot?: 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 // 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 // Load snapshot code if provided\n let snapshotCode: string | undefined;\n if (options.snapshot) {\n snapshotCode = (await loadConfig(options.snapshot, {\n json: false,\n })) as string;\n logger.debug(`Snapshot loaded (${snapshotCode.length} bytes)`);\n }\n\n if (detected.type === 'config') {\n result = await executeConfigPush(\n {\n config: inputPath,\n flow: options.flow,\n verbose: options.verbose,\n mock: options.mock,\n } as PushCommandOptions,\n event as Record<string, unknown>,\n logger,\n (dir) => {\n tempDir = dir;\n },\n snapshotCode,\n );\n } else {\n result = await executeBundlePush(\n detected.content,\n detected.platform,\n event as Record<string, unknown>,\n logger,\n (dir) => {\n tempDir = dir;\n },\n undefined,\n snapshotCode,\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 config = await readStdinToTempFile('push');\n } else {\n config = options.config || 'bundle.config.json';\n }\n\n // Resolve string event inputs\n let resolvedEvent: unknown = options.event;\n if (typeof options.event === 'string') {\n resolvedEvent = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n }\n\n // Route to typed function based on --simulate flag\n const simulateFlag = options.simulate?.[0];\n let result: PushResult;\n\n if (simulateFlag?.startsWith('source.')) {\n result = await simulateSource(config, resolvedEvent, {\n sourceId: simulateFlag.replace('source.', ''),\n flow: options.flow,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n });\n } else if (simulateFlag?.startsWith('transformer.')) {\n result = await simulateTransformer(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n transformerId: simulateFlag.replace('transformer.', ''),\n flow: options.flow,\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n },\n );\n } else if (simulateFlag?.startsWith('destination.')) {\n result = await simulateDestination(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n destinationId: simulateFlag.replace('destination.', ''),\n flow: options.flow,\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n },\n );\n } else {\n result = await push(config, resolvedEvent, {\n flow: options.flow,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n platform: options.platform as Platform | undefined,\n mock: options.mock,\n snapshot: options.snapshot,\n });\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 & {\n flow?: string;\n platform?: Platform;\n mock?: string[];\n snapshot?: string;\n } = {},\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 // Validate with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return {\n success: false,\n duration: 0,\n error: `Invalid event: ${parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join(', ')}`,\n };\n }\n\n return pushCore(configOrPath, event, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n silent: options.silent ?? false,\n flow: options.flow,\n platform: options.platform,\n mock: options.mock,\n snapshot: options.snapshot,\n });\n}\n\n/**\n * Execute push from config JSON (existing behavior)\n */\nasync function executeConfigPush(\n options: PushCommandOptions,\n validatedEvent: Record<string, unknown>,\n logger: Logger.Instance,\n setTempDir: (dir: string) => void,\n snapshotCode?: string,\n): Promise<PushResult> {\n // Load config\n logger.debug('Loading flow configuration');\n const { flowSettings, buildOptions } = await loadFlowConfig(options.config!, {\n flowName: options.flow,\n logger,\n });\n\n const platform = getPlatform(flowSettings);\n\n // Build overrides from --mock flags (simulate is handled upstream in push())\n const overrides = buildOverrides(\n { mock: options.mock },\n flowSettings,\n );\n\n // Auto-load destination /dev envs for simulated/mocked destinations\n if (overrides.destinations) {\n const { loadDestinationEnvs } = await import('./env-loader.js');\n const configDir = buildOptions.configDir || process.cwd();\n const envs = await loadDestinationEnvs(\n flowSettings.destinations ?? {},\n flowSettings.packages,\n configDir,\n );\n for (const [destId, env] of Object.entries(envs)) {\n if (overrides.destinations[destId] && env.push) {\n overrides.destinations[destId].env = env.push;\n if (env.simulation && env.simulation.length > 0) {\n overrides.destinations[destId].simulation = env.simulation;\n }\n }\n }\n }\n\n // Bundle to temp file\n logger.debug('Bundling flow configuration');\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(tempDir, 'bundle.mjs');\n\n const pushBuildOptions = {\n ...buildOptions,\n output: tempPath,\n format: 'esm' as const,\n platform: platform === 'web' ? ('browser' as const) : ('node' as const),\n skipWrapper: true, // CLI imports ESM directly — no platform wrapper\n };\n\n await bundleCore(flowSettings, pushBuildOptions, logger, false);\n\n logger.debug(`Bundle created: ${tempPath}`);\n\n logger.debug(\n `Executing in ${platform} environment (${platform === 'web' ? 'JSDOM' : 'Node.js'})`,\n );\n\n return executeDestinationPush(\n tempPath,\n validatedEvent as WalkerOS.DeepPartialEvent,\n logger,\n platform,\n overrides,\n snapshotCode,\n platform === 'server' ? 60000 : undefined,\n );\n}\n\n/**\n * Execute push from pre-built bundle\n */\nasync function executeBundlePush(\n bundleContent: string,\n platform: Platform,\n validatedEvent: Record<string, unknown>,\n logger: Logger.Instance,\n setTempDir: (dir: string) => void,\n overrides: PushOverrides = {},\n snapshotCode?: string,\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(tempDir, 'bundle.mjs');\n await fs.writeFile(tempPath, bundleContent, 'utf8');\n\n logger.debug(`Bundle written to: ${tempPath}`);\n\n // Execute destination push\n logger.debug(\n `Executing in ${platform} environment (${platform === 'web' ? 'JSDOM' : 'Node.js'})`,\n );\n return executeDestinationPush(\n tempPath,\n validatedEvent as WalkerOS.DeepPartialEvent,\n logger,\n platform,\n overrides,\n snapshotCode,\n platform === 'server' ? 60000 : undefined,\n );\n}\n\n/**\n * Execute non-simulated destination push (full pipeline).\n * Uses withFlowContext for environment setup and cleanup.\n */\nasync function executeDestinationPush(\n esmPath: string,\n event: WalkerOS.DeepPartialEvent,\n logger: Logger.Instance,\n platform: 'web' | 'server',\n overrides?: PushOverrides,\n snapshotCode?: string,\n timeout?: number,\n): Promise<PushResult> {\n const startTime = Date.now();\n const networkCalls: NetworkCall[] = [];\n\n return withFlowContext(\n { esmPath, platform, logger, snapshotCode, timeout, networkCalls, asyncDrain: { timeout: 5000 } },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, overrides || {});\n\n const result = await module.startFlow(config);\n if (!result?.collector?.push)\n throw new Error('Invalid bundle: collector missing push');\n\n const collector = result.collector;\n\n logger.info(`Pushing event: ${event.name}`);\n const elbResult = await collector.push(event);\n\n await collector.command('shutdown');\n\n return {\n success: true,\n elbResult: elbResult as PushResult['elbResult'],\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n}\n\nexport interface SimulateSourceOptions {\n sourceId: string;\n flow?: string;\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n}\n\n/**\n * Self-contained source simulation.\n *\n * Loads the flow config, bundles it, resolves the source package's /dev export\n * to get createTrigger, then invokes the trigger inside a flow context with a\n * prePush hook that captures events before they reach destinations.\n *\n * The `input` parameter is `unknown` — the CLI is agnostic to source-specific\n * content shapes. The source's createTrigger defines what it expects.\n */\nexport async function simulateSource(\n configPath: string,\n input: unknown,\n options: SimulateSourceOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n const prepared = await prepareFlow({\n configPath,\n flow: options.flow,\n simulate: ['source.' + options.sourceId],\n silent: options.silent,\n verbose: options.verbose,\n });\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n // Resolve source package and load createTrigger from /dev export\n const sourceConfig = (prepared.flowSettings.sources ?? {})[\n options.sourceId\n ] as { package?: string } | undefined;\n\n if (!sourceConfig?.package) {\n throw new Error(\n `Source \"${options.sourceId}\" has no package defined`,\n );\n }\n\n const devPath = resolvePackageImportPath(\n sourceConfig.package,\n prepared.flowSettings.packages,\n prepared.configDir,\n '/dev',\n );\n const devModule = await import(devPath);\n const createTrigger =\n devModule.examples?.createTrigger ||\n devModule.default?.examples?.createTrigger;\n\n if (!createTrigger) {\n throw new Error(\n `Source package \"${sourceConfig.package}\" has no createTrigger in /dev export`,\n );\n }\n\n // Load snapshot code if provided\n let snapshotCode: string | undefined;\n if (options.snapshot) {\n snapshotCode = (await loadConfig(options.snapshot, {\n json: false,\n })) as string;\n logger.debug(`Snapshot loaded (${snapshotCode.length} bytes)`);\n }\n\n const networkCalls: NetworkCall[] = [];\n\n return await withFlowContext(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, prepared.overrides);\n\n // Capture events at the collector.push boundary via prePush hook.\n // Hook is wired by startFlow (inside createTrigger) before events fire.\n const captured: Array<{ event: unknown; timestamp: number }> = [];\n\n config.hooks = {\n ...((config.hooks as Record<string, unknown>) || {}),\n prePush: ({ fn }: { fn: Function }, event: unknown) => {\n captured.push({ event, timestamp: Date.now() });\n return { ok: true }; // Stop propagation — don't call fn\n },\n };\n\n const instance = await createTrigger(config, { sourceId: options.sourceId });\n const { trigger } = instance;\n\n logger.info('Simulating source');\n\n // Extract content and trigger params from input — the CLI doesn't type\n // these, it just reads them as generic properties from the unknown input.\n const inputRecord = (input ?? {}) as Record<string, unknown>;\n const content = inputRecord.content ?? input;\n const triggerOpts = inputRecord.trigger as\n | { type?: string; options?: unknown }\n | undefined;\n await trigger(triggerOpts?.type, triggerOpts?.options)(content);\n\n if (instance.flow?.collector?.command) {\n await instance.flow.collector.command('shutdown');\n }\n\n return {\n success: true,\n ...(captured.length > 0 ? { captured } : {}),\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n await prepared.cleanup();\n }\n}\n\nexport interface SimulateTransformerOptions {\n transformerId: string;\n flow?: string;\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n}\n\n/**\n * Self-contained transformer simulation.\n *\n * Takes a DeepPartialEvent, validates it with Zod, loads the flow config,\n * bundles it, starts the flow to get initialized transformers, then runs\n * the event through the target transformer (with optional before chain).\n *\n * Captured array: first entry = input event, subsequent entries = output event(s).\n * If the transformer drops the event (returns false), output event is null.\n */\nexport async function simulateTransformer(\n configPath: string,\n event: WalkerOS.DeepPartialEvent,\n options: SimulateTransformerOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n // Validate event with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return {\n success: false,\n duration: 0,\n error: parsed.error.message,\n };\n }\n\n const prepared = await prepareFlow({\n configPath,\n flow: options.flow,\n simulate: ['transformer.' + options.transformerId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n });\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n // Load snapshot code if provided\n let snapshotCode: string | undefined;\n if (options.snapshot) {\n snapshotCode = (await loadConfig(options.snapshot, {\n json: false,\n })) as string;\n logger.debug(`Snapshot loaded (${snapshotCode.length} bytes)`);\n }\n\n const networkCalls: NetworkCall[] = [];\n\n return await withFlowContext(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, prepared.overrides);\n\n // Don't initialize sources or destinations during transformer simulation.\n if (config.sources) config.sources = {};\n if (config.destinations) config.destinations = {};\n\n const result = await module.startFlow(config);\n if (!result?.collector)\n throw new Error('Invalid bundle: collector not available');\n\n const collector = result.collector;\n const transformer =\n collector.transformers?.[options.transformerId];\n\n if (!transformer) {\n throw new Error(\n `Transformer \"${options.transformerId}\" not found in collector. ` +\n `Available: ${Object.keys(collector.transformers || {}).join(', ') || 'none'}`,\n );\n }\n\n const initialized = await transformerInit(\n collector,\n transformer,\n options.transformerId,\n );\n if (!initialized) {\n throw new Error(\n `Transformer \"${options.transformerId}\" failed to initialize`,\n );\n }\n\n const inputEvent = event;\n const ingest = createIngest(options.transformerId);\n const captured: Array<{ event: unknown; timestamp: number }> = [];\n\n captured.push({ event: { ...inputEvent }, timestamp: Date.now() });\n\n logger.info(`Simulating transformer: ${options.transformerId}`);\n\n // Run before chain if configured (mandatory preparation)\n let processedEvent: WalkerOS.DeepPartialEvent = inputEvent;\n const before = transformer.config.before;\n if (before && collector.transformers) {\n const beforeChainIds = resolveBeforeChain(\n before,\n collector.transformers,\n ingest,\n processedEvent,\n );\n if (beforeChainIds.length > 0) {\n const beforeResult = await runTransformerChain(\n collector,\n collector.transformers,\n beforeChainIds,\n processedEvent,\n ingest,\n undefined,\n `transformer.${options.transformerId}.before`,\n );\n if (beforeResult === null) {\n captured.push({ event: null, timestamp: Date.now() });\n await collector.command('shutdown');\n return {\n success: true,\n captured,\n duration: Date.now() - startTime,\n };\n }\n processedEvent = (\n Array.isArray(beforeResult) ? beforeResult[0] : beforeResult\n ) as WalkerOS.DeepPartialEvent;\n }\n }\n\n const pushResult = await transformerPush(\n collector,\n transformer,\n options.transformerId,\n processedEvent,\n ingest,\n );\n\n if (pushResult === false) {\n captured.push({ event: null, timestamp: Date.now() });\n } else if (Array.isArray(pushResult)) {\n for (const r of pushResult) {\n captured.push({\n event: r.event || processedEvent,\n timestamp: Date.now(),\n });\n }\n } else if (\n pushResult &&\n typeof pushResult === 'object' &&\n pushResult.event\n ) {\n captured.push({ event: pushResult.event, timestamp: Date.now() });\n } else {\n captured.push({ event: processedEvent, timestamp: Date.now() });\n }\n\n await collector.command('shutdown');\n\n return {\n success: true,\n captured,\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n await prepared.cleanup();\n }\n}\n\nexport interface SimulateDestinationOptions {\n destinationId: string;\n flow?: string;\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n}\n\n/**\n * Self-contained destination simulation.\n *\n * Takes a DeepPartialEvent, validates it with Zod, loads the flow config,\n * bundles it, starts the flow, then pushes via collector.push with an include\n * filter so only the target destination receives the event. This gives full\n * pipeline support — consent checks, event mapping, createEvent enrichment,\n * before chains — without manual wiring.\n */\nexport async function simulateDestination(\n configPath: string,\n event: WalkerOS.DeepPartialEvent,\n options: SimulateDestinationOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n // Validate event with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return {\n success: false,\n duration: 0,\n error: parsed.error.message,\n };\n }\n\n const prepared = await prepareFlow({\n configPath,\n flow: options.flow,\n simulate: ['destination.' + options.destinationId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n });\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n let snapshotCode: string | undefined;\n if (options.snapshot) {\n snapshotCode = (await loadConfig(options.snapshot, {\n json: false,\n })) as string;\n }\n\n const networkCalls: NetworkCall[] = [];\n\n return await withFlowContext(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, prepared.overrides);\n\n // Wrap env for call tracking if simulation paths exist\n const destOverride =\n prepared.overrides.destinations?.[options.destinationId];\n let trackedCalls: Array<{\n fn: string;\n args: unknown[];\n ts: number;\n }> = [];\n if (destOverride?.simulation?.length) {\n const destinations = config.destinations as Record<\n string,\n { config?: { env?: Record<string, unknown> } }\n >;\n const destConfig = destinations[options.destinationId]?.config;\n if (destConfig?.env) {\n const combined = {\n ...destConfig.env,\n simulation: destOverride.simulation,\n };\n const { wrappedEnv, calls } = wrapEnv(combined);\n destConfig.env = wrappedEnv;\n trackedCalls = calls;\n }\n }\n\n // Don't initialize sources — unnecessary overhead\n if (config.sources) config.sources = {};\n\n const result = await module.startFlow(config);\n if (!result?.collector)\n throw new Error('Invalid bundle: collector not available');\n\n const collector = result.collector;\n\n // Verify destination exists (check both active and pending)\n if (\n !collector.destinations[options.destinationId] &&\n !collector.pending.destinations[options.destinationId]\n ) {\n throw new Error(\n `Destination \"${options.destinationId}\" not found in collector. ` +\n `Available: ${Object.keys(collector.destinations || {}).join(', ') || 'none'}`,\n );\n }\n\n logger.info(`Simulating destination: ${options.destinationId}`);\n\n // Full pipeline: consent, mapping, enrichment, before chains\n // include filter ensures only the target destination receives the event\n const elbResult = await collector.push(event, {\n include: [options.destinationId],\n });\n\n await collector.command('shutdown');\n\n return {\n success: true,\n elbResult: elbResult as PushResult['elbResult'],\n ...(trackedCalls.length > 0\n ? { usage: { [options.destinationId]: trackedCalls } }\n : {}),\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n await prepared.cleanup();\n }\n}\n\n// Export types\nexport type { PushCommandOptions, PushResult };\n","import type { Flow } from '@walkeros/core';\n\n/**\n * Overrides structure for destination config properties.\n * Shape mirrors Collector.InitConfig.destinations but without requiring `code`.\n * Used with deepMerge at runtime to overlay mock/disabled flags.\n */\nexport interface PushOverrides {\n destinations?: Record<\n string,\n {\n config?: {\n mock?: unknown;\n disabled?: boolean;\n };\n simulate?: boolean;\n env?: Record<string, unknown>;\n simulation?: string[];\n }\n >;\n sources?: Record<\n string,\n {\n simulate?: boolean;\n }\n >;\n /** Path-specific transformer mocks: chainPath → { transformerId → mockValue } */\n transformerMocks?: Record<string, Record<string, unknown>>;\n transformers?: Record<\n string,\n {\n simulate?: boolean;\n }\n >;\n}\n\n/**\n * Build collector overrides from --simulate and --mock CLI flags.\n *\n * - `--simulate destination.NAME` sets simulate: true on NAME\n * - `--simulate source.NAME` marks source for simulation\n * - `--mock destination.NAME=VALUE` sets mock: JSON-parsed VALUE on NAME\n * - Any destination NOT targeted by simulate or mock gets disabled: true\n * - Returns empty object if no flags are provided\n *\n * @throws if same destination appears in both simulate and mock\n * @throws if step format is invalid (missing `source.` or `destination.` prefix)\n * @throws if --mock is used with a source step\n */\nexport function buildOverrides(\n flags: { simulate?: string[]; mock?: string[] },\n flowConfig: Flow.Settings,\n): PushOverrides {\n const simulateFlags = flags.simulate ?? [];\n const mockFlags = flags.mock ?? [];\n\n // No flags → no overrides\n if (simulateFlags.length === 0 && mockFlags.length === 0) {\n return {};\n }\n\n const simulateNames = new Set<string>();\n const sourceSimulateNames = new Set<string>();\n const mockNames = new Set<string>();\n const overrides: PushOverrides = {};\n\n // Parse --simulate flags\n for (const step of simulateFlags) {\n const { type, name } = parseStep(step);\n if (type === 'destination') {\n simulateNames.add(name);\n if (!overrides.destinations) overrides.destinations = {};\n overrides.destinations[name] = { simulate: true };\n } else if (type === 'transformer') {\n if (!overrides.transformers) overrides.transformers = {};\n overrides.transformers[name] = { simulate: true };\n } else {\n sourceSimulateNames.add(name);\n if (!overrides.sources) overrides.sources = {};\n overrides.sources[name] = { simulate: true };\n }\n }\n\n // Validate: only one step type can be simulated at a time\n const hasSource = sourceSimulateNames.size > 0;\n const hasTransformer =\n overrides.transformers && Object.keys(overrides.transformers).length > 0;\n const hasDestination = simulateNames.size > 0;\n const simulatedTypes = [\n hasSource && 'source',\n hasTransformer && 'transformer',\n hasDestination && 'destination',\n ].filter(Boolean);\n\n if (simulatedTypes.length > 1) {\n throw new Error(\n `Cannot simulate both ${simulatedTypes.join(' and ')} in the same invocation. ` +\n 'Run separate commands for each step type.',\n );\n }\n\n // Parse --mock flags\n for (const step of mockFlags) {\n const eqIndex = step.indexOf('=');\n if (eqIndex === -1) {\n throw new Error(\n `Invalid --mock format: \"${step}\". Expected destination.NAME=VALUE`,\n );\n }\n\n const stepPart = step.slice(0, eqIndex);\n const valuePart = step.slice(eqIndex + 1);\n const parsed = parseStep(stepPart);\n\n if (parsed.type === 'source') {\n throw new Error(\n `--mock is not supported for sources. Use --simulate source.${parsed.name}`,\n );\n }\n\n if (parsed.type === 'transformer' && !parsed.chainType) {\n throw new Error(\n `Use --mock destination.NAME.before.${parsed.name}=VALUE for path-specific transformer mocks`,\n );\n }\n\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(valuePart);\n } catch {\n // If not valid JSON, use as raw string\n parsedValue = valuePart;\n }\n\n if (parsed.chainType && parsed.transformerId) {\n // Path-specific mock: destination.ga4.before.redact\n const chainPath = `destination.${parsed.name}.${parsed.chainType}`;\n if (!overrides.transformerMocks) overrides.transformerMocks = {};\n if (!overrides.transformerMocks[chainPath])\n overrides.transformerMocks[chainPath] = {};\n overrides.transformerMocks[chainPath][parsed.transformerId] = parsedValue;\n } else {\n // Simple destination mock (existing behavior)\n // Validate: same destination cannot be in both simulate and mock\n if (simulateNames.has(parsed.name)) {\n throw new Error(\n `Destination \"${parsed.name}\" cannot be in both --simulate and --mock`,\n );\n }\n\n mockNames.add(parsed.name);\n\n if (!overrides.destinations) overrides.destinations = {};\n overrides.destinations[parsed.name] = { config: { mock: parsedValue } };\n }\n }\n\n // Simulate-implies-disabled: disable all other destinations\n const allDestinations = Object.keys(flowConfig.destinations ?? {});\n const targetedNames = new Set([...simulateNames, ...mockNames]);\n\n if (targetedNames.size > 0) {\n if (!overrides.destinations) overrides.destinations = {};\n for (const destName of allDestinations) {\n if (!targetedNames.has(destName)) {\n overrides.destinations[destName] = { config: { disabled: true } };\n }\n }\n }\n\n return overrides;\n}\n\ninterface ParsedStep {\n type: 'source' | 'destination' | 'transformer';\n name: string;\n chainType?: 'before' | 'next';\n transformerId?: string;\n}\n\n/**\n * Parse a step string in `source.NAME` or `destination.NAME` format.\n * Also supports 4-part path notation: `destination.NAME.CHAIN.TRANSFORMER`\n * @throws if format is invalid\n */\nfunction parseStep(step: string): ParsedStep {\n const parts = step.split('.');\n\n if (parts.length < 2) {\n throw new Error(\n `Invalid step format: \"${step}\". Expected \"source.NAME\" or \"destination.NAME\"`,\n );\n }\n\n const prefix = parts[0];\n if (\n prefix !== 'source' &&\n prefix !== 'destination' &&\n prefix !== 'transformer'\n ) {\n throw new Error(\n `Unsupported step type: \"${prefix}\". Use \"source\", \"destination\", or \"transformer\"`,\n );\n }\n\n const name = parts[1];\n if (!name) {\n throw new Error(\n `Invalid step format: \"${step}\". Missing name after \"${prefix}.\"`,\n );\n }\n\n // Path-specific: destination.ga4.before.redact\n if (parts.length >= 4) {\n const chainType = parts[2];\n if (chainType !== 'before' && chainType !== 'next') {\n throw new Error(\n `Invalid chain type: \"${chainType}\". Use \"before\" or \"next\"`,\n );\n }\n const transformerId = parts[3];\n if (!transformerId) {\n throw new Error(\n `Invalid step format: \"${step}\". Missing transformer name after \"${chainType}.\"`,\n );\n }\n return { type: prefix, name, chainType, transformerId };\n }\n\n // 3-part (destination.ga4.before without transformer) — invalid\n if (parts.length === 3) {\n throw new Error(\n `Invalid step format: \"${step}\". Specify a transformer: \"${step}.TRANSFORMER_NAME\"`,\n );\n }\n\n return { type: prefix, name };\n}\n","import type { PushOverrides } from './overrides.js';\n\n/**\n * Apply push overrides (disabled/mock/env) to a collector config object.\n * Mutates config.destinations and config.transformers in place.\n */\nexport function applyOverrides(\n config: Record<string, unknown>,\n overrides: PushOverrides,\n): void {\n // Destination overrides: disabled, mock, env\n if (overrides.destinations) {\n const destinations = config.destinations as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (destinations) {\n for (const [id, override] of Object.entries(overrides.destinations)) {\n const dest = destinations[id];\n if (!dest) continue;\n if (!dest.config) dest.config = {};\n const destConfig = dest.config as Record<string, unknown>;\n if (override.config?.disabled) destConfig.disabled = true;\n if (override.config?.mock !== undefined)\n destConfig.mock = override.config.mock;\n if (override.env) {\n destConfig.env = override.env;\n }\n }\n }\n }\n\n // Transformer path-specific mocks\n if (overrides.transformerMocks) {\n const transformers = config.transformers as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (transformers) {\n for (const [chainPath, mocks] of Object.entries(\n overrides.transformerMocks,\n )) {\n for (const [transformerId, mockValue] of Object.entries(mocks)) {\n const transformer = transformers[transformerId];\n if (!transformer) continue;\n if (!transformer.config) transformer.config = {};\n const tConfig = transformer.config as Record<string, unknown>;\n if (!tConfig.chainMocks) tConfig.chainMocks = {};\n (tConfig.chainMocks as Record<string, unknown>)[chainPath] =\n mockValue;\n }\n }\n }\n }\n}\n","import path from 'path';\nimport { pathToFileURL } from 'url';\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport type { Logger } from '@walkeros/core';\nimport type { NetworkCall, PushResult } from './types.js';\nimport { getErrorMessage } from '../../core/utils.js';\nimport { installTimerInterception, type TimerControl } from './async-drain.js';\n\nexport interface FlowContextOptions {\n esmPath: string;\n platform: 'web' | 'server';\n logger: Logger.Instance;\n snapshotCode?: string;\n timeout?: number;\n /** When provided, fetch/sendBeacon are polyfilled and calls recorded here */\n networkCalls?: NetworkCall[];\n /** Enable timer interception + async drain after callback completes */\n asyncDrain?: { timeout?: number };\n}\n\n/**\n * Loosely typed module shape from a dynamically imported ESM bundle.\n * The bundle has no compile-time types, so we use permissive signatures\n * and let the callbacks do runtime validation (e.g., \"collector missing push\").\n */\nexport interface FlowModule {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wireConfig: (data?: unknown) => any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n startFlow: (config: unknown) => Promise<any>;\n __configData?: unknown;\n}\n\n/**\n * Set up execution environment (JSDOM for web, snapshot eval),\n * import the ESM bundle, validate wireConfig/startFlow, then\n * call the provided function with the loaded module.\n *\n * Handles: JSDOM global injection, Node 22 navigator compat,\n * snapshot eval, ESM import with cache bust, error wrapping,\n * global cleanup in finally.\n */\nexport async function withFlowContext(\n options: FlowContextOptions,\n fn: (module: FlowModule) => Promise<PushResult>,\n): Promise<PushResult> {\n const { esmPath, platform, logger, snapshotCode, timeout, networkCalls, asyncDrain } =\n options;\n const startTime = Date.now();\n const g = global as unknown as Record<string, unknown>;\n let savedWindow: unknown, savedDocument: unknown, savedNavigator: unknown;\n let savedFetch: typeof fetch | undefined;\n let dom: JSDOM | undefined;\n let timerControl: TimerControl | undefined;\n\n // JSDOM setup for web platform\n if (platform === 'web') {\n const virtualConsole = new VirtualConsole();\n dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously',\n resources: 'usable',\n virtualConsole,\n });\n savedWindow = g.window;\n savedDocument = g.document;\n savedNavigator = g.navigator;\n g.window = dom.window;\n g.document = dom.window.document;\n Object.defineProperty(global, 'navigator', {\n value: dom.window.navigator,\n configurable: true,\n writable: true,\n });\n\n // Apply network polyfills when capture array is provided\n if (networkCalls) {\n savedFetch = global.fetch;\n applyNetworkPolyfills(dom, networkCalls);\n global.fetch = dom.window.fetch as typeof fetch;\n }\n }\n\n // Install timer interception AFTER JSDOM setup, BEFORE ESM import\n // so the bundle's top-level setTimeout references are captured\n if (asyncDrain) {\n timerControl = installTimerInterception({\n domWindow: platform === 'web' && dom\n ? (dom.window as unknown as Window & typeof globalThis)\n : undefined,\n });\n }\n\n try {\n // Eval snapshot before importing bundle\n if (snapshotCode) {\n if (platform === 'web' && dom) {\n logger.debug('Evaluating snapshot in JSDOM');\n dom.window.eval(snapshotCode);\n } else {\n logger.debug('Evaluating snapshot in Node');\n const vm = await import('vm');\n vm.runInThisContext(snapshotCode);\n }\n }\n\n // Import ESM bundle with cache bust\n const fileUrl = pathToFileURL(path.resolve(esmPath)).href;\n const module = await import(`${fileUrl}?t=${Date.now()}`);\n const { wireConfig, startFlow } = module;\n\n if (typeof wireConfig !== 'function' || typeof startFlow !== 'function') {\n throw new Error(\n 'Invalid ESM bundle: missing wireConfig or startFlow exports',\n );\n }\n\n const flowModule: FlowModule = {\n wireConfig,\n startFlow,\n __configData: module.__configData,\n };\n\n // Execute step-specific logic\n if (timerControl) {\n // asyncDrain mode: no outer timeout (flush has its own wall-clock safety)\n const result = await fn(flowModule);\n await timerControl.flush(asyncDrain?.timeout ?? 5000);\n return result;\n } else if (timeout) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Push timeout after ${timeout}ms`)),\n timeout,\n );\n });\n return await Promise.race([fn(flowModule), timeoutPromise]);\n }\n\n return await fn(flowModule);\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n if (timerControl) timerControl.restore();\n if (savedFetch !== undefined) {\n cleanupNetworkPolyfills(savedFetch);\n }\n if (platform === 'web') {\n if (savedWindow !== undefined) g.window = savedWindow;\n else delete g.window;\n if (savedDocument !== undefined) g.document = savedDocument;\n else delete g.document;\n if (savedNavigator !== undefined) {\n Object.defineProperty(global, 'navigator', {\n value: savedNavigator,\n configurable: true,\n writable: true,\n });\n } else {\n delete g.navigator;\n }\n }\n }\n}\n\n/**\n * Install no-op fetch and sendBeacon polyfills on the JSDOM window.\n * Both record calls to the provided capture array.\n * Also overrides global.fetch so ESM bundle code (which resolves fetch\n * from Node's global scope, not window) gets the polyfill too.\n */\nexport function applyNetworkPolyfills(\n dom: JSDOM,\n networkCalls: NetworkCall[],\n): void {\n // Polyfill fetch on the JSDOM window\n dom.window.fetch = (async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const url = typeof input === 'string' ? input : input.toString();\n const method = init?.method || 'GET';\n const body =\n init?.body !== undefined && init?.body !== null\n ? String(init.body)\n : null;\n\n // Extract headers\n const headers: Record<string, string> = {};\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((v, k) => {\n headers[k] = v;\n });\n } else if (typeof init.headers === 'object') {\n Object.entries(init.headers as Record<string, string>).forEach(\n ([k, v]) => {\n headers[k] = v;\n },\n );\n }\n }\n\n networkCalls.push({\n type: 'fetch',\n url,\n method,\n body,\n headers,\n timestamp: Date.now(),\n });\n\n return new Response('', { status: 200, statusText: 'OK' });\n }) as typeof fetch;\n\n // Polyfill sendBeacon on navigator\n dom.window.navigator.sendBeacon = (\n url: string,\n data?: BodyInit | null,\n ): boolean => {\n const body = data !== undefined && data !== null ? String(data) : null;\n networkCalls.push({ type: 'beacon', url, body, timestamp: Date.now() });\n return true;\n };\n}\n\n/**\n * Restore global.fetch to its original value.\n */\nexport function cleanupNetworkPolyfills(savedFetch: typeof fetch): void {\n global.fetch = savedFetch;\n}\n","/**\n * Lightweight timer interception and async drain for CLI simulation.\n *\n * Replaces setTimeout/setInterval on globalThis and an optional JSDOM window\n * with tracked versions that hold callbacks. flush() executes held callbacks\n * and drains microtasks until quiescent.\n */\n\ninterface PendingTimer {\n id: number;\n callback: (...args: unknown[]) => void;\n delay: number;\n type: 'timeout' | 'interval';\n args: unknown[];\n cleared: boolean;\n}\n\nexport interface TimerControl {\n /** Execute all pending timer callbacks and drain microtasks until quiescent */\n flush(wallTimeout?: number): Promise<void>;\n /** Number of pending (un-cleared) timers */\n countPending(): number;\n /** Restore original timer functions */\n restore(): void;\n}\n\nexport interface TimerInterceptionOptions {\n /** JSDOM window — patch its timers too (shared pending map) */\n domWindow?: Window & typeof globalThis;\n}\n\ninterface SavedTimers {\n target: Record<string, unknown>;\n setTimeout: unknown;\n clearTimeout: unknown;\n setInterval: unknown;\n clearInterval: unknown;\n}\n\nexport function installTimerInterception(\n options: TimerInterceptionOptions = {},\n): TimerControl {\n let nextId = 1;\n const pending = new Map<number, PendingTimer>();\n\n // Save real timers for microtask drain and restore\n const realSetTimeout = globalThis.setTimeout.bind(globalThis);\n const targets: SavedTimers[] = [];\n\n function patchTarget(target: Record<string, unknown>): void {\n targets.push({\n target,\n setTimeout: target.setTimeout,\n clearTimeout: target.clearTimeout,\n setInterval: target.setInterval,\n clearInterval: target.clearInterval,\n });\n\n target.setTimeout = (\n callback: (...args: unknown[]) => void,\n delay?: number,\n ...args: unknown[]\n ): number => {\n if (typeof callback !== 'function') return 0;\n const id = nextId++;\n pending.set(id, { id, callback, delay: delay ?? 0, type: 'timeout', args, cleared: false });\n return id;\n };\n\n target.clearTimeout = (id?: unknown): void => {\n if (id == null) return;\n const numId = typeof id === 'number' ? id : Number(id);\n const entry = pending.get(numId);\n if (entry) entry.cleared = true;\n };\n\n target.setInterval = (\n callback: (...args: unknown[]) => void,\n delay?: number,\n ...args: unknown[]\n ): number => {\n if (typeof callback !== 'function') return 0;\n const id = nextId++;\n pending.set(id, { id, callback, delay: delay ?? 0, type: 'interval', args, cleared: false });\n return id;\n };\n\n target.clearInterval = target.clearTimeout;\n }\n\n // Patch globalThis (bare setTimeout in ESM bundles)\n patchTarget(globalThis as unknown as Record<string, unknown>);\n\n // Patch JSDOM window if provided and distinct\n if (options.domWindow && (options.domWindow as unknown) !== globalThis) {\n patchTarget(options.domWindow as unknown as Record<string, unknown>);\n }\n\n // Yield to real event loop — drains ALL pending microtasks\n const drainMicrotasks = () =>\n new Promise<void>((resolve) => realSetTimeout(resolve, 0));\n\n async function flush(wallTimeout = 5000): Promise<void> {\n const deadline = Date.now() + wallTimeout;\n const maxIterations = 100;\n let iterations = 0;\n\n while (iterations < maxIterations) {\n // 1. Drain microtasks (detached Promises that may create timers)\n await drainMicrotasks();\n\n // 2. Collect non-cleared timers sorted by delay\n const ready = Array.from(pending.values())\n .filter((t) => !t.cleared)\n .sort((a, b) => a.delay - b.delay);\n\n if (ready.length === 0) break;\n\n // 3. Execute each timer\n for (const timer of ready) {\n if (timer.cleared) continue; // May have been cleared by a prior callback\n\n pending.delete(timer.id);\n\n if (timer.type === 'interval') {\n timer.cleared = true;\n // Re-register for next iteration\n const newId = nextId++;\n pending.set(newId, { ...timer, id: newId, cleared: false });\n }\n\n try {\n timer.callback(...timer.args);\n } catch (err) {\n // Log but continue — one failure should not break the drain\n console.warn('[async-drain] Timer callback error:', err);\n }\n }\n\n // 4. Drain microtasks spawned by timer callbacks\n await drainMicrotasks();\n\n // 5. Wall-clock safety\n if (Date.now() > deadline) {\n break;\n }\n\n iterations++;\n }\n\n // Clean up remaining entries (interval leftovers, etc.)\n pending.clear();\n }\n\n function countPending(): number {\n return Array.from(pending.values()).filter((t) => !t.cleared).length;\n }\n\n function restore(): void {\n for (const saved of targets) {\n saved.target.setTimeout = saved.setTimeout;\n saved.target.clearTimeout = saved.clearTimeout;\n saved.target.setInterval = saved.setInterval;\n saved.target.clearInterval = saved.clearInterval;\n }\n pending.clear();\n }\n\n return { flush, countPending, restore };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { getPlatform, type Flow, type Logger } from '@walkeros/core';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadFlowConfig } from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport { buildOverrides, type PushOverrides } from './overrides.js';\n\nexport interface PrepareOptions {\n configPath: string;\n flow?: string;\n simulate?: string[];\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n}\n\nexport interface PreparedFlow {\n bundlePath: string;\n platform: 'web' | 'server';\n overrides: PushOverrides;\n flowSettings: Flow.Settings;\n configDir: string;\n cleanup: () => Promise<void>;\n}\n\n/**\n * Shared preparation step: load config, build overrides, bundle to temp ESM.\n *\n * Shared by simulateSource, simulateTransformer, and simulateDestination\n * so each simulation function starts from the same prepared state.\n */\nexport async function prepareFlow(\n options: PrepareOptions,\n): Promise<PreparedFlow> {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n // Load config\n logger.debug('Loading flow configuration');\n const { flowSettings, buildOptions } = await loadFlowConfig(\n options.configPath,\n {\n flowName: options.flow,\n logger,\n },\n );\n\n const platform = getPlatform(flowSettings);\n const configDir = buildOptions.configDir || process.cwd();\n\n // Build overrides from --simulate/--mock flags\n const overrides = buildOverrides(\n { simulate: options.simulate, mock: options.mock },\n flowSettings,\n );\n\n // Auto-load destination /dev envs for simulated/mocked destinations\n if (overrides.destinations) {\n const { loadDestinationEnvs } = await import('./env-loader.js');\n const envs = await loadDestinationEnvs(\n flowSettings.destinations ?? {},\n flowSettings.packages,\n configDir,\n );\n for (const [destId, env] of Object.entries(envs)) {\n if (overrides.destinations[destId] && env.push) {\n overrides.destinations[destId].env = env.push;\n if (env.simulation && env.simulation.length > 0) {\n overrides.destinations[destId].simulation = env.simulation;\n }\n }\n }\n }\n\n // Bundle to temp file\n logger.debug('Bundling flow configuration');\n const tempDir = getTmpPath(\n undefined,\n `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n await fs.ensureDir(tempDir);\n const bundlePath = path.join(tempDir, 'bundle.mjs');\n\n const pushBuildOptions = {\n ...buildOptions,\n output: bundlePath,\n format: 'esm' as const,\n platform: platform === 'web' ? ('browser' as const) : ('node' as const),\n skipWrapper: true, // CLI imports ESM directly -- no platform wrapper\n };\n\n await bundleCore(flowSettings, pushBuildOptions, logger, false);\n\n logger.debug(`Bundle created: ${bundlePath}`);\n\n return {\n bundlePath,\n platform,\n overrides,\n flowSettings,\n configDir,\n cleanup: async () => {\n await fs.remove(tempDir).catch(() => {});\n },\n };\n}\n","/**\n * Run Command\n *\n * Unified entry point for running walkerOS flows.\n * Used by both `walkeros run` (CLI) and Docker containers.\n */\n\nimport path from 'path';\nimport { writeFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { createTimer, getErrorMessage } from '../../core/index.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { resolveAppUrl } from '../../lib/config-file.js';\nimport { resolveRunToken } from '../../core/auth.js';\nimport { resolveBundle } from '../../runtime/resolve-bundle.js';\nimport { fetchConfig } from '../../runtime/config-fetcher.js';\nimport { readCache } from '../../runtime/cache.js';\nimport { validateFlowFile, validatePort } from './validators.js';\nimport { isPreBuiltConfig } from './utils.js';\nimport { runPipeline, type PipelineOptions } from './pipeline.js';\nimport type { RunCommandOptions, RunOptions, RunResult } from './types.js';\n\n/** Default cache dir following XDG conventions */\nfunction defaultCacheDir(): string {\n const xdgCache = process.env.XDG_CACHE_HOME;\n const base = xdgCache || join(homedir(), '.cache');\n return join(base, 'walkeros');\n}\n\n/** Lazy-load bundler to avoid pulling it in for pre-built flows */\nasync function lazyPrepareBundleForRun(\n configPath: string,\n options: { verbose?: boolean; silent?: boolean; flowName?: string },\n): Promise<{ bundlePath: string; cleanup: () => Promise<void> }> {\n const { prepareBundleForRun } = await import('./utils.js');\n return prepareBundleForRun(configPath, options);\n}\n\n/**\n * CLI command function for `walkeros run`\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 // Resolve port\n const port = options.port ?? 8080;\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Resolve API config\n const flowId = options.flowId;\n const projectId = options.project;\n const token = resolveRunToken();\n const appUrl = resolveAppUrl();\n const flowName = options.flow;\n\n let apiConfig: PipelineOptions['api'] | undefined;\n\n if (flowId) {\n if (!token) {\n logger.error(\n `Remote flow requires authentication.\\n\\n` +\n ` No token found. Authenticate first:\\n` +\n ` $ walkeros auth login\\n\\n` +\n ` Or set WALKEROS_TOKEN:\\n` +\n ` $ export WALKEROS_TOKEN=<your-token>`,\n );\n process.exit(1);\n }\n if (!projectId) {\n logger.error(\n `--flow-id requires --project or WALKEROS_PROJECT_ID.\\n\\n` +\n ` Set the project:\\n` +\n ` $ walkeros run --flow-id ${flowId} --project <your-project-id>\\n` +\n ` $ export WALKEROS_PROJECT_ID=<your-project-id>`,\n );\n process.exit(1);\n }\n\n apiConfig = {\n appUrl,\n token,\n projectId,\n flowId,\n deploymentId: options.deploymentId,\n heartbeatIntervalMs:\n parseInt(\n process.env.WALKEROS_HEARTBEAT_INTERVAL ??\n process.env.HEARTBEAT_INTERVAL ??\n '60',\n 10,\n ) * 1000,\n pollIntervalMs:\n parseInt(\n process.env.WALKEROS_POLL_INTERVAL ??\n process.env.POLL_INTERVAL ??\n '30',\n 10,\n ) * 1000,\n cacheDir:\n process.env.WALKEROS_CACHE_DIR ??\n process.env.CACHE_DIR ??\n defaultCacheDir(),\n flowName,\n prepareBundleForRun: lazyPrepareBundleForRun,\n };\n }\n\n // Resolve bundle path\n const bundlePath = await resolveBundlePath(\n options.config,\n apiConfig,\n logger,\n );\n\n // Run pipeline\n logger.info('Starting flow...');\n await runPipeline({\n bundlePath,\n port,\n logger: logger.scope('runner'),\n loggerConfig: options.verbose ? { level: 0 } : undefined,\n api: apiConfig,\n });\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 * Resolve the bundle path from local file, remote API, or cache.\n *\n * Priority:\n * 1. Local file (provided via CLI arg or BUNDLE env)\n * 2. Remote config fetch (when apiConfig is provided and no local file)\n * 3. Cached bundle (fallback when remote fetch fails)\n */\nasync function resolveBundlePath(\n configInput: string | undefined,\n apiConfig: PipelineOptions['api'] | undefined,\n logger: ReturnType<typeof createCLILogger>,\n): Promise<string> {\n // Case 1: Local file or URL bundle\n if (configInput) {\n const resolved = await resolveBundle(configInput);\n\n if (resolved.source === 'stdin') {\n logger.info('Bundle: received via stdin');\n } else if (resolved.source === 'url') {\n logger.info('Bundle: fetched from URL');\n } else {\n logger.info(`Bundle: ${resolved.path}`);\n }\n\n if (isPreBuiltConfig(resolved.path)) {\n return path.resolve(resolved.path);\n }\n\n // JSON config — needs bundling\n const flowFile = validateFlowFile(resolved.path);\n logger.debug('Building flow bundle');\n const result = await lazyPrepareBundleForRun(flowFile, {\n verbose: false,\n silent: true,\n flowName: apiConfig?.flowName,\n });\n return result.bundlePath;\n }\n\n // Case 2: Remote config fetch (no local file, but API config with flowId)\n if (apiConfig) {\n logger.info('Fetching config from API...');\n try {\n const result = await fetchConfig({\n appUrl: apiConfig.appUrl,\n token: apiConfig.token,\n projectId: apiConfig.projectId,\n flowId: apiConfig.flowId,\n });\n\n if (result.changed) {\n const tmpConfigPath = getTmpPath(\n undefined,\n `walkeros-flow-${Date.now()}.json`,\n );\n writeFileSync(\n tmpConfigPath,\n JSON.stringify(result.content, null, 2),\n 'utf-8',\n );\n logger.info(`Config version: ${result.version}`);\n\n logger.info('Building flow...');\n const bundleResult = await lazyPrepareBundleForRun(tmpConfigPath, {\n verbose: false,\n silent: true,\n flowName: apiConfig.flowName,\n });\n\n // Cache the working bundle\n try {\n const { writeCache } = await import('../../runtime/cache.js');\n writeCache(\n apiConfig.cacheDir,\n bundleResult.bundlePath,\n JSON.stringify(result.content),\n result.version,\n );\n } catch {\n logger.debug('Cache write failed (non-critical)');\n }\n\n return bundleResult.bundlePath;\n }\n } catch (error) {\n logger.error(\n `API fetch failed: ${error instanceof Error ? error.message : error}`,\n );\n\n // Fallback to cache\n const cached = readCache(apiConfig.cacheDir);\n if (cached) {\n logger.info(`Using cached bundle (version: ${cached.version})`);\n return cached.bundlePath;\n }\n\n throw new Error(\n 'No config available. API fetch failed and no cached bundle.',\n );\n }\n }\n\n // Case 3: Default — look for server-collect.mjs\n const defaultFile = 'server-collect.mjs';\n logger.debug(`No config specified, using default: ${defaultFile}`);\n return path.resolve(defaultFile);\n}\n\n/**\n * Programmatic run function\n */\nexport async function run(options: RunOptions): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\n await runCommand({\n config: options.config,\n port: options.port,\n flow: options.flow,\n flowId: options.flowId,\n project: options.project,\n verbose: options.verbose,\n silent: options.silent ?? true,\n });\n\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\nexport type { RunCommandOptions, RunOptions, RunResult };\n","/**\n * Resolve bundle input to a local file path\n *\n * Priority order:\n * 1. File path (exists) - BUNDLE points to an existing local file\n * 2. URL - BUNDLE is an http(s) URL → fetch and write to writePath\n * 3. Stdin - data piped into the process\n * 4. File path (fallback) - BUNDLE path that doesn't exist yet\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { isStdinPiped, readStdin } from '../core/stdin.js';\n\n/**\n * Determine where to write fetched/stdin bundles.\n * In Docker: /app/flow/ exists → write there (module resolution works naturally).\n * Local dev: falls back to /tmp/.\n */\nfunction getDefaultWritePath(): string {\n if (existsSync('/app/flow')) return '/app/flow/bundle.mjs';\n return '/tmp/walkeros-bundle.mjs';\n}\n\nexport type BundleSource = 'stdin' | 'url' | 'file';\n\nexport interface ResolvedBundle {\n /** Absolute file path to the bundle (ready for import()) */\n path: string;\n /** How the bundle was provided */\n source: BundleSource;\n}\n\n/**\n * Detect whether a string is an HTTP(S) URL\n */\nfunction isUrl(value: string): boolean {\n return value.startsWith('http://') || value.startsWith('https://');\n}\n\n/**\n * Write bundle content to disk, ensuring parent directory exists.\n */\nfunction writeBundleToDisk(writePath: string, content: string): void {\n const dir = dirname(writePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(writePath, content, 'utf-8');\n}\n\n/**\n * Fetch bundle from URL and write to disk.\n * Uses a 30s timeout to prevent silent container hangs on unresponsive URLs.\n */\nasync function fetchBundle(url: string, writePath: string): Promise<string> {\n const response = await fetch(url, { signal: AbortSignal.timeout(30_000) });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch bundle from ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n throw new Error(`Bundle fetched from ${url} is empty`);\n }\n\n writeBundleToDisk(writePath, content);\n return writePath;\n}\n\n/**\n * Read bundle from stdin and write to disk\n */\nasync function readBundleFromStdin(writePath: string): Promise<string> {\n const content = await readStdin(); // throws if empty\n writeBundleToDisk(writePath, content);\n return writePath;\n}\n\n/**\n * Resolve the bundle to a local file path\n *\n * @param bundleEnv - Value of the BUNDLE env var (path or URL)\n * @returns Resolved bundle with file path and source type\n */\nexport async function resolveBundle(\n bundleEnv: string,\n): Promise<ResolvedBundle> {\n const writePath = getDefaultWritePath();\n // 1. If BUNDLE points to an existing file, use it directly\n // This prevents false stdin detection in Docker detached mode\n if (!isUrl(bundleEnv) && existsSync(bundleEnv)) {\n return { path: bundleEnv, source: 'file' };\n }\n\n // 2. URL — check before stdin to avoid false stdin detection in containers\n // (process.stdin.isTTY is undefined in non-interactive shells/Docker)\n if (isUrl(bundleEnv)) {\n const path = await fetchBundle(bundleEnv, writePath);\n return { path, source: 'url' };\n }\n\n // 3. Stdin pipe (only when BUNDLE is not a file or URL)\n if (isStdinPiped()) {\n const path = await readBundleFromStdin(writePath);\n return { path, source: 'stdin' };\n }\n\n // 4. File path (fallback — file may not exist yet for config paths)\n return { path: bundleEnv, source: 'file' };\n}\n","import { mergeAuthHeaders } from '../core/http.js';\n\nexport interface FetchConfigResult {\n content: Record<string, unknown>;\n version: string;\n etag: string;\n changed: true;\n}\n\nexport interface FetchConfigUnchanged {\n changed: false;\n}\n\nexport type ConfigFetchResult = FetchConfigResult | FetchConfigUnchanged;\n\nexport interface FetchConfigOptions {\n appUrl: string;\n token: string;\n projectId: string;\n flowId: string;\n lastEtag?: string;\n}\n\nexport async function fetchConfig(\n options: FetchConfigOptions,\n): Promise<ConfigFetchResult> {\n const url = `${options.appUrl}/api/projects/${options.projectId}/flows/${options.flowId}`;\n\n const headers = mergeAuthHeaders(\n options.token,\n options.lastEtag ? { 'If-None-Match': options.lastEtag } : undefined,\n );\n\n const response = await fetch(url, {\n headers,\n signal: AbortSignal.timeout(30_000),\n });\n\n if (response.status === 304) {\n return { changed: false };\n }\n\n if (!response.ok) {\n if (response.status === 401 || response.status === 403) {\n throw new Error(\n `Config fetch failed (${response.status}): token may have expired — redeploy to rotate`,\n );\n }\n throw new Error(\n `Config fetch failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n const etag = response.headers.get('etag') || '';\n const version = etag.replace(/\"/g, '');\n\n return {\n content: data.config,\n version,\n etag,\n changed: true,\n };\n}\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), URL, or inline JSON string',\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(\n 'Path to flow configuration file, URL, or inline JSON string',\n ),\n event: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Event as JSON string, file path, or URL. For sources: { content, trigger?, env? }.',\n ),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n platform: PlatformSchema.optional().describe('Override platform detection'),\n step: z\n .string()\n .optional()\n .describe(\n 'Step target in type.name format (e.g. \"source.browser\", \"destination.gtag\")',\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 * Unified runtime pipeline for walkerOS flows\n *\n * Used by both `walkeros run` (CLI) and Docker containers.\n * Creates health server, loads flow, and optionally enables\n * heartbeat/polling/secrets when API config is provided.\n */\n\nimport { writeFileSync } from 'fs';\nimport fs from 'fs-extra';\nimport type { Logger } from '@walkeros/core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { createHealthServer } from '../../runtime/health-server.js';\nimport {\n loadFlow,\n swapFlow,\n type RuntimeConfig,\n type FlowHandle,\n} from '../../runtime/runner.js';\nimport {\n createHeartbeat,\n getInstanceId,\n type HeartbeatHandle,\n} from '../../runtime/heartbeat.js';\nimport { createPoller, type PollerHandle } from '../../runtime/poller.js';\nimport {\n fetchSecrets,\n SecretsHttpError,\n} from '../../runtime/secrets-fetcher.js';\nimport { writeCache } from '../../runtime/cache.js';\nimport { VERSION } from '../../version.js';\n\nexport interface PipelineOptions {\n bundlePath: string;\n port: number;\n logger: Logger.Instance;\n loggerConfig?: Logger.Config;\n api?: {\n appUrl: string;\n token: string;\n projectId: string;\n flowId: string;\n deploymentId?: string;\n heartbeatIntervalMs: number;\n pollIntervalMs: number;\n cacheDir: string;\n flowName?: string;\n /** Injected bundler function (lazy-loaded by caller to avoid pulling in bundler for pre-built flows) */\n prepareBundleForRun: (\n configPath: string,\n options: { verbose?: boolean; silent?: boolean; flowName?: string },\n ) => Promise<{ bundlePath: string; cleanup: () => Promise<void> }>;\n };\n}\n\n/**\n * Run the full pipeline: health server + flow + optional API features.\n * This function never returns (keeps process alive). Shutdown via signals.\n */\nexport async function runPipeline(options: PipelineOptions): Promise<void> {\n const { bundlePath, port, logger, loggerConfig, api } = options;\n let configVersion: string | undefined;\n\n // Inject secrets before loading flow\n if (api) {\n await injectSecrets(api, logger);\n }\n\n logger.info(`walkeros/flow v${VERSION}`);\n logger.info(`Instance: ${getInstanceId()}`);\n\n // Health server (always on)\n const healthServer = await createHealthServer(port, logger);\n\n // Load flow\n const runtimeConfig: RuntimeConfig = { port };\n let handle: FlowHandle;\n try {\n handle = await loadFlow(\n bundlePath,\n runtimeConfig,\n logger,\n loggerConfig,\n healthServer,\n );\n } catch (error) {\n await healthServer.close();\n throw error;\n }\n\n logger.info('Flow running');\n logger.info(`Port: ${port}`);\n\n // API features (heartbeat + poller)\n let heartbeat: HeartbeatHandle | null = null;\n let poller: PollerHandle | null = null;\n\n // Track temp files for cleanup on hot-swap and shutdown\n let currentBundleCleanup: (() => Promise<void>) | undefined;\n let currentConfigPath: string | undefined;\n\n if (api) {\n heartbeat = createHeartbeat(\n {\n appUrl: api.appUrl,\n token: api.token,\n projectId: api.projectId,\n flowId: api.flowId,\n deploymentId: api.deploymentId,\n configVersion,\n intervalMs: api.heartbeatIntervalMs,\n getCounters: () => handle.collector.status,\n },\n logger,\n );\n heartbeat.start();\n logger.info(`Heartbeat: active (every ${api.heartbeatIntervalMs / 1000}s)`);\n\n poller = createPoller(\n {\n fetchOptions: {\n appUrl: api.appUrl,\n token: api.token,\n projectId: api.projectId,\n flowId: api.flowId,\n },\n intervalMs: api.pollIntervalMs,\n onUpdate: async (content, version) => {\n // Refresh secrets before hot-swap\n try {\n await injectSecrets(api, logger);\n } catch (error) {\n logger.error(\n `Failed to refresh secrets during poll, skipping hot-swap: ${error instanceof Error ? error.message : error}`,\n );\n return;\n }\n\n const tmpConfigPath = getTmpPath(\n undefined,\n `walkeros-flow-${Date.now()}.json`,\n );\n writeFileSync(\n tmpConfigPath,\n JSON.stringify(content, null, 2),\n 'utf-8',\n );\n\n const newBundleResult = await api.prepareBundleForRun(tmpConfigPath, {\n verbose: false,\n silent: true,\n flowName: api.flowName,\n });\n\n handle = await swapFlow(\n handle,\n newBundleResult.bundlePath,\n runtimeConfig,\n logger,\n loggerConfig,\n healthServer,\n );\n\n writeCache(\n api.cacheDir,\n newBundleResult.bundlePath,\n JSON.stringify(content),\n version,\n );\n configVersion = version;\n if (heartbeat) heartbeat.updateConfigVersion(version);\n\n // Clean up previous temp files\n if (currentBundleCleanup)\n await currentBundleCleanup().catch(() => {});\n if (currentConfigPath)\n await fs.remove(currentConfigPath).catch(() => {});\n\n // Track new paths\n currentBundleCleanup = newBundleResult.cleanup;\n currentConfigPath = tmpConfigPath;\n\n logger.info(`Hot-swapped to version ${version}`);\n },\n },\n logger,\n );\n poller.start();\n logger.info(`Polling: active (every ${api.pollIntervalMs / 1000}s)`);\n }\n\n // Single shutdown orchestrator\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n\n const forceTimer = setTimeout(() => {\n logger.error('Shutdown timed out, forcing exit');\n process.exit(1);\n }, 15000);\n\n try {\n if (poller) poller.stop();\n if (heartbeat) heartbeat.stop();\n if (handle.collector.command) {\n await handle.collector.command('shutdown');\n }\n await healthServer.close();\n\n // Clean up temp files\n if (currentBundleCleanup) await currentBundleCleanup().catch(() => {});\n if (currentConfigPath) await fs.remove(currentConfigPath).catch(() => {});\n\n logger.info('Shutdown complete');\n clearTimeout(forceTimer);\n process.exit(0);\n } catch (error) {\n clearTimeout(forceTimer);\n logger.error(\n `Error during shutdown: ${error instanceof Error ? error.message : String(error)}`,\n );\n process.exit(1);\n }\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Keep process alive\n await new Promise(() => {});\n}\n\nasync function injectSecrets(\n api: NonNullable<PipelineOptions['api']>,\n logger: Logger.Instance,\n): Promise<void> {\n try {\n const secrets = await fetchSecrets({\n appUrl: api.appUrl,\n token: api.token,\n projectId: api.projectId,\n flowId: api.flowId,\n });\n const count = Object.keys(secrets).length;\n if (count > 0) {\n for (const [name, value] of Object.entries(secrets)) {\n process.env[name] = value;\n }\n logger.info(`Injected ${count} secret(s) into environment`);\n }\n } catch (error) {\n if (\n error instanceof SecretsHttpError &&\n (error.status === 401 || error.status === 403)\n ) {\n throw error; // Fatal — token is invalid\n }\n logger.warn(\n `Could not fetch secrets: ${error instanceof Error ? error.message : error}`,\n );\n logger.info('Continuing without secrets (flow may not require them)');\n }\n}\n","import http from 'http';\nimport type { Logger } from '@walkeros/core';\n\nexport interface HealthServer {\n server: http.Server;\n setFlowHandler(handler: http.RequestListener | null): void;\n close(): Promise<void>;\n}\n\nexport function createHealthServer(\n port: number,\n logger: Logger.Instance,\n): Promise<HealthServer> {\n return new Promise((resolve, reject) => {\n let flowHandler: http.RequestListener | null = null;\n\n const server = http.createServer((req, res) => {\n // Runner-owned health routes — always available\n if (req.url === '/health' && req.method === 'GET') {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'ok' }));\n return;\n }\n\n if (req.url === '/ready' && req.method === 'GET') {\n const code = flowHandler ? 200 : 503;\n res.writeHead(code, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({ status: flowHandler ? 'ready' : 'not_ready' }),\n );\n return;\n }\n\n // Delegate to flow's HTTP handler\n if (flowHandler) {\n flowHandler(req, res);\n return;\n }\n\n // No flow handler — service unavailable\n res.writeHead(503, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'No flow loaded' }));\n });\n\n server.keepAliveTimeout = 5000;\n server.headersTimeout = 10000;\n\n server.listen(port, '0.0.0.0', () => {\n logger.info(`Health server listening on port ${port}`);\n resolve({\n server,\n setFlowHandler(handler) {\n flowHandler = handler;\n },\n close: () =>\n new Promise<void>((res, rej) => {\n server.close((err) => (err ? rej(err) : res()));\n }),\n });\n });\n\n server.on('error', reject);\n });\n}\n","/**\n * Runtime executor for pre-built walkerOS flows\n *\n * This module runs pre-built .mjs flow bundles without any build-time operations.\n * All bundling, package downloading, and code generation happens BEFORE this runs.\n */\n\nimport { resolve, dirname } from 'path';\nimport type { Collector, Logger } from '@walkeros/core';\nimport type { HealthServer } from './health-server.js';\nimport { loadBundle } from './load-bundle.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 flowContext = {\n ...config,\n ...(loggerConfig ? { logger: loggerConfig } : {}),\n ...(healthServer ? { sourceSettings: { port: undefined } } : {}),\n };\n\n const result = await loadBundle(absolutePath, flowContext, logger);\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 as FlowHandle['collector']['command'],\n status: result.collector.status as FlowHandle['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 * Shared bundle-loading utility.\n *\n * Extracts the common pattern from push/index.ts (executeServerPush) and\n * runtime/runner.ts (loadFlow):\n * 1. Resolve path to absolute\n * 2. Convert to file URL with cache bust\n * 3. Dynamic import\n * 4. Validate default export is a function\n * 5. Call factory with context\n * 6. Validate result has collector with push function\n * 7. Return { collector, httpHandler? }\n */\n\nimport { resolve } from 'path';\nimport { pathToFileURL } from 'url';\nimport type { Logger } from '@walkeros/core';\n\nexport interface BundleResult {\n collector: {\n push: (...args: unknown[]) => Promise<unknown>;\n command: (...args: unknown[]) => Promise<unknown>;\n status?: unknown;\n sources?: Record<string, unknown>;\n [key: string]: unknown;\n };\n httpHandler?: (req: unknown, res: unknown) => void;\n}\n\n/**\n * Load a pre-built bundle, call its default factory, and return the result.\n *\n * Callers are responsible for:\n * - Setting process.cwd() before calling (runner.ts does `process.chdir`)\n * - Wrapping with a timeout if needed (push/index.ts uses Promise.race)\n *\n * @param file - Path to the .mjs bundle (relative or absolute)\n * @param context - Context object passed to the factory function\n * @param logger - Optional logger for debug messages\n */\nexport async function loadBundle(\n file: string,\n context?: Record<string, unknown>,\n logger?: Logger.Instance,\n): Promise<BundleResult> {\n const absolutePath = resolve(file);\n const fileUrl = pathToFileURL(absolutePath).href;\n\n // Bust Node.js module cache by appending a query param\n logger?.debug?.(`Importing bundle: ${absolutePath}`);\n const module = await import(`${fileUrl}?t=${Date.now()}`);\n\n if (!module.default || typeof module.default !== 'function') {\n throw new Error(\n `Invalid bundle: ${file} must export a default factory function`,\n );\n }\n\n logger?.debug?.('Calling factory function...');\n const result = await module.default(context ?? {});\n\n if (\n !result ||\n !result.collector ||\n typeof result.collector.push !== 'function'\n ) {\n throw new Error(\n `Invalid bundle: factory must return { collector } with a push function`,\n );\n }\n\n return {\n collector: result.collector,\n ...(typeof result.httpHandler === 'function'\n ? { httpHandler: result.httpHandler }\n : {}),\n };\n}\n","import { randomBytes } from 'crypto';\nimport { VERSION } from '../version.js';\nimport { mergeAuthHeaders } from '../core/http.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\n/**\n * Deep-copy destination status values to prevent shared references\n * between snapshots from causing delta computation to always return 0.\n */\nfunction snapshotDestinations(\n destinations: Record<\n string,\n { count: number; failed: number; duration: number }\n >,\n): Record<string, { count: number; failed: number; duration: number }> {\n const result: Record<\n string,\n { count: number; failed: number; duration: number }\n > = {};\n for (const [name, dest] of Object.entries(destinations)) {\n result[name] = {\n count: dest.count,\n failed: dest.failed,\n duration: dest.duration,\n };\n }\n return result;\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 let current: CounterSnapshot | undefined;\n const status = config.getCounters?.();\n if (status) {\n current = {\n in: status.in,\n out: status.out,\n failed: status.failed,\n destinations: snapshotDestinations(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: mergeAuthHeaders(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 // Use the same snapshot we computed the delta from — not the live status\n // which may have changed during the HTTP POST\n if (response.ok && counters && current) {\n lastReported = current;\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","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 { fetchConfig, type FetchConfigOptions } from './config-fetcher.js';\nimport type { Logger } from '@walkeros/core';\n\nexport interface PollerConfig {\n fetchOptions: Omit<FetchConfigOptions, 'lastEtag'>;\n intervalMs: number;\n onUpdate: (\n content: Record<string, unknown>,\n version: string,\n ) => Promise<void>;\n}\n\nexport interface PollerHandle {\n start(): void;\n stop(): void;\n pollOnce(): Promise<void>;\n}\n\nexport function createPoller(\n config: PollerConfig,\n logger: Logger.Instance,\n): PollerHandle {\n let timer: ReturnType<typeof setInterval> | null = null;\n let lastEtag: string | undefined;\n\n async function pollOnce(): Promise<void> {\n try {\n const result = await fetchConfig({\n ...config.fetchOptions,\n lastEtag,\n });\n\n if (!result.changed) {\n logger.debug('Config unchanged');\n return;\n }\n\n logger.info(`New config version: ${result.version}`);\n lastEtag = result.etag;\n\n await config.onUpdate(result.content, result.version);\n logger.info('Config updated successfully');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Poll error: ${message}`);\n }\n }\n\n function start(): void {\n lastEtag = undefined;\n const jitter = config.intervalMs * 0.15 * (Math.random() * 2 - 1);\n timer = setInterval(() => pollOnce(), config.intervalMs + jitter);\n logger.info(\n `Polling every ${Math.round((config.intervalMs + jitter) / 1000)}s`,\n );\n }\n\n function stop(): void {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n\n return { start, stop, pollOnce };\n}\n","import { mergeAuthHeaders } from '../core/http.js';\n\nexport interface FetchSecretsOptions {\n appUrl: string;\n token: string;\n projectId: string;\n flowId: string;\n}\n\n/**\n * Custom error with HTTP status for callers to distinguish recoverable\n * failures (404 = no secrets configured) from fatal ones (401/403/500).\n */\nexport class SecretsHttpError extends Error {\n constructor(\n public readonly status: number,\n statusText: string,\n ) {\n super(`Failed to fetch secrets: ${status} ${statusText}`);\n this.name = 'SecretsHttpError';\n }\n}\n\nexport async function fetchSecrets(\n options: FetchSecretsOptions,\n): Promise<Record<string, string>> {\n const { appUrl, token, projectId, flowId } = options;\n const url = `${appUrl}/api/projects/${encodeURIComponent(projectId)}/flows/${encodeURIComponent(flowId)}/secrets/values`;\n\n const res = await fetch(url, {\n headers: mergeAuthHeaders(token, { 'Content-Type': 'application/json' }),\n });\n\n if (!res.ok) {\n throw new SecretsHttpError(res.status, res.statusText);\n }\n\n const json = (await res.json()) as { values: Record<string, string> };\n return json.values;\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\nconst SECTION_KEYS = ['globals', 'context', 'custom', 'user', 'consent'];\nconst KNOWN_KEYS = new Set([\n 'extends',\n 'tagging',\n 'description',\n 'events',\n ...SECTION_KEYS,\n]);\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 of named contract entries',\n code: 'INVALID_CONTRACT',\n });\n return { valid: false, type: 'contract', errors, warnings, details };\n }\n\n const contracts = input as Record<string, unknown>;\n const contractNames = Object.keys(contracts);\n details.contractCount = contractNames.length;\n\n // Check each named contract entry\n for (const [name, entry] of Object.entries(contracts)) {\n if (typeof entry !== 'object' || entry === null) {\n errors.push({\n path: name,\n message: `Contract \"${name}\" must be an object`,\n code: 'INVALID_CONTRACT_ENTRY',\n });\n continue;\n }\n\n const obj = entry as Record<string, unknown>;\n\n // Validate extends\n if (obj.extends !== undefined) {\n if (typeof obj.extends !== 'string') {\n errors.push({\n path: `${name}.extends`,\n message: 'extends must be a string',\n code: 'INVALID_EXTENDS',\n });\n } else if (!contractNames.includes(obj.extends)) {\n errors.push({\n path: `${name}.extends`,\n message: `extends references non-existent contract \"${obj.extends}\"`,\n value: obj.extends,\n code: 'INVALID_EXTENDS',\n });\n }\n }\n\n // Validate tagging\n if (obj.tagging !== undefined) {\n if (\n typeof obj.tagging !== 'number' ||\n !Number.isInteger(obj.tagging) ||\n obj.tagging < 0\n ) {\n errors.push({\n path: `${name}.tagging`,\n message: 'tagging must be a non-negative integer',\n value: obj.tagging,\n code: 'INVALID_TAGGING',\n });\n }\n }\n\n // Validate sections\n for (const key of SECTION_KEYS) {\n if (key in obj) {\n if (typeof obj[key] !== 'object' || obj[key] === null) {\n errors.push({\n path: `${name}.${key}`,\n message: `Section \"${key}\" must be a JSON Schema object`,\n value: obj[key],\n code: 'INVALID_SECTION',\n });\n }\n }\n }\n\n // Validate events\n if (obj.events !== undefined) {\n if (typeof obj.events !== 'object' || obj.events === null) {\n errors.push({\n path: `${name}.events`,\n message: 'events must be an object',\n code: 'INVALID_EVENTS',\n });\n } else {\n validateEntityActions(\n obj.events as Record<string, unknown>,\n `${name}.events`,\n errors,\n );\n }\n }\n }\n\n // Check for circular extends\n for (const name of contractNames) {\n const visited = new Set<string>();\n let current = name;\n while (current) {\n if (visited.has(current)) {\n errors.push({\n path: `${name}.extends`,\n message: `Circular extends chain: ${[...visited, current].join(' → ')}`,\n code: 'CIRCULAR_EXTENDS',\n });\n break;\n }\n visited.add(current);\n const entry = contracts[current] as Record<string, unknown> | undefined;\n current = (entry?.extends as string) || '';\n }\n }\n\n return {\n valid: errors.length === 0,\n type: 'contract',\n errors,\n warnings,\n details,\n };\n}\n\nfunction validateEntityActions(\n obj: Record<string, unknown>,\n prefix: string,\n errors: ValidationError[],\n): void {\n for (const [entityKey, entityValue] of Object.entries(obj)) {\n if (entityKey.trim() === '') {\n errors.push({\n path: `${prefix}.${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: `${prefix}.${entityKey}`,\n message: `Entity \"${entityKey}\" must be an object`,\n value: entityValue,\n code: 'INVALID_ENTITY',\n });\n continue;\n }\n\n for (const [actionKey, actionValue] of Object.entries(\n entityValue as Record<string, unknown>,\n )) {\n if (actionKey.trim() === '') {\n errors.push({\n path: `${prefix}.${entityKey}.${actionKey}`,\n message: 'Action key cannot be empty',\n code: 'INVALID_ACTION_KEY',\n });\n continue;\n }\n\n if (\n typeof actionValue !== 'object' ||\n actionValue === null ||\n Array.isArray(actionValue)\n ) {\n errors.push({\n path: `${prefix}.${entityKey}.${actionKey}`,\n message: 'Contract entry must be a JSON Schema object',\n value: typeof actionValue,\n code: 'INVALID_SCHEMA_ENTRY',\n });\n }\n }\n }\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/event.ts\n\nimport { validateEvent as coreValidateEvent } from '../../../core/event-validation.js';\nimport type { ValidateResult } from '../types.js';\n\nexport function validateEvent(input: unknown): ValidateResult {\n const result = coreValidateEvent(input, 'strict');\n\n return {\n valid: result.valid,\n type: 'event',\n errors: result.errors,\n warnings: result.warnings,\n details: result.details as Record<string, unknown>,\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 { validateFlowConfig } = 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 validateFlowConfig 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 = validateFlowConfig(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 flowSettings = (flows as Record<string, Flow.Settings>)[name];\n if (!flowSettings) continue;\n\n const connections = buildConnectionGraph(flowSettings);\n for (const conn of connections) {\n checkCompatibility(conn, errors, warnings);\n }\n totalConnections += connections.length;\n\n // Contract compliance (contracts live on Config level only)\n const contract = config.contract as Flow.Contract | undefined;\n if (contract) {\n checkContractCompliance(flowSettings, contract, warnings);\n }\n }\n details.connectionsChecked = totalConnections;\n\n // Check for flat dot-separated mapping keys (common mistake)\n for (const name of flowsToCheck) {\n const flowSettings = (flows as Record<string, Flow.Settings>)[name];\n if (!flowSettings) continue;\n\n for (const [destName, dest] of Object.entries(\n flowSettings.destinations || {},\n )) {\n const destConfig = dest as {\n config?: { mapping?: Record<string, unknown> };\n };\n const mapping = destConfig.config?.mapping;\n if (!mapping || typeof mapping !== 'object') continue;\n\n for (const key of Object.keys(mapping)) {\n if (key.includes('.') && !key.includes(' ')) {\n const parts = key.split('.');\n warnings.push({\n path: `destination.${destName}.config.mapping`,\n message: `Mapping key \"${key}\" looks like dot-notation. Mapping uses nested entity → action structure.`,\n suggestion: `Use nested format: { \"${parts[0]}\": { \"${parts.slice(1).join('.')}\": { ... } } }`,\n });\n }\n }\n }\n }\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 buildConnectionGraph(config: Flow.Settings): 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.Settings,\n contract: Flow.Contract,\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 entityContract = contract[event.entity] as\n | Record<string, unknown>\n | undefined;\n if (!entityContract || typeof entityContract !== 'object') continue;\n\n const actionSchema = entityContract[event.action] || entityContract['*'];\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 { throwApiError } from '../../core/api-error.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) throwApiError(error, '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) throwApiError(error, '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 // Config is user-provided JSON; server validates the full schema\n body: { name: options.name, config: options.content } as never,\n });\n if (error) throwApiError(error, '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.config = 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) throwApiError(error, '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) throwApiError(error, '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) throwApiError(error, '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","export interface ApiErrorDetail {\n path: string;\n message: string;\n}\n\nexport class ApiError extends Error {\n code?: string;\n details?: ApiErrorDetail[];\n\n constructor(\n message: string,\n options?: { code?: string; details?: ApiErrorDetail[] },\n ) {\n super(message);\n this.name = 'ApiError';\n this.code = options?.code;\n this.details = options?.details;\n }\n}\n\n/**\n * Extract structured error from an openapi-fetch error response and throw.\n * The error shape is: { error: { code, message, details: { errors: [] } } }\n */\nexport function throwApiError(error: unknown, fallbackMessage: string): never {\n if (\n error &&\n typeof error === 'object' &&\n 'error' in error &&\n typeof (error as Record<string, unknown>).error === 'object'\n ) {\n const inner = (error as { error: Record<string, unknown> }).error;\n const message = (inner.message as string) || fallbackMessage;\n const code = inner.code as string | undefined;\n const details = (inner.details as Record<string, unknown>)?.errors as\n | ApiErrorDetail[]\n | undefined;\n throw new ApiError(message, { code, details });\n }\n throw new ApiError(fallbackMessage);\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport { ApiError, throwApiError } from '../../core/api-error.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 resolveSettingsId(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 settings = (flow as { settings?: Array<{ id: string; name: string }> })\n .settings;\n if (!settings?.length) {\n throw new Error('Flow has no settings.');\n }\n const match = settings.find((c) => c.name === options.flowName);\n if (!match) {\n throw new Error(\n `Flow \"${options.flowName}\" not found. Available: ${settings.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 settings = (flow as { settings?: Array<{ name: string }> }).settings;\n return settings?.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 timeoutMs = options.timeout ?? 120_000;\n\n const response = await apiFetch(\n `/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 settingsId = await resolveSettingsId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n return deploySettings({\n ...options,\n projectId,\n settingsId,\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 try {\n throwApiError(error, 'Failed to start deployment');\n } catch (e) {\n if (e instanceof ApiError && e.code === 'AMBIGUOUS_CONFIG') {\n const names = await getAvailableFlowNames({\n flowId: options.flowId,\n projectId,\n });\n throw new ApiError(\n `This flow has multiple settings. Use --flow <name> to specify one.\\nAvailable: ${names.join(', ')}`,\n { code: 'AMBIGUOUS_CONFIG' },\n );\n }\n throw e;\n }\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-settings routes\nasync function deploySettings(options: {\n flowId: string;\n projectId: string;\n settingsId: string;\n wait?: boolean;\n timeout?: number;\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n}) {\n const { flowId, projectId, settingsId } = options;\n\n // 1. Trigger per-settings deploy\n const response = await apiFetch(\n `/api/projects/${projectId}/flows/${flowId}/settings/${settingsId}/deploy`,\n { method: 'POST' },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, `Deploy failed (${response.status})`);\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 settingsId = await resolveSettingsId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n const response = await apiFetch(\n `/api/projects/${projectId}/flows/${options.flowId}/settings/${settingsId}/deploy`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, '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) throwApiError(error, '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 { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport { throwApiError } from '../../core/api-error.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 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 apiFetch(\n `/api/projects/${id}/deployments${qs ? `?${qs}` : ''}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to list deployments');\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\n const response = await apiFetch(\n `/api/projects/${id}/deployments/${options.slug}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to get deployment');\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\n const response = await apiFetch(`/api/projects/${id}/deployments`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ type: options.type, label: options.label }),\n });\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to create deployment');\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\n const response = await apiFetch(\n `/api/projects/${id}/deployments/${options.slug}`,\n { method: 'DELETE' },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to delete deployment');\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 resp = await apiFetch(`/api/projects/${id}/flows/${config}`);\n if (!resp.ok) {\n const body = await resp.json().catch(() => ({}));\n throwApiError(body, `Failed to fetch flow ${config}`);\n }\n const flow = (await resp.json()) as { config?: unknown };\n if (!flow.config) throw new Error('Flow has no config');\n\n const flowConfig = flow.config as { flows?: Record<string, unknown> };\n const flows = flowConfig.flows;\n if (!flows) throw new Error('Invalid flow config: missing flows');\n const flowName = options.flow ?? Object.keys(flows)[0];\n if (!flowName) throw new Error('No flows found in config');\n const flowSettings = flows[flowName];\n if (!flowSettings || typeof flowSettings !== 'object')\n throw new Error('Invalid flow config');\n\n if ('web' in flowSettings) type = 'web';\n else if ('server' in flowSettings) 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.flowSettings);\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","import { createInterface } from 'readline';\nimport { readConfig, writeConfig } from '../../lib/config-file.js';\nimport { publicFetch } from '../../core/http.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\n\n// === Programmatic API ===\n\nexport interface FeedbackOptions {\n anonymous?: boolean;\n version?: string;\n}\n\nexport async function feedback(\n text: string,\n options?: FeedbackOptions,\n): Promise<void> {\n const config = readConfig();\n\n const anonymous = options?.anonymous ?? config?.anonymousFeedback ?? true;\n\n const payload: {\n text: string;\n userId?: string;\n projectId?: string;\n version?: string;\n } = { text };\n\n if (options?.version) {\n payload.version = options.version;\n }\n\n if (!anonymous && config?.email) {\n payload.userId = config.email;\n const projectId = process.env.WALKEROS_PROJECT_ID;\n if (projectId) {\n payload.projectId = projectId;\n }\n }\n\n const response = await publicFetch('/api/feedback', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `Feedback submission failed: ${response.status} ${response.statusText}`,\n );\n }\n}\n\n// === CLI Command Handler ===\n\nexport async function feedbackCommand(text: string): Promise<void> {\n const logger = createCLILogger({});\n try {\n const config = readConfig();\n let anonymous: boolean;\n\n if (config?.anonymousFeedback === undefined) {\n // First time: prompt user for consent\n const answer = await promptUser(\n 'Include your user and project info with feedback? (y/N) ',\n );\n const anonymousFeedback = !answer.toLowerCase().startsWith('y');\n\n // Persist the choice\n if (config) {\n writeConfig({ ...config, anonymousFeedback });\n } else {\n writeConfig({\n token: '',\n email: '',\n appUrl: '',\n anonymousFeedback,\n });\n }\n anonymous = anonymousFeedback;\n } else {\n anonymous = config.anonymousFeedback;\n }\n\n await feedback(text, { anonymous });\n logger.info('Feedback sent. Thanks!');\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nfunction promptUser(question: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\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.Settings,\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.Settings,\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.Settings,\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.Settings,\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"],"mappings":"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","names":["path","path","fs","path","existsSync","path","init_utils","path","fs","fs","fs","path","fs","path","init_utils","schemas","path","path","fs","input","path","fs","semver","_","deps","peerDeps","peerMeta","m","a","b","p","c","fs","path","getHashServer","path","fs","validateFlowConfig","stats","_","c","d","m","v","k","fs","path","fs","path","fs","getPlatform","r","existsSync","mkdirSync","writeFileSync","readFileSync","join","path","fs","init_utils","path","fs","getPlatform","init_utils","path","resolve","a","b","g","path","_","v","k","path","fs","getPlatform","getPlatform","loadDestinationEnvs","fs","path","schemas","fs","i","getPlatform","loadDestinationEnvs","path","r","path","writeFileSync","homedir","join","existsSync","mkdirSync","writeFileSync","isUrl","path","existsSync","z","z","z","z","z","z","z","z","z","z","existsSync","init_utils","writeFileSync","fs","resolve","resolve","dirname","pathToFileURL","resolve","dirname","readFileSync","fileURLToPath","dirname","join","p","writeFileSync","fs","join","homedir","prepareBundleForRun","path","writeFileSync","writeCache","chalk","validateEvent","schemas","validateFlowConfig","path","a","b","k","r","path","m","schemas","validate","validateEvent","chalk","f","r","handleResult","c","r","getPlatform","handleResult","result","getPlatform","resolve","m"]}
1
+ {"version":3,"sources":["../src/core/cli-logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/tmp.ts","../src/lib/config-file.ts","../src/core/http.ts","../src/config/utils.ts","../src/core/asset-resolver.ts","../src/core/utils.ts","../src/core/local-packages.ts","../src/core/input-detector.ts","../src/core/stdin.ts","../src/core/auth.ts","../src/core/sse.ts","../src/core/event-validation.ts","../src/core/package-path.ts","../src/core/index.ts","../src/config/validators.ts","../src/config/build-defaults.ts","../src/config/loader.ts","../src/config/index.ts","../src/commands/bundle/config-classifier.ts","../src/core/cache-utils.ts","../src/commands/bundle/package-manager.ts","../src/core/build-cache.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/upload.ts","../src/commands/bundle/stats.ts","../src/core/api-client.ts","../src/commands/bundle/dockerfile.ts","../src/commands/bundle/index.ts","../src/commands/push/env-loader.ts","../src/runtime/cache.ts","../src/commands/run/utils.ts","../src/index.ts","../src/commands/push/index.ts","../src/commands/push/overrides.ts","../src/commands/push/apply-overrides.ts","../src/commands/push/flow-context.ts","../src/commands/push/async-drain.ts","../src/commands/push/prepare.ts","../src/commands/run/index.ts","../src/runtime/resolve-bundle.ts","../src/runtime/config-fetcher.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/pipeline.ts","../src/runtime/health-server.ts","../src/runtime/runner.ts","../src/runtime/load-bundle.ts","../src/runtime/heartbeat.ts","../src/version.ts","../src/runtime/poller.ts","../src/runtime/secrets-fetcher.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/core/api-error.ts","../src/commands/deploy/index.ts","../src/commands/deployments/index.ts","../src/commands/feedback/index.ts","../src/commands/simulate/example-loader.ts","../src/commands/simulate/compare.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","/**\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","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 anonymousFeedback?: boolean;\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.\n * WALKEROS_APP_URL env var > config file > 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 resolveAppUrl,\n resolveToken,\n resolveDeployToken,\n} from '../lib/config-file.js';\n\n/**\n * Normalize headers from any RequestInit format to a plain object.\n */\nfunction normalizeHeaders(headers?: HeadersInit): Record<string, string> {\n if (!headers) return {};\n if (headers instanceof Headers) return Object.fromEntries(headers.entries());\n if (Array.isArray(headers)) return Object.fromEntries(headers);\n return headers as Record<string, string>;\n}\n\n/**\n * Merge a bearer token into a headers object.\n * Shared by apiFetch, deployFetch, and runtime callers that manage their own tokens.\n */\nexport function mergeAuthHeaders(\n token: string | null | undefined,\n headers?: HeadersInit,\n): Record<string, string> {\n const normalized = normalizeHeaders(headers);\n if (token) normalized.Authorization = `Bearer ${token}`;\n return normalized;\n}\n\n/**\n * Authenticated fetch — resolves base URL + adds auth token.\n * Use for all API calls that require WALKEROS_TOKEN.\n */\nexport async function apiFetch(\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const baseUrl = resolveAppUrl();\n const token = resolveToken()?.token;\n return fetch(`${baseUrl}${path}`, {\n ...init,\n headers: mergeAuthHeaders(token, init?.headers),\n });\n}\n\n/**\n * Unauthenticated fetch — resolves base URL, no auth.\n * Use for public endpoints (login device flow, feedback).\n */\nexport async function publicFetch(\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const baseUrl = resolveAppUrl();\n return fetch(`${baseUrl}${path}`, init);\n}\n\n/**\n * Deploy-authenticated fetch — uses deploy token with fallback to user token.\n * Use for runtime operations (heartbeat, config polling, secrets).\n */\nexport async function deployFetch(\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const baseUrl = resolveAppUrl();\n const token = resolveDeployToken() ?? resolveToken()?.token;\n if (!token)\n throw new Error(\n 'No authentication token available. Set WALKEROS_DEPLOY_TOKEN or run walkeros auth login.',\n );\n return fetch(`${baseUrl}${path}`, {\n ...init,\n headers: mergeAuthHeaders(token, init?.headers),\n });\n}\n","/**\n * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { mergeAuthHeaders } from '../core/http.js';\nimport { resolveToken } from '../lib/config-file.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 * Fetch content from a URL as a string, with auth headers.\n * Shared helper for all URL-loading paths.\n *\n * @param url - HTTP/HTTPS URL to fetch\n * @returns Response body as a string\n * @throws Error if fetch fails or response is not OK\n */\nexport async function fetchContentString(url: string): Promise<string> {\n const token = resolveToken()?.token;\n const response = await fetch(url, {\n headers: mergeAuthHeaders(token),\n });\n if (!response.ok) {\n throw new Error(\n `Failed to fetch ${url}: ${response.status} ${response.statusText}`,\n );\n }\n return response.text();\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 * Resolve raw string content from a URL, file path, or inline string.\n *\n * Detection priority:\n * 1. URL (http://, https://) — download content\n * 2. Existing file path — read file content\n * 3. Inline string — return as-is\n *\n * @param input - URL, file path, or inline string\n * @returns Raw string content and the resolved absolute path (if file-based)\n * @throws Error if file not found or download fails\n */\nasync function resolveContent(input: string): Promise<string> {\n const trimmed = input.trim();\n\n // 1. Check if input is a URL\n if (isUrl(trimmed)) {\n return fetchContentString(trimmed);\n }\n\n // 2. Check if file path exists\n const absolutePath = path.resolve(trimmed);\n if (await fs.pathExists(absolutePath)) {\n return fs.readFile(absolutePath, 'utf-8');\n }\n\n // 3. Inline content — return as-is\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return trimmed;\n }\n\n // 4. Nothing matched — file not found\n throw new Error(`Configuration file not found: ${absolutePath}`);\n}\n\n/**\n * Load configuration from a file path, URL, or inline string.\n *\n * Supports two modes:\n * - `json: true` (default) — resolves content and parses as JSON\n * - `json: false` — resolves content and returns raw string\n *\n * Detection priority:\n * 1. URL (http://, https://) — download content\n * 2. Existing file path — read file content\n * 3. Inline string (starting with { or [) — use directly\n *\n * @param input - Path to file, HTTP/HTTPS URL, or inline string\n * @param options - Optional settings\n * @param options.json - Parse as JSON (default: true)\n * @returns Parsed object (json: true) or raw string (json: false)\n * @throws Error if file not found, download fails, or invalid JSON\n *\n * @example\n * ```typescript\n * // JSON mode (default) — same as loadJsonConfig\n * const config = await loadConfig('./config.json')\n * const config = await loadConfig('https://example.com/config.json')\n * const config = await loadConfig('{\"version\":3,\"flows\":{}}')\n *\n * // Raw string mode — returns file/URL content as string\n * const code = await loadConfig('./bundle.js', { json: false })\n * ```\n */\nexport async function loadConfig<T = unknown>(\n input: string,\n options?: { json?: boolean },\n): Promise<T | string> {\n const json = options?.json !== false; // default true\n\n if (!json) {\n return resolveContent(input);\n }\n\n // JSON mode — resolve content then parse\n const trimmed = input.trim();\n\n try {\n const content = await resolveContent(trimmed);\n\n // Parse the resolved content as JSON\n return JSON.parse(content) as T;\n } catch (error) {\n // Distinguish between JSON parse errors and resolution errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Re-throw resolution errors (file not found, fetch failed) as-is\n if (\n errorMessage.includes('not found') ||\n errorMessage.includes('Failed to fetch')\n ) {\n throw error;\n }\n\n // JSON-looking inline content with parse errors\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n throw new Error(\n `Input appears to be JSON but contains errors: ${errorMessage}`,\n );\n }\n\n // File or URL with invalid JSON content\n throw new Error(`Invalid JSON in config file: ${input}. ${errorMessage}`);\n }\n}\n\n/**\n * Load and parse JSON configuration from a file path, URL, or inline JSON string.\n *\n * Thin wrapper around `loadConfig` with `json: true` (default).\n *\n * Detection priority:\n * 1. URL (http://, https://) — download and parse\n * 2. Existing file path — read and parse\n * 3. Inline JSON string (starting with { or [) — parse directly\n *\n * @param configPath - Path to JSON file, HTTP/HTTPS URL, or inline JSON string\n * @returns Parsed configuration object\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 * // Inline JSON\n * const config = await loadJsonConfig('{\"version\":3,\"flows\":{}}')\n * ```\n */\nexport async function loadJsonConfig<T>(configPath: string): Promise<T> {\n return loadConfig<T>(configPath, { json: true }) as Promise<T>;\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 // 1. Handle empty/undefined input (pre-check)\n if (!source || source.trim() === '') {\n if (options?.required) throw new Error(`${paramName} is required`);\n if (options?.fallback !== undefined) return options.fallback;\n return {} as T;\n }\n\n // 2. Try the strict loader (handles URL, file, inline JSON)\n try {\n return await loadJsonConfig<T>(source);\n } catch (error) {\n const trimmed = source.trim();\n\n // 3. Not JSON-looking? Treat as event name (backward compat)\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return { name: trimmed } as T;\n }\n\n // 4. JSON-looking but invalid -- re-throw with context\n throw new Error(\n `Failed to parse ${paramName}. ${error instanceof Error ? error.message : String(error)}`,\n );\n }\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 * 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 type LocalPackageInfo =\n | { name: string; absolutePath: string; type: 'file' }\n | { name: string; absolutePath: string; type: 'directory' }\n | {\n name: string;\n absolutePath: string;\n type: 'package';\n distPath: string;\n hasDistFolder: boolean;\n };\n\n/**\n * Resolve and validate a local package path.\n *\n * Handles three cases:\n * 1. Single file (with or without extension) → type: 'file'\n * 2. Directory without package.json → type: 'directory'\n * 3. Directory with package.json → type: 'package' (existing behavior)\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 const stat = await fs.stat(absolutePath).catch(() => null);\n\n // Case 1a: Direct file reference (e.g., ./src/decoder.ts)\n if (stat?.isFile()) {\n return { name: packageName, absolutePath, type: 'file' };\n }\n\n // Case 1b: Try with extensions (e.g., ./src/decoder → ./src/decoder.ts)\n if (!stat) {\n for (const ext of ['.ts', '.mjs', '.js', '.json']) {\n const withExt = absolutePath + ext;\n if (await fs.pathExists(withExt)) {\n return { name: packageName, absolutePath: withExt, type: 'file' };\n }\n }\n throw new Error(\n `Local package path not found: ${localPath} (resolved to ${absolutePath})`,\n );\n }\n\n // Path is a directory\n if (stat.isDirectory()) {\n const hasPkgJson = await fs.pathExists(\n path.join(absolutePath, 'package.json'),\n );\n\n if (hasPkgJson) {\n // Case 3: Full package (existing behavior)\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 type: 'package',\n distPath: hasDistFolder ? distPath : absolutePath,\n hasDistFolder,\n };\n }\n\n // Case 2: Directory without package.json\n return { name: packageName, absolutePath, type: 'directory' };\n }\n\n throw new Error(\n `Local package path not found: ${localPath} (resolved to ${absolutePath})`,\n );\n}\n\n/**\n * Copy local package to target node_modules directory.\n *\n * Handles three cases:\n * - file: Copy as index.{ext} with generated package.json\n * - directory: Copy contents with generated package.json\n * - package: Existing behavior (copy package.json + 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 if (localPkg.type === 'file') {\n await fs.ensureDir(packageDir);\n\n // Copy the single file as index (esbuild will resolve it)\n const ext = path.extname(localPkg.absolutePath);\n await fs.copy(localPkg.absolutePath, path.join(packageDir, `index${ext}`));\n\n // Create minimal package.json for module resolution\n await fs.writeJson(path.join(packageDir, 'package.json'), {\n name: localPkg.name,\n main: `./index${ext}`,\n });\n\n logger.info(\n `📦 Using local file: ${localPkg.name} from ${localPkg.absolutePath}`,\n );\n return packageDir;\n }\n\n if (localPkg.type === 'directory') {\n await fs.ensureDir(path.dirname(packageDir));\n\n // Copy directory 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 // Generate minimal package.json for module resolution\n await fs.writeJson(path.join(packageDir, 'package.json'), {\n name: localPkg.name,\n main: './index.ts',\n });\n\n logger.info(\n `📦 Using local dir: ${localPkg.name} from ${localPkg.absolutePath}`,\n );\n return packageDir;\n }\n\n // type === 'package': Existing behavior\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 { fetchContentString, isUrl } from '../config/utils.js';\n\nexport type Platform = 'web' | 'server';\n\nexport type DetectedInput =\n | { type: 'config'; content: string }\n | { type: 'bundle'; content: string; platform: Platform };\n\n/**\n * Detect if input is config JSON or pre-built bundle.\n *\n * Detection: Try JSON.parse, if fails = bundle\n * Platform: .mjs = server, .js = web\n *\n * @param inputPath - Path to file or URL\n * @param platformOverride - Optional platform override\n * @returns Detected input type with content\n */\nexport async function detectInput(\n inputPath: string,\n platformOverride?: Platform,\n): Promise<DetectedInput> {\n // Load content (URL or local file)\n const content = await loadContent(inputPath);\n\n // Try parsing as JSON\n try {\n JSON.parse(content);\n return { type: 'config', content };\n } catch {\n // Not JSON, treat as bundle\n const platform = platformOverride ?? detectPlatformFromPath(inputPath);\n return { type: 'bundle', content, platform };\n }\n}\n\n/**\n * Detect platform from file extension.\n *\n * @param inputPath - Path to file or URL\n * @returns Platform based on extension (.mjs = server, .js = web)\n */\nexport function detectPlatformFromPath(inputPath: string): Platform {\n // Remove query params for URLs\n const cleanPath = inputPath.split('?')[0];\n return cleanPath.endsWith('.mjs') ? 'server' : 'web';\n}\n\n/**\n * Load content from URL or local file.\n *\n * @param inputPath - Path to file or URL\n * @returns File content as string\n */\nasync function loadContent(inputPath: string): Promise<string> {\n if (isUrl(inputPath)) {\n return fetchContentString(inputPath);\n }\n // Inline JSON passthrough: JS bundles never start with { or [\n const trimmed = inputPath.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return trimmed;\n }\n\n return fs.readFile(inputPath, 'utf8');\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { getTmpPath } from './tmp.js';\n\nexport 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\n/**\n * Read stdin content and write to a labeled temp file.\n * Returns the temp file path for downstream functions that expect file paths.\n */\nexport async function readStdinToTempFile(label: string): Promise<string> {\n const content = await readStdin();\n const tmpPath = getTmpPath(undefined, `stdin-${label}.json`);\n await fs.ensureDir(path.dirname(tmpPath));\n await fs.writeFile(tmpPath, content, 'utf-8');\n return tmpPath;\n}\n","import { resolveToken, resolveDeployToken } 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\n/**\n * Resolve token for runtime operations (run command, heartbeat, polling).\n * Priority: WALKEROS_DEPLOY_TOKEN > WALKEROS_TOKEN > config file\n */\nexport function resolveRunToken(): string | null {\n return resolveDeployToken() ?? resolveToken()?.token ?? null;\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","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","import { schemas } from '@walkeros/core/dev';\n\nconst { PartialEventSchema } = schemas;\n\nexport type ValidationLevel = 'strict' | 'standard' | 'minimal';\n\nexport type EventValidationCode =\n | 'NOT_AN_OBJECT'\n | 'MISSING_EVENT_NAME'\n | 'EMPTY_EVENT_NAME'\n | 'INVALID_EVENT_NAME'\n | 'SCHEMA_VALIDATION';\n\nexport interface EventValidationError {\n path: string;\n message: string;\n value?: unknown;\n code: EventValidationCode;\n}\n\nexport interface EventValidationWarning {\n path: string;\n message: string;\n suggestion?: string;\n}\n\nexport interface EventValidationDetails {\n entity?: string | null;\n action?: string | null;\n hasConsent?: boolean;\n hasData?: boolean;\n hasContext?: boolean;\n}\n\nexport interface EventValidationResult {\n valid: boolean;\n errors: EventValidationError[];\n warnings: EventValidationWarning[];\n details: EventValidationDetails;\n}\n\nexport function validateEvent(\n input: unknown,\n level: ValidationLevel = 'strict',\n): EventValidationResult {\n const errors: EventValidationError[] = [];\n const warnings: EventValidationWarning[] = [];\n const details: EventValidationDetails = {};\n\n // All levels: must be an object\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n errors.push({\n path: 'root',\n message: 'Event must be an object',\n code: 'NOT_AN_OBJECT',\n });\n return { valid: false, errors, warnings, details };\n }\n\n const event = input as Record<string, unknown>;\n\n // All levels: name field checks\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 // Entity-action format check (strict + standard only)\n const name = event.name;\n if (!name.includes(' ')) {\n if (level === 'strict') {\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 if (level === 'standard') {\n warnings.push({\n path: 'name',\n message: `Event name \"${name}\" should follow \"ENTITY ACTION\" format (e.g., \"page view\")`,\n });\n details.entity = null;\n details.action = null;\n }\n // minimal: skip entirely\n } else {\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 // Minimal stops here\n if (level === 'minimal') {\n return { valid: errors.length === 0, errors, warnings, details };\n }\n\n // Standard + Strict: Zod schema validation\n const zodResult = PartialEventSchema.safeParse(input);\n if (!zodResult.success) {\n for (const issue of zodResult.error.issues) {\n const issuePath = issue.path.join('.');\n if (issuePath === 'name') continue; // handled above with better messages\n errors.push({\n path: issuePath || 'root',\n message: issue.message,\n code: 'SCHEMA_VALIDATION',\n });\n }\n }\n\n // Strict only: consent warning + details\n if (level === 'strict') {\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 details.hasConsent = !!event.consent;\n details.hasData = !!event.data;\n details.hasContext = !!event.context;\n }\n\n return { valid: errors.length === 0, errors, warnings, details };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport type { Flow } from '@walkeros/core';\n\n/**\n * Resolve a package name to an import path, consulting flow config's\n * packages.path for local overrides.\n *\n * When a package has a `path` field in the flow config, resolves the\n * local filesystem path (relative to configDir). For subpaths (e.g., \"/dev\"),\n * reads the package's exports map to find the actual file path.\n * Otherwise returns the bare package name for standard Node module resolution.\n */\nexport function resolvePackageImportPath(\n packageName: string,\n packages: Flow.Packages | undefined,\n configDir: string,\n subpath?: string,\n): string {\n const entry = packages?.[packageName];\n\n if (entry?.path) {\n const resolved = path.isAbsolute(entry.path)\n ? entry.path\n : path.resolve(configDir, entry.path);\n\n if (!subpath) return resolved;\n\n // Resolve subpath via package.json exports map (e.g., \"./dev\" → \"./dist/dev.mjs\")\n try {\n const pkgJson = JSON.parse(\n fs.readFileSync(path.join(resolved, 'package.json'), 'utf8'),\n );\n const exportKey = `.${subpath.startsWith('/') ? subpath : `/${subpath}`}`;\n const exp = pkgJson.exports?.[exportKey];\n if (exp) {\n const target =\n typeof exp === 'string'\n ? exp\n : exp.import || exp.require || exp.default;\n if (target) return path.join(resolved, target);\n }\n } catch {\n // Fall through to direct path join\n }\n\n return path.join(resolved, subpath.replace(/^\\//, ''));\n }\n\n // No local path — return bare name (with subpath if provided)\n return subpath ? `${packageName}${subpath}` : packageName;\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 } from './auth.js';\nexport {\n apiFetch,\n publicFetch,\n deployFetch,\n mergeAuthHeaders,\n} from './http.js';\nexport { parseSSEEvents } from './sse.js';\nexport type { SSEEvent, SSEParseResult } from './sse.js';\nexport * from './event-validation.js';\nexport * from './package-path.js';\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n * Uses Zod schemas from @walkeros/core for Flow.Config validation.\n */\n\nimport type { Flow } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\n\nconst { safeParseConfig } = 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.Config 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 (isFlowConfig(config)) {\n * const flowSettings = getFlowSettings(config, 'production');\n * }\n * ```\n */\nexport function isFlowConfig(data: unknown): data is Flow.Config {\n const result = safeParseConfig(data);\n return result.success;\n}\n\n/**\n * Validate Flow.Config 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.Config\n * @throws Error with descriptive message if validation fails\n */\nexport function validateFlowConfig(data: unknown): Flow.Config {\n const result = safeParseConfig(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.Config since Zod's inferred type is compatible but not identical\n return result.data as Flow.Config;\n}\n\n/**\n * Get available flow names from a Flow.Config.\n *\n * @param config - Flow.Config configuration\n * @returns Array of flow names\n */\nexport function getAvailableFlows(config: Flow.Config): string[] {\n return Object.keys(config.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: 'walkerOS',\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.Config configurations using core getFlowSettings().\n * Build options are determined by static platform defaults.\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { getFlowSettings, getPlatform, type Flow } from '@walkeros/core';\nimport type { BuildOptions } from '../types/bundle.js';\nimport {\n validateFlowConfig,\n isFlowConfig,\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 flowSettings: Flow.Settings;\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.Config from @walkeros/core as the only config format.\n * - Validates config structure\n * - Uses core getFlowSettings() 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.Config\n const config = validateFlowConfig(rawConfig);\n const availableFlows = getFlowNames(config);\n\n // Determine which flow to use\n const flowName = resolveFlow(config, options.flowName, availableFlows);\n\n // Resolve with deferred mode first (markers don't affect platform detection)\n let flowSettings = getFlowSettings(config, flowName, { deferred: true });\n const platform = getPlatform(flowSettings);\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 flowSettings = getFlowSettings(config, flowName);\n }\n\n // Get static build defaults based on platform\n const buildDefaults = getBuildDefaults(platform);\n\n // Extract packages from flowSettings (if present)\n const packages = flowSettings.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 = config.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 flowSettings,\n buildOptions,\n flowName,\n isMultiFlow,\n availableFlows,\n };\n}\n\n/**\n * Resolve which flow to use.\n *\n * @param config - Flow.Config 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 config: Flow.Config,\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.Config\n const config = validateFlowConfig(rawConfig);\n const flows = getFlowNames(config);\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 (isFlowConfig(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 { flowSettings, buildOptions } = await loadFlowConfig('./flow.json');\n * const { flowSettings } = 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","/**\n * Configuration Module\n *\n * Config format: Flow.Config from @walkeros/core\n * Build options: Static platform defaults from build-defaults.ts\n */\n\n// Type guards and validators\nexport {\n isObject,\n detectPlatform,\n isFlowConfig,\n validateFlowConfig,\n getAvailableFlows as getFlowNames,\n} from './validators.js';\n\n// Build defaults\nexport {\n WEB_BUILD_DEFAULTS,\n SERVER_BUILD_DEFAULTS,\n DEFAULT_OUTPUT_PATHS,\n getBuildDefaults,\n getDefaultOutput,\n} from './build-defaults.js';\n\n// Utility functions\nexport {\n substituteEnvVariables,\n loadConfig,\n loadJsonConfig,\n loadJsonFromSource,\n isUrl,\n} from './utils.js';\n\n// Loader\nexport {\n loadBundleConfig,\n loadAllFlows,\n getAvailableFlows,\n loadFlowConfig,\n} from './loader.js';\nexport type { LoadConfigResult, LoadConfigOptions } from './loader.js';\n\n// Type re-exports\nexport type {\n BuildOptions,\n CLIBuildOptions,\n MinifyOptions,\n Flow,\n} from '../types/bundle.js';\n","/**\n * Check if a config value contains code markers that require esbuild compilation.\n * Returns true if the value (or any nested value) contains:\n * - $code: prefix (raw JS expression)\n * - $store: prefix (JS variable reference)\n * - __WALKEROS_ENV: prefix (process.env expression)\n */\nexport function containsCodeMarkers(value: unknown): boolean {\n if (typeof value === 'string') {\n return (\n value.startsWith('$code:') ||\n value.startsWith('$store:') ||\n value.includes('__WALKEROS_ENV:')\n );\n }\n if (Array.isArray(value)) {\n return value.some(containsCodeMarkers);\n }\n if (value !== null && typeof value === 'object') {\n return Object.values(value as Record<string, unknown>).some(\n containsCodeMarkers,\n );\n }\n return false;\n}\n\n/**\n * Split a step's properties into code-layer (for esbuild) and data-layer (post-build).\n *\n * Code layer: 'code' key always, plus any property containing code markers\n * Data layer: plain JSON values (settings, mappings, chains, etc.)\n *\n * Not applicable to InlineCode steps — those go entirely to the code layer.\n */\nexport function classifyStepProperties(\n step: Record<string, unknown>,\n): { codeProps: Record<string, unknown>; dataProps: Record<string, unknown> } {\n const codeProps: Record<string, unknown> = {};\n const dataProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(step)) {\n if (key === 'code') {\n codeProps[key] = value;\n continue;\n }\n if (containsCodeMarkers(value)) {\n codeProps[key] = value;\n } else {\n dataProps[key] = value;\n }\n }\n\n return { codeProps, dataProps };\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';\nimport semver from 'semver';\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 // Dist tags (latest, next, beta, etc.) are mutable — they can point to\n // different versions over time, so caching must include a date component.\n // A version is immutable only if it's an exact semver (e.g., \"1.2.3\").\n if (semver.valid(version)) return false;\n return true;\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 getFlowSettingsCacheKey(\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","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport semver from 'semver';\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\nconst PACKAGE_DOWNLOAD_TIMEOUT_MS = 60000;\nconst PACOTE_OPTS = {\n registry: 'https://registry.npmjs.org',\n preferOnline: true,\n where: undefined,\n};\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;\n}\n\nexport interface VersionSpec {\n spec: string;\n source: 'direct' | 'dependency' | 'peerDependency';\n from: string;\n optional: boolean;\n localPath?: string;\n}\n\ninterface ResolvedPackage {\n name: string;\n version: string;\n localPath?: string;\n}\n\nfunction getPackageDirectory(baseDir: string, packageName: string): string {\n return path.join(baseDir, 'node_modules', packageName);\n}\n\n// ============================================================\n// Phase 1: Collect all version specs via BFS\n// ============================================================\n\nexport async function collectAllSpecs(\n packages: Package[],\n logger: Logger.Instance,\n configDir?: string,\n): Promise<Map<string, VersionSpec[]>> {\n const allSpecs = new Map<string, VersionSpec[]>();\n const visited = new Set<string>();\n\n interface QueueItem {\n name: string;\n spec: string;\n source: VersionSpec['source'];\n from: string;\n optional: boolean;\n localPath?: string;\n }\n\n const queue: QueueItem[] = packages.map((pkg) => ({\n name: pkg.name,\n spec: pkg.version,\n source: 'direct' as const,\n from: 'flow.json',\n optional: false,\n localPath: pkg.path,\n }));\n\n while (queue.length > 0) {\n const item = queue.shift()!;\n const visitKey = `${item.name}@${item.spec}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\n\n // Record this spec\n if (!allSpecs.has(item.name)) allSpecs.set(item.name, []);\n allSpecs.get(item.name)!.push({\n spec: item.spec,\n source: item.source,\n from: item.from,\n optional: item.optional,\n localPath: item.localPath,\n });\n\n // Resolve transitive deps for local packages by reading package.json\n if (item.localPath) {\n const resolvedPath = path.isAbsolute(item.localPath)\n ? item.localPath\n : path.resolve(configDir || process.cwd(), item.localPath);\n\n // Check if this local path has a package.json (directories only)\n const candidatePath = path.join(resolvedPath, 'package.json');\n const hasPkgJson = await fs.pathExists(candidatePath);\n\n if (hasPkgJson) {\n try {\n const pkgJson = await fs.readJson(candidatePath);\n\n // Queue regular dependencies\n const deps = pkgJson.dependencies || {};\n for (const [depName, depSpec] of Object.entries(deps)) {\n if (typeof depSpec === 'string') {\n queue.push({\n name: depName,\n spec: depSpec,\n source: 'dependency',\n from: item.name,\n optional: false,\n });\n }\n }\n\n // Queue peerDependencies with metadata\n const peerDeps = pkgJson.peerDependencies || {};\n const peerMeta = pkgJson.peerDependenciesMeta || {};\n for (const [depName, depSpec] of Object.entries(peerDeps)) {\n if (typeof depSpec === 'string') {\n const isOptional =\n (peerMeta as Record<string, { optional?: boolean }>)[depName]\n ?.optional === true;\n queue.push({\n name: depName,\n spec: depSpec,\n source: 'peerDependency',\n from: item.name,\n optional: isOptional,\n });\n }\n }\n } catch (error) {\n logger.debug(\n `Failed to read package.json for local package ${item.name}: ${error}`,\n );\n }\n }\n\n continue;\n }\n\n // Fetch manifest from registry\n let manifest: pacote.ManifestResult;\n try {\n manifest = await withTimeout(\n pacote.manifest(`${item.name}@${item.spec}`, PACOTE_OPTS),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Manifest fetch timed out: ${item.name}@${item.spec}`,\n );\n } catch (error) {\n logger.debug(\n `Failed to fetch manifest for ${item.name}@${item.spec}: ${error}`,\n );\n continue;\n }\n\n // Queue regular dependencies\n const m = manifest as unknown as Record<string, unknown>;\n const deps = (m.dependencies as Record<string, string> | undefined) || {};\n for (const [depName, depSpec] of Object.entries(deps)) {\n if (typeof depSpec === 'string') {\n queue.push({\n name: depName,\n spec: depSpec,\n source: 'dependency',\n from: item.name,\n optional: false,\n });\n }\n }\n\n // Queue peerDependencies with metadata\n const peerDeps =\n (m.peerDependencies as Record<string, string> | undefined) || {};\n const peerMeta =\n (m.peerDependenciesMeta as\n | Record<string, { optional?: boolean }>\n | undefined) || {};\n for (const [depName, depSpec] of Object.entries(peerDeps)) {\n if (typeof depSpec === 'string') {\n const isOptional = peerMeta[depName]?.optional === true;\n queue.push({\n name: depName,\n spec: depSpec,\n source: 'peerDependency',\n from: item.name,\n optional: isOptional,\n });\n }\n }\n }\n\n return allSpecs;\n}\n\n// ============================================================\n// Phase 2: Resolve version conflicts\n// ============================================================\n\nconst SOURCE_PRIORITY: Record<VersionSpec['source'], number> = {\n direct: 0,\n dependency: 1,\n peerDependency: 2,\n};\n\nexport function resolveVersionConflicts(\n allSpecs: Map<string, VersionSpec[]>,\n logger: Logger.Instance,\n): Map<string, ResolvedPackage> {\n const resolved = new Map<string, ResolvedPackage>();\n\n for (const [name, specs] of allSpecs) {\n // Local paths always win\n const localSpec = specs.find((s) => s.localPath);\n if (localSpec) {\n resolved.set(name, {\n name,\n version: 'local',\n localPath: localSpec.localPath,\n });\n continue;\n }\n\n // Separate by source\n const nonPeerSpecs = specs.filter((s) => s.source !== 'peerDependency');\n const peerSpecs = specs.filter((s) => s.source === 'peerDependency');\n\n // Determine active specs (what we resolve from)\n let activeSpecs: VersionSpec[];\n if (nonPeerSpecs.length > 0) {\n activeSpecs = nonPeerSpecs;\n } else {\n // Only peerDeps — filter out optional ones\n const requiredPeers = peerSpecs.filter((s) => !s.optional);\n if (requiredPeers.length === 0) {\n logger.debug(`Skipping optional peer dependency: ${name}`);\n continue;\n }\n activeSpecs = requiredPeers;\n }\n\n // Sort by priority (direct first)\n activeSpecs.sort(\n (a, b) => SOURCE_PRIORITY[a.source] - SOURCE_PRIORITY[b.source],\n );\n\n // Direct specs always win — if we have one, use it\n const directSpecs = activeSpecs.filter((s) => s.source === 'direct');\n const directExact = directSpecs.find((s) => semver.valid(s.spec) !== null);\n\n let chosenVersion: string;\n\n if (directExact) {\n // Direct exact version always wins\n chosenVersion = directExact.spec;\n } else if (directSpecs.length > 0) {\n // Direct range/tag — use it\n chosenVersion = directSpecs[0].spec;\n } else {\n // No direct specs — check for conflicts among transitive deps\n const exactVersions = activeSpecs\n .filter((s) => semver.valid(s.spec) !== null)\n .map((s) => s.spec);\n const uniqueExact = [...new Set(exactVersions)];\n\n if (uniqueExact.length > 1) {\n throw new Error(\n `Version conflict for ${name}: ${uniqueExact.join(' vs ')} ` +\n `(from ${activeSpecs.map((s) => `${s.spec} via ${s.from}`).join(', ')})`,\n );\n } else if (uniqueExact.length === 1) {\n chosenVersion = uniqueExact[0];\n } else {\n // All ranges/tags — use the highest-priority spec as-is\n chosenVersion = activeSpecs[0].spec;\n }\n }\n\n // Validate against ALL specs (including peerDeps)\n if (semver.valid(chosenVersion)) {\n for (const spec of specs) {\n if (spec.localPath) continue;\n if (semver.valid(spec.spec)) {\n // Both exact — must match\n if (spec.spec !== chosenVersion) {\n if (spec.source === 'peerDependency') {\n logger.warn(\n `${name}@${chosenVersion} differs from peer constraint ${spec.spec} (from ${spec.from})`,\n );\n }\n }\n } else {\n // Chosen is exact, spec is range — check satisfaction\n if (\n !semver.satisfies(chosenVersion, spec.spec, {\n includePrerelease: true,\n })\n ) {\n if (spec.source === 'peerDependency') {\n logger.warn(\n `${name}@${chosenVersion} may not satisfy peer constraint ${spec.spec} (from ${spec.from})`,\n );\n } else {\n throw new Error(\n `Version conflict: ${name}@${chosenVersion} does not satisfy ` +\n `${spec.spec} required by ${spec.from}`,\n );\n }\n }\n }\n }\n }\n\n resolved.set(name, { name, version: chosenVersion });\n }\n\n return resolved;\n}\n\n// ============================================================\n// Phase 3: Install resolved packages\n// ============================================================\n\nexport async function downloadPackages(\n packages: Package[],\n targetDir: string,\n logger: Logger.Instance,\n useCache = true,\n configDir?: string,\n tmpDir?: string,\n): Promise<Map<string, string>> {\n const packagePaths = new Map<string, string>();\n\n // Track user-specified packages (only these are logged)\n const userSpecifiedPackages = new Set(packages.map((p) => p.name));\n\n // Validate no duplicate packages with different versions in direct list\n validateNoDuplicatePackages(packages);\n\n // Phase 1: Collect all version specs\n logger.debug('Resolving dependencies');\n const allSpecs = await collectAllSpecs(packages, logger, configDir);\n\n // Phase 2: Resolve conflicts\n const resolved = resolveVersionConflicts(allSpecs, logger);\n\n // Phase 3: Install each resolved package exactly once\n await fs.ensureDir(targetDir);\n\n // Track local package paths (to redirect transitive refs to local copies)\n const localPackageMap = new Map<string, string>();\n for (const pkg of packages) {\n if (pkg.path) localPackageMap.set(pkg.name, pkg.path);\n }\n\n for (const [name, pkg] of resolved) {\n // Handle local packages\n if (pkg.localPath || localPackageMap.has(name)) {\n const localPath = pkg.localPath || localPackageMap.get(name)!;\n const localPkg = await resolveLocalPackage(\n name,\n localPath,\n configDir || process.cwd(),\n logger,\n );\n const installedPath = await copyLocalPackage(localPkg, targetDir, logger);\n packagePaths.set(name, installedPath);\n continue;\n }\n\n const packageSpec = `${name}@${pkg.version}`;\n const packageDir = getPackageDirectory(targetDir, name);\n const cachedPath = await getCachedPackagePath(\n { name, version: pkg.version },\n tmpDir,\n );\n\n if (\n useCache &&\n (await isPackageCached({ name, version: pkg.version }, tmpDir))\n ) {\n if (userSpecifiedPackages.has(name)) {\n logger.debug(`Downloading ${packageSpec} (cached)`);\n }\n try {\n await fs.ensureDir(path.dirname(packageDir));\n await fs.copy(cachedPath, packageDir);\n packagePaths.set(name, packageDir);\n continue;\n } catch {\n logger.debug(`Cache miss for ${packageSpec}, downloading fresh`);\n }\n }\n\n try {\n await fs.ensureDir(path.dirname(packageDir));\n const cacheDir =\n process.env.NPM_CACHE_DIR || getTmpPath(tmpDir, 'cache', 'npm');\n await withTimeout(\n pacote.extract(packageSpec, packageDir, {\n ...PACOTE_OPTS,\n cache: cacheDir,\n }),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Package download timed out after ${PACKAGE_DOWNLOAD_TIMEOUT_MS / 1000}s: ${packageSpec}`,\n );\n\n if (userSpecifiedPackages.has(name)) {\n logger.debug(`Downloading ${packageSpec}`);\n }\n\n // Cache for future use\n if (useCache) {\n try {\n await fs.ensureDir(path.dirname(cachedPath));\n await fs.copy(packageDir, cachedPath);\n } catch {\n // Silent cache failures\n }\n }\n\n packagePaths.set(name, packageDir);\n } catch (error) {\n throw new Error(`Failed to download ${packageSpec}: ${error}`);\n }\n }\n\n return packagePaths;\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\nasync function getCachedPackagePath(\n pkg: { name: string; version: string },\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: { name: string; version: string },\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 for (const pkg of packages) {\n if (!packageMap.has(pkg.name)) packageMap.set(pkg.name, []);\n packageMap.get(pkg.name)!.push(pkg.version);\n }\n\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 * 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 { getHashServer } from '@walkeros/server-core';\nimport { getFlowSettingsCacheKey } 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 getFlowSettingsCacheKey(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/**\n * Get the cache file path for compiled code (code-only esbuild output).\n * Uses content-based hashing only (no date component) since code is\n * deterministic for the same packages + esbuild options.\n */\nexport async function getCodeCachePath(\n codeContent: string,\n tmpDir?: string,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'code');\n const cacheKey = await getHashServer(codeContent, 12);\n return path.join(cacheDir, `${cacheKey}.js`);\n}\n\nexport async function isCodeCached(\n codeContent: string,\n tmpDir?: string,\n): Promise<boolean> {\n const cachePath = await getCodeCachePath(codeContent, tmpDir);\n return fs.pathExists(cachePath);\n}\n\nexport async function cacheCode(\n codeContent: string,\n codeOutput: string,\n tmpDir?: string,\n): Promise<void> {\n const cachePath = await getCodeCachePath(codeContent, tmpDir);\n await fs.ensureDir(path.dirname(cachePath));\n await fs.writeFile(cachePath, codeOutput, 'utf-8');\n}\n\nexport async function getCachedCode(\n codeContent: string,\n tmpDir?: string,\n): Promise<string | null> {\n const cachePath = await getCodeCachePath(codeContent, tmpDir);\n if (await fs.pathExists(cachePath)) {\n return fs.readFile(cachePath, 'utf-8');\n }\n return null;\n}\n\n/**\n * Write compiled code to a .mjs file on disk and return the path.\n * Used by the two-stage bundler so stage 2 esbuild can import from stage 1 output.\n * Content-addressed: same code content always maps to the same file path.\n */\nexport async function ensureCodeOnDisk(\n codeContent: string,\n compiledCode: string,\n tmpDir?: string,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'code');\n const cacheKey = await getHashServer(codeContent, 12);\n const cachePath = path.join(cacheDir, `${cacheKey}.mjs`);\n\n if (!(await fs.pathExists(cachePath))) {\n await fs.ensureDir(path.dirname(cachePath));\n await fs.writeFile(cachePath, compiledCode, 'utf-8');\n }\n\n return cachePath;\n}\n","import crypto from 'crypto';\nimport esbuild from 'esbuild';\nimport { builtinModules } from 'module';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { packageNameToVariable, ENV_MARKER_PREFIX } from '@walkeros/core';\nimport {\n classifyStepProperties,\n containsCodeMarkers,\n} from './config-classifier.js';\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 hasCodeReference(code: unknown): boolean {\n return isInlineCode(code) || typeof code === 'string';\n}\n\nfunction validateReference(\n type: string,\n name: string,\n ref: { package?: string; code?: unknown },\n): void {\n const hasPackage = !!ref.package;\n const hasInlineCode = isInlineCode(ref.code);\n const hasCode = hasCodeReference(ref.code);\n\n // Inline code object + package is invalid (ambiguous)\n if (hasPackage && hasInlineCode) {\n throw new Error(\n `${type} \"${name}\": Cannot specify both package and code. Use one or the other.`,\n );\n }\n // String code + package is valid (named import from package)\n // Neither package nor code is invalid\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 getCachedCode,\n cacheCode,\n ensureCodeOnDisk,\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 flowSettings: Flow.Settings,\n buildOptions: BuildOptions,\n): string {\n const configForCache = {\n flow: flowSettings,\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 flowSettings: Flow.Settings,\n logger: Logger.Instance,\n): boolean {\n let hasDeprecatedCodeTrue = false;\n\n // Check sources for code: true (deprecated, removed from types)\n const sources = flowSettings.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 = flowSettings.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 = flowSettings.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 flowSettings: Flow.Settings,\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(flowSettings, logger);\n if (hasDeprecatedFeatures) {\n logger.warn('Skipping deprecated code: true entries from bundle.');\n }\n\n // Per-build isolation: unique working dir, shared cache\n const buildId = crypto.randomUUID();\n const TEMP_DIR =\n buildOptions.tempDir || getTmpPath(undefined, `walkeros-build-${buildId}`);\n const CACHE_DIR = buildOptions.tempDir || getTmpPath();\n\n // Check build cache if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowSettings, buildOptions);\n\n const cached = await isBuildCached(configContent, CACHE_DIR);\n if (cached) {\n const cachedBuild = await getCachedBuild(configContent, CACHE_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 (flowSettings as unknown as { sources?: Record<string, unknown> })\n .sources || {},\n ).length > 0 ||\n Object.keys(\n (flowSettings 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 1.6: Auto-add step packages (sources, destinations, transformers, stores)\n const stepPackages = collectAllStepPackages(flowSettings);\n for (const pkg of stepPackages) {\n const isLocalPath = pkg.startsWith('.') || pkg.startsWith('/');\n\n if (isLocalPath) {\n // Normalize: convert path-based package: to packages section entry\n // This reuses the existing local-path import machinery\n const varName = packageNameToVariable(pkg);\n if (!buildOptions.packages[varName]) {\n buildOptions.packages[varName] = {\n path: pkg,\n imports: [`default as ${varName}`],\n };\n }\n\n // Rewrite all components that reference this path to use code: instead\n for (const section of ['sources', 'destinations', 'transformers', 'stores'] as const) {\n const steps = (flowSettings as Record<string, Record<string, Record<string, unknown>>>)[section];\n if (!steps) continue;\n for (const step of Object.values(steps)) {\n if (step.package === pkg) {\n step.code = varName;\n delete step.package;\n }\n }\n }\n } else if (!buildOptions.packages[pkg]) {\n buildOptions.packages[pkg] = {};\n }\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 CACHE_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 split entry point (code skeleton + data payload)\n logger.debug('Creating entry point');\n const { codeEntry, dataPayload, hasFlow } = await createEntryPoint(\n flowSettings,\n buildOptions,\n packagePaths,\n );\n\n const outputPath = path.resolve(buildOptions.output);\n\n // Ensure output directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n // === LEVEL 2: Two-phase build (code cache) ===\n // Check if we have a cached compilation of this exact code entry\n let compiledCode: string | null = null;\n if (buildOptions.cache !== false) {\n compiledCode = await getCachedCode(codeEntry, CACHE_DIR);\n }\n\n if (compiledCode) {\n logger.debug('Using cached compiled code (config-only change)');\n } else {\n // Cache miss: run esbuild on code-only entry\n logger.debug(\n `Running esbuild (target: ${buildOptions.target || 'es2018'}, format: ${buildOptions.format})`,\n );\n const entryPath = path.join(TEMP_DIR, 'entry.js');\n await fs.writeFile(entryPath, codeEntry);\n\n // minify: false — keep identifiers readable for debugging.\n // Stage 2 esbuild (in generateServerEntry/generateWebEntry) handles\n // final bundling with proper import resolution, so minification here\n // is unnecessary.\n const esbuildOptions = createEsbuildOptions(\n { ...buildOptions, minify: false },\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 compiledCode = await fs.readFile(outputPath, 'utf-8');\n\n // Cache the compiled code for future builds\n if (buildOptions.cache !== false) {\n await cacheCode(codeEntry, compiledCode, CACHE_DIR);\n }\n }\n\n // Write stage 1 output to cache as importable .mjs file\n const stage1Path = await ensureCodeOnDisk(\n codeEntry,\n compiledCode,\n CACHE_DIR,\n );\n\n if (buildOptions.skipWrapper || !hasFlow) {\n // Simulation path or no-flow path: concatenate code + data (no wrapper, no stage 2 esbuild)\n const dataDeclaration = `const __configData = ${dataPayload};\\nexport { __configData };`;\n // For node platform, prepend createRequire banner (stage 1 no longer adds it)\n const banner =\n buildOptions.platform === 'node'\n ? `import { createRequire } from 'module';const require = createRequire(import.meta.url);\\n`\n : '';\n const esmOutput = `${banner}${compiledCode}\\n${dataDeclaration}`;\n await fs.writeFile(outputPath, esmOutput);\n } else {\n // Production path: stage 2 esbuild compilation\n const stage2Entry =\n (buildOptions.platform || 'node') === 'browser'\n ? generateWebEntry(stage1Path, dataPayload, {\n windowCollector: buildOptions.windowCollector,\n windowElb: buildOptions.windowElb,\n })\n : generateServerEntry(stage1Path, dataPayload);\n\n const stage2EntryPath = path.join(TEMP_DIR, 'stage2.mjs');\n await fs.writeFile(stage2EntryPath, stage2Entry);\n\n // Stage 2 esbuild: resolve imports, inline stage 1, minify\n const stage2Options: esbuild.BuildOptions = {\n entryPoints: [stage2EntryPath],\n bundle: true,\n format: 'esm',\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\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 charset: 'utf8',\n }),\n };\n\n // Platform-specific stage 2 options\n if (buildOptions.platform === 'browser') {\n stage2Options.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n stage2Options.target = buildOptions.target || 'es2018';\n } else {\n stage2Options.external = getNodeExternals();\n stage2Options.banner = {\n js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`,\n };\n stage2Options.target = buildOptions.target || 'node18';\n }\n\n try {\n await esbuild.build(stage2Options);\n } finally {\n await esbuild.stop();\n }\n }\n\n // Get file size and calculate build time\n const outputStats = await fs.stat(outputPath);\n const sizeKB = (outputStats.size / 1024).toFixed(1);\n const buildTime = ((Date.now() - bundleStartTime) / 1000).toFixed(1);\n logger.info(`Output: ${outputPath} (${sizeKB} KB, ${buildTime}s)`);\n\n // Cache the full build result if caching is enabled (Level 1 fast path)\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowSettings, buildOptions);\n const buildOutput = await fs.readFile(outputPath, 'utf-8');\n await cacheBuild(configContent, buildOutput, CACHE_DIR);\n logger.debug('Build cached for future use');\n }\n\n // Collect stats if requested\n let stats: BundleStats | undefined;\n if (showStats) {\n stats = await collectBundleStats(\n outputPath,\n buildOptions.packages,\n bundleStartTime,\n codeEntry,\n );\n }\n\n // 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 return stats;\n } catch (error) {\n throw error;\n } finally {\n // Clean up per-build directory (contains entry.js with potential secrets)\n if (!buildOptions.tempDir) {\n fs.remove(TEMP_DIR).catch(() => {});\n }\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: 'esm' as esbuild.Format, // Always ESM — platform wrapper handles final 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 // Only Node.js built-ins are external — everything else gets bundled.\n // This makes server bundles self-contained (no node_modules needed at runtime).\n const nodeExternals = getNodeExternals();\n baseOptions.external = buildOptions.external\n ? [...nodeExternals, ...buildOptions.external]\n : nodeExternals;\n\n // createRequire shim is added in stage 2, not here.\n // Stage 1 produces importable ESM; stage 2 wraps it with the banner.\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 */\n/**\n * Detects packages from a flow config section (sources, destinations, transformers, stores).\n * Extracts package names from steps that have an explicit 'package' field.\n * Skips steps with code: true (inline code).\n */\nexport function detectStepPackages(\n flowSettings: Flow.Settings,\n section: 'sources' | 'destinations' | 'transformers' | 'stores',\n): Set<string> {\n const packages = new Set<string>();\n const steps = (\n flowSettings as unknown as {\n [key: string]: Record<string, unknown> | undefined;\n }\n )[section];\n\n if (steps) {\n for (const [, stepConfig] of Object.entries(steps)) {\n if (typeof stepConfig !== 'object' || stepConfig === null) continue;\n // Skip if code: true (uses built-in inline code)\n if ('code' in stepConfig && stepConfig.code === true) continue;\n // Require explicit package field\n if ('package' in stepConfig && typeof stepConfig.package === 'string') {\n packages.add(stepConfig.package);\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Get the complete list of Node.js built-in modules for esbuild external config.\n * Includes bare names, node: prefixed, and subpath patterns.\n * Only Node builtins — no npm packages.\n */\nexport function getNodeExternals(): string[] {\n const externals: string[] = [];\n for (const mod of builtinModules) {\n if (mod.startsWith('_')) continue; // Skip internal modules\n externals.push(mod, `node:${mod}`, `${mod}/*`, `node:${mod}/*`);\n }\n return externals;\n}\n\n/**\n * Collects all package names declared in flow steps.\n * Returns both npm packages and local paths — caller handles routing.\n */\nexport function collectAllStepPackages(\n flowSettings: Flow.Settings,\n): Set<string> {\n const allPackages = new Set<string>();\n const sections = [\n 'sources',\n 'destinations',\n 'transformers',\n 'stores',\n ] as const;\n\n for (const section of sections) {\n for (const pkg of detectStepPackages(flowSettings, section)) {\n allPackages.add(pkg);\n }\n }\n\n return allPackages;\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 flowSettings: Flow.Settings,\n): Map<string, Set<string>> {\n const explicitCodeImports = new Map<string, Set<string>>();\n\n // Check destinations\n const destinations = (\n flowSettings 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 flowSettings 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 flowSettings 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 = (\n flowSettings 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 flowSettings: Flow.Settings,\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: flowSettings.sources || {},\n destinations: flowSettings.destinations || {},\n transformers: flowSettings.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 flowSettings: Flow.Settings,\n buildOptions: BuildOptions,\n packagePaths: Map<string, string>,\n): Promise<{ codeEntry: string; dataPayload: string; hasFlow: boolean }> {\n // Detect packages used by all step types\n const sourcePackages = detectStepPackages(flowSettings, 'sources');\n const destinationPackages = detectStepPackages(flowSettings, 'destinations');\n const transformerPackages = detectStepPackages(flowSettings, 'transformers');\n const storePackages = detectStepPackages(flowSettings, 'stores');\n const explicitCodeImports = detectExplicitCodeImports(flowSettings);\n\n // Validate $store: references before code generation\n const storeIds = new Set(\n Object.keys(\n (flowSettings as unknown as { stores?: Record<string, unknown> })\n .stores || {},\n ),\n );\n validateStoreReferences(flowSettings, storeIds);\n\n // Validate component names are valid JS identifiers (they become property names in generated code)\n const flowWithSections = flowSettings 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(flowSettings.sources || {}).some(\n (s) => s.package || hasCodeReference(s.code),\n ) ||\n Object.values(flowSettings.destinations || {}).some(\n (d) => d.package || hasCodeReference(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 {\n codeEntry: importsCode ? `${importsCode}\\n\\n${userCode}` : userCode,\n dataPayload: '{}',\n hasFlow: false,\n };\n }\n\n // Build split config object (code skeleton + data payload)\n const { storesDeclaration, codeConfigObject, dataPayload } =\n buildSplitConfigObject(flowSettings, explicitCodeImports);\n\n // Generate platform-agnostic wireConfig module with __data parameter\n const wireConfigModule = generateSplitWireConfigModule(\n storesDeclaration,\n codeConfigObject,\n buildOptions.code || '',\n );\n\n // Return ESM module (imports + wireConfig + startFlow re-export)\n const codeEntry = importsCode\n ? `${importsCode}\\n\\n${wireConfigModule}`\n : wireConfigModule;\n\n return { codeEntry, dataPayload, hasFlow: true };\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 split config object from flow configuration.\n * Produces TWO outputs:\n * - codeConfigObject: skeleton with code references and __data.* placeholders\n * - dataPayload: plain JSON-serializable object with settings, mappings, etc.\n *\n * Inline code steps bypass classification and go entirely to the code skeleton.\n * Package-based steps are split via classifyStepProperties.\n */\nexport function buildSplitConfigObject(\n flowSettings: Flow.Settings,\n explicitCodeImports: Map<string, Set<string>>,\n): {\n storesDeclaration: string;\n codeConfigObject: string;\n dataPayload: string;\n} {\n const flowWithProps = flowSettings as unknown as {\n sources?: Record<\n string,\n {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n before?: string | string[];\n next?: string | string[] | Array<{ match: unknown; next: unknown }>;\n cache?: unknown;\n primary?: boolean;\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 next?: string | string[];\n cache?: unknown;\n }\n >;\n transformers?: Record<\n string,\n {\n package?: string;\n code?: string | true;\n config?: unknown;\n env?: unknown;\n before?: string | string[];\n next?: string;\n cache?: unknown;\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 // Data payload accumulator\n const dataPayloadObj: Record<string, Record<string, unknown>> = {};\n\n // Helper to resolve the code variable for a package-based step\n function resolveCodeVar(step: {\n package?: string;\n code?: string | true;\n }): string {\n // String code without package = named import from packages section\n if (step.code && typeof step.code === 'string' && !step.package) {\n return step.code;\n }\n if (\n step.code &&\n typeof step.code === 'string' &&\n step.package &&\n explicitCodeImports.has(step.package)\n ) {\n return step.code;\n }\n return packageNameToVariable(step.package!);\n }\n\n // Helper to build step properties (excluding 'code' and 'package')\n function getStepProps(\n step: Record<string, unknown>,\n ): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(step)) {\n if (key === 'code' || key === 'package') continue;\n if (value !== undefined && value !== null) {\n props[key] = value;\n }\n }\n return props;\n }\n\n // Helper to build a split step entry for the code skeleton\n function buildSplitStepEntry(\n section: string,\n stepId: string,\n step: Record<string, unknown>,\n ): string {\n const codeVar = resolveCodeVar(\n step as { package?: string; code?: string | true },\n );\n const stepProps = getStepProps(step);\n const { codeProps, dataProps } = classifyStepProperties(stepProps);\n\n const codeEntries: string[] = [];\n codeEntries.push(`code: ${codeVar}`);\n\n // Code-layer props (serialized with processConfigValue)\n for (const [key, value] of Object.entries(codeProps)) {\n if (key === 'code') continue; // already handled above\n codeEntries.push(`${key}: ${processConfigValue(value)}`);\n }\n\n // Data-layer prop references\n for (const key of Object.keys(dataProps)) {\n codeEntries.push(`${key}: __data.${section}.${stepId}.${key}`);\n }\n\n // Accumulate data payload\n if (Object.keys(dataProps).length > 0) {\n if (!dataPayloadObj[section]) dataPayloadObj[section] = {};\n dataPayloadObj[section][stepId] = dataProps;\n }\n\n return ` ${stepId}: {\\n ${codeEntries.join(',\\n ')}\\n }`;\n }\n\n // Validate references (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 Object.entries(destinations).forEach(([name, dest]) => {\n if ((dest.code as unknown) !== true) {\n validateReference('Destination', name, dest);\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\n const sourcesEntries = Object.entries(sources)\n .filter(\n ([, source]) =>\n (source.code as unknown) !== true &&\n (source.package || hasCodeReference(source.code)),\n )\n .map(([key, source]) => {\n if (isInlineCode(source.code)) {\n return ` ${key}: ${generateInlineCode(source.code, (source.config as object) || {}, source.env as object, source.next as string | string[] | undefined, 'next')}`;\n }\n return buildSplitStepEntry(\n 'sources',\n key,\n source as Record<string, unknown>,\n );\n });\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations)\n .filter(\n ([, dest]) =>\n (dest.code as unknown) !== true &&\n (dest.package || hasCodeReference(dest.code)),\n )\n .map(([key, dest]) => {\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 return buildSplitStepEntry(\n 'destinations',\n key,\n dest as Record<string, unknown>,\n );\n });\n\n // Build transformers\n const transformersEntries = Object.entries(transformers)\n .filter(\n ([, transformer]) =>\n (transformer.code as unknown) !== true &&\n (transformer.package || hasCodeReference(transformer.code)),\n )\n .map(([key, transformer]) => {\n if (isInlineCode(transformer.code)) {\n return ` ${key}: ${generateInlineCode(transformer.code, (transformer.config as object) || {}, transformer.env as object, transformer.next, 'next')}`;\n }\n return buildSplitStepEntry(\n 'transformers',\n key,\n transformer as Record<string, unknown>,\n );\n });\n\n // Build stores\n Object.entries(stores).forEach(([name, store]) => {\n if (store.package || hasCodeReference(store.code)) {\n validateReference('Store', name, store);\n }\n });\n\n const storesEntries = Object.entries(stores)\n .filter(([, store]) => store.package || hasCodeReference(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 const codeVar = resolveCodeVar(store);\n const storeProps = getStepProps(store as Record<string, unknown>);\n const { codeProps, dataProps } = classifyStepProperties(storeProps);\n\n const codeEntries: string[] = [];\n codeEntries.push(`code: ${codeVar}`);\n\n for (const [propKey, value] of Object.entries(codeProps)) {\n if (propKey === 'code') continue;\n codeEntries.push(`${propKey}: ${processConfigValue(value)}`);\n }\n\n for (const propKey of Object.keys(dataProps)) {\n codeEntries.push(`${propKey}: __data.stores.${key}.${propKey}`);\n }\n\n if (Object.keys(dataProps).length > 0) {\n if (!dataPayloadObj['stores']) dataPayloadObj['stores'] = {};\n dataPayloadObj['stores'][key] = dataProps;\n }\n\n return ` ${key}: {\\n ${codeEntries.join(',\\n ')}\\n }`;\n });\n\n // Build stores declaration\n const storesDeclaration =\n storesEntries.length > 0\n ? `const stores = {\\n${storesEntries.join(',\\n')}\\n};`\n : 'const stores = {};';\n\n // Build collector\n let collectorStr = '';\n if (flowWithProps.collector) {\n if (containsCodeMarkers(flowWithProps.collector)) {\n // Collector has code markers — keep in code skeleton\n collectorStr = `,\\n ...${processConfigValue(flowWithProps.collector)}`;\n } else {\n // Plain collector — put in data payload\n dataPayloadObj['collector'] = flowWithProps.collector as Record<\n string,\n unknown\n >;\n collectorStr = `,\\n ...__data.collector`;\n }\n }\n\n // Build transformers section\n const transformersStr =\n transformersEntries.length > 0\n ? `,\\n transformers: {\\n${transformersEntries.join(',\\n')}\\n }`\n : '';\n\n const codeConfigObject = `{\n sources: {\n${sourcesEntries.join(',\\n')}\n },\n destinations: {\n${destinationsEntries.join(',\\n')}\n }${transformersStr},\n stores${collectorStr}\n}`;\n\n const dataPayload = JSON.stringify(dataPayloadObj, null, 2);\n\n return { storesDeclaration, codeConfigObject, dataPayload };\n}\n\n/**\n * Generate platform-agnostic ESM module with wireConfig(__data) and startFlow re-export.\n * This is the split variant — code skeleton receives data payload at runtime.\n */\nexport function generateSplitWireConfigModule(\n storesDeclaration: string,\n codeConfigObject: string,\n userCode: string,\n): string {\n const codeSection = userCode ? `\\n${userCode}\\n` : '';\n\n return `export function wireConfig(__data) {\n ${storesDeclaration}\n\n const config = ${codeConfigObject};${codeSection}\n\n return config;\n}\n\nexport { startFlow };`;\n}\n\n/**\n * Generate a stage 2 entry file for server bundles.\n * Imports startFlow and wireConfig from the stage 1 .mjs file,\n * embeds the data payload, and exports a factory function.\n */\nexport function generateServerEntry(\n stage1Path: string,\n dataPayload: string,\n): string {\n return `import { startFlow, wireConfig } from '${stage1Path}';\n\nconst __configData = ${dataPayload};\n\nexport default async function(context = {}) {\n const config = wireConfig(__configData);\n\n if (context.logger) config.logger = context.logger;\n\n if (context.sourceSettings && config.sources) {\n for (const src of Object.values(config.sources)) {\n if (src.config?.settings) {\n src.config.settings = { ...src.config.settings, ...context.sourceSettings };\n }\n }\n }\n\n const result = await startFlow(config);\n\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/**\n * Generate a stage 2 entry file for web/browser bundles.\n * Imports startFlow and wireConfig from the stage 1 .mjs file,\n * embeds the data payload, and wraps in an async IIFE with window assignments.\n */\nexport function generateWebEntry(\n stage1Path: string,\n dataPayload: string,\n options: { windowCollector?: string; windowElb?: string } = {},\n): string {\n const assignments: string[] = [];\n if (options.windowCollector) {\n assignments.push(\n ` if (typeof window !== 'undefined') window['${options.windowCollector}'] = collector;`,\n );\n }\n if (options.windowElb) {\n assignments.push(\n ` if (typeof window !== 'undefined') window['${options.windowElb}'] = elb;`,\n );\n }\n const assignmentCode =\n assignments.length > 0 ? '\\n' + assignments.join('\\n') : '';\n\n return `import { startFlow, wireConfig } from '${stage1Path}';\n\nconst __configData = ${dataPayload};\n\n(async () => {\n const { collector, elb } = await startFlow(wireConfig(__configData));${assignmentCode}\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 * 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 } from './auth.js';\nimport { resolveAppUrl } from '../lib/config-file.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: resolveAppUrl(),\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","/**\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 flowSettings,\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 flowSettings,\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(flowSettings);\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();\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();\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.Config) 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.Config 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.Config format\n const { flowSettings, 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 flowSettings,\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","import type { Flow } from '@walkeros/core';\nimport { resolvePackageImportPath } from '../../core/package-path.js';\n\ninterface 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 * @param packages - Flow config packages map for local path resolution\n * @param configDir - Directory of the flow config file\n * @returns Map of destination key to env object\n */\nexport async function loadDestinationEnvs(\n destinations: Record<string, unknown>,\n packages?: Flow.Packages,\n configDir?: string,\n): Promise<Record<string, DestinationEnv>> {\n const envs: Record<string, DestinationEnv> = {};\n const resolveDir = configDir || process.cwd();\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 using package resolver\n const packageName = typedConfig.package;\n const isDemoPackage = packageName.includes('-demo');\n const importPath = isDemoPackage\n ? resolvePackageImportPath(packageName, packages, resolveDir)\n : resolvePackageImportPath(packageName, packages, resolveDir, '/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 {\n existsSync,\n mkdirSync,\n copyFileSync,\n writeFileSync,\n readFileSync,\n} from 'fs';\nimport { join } from 'path';\n\ninterface CacheMeta {\n version: string;\n timestamp: number;\n}\n\nexport function writeCache(\n cacheDir: string,\n bundlePath: string,\n configContent: string,\n version: string,\n): void {\n mkdirSync(cacheDir, { recursive: true });\n copyFileSync(bundlePath, join(cacheDir, 'bundle.mjs'));\n writeFileSync(join(cacheDir, 'config.json'), configContent, 'utf-8');\n const meta: CacheMeta = { version, timestamp: Date.now() };\n writeFileSync(join(cacheDir, 'meta.json'), JSON.stringify(meta), 'utf-8');\n}\n\nexport function readCache(\n cacheDir: string,\n): { bundlePath: string; version: string } | null {\n try {\n const metaPath = join(cacheDir, 'meta.json');\n const bundlePath = join(cacheDir, 'bundle.mjs');\n if (!existsSync(metaPath) || !existsSync(bundlePath)) return null;\n const meta: CacheMeta = JSON.parse(readFileSync(metaPath, 'utf-8'));\n return { bundlePath, version: meta.version };\n } catch {\n return null;\n }\n}\n\nexport function readCacheConfig(cacheDir: string): string | null {\n try {\n const configPath = join(cacheDir, 'config.json');\n if (!existsSync(configPath)) return null;\n return readFileSync(configPath, 'utf-8');\n } catch {\n return null;\n }\n}\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 Object with bundlePath and cleanup function to remove temp directory\n */\nexport async function prepareBundleForRun(\n configPath: string,\n options: {\n verbose?: boolean;\n silent?: boolean;\n flowName?: string;\n },\n): Promise<{ bundlePath: string; cleanup: () => Promise<void> }> {\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 {\n bundlePath: tempPath,\n cleanup: async () => {\n await fs.remove(tempDir);\n },\n };\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","// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand } from './commands/bundle/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';\nexport { feedbackCommand } from './commands/feedback/index.js';\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle, bundleRemote } from './commands/bundle/index.js';\nexport {\n push,\n simulateSource,\n simulateTransformer,\n simulateDestination,\n} from './commands/push/index.js';\nexport type {\n SimulateSourceOptions,\n SimulateTransformerOptions,\n SimulateDestinationOptions,\n} from './commands/push/index.js';\nexport { run } from './commands/run/index.js';\nexport { validate } from './commands/validate/index.js';\nexport { getToken, getAuthHeaders, requireProjectId } from './core/auth.js';\nexport {\n apiFetch,\n publicFetch,\n deployFetch,\n mergeAuthHeaders,\n} from './core/http.js';\nexport { createApiClient } from './core/api-client.js';\nexport { ApiError, throwApiError } from './core/api-error.js';\nexport type { ApiErrorDetail } from './core/api-error.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 { feedback } from './commands/feedback/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 { FeedbackOptions } from './commands/feedback/index.js';\nexport { readConfig, writeConfig } from './lib/config-file.js';\nexport type { WalkerOSConfig } from './lib/config-file.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 { loadConfig, 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.Config and Flow.Settings 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 { 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","import path from 'path';\nimport fs from 'fs-extra';\nimport {\n createIngest,\n getPlatform,\n compileNext,\n resolveNext,\n isRouteArray,\n buildCacheContext,\n} from '@walkeros/core';\nimport {\n transformerInit,\n transformerPush,\n runTransformerChain,\n walkChain,\n extractTransformerNextMap,\n wrapEnv,\n} from '@walkeros/collector';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n detectInput,\n isStdinPiped,\n readStdinToTempFile,\n writeResult,\n type Platform,\n} from '../../core/index.js';\n\nimport type { Logger, WalkerOS } from '@walkeros/core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadFlowConfig, loadJsonFromSource } from '../../config/index.js';\nimport { loadConfig } from '../../config/utils.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport type { NetworkCall, PushCommandOptions, PushResult } from './types.js';\nimport type { PushOptions } from '../../schemas/push.js';\nimport { buildOverrides, type PushOverrides } from './overrides.js';\nimport { applyOverrides } from './apply-overrides.js';\nimport { resolvePackageImportPath } from '../../core/package-path.js';\nimport { withFlowContext } from './flow-context.js';\nimport { prepareFlow } from './prepare.js';\nimport { schemas } from '@walkeros/core/dev';\n\n/**\n * Resolve a before chain config to an ordered array of transformer IDs.\n * Handles both static (string/string[]) and conditional (Route[]) chains,\n * matching the pattern used by source.ts in the collector.\n */\nfunction resolveBeforeChain(\n before: unknown,\n transformers: import('@walkeros/core').Transformer.Transformers,\n ingest?: import('@walkeros/core').Ingest,\n event?: WalkerOS.DeepPartialEvent,\n): string[] {\n if (!before) return [];\n\n const next = before as import('@walkeros/core').Transformer.Next;\n\n if (isRouteArray(next)) {\n const compiled = compileNext(next);\n const resolved = resolveNext(compiled!, buildCacheContext(ingest, event));\n if (!resolved) return [];\n return walkChain(resolved, extractTransformerNextMap(transformers));\n }\n\n return walkChain(\n next as string | string[],\n extractTransformerNextMap(transformers),\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 mock?: string[];\n snapshot?: 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 // 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 // Load snapshot code if provided\n let snapshotCode: string | undefined;\n if (options.snapshot) {\n snapshotCode = (await loadConfig(options.snapshot, {\n json: false,\n })) as string;\n logger.debug(`Snapshot loaded (${snapshotCode.length} bytes)`);\n }\n\n if (detected.type === 'config') {\n result = await executeConfigPush(\n {\n config: inputPath,\n flow: options.flow,\n verbose: options.verbose,\n mock: options.mock,\n } as PushCommandOptions,\n event as Record<string, unknown>,\n logger,\n (dir) => {\n tempDir = dir;\n },\n snapshotCode,\n );\n } else {\n result = await executeBundlePush(\n detected.content,\n detected.platform,\n event as Record<string, unknown>,\n logger,\n (dir) => {\n tempDir = dir;\n },\n undefined,\n snapshotCode,\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 config = await readStdinToTempFile('push');\n } else {\n config = options.config || 'bundle.config.json';\n }\n\n // Resolve string event inputs\n let resolvedEvent: unknown = options.event;\n if (typeof options.event === 'string') {\n resolvedEvent = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n }\n\n // Route to typed function based on --simulate flag\n const simulateFlag = options.simulate?.[0];\n let result: PushResult;\n\n if (simulateFlag?.startsWith('source.')) {\n result = await simulateSource(config, resolvedEvent, {\n sourceId: simulateFlag.replace('source.', ''),\n flow: options.flow,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n });\n } else if (simulateFlag?.startsWith('transformer.')) {\n result = await simulateTransformer(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n transformerId: simulateFlag.replace('transformer.', ''),\n flow: options.flow,\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n },\n );\n } else if (simulateFlag?.startsWith('destination.')) {\n result = await simulateDestination(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n destinationId: simulateFlag.replace('destination.', ''),\n flow: options.flow,\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n },\n );\n } else {\n result = await push(config, resolvedEvent, {\n flow: options.flow,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n platform: options.platform as Platform | undefined,\n mock: options.mock,\n snapshot: options.snapshot,\n });\n }\n\n const duration = Date.now() - startTime;\n\n // Format result\n let output: string;\n if (options.json) {\n output = JSON.stringify({ ...result, duration }, null, 2);\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 & {\n flow?: string;\n platform?: Platform;\n mock?: string[];\n snapshot?: string;\n } = {},\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 // Validate with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return {\n success: false,\n duration: 0,\n error: `Invalid event: ${parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join(', ')}`,\n };\n }\n\n return pushCore(configOrPath, event, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n silent: options.silent ?? false,\n flow: options.flow,\n platform: options.platform,\n mock: options.mock,\n snapshot: options.snapshot,\n });\n}\n\n/**\n * Execute push from config JSON (existing behavior)\n */\nasync function executeConfigPush(\n options: PushCommandOptions,\n validatedEvent: Record<string, unknown>,\n logger: Logger.Instance,\n setTempDir: (dir: string) => void,\n snapshotCode?: string,\n): Promise<PushResult> {\n // Load config\n logger.debug('Loading flow configuration');\n const { flowSettings, buildOptions } = await loadFlowConfig(options.config!, {\n flowName: options.flow,\n logger,\n });\n\n const platform = getPlatform(flowSettings);\n\n // Build overrides from --mock flags (simulate is handled upstream in push())\n const overrides = buildOverrides(\n { mock: options.mock },\n flowSettings,\n );\n\n // Auto-load destination /dev envs for simulated/mocked destinations\n if (overrides.destinations) {\n const { loadDestinationEnvs } = await import('./env-loader.js');\n const configDir = buildOptions.configDir || process.cwd();\n const envs = await loadDestinationEnvs(\n flowSettings.destinations ?? {},\n flowSettings.packages,\n configDir,\n );\n for (const [destId, env] of Object.entries(envs)) {\n if (overrides.destinations[destId] && env.push) {\n overrides.destinations[destId].env = env.push;\n if (env.simulation && env.simulation.length > 0) {\n overrides.destinations[destId].simulation = env.simulation;\n }\n }\n }\n }\n\n // Bundle to temp file\n logger.debug('Bundling flow configuration');\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(tempDir, 'bundle.mjs');\n\n const pushBuildOptions = {\n ...buildOptions,\n output: tempPath,\n format: 'esm' as const,\n platform: platform === 'web' ? ('browser' as const) : ('node' as const),\n skipWrapper: true, // CLI imports ESM directly — no platform wrapper\n };\n\n await bundleCore(flowSettings, pushBuildOptions, logger, false);\n\n logger.debug(`Bundle created: ${tempPath}`);\n\n logger.debug(\n `Executing in ${platform} environment (${platform === 'web' ? 'JSDOM' : 'Node.js'})`,\n );\n\n return executeDestinationPush(\n tempPath,\n validatedEvent as WalkerOS.DeepPartialEvent,\n logger,\n platform,\n overrides,\n snapshotCode,\n platform === 'server' ? 60000 : undefined,\n );\n}\n\n/**\n * Execute push from pre-built bundle\n */\nasync function executeBundlePush(\n bundleContent: string,\n platform: Platform,\n validatedEvent: Record<string, unknown>,\n logger: Logger.Instance,\n setTempDir: (dir: string) => void,\n overrides: PushOverrides = {},\n snapshotCode?: string,\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(tempDir, 'bundle.mjs');\n await fs.writeFile(tempPath, bundleContent, 'utf8');\n\n logger.debug(`Bundle written to: ${tempPath}`);\n\n // Execute destination push\n logger.debug(\n `Executing in ${platform} environment (${platform === 'web' ? 'JSDOM' : 'Node.js'})`,\n );\n return executeDestinationPush(\n tempPath,\n validatedEvent as WalkerOS.DeepPartialEvent,\n logger,\n platform,\n overrides,\n snapshotCode,\n platform === 'server' ? 60000 : undefined,\n );\n}\n\n/**\n * Execute non-simulated destination push (full pipeline).\n * Uses withFlowContext for environment setup and cleanup.\n */\nasync function executeDestinationPush(\n esmPath: string,\n event: WalkerOS.DeepPartialEvent,\n logger: Logger.Instance,\n platform: 'web' | 'server',\n overrides?: PushOverrides,\n snapshotCode?: string,\n timeout?: number,\n): Promise<PushResult> {\n const startTime = Date.now();\n const networkCalls: NetworkCall[] = [];\n\n return withFlowContext(\n { esmPath, platform, logger, snapshotCode, timeout, networkCalls, asyncDrain: { timeout: 5000 } },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, overrides || {});\n\n const result = await module.startFlow(config);\n if (!result?.collector?.push)\n throw new Error('Invalid bundle: collector missing push');\n\n const collector = result.collector;\n\n logger.info(`Pushing event: ${event.name}`);\n const elbResult = await collector.push(event);\n\n await collector.command('shutdown');\n\n return {\n success: true,\n elbResult: elbResult as PushResult['elbResult'],\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n}\n\nexport interface SimulateSourceOptions {\n sourceId: string;\n flow?: string;\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n}\n\n/**\n * Self-contained source simulation.\n *\n * Loads the flow config, bundles it, resolves the source package's /dev export\n * to get createTrigger, then invokes the trigger inside a flow context with a\n * prePush hook that captures events before they reach destinations.\n *\n * The `input` parameter is `unknown` — the CLI is agnostic to source-specific\n * content shapes. The source's createTrigger defines what it expects.\n */\nexport async function simulateSource(\n configPath: string,\n input: unknown,\n options: SimulateSourceOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n const prepared = await prepareFlow({\n configPath,\n flow: options.flow,\n simulate: ['source.' + options.sourceId],\n silent: options.silent,\n verbose: options.verbose,\n });\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n // Resolve source package and load createTrigger from /dev export\n const sourceConfig = (prepared.flowSettings.sources ?? {})[\n options.sourceId\n ] as { package?: string } | undefined;\n\n if (!sourceConfig?.package) {\n throw new Error(\n `Source \"${options.sourceId}\" has no package defined`,\n );\n }\n\n const devPath = resolvePackageImportPath(\n sourceConfig.package,\n prepared.flowSettings.packages,\n prepared.configDir,\n '/dev',\n );\n const devModule = await import(devPath);\n const createTrigger =\n devModule.examples?.createTrigger ||\n devModule.default?.examples?.createTrigger;\n\n if (!createTrigger) {\n throw new Error(\n `Source package \"${sourceConfig.package}\" has no createTrigger in /dev export`,\n );\n }\n\n // Load snapshot code if provided\n let snapshotCode: string | undefined;\n if (options.snapshot) {\n snapshotCode = (await loadConfig(options.snapshot, {\n json: false,\n })) as string;\n logger.debug(`Snapshot loaded (${snapshotCode.length} bytes)`);\n }\n\n const networkCalls: NetworkCall[] = [];\n\n return await withFlowContext(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, prepared.overrides);\n\n // Capture events at the collector.push boundary via prePush hook.\n // Hook is wired by startFlow (inside createTrigger) before events fire.\n const captured: Array<{ event: unknown; timestamp: number }> = [];\n\n config.hooks = {\n ...((config.hooks as Record<string, unknown>) || {}),\n prePush: ({ fn }: { fn: Function }, event: unknown) => {\n captured.push({ event, timestamp: Date.now() });\n return { ok: true }; // Stop propagation — don't call fn\n },\n };\n\n const instance = await createTrigger(config, { sourceId: options.sourceId });\n const { trigger } = instance;\n\n logger.info('Simulating source');\n\n // Extract content and trigger params from input — the CLI doesn't type\n // these, it just reads them as generic properties from the unknown input.\n const inputRecord = (input ?? {}) as Record<string, unknown>;\n const content = inputRecord.content ?? input;\n const triggerOpts = inputRecord.trigger as\n | { type?: string; options?: unknown }\n | undefined;\n await trigger(triggerOpts?.type, triggerOpts?.options)(content);\n\n if (instance.flow?.collector?.command) {\n await instance.flow.collector.command('shutdown');\n }\n\n return {\n success: true,\n ...(captured.length > 0 ? { captured } : {}),\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n await prepared.cleanup();\n }\n}\n\nexport interface SimulateTransformerOptions {\n transformerId: string;\n flow?: string;\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n}\n\n/**\n * Self-contained transformer simulation.\n *\n * Takes a DeepPartialEvent, validates it with Zod, loads the flow config,\n * bundles it, starts the flow to get initialized transformers, then runs\n * the event through the target transformer (with optional before chain).\n *\n * Captured array: first entry = input event, subsequent entries = output event(s).\n * If the transformer drops the event (returns false), output event is null.\n */\nexport async function simulateTransformer(\n configPath: string,\n event: WalkerOS.DeepPartialEvent,\n options: SimulateTransformerOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n // Validate event with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return {\n success: false,\n duration: 0,\n error: parsed.error.message,\n };\n }\n\n const prepared = await prepareFlow({\n configPath,\n flow: options.flow,\n simulate: ['transformer.' + options.transformerId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n });\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n // Load snapshot code if provided\n let snapshotCode: string | undefined;\n if (options.snapshot) {\n snapshotCode = (await loadConfig(options.snapshot, {\n json: false,\n })) as string;\n logger.debug(`Snapshot loaded (${snapshotCode.length} bytes)`);\n }\n\n const networkCalls: NetworkCall[] = [];\n\n return await withFlowContext(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, prepared.overrides);\n\n // Don't initialize sources or destinations during transformer simulation.\n if (config.sources) config.sources = {};\n if (config.destinations) config.destinations = {};\n\n const result = await module.startFlow(config);\n if (!result?.collector)\n throw new Error('Invalid bundle: collector not available');\n\n const collector = result.collector;\n const transformer =\n collector.transformers?.[options.transformerId];\n\n if (!transformer) {\n throw new Error(\n `Transformer \"${options.transformerId}\" not found in collector. ` +\n `Available: ${Object.keys(collector.transformers || {}).join(', ') || 'none'}`,\n );\n }\n\n const initialized = await transformerInit(\n collector,\n transformer,\n options.transformerId,\n );\n if (!initialized) {\n throw new Error(\n `Transformer \"${options.transformerId}\" failed to initialize`,\n );\n }\n\n const inputEvent = event;\n const ingest = createIngest(options.transformerId);\n const captured: Array<{ event: unknown; timestamp: number }> = [];\n\n captured.push({ event: { ...inputEvent }, timestamp: Date.now() });\n\n logger.info(`Simulating transformer: ${options.transformerId}`);\n\n // Run before chain if configured (mandatory preparation)\n let processedEvent: WalkerOS.DeepPartialEvent = inputEvent;\n const before = transformer.config.before;\n if (before && collector.transformers) {\n const beforeChainIds = resolveBeforeChain(\n before,\n collector.transformers,\n ingest,\n processedEvent,\n );\n if (beforeChainIds.length > 0) {\n const beforeResult = await runTransformerChain(\n collector,\n collector.transformers,\n beforeChainIds,\n processedEvent,\n ingest,\n undefined,\n `transformer.${options.transformerId}.before`,\n );\n if (beforeResult === null) {\n captured.push({ event: null, timestamp: Date.now() });\n await collector.command('shutdown');\n return {\n success: true,\n captured,\n duration: Date.now() - startTime,\n };\n }\n processedEvent = (\n Array.isArray(beforeResult) ? beforeResult[0] : beforeResult\n ) as WalkerOS.DeepPartialEvent;\n }\n }\n\n const pushResult = await transformerPush(\n collector,\n transformer,\n options.transformerId,\n processedEvent,\n ingest,\n );\n\n if (pushResult === false) {\n captured.push({ event: null, timestamp: Date.now() });\n } else if (Array.isArray(pushResult)) {\n for (const r of pushResult) {\n captured.push({\n event: r.event || processedEvent,\n timestamp: Date.now(),\n });\n }\n } else if (\n pushResult &&\n typeof pushResult === 'object' &&\n pushResult.event\n ) {\n captured.push({ event: pushResult.event, timestamp: Date.now() });\n } else {\n captured.push({ event: processedEvent, timestamp: Date.now() });\n }\n\n await collector.command('shutdown');\n\n return {\n success: true,\n captured,\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n await prepared.cleanup();\n }\n}\n\nexport interface SimulateDestinationOptions {\n destinationId: string;\n flow?: string;\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n}\n\n/**\n * Self-contained destination simulation.\n *\n * Takes a DeepPartialEvent, validates it with Zod, loads the flow config,\n * bundles it, starts the flow, then pushes via collector.push with an include\n * filter so only the target destination receives the event. This gives full\n * pipeline support — consent checks, event mapping, createEvent enrichment,\n * before chains — without manual wiring.\n */\nexport async function simulateDestination(\n configPath: string,\n event: WalkerOS.DeepPartialEvent,\n options: SimulateDestinationOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n // Validate event with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return {\n success: false,\n duration: 0,\n error: parsed.error.message,\n };\n }\n\n const prepared = await prepareFlow({\n configPath,\n flow: options.flow,\n simulate: ['destination.' + options.destinationId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n });\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n let snapshotCode: string | undefined;\n if (options.snapshot) {\n snapshotCode = (await loadConfig(options.snapshot, {\n json: false,\n })) as string;\n }\n\n const networkCalls: NetworkCall[] = [];\n\n return await withFlowContext(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, prepared.overrides);\n\n // Wrap env for call tracking if simulation paths exist\n const destOverride =\n prepared.overrides.destinations?.[options.destinationId];\n let trackedCalls: Array<{\n fn: string;\n args: unknown[];\n ts: number;\n }> = [];\n if (destOverride?.simulation?.length) {\n const destinations = config.destinations as Record<\n string,\n { config?: { env?: Record<string, unknown> } }\n >;\n const destConfig = destinations[options.destinationId]?.config;\n if (destConfig?.env) {\n const combined = {\n ...destConfig.env,\n simulation: destOverride.simulation,\n };\n const { wrappedEnv, calls } = wrapEnv(combined);\n destConfig.env = wrappedEnv;\n trackedCalls = calls;\n }\n }\n\n // Don't initialize sources — unnecessary overhead\n if (config.sources) config.sources = {};\n\n const result = await module.startFlow(config);\n if (!result?.collector)\n throw new Error('Invalid bundle: collector not available');\n\n const collector = result.collector;\n\n // Verify destination exists (check both active and pending)\n if (\n !collector.destinations[options.destinationId] &&\n !collector.pending.destinations[options.destinationId]\n ) {\n throw new Error(\n `Destination \"${options.destinationId}\" not found in collector. ` +\n `Available: ${Object.keys(collector.destinations || {}).join(', ') || 'none'}`,\n );\n }\n\n logger.info(`Simulating destination: ${options.destinationId}`);\n\n // Full pipeline: consent, mapping, enrichment, before chains\n // include filter ensures only the target destination receives the event\n const elbResult = await collector.push(event, {\n include: [options.destinationId],\n });\n\n await collector.command('shutdown');\n\n return {\n success: true,\n elbResult: elbResult as PushResult['elbResult'],\n ...(trackedCalls.length > 0\n ? { usage: { [options.destinationId]: trackedCalls } }\n : {}),\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n await prepared.cleanup();\n }\n}\n\n// Export types\nexport type { PushCommandOptions, PushResult };\n","import type { Flow } from '@walkeros/core';\n\n/**\n * Overrides structure for destination config properties.\n * Shape mirrors Collector.InitConfig.destinations but without requiring `code`.\n * Used with deepMerge at runtime to overlay mock/disabled flags.\n */\nexport interface PushOverrides {\n destinations?: Record<\n string,\n {\n config?: {\n mock?: unknown;\n disabled?: boolean;\n };\n simulate?: boolean;\n env?: Record<string, unknown>;\n simulation?: string[];\n }\n >;\n sources?: Record<\n string,\n {\n simulate?: boolean;\n }\n >;\n /** Path-specific transformer mocks: chainPath → { transformerId → mockValue } */\n transformerMocks?: Record<string, Record<string, unknown>>;\n transformers?: Record<\n string,\n {\n simulate?: boolean;\n }\n >;\n}\n\n/**\n * Build collector overrides from --simulate and --mock CLI flags.\n *\n * - `--simulate destination.NAME` sets simulate: true on NAME\n * - `--simulate source.NAME` marks source for simulation\n * - `--mock destination.NAME=VALUE` sets mock: JSON-parsed VALUE on NAME\n * - Any destination NOT targeted by simulate or mock gets disabled: true\n * - Returns empty object if no flags are provided\n *\n * @throws if same destination appears in both simulate and mock\n * @throws if step format is invalid (missing `source.` or `destination.` prefix)\n * @throws if --mock is used with a source step\n */\nexport function buildOverrides(\n flags: { simulate?: string[]; mock?: string[] },\n flowConfig: Flow.Settings,\n): PushOverrides {\n const simulateFlags = flags.simulate ?? [];\n const mockFlags = flags.mock ?? [];\n\n // No flags → no overrides\n if (simulateFlags.length === 0 && mockFlags.length === 0) {\n return {};\n }\n\n const simulateNames = new Set<string>();\n const sourceSimulateNames = new Set<string>();\n const mockNames = new Set<string>();\n const overrides: PushOverrides = {};\n\n // Parse --simulate flags\n for (const step of simulateFlags) {\n const { type, name } = parseStep(step);\n if (type === 'destination') {\n simulateNames.add(name);\n if (!overrides.destinations) overrides.destinations = {};\n overrides.destinations[name] = { simulate: true };\n } else if (type === 'transformer') {\n if (!overrides.transformers) overrides.transformers = {};\n overrides.transformers[name] = { simulate: true };\n } else {\n sourceSimulateNames.add(name);\n if (!overrides.sources) overrides.sources = {};\n overrides.sources[name] = { simulate: true };\n }\n }\n\n // Validate: only one step type can be simulated at a time\n const hasSource = sourceSimulateNames.size > 0;\n const hasTransformer =\n overrides.transformers && Object.keys(overrides.transformers).length > 0;\n const hasDestination = simulateNames.size > 0;\n const simulatedTypes = [\n hasSource && 'source',\n hasTransformer && 'transformer',\n hasDestination && 'destination',\n ].filter(Boolean);\n\n if (simulatedTypes.length > 1) {\n throw new Error(\n `Cannot simulate both ${simulatedTypes.join(' and ')} in the same invocation. ` +\n 'Run separate commands for each step type.',\n );\n }\n\n // Parse --mock flags\n for (const step of mockFlags) {\n const eqIndex = step.indexOf('=');\n if (eqIndex === -1) {\n throw new Error(\n `Invalid --mock format: \"${step}\". Expected destination.NAME=VALUE`,\n );\n }\n\n const stepPart = step.slice(0, eqIndex);\n const valuePart = step.slice(eqIndex + 1);\n const parsed = parseStep(stepPart);\n\n if (parsed.type === 'source') {\n throw new Error(\n `--mock is not supported for sources. Use --simulate source.${parsed.name}`,\n );\n }\n\n if (parsed.type === 'transformer' && !parsed.chainType) {\n throw new Error(\n `Use --mock destination.NAME.before.${parsed.name}=VALUE for path-specific transformer mocks`,\n );\n }\n\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(valuePart);\n } catch {\n // If not valid JSON, use as raw string\n parsedValue = valuePart;\n }\n\n if (parsed.chainType && parsed.transformerId) {\n // Path-specific mock: destination.ga4.before.redact\n const chainPath = `destination.${parsed.name}.${parsed.chainType}`;\n if (!overrides.transformerMocks) overrides.transformerMocks = {};\n if (!overrides.transformerMocks[chainPath])\n overrides.transformerMocks[chainPath] = {};\n overrides.transformerMocks[chainPath][parsed.transformerId] = parsedValue;\n } else {\n // Simple destination mock (existing behavior)\n // Validate: same destination cannot be in both simulate and mock\n if (simulateNames.has(parsed.name)) {\n throw new Error(\n `Destination \"${parsed.name}\" cannot be in both --simulate and --mock`,\n );\n }\n\n mockNames.add(parsed.name);\n\n if (!overrides.destinations) overrides.destinations = {};\n overrides.destinations[parsed.name] = { config: { mock: parsedValue } };\n }\n }\n\n // Simulate-implies-disabled: disable all other destinations\n const allDestinations = Object.keys(flowConfig.destinations ?? {});\n const targetedNames = new Set([...simulateNames, ...mockNames]);\n\n if (targetedNames.size > 0) {\n if (!overrides.destinations) overrides.destinations = {};\n for (const destName of allDestinations) {\n if (!targetedNames.has(destName)) {\n overrides.destinations[destName] = { config: { disabled: true } };\n }\n }\n }\n\n return overrides;\n}\n\ninterface ParsedStep {\n type: 'source' | 'destination' | 'transformer';\n name: string;\n chainType?: 'before' | 'next';\n transformerId?: string;\n}\n\n/**\n * Parse a step string in `source.NAME` or `destination.NAME` format.\n * Also supports 4-part path notation: `destination.NAME.CHAIN.TRANSFORMER`\n * @throws if format is invalid\n */\nfunction parseStep(step: string): ParsedStep {\n const parts = step.split('.');\n\n if (parts.length < 2) {\n throw new Error(\n `Invalid step format: \"${step}\". Expected \"source.NAME\" or \"destination.NAME\"`,\n );\n }\n\n const prefix = parts[0];\n if (\n prefix !== 'source' &&\n prefix !== 'destination' &&\n prefix !== 'transformer'\n ) {\n throw new Error(\n `Unsupported step type: \"${prefix}\". Use \"source\", \"destination\", or \"transformer\"`,\n );\n }\n\n const name = parts[1];\n if (!name) {\n throw new Error(\n `Invalid step format: \"${step}\". Missing name after \"${prefix}.\"`,\n );\n }\n\n // Path-specific: destination.ga4.before.redact\n if (parts.length >= 4) {\n const chainType = parts[2];\n if (chainType !== 'before' && chainType !== 'next') {\n throw new Error(\n `Invalid chain type: \"${chainType}\". Use \"before\" or \"next\"`,\n );\n }\n const transformerId = parts[3];\n if (!transformerId) {\n throw new Error(\n `Invalid step format: \"${step}\". Missing transformer name after \"${chainType}.\"`,\n );\n }\n return { type: prefix, name, chainType, transformerId };\n }\n\n // 3-part (destination.ga4.before without transformer) — invalid\n if (parts.length === 3) {\n throw new Error(\n `Invalid step format: \"${step}\". Specify a transformer: \"${step}.TRANSFORMER_NAME\"`,\n );\n }\n\n return { type: prefix, name };\n}\n","import type { PushOverrides } from './overrides.js';\n\n/**\n * Apply push overrides (disabled/mock/env) to a collector config object.\n * Mutates config.destinations and config.transformers in place.\n */\nexport function applyOverrides(\n config: Record<string, unknown>,\n overrides: PushOverrides,\n): void {\n // Destination overrides: disabled, mock, env\n if (overrides.destinations) {\n const destinations = config.destinations as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (destinations) {\n for (const [id, override] of Object.entries(overrides.destinations)) {\n const dest = destinations[id];\n if (!dest) continue;\n if (!dest.config) dest.config = {};\n const destConfig = dest.config as Record<string, unknown>;\n if (override.config?.disabled) destConfig.disabled = true;\n if (override.config?.mock !== undefined)\n destConfig.mock = override.config.mock;\n if (override.env) {\n destConfig.env = override.env;\n }\n }\n }\n }\n\n // Transformer path-specific mocks\n if (overrides.transformerMocks) {\n const transformers = config.transformers as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (transformers) {\n for (const [chainPath, mocks] of Object.entries(\n overrides.transformerMocks,\n )) {\n for (const [transformerId, mockValue] of Object.entries(mocks)) {\n const transformer = transformers[transformerId];\n if (!transformer) continue;\n if (!transformer.config) transformer.config = {};\n const tConfig = transformer.config as Record<string, unknown>;\n if (!tConfig.chainMocks) tConfig.chainMocks = {};\n (tConfig.chainMocks as Record<string, unknown>)[chainPath] =\n mockValue;\n }\n }\n }\n }\n}\n","import path from 'path';\nimport { pathToFileURL } from 'url';\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport type { Logger } from '@walkeros/core';\nimport type { NetworkCall, PushResult } from './types.js';\nimport { getErrorMessage } from '../../core/utils.js';\nimport { installTimerInterception, type TimerControl } from './async-drain.js';\n\nexport interface FlowContextOptions {\n esmPath: string;\n platform: 'web' | 'server';\n logger: Logger.Instance;\n snapshotCode?: string;\n timeout?: number;\n /** When provided, fetch/sendBeacon are polyfilled and calls recorded here */\n networkCalls?: NetworkCall[];\n /** Enable timer interception + async drain after callback completes */\n asyncDrain?: { timeout?: number };\n}\n\n/**\n * Loosely typed module shape from a dynamically imported ESM bundle.\n * The bundle has no compile-time types, so we use permissive signatures\n * and let the callbacks do runtime validation (e.g., \"collector missing push\").\n */\nexport interface FlowModule {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wireConfig: (data?: unknown) => any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n startFlow: (config: unknown) => Promise<any>;\n __configData?: unknown;\n}\n\n/**\n * Set up execution environment (JSDOM for web, snapshot eval),\n * import the ESM bundle, validate wireConfig/startFlow, then\n * call the provided function with the loaded module.\n *\n * Handles: JSDOM global injection, Node 22 navigator compat,\n * snapshot eval, ESM import with cache bust, error wrapping,\n * global cleanup in finally.\n */\nexport async function withFlowContext(\n options: FlowContextOptions,\n fn: (module: FlowModule) => Promise<PushResult>,\n): Promise<PushResult> {\n const { esmPath, platform, logger, snapshotCode, timeout, networkCalls, asyncDrain } =\n options;\n const startTime = Date.now();\n const g = global as unknown as Record<string, unknown>;\n let savedWindow: unknown, savedDocument: unknown, savedNavigator: unknown;\n let savedFetch: typeof fetch | undefined;\n let dom: JSDOM | undefined;\n let timerControl: TimerControl | undefined;\n\n // JSDOM setup for web platform\n if (platform === 'web') {\n const virtualConsole = new VirtualConsole();\n dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously',\n resources: 'usable',\n virtualConsole,\n });\n savedWindow = g.window;\n savedDocument = g.document;\n savedNavigator = g.navigator;\n g.window = dom.window;\n g.document = dom.window.document;\n Object.defineProperty(global, 'navigator', {\n value: dom.window.navigator,\n configurable: true,\n writable: true,\n });\n\n // Apply network polyfills when capture array is provided\n if (networkCalls) {\n savedFetch = global.fetch;\n applyNetworkPolyfills(dom, networkCalls);\n global.fetch = dom.window.fetch as typeof fetch;\n }\n }\n\n // Install timer interception AFTER JSDOM setup, BEFORE ESM import\n // so the bundle's top-level setTimeout references are captured\n if (asyncDrain) {\n timerControl = installTimerInterception({\n domWindow: platform === 'web' && dom\n ? (dom.window as unknown as Window & typeof globalThis)\n : undefined,\n });\n }\n\n try {\n // Eval snapshot before importing bundle\n if (snapshotCode) {\n if (platform === 'web' && dom) {\n logger.debug('Evaluating snapshot in JSDOM');\n dom.window.eval(snapshotCode);\n } else {\n logger.debug('Evaluating snapshot in Node');\n const vm = await import('vm');\n vm.runInThisContext(snapshotCode);\n }\n }\n\n // Import ESM bundle with cache bust\n const fileUrl = pathToFileURL(path.resolve(esmPath)).href;\n const module = await import(`${fileUrl}?t=${Date.now()}`);\n const { wireConfig, startFlow } = module;\n\n if (typeof wireConfig !== 'function' || typeof startFlow !== 'function') {\n throw new Error(\n 'Invalid ESM bundle: missing wireConfig or startFlow exports',\n );\n }\n\n const flowModule: FlowModule = {\n wireConfig,\n startFlow,\n __configData: module.__configData,\n };\n\n // Execute step-specific logic\n if (timerControl) {\n // asyncDrain mode: no outer timeout (flush has its own wall-clock safety)\n const result = await fn(flowModule);\n await timerControl.flush(asyncDrain?.timeout ?? 5000);\n return result;\n } else if (timeout) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Push timeout after ${timeout}ms`)),\n timeout,\n );\n });\n return await Promise.race([fn(flowModule), timeoutPromise]);\n }\n\n return await fn(flowModule);\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n } finally {\n if (timerControl) timerControl.restore();\n if (savedFetch !== undefined) {\n cleanupNetworkPolyfills(savedFetch);\n }\n if (platform === 'web') {\n if (savedWindow !== undefined) g.window = savedWindow;\n else delete g.window;\n if (savedDocument !== undefined) g.document = savedDocument;\n else delete g.document;\n if (savedNavigator !== undefined) {\n Object.defineProperty(global, 'navigator', {\n value: savedNavigator,\n configurable: true,\n writable: true,\n });\n } else {\n delete g.navigator;\n }\n }\n }\n}\n\n/**\n * Install no-op fetch and sendBeacon polyfills on the JSDOM window.\n * Both record calls to the provided capture array.\n * Also overrides global.fetch so ESM bundle code (which resolves fetch\n * from Node's global scope, not window) gets the polyfill too.\n */\nexport function applyNetworkPolyfills(\n dom: JSDOM,\n networkCalls: NetworkCall[],\n): void {\n // Polyfill fetch on the JSDOM window\n dom.window.fetch = (async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const url = typeof input === 'string' ? input : input.toString();\n const method = init?.method || 'GET';\n const body =\n init?.body !== undefined && init?.body !== null\n ? String(init.body)\n : null;\n\n // Extract headers\n const headers: Record<string, string> = {};\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((v, k) => {\n headers[k] = v;\n });\n } else if (typeof init.headers === 'object') {\n Object.entries(init.headers as Record<string, string>).forEach(\n ([k, v]) => {\n headers[k] = v;\n },\n );\n }\n }\n\n networkCalls.push({\n type: 'fetch',\n url,\n method,\n body,\n headers,\n timestamp: Date.now(),\n });\n\n return new Response('', { status: 200, statusText: 'OK' });\n }) as typeof fetch;\n\n // Polyfill sendBeacon on navigator\n dom.window.navigator.sendBeacon = (\n url: string,\n data?: BodyInit | null,\n ): boolean => {\n const body = data !== undefined && data !== null ? String(data) : null;\n networkCalls.push({ type: 'beacon', url, body, timestamp: Date.now() });\n return true;\n };\n}\n\n/**\n * Restore global.fetch to its original value.\n */\nexport function cleanupNetworkPolyfills(savedFetch: typeof fetch): void {\n global.fetch = savedFetch;\n}\n","/**\n * Lightweight timer interception and async drain for CLI simulation.\n *\n * Replaces setTimeout/setInterval on globalThis and an optional JSDOM window\n * with tracked versions that hold callbacks. flush() executes held callbacks\n * and drains microtasks until quiescent.\n */\n\ninterface PendingTimer {\n id: number;\n callback: (...args: unknown[]) => void;\n delay: number;\n type: 'timeout' | 'interval';\n args: unknown[];\n cleared: boolean;\n}\n\nexport interface TimerControl {\n /** Execute all pending timer callbacks and drain microtasks until quiescent */\n flush(wallTimeout?: number): Promise<void>;\n /** Number of pending (un-cleared) timers */\n countPending(): number;\n /** Restore original timer functions */\n restore(): void;\n}\n\nexport interface TimerInterceptionOptions {\n /** JSDOM window — patch its timers too (shared pending map) */\n domWindow?: Window & typeof globalThis;\n}\n\ninterface SavedTimers {\n target: Record<string, unknown>;\n setTimeout: unknown;\n clearTimeout: unknown;\n setInterval: unknown;\n clearInterval: unknown;\n}\n\nexport function installTimerInterception(\n options: TimerInterceptionOptions = {},\n): TimerControl {\n let nextId = 1;\n const pending = new Map<number, PendingTimer>();\n\n // Save real timers for microtask drain and restore\n const realSetTimeout = globalThis.setTimeout.bind(globalThis);\n const targets: SavedTimers[] = [];\n\n function patchTarget(target: Record<string, unknown>): void {\n targets.push({\n target,\n setTimeout: target.setTimeout,\n clearTimeout: target.clearTimeout,\n setInterval: target.setInterval,\n clearInterval: target.clearInterval,\n });\n\n target.setTimeout = (\n callback: (...args: unknown[]) => void,\n delay?: number,\n ...args: unknown[]\n ): number => {\n if (typeof callback !== 'function') return 0;\n const id = nextId++;\n pending.set(id, { id, callback, delay: delay ?? 0, type: 'timeout', args, cleared: false });\n return id;\n };\n\n target.clearTimeout = (id?: unknown): void => {\n if (id == null) return;\n const numId = typeof id === 'number' ? id : Number(id);\n const entry = pending.get(numId);\n if (entry) entry.cleared = true;\n };\n\n target.setInterval = (\n callback: (...args: unknown[]) => void,\n delay?: number,\n ...args: unknown[]\n ): number => {\n if (typeof callback !== 'function') return 0;\n const id = nextId++;\n pending.set(id, { id, callback, delay: delay ?? 0, type: 'interval', args, cleared: false });\n return id;\n };\n\n target.clearInterval = target.clearTimeout;\n }\n\n // Patch globalThis (bare setTimeout in ESM bundles)\n patchTarget(globalThis as unknown as Record<string, unknown>);\n\n // Patch JSDOM window if provided and distinct\n if (options.domWindow && (options.domWindow as unknown) !== globalThis) {\n patchTarget(options.domWindow as unknown as Record<string, unknown>);\n }\n\n // Yield to real event loop — drains ALL pending microtasks\n const drainMicrotasks = () =>\n new Promise<void>((resolve) => realSetTimeout(resolve, 0));\n\n async function flush(wallTimeout = 5000): Promise<void> {\n const deadline = Date.now() + wallTimeout;\n const maxIterations = 100;\n let iterations = 0;\n\n while (iterations < maxIterations) {\n // 1. Drain microtasks (detached Promises that may create timers)\n await drainMicrotasks();\n\n // 2. Collect non-cleared timers sorted by delay\n const ready = Array.from(pending.values())\n .filter((t) => !t.cleared)\n .sort((a, b) => a.delay - b.delay);\n\n if (ready.length === 0) break;\n\n // 3. Execute each timer\n for (const timer of ready) {\n if (timer.cleared) continue; // May have been cleared by a prior callback\n\n pending.delete(timer.id);\n\n if (timer.type === 'interval') {\n timer.cleared = true;\n // Re-register for next iteration\n const newId = nextId++;\n pending.set(newId, { ...timer, id: newId, cleared: false });\n }\n\n try {\n timer.callback(...timer.args);\n } catch (err) {\n // Log but continue — one failure should not break the drain\n console.warn('[async-drain] Timer callback error:', err);\n }\n }\n\n // 4. Drain microtasks spawned by timer callbacks\n await drainMicrotasks();\n\n // 5. Wall-clock safety\n if (Date.now() > deadline) {\n break;\n }\n\n iterations++;\n }\n\n // Clean up remaining entries (interval leftovers, etc.)\n pending.clear();\n }\n\n function countPending(): number {\n return Array.from(pending.values()).filter((t) => !t.cleared).length;\n }\n\n function restore(): void {\n for (const saved of targets) {\n saved.target.setTimeout = saved.setTimeout;\n saved.target.clearTimeout = saved.clearTimeout;\n saved.target.setInterval = saved.setInterval;\n saved.target.clearInterval = saved.clearInterval;\n }\n pending.clear();\n }\n\n return { flush, countPending, restore };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { getPlatform, type Flow, type Logger } from '@walkeros/core';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadFlowConfig } from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport { buildOverrides, type PushOverrides } from './overrides.js';\n\nexport interface PrepareOptions {\n configPath: string;\n flow?: string;\n simulate?: string[];\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n}\n\nexport interface PreparedFlow {\n bundlePath: string;\n platform: 'web' | 'server';\n overrides: PushOverrides;\n flowSettings: Flow.Settings;\n configDir: string;\n cleanup: () => Promise<void>;\n}\n\n/**\n * Shared preparation step: load config, build overrides, bundle to temp ESM.\n *\n * Shared by simulateSource, simulateTransformer, and simulateDestination\n * so each simulation function starts from the same prepared state.\n */\nexport async function prepareFlow(\n options: PrepareOptions,\n): Promise<PreparedFlow> {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n // Load config\n logger.debug('Loading flow configuration');\n const { flowSettings, buildOptions } = await loadFlowConfig(\n options.configPath,\n {\n flowName: options.flow,\n logger,\n },\n );\n\n const platform = getPlatform(flowSettings);\n const configDir = buildOptions.configDir || process.cwd();\n\n // Build overrides from --simulate/--mock flags\n const overrides = buildOverrides(\n { simulate: options.simulate, mock: options.mock },\n flowSettings,\n );\n\n // Auto-load destination /dev envs for simulated/mocked destinations\n if (overrides.destinations) {\n const { loadDestinationEnvs } = await import('./env-loader.js');\n const envs = await loadDestinationEnvs(\n flowSettings.destinations ?? {},\n flowSettings.packages,\n configDir,\n );\n for (const [destId, env] of Object.entries(envs)) {\n if (overrides.destinations[destId] && env.push) {\n overrides.destinations[destId].env = env.push;\n if (env.simulation && env.simulation.length > 0) {\n overrides.destinations[destId].simulation = env.simulation;\n }\n }\n }\n }\n\n // Bundle to temp file\n logger.debug('Bundling flow configuration');\n const tempDir = getTmpPath(\n undefined,\n `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n await fs.ensureDir(tempDir);\n const bundlePath = path.join(tempDir, 'bundle.mjs');\n\n const pushBuildOptions = {\n ...buildOptions,\n output: bundlePath,\n format: 'esm' as const,\n platform: platform === 'web' ? ('browser' as const) : ('node' as const),\n skipWrapper: true, // CLI imports ESM directly -- no platform wrapper\n };\n\n await bundleCore(flowSettings, pushBuildOptions, logger, false);\n\n logger.debug(`Bundle created: ${bundlePath}`);\n\n return {\n bundlePath,\n platform,\n overrides,\n flowSettings,\n configDir,\n cleanup: async () => {\n await fs.remove(tempDir).catch(() => {});\n },\n };\n}\n","/**\n * Run Command\n *\n * Unified entry point for running walkerOS flows.\n * Used by both `walkeros run` (CLI) and Docker containers.\n */\n\nimport path from 'path';\nimport { writeFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { createTimer, getErrorMessage } from '../../core/index.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { resolveAppUrl } from '../../lib/config-file.js';\nimport { resolveRunToken } from '../../core/auth.js';\nimport { resolveBundle } from '../../runtime/resolve-bundle.js';\nimport { fetchConfig } from '../../runtime/config-fetcher.js';\nimport { readCache } from '../../runtime/cache.js';\nimport { validateFlowFile, validatePort } from './validators.js';\nimport { isPreBuiltConfig } from './utils.js';\nimport { runPipeline, type PipelineOptions } from './pipeline.js';\nimport type { RunCommandOptions, RunOptions, RunResult } from './types.js';\n\n/** Default cache dir following XDG conventions */\nfunction defaultCacheDir(): string {\n const xdgCache = process.env.XDG_CACHE_HOME;\n const base = xdgCache || join(homedir(), '.cache');\n return join(base, 'walkeros');\n}\n\n/** Lazy-load bundler to avoid pulling it in for pre-built flows */\nasync function lazyPrepareBundleForRun(\n configPath: string,\n options: { verbose?: boolean; silent?: boolean; flowName?: string },\n): Promise<{ bundlePath: string; cleanup: () => Promise<void> }> {\n const { prepareBundleForRun } = await import('./utils.js');\n return prepareBundleForRun(configPath, options);\n}\n\n/**\n * CLI command function for `walkeros run`\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 // Resolve port\n const port = options.port ?? 8080;\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Resolve API config\n const flowId = options.flowId;\n const projectId = options.project;\n const token = resolveRunToken();\n const appUrl = resolveAppUrl();\n const flowName = options.flow;\n\n let apiConfig: PipelineOptions['api'] | undefined;\n\n if (flowId) {\n if (!token) {\n logger.error(\n `Remote flow requires authentication.\\n\\n` +\n ` No token found. Authenticate first:\\n` +\n ` $ walkeros auth login\\n\\n` +\n ` Or set WALKEROS_TOKEN:\\n` +\n ` $ export WALKEROS_TOKEN=<your-token>`,\n );\n process.exit(1);\n }\n if (!projectId) {\n logger.error(\n `--flow-id requires --project or WALKEROS_PROJECT_ID.\\n\\n` +\n ` Set the project:\\n` +\n ` $ walkeros run --flow-id ${flowId} --project <your-project-id>\\n` +\n ` $ export WALKEROS_PROJECT_ID=<your-project-id>`,\n );\n process.exit(1);\n }\n\n apiConfig = {\n appUrl,\n token,\n projectId,\n flowId,\n deploymentId: options.deploymentId,\n heartbeatIntervalMs:\n parseInt(\n process.env.WALKEROS_HEARTBEAT_INTERVAL ??\n process.env.HEARTBEAT_INTERVAL ??\n '60',\n 10,\n ) * 1000,\n pollIntervalMs:\n parseInt(\n process.env.WALKEROS_POLL_INTERVAL ??\n process.env.POLL_INTERVAL ??\n '30',\n 10,\n ) * 1000,\n cacheDir:\n process.env.WALKEROS_CACHE_DIR ??\n process.env.CACHE_DIR ??\n defaultCacheDir(),\n flowName,\n prepareBundleForRun: lazyPrepareBundleForRun,\n };\n }\n\n // Resolve bundle path\n const bundlePath = await resolveBundlePath(\n options.config,\n apiConfig,\n logger,\n );\n\n // Run pipeline\n logger.info('Starting flow...');\n await runPipeline({\n bundlePath,\n port,\n logger: logger.scope('runner'),\n loggerConfig: options.verbose ? { level: 0 } : undefined,\n api: apiConfig,\n });\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 * Resolve the bundle path from local file, remote API, or cache.\n *\n * Priority:\n * 1. Local file (provided via CLI arg or BUNDLE env)\n * 2. Remote config fetch (when apiConfig is provided and no local file)\n * 3. Cached bundle (fallback when remote fetch fails)\n */\nasync function resolveBundlePath(\n configInput: string | undefined,\n apiConfig: PipelineOptions['api'] | undefined,\n logger: ReturnType<typeof createCLILogger>,\n): Promise<string> {\n // Case 1: Local file or URL bundle\n if (configInput) {\n const resolved = await resolveBundle(configInput);\n\n if (resolved.source === 'stdin') {\n logger.info('Bundle: received via stdin');\n } else if (resolved.source === 'url') {\n logger.info('Bundle: fetched from URL');\n } else {\n logger.info(`Bundle: ${resolved.path}`);\n }\n\n if (isPreBuiltConfig(resolved.path)) {\n return path.resolve(resolved.path);\n }\n\n // JSON config — needs bundling\n const flowFile = validateFlowFile(resolved.path);\n logger.debug('Building flow bundle');\n const result = await lazyPrepareBundleForRun(flowFile, {\n verbose: false,\n silent: true,\n flowName: apiConfig?.flowName,\n });\n return result.bundlePath;\n }\n\n // Case 2: Remote config fetch (no local file, but API config with flowId)\n if (apiConfig) {\n logger.info('Fetching config from API...');\n try {\n const result = await fetchConfig({\n appUrl: apiConfig.appUrl,\n token: apiConfig.token,\n projectId: apiConfig.projectId,\n flowId: apiConfig.flowId,\n });\n\n if (result.changed) {\n const tmpConfigPath = getTmpPath(\n undefined,\n `walkeros-flow-${Date.now()}.json`,\n );\n writeFileSync(\n tmpConfigPath,\n JSON.stringify(result.content, null, 2),\n 'utf-8',\n );\n logger.info(`Config version: ${result.version}`);\n\n logger.info('Building flow...');\n const bundleResult = await lazyPrepareBundleForRun(tmpConfigPath, {\n verbose: false,\n silent: true,\n flowName: apiConfig.flowName,\n });\n\n // Cache the working bundle\n try {\n const { writeCache } = await import('../../runtime/cache.js');\n writeCache(\n apiConfig.cacheDir,\n bundleResult.bundlePath,\n JSON.stringify(result.content),\n result.version,\n );\n } catch {\n logger.debug('Cache write failed (non-critical)');\n }\n\n return bundleResult.bundlePath;\n }\n } catch (error) {\n logger.error(\n `API fetch failed: ${error instanceof Error ? error.message : error}`,\n );\n\n // Fallback to cache\n const cached = readCache(apiConfig.cacheDir);\n if (cached) {\n logger.info(`Using cached bundle (version: ${cached.version})`);\n return cached.bundlePath;\n }\n\n throw new Error(\n 'No config available. API fetch failed and no cached bundle.',\n );\n }\n }\n\n // Case 3: Default — look for server-collect.mjs\n const defaultFile = 'server-collect.mjs';\n logger.debug(`No config specified, using default: ${defaultFile}`);\n return path.resolve(defaultFile);\n}\n\n/**\n * Programmatic run function\n */\nexport async function run(options: RunOptions): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\n await runCommand({\n config: options.config,\n port: options.port,\n flow: options.flow,\n flowId: options.flowId,\n project: options.project,\n verbose: options.verbose,\n silent: options.silent ?? true,\n });\n\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\nexport type { RunCommandOptions, RunOptions, RunResult };\n","/**\n * Resolve bundle input to a local file path\n *\n * Priority order:\n * 1. File path (exists) - BUNDLE points to an existing local file\n * 2. URL - BUNDLE is an http(s) URL → fetch and write to writePath\n * 3. Stdin - data piped into the process\n * 4. File path (fallback) - BUNDLE path that doesn't exist yet\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { isStdinPiped, readStdin } from '../core/stdin.js';\n\n/**\n * Determine where to write fetched/stdin bundles.\n * In Docker: /app/flow/ exists → write there (module resolution works naturally).\n * Local dev: falls back to /tmp/.\n */\nfunction getDefaultWritePath(): string {\n if (existsSync('/app/flow')) return '/app/flow/bundle.mjs';\n return '/tmp/walkeros-bundle.mjs';\n}\n\nexport type BundleSource = 'stdin' | 'url' | 'file';\n\nexport interface ResolvedBundle {\n /** Absolute file path to the bundle (ready for import()) */\n path: string;\n /** How the bundle was provided */\n source: BundleSource;\n}\n\n/**\n * Detect whether a string is an HTTP(S) URL\n */\nfunction isUrl(value: string): boolean {\n return value.startsWith('http://') || value.startsWith('https://');\n}\n\n/**\n * Write bundle content to disk, ensuring parent directory exists.\n */\nfunction writeBundleToDisk(writePath: string, content: string): void {\n const dir = dirname(writePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(writePath, content, 'utf-8');\n}\n\n/**\n * Fetch bundle from URL and write to disk.\n * Uses a 30s timeout to prevent silent container hangs on unresponsive URLs.\n */\nasync function fetchBundle(url: string, writePath: string): Promise<string> {\n const response = await fetch(url, { signal: AbortSignal.timeout(30_000) });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch bundle from ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n throw new Error(`Bundle fetched from ${url} is empty`);\n }\n\n writeBundleToDisk(writePath, content);\n return writePath;\n}\n\n/**\n * Read bundle from stdin and write to disk\n */\nasync function readBundleFromStdin(writePath: string): Promise<string> {\n const content = await readStdin(); // throws if empty\n writeBundleToDisk(writePath, content);\n return writePath;\n}\n\n/**\n * Resolve the bundle to a local file path\n *\n * @param bundleEnv - Value of the BUNDLE env var (path or URL)\n * @returns Resolved bundle with file path and source type\n */\nexport async function resolveBundle(\n bundleEnv: string,\n): Promise<ResolvedBundle> {\n const writePath = getDefaultWritePath();\n // 1. If BUNDLE points to an existing file, use it directly\n // This prevents false stdin detection in Docker detached mode\n if (!isUrl(bundleEnv) && existsSync(bundleEnv)) {\n return { path: bundleEnv, source: 'file' };\n }\n\n // 2. URL — check before stdin to avoid false stdin detection in containers\n // (process.stdin.isTTY is undefined in non-interactive shells/Docker)\n if (isUrl(bundleEnv)) {\n const path = await fetchBundle(bundleEnv, writePath);\n return { path, source: 'url' };\n }\n\n // 3. Stdin pipe (only when BUNDLE is not a file or URL)\n if (isStdinPiped()) {\n const path = await readBundleFromStdin(writePath);\n return { path, source: 'stdin' };\n }\n\n // 4. File path (fallback — file may not exist yet for config paths)\n return { path: bundleEnv, source: 'file' };\n}\n","import { mergeAuthHeaders } from '../core/http.js';\n\nexport interface FetchConfigResult {\n content: Record<string, unknown>;\n version: string;\n etag: string;\n changed: true;\n}\n\nexport interface FetchConfigUnchanged {\n changed: false;\n}\n\nexport type ConfigFetchResult = FetchConfigResult | FetchConfigUnchanged;\n\nexport interface FetchConfigOptions {\n appUrl: string;\n token: string;\n projectId: string;\n flowId: string;\n lastEtag?: string;\n}\n\nexport async function fetchConfig(\n options: FetchConfigOptions,\n): Promise<ConfigFetchResult> {\n const url = `${options.appUrl}/api/projects/${options.projectId}/flows/${options.flowId}`;\n\n const headers = mergeAuthHeaders(\n options.token,\n options.lastEtag ? { 'If-None-Match': options.lastEtag } : undefined,\n );\n\n const response = await fetch(url, {\n headers,\n signal: AbortSignal.timeout(30_000),\n });\n\n if (response.status === 304) {\n return { changed: false };\n }\n\n if (!response.ok) {\n if (response.status === 401 || response.status === 403) {\n throw new Error(\n `Config fetch failed (${response.status}): token may have expired — redeploy to rotate`,\n );\n }\n throw new Error(\n `Config fetch failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n const etag = response.headers.get('etag') || '';\n const version = etag.replace(/\"/g, '');\n\n return {\n content: data.config,\n version,\n etag,\n changed: true,\n };\n}\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), URL, or inline JSON string',\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(\n 'Path to flow configuration file, URL, or inline JSON string',\n ),\n event: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Event as JSON string, file path, or URL. For sources: { content, trigger?, env? }.',\n ),\n flow: z.string().optional().describe('Flow name for multi-flow configs'),\n platform: PlatformSchema.optional().describe('Override platform detection'),\n step: z\n .string()\n .optional()\n .describe(\n 'Step target in type.name format (e.g. \"source.browser\", \"destination.gtag\")',\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 * Unified runtime pipeline for walkerOS flows\n *\n * Used by both `walkeros run` (CLI) and Docker containers.\n * Creates health server, loads flow, and optionally enables\n * heartbeat/polling/secrets when API config is provided.\n */\n\nimport { writeFileSync } from 'fs';\nimport fs from 'fs-extra';\nimport type { Logger } from '@walkeros/core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { createHealthServer } from '../../runtime/health-server.js';\nimport {\n loadFlow,\n swapFlow,\n type RuntimeConfig,\n type FlowHandle,\n} from '../../runtime/runner.js';\nimport {\n createHeartbeat,\n getInstanceId,\n type HeartbeatHandle,\n} from '../../runtime/heartbeat.js';\nimport { createPoller, type PollerHandle } from '../../runtime/poller.js';\nimport {\n fetchSecrets,\n SecretsHttpError,\n} from '../../runtime/secrets-fetcher.js';\nimport { writeCache } from '../../runtime/cache.js';\nimport { VERSION } from '../../version.js';\n\nexport interface PipelineOptions {\n bundlePath: string;\n port: number;\n logger: Logger.Instance;\n loggerConfig?: Logger.Config;\n api?: {\n appUrl: string;\n token: string;\n projectId: string;\n flowId: string;\n deploymentId?: string;\n heartbeatIntervalMs: number;\n pollIntervalMs: number;\n cacheDir: string;\n flowName?: string;\n /** Injected bundler function (lazy-loaded by caller to avoid pulling in bundler for pre-built flows) */\n prepareBundleForRun: (\n configPath: string,\n options: { verbose?: boolean; silent?: boolean; flowName?: string },\n ) => Promise<{ bundlePath: string; cleanup: () => Promise<void> }>;\n };\n}\n\n/**\n * Run the full pipeline: health server + flow + optional API features.\n * This function never returns (keeps process alive). Shutdown via signals.\n */\nexport async function runPipeline(options: PipelineOptions): Promise<void> {\n const { bundlePath, port, logger, loggerConfig, api } = options;\n let configVersion: string | undefined;\n\n // Inject secrets before loading flow\n if (api) {\n await injectSecrets(api, logger);\n }\n\n logger.info(`walkeros/flow v${VERSION}`);\n logger.info(`Instance: ${getInstanceId()}`);\n\n // Health server (always on)\n const healthServer = await createHealthServer(port, logger);\n\n // Load flow\n const runtimeConfig: RuntimeConfig = { port };\n let handle: FlowHandle;\n try {\n handle = await loadFlow(\n bundlePath,\n runtimeConfig,\n logger,\n loggerConfig,\n healthServer,\n );\n } catch (error) {\n await healthServer.close();\n throw error;\n }\n\n logger.info('Flow running');\n logger.info(`Port: ${port}`);\n\n // API features (heartbeat + poller)\n let heartbeat: HeartbeatHandle | null = null;\n let poller: PollerHandle | null = null;\n\n // Track temp files for cleanup on hot-swap and shutdown\n let currentBundleCleanup: (() => Promise<void>) | undefined;\n let currentConfigPath: string | undefined;\n\n if (api) {\n heartbeat = createHeartbeat(\n {\n appUrl: api.appUrl,\n token: api.token,\n projectId: api.projectId,\n flowId: api.flowId,\n deploymentId: api.deploymentId,\n configVersion,\n intervalMs: api.heartbeatIntervalMs,\n getCounters: () => handle.collector.status,\n },\n logger,\n );\n heartbeat.start();\n logger.info(`Heartbeat: active (every ${api.heartbeatIntervalMs / 1000}s)`);\n\n poller = createPoller(\n {\n fetchOptions: {\n appUrl: api.appUrl,\n token: api.token,\n projectId: api.projectId,\n flowId: api.flowId,\n },\n intervalMs: api.pollIntervalMs,\n onUpdate: async (content, version) => {\n // Refresh secrets before hot-swap\n try {\n await injectSecrets(api, logger);\n } catch (error) {\n logger.error(\n `Failed to refresh secrets during poll, skipping hot-swap: ${error instanceof Error ? error.message : error}`,\n );\n return;\n }\n\n const tmpConfigPath = getTmpPath(\n undefined,\n `walkeros-flow-${Date.now()}.json`,\n );\n writeFileSync(\n tmpConfigPath,\n JSON.stringify(content, null, 2),\n 'utf-8',\n );\n\n const newBundleResult = await api.prepareBundleForRun(tmpConfigPath, {\n verbose: false,\n silent: true,\n flowName: api.flowName,\n });\n\n handle = await swapFlow(\n handle,\n newBundleResult.bundlePath,\n runtimeConfig,\n logger,\n loggerConfig,\n healthServer,\n );\n\n writeCache(\n api.cacheDir,\n newBundleResult.bundlePath,\n JSON.stringify(content),\n version,\n );\n configVersion = version;\n if (heartbeat) heartbeat.updateConfigVersion(version);\n\n // Clean up previous temp files\n if (currentBundleCleanup)\n await currentBundleCleanup().catch(() => {});\n if (currentConfigPath)\n await fs.remove(currentConfigPath).catch(() => {});\n\n // Track new paths\n currentBundleCleanup = newBundleResult.cleanup;\n currentConfigPath = tmpConfigPath;\n\n logger.info(`Hot-swapped to version ${version}`);\n },\n },\n logger,\n );\n poller.start();\n logger.info(`Polling: active (every ${api.pollIntervalMs / 1000}s)`);\n }\n\n // Single shutdown orchestrator\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n\n const forceTimer = setTimeout(() => {\n logger.error('Shutdown timed out, forcing exit');\n process.exit(1);\n }, 15000);\n\n try {\n if (poller) poller.stop();\n if (heartbeat) heartbeat.stop();\n if (handle.collector.command) {\n await handle.collector.command('shutdown');\n }\n await healthServer.close();\n\n // Clean up temp files\n if (currentBundleCleanup) await currentBundleCleanup().catch(() => {});\n if (currentConfigPath) await fs.remove(currentConfigPath).catch(() => {});\n\n logger.info('Shutdown complete');\n clearTimeout(forceTimer);\n process.exit(0);\n } catch (error) {\n clearTimeout(forceTimer);\n logger.error(\n `Error during shutdown: ${error instanceof Error ? error.message : String(error)}`,\n );\n process.exit(1);\n }\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Keep process alive\n await new Promise(() => {});\n}\n\nasync function injectSecrets(\n api: NonNullable<PipelineOptions['api']>,\n logger: Logger.Instance,\n): Promise<void> {\n try {\n const secrets = await fetchSecrets({\n appUrl: api.appUrl,\n token: api.token,\n projectId: api.projectId,\n flowId: api.flowId,\n });\n const count = Object.keys(secrets).length;\n if (count > 0) {\n for (const [name, value] of Object.entries(secrets)) {\n process.env[name] = value;\n }\n logger.info(`Injected ${count} secret(s) into environment`);\n }\n } catch (error) {\n if (\n error instanceof SecretsHttpError &&\n (error.status === 401 || error.status === 403)\n ) {\n throw error; // Fatal — token is invalid\n }\n logger.warn(\n `Could not fetch secrets: ${error instanceof Error ? error.message : error}`,\n );\n logger.info('Continuing without secrets (flow may not require them)');\n }\n}\n","import http from 'http';\nimport type { Logger } from '@walkeros/core';\n\nexport interface HealthServer {\n server: http.Server;\n setFlowHandler(handler: http.RequestListener | null): void;\n close(): Promise<void>;\n}\n\nexport function createHealthServer(\n port: number,\n logger: Logger.Instance,\n): Promise<HealthServer> {\n return new Promise((resolve, reject) => {\n let flowHandler: http.RequestListener | null = null;\n\n const server = http.createServer((req, res) => {\n // Runner-owned health routes — always available\n if (req.url === '/health' && req.method === 'GET') {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'ok' }));\n return;\n }\n\n if (req.url === '/ready' && req.method === 'GET') {\n const code = flowHandler ? 200 : 503;\n res.writeHead(code, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({ status: flowHandler ? 'ready' : 'not_ready' }),\n );\n return;\n }\n\n // Delegate to flow's HTTP handler\n if (flowHandler) {\n flowHandler(req, res);\n return;\n }\n\n // No flow handler — service unavailable\n res.writeHead(503, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'No flow loaded' }));\n });\n\n server.keepAliveTimeout = 5000;\n server.headersTimeout = 10000;\n\n server.listen(port, '0.0.0.0', () => {\n logger.info(`Health server listening on port ${port}`);\n resolve({\n server,\n setFlowHandler(handler) {\n flowHandler = handler;\n },\n close: () =>\n new Promise<void>((res, rej) => {\n server.close((err) => (err ? rej(err) : res()));\n }),\n });\n });\n\n server.on('error', reject);\n });\n}\n","/**\n * Runtime executor for pre-built walkerOS flows\n *\n * This module runs pre-built .mjs flow bundles without any build-time operations.\n * All bundling, package downloading, and code generation happens BEFORE this runs.\n */\n\nimport { resolve, dirname } from 'path';\nimport type { Collector, Logger } from '@walkeros/core';\nimport type { HealthServer } from './health-server.js';\nimport { loadBundle } from './load-bundle.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 flowContext = {\n ...config,\n ...(loggerConfig ? { logger: loggerConfig } : {}),\n ...(healthServer ? { sourceSettings: { port: undefined } } : {}),\n };\n\n const result = await loadBundle(absolutePath, flowContext, logger);\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 as FlowHandle['collector']['command'],\n status: result.collector.status as FlowHandle['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 * Shared bundle-loading utility.\n *\n * Extracts the common pattern from push/index.ts (executeServerPush) and\n * runtime/runner.ts (loadFlow):\n * 1. Resolve path to absolute\n * 2. Convert to file URL with cache bust\n * 3. Dynamic import\n * 4. Validate default export is a function\n * 5. Call factory with context\n * 6. Validate result has collector with push function\n * 7. Return { collector, httpHandler? }\n */\n\nimport { resolve } from 'path';\nimport { pathToFileURL } from 'url';\nimport type { Logger } from '@walkeros/core';\n\nexport interface BundleResult {\n collector: {\n push: (...args: unknown[]) => Promise<unknown>;\n command: (...args: unknown[]) => Promise<unknown>;\n status?: unknown;\n sources?: Record<string, unknown>;\n [key: string]: unknown;\n };\n httpHandler?: (req: unknown, res: unknown) => void;\n}\n\n/**\n * Load a pre-built bundle, call its default factory, and return the result.\n *\n * Callers are responsible for:\n * - Setting process.cwd() before calling (runner.ts does `process.chdir`)\n * - Wrapping with a timeout if needed (push/index.ts uses Promise.race)\n *\n * @param file - Path to the .mjs bundle (relative or absolute)\n * @param context - Context object passed to the factory function\n * @param logger - Optional logger for debug messages\n */\nexport async function loadBundle(\n file: string,\n context?: Record<string, unknown>,\n logger?: Logger.Instance,\n): Promise<BundleResult> {\n const absolutePath = resolve(file);\n const fileUrl = pathToFileURL(absolutePath).href;\n\n // Bust Node.js module cache by appending a query param\n logger?.debug?.(`Importing bundle: ${absolutePath}`);\n const module = await import(`${fileUrl}?t=${Date.now()}`);\n\n if (!module.default || typeof module.default !== 'function') {\n throw new Error(\n `Invalid bundle: ${file} must export a default factory function`,\n );\n }\n\n logger?.debug?.('Calling factory function...');\n const result = await module.default(context ?? {});\n\n if (\n !result ||\n !result.collector ||\n typeof result.collector.push !== 'function'\n ) {\n throw new Error(\n `Invalid bundle: factory must return { collector } with a push function`,\n );\n }\n\n return {\n collector: result.collector,\n ...(typeof result.httpHandler === 'function'\n ? { httpHandler: result.httpHandler }\n : {}),\n };\n}\n","import { randomBytes } from 'crypto';\nimport { VERSION } from '../version.js';\nimport { mergeAuthHeaders } from '../core/http.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\n/**\n * Deep-copy destination status values to prevent shared references\n * between snapshots from causing delta computation to always return 0.\n */\nfunction snapshotDestinations(\n destinations: Record<\n string,\n { count: number; failed: number; duration: number }\n >,\n): Record<string, { count: number; failed: number; duration: number }> {\n const result: Record<\n string,\n { count: number; failed: number; duration: number }\n > = {};\n for (const [name, dest] of Object.entries(destinations)) {\n result[name] = {\n count: dest.count,\n failed: dest.failed,\n duration: dest.duration,\n };\n }\n return result;\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 let current: CounterSnapshot | undefined;\n const status = config.getCounters?.();\n if (status) {\n current = {\n in: status.in,\n out: status.out,\n failed: status.failed,\n destinations: snapshotDestinations(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: mergeAuthHeaders(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 // Use the same snapshot we computed the delta from — not the live status\n // which may have changed during the HTTP POST\n if (response.ok && counters && current) {\n lastReported = current;\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","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 { fetchConfig, type FetchConfigOptions } from './config-fetcher.js';\nimport type { Logger } from '@walkeros/core';\n\nexport interface PollerConfig {\n fetchOptions: Omit<FetchConfigOptions, 'lastEtag'>;\n intervalMs: number;\n onUpdate: (\n content: Record<string, unknown>,\n version: string,\n ) => Promise<void>;\n}\n\nexport interface PollerHandle {\n start(): void;\n stop(): void;\n pollOnce(): Promise<void>;\n}\n\nexport function createPoller(\n config: PollerConfig,\n logger: Logger.Instance,\n): PollerHandle {\n let timer: ReturnType<typeof setInterval> | null = null;\n let lastEtag: string | undefined;\n\n async function pollOnce(): Promise<void> {\n try {\n const result = await fetchConfig({\n ...config.fetchOptions,\n lastEtag,\n });\n\n if (!result.changed) {\n logger.debug('Config unchanged');\n return;\n }\n\n logger.info(`New config version: ${result.version}`);\n lastEtag = result.etag;\n\n await config.onUpdate(result.content, result.version);\n logger.info('Config updated successfully');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Poll error: ${message}`);\n }\n }\n\n function start(): void {\n lastEtag = undefined;\n const jitter = config.intervalMs * 0.15 * (Math.random() * 2 - 1);\n timer = setInterval(() => pollOnce(), config.intervalMs + jitter);\n logger.info(\n `Polling every ${Math.round((config.intervalMs + jitter) / 1000)}s`,\n );\n }\n\n function stop(): void {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n\n return { start, stop, pollOnce };\n}\n","import { mergeAuthHeaders } from '../core/http.js';\n\nexport interface FetchSecretsOptions {\n appUrl: string;\n token: string;\n projectId: string;\n flowId: string;\n}\n\n/**\n * Custom error with HTTP status for callers to distinguish recoverable\n * failures (404 = no secrets configured) from fatal ones (401/403/500).\n */\nexport class SecretsHttpError extends Error {\n constructor(\n public readonly status: number,\n statusText: string,\n ) {\n super(`Failed to fetch secrets: ${status} ${statusText}`);\n this.name = 'SecretsHttpError';\n }\n}\n\nexport async function fetchSecrets(\n options: FetchSecretsOptions,\n): Promise<Record<string, string>> {\n const { appUrl, token, projectId, flowId } = options;\n const url = `${appUrl}/api/projects/${encodeURIComponent(projectId)}/flows/${encodeURIComponent(flowId)}/secrets/values`;\n\n const res = await fetch(url, {\n headers: mergeAuthHeaders(token, { 'Content-Type': 'application/json' }),\n });\n\n if (!res.ok) {\n throw new SecretsHttpError(res.status, res.statusText);\n }\n\n const json = (await res.json()) as { values: Record<string, string> };\n return json.values;\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\nconst SECTION_KEYS = ['globals', 'context', 'custom', 'user', 'consent'];\nconst KNOWN_KEYS = new Set([\n 'extends',\n 'tagging',\n 'description',\n 'events',\n ...SECTION_KEYS,\n]);\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 of named contract entries',\n code: 'INVALID_CONTRACT',\n });\n return { valid: false, type: 'contract', errors, warnings, details };\n }\n\n const contracts = input as Record<string, unknown>;\n const contractNames = Object.keys(contracts);\n details.contractCount = contractNames.length;\n\n // Check each named contract entry\n for (const [name, entry] of Object.entries(contracts)) {\n if (typeof entry !== 'object' || entry === null) {\n errors.push({\n path: name,\n message: `Contract \"${name}\" must be an object`,\n code: 'INVALID_CONTRACT_ENTRY',\n });\n continue;\n }\n\n const obj = entry as Record<string, unknown>;\n\n // Validate extends\n if (obj.extends !== undefined) {\n if (typeof obj.extends !== 'string') {\n errors.push({\n path: `${name}.extends`,\n message: 'extends must be a string',\n code: 'INVALID_EXTENDS',\n });\n } else if (!contractNames.includes(obj.extends)) {\n errors.push({\n path: `${name}.extends`,\n message: `extends references non-existent contract \"${obj.extends}\"`,\n value: obj.extends,\n code: 'INVALID_EXTENDS',\n });\n }\n }\n\n // Validate tagging\n if (obj.tagging !== undefined) {\n if (\n typeof obj.tagging !== 'number' ||\n !Number.isInteger(obj.tagging) ||\n obj.tagging < 0\n ) {\n errors.push({\n path: `${name}.tagging`,\n message: 'tagging must be a non-negative integer',\n value: obj.tagging,\n code: 'INVALID_TAGGING',\n });\n }\n }\n\n // Validate sections\n for (const key of SECTION_KEYS) {\n if (key in obj) {\n if (typeof obj[key] !== 'object' || obj[key] === null) {\n errors.push({\n path: `${name}.${key}`,\n message: `Section \"${key}\" must be a JSON Schema object`,\n value: obj[key],\n code: 'INVALID_SECTION',\n });\n }\n }\n }\n\n // Validate events\n if (obj.events !== undefined) {\n if (typeof obj.events !== 'object' || obj.events === null) {\n errors.push({\n path: `${name}.events`,\n message: 'events must be an object',\n code: 'INVALID_EVENTS',\n });\n } else {\n validateEntityActions(\n obj.events as Record<string, unknown>,\n `${name}.events`,\n errors,\n );\n }\n }\n }\n\n // Check for circular extends\n for (const name of contractNames) {\n const visited = new Set<string>();\n let current = name;\n while (current) {\n if (visited.has(current)) {\n errors.push({\n path: `${name}.extends`,\n message: `Circular extends chain: ${[...visited, current].join(' → ')}`,\n code: 'CIRCULAR_EXTENDS',\n });\n break;\n }\n visited.add(current);\n const entry = contracts[current] as Record<string, unknown> | undefined;\n current = (entry?.extends as string) || '';\n }\n }\n\n return {\n valid: errors.length === 0,\n type: 'contract',\n errors,\n warnings,\n details,\n };\n}\n\nfunction validateEntityActions(\n obj: Record<string, unknown>,\n prefix: string,\n errors: ValidationError[],\n): void {\n for (const [entityKey, entityValue] of Object.entries(obj)) {\n if (entityKey.trim() === '') {\n errors.push({\n path: `${prefix}.${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: `${prefix}.${entityKey}`,\n message: `Entity \"${entityKey}\" must be an object`,\n value: entityValue,\n code: 'INVALID_ENTITY',\n });\n continue;\n }\n\n for (const [actionKey, actionValue] of Object.entries(\n entityValue as Record<string, unknown>,\n )) {\n if (actionKey.trim() === '') {\n errors.push({\n path: `${prefix}.${entityKey}.${actionKey}`,\n message: 'Action key cannot be empty',\n code: 'INVALID_ACTION_KEY',\n });\n continue;\n }\n\n if (\n typeof actionValue !== 'object' ||\n actionValue === null ||\n Array.isArray(actionValue)\n ) {\n errors.push({\n path: `${prefix}.${entityKey}.${actionKey}`,\n message: 'Contract entry must be a JSON Schema object',\n value: typeof actionValue,\n code: 'INVALID_SCHEMA_ENTRY',\n });\n }\n }\n }\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/event.ts\n\nimport { validateEvent as coreValidateEvent } from '../../../core/event-validation.js';\nimport type { ValidateResult } from '../types.js';\n\nexport function validateEvent(input: unknown): ValidateResult {\n const result = coreValidateEvent(input, 'strict');\n\n return {\n valid: result.valid,\n type: 'event',\n errors: result.errors,\n warnings: result.warnings,\n details: result.details as Record<string, unknown>,\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 { validateFlowConfig } = 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 validateFlowConfig 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 = validateFlowConfig(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 flowSettings = (flows as Record<string, Flow.Settings>)[name];\n if (!flowSettings) continue;\n\n const connections = buildConnectionGraph(flowSettings);\n for (const conn of connections) {\n checkCompatibility(conn, errors, warnings);\n }\n totalConnections += connections.length;\n\n // Contract compliance (contracts live on Config level only)\n const contract = config.contract as Flow.Contract | undefined;\n if (contract) {\n checkContractCompliance(flowSettings, contract, warnings);\n }\n }\n details.connectionsChecked = totalConnections;\n\n // Check for flat dot-separated mapping keys (common mistake)\n for (const name of flowsToCheck) {\n const flowSettings = (flows as Record<string, Flow.Settings>)[name];\n if (!flowSettings) continue;\n\n for (const [destName, dest] of Object.entries(\n flowSettings.destinations || {},\n )) {\n const destConfig = dest as {\n config?: { mapping?: Record<string, unknown> };\n };\n const mapping = destConfig.config?.mapping;\n if (!mapping || typeof mapping !== 'object') continue;\n\n for (const key of Object.keys(mapping)) {\n if (key.includes('.') && !key.includes(' ')) {\n const parts = key.split('.');\n warnings.push({\n path: `destination.${destName}.config.mapping`,\n message: `Mapping key \"${key}\" looks like dot-notation. Mapping uses nested entity → action structure.`,\n suggestion: `Use nested format: { \"${parts[0]}\": { \"${parts.slice(1).join('.')}\": { ... } } }`,\n });\n }\n }\n }\n }\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 buildConnectionGraph(config: Flow.Settings): 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.Settings,\n contract: Flow.Contract,\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 entityContract = contract[event.entity] as\n | Record<string, unknown>\n | undefined;\n if (!entityContract || typeof entityContract !== 'object') continue;\n\n const actionSchema = entityContract[event.action] || entityContract['*'];\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 { throwApiError } from '../../core/api-error.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) throwApiError(error, '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) throwApiError(error, '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 // Config is user-provided JSON; server validates the full schema\n body: { name: options.name, config: options.content } as never,\n });\n if (error) throwApiError(error, '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.config = 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) throwApiError(error, '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) throwApiError(error, '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) throwApiError(error, '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","export interface ApiErrorDetail {\n path: string;\n message: string;\n}\n\nexport class ApiError extends Error {\n code?: string;\n details?: ApiErrorDetail[];\n\n constructor(\n message: string,\n options?: { code?: string; details?: ApiErrorDetail[] },\n ) {\n super(message);\n this.name = 'ApiError';\n this.code = options?.code;\n this.details = options?.details;\n }\n}\n\n/**\n * Extract structured error from an openapi-fetch error response and throw.\n * The error shape is: { error: { code, message, details: { errors: [] } } }\n */\nexport function throwApiError(error: unknown, fallbackMessage: string): never {\n if (\n error &&\n typeof error === 'object' &&\n 'error' in error &&\n typeof (error as Record<string, unknown>).error === 'object'\n ) {\n const inner = (error as { error: Record<string, unknown> }).error;\n const message = (inner.message as string) || fallbackMessage;\n const code = inner.code as string | undefined;\n const details = (inner.details as Record<string, unknown>)?.errors as\n | ApiErrorDetail[]\n | undefined;\n throw new ApiError(message, { code, details });\n }\n throw new ApiError(fallbackMessage);\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport { ApiError, throwApiError } from '../../core/api-error.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 resolveSettingsId(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 settings = (flow as { settings?: Array<{ id: string; name: string }> })\n .settings;\n if (!settings?.length) {\n throw new Error('Flow has no settings.');\n }\n const match = settings.find((c) => c.name === options.flowName);\n if (!match) {\n throw new Error(\n `Flow \"${options.flowName}\" not found. Available: ${settings.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 settings = (flow as { settings?: Array<{ name: string }> }).settings;\n return settings?.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 timeoutMs = options.timeout ?? 120_000;\n\n const response = await apiFetch(\n `/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 settingsId = await resolveSettingsId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n return deploySettings({\n ...options,\n projectId,\n settingsId,\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 try {\n throwApiError(error, 'Failed to start deployment');\n } catch (e) {\n if (e instanceof ApiError && e.code === 'AMBIGUOUS_CONFIG') {\n const names = await getAvailableFlowNames({\n flowId: options.flowId,\n projectId,\n });\n throw new ApiError(\n `This flow has multiple settings. Use --flow <name> to specify one.\\nAvailable: ${names.join(', ')}`,\n { code: 'AMBIGUOUS_CONFIG' },\n );\n }\n throw e;\n }\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-settings routes\nasync function deploySettings(options: {\n flowId: string;\n projectId: string;\n settingsId: string;\n wait?: boolean;\n timeout?: number;\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n}) {\n const { flowId, projectId, settingsId } = options;\n\n // 1. Trigger per-settings deploy\n const response = await apiFetch(\n `/api/projects/${projectId}/flows/${flowId}/settings/${settingsId}/deploy`,\n { method: 'POST' },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, `Deploy failed (${response.status})`);\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 settingsId = await resolveSettingsId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n const response = await apiFetch(\n `/api/projects/${projectId}/flows/${options.flowId}/settings/${settingsId}/deploy`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, '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) throwApiError(error, '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 { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport { throwApiError } from '../../core/api-error.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 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 apiFetch(\n `/api/projects/${id}/deployments${qs ? `?${qs}` : ''}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to list deployments');\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\n const response = await apiFetch(\n `/api/projects/${id}/deployments/${options.slug}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to get deployment');\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\n const response = await apiFetch(`/api/projects/${id}/deployments`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ type: options.type, label: options.label }),\n });\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to create deployment');\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\n const response = await apiFetch(\n `/api/projects/${id}/deployments/${options.slug}`,\n { method: 'DELETE' },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to delete deployment');\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 resp = await apiFetch(`/api/projects/${id}/flows/${config}`);\n if (!resp.ok) {\n const body = await resp.json().catch(() => ({}));\n throwApiError(body, `Failed to fetch flow ${config}`);\n }\n const flow = (await resp.json()) as { config?: unknown };\n if (!flow.config) throw new Error('Flow has no config');\n\n const flowConfig = flow.config as { flows?: Record<string, unknown> };\n const flows = flowConfig.flows;\n if (!flows) throw new Error('Invalid flow config: missing flows');\n const flowName = options.flow ?? Object.keys(flows)[0];\n if (!flowName) throw new Error('No flows found in config');\n const flowSettings = flows[flowName];\n if (!flowSettings || typeof flowSettings !== 'object')\n throw new Error('Invalid flow config');\n\n if ('web' in flowSettings) type = 'web';\n else if ('server' in flowSettings) 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.flowSettings);\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","import { createInterface } from 'readline';\nimport { readConfig, writeConfig } from '../../lib/config-file.js';\nimport { publicFetch } from '../../core/http.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\n\n// === Programmatic API ===\n\nexport interface FeedbackOptions {\n anonymous?: boolean;\n version?: string;\n}\n\nexport async function feedback(\n text: string,\n options?: FeedbackOptions,\n): Promise<void> {\n const config = readConfig();\n\n const anonymous = options?.anonymous ?? config?.anonymousFeedback ?? true;\n\n const payload: {\n text: string;\n userId?: string;\n projectId?: string;\n version?: string;\n } = { text };\n\n if (options?.version) {\n payload.version = options.version;\n }\n\n if (!anonymous && config?.email) {\n payload.userId = config.email;\n const projectId = process.env.WALKEROS_PROJECT_ID;\n if (projectId) {\n payload.projectId = projectId;\n }\n }\n\n const response = await publicFetch('/api/feedback', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `Feedback submission failed: ${response.status} ${response.statusText}`,\n );\n }\n}\n\n// === CLI Command Handler ===\n\nexport async function feedbackCommand(text: string): Promise<void> {\n const logger = createCLILogger({});\n try {\n const config = readConfig();\n let anonymous: boolean;\n\n if (config?.anonymousFeedback === undefined) {\n // First time: prompt user for consent\n const answer = await promptUser(\n 'Include your user and project info with feedback? (y/N) ',\n );\n const anonymousFeedback = !answer.toLowerCase().startsWith('y');\n\n // Persist the choice\n if (config) {\n writeConfig({ ...config, anonymousFeedback });\n } else {\n writeConfig({\n token: '',\n email: '',\n appUrl: '',\n anonymousFeedback,\n });\n }\n anonymous = anonymousFeedback;\n } else {\n anonymous = config.anonymousFeedback;\n }\n\n await feedback(text, { anonymous });\n logger.info('Feedback sent. Thanks!');\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nfunction promptUser(question: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\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.Settings,\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.Settings,\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.Settings,\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.Settings,\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"],"mappings":"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","names":["path","path","fs","path","existsSync","path","init_utils","path","fs","fs","fs","path","fs","path","init_utils","schemas","path","path","fs","input","path","fs","semver","_","deps","peerDeps","peerMeta","m","a","b","p","c","fs","path","getHashServer","path","fs","validateFlowConfig","stats","_","c","d","m","v","k","fs","path","fs","path","fs","getPlatform","r","existsSync","mkdirSync","writeFileSync","readFileSync","join","path","fs","init_utils","path","fs","getPlatform","init_utils","path","resolve","a","b","g","path","_","v","k","path","fs","getPlatform","getPlatform","loadDestinationEnvs","fs","path","schemas","fs","i","getPlatform","loadDestinationEnvs","path","r","path","writeFileSync","homedir","join","existsSync","mkdirSync","writeFileSync","isUrl","path","existsSync","z","z","z","z","z","z","z","z","z","z","existsSync","init_utils","writeFileSync","fs","resolve","resolve","dirname","pathToFileURL","resolve","dirname","readFileSync","fileURLToPath","dirname","join","p","writeFileSync","fs","join","homedir","prepareBundleForRun","path","writeFileSync","writeCache","chalk","validateEvent","schemas","validateFlowConfig","path","a","b","k","r","path","m","schemas","validate","validateEvent","chalk","f","r","handleResult","c","r","getPlatform","handleResult","result","getPlatform","resolve","m"]}