@walkeros/cli 4.0.0 → 4.1.0-next-1778155282668

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/client-context.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/targets.ts","../src/commands/bundle/upload.ts","../src/commands/bundle/stats.ts","../src/commands/bundle/dockerfile.ts","../src/commands/bundle/index.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/async-drain-pump.ts","../src/commands/push/prepare.ts","../src/commands/push/plan-simulate.ts","../src/commands/push/dispatch-simulate.ts","../src/commands/push/run.ts","../src/commands/run/index.ts","../src/runtime/resolve-bundle.ts","../src/runtime/config-fetcher.ts","../src/runtime/runner-auth-error.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/core/api-client.ts","../src/core/api-error.ts","../src/commands/auth/index.ts","../src/commands/projects/index.ts","../src/commands/flows/index.ts","../src/commands/deploy/index.ts","../src/commands/deployments/index.ts","../src/commands/feedback/index.ts","../src/commands/telemetry/index.ts","../src/telemetry/install-id.ts","../src/commands/bundle/wrap.ts","../src/commands/previews/index.ts","../src/commands/simulate/example-loader.ts","../src/commands/simulate/compare.ts","../src/telemetry/index.ts","../src/telemetry/emitter.ts","../src/telemetry/init-config.ts","../src/telemetry/environment.ts","../src/telemetry/consent.ts","../src/telemetry/first-run-notice.ts","../src/telemetry/ci.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 defaultProjectId?: string;\n /**\n * UUID v4, generated and persisted only when the user explicitly opts in\n * to telemetry (`walkeros telemetry enable`). Absent in the default state.\n */\n installationId?: string;\n /**\n * Explicit consent toggle for telemetry. Tri-state:\n * - `undefined`: no decision yet, default (nothing is collected).\n * - `true`: user opted in via `walkeros telemetry enable`.\n * - `false`: user opted out via `walkeros telemetry disable`.\n */\n telemetryEnabled?: 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 * Persist telemetry-relevant fields without touching unrelated config.\n * Reads the existing config (if any) and merges in the provided fields.\n * Used by the `telemetry enable` command to write `installationId` +\n * `telemetryEnabled: true` atomically, and by the `telemetry disable`\n * command to write `telemetryEnabled: false` alone.\n */\nexport function writeTelemetryOnlyConfig(partial: {\n installationId?: string;\n telemetryEnabled?: boolean;\n}): void {\n const existing = readConfig() ?? {};\n writeConfig({ ...existing, ...partial });\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 * Set the anonymous feedback preference in the config.\n * Does nothing when no config exists (avoids creating a skeleton config).\n */\nexport function setFeedbackPreference(anonymous: boolean): void {\n const config = readConfig();\n if (!config) return;\n writeConfig({ ...config, anonymousFeedback: anonymous });\n}\n\n/**\n * Get the anonymous feedback preference from the config.\n * Returns undefined when not set or no config exists.\n */\nexport function getFeedbackPreference(): boolean | undefined {\n const config = readConfig();\n return config?.anonymousFeedback;\n}\n\n/**\n * Set the default project ID in the config.\n * Throws if no config exists (user not authenticated).\n */\nexport function setDefaultProject(projectId: string): void {\n const config = readConfig();\n if (!config) {\n throw new Error('Not authenticated. Run `walkeros login` first.');\n }\n writeConfig({ ...config, defaultProjectId: projectId });\n}\n\n/**\n * Get the default project ID from the config, or null if not set.\n */\nexport function getDefaultProject(): string | null {\n const config = readConfig();\n return config?.defaultProjectId ?? null;\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","export type ClientType = 'cli' | 'mcp' | 'runner';\n\nexport interface ClientContext {\n type: ClientType;\n version: string;\n}\n\nlet context: ClientContext | undefined;\n\n/**\n * Set the client context used to identify this process to the walkerOS app.\n *\n * The CLI binary calls this at startup, the MCP server calls it on boot, and\n * the runner Docker image overrides the resolved type via the\n * `WALKEROS_CLIENT_TYPE` env var (env wins over `input.type`).\n */\nexport function setClientContext(input: {\n type?: ClientType;\n version: string;\n}): void {\n const envType = process.env.WALKEROS_CLIENT_TYPE as ClientType | undefined;\n // Env wins over input.type — lets the runner Docker image override the\n // default chosen by the binary entry point without code changes.\n const type = envType ?? input.type ?? 'cli';\n context = { type, version: input.version };\n}\n\nexport function getClientContext(): ClientContext | undefined {\n return context;\n}\n\nexport function resetClientContext(): void {\n context = undefined;\n}\n\n/**\n * Produce the outbound client-identification headers, or an empty object when\n * no context has been set yet (e.g. in tests or pre-bootstrap code paths).\n */\nexport function clientContextHeaders(): Record<string, string> {\n if (!context) return {};\n return {\n 'User-Agent': `walkeros-${context.type}/${context.version}`,\n 'X-WalkerOS-Client': context.type,\n 'X-WalkerOS-Client-Version': context.version,\n };\n}\n","import {\n resolveAppUrl,\n resolveToken,\n resolveDeployToken,\n} from '../lib/config-file.js';\nimport { clientContextHeaders } from './client-context.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 * Build the final outbound header set by merging client-context headers\n * (User-Agent, X-WalkerOS-Client, X-WalkerOS-Client-Version) with auth.\n * Caller-provided headers win over client-context defaults.\n */\nfunction buildHeaders(\n token: string | null | undefined,\n headers?: HeadersInit,\n): Record<string, string> {\n return {\n ...clientContextHeaders(),\n ...mergeAuthHeaders(token, headers),\n };\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: buildHeaders(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}`, {\n ...init,\n headers: {\n ...clientContextHeaders(),\n ...normalizeHeaders(init?.headers),\n },\n });\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: buildHeaders(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 CLI assets.\n * All paths resolve relative to base directory (defaults to cwd).\n */\n\nimport path from 'path';\nimport { isUrl } from '../config/utils.js';\n\n/**\n * Asset type for resolution strategy\n */\nexport type AssetType = 'config' | 'bundle';\n\n/**\n * Resolve asset path.\n *\n * Resolution rules:\n * 1. URLs → pass through unchanged\n * 2. Absolute paths → use as-is\n * 3. Everything else (bare names, relative paths) → resolve from base directory\n *\n * @param assetPath - Path to resolve\n * @param assetType - Type of asset (currently unused, kept for API compatibility)\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 // Absolute path → use as-is\n if (path.isAbsolute(assetPath)) {\n return assetPath;\n }\n\n // Everything else → resolve from base directory (cwd by default)\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 {\n resolveToken,\n resolveDeployToken,\n getDefaultProject,\n} from '../lib/config-file.js';\n\nexport function getToken(): string | undefined {\n const result = resolveToken();\n return result?.token;\n}\n\nexport function getAuthHeaders(): Record<string, string> {\n const token = getToken();\n if (!token) return {};\n return { Authorization: `Bearer ${token}` };\n}\n\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 || getDefaultProject();\n if (!projectId)\n throw new Error(\n 'No project selected. Set WALKEROS_PROJECT_ID or configure a default project.',\n );\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: Record<string, Flow.BundlePackage> | 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.Json validation.\n */\n\nimport type { Flow } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\n\nconst { safeParseConfig } = schemas;\n\n/**\n * Detect platform from a single flow.\n *\n * Platform is determined by `flow.config.platform`.\n */\nexport function detectPlatform(\n flow: Record<string, unknown>,\n): 'web' | 'server' | undefined {\n const config = flow.config;\n if (!isObject(config)) return undefined;\n const platform = config.platform;\n if (platform === 'web' || platform === 'server') return platform;\n return undefined;\n}\n\n/**\n * Type guard: Check if config is a valid Flow.Json 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.Json {\n const result = safeParseConfig(data);\n return result.success;\n}\n\n/**\n * Validate Flow.Json 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.Json\n * @throws Error with descriptive message if validation fails\n */\nexport function validateFlowConfig(data: unknown): Flow.Json {\n // After successful Zod parse, the data conforms structurally to Flow.Json.\n // The existing `isFlowConfig` guard re-narrows `unknown` to `Flow.Json` via\n // the same schema — TS can't see through `safeParseConfig` because it\n // returns a Zod-inferred type that differs nominally (not structurally)\n // from the Flow.Json interface.\n if (isFlowConfig(data)) return data;\n\n // Not parseable — format Zod errors for CLI display.\n const result = safeParseConfig(data);\n if (result.success) {\n // Defensive: isFlowConfig and safeParseConfig disagreed (cannot happen).\n throw new Error('Invalid configuration: failed Flow.Json type guard.');\n }\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 throw new Error(`Invalid configuration:\\n${errors}`);\n}\n\n/**\n * Get available flow names from a Flow.Json.\n *\n * @param config - Flow.Json configuration\n * @returns Array of flow names\n */\nexport function getAvailableFlows(config: Flow.Json): 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.Json 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 (resolved single Flow) */\n flowSettings: Flow;\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.Json 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.Json\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 config.platform set to \"web\" or \"server\".`,\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 + overrides from flowSettings.config.bundle (if present)\n const packages = flowSettings.config?.bundle?.packages || {};\n const overrides = flowSettings.config?.bundle?.overrides || {};\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 overrides,\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.Json 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.Json,\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.Json\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.Json from @walkeros/core\n * Build options: Static platform defaults from build-defaults.ts\n */\n\n// Type guards and validators\nexport {\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 // Boundary: walker traverses arbitrary JSON. After typeof === 'object'\n // narrowing, indexing as a Record<string, unknown> is the typed way to\n // enumerate values.\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(step: Record<string, unknown>): {\n codeProps: Record<string, unknown>;\n dataProps: Record<string, unknown>;\n} {\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' | 'override' | '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\nexport interface NestedPackage {\n name: string;\n version: string;\n consumers: string[];\n}\n\nexport interface ResolutionResult {\n topLevel: Map<string, ResolvedPackage>;\n nested: NestedPackage[];\n}\n\nfunction getPackageDirectory(baseDir: string, packageName: string): string {\n return path.join(baseDir, 'node_modules', packageName);\n}\n\nfunction getNestedPackageDirectory(\n baseDir: string,\n consumerName: string,\n nestedPackageName: string,\n): string {\n return path.join(\n baseDir,\n 'node_modules',\n consumerName,\n 'node_modules',\n nestedPackageName,\n );\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 overrides: Record<string, 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 // Warn about overrides targeting direct local-path packages\n const directLocalNames = new Set(\n packages.filter((p) => p.path).map((p) => p.name),\n );\n for (const overrideName of Object.keys(overrides)) {\n if (directLocalNames.has(overrideName)) {\n logger.warn(\n `Override for ${overrideName} ignored — direct package is a local path`,\n );\n }\n }\n\n // Helper: substitute a transitive dep spec with its override (if any)\n const substituteDep = (\n depName: string,\n depSpec: string,\n source: 'dependency' | 'peerDependency',\n from: string,\n optional: boolean,\n ): QueueItem => {\n const overrideSpec = overrides[depName];\n if (overrideSpec) {\n return {\n name: depName,\n spec: overrideSpec,\n source: 'override',\n from: `override (was ${depSpec} from ${from})`,\n optional,\n };\n }\n return { name: depName, spec: depSpec, source, from, optional };\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 // Local package.json shape — only the fields we read.\n interface LocalPackageJson {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n peerDependenciesMeta?: Record<string, { optional?: boolean }>;\n }\n const pkgJson: LocalPackageJson = 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 substituteDep(depName, depSpec, 'dependency', item.name, 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 = peerMeta[depName]?.optional === true;\n queue.push(\n substituteDep(\n depName,\n depSpec,\n 'peerDependency',\n item.name,\n isOptional,\n ),\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. pacote.manifest returns\n // AbbreviatedManifest & ManifestResult — typed dependencies/peerDependencies.\n // peerDependenciesMeta isn't in the upstream type but is a valid npm field;\n // declare a local extension for it.\n interface ManifestWithMeta\n extends pacote.AbbreviatedManifest, pacote.ManifestResult {\n peerDependenciesMeta?: Record<string, { optional?: boolean }>;\n }\n let manifest: ManifestWithMeta;\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 deps = manifest.dependencies || {};\n for (const [depName, depSpec] of Object.entries(deps)) {\n if (typeof depSpec === 'string') {\n queue.push(\n substituteDep(depName, depSpec, 'dependency', item.name, false),\n );\n }\n }\n\n // Queue peerDependencies with metadata\n const peerDeps = manifest.peerDependencies || {};\n const peerMeta = manifest.peerDependenciesMeta || {};\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 substituteDep(\n depName,\n depSpec,\n 'peerDependency',\n item.name,\n isOptional,\n ),\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 override: 1,\n dependency: 2,\n peerDependency: 3,\n};\n\nexport function resolveVersionConflicts(\n allSpecs: Map<string, VersionSpec[]>,\n logger: Logger.Instance,\n): ResolutionResult {\n const topLevel = new Map<string, ResolvedPackage>();\n const nested: NestedPackage[] = [];\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 topLevel.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 const alreadyNested = new Set<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 // Site A: multiple exact versions — highest wins, losers get nested\n const sorted = [...uniqueExact].sort(semver.rcompare);\n chosenVersion = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n const loserVersion = sorted[i];\n const consumers = activeSpecs\n .filter((s) => s.spec === loserVersion)\n .map((s) => s.from);\n nested.push({ name, version: loserVersion, consumers });\n alreadyNested.add(loserVersion);\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 } else if (!alreadyNested.has(spec.spec)) {\n // Site C: transitive exact differs from chosen — nest it\n nested.push({ name, version: spec.spec, consumers: [spec.from] });\n alreadyNested.add(spec.spec);\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 // Site B: range not satisfied — nest the range\n nested.push({ name, version: spec.spec, consumers: [spec.from] });\n }\n }\n }\n }\n }\n\n topLevel.set(name, { name, version: chosenVersion });\n }\n\n // Consolidate nested entries with same name+version (merge consumers)\n const consolidatedMap = new Map<string, NestedPackage>();\n for (const entry of nested) {\n const key = `${entry.name}@${entry.version}`;\n const existing = consolidatedMap.get(key);\n if (existing) {\n for (const c of entry.consumers) {\n if (!existing.consumers.includes(c)) existing.consumers.push(c);\n }\n } else {\n consolidatedMap.set(key, { ...entry, consumers: [...entry.consumers] });\n }\n }\n\n return { topLevel, nested: [...consolidatedMap.values()] };\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 overrides: Record<string, 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(\n packages,\n logger,\n configDir,\n overrides,\n );\n\n // Phase 2: Resolve conflicts\n const { topLevel, nested } = 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 topLevel) {\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 // Install nested packages\n for (const nestedPkg of nested) {\n let resolvedSpec = `${nestedPkg.name}@${nestedPkg.version}`;\n\n if (!semver.valid(nestedPkg.version)) {\n try {\n const manifest = await withTimeout(\n pacote.manifest(resolvedSpec, PACOTE_OPTS),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Manifest fetch timed out: ${resolvedSpec}`,\n );\n resolvedSpec = `${nestedPkg.name}@${manifest.version}`;\n } catch (error) {\n throw new Error(\n `Failed to resolve nested dependency ${resolvedSpec}: ${error}`,\n );\n }\n }\n\n for (const consumer of nestedPkg.consumers) {\n const nestedDir = getNestedPackageDirectory(\n targetDir,\n consumer,\n nestedPkg.name,\n );\n try {\n await fs.ensureDir(path.dirname(nestedDir));\n const cacheDir =\n process.env.NPM_CACHE_DIR || getTmpPath(tmpDir, 'cache', 'npm');\n await withTimeout(\n pacote.extract(resolvedSpec, nestedDir, {\n ...PACOTE_OPTS,\n cache: cacheDir,\n }),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Nested package download timed out: ${resolvedSpec}`,\n );\n logger.debug(`Nested: ${resolvedSpec} under ${consumer}`);\n } catch (error) {\n throw new Error(\n `Failed to install nested ${resolvedSpec} for ${consumer}: ${error}`,\n );\n }\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.Code {\n return (\n code !== null &&\n typeof code === 'object' &&\n !Array.isArray(code) &&\n 'push' in code\n );\n}\n\n/**\n * Type-narrowed accessor for a Flow section. Returns the typed step record\n * (or undefined) — exhaustive switch over the literal-union parameter avoids\n * a generic indexed-access cast.\n *\n * Returns the union of all section types when the caller passes a runtime\n * variable. Call sites that need a specific section type access the field\n * directly (e.g. `flow.sources`).\n */\ntype FlowStepRecord =\n | Record<string, Flow.Source>\n | Record<string, Flow.Destination>\n | Record<string, Flow.Transformer>\n | Record<string, Flow.Store>;\nfunction getFlowSection(\n flow: Flow,\n section: 'sources' | 'destinations' | 'transformers' | 'stores',\n): FlowStepRecord | undefined {\n switch (section) {\n case 'sources':\n return flow.sources;\n case 'destinations':\n return flow.destinations;\n case 'transformers':\n return flow.transformers;\n case 'stores':\n return flow.stores;\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.Code,\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,\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\nexport async function bundleCore(\n flowSettings: Flow,\n buildOptions: BuildOptions,\n logger: Logger.Instance,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\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(flowSettings.sources || {}).length > 0 ||\n Object.keys(flowSettings.destinations || {}).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 [\n 'sources',\n 'destinations',\n 'transformers',\n 'stores',\n ] as const) {\n const steps = getFlowSection(flowSettings, 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 buildOptions.overrides,\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 platform: buildOptions.platform as 'browser' | 'node',\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 */\nexport function detectStepPackages(\n flowSettings: Flow,\n section: 'sources' | 'destinations' | 'transformers' | 'stores',\n): Set<string> {\n const packages = new Set<string>();\n const steps = getFlowSection(flowSettings, section);\n\n if (steps) {\n for (const [, stepConfig] of Object.entries(steps)) {\n if (typeof stepConfig !== 'object' || stepConfig === null) continue;\n // Require explicit package field\n if (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(flowSettings: Flow): 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,\n): Map<string, Set<string>> {\n const explicitCodeImports = new Map<string, Set<string>>();\n\n // Check destinations\n const destinations = flowSettings.destinations;\n\n if (destinations) {\n for (const [, destConfig] of Object.entries(destinations)) {\n if (\n typeof destConfig.package === 'string' &&\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 = flowSettings.sources;\n\n if (sources) {\n for (const [, sourceConfig] of Object.entries(sources)) {\n if (\n typeof sourceConfig.package === 'string' &&\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 = flowSettings.transformers;\n\n if (transformers) {\n for (const [, transformerConfig] of Object.entries(transformers)) {\n if (\n typeof transformerConfig.package === 'string' &&\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 = flowSettings.stores;\n\n if (stores) {\n for (const [, storeConfig] of Object.entries(stores)) {\n if (\n typeof storeConfig.package === 'string' &&\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 devExportEntries: 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 */\nasync function 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 packagePaths: Map<string, string>,\n withDev: boolean,\n): Promise<ImportGenerationResult> {\n const importStatements: 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\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 // Generate /dev imports for packages that expose a ./dev export.\n // Only emitted when withDev is true (i.e., skipWrapper bundles consumed by\n // push/simulate/flow-context). Production IIFE bundles skip this entirely —\n // otherwise the dev graph (zod schemas, etc.) leaks into walker.js because\n // stage 2 esbuild cannot tree-shake transitive imports out of the already-\n // concatenated stage 1 file.\n const devExportEntries: string[] = [];\n if (withDev) {\n for (const packageName of usedPackages) {\n const localPath = packagePaths.get(packageName);\n if (!localPath) continue;\n\n try {\n const pkgJsonPath = path.join(localPath, 'package.json');\n const pkgJson = await fs.readJSON(pkgJsonPath);\n const exports = pkgJson.exports;\n if (exports && typeof exports === 'object' && './dev' in exports) {\n const varName = `__dev_${packageNameToVariable(packageName)}`;\n importStatements.push(\n `import * as ${varName} from '${packageName}/dev';`,\n );\n devExportEntries.push(`'${packageName}': ${varName}`);\n }\n } catch {\n // Package doesn't have a readable package.json — skip gracefully\n }\n }\n }\n\n return { importStatements, devExportEntries };\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,\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 return;\n }\n if (obj === null || typeof obj !== 'object') return;\n // Boundary: walker traverses arbitrary JSON. After typeof === 'object'\n // narrowing, indexing as a Record<string, unknown> is the typed way\n // to enumerate keys.\n for (const [key, val] of Object.entries(obj)) {\n collectRefs(val, `${path}.${key}`);\n }\n }\n\n // Scan all component env/config values\n const sectionMap = {\n sources: flowSettings.sources || {},\n destinations: flowSettings.destinations || {},\n transformers: flowSettings.transformers || {},\n };\n for (const [section, components] of Object.entries(sectionMap)) {\n for (const [id, component] of Object.entries(components)) {\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,\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(Object.keys(flowSettings.stores || {}));\n validateStoreReferences(flowSettings, storeIds);\n\n // Validate component names are valid JS identifiers (they become property names in generated code)\n if (flowSettings.sources)\n validateComponentNames(flowSettings.sources, 'sources');\n if (flowSettings.destinations)\n validateComponentNames(flowSettings.destinations, 'destinations');\n if (flowSettings.transformers)\n validateComponentNames(flowSettings.transformers, 'transformers');\n if (flowSettings.stores)\n validateComponentNames(flowSettings.stores, 'stores');\n\n // Generate import statements.\n // withDev is resolved from the BundleTarget preset by the public `bundle()`\n // entry point. When called directly via `bundleCore` (push, simulate, tests),\n // we fall back to `skipWrapper === true` for backward compatibility — those\n // call sites historically relied on skipWrapper to pull in /dev schemas.\n const withDev =\n buildOptions.withDev !== undefined\n ? buildOptions.withDev === true\n : buildOptions.skipWrapper === true;\n const { importStatements, devExportEntries } = await generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n transformerPackages,\n storePackages,\n explicitCodeImports,\n packagePaths,\n withDev,\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 // Append __devExports if any packages expose /dev\n const devExportsBlock =\n devExportEntries.length > 0\n ? `\\nexport const __devExports = {\\n ${devExportEntries.join(',\\n ')},\\n};`\n : '';\n\n // Return ESM module (imports + wireConfig + startFlow re-export + optional devExports)\n const fullModule = wireConfigModule + devExportsBlock;\n const codeEntry = importsCode\n ? `${importsCode}\\n\\n${fullModule}`\n : fullModule;\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,\n explicitCodeImports: Map<string, Set<string>>,\n): {\n storesDeclaration: string;\n codeConfigObject: string;\n dataPayload: string;\n} {\n const sources = flowSettings.sources || {};\n const destinations = flowSettings.destinations || {};\n const transformers = flowSettings.transformers || {};\n const stores = flowSettings.stores || {};\n\n // Data payload accumulator\n const dataPayloadObj: Record<string, Record<string, unknown>> = {};\n\n // Union of all step types — share helpers across sources/destinations/transformers/stores\n type FlowStep =\n | Flow.Source\n | Flow.Destination\n | Flow.Transformer\n | Flow.Store;\n\n // Helper to resolve the code variable for a package-based step\n function resolveCodeVar(step: FlowStep): 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(step: FlowStep): 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: FlowStep,\n ): string {\n const codeVar = resolveCodeVar(step);\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\n Object.entries(sources).forEach(([name, source]) => {\n validateReference('Source', name, source);\n });\n Object.entries(destinations).forEach(([name, dest]) => {\n validateReference('Destination', name, dest);\n });\n Object.entries(transformers).forEach(([name, transformer]) => {\n validateReference('Transformer', name, transformer);\n });\n\n // Build sources\n const sourcesEntries = Object.entries(sources)\n .filter(([, source]) => source.package || hasCodeReference(source.code))\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('sources', key, source);\n });\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations)\n .filter(([, dest]) => dest.package || hasCodeReference(dest.code))\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('destinations', key, dest);\n });\n\n // Build transformers\n const transformersEntries = Object.entries(transformers)\n .filter(\n ([, transformer]) =>\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('transformers', key, transformer);\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);\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 (flowSettings.collector) {\n if (containsCodeMarkers(flowSettings.collector)) {\n // Collector has code markers — keep in code skeleton\n collectorStr = `,\\n ...${processConfigValue(flowSettings.collector)}`;\n } else {\n // Plain collector — put in data payload. Spread copies own enumerable\n // properties into a Record<string, unknown>-compatible target.\n dataPayloadObj['collector'] = { ...flowSettings.collector };\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: {\n windowCollector?: string;\n windowElb?: string;\n /** Runtime platform. 'browser' emits env.window/env.document injection; 'node' omits it. Default 'browser' for backward compat. */\n platform?: 'browser' | 'node';\n } = {},\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 const platform = options.platform ?? 'browser';\n const envBlock =\n platform === 'browser'\n ? `\n if (config.sources) {\n for (const key of Object.keys(config.sources)) {\n const source = config.sources[key];\n if (!source) continue;\n const env = source.env ?? (source.env = {});\n env.window = env.window ?? (typeof window !== 'undefined' ? window : undefined);\n env.document = env.document ?? (typeof document !== 'undefined' ? document : undefined);\n }\n }`\n : '';\n\n return `import { startFlow, wireConfig } from '${stage1Path}';\n\nconst __configData = ${dataPayload};\n\n(async () => {\n const config = wireConfig(__configData);${envBlock}\n const { collector, elb } = await startFlow(config);${assignmentCode}\n})();`;\n}\n\n/**\n * Generate a stage 2 entry file for wrapping an ALREADY-embedded skeleton.\n *\n * Unlike `generateWebEntry`, this variant imports `__configData` from the\n * skeleton (instead of inlining a `dataPayload` string). Used by the\n * publish-time `wrapSkeleton` helper, which runs on a stage 1 skeleton\n * produced via `bundle({ skipWrapper: true })` — those skeletons already\n * export `__configData` alongside `wireConfig` and `startFlow`.\n */\nexport function generateWrapEntry(\n stage1Path: string,\n options: {\n windowCollector?: string;\n windowElb?: string;\n previewOrigin?: string;\n previewScope?: string;\n /** Runtime platform. 'browser' emits env.window/env.document injection; 'node' omits it. Default 'browser' for backward compat. */\n platform?: 'browser' | 'node';\n } = {},\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 const hasPreview = !!(options.previewOrigin && options.previewScope);\n const previewOriginLiteral = JSON.stringify(options.previewOrigin ?? '');\n const previewScopeLiteral = JSON.stringify(options.previewScope ?? '');\n\n const preflightBlock = hasPreview\n ? `\n // --- Preview mode preflight ---\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n var __previewOrigin = ${previewOriginLiteral};\n var __previewScope = ${previewScopeLiteral};\n var __params = new URLSearchParams(location.search);\n var __tokens = __params.getAll('elbPreview');\n var __param = __tokens.length > 0 ? __tokens[__tokens.length - 1] : null;\n var __secure = location.protocol === 'https:' ? '; Secure' : '';\n\n if (__param === 'off') {\n document.cookie = 'elbPreview=; path=/; max-age=0; SameSite=Lax' + __secure;\n } else if (__param && /^[a-zA-Z0-9_-]{8,32}$/.test(__param)) {\n document.cookie = 'elbPreview=' + __param + '; path=/; max-age=604800; SameSite=Lax' + __secure;\n }\n\n var __match = /(?:^|; )elbPreview=([^;]+)/.exec(document.cookie);\n var __token = __match && __match[1];\n if (__token && /^[a-zA-Z0-9_-]{8,32}$/.test(__token)) {\n var __previewSrc = 'https://' + __previewOrigin + '/preview/' + __previewScope + '/walker.' + __token + '.js';\n var __clearPreviewCookie = function () {\n document.cookie = 'elbPreview=; path=/; max-age=0; SameSite=Lax' + __secure;\n };\n try {\n // Bound the HEAD probe so a hung CDN can never block the production\n // walker. On abort/timeout we fall through to the catch branch and\n // self-heal by clearing the cookie.\n var __ctrl = typeof AbortController !== 'undefined' ? new AbortController() : null;\n var __timeoutId = __ctrl ? setTimeout(function () { __ctrl.abort(); }, 2000) : null;\n var __probe = await fetch(__previewSrc, {\n method: 'HEAD',\n signal: __ctrl ? __ctrl.signal : undefined,\n });\n if (__timeoutId) clearTimeout(__timeoutId);\n if (__probe && __probe.ok) {\n var __s = document.createElement('script');\n __s.src = __previewSrc;\n document.head.appendChild(__s);\n return;\n }\n // Preview bundle missing (404/5xx) — self-heal by clearing cookie and\n // falling through to the production walker in this same bundle.\n __clearPreviewCookie();\n } catch (__err) {\n // Network error, timeout, or abort — fall through to production too.\n __clearPreviewCookie();\n }\n }\n }\n // --- End preview mode preflight ---\n`\n : '';\n\n const platform = options.platform ?? 'browser';\n const envBlock =\n platform === 'browser'\n ? `\n if (config.sources) {\n for (const key of Object.keys(config.sources)) {\n const source = config.sources[key];\n if (!source) continue;\n const env = source.env ?? (source.env = {});\n env.window = env.window ?? (typeof window !== 'undefined' ? window : undefined);\n env.document = env.document ?? (typeof document !== 'undefined' ? document : undefined);\n }\n }`\n : '';\n\n return `import { startFlow, wireConfig, __configData } from '${stage1Path}';\n\n(async () => {${preflightBlock}\n const config = wireConfig(__configData);${envBlock}\n const { collector, elb } = await startFlow(config);${assignmentCode}\n})();`;\n}\n\n/**\n * Generate a stage 2 entry file for wrapping a node skeleton.\n *\n * Mirrors `generateServerEntry` but imports `__configData` from the skeleton\n * instead of inlining it. Output is a default-export factory module matching\n * the runner contract at `runtime/load-bundle.ts:53-66`: `module.default` is\n * an async function that takes a context and returns\n * `{ collector, elb, httpHandler? }`.\n */\nexport function generateWrapEntryServer(stage1Path: string): string {\n return `import { startFlow, wireConfig, __configData } from '${stage1Path}';\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 * 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 * Named bundle targets with frozen presets.\n *\n * A target is the ONLY input callers should pass. All internal booleans\n * (skipWrapper, withDev, platform, env injection) derive from the preset.\n * This prevents the class of bug where the same boolean means different\n * things in different code paths (see: skipWrapper conflation, 2026-04-16).\n */\nexport type BundleTarget =\n | 'cdn' // Production browser IIFE served via CDN\n | 'cdn-skeleton' // ESM skeleton, wrapped later via wrapSkeleton → IIFE\n | 'runner' // Server skeleton for long-running Node flow runtime\n | 'simulate' // Skeleton for in-process simulate (needs /dev schemas)\n | 'push'; // Skeleton for in-process push (needs /dev schemas)\n\nexport interface TargetPreset {\n /** If true, emit ESM skeleton. If false, emit IIFE via generateWebEntry. */\n skipWrapper: boolean;\n /** If true, include @walkeros/*\\/dev imports for schema validation. */\n withDev: boolean;\n /** Runtime platform — controls env injection and Node/browser codegen. */\n platform: 'browser' | 'node';\n /**\n * If true, Stage 2 wrapper injects env.window/env.document into sources.\n * Only relevant for browser platform IIFE output.\n */\n injectEnv: boolean;\n}\n\nexport const BUNDLE_TARGETS: Readonly<\n Record<BundleTarget, Readonly<TargetPreset>>\n> = Object.freeze({\n cdn: Object.freeze({\n skipWrapper: false,\n withDev: false,\n platform: 'browser',\n injectEnv: true,\n }),\n 'cdn-skeleton': Object.freeze({\n skipWrapper: true,\n withDev: false,\n platform: 'browser',\n injectEnv: false,\n }),\n runner: Object.freeze({\n skipWrapper: true,\n withDev: false,\n platform: 'node',\n injectEnv: false,\n }),\n simulate: Object.freeze({\n skipWrapper: true,\n withDev: true,\n platform: 'node',\n injectEnv: false,\n }),\n push: Object.freeze({\n skipWrapper: true,\n withDev: true,\n platform: 'node',\n injectEnv: false,\n }),\n});\n\nexport function resolveTarget(target: BundleTarget): TargetPreset {\n const preset = BUNDLE_TARGETS[target];\n if (!preset) {\n throw new Error(\n `Unknown target: ${target}. Valid: ${Object.keys(BUNDLE_TARGETS).join(', ')}`,\n );\n }\n return preset;\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 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 type { BundleTarget } from './targets.js';\nimport { resolveTarget } from './targets.js';\nimport { uploadBundleToUrl, sanitizeUrl } from './upload.js';\nimport { displayStats, createStatsSummary } from './stats.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 // Hint for interactive terminals\n if (process.stdout.isTTY) {\n const defaultPath =\n buildOptions.platform === 'browser'\n ? './dist/walker.js'\n : './dist/bundle.mjs';\n logger.info(\n `Bundle written to stdout. Use -o ${defaultPath} to write to file.`,\n );\n }\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.Json) 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.Json config object\n * await bundle({\n * version: 4,\n * flows: {\n * default: {\n * config: {\n * platform: 'web',\n * bundle: { packages: { '@walkeros/collector': { imports: ['startFlow'] } } },\n * },\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 /**\n * Named bundle target. If omitted, falls back to\n * `buildOverrides.skipWrapper` mapping (deprecated) or `'cdn'`.\n */\n target?: BundleTarget;\n buildOverrides?: Partial<BuildOptions>;\n } = {},\n): Promise<import('./bundler').BundleStats | void> {\n // Resolve effective target: explicit target > legacy skipWrapper mapping > default 'cdn'.\n let effectiveTarget: BundleTarget;\n if (options.target) {\n effectiveTarget = options.target;\n } else if (options.buildOverrides?.skipWrapper === true) {\n // Conservative mapping: preserves /dev inclusion for existing callers that\n // historically used skipWrapper to get schemas (push/simulate shape).\n effectiveTarget = 'simulate';\n } else {\n effectiveTarget = 'cdn';\n }\n\n const preset = resolveTarget(effectiveTarget);\n\n // Deprecation warning for legacy skipWrapper usage without explicit target.\n if (\n options.buildOverrides?.skipWrapper !== undefined &&\n !options.target &&\n process.env.WALKEROS_SUPPRESS_DEPRECATIONS !== '1'\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n '[@walkeros/cli] buildOverrides.skipWrapper is deprecated. ' +\n \"Pass `target: 'cdn' | 'cdn-skeleton' | 'runner' | 'simulate' | 'push'` instead. \" +\n 'Set WALKEROS_SUPPRESS_DEPRECATIONS=1 to silence this warning.',\n );\n }\n\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.Json format.\n // Merge target-derived flags into buildOverrides so loadBundleConfig sees them.\n const mergedOverrides: Partial<BuildOptions> = {\n ...(options.buildOverrides ?? {}),\n skipWrapper: preset.skipWrapper,\n withDev: preset.withDev,\n };\n const { flowSettings, buildOptions } = loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flowName,\n buildOverrides: mergedOverrides,\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","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","declare module '@walkeros/core' {\n interface SourceMap {\n cli: { type: 'cli'; platform: 'terminal'; command?: string };\n }\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 {\n loginCommand,\n requestDeviceCode,\n pollForToken,\n} from './commands/login/index.js';\nexport type {\n DeviceCodeResult,\n DeviceCodeOptions,\n PollOptions,\n PollResult,\n} 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';\nexport {\n telemetryStatusCommand,\n telemetryEnableCommand,\n telemetryDisableCommand,\n} from './commands/telemetry/index.js';\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle } from './commands/bundle/index.js';\nexport { wrapSkeleton } from './commands/bundle/wrap.js';\nexport type { WrapSkeletonOptions } from './commands/bundle/wrap.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 setClientContext,\n getClientContext,\n resetClientContext,\n clientContextHeaders,\n} from './core/client-context.js';\nexport type { ClientType, ClientContext } from './core/client-context.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 listAllFlows,\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 deleteDeploymentByFlowId,\n DeploymentAmbiguityError,\n} from './commands/deployments/index.js';\nexport type { DeploymentSummaryForFlow } from './commands/deployments/index.js';\nexport {\n listPreviews,\n getPreview,\n createPreview,\n deletePreview,\n} from './commands/previews/index.js';\nexport type {\n ListPreviewsOptions,\n GetPreviewOptions,\n CreatePreviewOptions,\n DeletePreviewOptions,\n} from './commands/previews/index.js';\nexport type { FeedbackOptions } from './commands/feedback/index.js';\nexport {\n readConfig,\n writeConfig,\n deleteConfig,\n resolveToken,\n setDefaultProject,\n getDefaultProject,\n setFeedbackPreference,\n getFeedbackPreference,\n} from './lib/config-file.js';\nexport type { WalkerOSConfig } from './lib/config-file.js';\nexport type { ListFlowsOptions, ProjectFlows } 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// === Telemetry ===\nexport * as telemetry from './telemetry/index.js';\n\n// === Types ===\n// Export types for programmatic usage\n// Config structure uses Flow.Json (root) and Flow (single flow) 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 { PrepareInput, PreparedFlow } from './commands/push/prepare.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 writeResult,\n type Platform,\n} from '../../core/index.js';\n\nimport type { Flow, Logger, WalkerOS } from '@walkeros/core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadFlowConfig, loadJsonConfig } 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 { withFlowContext } from './flow-context.js';\nimport { prepareFlow } from './prepare.js';\nimport { schemas } from '@walkeros/core/dev';\nimport { runPushCommand } from './run.js';\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 *\n * Thin wrapper around `runPushCommand`: delegates result production to the\n * pure helper, then formats output and decides the exit code. Tests target\n * `runPushCommand` directly to avoid `process.exit` killing Jest workers.\n */\nexport async function pushCommand(options: PushCommandOptions): Promise<void> {\n const result = await runPushCommand(options);\n const duration = result.duration;\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}\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({ mock: options.mock }, flowSettings);\n\n // Bundle to temp file (env loading moved to __devExports in the bundle)\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 {\n esmPath,\n platform,\n logger,\n snapshotCode,\n timeout,\n networkCalls,\n asyncDrain: { timeout: 5000 },\n // Real push (non-simulate) needs the pump so destinations whose init\n // awaits a captured setTimeout (e.g., amplitude engagement plugin)\n // don't deadlock. Simulate routes use their own withFlowContext call\n // sites without `drainPump`, preserving snapshot ordering.\n drainPump: true,\n },\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 bundlePath?: 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 configOrPath: string | Flow.Json,\n input: unknown,\n options: SimulateSourceOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n // Resolve config: accept either file path or config object\n let config: Flow.Json;\n if (typeof configOrPath === 'string') {\n config = (await loadJsonConfig(configOrPath)) as Flow.Json;\n } else {\n config = configOrPath;\n }\n\n const prepareInput = options.bundlePath\n ? {\n mode: 'prebuilt' as const,\n bundlePath: options.bundlePath,\n config,\n flow: options.flow,\n simulate: ['source.' + options.sourceId],\n silent: options.silent,\n verbose: options.verbose,\n }\n : {\n mode: 'build' as const,\n config,\n flow: options.flow,\n simulate: ['source.' + options.sourceId],\n silent: options.silent,\n verbose: options.verbose,\n };\n\n const prepared = await prepareFlow(prepareInput);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n // Resolve source package name (needed for __devExports lookup inside context)\n const sourceConfig = (prepared.flowSettings.sources ?? {})[\n options.sourceId\n ] as { package?: string } | undefined;\n\n if (!sourceConfig?.package) {\n throw new Error(`Source \"${options.sourceId}\" has no package defined`);\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 // Look up createTrigger from __devExports (bundled /dev export)\n const devExports = module.__devExports?.[sourceConfig!.package!] as\n | { examples?: { createTrigger?: Function } }\n | undefined;\n const createTrigger = devExports?.examples?.createTrigger;\n if (!createTrigger) {\n throw new Error(\n `Source package \"${sourceConfig!.package}\" has no createTrigger in /dev export`,\n );\n }\n\n const flowConfig = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(flowConfig, 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 flowConfig.hooks = {\n ...((flowConfig.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(flowConfig, {\n sourceId: options.sourceId,\n });\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 bundlePath?: 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 configOrPath: string | Flow.Json,\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 // Resolve config: accept either file path or config object\n let config: Flow.Json;\n if (typeof configOrPath === 'string') {\n config = (await loadJsonConfig(configOrPath)) as Flow.Json;\n } else {\n config = configOrPath;\n }\n\n const prepareInput = options.bundlePath\n ? {\n mode: 'prebuilt' as const,\n bundlePath: options.bundlePath,\n config,\n flow: options.flow,\n simulate: ['transformer.' + options.transformerId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n }\n : {\n mode: 'build' as const,\n config,\n flow: options.flow,\n simulate: ['transformer.' + options.transformerId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n };\n\n const prepared = await prepareFlow(prepareInput);\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 flowConfig = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(flowConfig, prepared.overrides);\n\n // Don't initialize sources or destinations during transformer simulation.\n if (flowConfig.sources) flowConfig.sources = {};\n if (flowConfig.destinations) flowConfig.destinations = {};\n\n const result = await module.startFlow(flowConfig);\n if (!result?.collector)\n throw new Error('Invalid bundle: collector not available');\n\n const collector = result.collector;\n const transformer = 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 bundlePath?: 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 configOrPath: string | Flow.Json,\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 // Resolve config: accept either file path or config object\n let config: Flow.Json;\n if (typeof configOrPath === 'string') {\n config = (await loadJsonConfig(configOrPath)) as Flow.Json;\n } else {\n config = configOrPath;\n }\n\n const prepareInput = options.bundlePath\n ? {\n mode: 'prebuilt' as const,\n bundlePath: options.bundlePath,\n config,\n flow: options.flow,\n simulate: ['destination.' + options.destinationId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n }\n : {\n mode: 'build' as const,\n config,\n flow: options.flow,\n simulate: ['destination.' + options.destinationId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n };\n\n const prepared = await prepareFlow(prepareInput);\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 flowConfig = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(flowConfig, prepared.overrides);\n\n // Read env from bundled __devExports\n const destPkg = (prepared.flowSettings.destinations ?? {})[\n options.destinationId\n ] as { package?: string } | undefined;\n let trackedCalls: Array<{\n fn: string;\n args: unknown[];\n ts: number;\n }> = [];\n\n if (destPkg?.package) {\n const devExports = module.__devExports?.[destPkg.package] as\n | {\n examples?: {\n env?: {\n push?: Record<string, unknown>;\n simulation?: string[];\n };\n };\n }\n | undefined;\n const devEnv = devExports?.examples?.env;\n\n if (devEnv?.push) {\n const destinations = flowConfig.destinations as Record<\n string,\n { config?: { env?: Record<string, unknown> } }\n >;\n const destConfig = destinations[options.destinationId]?.config;\n if (destConfig) {\n destConfig.env = devEnv.push;\n }\n\n if (devEnv.simulation?.length) {\n const combined = {\n ...devEnv.push,\n simulation: devEnv.simulation,\n };\n const { wrappedEnv, calls } = wrapEnv(combined);\n if (destConfig) destConfig.env = wrappedEnv;\n trackedCalls = calls;\n }\n }\n }\n\n // Don't initialize sources — unnecessary overhead\n if (flowConfig.sources) flowConfig.sources = {};\n\n const result = await module.startFlow(flowConfig);\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,\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\nexport interface 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 */\nexport function 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 // Both push and simulate need a running collector by default.\n // Collector settings are spread onto the root config (not nested),\n // so `run` is a top-level key when the flow declares collector.run.\n config.run = true;\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';\nimport { startDrainPump } from './async-drain-pump.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 * Run the async-drain pump alongside `fn` to fire captured timers\n * immediately. Required for non-simulate web pushes whose destinations\n * await real timers during init (e.g., amplitude engagement plugin\n * awaiting a 10s setTimeout for CDN script load).\n *\n * Defaults to false to preserve `--simulate` snapshot ordering. The\n * dispatcher in `run.ts` sets this to true ONLY for the `'none'` route\n * (real `walkeros push`).\n */\n drainPump?: boolean;\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 __devExports?: Record<string, 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 {\n esmPath,\n platform,\n logger,\n snapshotCode,\n timeout,\n networkCalls,\n asyncDrain,\n drainPump,\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:\n 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 __devExports: module.__devExports,\n };\n\n // Execute step-specific logic\n if (timerControl) {\n // asyncDrain mode: no outer timeout (flush has its own wall-clock safety).\n // When drainPump is requested, fire captured timers alongside `fn` so\n // destinations awaiting an intercepted setTimeout during init don't\n // deadlock (see async-drain-pump.ts for context).\n const stopPump = drainPump ? startDrainPump(timerControl.pending) : null;\n let result: PushResult;\n try {\n result = await fn(flowModule);\n } finally {\n if (stopPump) stopPump();\n }\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\nexport interface 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 * The shared pending-timer map. Exposed so an external drain pump\n * (`async-drain-pump.ts`) can fire timers while `fn` is awaiting.\n * Mutating this map outside the pump is unsupported.\n */\n pending: Map<number, PendingTimer>;\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: typeof globalThis;\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 // Patches setTimeout/clearTimeout/setInterval/clearInterval on the target.\n // Uses Reflect to read/write properties dynamically. JSDOM's\n // `Window & typeof globalThis` is assignable to `typeof globalThis`.\n function patchTarget(target: typeof globalThis): void {\n targets.push({\n target,\n setTimeout: Reflect.get(target, 'setTimeout'),\n clearTimeout: Reflect.get(target, 'clearTimeout'),\n setInterval: Reflect.get(target, 'setInterval'),\n clearInterval: Reflect.get(target, 'clearInterval'),\n });\n\n const trackedSetTimeout = (\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, {\n id,\n callback,\n delay: delay ?? 0,\n type: 'timeout',\n args,\n cleared: false,\n });\n return id;\n };\n\n const trackedClear = (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 const trackedSetInterval = (\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, {\n id,\n callback,\n delay: delay ?? 0,\n type: 'interval',\n args,\n cleared: false,\n });\n return id;\n };\n\n Reflect.set(target, 'setTimeout', trackedSetTimeout);\n Reflect.set(target, 'clearTimeout', trackedClear);\n Reflect.set(target, 'setInterval', trackedSetInterval);\n Reflect.set(target, 'clearInterval', trackedClear);\n }\n\n // Patch globalThis (bare setTimeout in ESM bundles)\n patchTarget(globalThis);\n\n // Patch JSDOM window if provided and distinct\n if (options.domWindow && options.domWindow !== globalThis) {\n patchTarget(options.domWindow);\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 Reflect.set(saved.target, 'setTimeout', saved.setTimeout);\n Reflect.set(saved.target, 'clearTimeout', saved.clearTimeout);\n Reflect.set(saved.target, 'setInterval', saved.setInterval);\n Reflect.set(saved.target, 'clearInterval', saved.clearInterval);\n }\n pending.clear();\n }\n\n return { flush, countPending, restore, pending };\n}\n","import type { PendingTimer } from './async-drain.js';\n\nconst realSetImmediate = setImmediate;\n\nexport interface DrainPumpOptions {\n maxIterations?: number;\n maxWallMs?: number;\n}\n\nconst DEFAULT_MAX_ITERATIONS = 1000;\nconst DEFAULT_MAX_WALL_MS = 30_000;\n\nlet intervalRequeueCounter = -1;\n\n/**\n * Drain pump for the async-drain timer interception mechanism.\n *\n * The push command patches setTimeout/setInterval on globalThis + JSDOM\n * window to capture deferred work (see `async-drain.ts`). Without a pump,\n * captured timers only run after `fn(flowModule)` resolves (via flush()),\n * which deadlocks when a destination's init awaits one of those captured\n * timers (e.g., `@walkeros/web-destination-amplitude`'s engagement plugin\n * awaits a 10s setTimeout to give up on a CDN script load).\n *\n * This pump runs alongside `fn`, fires every non-cleared captured timer\n * on each tick (sorted by delay ascending to match `flush` ordering),\n * using REAL `setImmediate` saved at module load to avoid any patched\n * version. Re-registers `interval` timers after firing so periodic work\n * keeps cycling — same shape as flush()'s loop. Errors surface via\n * `console.warn` to match the flush contract.\n *\n * Two safety caps: maxIterations (re-pump count) and maxWallMs.\n * Defaults are generous (1000 iters, 30s) — typical destinations queue\n * 1-5 timers during init.\n *\n * Activate ONLY in non-simulate mode; --simulate routes use post-fn flush\n * so snapshot ordering remains stable.\n */\nexport function startDrainPump(\n pending: Map<number, PendingTimer>,\n options: DrainPumpOptions = {},\n): () => void {\n const maxIterations = options.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n const maxWallMs = options.maxWallMs ?? DEFAULT_MAX_WALL_MS;\n const start = Date.now();\n let running = true;\n let iterations = 0;\n\n const tick = (): void => {\n if (!running) return;\n if (iterations >= maxIterations) return;\n if (Date.now() - start > maxWallMs) return;\n\n if (pending.size === 0) {\n realSetImmediate(tick);\n return;\n }\n\n iterations += 1;\n\n const snapshot = [...pending.values()]\n .filter((t) => !t.cleared)\n .sort((a, b) => a.delay - b.delay);\n\n for (const timer of snapshot) {\n pending.delete(timer.id);\n try {\n timer.callback(...timer.args);\n } catch (err) {\n console.warn(`[async-drain] timer ${timer.id} threw during pump:`, err);\n }\n\n if (timer.type === 'interval' && !timer.cleared) {\n // Re-queue with a fresh id so a single-fire pump cycle catches it\n // again on the next tick. id space is module-scoped negative to\n // avoid colliding with the original setTimeout id counter.\n const requeued: PendingTimer = {\n ...timer,\n id: intervalRequeueCounter--,\n };\n pending.set(requeued.id, requeued);\n }\n }\n\n realSetImmediate(tick);\n };\n\n realSetImmediate(tick);\n\n return () => {\n running = false;\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { getPlatform, type Flow } from '@walkeros/core';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadBundleConfig } from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport { buildOverrides, type PushOverrides } from './overrides.js';\n\nexport type PrepareInput =\n | {\n mode: 'build';\n config: Flow.Json;\n flow?: string;\n simulate?: string[];\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n }\n | {\n mode: 'prebuilt';\n bundlePath: string;\n config: Flow.Json;\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;\n cleanup: () => Promise<void>;\n}\n\n/**\n * Shared preparation step: resolve config, build overrides, optionally bundle.\n *\n * Two modes:\n * - 'build': bundles the flow config to a temp ESM file (original behavior)\n * - 'prebuilt': uses an existing bundle path, skips bundling\n *\n * Both modes resolve flowSettings and overrides from the provided config object.\n */\nexport async function prepareFlow(input: PrepareInput): Promise<PreparedFlow> {\n const logger = createCLILogger({\n silent: input.silent,\n verbose: input.verbose,\n });\n\n // Resolve config to flowSettings + buildOptions\n logger.debug('Loading flow configuration');\n const { flowSettings, buildOptions } = loadBundleConfig(input.config, {\n configPath: process.cwd(),\n flowName: input.flow,\n });\n\n const platform = getPlatform(flowSettings);\n\n // Build overrides from --simulate/--mock flags\n const overrides = buildOverrides(\n { simulate: input.simulate, mock: input.mock },\n flowSettings,\n );\n\n if (input.mode === 'prebuilt') {\n // Prebuilt mode: return immediately with existing bundle, no cleanup needed\n return {\n bundlePath: input.bundlePath,\n platform,\n overrides,\n flowSettings,\n cleanup: async () => {},\n };\n }\n\n // Build mode: 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 cleanup: async () => {\n await fs.remove(tempDir).catch(() => {});\n },\n };\n}\n","import { parseStep } from './overrides.js';\n\n/**\n * Route plan derived from raw `--simulate` flags. The dispatcher in\n * `index.ts` reads `kind` and either skips simulation (`none`), runs the\n * matching typed route once, or — for `destination` only — loops over\n * `ids` calling the typed route per id.\n *\n * Rules:\n * - Empty input → kind 'none'.\n * - Per-flag format must match `parseStep` (delegated, single source of truth).\n * - 4-part chain syntax (`destination.X.before.Y`) is `--mock`-only and rejected here.\n * - Mixed types in the same invocation throw.\n * - source.* and transformer.* simulate is single-target. Multiple flags throw.\n * - destination.* is multi-target. Duplicate ids are deduped.\n */\nexport type SimulatePlan =\n | { kind: 'none'; ids: [] }\n | { kind: 'source' | 'destination' | 'transformer'; ids: string[] };\n\nexport function planSimulate(flags: readonly string[]): SimulatePlan {\n if (flags.length === 0) return { kind: 'none', ids: [] };\n\n const parsed = flags.map((flag) => {\n const step = parseStep(flag);\n if (step.chainType) {\n throw new Error(\n `--simulate \"${flag}\": chain syntax (${step.type}.${step.name}.${step.chainType}.…) is not supported for --simulate. Use --mock for path-specific overrides.`,\n );\n }\n return step;\n });\n\n const types = new Set(parsed.map((p) => p.type));\n if (types.size > 1) {\n const sorted = [...types].sort();\n throw new Error(\n `Cannot --simulate ${sorted.join(' and ')} in the same invocation. Run separate commands for each step type.`,\n );\n }\n\n const [type] = types;\n const ids = [...new Set(parsed.map((p) => p.name))];\n\n if ((type === 'source' || type === 'transformer') && ids.length > 1) {\n throw new Error(\n `--simulate ${type}.* expects a single target; got ${ids.length}. Run one --simulate ${type}.NAME per invocation.`,\n );\n }\n\n return { kind: type, ids };\n}\n","import { planSimulate } from './plan-simulate.js';\n\nexport interface SimulateDispatch {\n route: 'none' | 'source' | 'destination' | 'transformer';\n ids: string[];\n}\n\n/**\n * Adapter between `planSimulate` and the dispatcher in `index.ts`.\n * Renames `kind` → `route` so the dispatcher's `switch` reads naturally.\n * Kept separate from planSimulate so parsing logic and call-site adaptation\n * can evolve independently.\n */\nexport function dispatchSimulate(flags: readonly string[]): SimulateDispatch {\n const plan = planSimulate(flags);\n return { route: plan.kind, ids: plan.ids };\n}\n","import {\n push,\n simulateDestination,\n simulateSource,\n simulateTransformer,\n} from './index.js';\nimport { dispatchSimulate } from './dispatch-simulate.js';\nimport {\n getErrorMessage,\n isStdinPiped,\n readStdinToTempFile,\n type Platform,\n} from '../../core/index.js';\nimport { loadJsonFromSource } from '../../config/index.js';\nimport type { WalkerOS } from '@walkeros/core';\nimport type { PushCommandOptions, PushResult } from './types.js';\n\n/**\n * Pure variant of `pushCommand` — produces a `PushResult` and never calls\n * `process.exit` or writes to stdout. The CLI wrapper in `index.ts` adds\n * formatting and exit codes on top.\n *\n * Validates `--simulate` flags upfront via `dispatchSimulate` so a malformed\n * flag fails fast (no wasted bundle). Routes to the correct typed function:\n * - `none` → `push()`\n * - `source` → `simulateSource()` (single id; multi rejected by dispatcher)\n * - `transformer` → `simulateTransformer()` (single id)\n * - `destination` → `runDestinationSimulationLoop()` (multi-target loop)\n */\nexport async function runPushCommand(\n options: PushCommandOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // 1. Validate --simulate flags FIRST. Fail fast before bundling/IO.\n const plan = dispatchSimulate(options.simulate ?? []);\n\n // 2. Resolve config: stdin > argument > default (preserves prior behavior).\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 // 3. Resolve string event inputs (path/URL → JSON).\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 // 4. Route to the correct typed function based on the plan.\n let result: PushResult;\n switch (plan.route) {\n case 'none':\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 break;\n\n case 'source':\n result = await simulateSource(config, resolvedEvent, {\n sourceId: plan.ids[0],\n flow: options.flow,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n });\n break;\n\n case 'transformer':\n result = await simulateTransformer(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n transformerId: plan.ids[0],\n flow: options.flow,\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n },\n );\n break;\n\n case 'destination':\n result = await runDestinationSimulationLoop(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n plan.ids,\n options,\n );\n break;\n }\n\n return result;\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Run `simulateDestination` once per destination id and aggregate into a\n * single `PushResult`. Stops on the first failure and returns a structured\n * error referencing the failed id; per-destination results are preserved\n * under `perDestination` for downstream inspection.\n */\nasync function runDestinationSimulationLoop(\n config: string,\n event: WalkerOS.DeepPartialEvent,\n destinationIds: string[],\n options: PushCommandOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n const perDestination: Record<string, PushResult> = {};\n\n for (const destinationId of destinationIds) {\n const r = await simulateDestination(config, event, {\n destinationId,\n flow: options.flow,\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n });\n perDestination[destinationId] = r;\n if (!r.success) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: `simulate destination.${destinationId}: ${r.error ?? 'unknown error'}`,\n perDestination,\n };\n }\n }\n\n return {\n success: true,\n duration: Date.now() - startTime,\n perDestination,\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';\nimport { throwIfRunnerAuthFailure } from './runner-auth-error.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 // Classify 401/403 (RunnerAuthError with typed reason).\n await throwIfRunnerAuthFailure(response);\n\n if (!response.ok) {\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 * Classified runner-auth error. Thrown by runtime fetchers on 401/403 so\n * the runner can log `runner_auth_forbidden scope=... flow=... deployment=...`\n * in a structured way and, where appropriate, exit cleanly rather than retry.\n *\n * `reason`:\n * - `'unauthorised'` — token missing, expired, or revoked (401)\n * - `'flow'` — token is not bound to this flow (403 FORBIDDEN_FLOW)\n * - `'scope'` — token lacks the required scope (403 FORBIDDEN_SCOPE)\n * - `'forbidden'` — 403 with no recognised error code\n */\nexport type RunnerAuthReason = 'unauthorised' | 'flow' | 'scope' | 'forbidden';\n\nexport class RunnerAuthError extends Error {\n constructor(\n public readonly status: number,\n public readonly reason: RunnerAuthReason,\n public readonly code: string | null,\n message: string,\n ) {\n super(message);\n this.name = 'RunnerAuthError';\n }\n}\n\ninterface AppErrorBody {\n error?: { code?: unknown; message?: unknown };\n}\n\nfunction isAppErrorBody(value: unknown): value is AppErrorBody {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: unknown }).error === 'object'\n );\n}\n\n/**\n * If the response is a 401 or 403 from the app, parse `{error: {code, message}}`\n * and throw a typed RunnerAuthError. For any other non-ok status the caller\n * handles errors as before.\n */\nexport async function throwIfRunnerAuthFailure(res: Response): Promise<void> {\n if (res.status !== 401 && res.status !== 403) return;\n\n let code: string | null = null;\n let message: string = res.statusText;\n\n try {\n const body: unknown = await res.clone().json();\n if (isAppErrorBody(body) && body.error) {\n if (typeof body.error.code === 'string') code = body.error.code;\n if (typeof body.error.message === 'string') message = body.error.message;\n }\n } catch {\n // Body not JSON — keep statusText as message.\n }\n\n const reason: RunnerAuthReason =\n res.status === 401\n ? 'unauthorised'\n : code === 'FORBIDDEN_FLOW'\n ? 'flow'\n : code === 'FORBIDDEN_SCOPE'\n ? 'scope'\n : 'forbidden';\n\n throw new RunnerAuthError(res.status, reason, code, message);\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';\nimport { throwIfRunnerAuthFailure } from './runner-auth-error.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 (500, etc.).\n * Auth failures (401/403) are thrown as RunnerAuthError instead.\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 // Classify 401/403 with the app's error code (FORBIDDEN_FLOW, FORBIDDEN_SCOPE).\n await throwIfRunnerAuthFailure(res);\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 '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 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 { getFlowSettings, isObject } 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\n/**\n * Type guard for a parsed Flow.Json shape (after schema validation).\n * Used only in soft-resolve so we can call core's resolver without casts.\n */\nfunction isFlowJson(value: unknown): value is Flow.Json {\n if (!isObject(value)) return false;\n if (!('version' in value) || !('flows' in value)) return false;\n return isObject(value.flows);\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: Record<string, unknown> = isObject(input) ? input : {};\n const flowsValue = config.flows;\n const flows: Record<string, unknown> | undefined = isObject(flowsValue)\n ? flowsValue\n : undefined;\n if (flows && 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) {\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 (per-flow config.bundle.packages)\n let totalPackageCount = 0;\n if (flows) {\n for (const [flowName, flowValue] of Object.entries(flows)) {\n if (!isObject(flowValue)) continue;\n const flowConfig = flowValue.config;\n if (!isObject(flowConfig)) continue;\n const bundle = flowConfig.bundle;\n if (!isObject(bundle)) continue;\n const packages = bundle.packages;\n if (!isObject(packages)) continue;\n\n for (const [pkgName, pkgConfigValue] of Object.entries(packages)) {\n if (!isObject(pkgConfigValue)) continue;\n if (!pkgConfigValue.version && !pkgConfigValue.path) {\n warnings.push({\n path: `flows.${flowName}.config.bundle.packages.${pkgName}`,\n message: `Package \"${pkgName}\" has no version specified`,\n suggestion: 'Consider specifying a version for reproducible builds',\n });\n }\n }\n totalPackageCount += Object.keys(packages).length;\n }\n }\n if (totalPackageCount > 0) {\n details.packageCount = totalPackageCount;\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 (typed Flow.Json shape)\n if (errors.length === 0 && isFlowJson(input)) {\n const typedFlows: Record<string, Flow> = input.flows;\n const flowNames = Object.keys(typedFlows);\n const flowsToCheck = options.flow ? [options.flow] : flowNames;\n\n let totalConnections = 0;\n for (const name of flowsToCheck) {\n const flowSettings = typedFlows[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 = input.contract;\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 = typedFlows[name];\n if (!flowSettings) continue;\n\n for (const [destName, dest] of Object.entries(\n flowSettings.destinations || {},\n )) {\n if (!isObject(dest.config)) continue;\n const mapping = dest.config.mapping;\n if (!isObject(mapping)) 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 // 11. Soft-resolve $flow refs to surface warnings (does NOT throw on missing\n // keys / unknown flows; cycles still throw and become errors).\n if (errors.length === 0 && isFlowJson(input)) {\n const flowsMap = input.flows;\n const flowsToResolve = options.flow\n ? options.flow in flowsMap\n ? [options.flow]\n : []\n : Object.keys(flowsMap);\n\n for (const name of flowsToResolve) {\n try {\n getFlowSettings(input, name, {\n deferred: true, // don't fail on missing $env when validating\n strictFlowRefs: false,\n onWarning: (message) => {\n warnings.push({ path: `flows.${name}`, message });\n },\n });\n } catch (err) {\n // Only surface CYCLES as errors here; other resolver failures (missing\n // $var / $def / etc.) are already reported by the schema/reference\n // checker above and should not double-fail this pass.\n const message = err instanceof Error ? err.message : String(err);\n if (/Cyclic \\$flow reference/.test(message)) {\n errors.push({\n path: `flows.${name}`,\n message,\n code: 'FLOW_CYCLE',\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): 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.length > 0)\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,\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 // Walk every named contract rule and look in its events map.\n // First match (entity exact or wildcard, action exact or wildcard) wins.\n let matched = false;\n for (const rule of Object.values(contract)) {\n const events = rule.events;\n if (!events) continue;\n\n const entityActions = events[event.entity] || events['*'];\n if (!entityActions) continue;\n\n const actionSchema = entityActions[event.action] || entityActions['*'];\n if (actionSchema) {\n matched = true;\n break;\n }\n }\n\n if (matched) {\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\n// __VERSION__ is replaced at build time by tsup's `define` (see tsup.config.ts).\n// In tests, it's set as a global by the shared jest config (@walkeros/config/jest).\ndeclare const __VERSION__: string;\n\nconst CLIENT_HEADER = 'walkeros-cli/' + __VERSION__;\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 client: CLIENT_HEADER,\n });\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 { z } from 'zod';\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\n/**\n * Zod schema for the device-code response from `POST /api/auth/device/code`.\n * Validates the trust boundary between the auth server and the CLI so a\n * malformed response cannot propagate `undefined` into the browser-opener\n * or subsequent token polling.\n */\nconst DeviceCodeResponseSchema = z.object({\n deviceCode: z.string().min(1),\n userCode: z.string().min(1),\n verificationUri: z.string().min(1),\n verificationUriComplete: z.string().optional(),\n // Server protocol allows 0 for both (e.g. fast retry / already expired).\n expiresIn: z.number().int().nonnegative(),\n interval: z.number().int().nonnegative(),\n});\n\n/**\n * Zod schema for the token response from `POST /api/auth/device/token` on 2xx.\n * Validates that the token and email are both present and are strings before\n * writing them to the on-disk config.\n */\nconst TokenResponseSchema = z.object({\n token: z.string().min(1),\n email: z.string().min(1),\n});\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\nexport interface DeviceCodeResult {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete?: string;\n expiresIn: number;\n interval: number;\n}\n\nexport interface DeviceCodeOptions {\n url?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface PollOptions {\n url?: string;\n fetch?: typeof globalThis.fetch;\n /** Timeout in milliseconds. Defaults to 60000 (60s). */\n timeoutMs?: number;\n /** Poll interval in milliseconds. Defaults to 5000. */\n intervalMs?: number;\n}\n\nexport type PollResult =\n | {\n success: true;\n status: 'authenticated';\n email: string;\n configPath: string;\n }\n | { success: false; status: 'pending' }\n | { success: false; status: 'error'; error: string };\n\nconst POLL_TIMEOUT_BUFFER_MS = 5000;\nconst DEFAULT_POLL_TIMEOUT_MS = 60000;\nconst DEFAULT_POLL_INTERVAL_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\n/**\n * Request a device code from the auth server.\n * First step of the device code flow — returns data needed to show\n * the user a code and URL, then poll for the token.\n */\nexport async function requestDeviceCode(\n options: DeviceCodeOptions = {},\n): Promise<DeviceCodeResult> {\n const appUrl = options.url || resolveAppUrl();\n const f = options.fetch ?? globalThis.fetch;\n\n const response = await f(`${appUrl}/api/auth/device/code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n throw new Error('Failed to request device code');\n }\n\n let raw: unknown;\n try {\n raw = await response.json();\n } catch {\n throw new Error('Malformed device code response');\n }\n\n const parsed = DeviceCodeResponseSchema.safeParse(raw);\n if (!parsed.success) {\n throw new Error('Malformed device code response');\n }\n\n return {\n deviceCode: parsed.data.deviceCode,\n userCode: parsed.data.userCode,\n verificationUri: parsed.data.verificationUri,\n verificationUriComplete: parsed.data.verificationUriComplete,\n expiresIn: parsed.data.expiresIn,\n interval: parsed.data.interval,\n };\n}\n\n/**\n * Poll the auth server until the device code is authorized, times out, or fails.\n * Second step of the device code flow.\n *\n * On success: writes config and returns authenticated result.\n * On timeout: returns pending (NOT an error — caller can retry).\n * On real error (denied, expired): returns error result.\n *\n * In-flight fetch requests are bounded by the remaining time to the deadline\n * via AbortController, so a hanging fetch cannot exceed the configured timeout.\n * Malformed JSON responses return an error result instead of throwing.\n */\nexport async function pollForToken(\n deviceCode: string,\n options: PollOptions = {},\n): Promise<PollResult> {\n const appUrl = options.url || resolveAppUrl();\n const f = options.fetch ?? globalThis.fetch;\n const timeoutMs = options.timeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n let intervalMs = options.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalMs));\n\n // Check if we've exceeded the deadline after sleeping\n if (Date.now() >= deadline) break;\n\n const remaining = Math.max(1, deadline - Date.now());\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), remaining);\n\n let tokenResponse: Response;\n try {\n 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 signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timeoutHandle);\n if (err instanceof Error && err.name === 'AbortError') {\n // Aborted by our deadline — fall through to the pending return below\n break;\n }\n throw err;\n } finally {\n clearTimeout(timeoutHandle);\n }\n\n const data = await safeJsonParse(tokenResponse);\n if (data === MALFORMED) {\n return {\n success: false,\n status: 'error',\n error: 'Server returned malformed response',\n };\n }\n\n if (tokenResponse.ok) {\n // ok=true but no token and no error field — treat as pending and continue.\n // Only try to validate as a token response if a `token` key is present.\n if (data.token === undefined) {\n continue;\n }\n const tokenParsed = TokenResponseSchema.safeParse(data);\n if (!tokenParsed.success) {\n return {\n success: false,\n status: 'error',\n error: 'Server returned malformed token response',\n };\n }\n const { token, email } = tokenParsed.data;\n writeConfig({ token, email, appUrl });\n const configPath = getConfigPath();\n return {\n success: true,\n status: 'authenticated',\n email,\n configPath,\n };\n }\n\n if (data.error === 'authorization_pending') continue;\n if (data.error === 'slow_down') {\n intervalMs += 5000;\n continue;\n }\n\n // Any other error: expired, denied, etc.\n const errField: unknown = data.error;\n let errorMsg: string;\n if (typeof errField === 'string') {\n errorMsg = errField;\n } else if (\n errField &&\n typeof errField === 'object' &&\n 'message' in errField &&\n typeof (errField as { message: unknown }).message === 'string'\n ) {\n errorMsg = (errField as { message: string }).message;\n } else {\n errorMsg = 'Authorization failed';\n }\n return { success: false, status: 'error', error: errorMsg };\n }\n\n return { success: false, status: 'pending' };\n}\n\nconst MALFORMED = Symbol('malformed-json');\n\nasync function safeJsonParse(\n response: Response,\n): Promise<Record<string, unknown> | typeof MALFORMED> {\n try {\n const parsed: unknown = await response.json();\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return MALFORMED;\n } catch {\n return MALFORMED;\n }\n}\n\nexport async function login(options: LoginOptions = {}): Promise<LoginResult> {\n const fetchOption = options.fetch ?? globalThis.fetch;\n const urlOption = options.url;\n\n // 1. Request device code\n let codeResult: DeviceCodeResult;\n try {\n codeResult = await requestDeviceCode({\n url: urlOption,\n fetch: fetchOption,\n });\n } catch {\n return { success: false, error: 'Failed to request device code' };\n }\n\n const {\n userCode,\n verificationUri,\n verificationUriComplete,\n expiresIn,\n interval,\n deviceCode,\n } = codeResult;\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 // Use expiresIn-based timeout (original behavior) with maxPollAttempts support\n const timeoutMs = expiresIn * 1000 + POLL_TIMEOUT_BUFFER_MS;\n const intervalMs = (interval ?? 5) * 1000;\n\n if (options.maxPollAttempts !== undefined) {\n // Legacy path: use attempt-based polling for backward compat with tests\n const appUrl = urlOption || resolveAppUrl();\n const f = fetchOption;\n let pollInterval = intervalMs;\n let attempts = 0;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline && attempts < options.maxPollAttempts) {\n attempts++;\n await new Promise((r) => setTimeout(r, pollInterval));\n\n const remaining = Math.max(1, deadline - Date.now());\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), remaining);\n\n let tokenResponse: Response;\n try {\n 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 signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timeoutHandle);\n if (err instanceof Error && err.name === 'AbortError') {\n break;\n }\n throw err;\n } finally {\n clearTimeout(timeoutHandle);\n }\n\n const data = await safeJsonParse(tokenResponse);\n if (data === MALFORMED) {\n return {\n success: false,\n error: 'Server returned malformed response',\n };\n }\n\n if (tokenResponse.ok) {\n if (data.token === undefined) {\n continue;\n }\n const tokenParsed = TokenResponseSchema.safeParse(data);\n if (!tokenParsed.success) {\n return {\n success: false,\n error: 'Server returned malformed token response',\n };\n }\n const { token, email } = tokenParsed.data;\n writeConfig({ token, email, appUrl });\n const configPath = getConfigPath();\n return { success: true, 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 const errField: unknown = data.error;\n const errorMsg =\n typeof errField === 'string' ? errField : 'Authorization failed';\n return { success: false, error: errorMsg };\n }\n\n return {\n success: false,\n error: 'Authorization timed out. Please try again.',\n };\n }\n\n // Standard path: delegate to pollForToken\n const pollResult = await pollForToken(deviceCode, {\n url: urlOption,\n fetch: fetchOption,\n timeoutMs,\n intervalMs,\n });\n\n if (pollResult.success) {\n return {\n success: true,\n email: pollResult.email,\n configPath: pollResult.configPath,\n };\n }\n\n if (pollResult.status === 'error') {\n return { success: false, error: pollResult.error };\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 createClient from 'openapi-fetch';\nimport type { paths } from '../types/api.gen.js';\nimport { getToken } from './auth.js';\nimport { resolveAppUrl } from '../lib/config-file.js';\nimport { clientContextHeaders } from './client-context.js';\n\nexport function createApiClient() {\n const token = getToken();\n if (!token) throw new Error('WALKEROS_TOKEN not set.');\n\n // Note: openapi-fetch fixes headers at createClient time. The CLI entry\n // point (and MCP boot path) call setClientContext before any API client is\n // constructed, so the client-context headers captured here are stable.\n return createClient<paths>({\n baseUrl: resolveAppUrl(),\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...clientContextHeaders(),\n },\n });\n}\n","export interface ApiErrorDetail {\n path: string;\n message: string;\n}\n\nexport interface ApiErrorOptions {\n code?: string;\n details?: ApiErrorDetail[];\n // Populated only for CLIENT_OUTDATED responses (HTTP 426).\n minVersion?: string;\n clientVersion?: string;\n client?: string;\n upgrade?: string;\n docs?: string;\n}\n\nexport class ApiError extends Error {\n code?: string;\n details?: ApiErrorDetail[];\n // Populated only for CLIENT_OUTDATED responses (HTTP 426).\n minVersion?: string;\n clientVersion?: string;\n client?: string;\n upgrade?: string;\n docs?: string;\n\n constructor(message: string, options?: ApiErrorOptions) {\n super(message);\n this.name = 'ApiError';\n this.code = options?.code;\n this.details = options?.details;\n this.minVersion = options?.minVersion;\n this.clientVersion = options?.clientVersion;\n this.client = options?.client;\n this.upgrade = options?.upgrade;\n this.docs = options?.docs;\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 *\n * For `code === 'CLIENT_OUTDATED'` (HTTP 426), also extracts the upgrade\n * metadata: `minVersion`, `clientVersion`, `client`, `upgrade`, `docs`.\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 const options: ApiErrorOptions = { code, details };\n if (code === 'CLIENT_OUTDATED') {\n options.minVersion = inner.minVersion as string | undefined;\n options.clientVersion = inner.clientVersion as string | undefined;\n options.client = inner.client as string | undefined;\n options.upgrade = inner.upgrade as string | undefined;\n options.docs = inner.docs as string | undefined;\n }\n throw new ApiError(message, options);\n }\n throw new ApiError(fallbackMessage);\n}\n\n/**\n * Pretty-print an error and exit. Recognises `ApiError` with\n * `code === 'CLIENT_OUTDATED'` as a dedicated upgrade-required path\n * (exit code 2), prints the upgrade and docs links, and otherwise\n * falls back to a generic error print with exit code 1.\n *\n * Designed to be used as a top-level handler (`process.on('uncaughtException', ...)`,\n * `program.parseAsync().catch(...)`) and as a drop-in replacement for\n * per-command `logger.error(msg); process.exit(1)` patterns.\n */\nexport function handleCliError(err: unknown): never {\n /* eslint-disable no-console */\n if (err instanceof ApiError && err.code === 'CLIENT_OUTDATED') {\n console.error(`\\n${err.message}\\n`);\n if (err.upgrade) console.error(` Upgrade: ${err.upgrade}`);\n if (err.docs) console.error(` Docs: ${err.docs}\\n`);\n process.exit(2);\n }\n const message = err instanceof Error ? err.message : String(err);\n console.error(message);\n process.exit(1);\n /* eslint-enable no-console */\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { handleCliError } from '../../core/api-error.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 handleCliError(error);\n }\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { handleCliError } from '../../core/api-error.js';\nimport { requireProjectId } from '../../core/auth.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 try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n handleCliError(error);\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 { handleCliError, throwApiError } from '../../core/api-error.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { writeResult } from '../../core/output.js';\nimport { isStdinPiped, readStdin } from '../../core/stdin.js';\nimport type { paths } from '../../types/api.gen.js';\nimport type { GlobalOptions } from '../../types/global.js';\nimport { listProjects } from '../projects/index.js';\n\n// === Types extracted from API spec ===\n\ntype FlowSummary =\n paths['/api/projects/{projectId}/flows']['get']['responses']['200']['content']['application/json']['flows'][number];\n\ntype Project =\n paths['/api/projects']['get']['responses']['200']['content']['application/json']['projects'][number];\n\nexport interface ProjectFlows {\n project: { id: Project['id']; name: Project['name'] };\n flows: FlowSummary[];\n}\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 listAllFlows(\n options?: Omit<ListFlowsOptions, 'projectId'>,\n): Promise<ProjectFlows[]> {\n const { projects } = await listProjects();\n const results: ProjectFlows[] = [];\n\n for (const project of projects) {\n const data = await listFlows({ ...options, projectId: project.id });\n results.push({\n project: { id: project.id, name: project.name },\n flows: data.flows,\n });\n }\n\n return results;\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 try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n handleCliError(error);\n }\n}\n\nexport async function listFlowsCommand(\n options: FlowsCommandOptions & {\n sort?: string;\n order?: string;\n includeDeleted?: boolean;\n },\n): Promise<void> {\n await handleResult(\n () =>\n listFlows({\n projectId: options.project,\n sort: options.sort as ListFlowsOptions['sort'],\n order: options.order as ListFlowsOptions['order'],\n includeDeleted: options.includeDeleted,\n }),\n options,\n );\n}\n\nexport async function getFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function createFlowCommand(\n name: string,\n options: FlowsCommandOptions & { content?: string },\n): Promise<void> {\n const content = options.content\n ? JSON.parse(options.content)\n : JSON.parse(await readFlowStdin());\n await handleResult(\n () => createFlow({ name, content, projectId: options.project }),\n options,\n );\n}\n\nexport async function updateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string; content?: string },\n): Promise<void> {\n const content = options.content ? JSON.parse(options.content) : undefined;\n await handleResult(\n () =>\n updateFlow({\n flowId,\n name: options.name,\n content,\n projectId: options.project,\n }),\n options,\n );\n}\n\nexport async function deleteFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function duplicateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string },\n): Promise<void> {\n await handleResult(\n () =>\n duplicateFlow({ flowId, name: options.name, projectId: options.project }),\n options,\n );\n}\n\nasync function readFlowStdin(): Promise<string> {\n if (!isStdinPiped()) {\n throw new Error('Content required: use --content or pipe via stdin');\n }\n return readStdin();\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport {\n ApiError,\n handleCliError,\n throwApiError,\n} 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 handleCliError(err);\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 handleCliError(err);\n }\n}\n","import { getPlatform } from '@walkeros/core';\nimport { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport { handleCliError, 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 flowId?: 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 if (options.flowId) params.set('flowId', options.flowId);\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\n/**\n * Summary of an active deployment returned by listDeployments, used when\n * disambiguating which deployment to operate on for a given flow.\n */\nexport interface DeploymentSummaryForFlow {\n slug: string;\n type: string;\n status: string;\n updatedAt: string;\n}\n\n/**\n * Error thrown by deleteDeploymentByFlowId and other flow-scoped helpers when\n * the flow has multiple active (non-deleted) deployments and the caller did\n * not disambiguate with an explicit slug.\n *\n * Callers (e.g. the MCP layer) can translate this into a structured error.\n * The CLI package does not depend on MCP helpers.\n */\nexport class DeploymentAmbiguityError extends Error {\n readonly code = 'MULTIPLE_DEPLOYMENTS';\n readonly details: DeploymentSummaryForFlow[];\n constructor(message: string, details: DeploymentSummaryForFlow[]) {\n super(message);\n this.name = 'DeploymentAmbiguityError';\n this.details = details;\n }\n}\n\n/**\n * Delete a deployment identified by flowId, optionally disambiguated by slug\n * when the flow has more than one active deployment. Throws\n * DeploymentAmbiguityError when the flow has >= 2 active deployments and no\n * slug is provided. Throws a plain Error when the flow has no matches or when\n * a provided slug does not belong to the flow.\n */\nexport async function deleteDeploymentByFlowId(options: {\n projectId?: string;\n flowId: string;\n slug?: string;\n}): Promise<unknown> {\n const { flowId, slug } = options;\n const projectId = options.projectId ?? requireProjectId();\n\n const listResp = (await listDeployments({ projectId, flowId })) as {\n deployments?: DeploymentSummaryForFlow[];\n };\n const matches = listResp.deployments ?? [];\n\n if (matches.length === 0) {\n throw new Error(`No deployments found for flow ${flowId}`);\n }\n\n if (slug !== undefined) {\n const hit = matches.find((m) => m.slug === slug);\n if (!hit) {\n throw new Error(`No deployment with slug ${slug} in flow ${flowId}`);\n }\n return deleteDeployment({ slug: hit.slug, projectId });\n }\n\n if (matches.length > 1) {\n throw new DeploymentAmbiguityError(\n `Flow ${flowId} has ${matches.length} active deployments; pass slug to disambiguate`,\n matches.map((m) => ({\n slug: m.slug,\n type: m.type,\n status: m.status,\n updatedAt: m.updatedAt,\n })),\n );\n }\n return deleteDeployment({ slug: matches[0].slug, projectId });\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 try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n handleCliError(error);\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 handleCliError(err);\n }\n}\n","import { createInterface } from 'readline';\nimport { readConfig, writeConfig } from '../../lib/config-file.js';\nimport { publicFetch } from '../../core/http.js';\nimport { handleCliError } from '../../core/api-error.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 handleCliError(error);\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 { readConfig, writeTelemetryOnlyConfig } from '../../lib/config-file.js';\nimport { createInstallationId } from '../../telemetry/install-id.js';\n\nfunction envOverrideReason(): string | undefined {\n if (process.env.DO_NOT_TRACK === '1' || process.env.DO_NOT_TRACK === 'true') {\n return 'DO_NOT_TRACK env var';\n }\n if (\n process.env.WALKEROS_TELEMETRY_DISABLED === '1' ||\n process.env.WALKEROS_TELEMETRY_DISABLED === 'true'\n ) {\n return 'WALKEROS_TELEMETRY_DISABLED env var';\n }\n return undefined;\n}\n\n/**\n * Report current telemetry state to stdout. Three possible outcomes:\n *\n * - Not yet chosen: config has no `telemetryEnabled` field.\n * - Enabled: `telemetryEnabled === true`.\n * - Disabled: `telemetryEnabled === false`, or forced off by an env var.\n */\nexport function telemetryStatusCommand(): void {\n const override = envOverrideReason();\n if (override) {\n process.stdout.write(\n `walkerOS telemetry: disabled (${override})\\n` +\n 'Unset the env var and run `walkeros telemetry status` to see the stored choice.\\n',\n );\n return;\n }\n\n const stored = readConfig()?.telemetryEnabled;\n if (stored === true) {\n process.stdout.write(\n 'walkerOS telemetry: enabled\\n' +\n 'Opt out any time with `walkeros telemetry disable`.\\n',\n );\n return;\n }\n if (stored === false) {\n process.stdout.write(\n 'walkerOS telemetry: disabled\\n' +\n 'Opt in any time with `walkeros telemetry enable`.\\n',\n );\n return;\n }\n process.stdout.write(\n 'walkerOS telemetry: not yet chosen (default: off)\\n' +\n 'Opt in with `walkeros telemetry enable`, or leave off, nothing is sent until you choose.\\n',\n );\n}\n\n/**\n * Persist explicit consent: `telemetryEnabled: true` plus a stable\n * installation UUID. `createInstallationId` is idempotent, re-enabling\n * preserves any existing UUID.\n */\nexport function telemetryEnableCommand(): void {\n const installationId = createInstallationId();\n writeTelemetryOnlyConfig({\n installationId,\n telemetryEnabled: true,\n });\n process.stdout.write(\n 'walkerOS telemetry enabled. Thank you for helping improve the tools.\\n' +\n 'Installation UUID: ' +\n installationId +\n '\\n',\n );\n}\n\n/**\n * Persist explicit refusal: `telemetryEnabled: false`. Does not create an\n * installation UUID, a disabled state has no need for a stable identifier.\n * Preserves any existing UUID (e.g. from a prior enable) so re-enabling\n * later keeps the same id.\n */\nexport function telemetryDisableCommand(): void {\n writeTelemetryOnlyConfig({ telemetryEnabled: false });\n process.stdout.write(\n 'walkerOS telemetry disabled. Nothing will be sent from this machine.\\n',\n );\n}\n","import { randomUUID } from 'crypto';\nimport { readConfig, writeTelemetryOnlyConfig } from '../lib/config-file.js';\n\n/**\n * Read the stored installation UUID if one exists. Never writes.\n *\n * Returns `undefined` when no config file exists or the config has no\n * `installationId` field, both mean the user has not opted in to telemetry\n * yet, so no persistent identifier has been created.\n */\nexport function getInstallationId(): string | undefined {\n return readConfig()?.installationId;\n}\n\n/**\n * Generate and persist an installation UUID if none exists yet, then return\n * it. Idempotent.\n *\n * This is the only function in the telemetry stack that may write an\n * installation identifier. Callers must only invoke it as part of an opt-in\n * action (the `walkeros telemetry enable` command). Any other caller is a\n * consent-before-write bug.\n */\nexport function createInstallationId(): string {\n const existing = readConfig()?.installationId;\n if (existing) return existing;\n const id = randomUUID();\n writeTelemetryOnlyConfig({ installationId: id });\n return id;\n}\n","/**\n * Publish-time wrap step.\n *\n * Takes a Stage 1 ESM skeleton produced via `bundle({ skipWrapper: true })`\n * and produces a wrapped output:\n * - `browser`: self-executing async IIFE that calls `wireConfig(__configData)`,\n * injects `env.window` / `env.document` into every source, then calls\n * `startFlow(config)` and optionally assigns the resulting collector/elb\n * onto `window`.\n * - `node`: ESM module whose default export is an async factory function\n * that the runtime container (see `runtime/load-bundle.ts:53-66`) calls\n * with a context to get back `{ collector, elb, httpHandler? }`.\n *\n * The skeleton must export `wireConfig`, `startFlow`, and `__configData`.\n * The skipWrapper branch of `bundleCore` already emits exactly that shape.\n */\n\nimport * as path from 'path';\nimport * as os from 'os';\nimport fs from 'fs-extra';\nimport * as esbuild from 'esbuild';\nimport {\n generateWrapEntry,\n generateWrapEntryServer,\n getNodeExternals,\n} from './bundler.js';\nimport type { MinifyOptions } from '../../types/bundle.js';\n\nexport interface WrapSkeletonOptions {\n /**\n * Absolute path to the Stage 1 skeleton ESM file. Must export\n * `wireConfig`, `startFlow`, and `__configData`.\n */\n skeletonPath: string;\n\n /** Target platform — controls which entry generator runs. */\n platform: 'browser' | 'node';\n\n /** Absolute path where the wrapped output will be written. */\n outputPath: string;\n\n /**\n * Browser-only: window property name for the collector.\n * When unset, no `window.*` assignment is emitted.\n */\n windowCollector?: string;\n\n /**\n * Browser-only: window property name for the elb function.\n * When unset, no `window.*` assignment is emitted.\n */\n windowElb?: string;\n\n /** Browser-only: CDN hostname for loading preview bundles. */\n previewOrigin?: string;\n /** Browser-only: project scope for preview URL isolation. */\n previewScope?: string;\n\n /**\n * esbuild target. @default 'es2018' for browser, 'node18' for node.\n */\n target?: string;\n\n /** Whether to minify the output. @default true */\n minify?: boolean;\n\n /** Fine-grained minification options, forwarded to esbuild. */\n minifyOptions?: MinifyOptions;\n}\n\nexport async function wrapSkeleton(\n options: WrapSkeletonOptions,\n): Promise<void> {\n const {\n skeletonPath,\n platform,\n outputPath,\n windowCollector,\n windowElb,\n target,\n minify = true,\n minifyOptions,\n } = options;\n\n if (\n options.previewScope &&\n !/^[a-zA-Z0-9_-]{1,64}$/.test(options.previewScope)\n ) {\n throw new Error(\n `Invalid previewScope \"${options.previewScope}\". Must match /^[a-zA-Z0-9_-]{1,64}$/.`,\n );\n }\n if (options.previewOrigin && !/^[a-z0-9.-]+$/.test(options.previewOrigin)) {\n throw new Error(\n `Invalid previewOrigin \"${options.previewOrigin}\". Must be a bare hostname matching /^[a-z0-9.-]+$/.`,\n );\n }\n\n if (!(await fs.pathExists(skeletonPath))) {\n throw new Error(`wrapSkeleton: skeleton not found at ${skeletonPath}`);\n }\n\n const absoluteSkeletonPath = path.resolve(skeletonPath);\n\n // Stage 2 entry imports from the skeleton via an absolute path.\n const entryText =\n platform === 'browser'\n ? generateWrapEntry(absoluteSkeletonPath, {\n ...(windowCollector ? { windowCollector } : {}),\n ...(windowElb ? { windowElb } : {}),\n ...(options.previewOrigin\n ? { previewOrigin: options.previewOrigin }\n : {}),\n ...(options.previewScope\n ? { previewScope: options.previewScope }\n : {}),\n platform,\n })\n : generateWrapEntryServer(absoluteSkeletonPath);\n\n // Write the entry to its own temp dir so the caller's outputPath isn't\n // polluted with intermediate files.\n const entryDir = await fs.mkdtemp(path.join(os.tmpdir(), 'walkeros-wrap-'));\n const entryPath = path.join(entryDir, 'entry.mjs');\n\n try {\n await fs.writeFile(entryPath, entryText);\n await fs.ensureDir(path.dirname(outputPath));\n\n const esbuildOptions: esbuild.BuildOptions = {\n entryPoints: [entryPath],\n bundle: true,\n format: 'esm',\n platform,\n outfile: outputPath,\n treeShaking: true,\n logLevel: 'error',\n minify,\n ...(minify && {\n minifyWhitespace: minifyOptions?.whitespace ?? true,\n minifyIdentifiers: minifyOptions?.identifiers ?? true,\n minifySyntax: minifyOptions?.syntax ?? true,\n legalComments: minifyOptions?.legalComments ?? 'none',\n charset: 'utf8' as const,\n }),\n };\n\n if (platform === 'browser') {\n esbuildOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n esbuildOptions.target = target ?? 'es2018';\n } else {\n // Match bundler.ts Stage 2 node config: externalize Node builtins,\n // prepend a createRequire banner so CommonJS deps keep working inside\n // an ESM wrapper.\n esbuildOptions.external = getNodeExternals();\n esbuildOptions.banner = {\n js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`,\n };\n esbuildOptions.target = target ?? 'node18';\n }\n\n await esbuild.build(esbuildOptions);\n } finally {\n await fs.remove(entryDir).catch(() => {});\n }\n}\n","import { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport { throwApiError } from '../../core/api-error.js';\nimport { getFlow } from '../flows/index.js';\n\n// === Programmatic API ===\n\nexport interface ListPreviewsOptions {\n projectId?: string;\n flowId: string;\n}\n\nexport async function listPreviews(options: ListPreviewsOptions) {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiFetch(\n `/api/projects/${pid}/flows/${options.flowId}/previews`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to list previews');\n }\n return response.json();\n}\n\nexport interface GetPreviewOptions {\n projectId?: string;\n flowId: string;\n previewId: string;\n}\n\nexport async function getPreview(options: GetPreviewOptions) {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiFetch(\n `/api/projects/${pid}/flows/${options.flowId}/previews/${options.previewId}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to get preview');\n }\n return response.json();\n}\n\nexport interface CreatePreviewOptions {\n projectId?: string;\n flowId: string;\n flowName?: string;\n flowSettingsId?: string;\n}\n\nexport async function createPreview(options: CreatePreviewOptions) {\n const pid = options.projectId ?? requireProjectId();\n\n let settingsId = options.flowSettingsId;\n if (!settingsId) {\n if (!options.flowName) {\n throw new Error('Either flowName or flowSettingsId is required');\n }\n // Resolve flow settings name → id (same pattern deploy uses)\n const flow = await getFlow({ projectId: pid, flowId: options.flowId });\n const settings = (\n flow as { settings?: Array<{ id: string; name: string }> }\n ).settings;\n const match = settings?.find((s) => s.name === options.flowName);\n if (!match) {\n throw new Error(\n `Flow settings named \"${options.flowName}\" not found on flow ${options.flowId}`,\n );\n }\n settingsId = match.id;\n }\n\n const response = await apiFetch(\n `/api/projects/${pid}/flows/${options.flowId}/previews`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ flowSettingsId: settingsId }),\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to create preview');\n }\n return response.json();\n}\n\nexport interface DeletePreviewOptions {\n projectId?: string;\n flowId: string;\n previewId: string;\n}\n\nexport async function deletePreview(options: DeletePreviewOptions) {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiFetch(\n `/api/projects/${pid}/flows/${options.flowId}/previews/${options.previewId}`,\n { method: 'DELETE' },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to delete preview');\n }\n // App returns 204 No Content on success; older surfaces may return JSON.\n if (response.status === 204) return null;\n return response.json().catch(() => null);\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,\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,\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,\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,\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","export { createEmitter } from './emitter.js';\nexport type { Emitter, EmitterOptions } from './emitter.js';\nexport { getInstallationId, createInstallationId } from './install-id.js';\nexport { isTelemetryEnabled, isDebugMode } from './consent.js';\nexport { getCiInfo } from './ci.js';\nexport type { CiInfo } from './ci.js';\n","import type { Collector, Elb, WalkerOS } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { destinationAPI } from '@walkeros/server-destination-api';\nimport { buildInitConfig } from './init-config.js';\nimport { getEnvironment } from './environment.js';\nimport { getInstallationId } from './install-id.js';\nimport { isTelemetryEnabled, isDebugMode } from './consent.js';\nimport { maybePrintFirstRunNotice } from './first-run-notice.js';\nimport { resolveAppUrl } from '../lib/config-file.js';\n\nconst SEND_TIMEOUT_MS = 1000;\n\nexport interface EmitterOptions {\n /** Caller supplies the v4 source verbatim (type, platform, etc). */\n source: WalkerOS.Source;\n packageVersion: string;\n session?: string;\n}\n\nexport interface Emitter {\n send(\n name: string,\n data: WalkerOS.Properties,\n timingMs?: number,\n sourceOverride?: Partial<WalkerOS.Source>,\n ): Promise<void>;\n}\n\n/**\n * Build the walkerOS telemetry emitter.\n *\n * Consent, debug, and first-run-notice are resolved up-front. When telemetry\n * is not enabled the returned `send` is a no-op that never initializes the\n * collector, never writes a config file, and never touches the network.\n *\n * In debug mode we synthesize the event shape that the collector would emit\n * and write it to stderr instead of starting a real collector. Keeps the\n * output deterministic and avoids paying for collector init when only\n * inspecting payloads.\n *\n * The production path lazily boots a collector on first `send`. The\n * `{ package, config }` shorthand produced by `buildInitConfig` is resolved\n * here into a real `{ code, config }` `Destination.Init<T>` by importing\n * `destinationAPI` from `@walkeros/server-destination-api`. This keeps\n * `init-config.ts` free of the server-destination runtime dependency while\n * centralizing the resolution in the one place that actually runs the flow.\n */\nexport async function createEmitter(opts: EmitterOptions): Promise<Emitter> {\n if (!isTelemetryEnabled()) {\n return {\n async send() {\n /* no-op */\n },\n };\n }\n\n const maybeDevice = getInstallationId();\n if (!maybeDevice) {\n // telemetryEnabled === true but no UUID: inconsistent config.\n // Stay silent rather than silently create one post-consent without an\n // explicit user action.\n return {\n async send() {\n /* no-op */\n },\n };\n }\n const device: string = maybeDevice;\n\n const debug = isDebugMode();\n const endpoint = resolveTelemetryEndpoint();\n if (!endpoint && !debug) {\n // No ingest URL configured. Consistent with the \"ship consent UX\n // without a backend\" contract: opted-in users produce no traffic in\n // v1. Debug mode still runs below because its sole purpose is\n // inspecting payloads locally.\n return {\n async send() {\n /* no-op */\n },\n };\n }\n\n // First-run notice is purely informational; suppress in debug mode so the\n // debug output stream stays predictable for tooling.\n if (!debug) maybePrintFirstRunNotice();\n\n const environment = getEnvironment();\n\n const baseSource: WalkerOS.Source = {\n ...opts.source,\n version: opts.packageVersion,\n };\n\n // Lazy collector init: only pay the cost on first send.\n let elbFn: Elb.Fn | null = null;\n async function ensureElb(): Promise<Elb.Fn> {\n if (elbFn) return elbFn;\n\n const telemetryConfig = buildInitConfig({\n installationId: device,\n session: opts.session,\n environment,\n endpoint: endpoint ?? '',\n });\n\n const collectorConfig: Collector.InitConfig = {\n consent: telemetryConfig.consent,\n user: telemetryConfig.user,\n destinations: {\n api: {\n code: destinationAPI,\n config: {\n settings: telemetryConfig.destinations.api.config,\n },\n },\n },\n };\n\n const { elb } = await startFlow(collectorConfig);\n elbFn = elb;\n return elbFn;\n }\n\n return {\n async send(name, data, timingMs = 0, sourceOverride) {\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name,\n data,\n timing: timingMs,\n source: { ...baseSource, ...sourceOverride },\n };\n\n if (debug) {\n const user: WalkerOS.User = {\n device,\n ...(opts.session ? { session: opts.session } : {}),\n os: environment.os,\n osVersion: environment.osVersion,\n language: environment.language,\n timezone: environment.timezone,\n node: environment.node,\n };\n const preview = {\n ...partialEvent,\n consent: { telemetry: true },\n user,\n };\n process.stderr.write(\n `[walkeros telemetry debug] ${JSON.stringify(preview)}\\n`,\n );\n return;\n }\n\n try {\n const elb = await ensureElb();\n await withTimeout(elb(partialEvent), SEND_TIMEOUT_MS);\n } catch {\n /* swallow: telemetry must never break the host process */\n }\n },\n };\n}\n\n/**\n * Resolve the telemetry ingest endpoint.\n *\n * Reuses `resolveAppUrl()` from `lib/config-file` so a single\n * `walkeros auth login` (which writes `appUrl` to the user config) wires\n * telemetry alongside auth. Order: env (`WALKEROS_APP_URL`) > user config\n * (`~/.config/walkeros/config.json:appUrl`) > undefined (telemetry no-ops).\n *\n * Hard-cut: `TELEMETRY_ENDPOINT` is no longer recognized.\n */\nexport function resolveTelemetryEndpoint(): string | undefined {\n const appUrl = resolveAppUrl();\n if (!appUrl) return undefined;\n return `${appUrl.replace(/\\/$/, '')}/api/telemetry`;\n}\n\nasync function withTimeout<T>(p: Promise<T>, ms: number): Promise<T> {\n return Promise.race<T>([\n p,\n new Promise<T>((_, reject) => {\n const t = setTimeout(() => reject(new Error('telemetry timeout')), ms);\n t.unref();\n }),\n ]);\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Environment } from './environment.js';\n\nexport interface InitConfigInput {\n installationId: string;\n session?: string;\n environment: Environment;\n endpoint: string;\n}\n\n/**\n * Telemetry destination reference using the flow-style package shorthand.\n *\n * @remarks\n * Intentionally narrower than `Destination.Init<T>` from `@walkeros/core`.\n * The telemetry emitter is responsible for resolving the `package` reference\n * into the actual destination `code` before handing the config to\n * `startFlow()`. Keeping the shorthand in the builder keeps this file free\n * of a runtime dependency on `@walkeros/server-destination-api`.\n */\nexport interface TelemetryDestinationReference {\n package: string;\n config: {\n url: string;\n };\n}\n\n/**\n * Telemetry-specific init config shape.\n *\n * @remarks\n * Mirrors the subset of `Collector.InitConfig` the telemetry emitter uses\n * (`consent`, `user`, `destinations`). The `destinations` entries use the\n * package-shorthand form rather than `Destination.InitDestinations` so this\n * module stays free of the server-destination-api dependency. The emitter\n * will translate the shorthand into a real `Destination.Init` before calling\n * `startFlow()`.\n */\nexport interface TelemetryInitConfig {\n consent: WalkerOS.Consent;\n user: WalkerOS.User;\n destinations: {\n api: TelemetryDestinationReference;\n };\n}\n\n/**\n * Build the init config used by the telemetry emitter. The collector merges\n * `user` and `consent` into every emitted event, so per-send code only needs\n * to pass `name`, `data`, `timing`, and `source`.\n *\n * `WalkerOS.User` extends `WalkerOS.Properties`, so carrying a custom `node`\n * field (e.g. `\"v22.0.0\"`) is structurally valid - `string` is a `Property`.\n */\nexport function buildInitConfig(input: InitConfigInput): TelemetryInitConfig {\n const user: WalkerOS.User = {\n device: input.installationId,\n os: input.environment.os,\n osVersion: input.environment.osVersion,\n language: input.environment.language,\n timezone: input.environment.timezone,\n node: input.environment.node,\n };\n if (input.session) user.session = input.session;\n\n return {\n consent: { telemetry: true },\n user,\n destinations: {\n api: {\n package: '@walkeros/server-destination-api',\n config: { url: input.endpoint },\n },\n },\n };\n}\n","import * as os from 'os';\n\nexport interface Environment {\n os: string;\n osVersion: string;\n node: string;\n language: string;\n timezone: string;\n}\n\nexport function getEnvironment(): Environment {\n const locale = Intl.DateTimeFormat().resolvedOptions();\n return {\n os: process.platform,\n osVersion: os.release(),\n node: process.version,\n language: locale.locale,\n timezone: locale.timeZone,\n };\n}\n","import { readConfig } from '../lib/config-file.js';\n\nfunction envFlag(name: string): boolean {\n const v = process.env[name];\n return v === '1' || v === 'true';\n}\n\n/**\n * Is telemetry actively enabled for this process?\n *\n * Returns `true` only when the user has given explicit consent via\n * `walkeros telemetry enable` (recorded as `telemetryEnabled: true` in the\n * config file). Every other state (no config, config without the field, or\n * `telemetryEnabled: false`) returns `false`.\n *\n * `DO_NOT_TRACK` and `WALKEROS_TELEMETRY_DISABLED` are honored as forced-off\n * overrides for backward compatibility and for users who want a belt-and-\n * braces guarantee even after opting in.\n */\nexport function isTelemetryEnabled(): boolean {\n if (envFlag('DO_NOT_TRACK')) return false;\n if (envFlag('WALKEROS_TELEMETRY_DISABLED')) return false;\n return readConfig()?.telemetryEnabled === true;\n}\n\n/** Whether telemetry debug logging is enabled via `WALKEROS_TELEMETRY_DEBUG`. */\nexport function isDebugMode(): boolean {\n return envFlag('WALKEROS_TELEMETRY_DEBUG');\n}\n","import { readConfig } from '../lib/config-file.js';\n\n/**\n * One-time informational notice inviting the user to opt in to anonymous\n * telemetry. Non-blocking. Writes nothing to disk. Suppressed on subsequent\n * runs by the presence of a config file (created by login, project\n * defaults, feedback preferences, or an explicit `walkeros telemetry\n * enable`). If the user never creates a config for any other reason, the\n * notice keeps appearing. That is acceptable: the notice is a one-line\n * informational message, not a prompt.\n */\nexport function maybePrintFirstRunNotice(): void {\n if (readConfig()) return;\n const msg =\n '\\n' +\n 'walkerOS can collect anonymous usage telemetry to help us improve the tools.\\n' +\n \"It's off by default. Nothing is sent until you run `walkeros telemetry enable`.\\n\" +\n 'What we would send: https://github.com/elbwalker/walkerOS/blob/main/packages/cli/src/telemetry/flow.json\\n\\n';\n process.stderr.write(msg);\n}\n","import ciInfo from 'ci-info';\n\nexport interface CiInfo {\n ci: boolean;\n ci_name?: string;\n}\n\ninterface CiInput {\n isCI: boolean;\n name?: string | null;\n}\n\n/**\n * CI environment detection. Accepts an injected input for testability;\n * production callers pass no argument and `ci-info` is read directly.\n */\nexport function getCiInfo(input?: CiInput): CiInfo {\n const isCI = input?.isCI ?? ciInfo.isCI;\n // Use property presence (not nullishness) so callers can pass `name: null`\n // explicitly to mean \"vendor unknown\" without falling through to ciInfo.name.\n const name = input && 'name' in input ? input.name : (ciInfo.name ?? null);\n if (!isCI) return { ci: false };\n return name ? { ci: true, ci_name: name } : { ci: true };\n}\n"],"mappings":"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","names":["path","path","fs","path","path","init_utils","path","fs","fs","fs","path","init_utils","schemas","path","path","fs","input","path","fs","semver","deps","peerDeps","peerMeta","fs","path","getHashServer","path","fs","stats","fs","path","fs","path","fs","getPlatform","existsSync","mkdirSync","writeFileSync","readFileSync","join","path","fs","init_utils","path","fs","getPlatform","init_utils","path","resolve","path","startFlow","path","fs","getPlatform","getPlatform","fs","path","schemas","fs","schemas","getPlatform","path","path","writeFileSync","homedir","join","existsSync","mkdirSync","writeFileSync","isUrl","path","existsSync","z","z","z","z","z","z","z","z","z","existsSync","init_utils","writeFileSync","fs","resolve","resolve","dirname","pathToFileURL","context","resolve","dirname","readFileSync","dirname","join","writeFileSync","fs","join","homedir","prepareBundleForRun","path","writeFileSync","writeCache","chalk","validateEvent","getFlowSettings","isObject","schemas","validateFlowConfig","bundle","path","path","schemas","validate","validateEvent","chalk","z","handleResult","getPlatform","handleResult","result","getPlatform","resolve","path","os","fs","esbuild","os","withTimeout"]}
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/client-context.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/import-specifier.ts","../src/core/parse-component-ref.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/commands/bundle/nft-trace.ts","../src/core/build-cache.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/targets.ts","../src/commands/bundle/upload.ts","../src/commands/bundle/stats.ts","../src/commands/bundle/index.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/async-drain-pump.ts","../src/commands/push/prepare.ts","../src/commands/push/plan-simulate.ts","../src/commands/push/dispatch-simulate.ts","../src/commands/push/run.ts","../src/commands/run/index.ts","../src/runtime/resolve-bundle.ts","../src/runtime/config-fetcher.ts","../src/runtime/runner-auth-error.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/core/api-client.ts","../src/core/api-error.ts","../src/commands/auth/index.ts","../src/commands/projects/index.ts","../src/commands/flows/index.ts","../src/commands/deploy/index.ts","../src/commands/deployments/index.ts","../src/commands/feedback/index.ts","../src/commands/telemetry/index.ts","../src/telemetry/install-id.ts","../src/commands/bundle/wrap.ts","../src/commands/previews/index.ts","../src/commands/simulate/example-loader.ts","../src/commands/simulate/compare.ts","../src/telemetry/index.ts","../src/telemetry/emitter.ts","../src/telemetry/init-config.ts","../src/telemetry/environment.ts","../src/telemetry/consent.ts","../src/telemetry/first-run-notice.ts","../src/telemetry/ci.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 defaultProjectId?: string;\n /**\n * UUID v4, generated and persisted only when the user explicitly opts in\n * to telemetry (`walkeros telemetry enable`). Absent in the default state.\n */\n installationId?: string;\n /**\n * Explicit consent toggle for telemetry. Tri-state:\n * - `undefined`: no decision yet, default (nothing is collected).\n * - `true`: user opted in via `walkeros telemetry enable`.\n * - `false`: user opted out via `walkeros telemetry disable`.\n */\n telemetryEnabled?: 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 * Persist telemetry-relevant fields without touching unrelated config.\n * Reads the existing config (if any) and merges in the provided fields.\n * Used by the `telemetry enable` command to write `installationId` +\n * `telemetryEnabled: true` atomically, and by the `telemetry disable`\n * command to write `telemetryEnabled: false` alone.\n */\nexport function writeTelemetryOnlyConfig(partial: {\n installationId?: string;\n telemetryEnabled?: boolean;\n}): void {\n const existing = readConfig() ?? {};\n writeConfig({ ...existing, ...partial });\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 * Set the anonymous feedback preference in the config.\n * Does nothing when no config exists (avoids creating a skeleton config).\n */\nexport function setFeedbackPreference(anonymous: boolean): void {\n const config = readConfig();\n if (!config) return;\n writeConfig({ ...config, anonymousFeedback: anonymous });\n}\n\n/**\n * Get the anonymous feedback preference from the config.\n * Returns undefined when not set or no config exists.\n */\nexport function getFeedbackPreference(): boolean | undefined {\n const config = readConfig();\n return config?.anonymousFeedback;\n}\n\n/**\n * Set the default project ID in the config.\n * Throws if no config exists (user not authenticated).\n */\nexport function setDefaultProject(projectId: string): void {\n const config = readConfig();\n if (!config) {\n throw new Error('Not authenticated. Run `walkeros login` first.');\n }\n writeConfig({ ...config, defaultProjectId: projectId });\n}\n\n/**\n * Get the default project ID from the config, or null if not set.\n */\nexport function getDefaultProject(): string | null {\n const config = readConfig();\n return config?.defaultProjectId ?? null;\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","export type ClientType = 'cli' | 'mcp' | 'runner';\n\nexport interface ClientContext {\n type: ClientType;\n version: string;\n}\n\nlet context: ClientContext | undefined;\n\n/**\n * Set the client context used to identify this process to the walkerOS app.\n *\n * The CLI binary calls this at startup, the MCP server calls it on boot, and\n * the runner Docker image overrides the resolved type via the\n * `WALKEROS_CLIENT_TYPE` env var (env wins over `input.type`).\n */\nexport function setClientContext(input: {\n type?: ClientType;\n version: string;\n}): void {\n const envType = process.env.WALKEROS_CLIENT_TYPE as ClientType | undefined;\n // Env wins over input.type — lets the runner Docker image override the\n // default chosen by the binary entry point without code changes.\n const type = envType ?? input.type ?? 'cli';\n context = { type, version: input.version };\n}\n\nexport function getClientContext(): ClientContext | undefined {\n return context;\n}\n\nexport function resetClientContext(): void {\n context = undefined;\n}\n\n/**\n * Produce the outbound client-identification headers, or an empty object when\n * no context has been set yet (e.g. in tests or pre-bootstrap code paths).\n */\nexport function clientContextHeaders(): Record<string, string> {\n if (!context) return {};\n return {\n 'User-Agent': `walkeros-${context.type}/${context.version}`,\n 'X-WalkerOS-Client': context.type,\n 'X-WalkerOS-Client-Version': context.version,\n };\n}\n","import {\n resolveAppUrl,\n resolveToken,\n resolveDeployToken,\n} from '../lib/config-file.js';\nimport { clientContextHeaders } from './client-context.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 * Build the final outbound header set by merging client-context headers\n * (User-Agent, X-WalkerOS-Client, X-WalkerOS-Client-Version) with auth.\n * Caller-provided headers win over client-context defaults.\n */\nfunction buildHeaders(\n token: string | null | undefined,\n headers?: HeadersInit,\n): Record<string, string> {\n return {\n ...clientContextHeaders(),\n ...mergeAuthHeaders(token, headers),\n };\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: buildHeaders(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}`, {\n ...init,\n headers: {\n ...clientContextHeaders(),\n ...normalizeHeaders(init?.headers),\n },\n });\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: buildHeaders(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 CLI assets.\n * All paths resolve relative to base directory (defaults to cwd).\n */\n\nimport path from 'path';\nimport { isUrl } from '../config/utils.js';\n\n/**\n * Asset type for resolution strategy\n */\nexport type AssetType = 'config' | 'bundle';\n\n/**\n * Resolve asset path.\n *\n * Resolution rules:\n * 1. URLs → pass through unchanged\n * 2. Absolute paths → use as-is\n * 3. Everything else (bare names, relative paths) → resolve from base directory\n *\n * @param assetPath - Path to resolve\n * @param assetType - Type of asset (currently unused, kept for API compatibility)\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 // Absolute path → use as-is\n if (path.isAbsolute(assetPath)) {\n return assetPath;\n }\n\n // Everything else → resolve from base directory (cwd by default)\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 {\n resolveToken,\n resolveDeployToken,\n getDefaultProject,\n} from '../lib/config-file.js';\n\nexport function getToken(): string | undefined {\n const result = resolveToken();\n return result?.token;\n}\n\nexport function getAuthHeaders(): Record<string, string> {\n const token = getToken();\n if (!token) return {};\n return { Authorization: `Bearer ${token}` };\n}\n\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 || getDefaultProject();\n if (!projectId)\n throw new Error(\n 'No project selected. Set WALKEROS_PROJECT_ID or configure a default project.',\n );\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: Record<string, Flow.BundlePackage> | 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","/**\n * Normalise an absolute path for embedding into generated import statements\n * that esbuild will bundle. Backslashes become escape sequences when JS\n * parses the import (e.g. \\5 turns into U+0005), so we always emit forward\n * slashes — esbuild and Node both resolve them on every platform, Windows\n * included. For Node runtime import() use pathToFileURL(...).href instead;\n * esbuild's static resolver does not accept file:// URLs.\n */\nexport const toFileImportSpecifier = (absPath: string): string =>\n absPath.replace(/\\\\/g, '/');\n","/**\n * Shared parser for `<kind>.<name>` component references used by both the\n * `push --simulate` and `setup` commands.\n *\n * Both commands accept a target string identifying a component in a flow,\n * with overlapping but not identical syntax. This helper handles the common\n * prefix-and-name parsing in one place. Callers that need additional segments\n * (e.g. push's chain notation `destination.NAME.before.TRANSFORMER`) layer\n * their own logic on top of `rest`.\n */\n\n/**\n * Result of parsing a `<prefix>.<name>...` string. `prefix` is validated to be\n * one of the caller-provided allowed values, `name` is the second segment, and\n * `rest` contains any remaining dot-separated segments past `name` for callers\n * that consume them.\n */\nexport interface ParsedComponentRef<TPrefix extends string> {\n prefix: TPrefix;\n name: string;\n rest: string[];\n}\n\nexport interface ParseComponentRefMessages {\n /**\n * Returned when the input has fewer than two dot-separated parts.\n * Receives the raw input string.\n */\n invalidFormat?: (input: string) => string;\n /**\n * Returned when the prefix does not match any allowed value.\n * Receives the parsed prefix.\n */\n invalidPrefix?: (prefix: string) => string;\n /**\n * Returned when the name segment after the prefix is empty.\n * Receives the raw input and the parsed prefix.\n */\n missingName?: (input: string, prefix: string) => string;\n}\n\nexport interface ParseComponentRefOptions<TPrefix extends string> {\n /** Allowed prefix values; the parser validates against this list. */\n allowed: readonly TPrefix[];\n /**\n * Optional per-error message overrides so callers can preserve their\n * existing error wording (e.g. `parseStep` uses \"step format\", whereas\n * `resolveComponent` uses \"target\").\n */\n messages?: ParseComponentRefMessages;\n}\n\nfunction isAllowedPrefix<TPrefix extends string>(\n value: string,\n allowed: readonly TPrefix[],\n): value is TPrefix {\n return (allowed as readonly string[]).includes(value);\n}\n\n/**\n * Parse a `<prefix>.<name>[.<rest>...]` string with strict prefix validation.\n *\n * Throws on:\n * - missing dot or fewer than two segments\n * - empty name (trailing dot or `prefix.`)\n * - prefix not in `allowed`\n */\nexport function parseComponentRef<TPrefix extends string>(\n input: string,\n options: ParseComponentRefOptions<TPrefix>,\n): ParsedComponentRef<TPrefix> {\n const { allowed, messages = {} } = options;\n const allowedList = allowed.join(' | ');\n\n const parts = input.split('.');\n if (parts.length < 2) {\n const msg = messages.invalidFormat\n ? messages.invalidFormat(input)\n : `Invalid target \"${input}\". Expected <kind>.<name> where kind is ${allowedList}.`;\n throw new Error(msg);\n }\n\n const prefix = parts[0];\n const name = parts[1];\n\n if (!name) {\n const msg = messages.missingName\n ? messages.missingName(input, prefix)\n : `Invalid target \"${input}\". Missing name after \"${prefix}.\"`;\n throw new Error(msg);\n }\n\n if (!isAllowedPrefix(prefix, allowed)) {\n const msg = messages.invalidPrefix\n ? messages.invalidPrefix(prefix)\n : `Invalid kind \"${prefix}\". Expected ${allowedList}.`;\n throw new Error(msg);\n }\n\n return {\n prefix,\n name,\n rest: parts.slice(2),\n };\n}\n","export * from './cli-logger.js';\nexport * from './timer.js';\nexport * from './output.js';\nexport * from './tmp.js';\nexport * from './asset-resolver.js';\nexport * from './utils.js';\nexport * from './local-packages.js';\nexport * from './input-detector.js';\nexport * from './stdin.js';\nexport { getToken, getAuthHeaders } 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';\nexport * from './import-specifier.js';\nexport * from './parse-component-ref.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.Json validation.\n */\n\nimport type { Flow } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\n\nconst { safeParseConfig } = schemas;\n\n/**\n * Detect platform from a single flow.\n *\n * Platform is determined by `flow.config.platform`.\n */\nexport function detectPlatform(\n flow: Record<string, unknown>,\n): 'web' | 'server' | undefined {\n const config = flow.config;\n if (!isObject(config)) return undefined;\n const platform = config.platform;\n if (platform === 'web' || platform === 'server') return platform;\n return undefined;\n}\n\n/**\n * Type guard: Check if config is a valid Flow.Json 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.Json {\n const result = safeParseConfig(data);\n return result.success;\n}\n\n/**\n * Validate Flow.Json 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.Json\n * @throws Error with descriptive message if validation fails\n */\nexport function validateFlowConfig(data: unknown): Flow.Json {\n // After successful Zod parse, the data conforms structurally to Flow.Json.\n // The existing `isFlowConfig` guard re-narrows `unknown` to `Flow.Json` via\n // the same schema — TS can't see through `safeParseConfig` because it\n // returns a Zod-inferred type that differs nominally (not structurally)\n // from the Flow.Json interface.\n if (isFlowConfig(data)) return data;\n\n // Not parseable — format Zod errors for CLI display.\n const result = safeParseConfig(data);\n if (result.success) {\n // Defensive: isFlowConfig and safeParseConfig disagreed (cannot happen).\n throw new Error('Invalid configuration: failed Flow.Json type guard.');\n }\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 throw new Error(`Invalid configuration:\\n${errors}`);\n}\n\n/**\n * Get available flow names from a Flow.Json.\n *\n * @param config - Flow.Json configuration\n * @returns Array of flow names\n */\nexport function getAvailableFlows(config: Flow.Json): 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/flow.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.Json 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 (resolved single Flow) */\n flowSettings: Flow;\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.Json 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 // Pre-validation scan: detect the legacy `flow.config.bundle.external`\n // field and strip it before schema validation. The strict Bundle schema\n // rejects unknown keys, so without this step the config would fail to\n // load with a confusing error. Emit a deprecation warning instead.\n const sanitized = stripLegacyBundleExternal(rawConfig, options.logger);\n\n // Validate as Flow.Json\n const config = validateFlowConfig(sanitized);\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 config.platform set to \"web\" or \"server\".`,\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 + overrides + traceInclude from the canonical\n // `flow.<name>.config.bundle.{packages, overrides, traceInclude}` location.\n //\n // The `config.bundle.external` sub-field is no longer supported (replaced\n // by nft tracing); it is warned about and stripped pre-validation in\n // `stripLegacyBundleExternal` so it does not surface here.\n const bundle = flowSettings.config?.bundle;\n const packages: Record<string, Flow.BundlePackage> = bundle?.packages ?? {};\n const overrides: Record<string, string> = bundle?.overrides ?? {};\n const traceInclude = bundle?.traceInclude;\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 overrides,\n traceInclude,\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.Json 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.Json,\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.Json\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/**\n * Pre-validation pass: detect and strip the legacy\n * `flow.config.bundle.external` field. The strict Bundle schema rejects\n * unknown keys, so without this step a config containing the legacy\n * field would fail validation with a confusing error. Emit a one-time\n * deprecation warning per offending flow and return a sanitized clone.\n *\n * The clone is shallow at the levels we mutate (root, `flows`, each flow,\n * `config`, `bundle`); deeper structures are aliased into the clone, which\n * is fine because we only delete a top-level key on the bundle object.\n */\nfunction stripLegacyBundleExternal(\n rawConfig: unknown,\n logger: LoadConfigOptions['logger'],\n): unknown {\n if (!isPlainObject(rawConfig)) return rawConfig;\n const flows = rawConfig.flows;\n if (!isPlainObject(flows)) return rawConfig;\n\n let mutated: Record<string, unknown> | null = null;\n\n for (const [flowName, flowValue] of Object.entries(flows)) {\n if (!isPlainObject(flowValue)) continue;\n const flowConfig = flowValue.config;\n if (!isPlainObject(flowConfig)) continue;\n const bundle = flowConfig.bundle;\n if (!isPlainObject(bundle)) continue;\n if (!('external' in bundle)) continue;\n\n logger?.warn(\n `flow.config.bundle.external is no longer supported; @walkeros/cli@4.x traces server bundles automatically. Remove it from flows.${flowName}.config.bundle.`,\n );\n\n if (!mutated) {\n mutated = {\n ...rawConfig,\n flows: { ...flows },\n };\n }\n const mutatedFlows = mutated.flows as Record<string, unknown>;\n const newBundle = { ...bundle };\n delete newBundle.external;\n const newConfig = { ...flowConfig, bundle: newBundle };\n mutatedFlows[flowName] = { ...flowValue, config: newConfig };\n }\n\n return mutated ?? rawConfig;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","/**\n * Configuration Module\n *\n * Config format: Flow.Json from @walkeros/core\n * Build options: Static platform defaults from build-defaults.ts\n */\n\n// Type guards and validators\nexport {\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 // Boundary: walker traverses arbitrary JSON. After typeof === 'object'\n // narrowing, indexing as a Record<string, unknown> is the typed way to\n // enumerate values.\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(step: Record<string, unknown>): {\n codeProps: Record<string, unknown>;\n dataProps: Record<string, unknown>;\n} {\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 { readFile } from 'fs/promises';\nimport os from 'os';\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\nexport const PACKAGE_DOWNLOAD_TIMEOUT_MS = 60000;\n\nexport interface NpmConfig {\n registry: string;\n [key: string]: unknown;\n}\n\nexport const PACOTE_OPTS: NpmConfig = {\n registry: 'https://registry.npmjs.org/',\n preferOnline: true,\n where: undefined,\n};\n\n/**\n * Walks user + project .npmrc files and merges into a flat config object\n * pacote consumes. Project-level overrides user-level. Tiny INI parser\n * (no sections, surrounding quotes stripped, ${VAR} expansion preserves\n * literal on miss so silent auth failures become loud).\n */\nexport async function loadNpmConfigForPacote(\n projectDir = process.cwd(),\n homeDir = os.homedir(),\n): Promise<NpmConfig> {\n const merged: Record<string, string> = {};\n const sources = [\n path.join(homeDir, '.npmrc'),\n path.join(projectDir, '.npmrc'),\n ];\n for (const file of sources) {\n let content: string;\n try {\n content = await readFile(file, 'utf-8');\n } catch {\n continue;\n }\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#') || line.startsWith(';')) continue;\n const eq = line.indexOf('=');\n if (eq < 0) continue;\n const key = line.slice(0, eq).trim();\n let value = line.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n value = value.replace(\n /\\$\\{([^}]+)\\}/g,\n (match, v) => process.env[v] ?? match,\n );\n merged[key] = value;\n }\n }\n let registry = merged['registry'] ?? 'https://registry.npmjs.org/';\n if (!registry.endsWith('/')) registry = `${registry}/`;\n for (const key of Object.keys(merged)) {\n if (key.endsWith(':registry') && key.startsWith('@')) {\n const v = merged[key];\n if (!v.endsWith('/')) merged[key] = `${v}/`;\n }\n }\n return { ...merged, registry, preferOnline: true };\n}\n\nexport async 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' | 'override' | '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\nexport interface NestedPackage {\n name: string;\n version: string;\n consumers: string[];\n}\n\nexport interface ResolutionResult {\n topLevel: Map<string, ResolvedPackage>;\n nested: NestedPackage[];\n}\n\nfunction getPackageDirectory(baseDir: string, packageName: string): string {\n return path.join(baseDir, 'node_modules', packageName);\n}\n\nfunction getNestedPackageDirectory(\n baseDir: string,\n consumerName: string,\n nestedPackageName: string,\n): string {\n return path.join(\n baseDir,\n 'node_modules',\n consumerName,\n 'node_modules',\n nestedPackageName,\n );\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 overrides: Record<string, string> = {},\n npmConfig: NpmConfig = PACOTE_OPTS,\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 // Warn about overrides targeting direct local-path packages\n const directLocalNames = new Set(\n packages.filter((p) => p.path).map((p) => p.name),\n );\n for (const overrideName of Object.keys(overrides)) {\n if (directLocalNames.has(overrideName)) {\n logger.warn(\n `Override for ${overrideName} ignored — direct package is a local path`,\n );\n }\n }\n\n // Helper: substitute a transitive dep spec with its override (if any)\n const substituteDep = (\n depName: string,\n depSpec: string,\n source: 'dependency' | 'peerDependency',\n from: string,\n optional: boolean,\n ): QueueItem => {\n const overrideSpec = overrides[depName];\n if (overrideSpec) {\n return {\n name: depName,\n spec: overrideSpec,\n source: 'override',\n from: `override (was ${depSpec} from ${from})`,\n optional,\n };\n }\n return { name: depName, spec: depSpec, source, from, optional };\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 // Local package.json shape — only the fields we read.\n interface LocalPackageJson {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n peerDependenciesMeta?: Record<string, { optional?: boolean }>;\n }\n const pkgJson: LocalPackageJson = 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 substituteDep(depName, depSpec, 'dependency', item.name, 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 = peerMeta[depName]?.optional === true;\n queue.push(\n substituteDep(\n depName,\n depSpec,\n 'peerDependency',\n item.name,\n isOptional,\n ),\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. pacote.manifest returns\n // AbbreviatedManifest & ManifestResult — typed dependencies/peerDependencies.\n // peerDependenciesMeta isn't in the upstream type but is a valid npm field;\n // declare a local extension for it.\n interface ManifestWithMeta\n extends pacote.AbbreviatedManifest, pacote.ManifestResult {\n peerDependenciesMeta?: Record<string, { optional?: boolean }>;\n }\n let manifest: ManifestWithMeta;\n try {\n manifest = await withTimeout(\n pacote.manifest(`${item.name}@${item.spec}`, npmConfig),\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 deps = manifest.dependencies || {};\n for (const [depName, depSpec] of Object.entries(deps)) {\n if (typeof depSpec === 'string') {\n queue.push(\n substituteDep(depName, depSpec, 'dependency', item.name, false),\n );\n }\n }\n\n // Queue peerDependencies with metadata\n const peerDeps = manifest.peerDependencies || {};\n const peerMeta = manifest.peerDependenciesMeta || {};\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 substituteDep(\n depName,\n depSpec,\n 'peerDependency',\n item.name,\n isOptional,\n ),\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 override: 1,\n dependency: 2,\n peerDependency: 3,\n};\n\nexport function resolveVersionConflicts(\n allSpecs: Map<string, VersionSpec[]>,\n logger: Logger.Instance,\n): ResolutionResult {\n const topLevel = new Map<string, ResolvedPackage>();\n const nested: NestedPackage[] = [];\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 topLevel.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 const alreadyNested = new Set<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 // Site A: multiple exact versions — highest wins, losers get nested\n const sorted = [...uniqueExact].sort(semver.rcompare);\n chosenVersion = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n const loserVersion = sorted[i];\n const consumers = activeSpecs\n .filter((s) => s.spec === loserVersion)\n .map((s) => s.from);\n nested.push({ name, version: loserVersion, consumers });\n alreadyNested.add(loserVersion);\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 } else if (!alreadyNested.has(spec.spec)) {\n // Site C: transitive exact differs from chosen — nest it\n nested.push({ name, version: spec.spec, consumers: [spec.from] });\n alreadyNested.add(spec.spec);\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 // Site B: range not satisfied — nest the range\n nested.push({ name, version: spec.spec, consumers: [spec.from] });\n }\n }\n }\n }\n }\n\n topLevel.set(name, { name, version: chosenVersion });\n }\n\n // Consolidate nested entries with same name+version (merge consumers)\n const consolidatedMap = new Map<string, NestedPackage>();\n for (const entry of nested) {\n const key = `${entry.name}@${entry.version}`;\n const existing = consolidatedMap.get(key);\n if (existing) {\n for (const c of entry.consumers) {\n if (!existing.consumers.includes(c)) existing.consumers.push(c);\n }\n } else {\n consolidatedMap.set(key, { ...entry, consumers: [...entry.consumers] });\n }\n }\n\n return { topLevel, nested: [...consolidatedMap.values()] };\n}\n\n// ============================================================\n// Phase 3: Install resolved packages\n// ============================================================\n\nexport interface DownloadResult {\n packagePaths: Map<string, string>;\n resolution: ResolutionResult;\n}\n\nexport async function downloadPackagesWithResolution(\n packages: Package[],\n targetDir: string,\n logger: Logger.Instance,\n useCache = true,\n configDir?: string,\n tmpDir?: string,\n overrides: Record<string, string> = {},\n npmConfig: NpmConfig = PACOTE_OPTS,\n): Promise<DownloadResult> {\n return downloadPackagesImpl(\n packages,\n targetDir,\n logger,\n useCache,\n configDir,\n tmpDir,\n overrides,\n npmConfig,\n );\n}\n\n/**\n * Shared body for `downloadPackagesWithResolution`. Returns both the\n * installed package paths and the underlying ResolutionResult.\n */\nasync function downloadPackagesImpl(\n packages: Package[],\n targetDir: string,\n logger: Logger.Instance,\n useCache: boolean,\n configDir: string | undefined,\n tmpDir: string | undefined,\n overrides: Record<string, string>,\n npmConfig: NpmConfig,\n): Promise<DownloadResult> {\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(\n packages,\n logger,\n configDir,\n overrides,\n npmConfig,\n );\n\n // Phase 2: Resolve conflicts\n const resolution = resolveVersionConflicts(allSpecs, logger);\n const { topLevel, nested } = resolution;\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 topLevel) {\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 ...npmConfig,\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 // Install nested packages\n for (const nestedPkg of nested) {\n let resolvedSpec = `${nestedPkg.name}@${nestedPkg.version}`;\n\n if (!semver.valid(nestedPkg.version)) {\n try {\n const manifest = await withTimeout(\n pacote.manifest(resolvedSpec, npmConfig),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Manifest fetch timed out: ${resolvedSpec}`,\n );\n resolvedSpec = `${nestedPkg.name}@${manifest.version}`;\n } catch (error) {\n throw new Error(\n `Failed to resolve nested dependency ${resolvedSpec}: ${error}`,\n );\n }\n }\n\n for (const consumer of nestedPkg.consumers) {\n const nestedDir = getNestedPackageDirectory(\n targetDir,\n consumer,\n nestedPkg.name,\n );\n try {\n await fs.ensureDir(path.dirname(nestedDir));\n const cacheDir =\n process.env.NPM_CACHE_DIR || getTmpPath(tmpDir, 'cache', 'npm');\n await withTimeout(\n pacote.extract(resolvedSpec, nestedDir, {\n ...npmConfig,\n cache: cacheDir,\n }),\n PACKAGE_DOWNLOAD_TIMEOUT_MS,\n `Nested package download timed out: ${resolvedSpec}`,\n );\n logger.debug(`Nested: ${resolvedSpec} under ${consumer}`);\n } catch (error) {\n throw new Error(\n `Failed to install nested ${resolvedSpec} for ${consumer}: ${error}`,\n );\n }\n }\n }\n\n return { packagePaths, resolution };\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","import { nodeFileTrace } from '@vercel/nft';\nimport type { NodeFileTraceReasons } from '@vercel/nft';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport picomatch from 'picomatch';\n\nexport interface TraceOptions {\n entry: string;\n base: string;\n outDir: string;\n /**\n * Extra paths or globs to feed into nft alongside `entry`.\n *\n * Each entry is treated as either a literal path (when it contains no\n * glob meta-characters) or a glob pattern (when it contains `*`, `?`,\n * `[`, or `{`). Both forms are resolved against `base` (the install\n * root pacote populates), not the user's cwd, so the file tracer sees\n * the same tree esbuild used.\n *\n * Globs are expanded by walking the filesystem tree under `base` and\n * matching each relative path with picomatch. Literal entries pass\n * through unchanged.\n */\n extraIncludes?: string[];\n}\n\nexport type TraceReasons = NodeFileTraceReasons;\n\nexport interface TraceResult {\n fileList: string[];\n copied: number;\n reasons: TraceReasons;\n}\n\nexport async function traceAndCopy(opts: TraceOptions): Promise<TraceResult> {\n try {\n await fs.stat(opts.entry);\n } catch {\n throw new Error(\n `nft-trace: entry file not found at '${opts.entry}'. ` +\n `Check the path or run 'walkeros bundle' from the directory containing your flow.json.`,\n );\n }\n\n // `opts.base` is authoritative: callers must pass the pacote-populated\n // install root (the same dir esbuild stage 1 used as `absWorkingDir`) so\n // nft and esbuild see the same `node_modules/` tree. We only normalize\n // through realpath to defuse symlink bases on macOS (`/var` -> `/private/var`).\n const realBase = await fs.realpath(opts.base);\n const expandedExtras = await expandTraceIncludes(\n opts.extraIncludes ?? [],\n realBase,\n );\n const entries = [opts.entry, ...expandedExtras];\n // Keep analysis defaults on (emitGlobs, computeFileReferences, evaluatePureExpressions).\n // These are what catch __dirname-loaded .proto files and similar references.\n const { fileList, reasons } = await nodeFileTrace(entries, {\n base: realBase,\n });\n\n const outDirReal = path.resolve(opts.outDir);\n let copied = 0;\n\n for (const file of fileList) {\n const reason = reasons.get(file);\n // `reasons.ignored` is a contract with @vercel/nft: when nft marks a file\n // as ignored, we trust it and skip the copy. Our public API does not\n // expose nft's `ignore` option, so this branch is not directly testable\n // from a unit test without contorting the surface. Future reviewers: do\n // not delete this guard. It is the documented integration point.\n if (reason?.ignored) continue;\n\n const dst = path.resolve(outDirReal, file);\n if (!dst.startsWith(outDirReal + path.sep) && dst !== outDirReal) {\n throw new Error(\n `nft-trace: traced file '${file}' resolves outside outDir. ` +\n `This usually means base is too narrow for a hoisted monorepo. ` +\n `Move base up to the workspace root or set traceInclude explicitly.`,\n );\n }\n\n const src = path.join(realBase, file);\n await fs.mkdir(path.dirname(dst), { recursive: true });\n await fs.copyFile(src, dst);\n const s = await fs.stat(src);\n if (s.mode & 0o111) await fs.chmod(dst, s.mode);\n copied++;\n }\n\n return { fileList: Array.from(fileList), copied, reasons };\n}\n\n/**\n * Cross-check helper: after tracing, verify every package pacote resolved\n * (the top-level set) was actually picked up by the trace.\n *\n * Catches three concrete failure modes that nft cannot diagnose itself:\n * - Hoisted monorepo symlinks where the real package lives outside `base`,\n * so nft never sees it.\n * - Per-release nft regressions that drop a previously-traced package.\n * - Deps imported only via dynamic `require` strings nft cannot statically\n * resolve (and therefore cannot include).\n *\n * The expected set comes from pacote's resolution (the install layer), not\n * from the user's `package.json` (which does not list step packages in the\n * zero-setup design). The check is shallow on purpose: we only verify the\n * package's `package.json` reached the trace, not every file inside. If the\n * manifest is there, nft followed the imports and copied what it found; if\n * a deeper file is missing the user adds it via\n * `flow.<name>.config.bundle.traceInclude`.\n */\nexport interface AssertDepsOptions {\n fileList: string[];\n expectedPackages: string[];\n}\n\nexport function assertDepsTraced(opts: AssertDepsOptions): void {\n const missing = opts.expectedPackages.filter((dep) => {\n const expected = `node_modules/${dep}/package.json`;\n return !opts.fileList.some((f) => f.endsWith(expected));\n });\n if (missing.length > 0) {\n throw new Error(\n `nft-trace: resolved packages missing from trace: ${missing.join(', ')}. ` +\n `Possible causes: hoisted monorepo symlinks outside base; nft per-release regression; ` +\n `dynamic require not statically traceable. ` +\n `Add specific paths to flow.<name>.config.bundle.traceInclude as a workaround.`,\n );\n }\n}\n\n/**\n * Glob meta-characters that signal a trace-include entry needs filesystem\n * walk + picomatch expansion. Mirrors picomatch's own definition; kept\n * local so future tweaks (e.g., adding `(`) don't reach into picomatch.\n */\nconst GLOB_CHARS = /[*?[\\]{}]/;\n\n/**\n * Resolve user-provided trace includes\n * (`flow.<name>.config.bundle.traceInclude`) into a list of absolute file\n * paths the file tracer can consume.\n *\n * Each entry is one of:\n * - A literal path: returned as an absolute path resolved against `base`.\n * Missing files are tolerated (nft surfaces its own clearer error).\n * - A glob pattern (contains `*`, `?`, `[`, `{`): expanded by walking\n * `base` and matching each relative path with picomatch. Only files\n * are returned (directories are walked through, never matched).\n *\n * `base` is the install root (the same dir esbuild stage 1 used as\n * `absWorkingDir`), NOT `process.cwd()`. This keeps glob expansion in\n * the same tree nft will trace, avoiding a class of \"the glob matches\n * nothing because the user's cwd is wrong\" surprises.\n */\nasync function expandTraceIncludes(\n patterns: string[],\n base: string,\n): Promise<string[]> {\n if (patterns.length === 0) return [];\n\n const literals: string[] = [];\n const globs: string[] = [];\n for (const entry of patterns) {\n if (GLOB_CHARS.test(entry)) globs.push(entry);\n else literals.push(entry);\n }\n\n const resolvedLiterals = literals.map((p) =>\n path.isAbsolute(p) ? p : path.resolve(base, p),\n );\n\n if (globs.length === 0) return resolvedLiterals;\n\n const matchers = globs.map((g) => picomatch(g));\n const matchedFiles: string[] = [];\n await walkFiles(base, base, async (absFile, relFile) => {\n // Globs match POSIX-style paths even on Windows; normalize before\n // testing so user-authored patterns stay portable.\n const relPosix = relFile.split(path.sep).join('/');\n if (matchers.some((m) => m(relPosix))) {\n matchedFiles.push(absFile);\n }\n });\n\n return [...resolvedLiterals, ...matchedFiles];\n}\n\n/**\n * Recursively walk `dir`, calling `visit(absPath, relativeToRoot)` for\n * every regular file encountered. Symlinks are followed for directories\n * via `withFileTypes` (the default `Dirent.isDirectory()` resolves the\n * link). We don't apply ignores here; trace includes are an explicit\n * user opt-in and the patterns themselves are expected to scope.\n */\nasync function walkFiles(\n root: string,\n dir: string,\n visit: (absFile: string, relFile: string) => Promise<void>,\n): Promise<void> {\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const abs = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await walkFiles(root, abs, visit);\n } else if (entry.isFile()) {\n await visit(abs, path.relative(root, abs));\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';\nimport type { MinifyOptions } from '../types/bundle.js';\n\n/**\n * Inputs that participate in the L2 code cache key.\n *\n * The L2 cache stores stage-1 esbuild output (compiled code skeleton).\n * Two builds with different externals / platform / format / minify / target /\n * window globals / resolved package versions but identical generated entry code\n * MUST produce different cache keys, otherwise stage-2 would receive stale\n * stage-1 output. Hashing only `codeContent` is therefore unsafe.\n */\nexport interface CodeCacheKeyInputs {\n externals: Set<string>;\n platform: 'node' | 'browser';\n target: string;\n nodeMajor: number;\n format: 'esm' | 'iife' | 'cjs';\n minify?: boolean;\n minifyOptions?: MinifyOptions;\n windowCollector?: string;\n windowElb?: string;\n versionsHash: string;\n}\n\nfunction serializeKeyInputs(inputs: CodeCacheKeyInputs): string {\n return JSON.stringify({\n externals: [...inputs.externals].sort(),\n platform: inputs.platform,\n target: inputs.target,\n nodeMajor: inputs.nodeMajor,\n format: inputs.format,\n minify: inputs.minify ?? false,\n minifyOptions: inputs.minifyOptions ?? null,\n windowCollector: inputs.windowCollector ?? null,\n windowElb: inputs.windowElb ?? null,\n versionsHash: inputs.versionsHash,\n });\n}\n\n/**\n * Compute the L2 cache key from code content + key inputs. Single source of\n * truth so getCodeCachePath and ensureCodeOnDisk cannot drift apart on hash\n * format, separator, or length.\n */\nasync function computeCodeCacheKey(\n codeContent: string,\n inputs: CodeCacheKeyInputs,\n): Promise<string> {\n const keyMaterial = `${codeContent}\\n###\\n${serializeKeyInputs(inputs)}`;\n return getHashServer(keyMaterial, 12);\n}\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 * Hashes `codeContent` PLUS all build-shaping inputs that affect stage-1\n * output: externals, platform, target, format, minify, window globals, and\n * the resolved package versions hash. This prevents stage-2 from receiving\n * stale stage-1 output when only build options or versions change.\n */\nexport async function getCodeCachePath(\n codeContent: string,\n tmpDir: string | undefined,\n inputs: CodeCacheKeyInputs,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'code');\n const cacheKey = await computeCodeCacheKey(codeContent, inputs);\n return path.join(cacheDir, `${cacheKey}.js`);\n}\n\nexport async function isCodeCached(\n codeContent: string,\n tmpDir: string | undefined,\n inputs: CodeCacheKeyInputs,\n): Promise<boolean> {\n const cachePath = await getCodeCachePath(codeContent, tmpDir, inputs);\n return fs.pathExists(cachePath);\n}\n\nexport async function cacheCode(\n codeContent: string,\n codeOutput: string,\n tmpDir: string | undefined,\n inputs: CodeCacheKeyInputs,\n): Promise<void> {\n const cachePath = await getCodeCachePath(codeContent, tmpDir, inputs);\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 | undefined,\n inputs: CodeCacheKeyInputs,\n): Promise<string | null> {\n const cachePath = await getCodeCachePath(codeContent, tmpDir, inputs);\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 using the same composite key as the L2 cache so the on-disk\n * .mjs file lines up with the cached compiled output.\n */\nexport async function ensureCodeOnDisk(\n codeContent: string,\n compiledCode: string,\n tmpDir: string | undefined,\n inputs: CodeCacheKeyInputs,\n): Promise<string> {\n const cacheDir = getTmpPath(tmpDir, 'cache', 'code');\n const cacheKey = await computeCodeCacheKey(codeContent, inputs);\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.Code {\n return (\n code !== null &&\n typeof code === 'object' &&\n !Array.isArray(code) &&\n 'push' in code\n );\n}\n\n/**\n * Type-narrowed accessor for a Flow section. Returns the typed step record\n * (or undefined) — exhaustive switch over the literal-union parameter avoids\n * a generic indexed-access cast.\n *\n * Returns the union of all section types when the caller passes a runtime\n * variable. Call sites that need a specific section type access the field\n * directly (e.g. `flow.sources`).\n */\ntype FlowStepRecord =\n | Record<string, Flow.Source>\n | Record<string, Flow.Destination>\n | Record<string, Flow.Transformer>\n | Record<string, Flow.Store>;\nfunction getFlowSection(\n flow: Flow,\n section: 'sources' | 'destinations' | 'transformers' | 'stores',\n): FlowStepRecord | undefined {\n switch (section) {\n case 'sources':\n return flow.sources;\n case 'destinations':\n return flow.destinations;\n case 'transformers':\n return flow.transformers;\n case 'stores':\n return flow.stores;\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.Code,\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 {\n downloadPackagesWithResolution,\n loadNpmConfigForPacote,\n} from './package-manager.js';\nimport { traceAndCopy, assertDepsTraced } from './nft-trace.js';\nimport type { Logger } from '@walkeros/core';\nimport { getHashServer } from '@walkeros/server-core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { toFileImportSpecifier } from '../../core/import-specifier.js';\nimport {\n isBuildCached,\n getCachedBuild,\n cacheBuild,\n getCachedCode,\n cacheCode,\n ensureCodeOnDisk,\n} from '../../core/build-cache.js';\nimport type { CodeCacheKeyInputs } 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 *\n * Hashes pacote's resolved top-level set as the dependency-version signal:\n * a version bump in `flow.<name>.config.bundle.packages` (or any transitive re-resolution\n * pacote performs) produces a new `versionsHash`, which produces a new\n * cache key, which produces a new traced `node_modules/`. The user does\n * NOT maintain a `package-lock.json` for step packages in the zero-setup\n * design, so pacote's resolution is the authoritative version signal.\n */\nfunction generateCacheKeyContent(\n flowSettings: Flow,\n buildOptions: BuildOptions,\n versionsHash: string,\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 versionsHash,\n };\n return JSON.stringify(configForCache);\n}\n\nexport async function bundleCore(\n flowSettings: Flow,\n buildOptions: BuildOptions,\n logger: Logger.Instance,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\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 // Resolve npm config (registry + scope overrides + auth tokens) from .npmrc\n // once per build. Threaded into every pacote call so private registries and\n // scoped tokens (e.g. @elbwalker:registry=...) work the same as `npm install`.\n const npmConfig = await loadNpmConfigForPacote(\n buildOptions.configDir ?? process.cwd(),\n );\n\n // Resolve the deploy artifact directory once so stale-artifact cleanup,\n // sidecar emission, and the install pipeline all agree on which folder\n // hosts `flow.mjs` + `node_modules/` + `package.json` + `package-lock.json`.\n const outputPath = path.resolve(buildOptions.output);\n const outputDirAbs = path.dirname(outputPath);\n\n // Stale cleanup: a previous build with externals can leave behind\n // node_modules/, package.json, and package-lock.json that no longer match\n // the current flow. We unconditionally purge them at the top so a flow\n // that USED to declare externals but no longer does cannot ship stale\n // install artifacts. Runs before any cache check so it applies on cache\n // hits too.\n await fs.remove(path.join(outputDirAbs, 'node_modules'));\n await fs.remove(path.join(outputDirAbs, 'package.json'));\n await fs.remove(path.join(outputDirAbs, 'package-lock.json'));\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(flowSettings.sources || {}).length > 0 ||\n Object.keys(flowSettings.destinations || {}).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 [\n 'sources',\n 'destinations',\n 'transformers',\n 'stores',\n ] as const) {\n const steps = getFlowSection(flowSettings, 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 // downloadPackagesWithResolution adds 'node_modules' subdirectory\n // automatically and returns the underlying ResolutionResult so the\n // install pipeline can pin extracted versions to the same graph the\n // bundler resolved (no second resolve, no version drift).\n const { packagePaths, resolution: resolutionResult } =\n await downloadPackagesWithResolution(\n packagesArray,\n TEMP_DIR,\n logger,\n buildOptions.cache,\n buildOptions.configDir, // For resolving relative local paths\n CACHE_DIR,\n buildOptions.overrides,\n npmConfig,\n );\n\n // Fix @walkeros packages to have proper ESM exports and scan every\n // resolved package's manifest for the legacy `walkerOS.bundle` field.\n // The annotation is silently ignored in @walkeros/cli@4.x (nft tracing\n // replaces it). One-time WARN per package nudges authors to clean up.\n const warnedBundleFieldPackages = new Set<string>();\n for (const [pkgName, pkgPath] of packagePaths.entries()) {\n const pkgJsonPath = path.join(pkgPath, 'package.json');\n let pkgJson: Record<string, unknown>;\n try {\n pkgJson = await fs.readJSON(pkgJsonPath);\n } catch {\n continue;\n }\n\n const walkerOSBlock = pkgJson.walkerOS;\n if (\n walkerOSBlock &&\n typeof walkerOSBlock === 'object' &&\n !Array.isArray(walkerOSBlock)\n ) {\n const bundleField = (walkerOSBlock as Record<string, unknown>).bundle;\n if (\n bundleField &&\n typeof bundleField === 'object' &&\n !Array.isArray(bundleField) &&\n !warnedBundleFieldPackages.has(pkgName)\n ) {\n warnedBundleFieldPackages.add(pkgName);\n const keys = Object.keys(bundleField as Record<string, unknown>)\n .sort()\n .join(', ');\n logger.warn(\n `walkeros: package ${pkgName} still declares walkerOS.bundle.${keys}; this is ignored in @walkeros/cli@4.x. Tell the package author to remove it.`,\n );\n }\n }\n\n if (pkgName.startsWith('@walkeros/')) {\n // Add exports field to force ESM resolution\n const exportsField = pkgJson.exports;\n const moduleField = pkgJson.module;\n if (!exportsField && typeof moduleField === 'string') {\n pkgJson.exports = {\n '.': {\n import: moduleField,\n require: pkgJson.main,\n },\n };\n await fs.writeJSON(pkgJsonPath, pkgJson, { spaces: 2 });\n }\n }\n }\n\n // Hash pacote's resolved top-level set once per build. Used in both the\n // L1 cache-key check below and the L2 code-cache key further down. A\n // version bump in `flow.<name>.config.bundle.packages` (or any pacote re-resolution)\n // produces a new hash, which produces a new cache key, which forces a\n // fresh trace + esbuild. This is the right invalidation signal because\n // pacote (not the user's package-lock.json) is the install layer.\n const sortedVersions = [...resolutionResult.topLevel.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, p]) => `${name}@${p.version}`);\n const versionsHash = await getHashServer(sortedVersions.join('\\n'), 12);\n // Step packages externalized by esbuild and asserted by nft trace. Use\n // the packages the user (or auto-add) actually declared, not pacote's\n // full top-level set: peer dependencies pacote installs (e.g. zod for\n // schema validation) are not necessarily imported by the runtime\n // bundle. Tree-shaking drops the bare import, nft never sees it, and\n // the cross-check would otherwise false-positive. The intent that\n // matters here is \"what step packages does the flow declare\".\n const expectedTopLevelPackages = Object.keys(buildOptions.packages).filter(\n (name) => !name.startsWith('.') && !name.startsWith('/'),\n );\n\n // Check build cache (Level 1 fast path) — moved after package resolution\n // so the cache key reflects the resolved dependency graph (versionsHash).\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(\n flowSettings,\n buildOptions,\n versionsHash,\n );\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 await fs.ensureDir(path.dirname(outputPath));\n await fs.writeFile(outputPath, cachedBuild);\n\n if (buildOptions.platform === 'node') {\n // Server path: trace from the cached bundle, copy files into\n // `outDir/node_modules/`, write the informational sidecar.\n await runNftServerPath(\n outputPath,\n flowSettings,\n buildOptions,\n TEMP_DIR,\n expectedTopLevelPackages,\n logger,\n );\n }\n // Web flows don't ship a sidecar node_modules — esbuild emits a\n // self-contained IIFE.\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 if (showStats) {\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 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 // 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 // outputPath was resolved at the top of bundleCore (alongside the stale\n // cleanup paths). Just ensure its directory exists.\n await fs.ensureDir(path.dirname(outputPath));\n\n // === LEVEL 2: Two-phase build (code cache) ===\n // Build the L2 cache key inputs once. This must include every input that\n // affects stage-1 output, otherwise different builds with identical entry\n // code (but e.g. different platform) would alias to the same cache slot\n // and stage-2 would receive stale stage-1 bytes.\n //\n // `versionsHash` was hoisted above the L1 cache check (it is also the\n // dependency-version signal in `generateCacheKeyContent`). Reuse it here\n // so a transitive version bump busts both cache layers consistently.\n const codeKeyInputs: CodeCacheKeyInputs = {\n externals: new Set(),\n platform: buildOptions.platform === 'node' ? 'node' : 'browser',\n target: resolveTarget(buildOptions),\n nodeMajor: parseInt(process.versions.node.split('.')[0], 10),\n format: buildOptions.format,\n minify: buildOptions.minify,\n minifyOptions: buildOptions.minifyOptions,\n windowCollector: buildOptions.windowCollector,\n windowElb: buildOptions.windowElb,\n versionsHash,\n };\n\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, codeKeyInputs);\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 expectedTopLevelPackages,\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, codeKeyInputs);\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 codeKeyInputs,\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 platform: buildOptions.platform as 'browser' | 'node',\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 = resolveTarget(buildOptions);\n } else {\n // Externalize node builtins AND step packages. Step packages must\n // remain bare imports here too, otherwise stage 2 would re-bundle\n // them after stage 1 carefully kept them external. nft traces the\n // bare imports from the final bundle and copies code from\n // `TEMP_DIR/node_modules/` to `dist/node_modules/`.\n stage2Options.external = [\n ...getNodeExternals(),\n ...expectedTopLevelPackages,\n ];\n stage2Options.banner = {\n js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`,\n };\n stage2Options.target = resolveTarget(buildOptions);\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(\n flowSettings,\n buildOptions,\n versionsHash,\n );\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 if (buildOptions.platform === 'node') {\n // Server path: trace the just-emitted bundle, copy used files into\n // `outDir/node_modules/`, write an informational sidecar package.json.\n await runNftServerPath(\n outputPath,\n flowSettings,\n buildOptions,\n TEMP_DIR,\n expectedTopLevelPackages,\n logger,\n );\n }\n // Web flows don't ship a sidecar node_modules — esbuild emits a\n // self-contained IIFE.\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\n/**\n * Resolve the effective esbuild `target` for a build. Single source of truth\n * shared between `createEsbuildOptions` (where esbuild actually compiles) and\n * the L2 cache-key construction in `bundle()`. Drift between these two would\n * silently alias different builds onto the same cache slot.\n */\nfunction resolveTarget(buildOptions: BuildOptions): string {\n return (\n buildOptions.target ??\n (buildOptions.platform === 'node' ? 'node18' : 'es2018')\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 stepPackageExternals: string[] = [],\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 // Node builtins are always external. Step packages (sources, destinations,\n // transformers, stores resolved by pacote) are also externalized so the\n // emitted entry stays small: nft traces those bare imports from the\n // emitted bundle and copies the actual code from `tempDir/node_modules/`\n // into the sibling `dist/node_modules/`. Without this, esbuild would\n // inline every step package's source into flow.mjs and we would ship\n // both the inline copy and the nft-traced copy. Decision #9 in the\n // bundler-nft-redesign plan.\n const nodeExternals = getNodeExternals();\n const externalsParts = [nodeExternals, stepPackageExternals];\n if (buildOptions.external) externalsParts.push(buildOptions.external);\n baseOptions.external = externalsParts.flat();\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 via shared resolver so the L2 cache key cannot drift from the\n // value esbuild actually compiles against.\n baseOptions.target = resolveTarget(buildOptions);\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 */\nexport function detectStepPackages(\n flowSettings: Flow,\n section: 'sources' | 'destinations' | 'transformers' | 'stores',\n): Set<string> {\n const packages = new Set<string>();\n const steps = getFlowSection(flowSettings, section);\n\n if (steps) {\n for (const [, stepConfig] of Object.entries(steps)) {\n if (typeof stepConfig !== 'object' || stepConfig === null) continue;\n // Require explicit package field\n if (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 * Server-only post-build pass: run nft on the just-emitted server bundle to\n * copy every actually-used file into `outDir/node_modules/`, then write a\n * minimal informational `package.json` next to it that lists the step\n * packages declared by the flow. The artifact shape is deliberately\n * directory-shaped: `{ flow.mjs, package.json, node_modules/ }`.\n *\n * `tempDir` is the pacote-populated install root (the same dir esbuild\n * stage 1 used as `absWorkingDir`). We trace from there so nft and esbuild\n * see the same `node_modules/` tree. The bundle at `outputPath` lives\n * outside `tempDir`, so we stage a copy inside `tempDir` to give nft an\n * entry whose relative path under `base` does not escape via `..`.\n * `expectedPackages` is the pacote-resolved top-level set, used for the\n * post-trace cross-check that catches dynamic-require regressions and\n * hoisted-symlink mistakes.\n */\nasync function runNftServerPath(\n outputPath: string,\n flowSettings: Flow,\n buildOptions: BuildOptions,\n tempDir: string,\n expectedPackages: string[],\n logger: Logger.Instance,\n): Promise<void> {\n const outDir = path.dirname(outputPath);\n\n // Wire `flow.<name>.config.bundle.traceInclude` into the file tracer. The\n // user-facing field is under the per-flow bundle block; the loader threads\n // it through `buildOptions.traceInclude`. Each entry is a literal path or a\n // glob (resolved against `tempDir`). `traceAndCopy` performs the expansion.\n const flowExtraIncludes: string[] = [\n ...(flowSettings.config?.bundle?.traceInclude ?? []),\n ...(buildOptions.traceInclude ?? []),\n ];\n\n // Stage the just-emitted bundle into tempDir so nft sees an entry whose\n // path is relative to `base` (without `..`). Without this, the path-\n // escape guard in `traceAndCopy` rejects the entry's own fileList entry\n // (resolved relative to base, it would point outside outDir).\n const stagedEntry = path.join(tempDir, '__nft-flow.mjs');\n await fs.copyFile(outputPath, stagedEntry);\n\n let result;\n try {\n result = await traceAndCopy({\n entry: stagedEntry,\n base: tempDir,\n outDir,\n extraIncludes: flowExtraIncludes,\n });\n } finally {\n // The staged copy is internal scaffolding; the real bundle stays at\n // outputPath. Clean up the staged file but never touch outputPath.\n await fs.remove(stagedEntry).catch(() => {});\n }\n\n // The staged entry itself appears in nft's fileList. Drop it from the\n // copy results before the cross-check so we don't accidentally ship a\n // copy of the bundle inside `outDir/__nft-flow.mjs` (and so the\n // assertDepsTraced check sees only the resolved package files).\n const stagedRel = path.relative(await fs.realpath(tempDir), stagedEntry);\n const trimmedFileList = result.fileList.filter((f) => f !== stagedRel);\n await fs.remove(path.join(outDir, stagedRel)).catch(() => {});\n\n // Cross-check: every package pacote resolved at the top level must appear\n // in the trace output. Catches hoisted-symlink misses, nft per-release\n // regressions, and dynamic-require deps nft cannot statically follow.\n // The check is always meaningful now (the expected set comes from the\n // install layer, not user package.json), so there is no opt-out flag.\n if (expectedPackages.length > 0) {\n assertDepsTraced({\n fileList: trimmedFileList,\n expectedPackages,\n });\n }\n\n const stepPackages = collectAllStepPackages(flowSettings);\n const dependencies: Record<string, string> = {};\n for (const name of [...stepPackages].sort()) {\n if (name.startsWith('.') || name.startsWith('/')) continue;\n dependencies[name] = '*';\n }\n\n const sidecarPath = path.join(outDir, 'package.json');\n await fs.writeJson(\n sidecarPath,\n {\n name: 'walkeros-bundle',\n private: true,\n type: 'module',\n dependencies,\n },\n { spaces: 2 },\n );\n logger.debug(\n `nft-trace: copied ${result.copied} file(s); wrote ${sidecarPath}`,\n );\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(flowSettings: Flow): 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,\n): Map<string, Set<string>> {\n const explicitCodeImports = new Map<string, Set<string>>();\n\n // Check destinations\n const destinations = flowSettings.destinations;\n\n if (destinations) {\n for (const [, destConfig] of Object.entries(destinations)) {\n if (\n typeof destConfig.package === 'string' &&\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 = flowSettings.sources;\n\n if (sources) {\n for (const [, sourceConfig] of Object.entries(sources)) {\n if (\n typeof sourceConfig.package === 'string' &&\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 = flowSettings.transformers;\n\n if (transformers) {\n for (const [, transformerConfig] of Object.entries(transformers)) {\n if (\n typeof transformerConfig.package === 'string' &&\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 = flowSettings.stores;\n\n if (stores) {\n for (const [, storeConfig] of Object.entries(stores)) {\n if (\n typeof storeConfig.package === 'string' &&\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 devExportEntries: 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 */\nasync function 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 packagePaths: Map<string, string>,\n withDev: boolean,\n): Promise<ImportGenerationResult> {\n const importStatements: 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\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 // Generate /dev imports for packages that expose a ./dev export.\n // Only emitted when withDev is true (i.e., skipWrapper bundles consumed by\n // push/simulate/flow-context). Production IIFE bundles skip this entirely —\n // otherwise the dev graph (zod schemas, etc.) leaks into walker.js because\n // stage 2 esbuild cannot tree-shake transitive imports out of the already-\n // concatenated stage 1 file.\n const devExportEntries: string[] = [];\n if (withDev) {\n for (const packageName of usedPackages) {\n const localPath = packagePaths.get(packageName);\n if (!localPath) continue;\n\n try {\n const pkgJsonPath = path.join(localPath, 'package.json');\n const pkgJson = await fs.readJSON(pkgJsonPath);\n const exports = pkgJson.exports;\n if (exports && typeof exports === 'object' && './dev' in exports) {\n const varName = `__dev_${packageNameToVariable(packageName)}`;\n importStatements.push(\n `import * as ${varName} from '${packageName}/dev';`,\n );\n devExportEntries.push(`'${packageName}': ${varName}`);\n }\n } catch {\n // Package doesn't have a readable package.json — skip gracefully\n }\n }\n }\n\n return { importStatements, devExportEntries };\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,\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 return;\n }\n if (obj === null || typeof obj !== 'object') return;\n // Boundary: walker traverses arbitrary JSON. After typeof === 'object'\n // narrowing, indexing as a Record<string, unknown> is the typed way\n // to enumerate keys.\n for (const [key, val] of Object.entries(obj)) {\n collectRefs(val, `${path}.${key}`);\n }\n }\n\n // Scan all component env/config values\n const sectionMap = {\n sources: flowSettings.sources || {},\n destinations: flowSettings.destinations || {},\n transformers: flowSettings.transformers || {},\n };\n for (const [section, components] of Object.entries(sectionMap)) {\n for (const [id, component] of Object.entries(components)) {\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,\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(Object.keys(flowSettings.stores || {}));\n validateStoreReferences(flowSettings, storeIds);\n\n // Validate component names are valid JS identifiers (they become property names in generated code)\n if (flowSettings.sources)\n validateComponentNames(flowSettings.sources, 'sources');\n if (flowSettings.destinations)\n validateComponentNames(flowSettings.destinations, 'destinations');\n if (flowSettings.transformers)\n validateComponentNames(flowSettings.transformers, 'transformers');\n if (flowSettings.stores)\n validateComponentNames(flowSettings.stores, 'stores');\n\n // Generate import statements.\n // withDev is resolved from the BundleTarget preset by the public `bundle()`\n // entry point. When called directly via `bundleCore` (push, simulate, tests),\n // we fall back to `skipWrapper === true` for backward compatibility — those\n // call sites historically relied on skipWrapper to pull in /dev schemas.\n const withDev =\n buildOptions.withDev !== undefined\n ? buildOptions.withDev === true\n : buildOptions.skipWrapper === true;\n const { importStatements, devExportEntries } = await generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n transformerPackages,\n storePackages,\n explicitCodeImports,\n packagePaths,\n withDev,\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 // Append __devExports if any packages expose /dev\n const devExportsBlock =\n devExportEntries.length > 0\n ? `\\nexport const __devExports = {\\n ${devExportEntries.join(',\\n ')},\\n};`\n : '';\n\n // Return ESM module (imports + wireConfig + startFlow re-export + optional devExports)\n const fullModule = wireConfigModule + devExportsBlock;\n const codeEntry = importsCode\n ? `${importsCode}\\n\\n${fullModule}`\n : fullModule;\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,\n explicitCodeImports: Map<string, Set<string>>,\n): {\n storesDeclaration: string;\n codeConfigObject: string;\n dataPayload: string;\n} {\n const sources = flowSettings.sources || {};\n const destinations = flowSettings.destinations || {};\n const transformers = flowSettings.transformers || {};\n const stores = flowSettings.stores || {};\n\n // Data payload accumulator\n const dataPayloadObj: Record<string, Record<string, unknown>> = {};\n\n // Union of all step types — share helpers across sources/destinations/transformers/stores\n type FlowStep =\n | Flow.Source\n | Flow.Destination\n | Flow.Transformer\n | Flow.Store;\n\n // Helper to resolve the code variable for a package-based step\n function resolveCodeVar(step: FlowStep): 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(step: FlowStep): 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: FlowStep,\n ): string {\n const codeVar = resolveCodeVar(step);\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\n Object.entries(sources).forEach(([name, source]) => {\n validateReference('Source', name, source);\n });\n Object.entries(destinations).forEach(([name, dest]) => {\n validateReference('Destination', name, dest);\n });\n Object.entries(transformers).forEach(([name, transformer]) => {\n validateReference('Transformer', name, transformer);\n });\n\n // Build sources\n const sourcesEntries = Object.entries(sources)\n .filter(([, source]) => source.package || hasCodeReference(source.code))\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('sources', key, source);\n });\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations)\n .filter(([, dest]) => dest.package || hasCodeReference(dest.code))\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('destinations', key, dest);\n });\n\n // Build transformers\n const transformersEntries = Object.entries(transformers)\n .filter(\n ([, transformer]) =>\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('transformers', key, transformer);\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);\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 (flowSettings.collector) {\n if (containsCodeMarkers(flowSettings.collector)) {\n // Collector has code markers — keep in code skeleton\n collectorStr = `,\\n ...${processConfigValue(flowSettings.collector)}`;\n } else {\n // Plain collector — put in data payload. Spread copies own enumerable\n // properties into a Record<string, unknown>-compatible target.\n dataPayloadObj['collector'] = { ...flowSettings.collector };\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 const stage1Specifier = toFileImportSpecifier(stage1Path);\n return `import { startFlow, wireConfig } from '${stage1Specifier}';\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: {\n windowCollector?: string;\n windowElb?: string;\n /** Runtime platform. 'browser' emits env.window/env.document injection; 'node' omits it. Default 'browser' for backward compat. */\n platform?: 'browser' | 'node';\n } = {},\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 const platform = options.platform ?? 'browser';\n const envBlock =\n platform === 'browser'\n ? `\n if (config.sources) {\n for (const key of Object.keys(config.sources)) {\n const source = config.sources[key];\n if (!source) continue;\n const env = source.env ?? (source.env = {});\n env.window = env.window ?? (typeof window !== 'undefined' ? window : undefined);\n env.document = env.document ?? (typeof document !== 'undefined' ? document : undefined);\n }\n }`\n : '';\n\n const stage1Specifier = toFileImportSpecifier(stage1Path);\n return `import { startFlow, wireConfig } from '${stage1Specifier}';\n\nconst __configData = ${dataPayload};\n\n(async () => {\n const config = wireConfig(__configData);${envBlock}\n const { collector, elb } = await startFlow(config);${assignmentCode}\n})();`;\n}\n\n/**\n * Generate a stage 2 entry file for wrapping an ALREADY-embedded skeleton.\n *\n * Unlike `generateWebEntry`, this variant imports `__configData` from the\n * skeleton (instead of inlining a `dataPayload` string). Used by the\n * publish-time `wrapSkeleton` helper, which runs on a stage 1 skeleton\n * produced via `bundle({ skipWrapper: true })` — those skeletons already\n * export `__configData` alongside `wireConfig` and `startFlow`.\n */\nexport function generateWrapEntry(\n stage1Path: string,\n options: {\n windowCollector?: string;\n windowElb?: string;\n previewOrigin?: string;\n previewScope?: string;\n /** Runtime platform. 'browser' emits env.window/env.document injection; 'node' omits it. Default 'browser' for backward compat. */\n platform?: 'browser' | 'node';\n } = {},\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 const hasPreview = !!(options.previewOrigin && options.previewScope);\n const previewOriginLiteral = JSON.stringify(options.previewOrigin ?? '');\n const previewScopeLiteral = JSON.stringify(options.previewScope ?? '');\n\n const preflightBlock = hasPreview\n ? `\n // --- Preview mode preflight ---\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n var __previewOrigin = ${previewOriginLiteral};\n var __previewScope = ${previewScopeLiteral};\n var __params = new URLSearchParams(location.search);\n var __tokens = __params.getAll('elbPreview');\n var __param = __tokens.length > 0 ? __tokens[__tokens.length - 1] : null;\n var __secure = location.protocol === 'https:' ? '; Secure' : '';\n\n if (__param === 'off') {\n document.cookie = 'elbPreview=; path=/; max-age=0; SameSite=Lax' + __secure;\n } else if (__param && /^[a-zA-Z0-9_-]{8,32}$/.test(__param)) {\n document.cookie = 'elbPreview=' + __param + '; path=/; max-age=604800; SameSite=Lax' + __secure;\n }\n\n var __match = /(?:^|; )elbPreview=([^;]+)/.exec(document.cookie);\n var __token = __match && __match[1];\n if (__token && /^[a-zA-Z0-9_-]{8,32}$/.test(__token)) {\n var __previewSrc = 'https://' + __previewOrigin + '/preview/' + __previewScope + '/walker.' + __token + '.js';\n var __clearPreviewCookie = function () {\n document.cookie = 'elbPreview=; path=/; max-age=0; SameSite=Lax' + __secure;\n };\n try {\n // Bound the HEAD probe so a hung CDN can never block the production\n // walker. On abort/timeout we fall through to the catch branch and\n // self-heal by clearing the cookie.\n var __ctrl = typeof AbortController !== 'undefined' ? new AbortController() : null;\n var __timeoutId = __ctrl ? setTimeout(function () { __ctrl.abort(); }, 2000) : null;\n var __probe = await fetch(__previewSrc, {\n method: 'HEAD',\n signal: __ctrl ? __ctrl.signal : undefined,\n });\n if (__timeoutId) clearTimeout(__timeoutId);\n if (__probe && __probe.ok) {\n var __s = document.createElement('script');\n __s.src = __previewSrc;\n document.head.appendChild(__s);\n return;\n }\n // Preview bundle missing (404/5xx) — self-heal by clearing cookie and\n // falling through to the production walker in this same bundle.\n __clearPreviewCookie();\n } catch (__err) {\n // Network error, timeout, or abort — fall through to production too.\n __clearPreviewCookie();\n }\n }\n }\n // --- End preview mode preflight ---\n`\n : '';\n\n const platform = options.platform ?? 'browser';\n const envBlock =\n platform === 'browser'\n ? `\n if (config.sources) {\n for (const key of Object.keys(config.sources)) {\n const source = config.sources[key];\n if (!source) continue;\n const env = source.env ?? (source.env = {});\n env.window = env.window ?? (typeof window !== 'undefined' ? window : undefined);\n env.document = env.document ?? (typeof document !== 'undefined' ? document : undefined);\n }\n }`\n : '';\n\n const stage1Specifier = toFileImportSpecifier(stage1Path);\n return `import { startFlow, wireConfig, __configData } from '${stage1Specifier}';\n\n(async () => {${preflightBlock}\n const config = wireConfig(__configData);${envBlock}\n const { collector, elb } = await startFlow(config);${assignmentCode}\n})();`;\n}\n\n/**\n * Generate a stage 2 entry file for wrapping a node skeleton.\n *\n * Mirrors `generateServerEntry` but imports `__configData` from the skeleton\n * instead of inlining it. Output is a default-export factory module matching\n * the runner contract at `runtime/load-bundle.ts:53-66`: `module.default` is\n * an async function that takes a context and returns\n * `{ collector, elb, httpHandler? }`.\n */\nexport function generateWrapEntryServer(stage1Path: string): string {\n const stage1Specifier = toFileImportSpecifier(stage1Path);\n return `import { startFlow, wireConfig, __configData } from '${stage1Specifier}';\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 * 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 * Named bundle targets with frozen presets.\n *\n * A target is the ONLY input callers should pass. All internal booleans\n * (skipWrapper, withDev, platform, env injection) derive from the preset.\n * This prevents the class of bug where the same boolean means different\n * things in different code paths (see: skipWrapper conflation, 2026-04-16).\n */\nexport type BundleTarget =\n | 'cdn' // Production browser IIFE served via CDN\n | 'cdn-skeleton' // ESM skeleton, wrapped later via wrapSkeleton → IIFE\n | 'runner' // Server skeleton for long-running Node flow runtime\n | 'simulate' // Skeleton for in-process simulate (needs /dev schemas)\n | 'push'; // Skeleton for in-process push (needs /dev schemas)\n\nexport interface TargetPreset {\n /** If true, emit ESM skeleton. If false, emit IIFE via generateWebEntry. */\n skipWrapper: boolean;\n /** If true, include @walkeros/*\\/dev imports for schema validation. */\n withDev: boolean;\n /** Runtime platform — controls env injection and Node/browser codegen. */\n platform: 'browser' | 'node';\n /**\n * If true, Stage 2 wrapper injects env.window/env.document into sources.\n * Only relevant for browser platform IIFE output.\n */\n injectEnv: boolean;\n}\n\nexport const BUNDLE_TARGETS: Readonly<\n Record<BundleTarget, Readonly<TargetPreset>>\n> = Object.freeze({\n cdn: Object.freeze({\n skipWrapper: false,\n withDev: false,\n platform: 'browser',\n injectEnv: true,\n }),\n 'cdn-skeleton': Object.freeze({\n skipWrapper: true,\n withDev: false,\n platform: 'browser',\n injectEnv: false,\n }),\n runner: Object.freeze({\n skipWrapper: true,\n withDev: false,\n platform: 'node',\n injectEnv: false,\n }),\n simulate: Object.freeze({\n skipWrapper: true,\n withDev: true,\n platform: 'node',\n injectEnv: false,\n }),\n push: Object.freeze({\n skipWrapper: true,\n withDev: true,\n platform: 'node',\n injectEnv: false,\n }),\n});\n\nexport function resolveTarget(target: BundleTarget): TargetPreset {\n const preset = BUNDLE_TARGETS[target];\n if (!preset) {\n throw new Error(\n `Unknown target: ${target}. Valid: ${Object.keys(BUNDLE_TARGETS).join(', ')}`,\n );\n }\n return preset;\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","/**\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 { 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 type { BundleTarget } from './targets.js';\nimport { resolveTarget } from './targets.js';\nimport { uploadBundleToUrl, sanitizeUrl } from './upload.js';\nimport { displayStats, createStatsSummary } from './stats.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}\n\n/**\n * Resolve -o path: if directory, use platform-default filename.\n *\n * When `flowSubdir` is provided (multi-flow `--all` mode), the output is\n * always treated as a directory and the flow name is inserted as a\n * subdirectory: `<output>/<flowSubdir>/<defaultFilename>`. This keeps each\n * flow's artifacts isolated from the others.\n *\n * Exported for unit tests.\n */\nexport function resolveOutputPath(\n output: string,\n buildOptions: BuildOptions,\n flowSubdir?: string,\n): string {\n const resolved = path.resolve(output);\n const filename =\n buildOptions.platform === 'browser' ? 'walker.js' : 'flow.mjs';\n if (flowSubdir) {\n return path.join(resolved, flowSubdir, filename);\n }\n const ext = path.extname(resolved);\n if (output.endsWith('/') || output.endsWith(path.sep) || !ext) {\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(\n options.output,\n buildOptions,\n options.all ? flowName : undefined,\n );\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 // Hint for interactive terminals\n if (process.stdout.isTTY) {\n const defaultPath =\n buildOptions.platform === 'browser'\n ? './dist/walker.js'\n : './dist/flow.mjs';\n logger.info(\n `Bundle written to stdout. Use -o ${defaultPath} to write to file.`,\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.Json) 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.Json config object\n * await bundle({\n * version: 4,\n * flows: {\n * default: {\n * config: {\n * platform: 'web',\n * bundle: { packages: { '@walkeros/collector': { imports: ['startFlow'] } } },\n * },\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 /**\n * Named bundle target. If omitted, falls back to\n * `buildOverrides.skipWrapper` mapping (deprecated) or `'cdn'`.\n */\n target?: BundleTarget;\n buildOverrides?: Partial<BuildOptions>;\n } = {},\n): Promise<import('./bundler').BundleStats | void> {\n // Resolve effective target: explicit target > legacy skipWrapper mapping > default 'cdn'.\n let effectiveTarget: BundleTarget;\n if (options.target) {\n effectiveTarget = options.target;\n } else if (options.buildOverrides?.skipWrapper === true) {\n // Conservative mapping: preserves /dev inclusion for existing callers that\n // historically used skipWrapper to get schemas (push/simulate shape).\n effectiveTarget = 'simulate';\n } else {\n effectiveTarget = 'cdn';\n }\n\n const preset = resolveTarget(effectiveTarget);\n\n // Deprecation warning for legacy skipWrapper usage without explicit target.\n if (\n options.buildOverrides?.skipWrapper !== undefined &&\n !options.target &&\n process.env.WALKEROS_SUPPRESS_DEPRECATIONS !== '1'\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n '[@walkeros/cli] buildOverrides.skipWrapper is deprecated. ' +\n \"Pass `target: 'cdn' | 'cdn-skeleton' | 'runner' | 'simulate' | 'push'` instead. \" +\n 'Set WALKEROS_SUPPRESS_DEPRECATIONS=1 to silence this warning.',\n );\n }\n\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.Json format.\n // Merge target-derived flags into buildOverrides so loadBundleConfig sees them.\n const mergedOverrides: Partial<BuildOptions> = {\n ...(options.buildOverrides ?? {}),\n skipWrapper: preset.skipWrapper,\n withDev: preset.withDev,\n };\n const { flowSettings, buildOptions } = loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flowName,\n buildOverrides: mergedOverrides,\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","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, 'flow.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, 'flow.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, 'flow.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","declare module '@walkeros/core' {\n interface SourceMap {\n cli: { type: 'cli'; platform: 'terminal'; command?: string };\n }\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 {\n loginCommand,\n requestDeviceCode,\n pollForToken,\n} from './commands/login/index.js';\nexport type {\n DeviceCodeResult,\n DeviceCodeOptions,\n PollOptions,\n PollResult,\n} 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';\nexport {\n telemetryStatusCommand,\n telemetryEnableCommand,\n telemetryDisableCommand,\n} from './commands/telemetry/index.js';\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle } from './commands/bundle/index.js';\nexport { wrapSkeleton } from './commands/bundle/wrap.js';\nexport type { WrapSkeletonOptions } from './commands/bundle/wrap.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 setClientContext,\n getClientContext,\n resetClientContext,\n clientContextHeaders,\n} from './core/client-context.js';\nexport type { ClientType, ClientContext } from './core/client-context.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 listAllFlows,\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 deleteDeploymentByFlowId,\n DeploymentAmbiguityError,\n} from './commands/deployments/index.js';\nexport type { DeploymentSummaryForFlow } from './commands/deployments/index.js';\nexport {\n listPreviews,\n getPreview,\n createPreview,\n deletePreview,\n} from './commands/previews/index.js';\nexport type {\n ListPreviewsOptions,\n GetPreviewOptions,\n CreatePreviewOptions,\n DeletePreviewOptions,\n} from './commands/previews/index.js';\nexport type { FeedbackOptions } from './commands/feedback/index.js';\nexport {\n readConfig,\n writeConfig,\n deleteConfig,\n resolveToken,\n setDefaultProject,\n getDefaultProject,\n setFeedbackPreference,\n getFeedbackPreference,\n} from './lib/config-file.js';\nexport type { WalkerOSConfig } from './lib/config-file.js';\nexport type { ListFlowsOptions, ProjectFlows } 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// === Telemetry ===\nexport * as telemetry from './telemetry/index.js';\n\n// === Types ===\n// Export types for programmatic usage\n// Config structure uses Flow.Json (root) and Flow (single flow) 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 { PrepareInput, PreparedFlow } from './commands/push/prepare.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 writeResult,\n type Platform,\n} from '../../core/index.js';\n\nimport type { Flow, Logger, WalkerOS } from '@walkeros/core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadFlowConfig, loadJsonConfig } 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 { withFlowContext } from './flow-context.js';\nimport { prepareFlow } from './prepare.js';\nimport { schemas } from '@walkeros/core/dev';\nimport { runPushCommand } from './run.js';\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 *\n * Thin wrapper around `runPushCommand`: delegates result production to the\n * pure helper, then formats output and decides the exit code. Tests target\n * `runPushCommand` directly to avoid `process.exit` killing Jest workers.\n */\nexport async function pushCommand(options: PushCommandOptions): Promise<void> {\n const result = await runPushCommand(options);\n const duration = result.duration;\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}\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({ mock: options.mock }, flowSettings);\n\n // Bundle to temp file (env loading moved to __devExports in the bundle)\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, 'flow.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, 'flow.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 {\n esmPath,\n platform,\n logger,\n snapshotCode,\n timeout,\n networkCalls,\n asyncDrain: { timeout: 5000 },\n // Real push (non-simulate) needs the pump so destinations whose init\n // awaits a captured setTimeout (e.g., amplitude engagement plugin)\n // don't deadlock. Simulate routes use their own withFlowContext call\n // sites without `drainPump`, preserving snapshot ordering.\n drainPump: true,\n },\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 bundlePath?: 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 configOrPath: string | Flow.Json,\n input: unknown,\n options: SimulateSourceOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n // Resolve config: accept either file path or config object\n let config: Flow.Json;\n if (typeof configOrPath === 'string') {\n config = (await loadJsonConfig(configOrPath)) as Flow.Json;\n } else {\n config = configOrPath;\n }\n\n const prepareInput = options.bundlePath\n ? {\n mode: 'prebuilt' as const,\n bundlePath: options.bundlePath,\n config,\n flow: options.flow,\n simulate: ['source.' + options.sourceId],\n silent: options.silent,\n verbose: options.verbose,\n }\n : {\n mode: 'build' as const,\n config,\n flow: options.flow,\n simulate: ['source.' + options.sourceId],\n silent: options.silent,\n verbose: options.verbose,\n };\n\n const prepared = await prepareFlow(prepareInput);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n });\n\n // Resolve source package name (needed for __devExports lookup inside context)\n const sourceConfig = (prepared.flowSettings.sources ?? {})[\n options.sourceId\n ] as { package?: string } | undefined;\n\n if (!sourceConfig?.package) {\n throw new Error(`Source \"${options.sourceId}\" has no package defined`);\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 // Look up createTrigger from __devExports (bundled /dev export)\n const devExports = module.__devExports?.[sourceConfig!.package!] as\n | { examples?: { createTrigger?: Function } }\n | undefined;\n const createTrigger = devExports?.examples?.createTrigger;\n if (!createTrigger) {\n throw new Error(\n `Source package \"${sourceConfig!.package}\" has no createTrigger in /dev export`,\n );\n }\n\n const flowConfig = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(flowConfig, 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 flowConfig.hooks = {\n ...((flowConfig.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(flowConfig, {\n sourceId: options.sourceId,\n });\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 bundlePath?: 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 configOrPath: string | Flow.Json,\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 // Resolve config: accept either file path or config object\n let config: Flow.Json;\n if (typeof configOrPath === 'string') {\n config = (await loadJsonConfig(configOrPath)) as Flow.Json;\n } else {\n config = configOrPath;\n }\n\n const prepareInput = options.bundlePath\n ? {\n mode: 'prebuilt' as const,\n bundlePath: options.bundlePath,\n config,\n flow: options.flow,\n simulate: ['transformer.' + options.transformerId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n }\n : {\n mode: 'build' as const,\n config,\n flow: options.flow,\n simulate: ['transformer.' + options.transformerId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n };\n\n const prepared = await prepareFlow(prepareInput);\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 flowConfig = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(flowConfig, prepared.overrides);\n\n // Don't initialize sources or destinations during transformer simulation.\n if (flowConfig.sources) flowConfig.sources = {};\n if (flowConfig.destinations) flowConfig.destinations = {};\n\n const result = await module.startFlow(flowConfig);\n if (!result?.collector)\n throw new Error('Invalid bundle: collector not available');\n\n const collector = result.collector;\n const transformer = 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 bundlePath?: 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 configOrPath: string | Flow.Json,\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 // Resolve config: accept either file path or config object\n let config: Flow.Json;\n if (typeof configOrPath === 'string') {\n config = (await loadJsonConfig(configOrPath)) as Flow.Json;\n } else {\n config = configOrPath;\n }\n\n const prepareInput = options.bundlePath\n ? {\n mode: 'prebuilt' as const,\n bundlePath: options.bundlePath,\n config,\n flow: options.flow,\n simulate: ['destination.' + options.destinationId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n }\n : {\n mode: 'build' as const,\n config,\n flow: options.flow,\n simulate: ['destination.' + options.destinationId],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n };\n\n const prepared = await prepareFlow(prepareInput);\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 flowConfig = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(flowConfig, prepared.overrides);\n\n // Read env from bundled __devExports\n const destPkg = (prepared.flowSettings.destinations ?? {})[\n options.destinationId\n ] as { package?: string } | undefined;\n let trackedCalls: Array<{\n fn: string;\n args: unknown[];\n ts: number;\n }> = [];\n\n if (destPkg?.package) {\n const devExports = module.__devExports?.[destPkg.package] as\n | {\n examples?: {\n env?: {\n push?: Record<string, unknown>;\n simulation?: string[];\n };\n };\n }\n | undefined;\n const devEnv = devExports?.examples?.env;\n\n if (devEnv?.push) {\n const destinations = flowConfig.destinations as Record<\n string,\n { config?: { env?: Record<string, unknown> } }\n >;\n const destConfig = destinations[options.destinationId]?.config;\n if (destConfig) {\n destConfig.env = devEnv.push;\n }\n\n if (devEnv.simulation?.length) {\n const combined = {\n ...devEnv.push,\n simulation: devEnv.simulation,\n };\n const { wrappedEnv, calls } = wrapEnv(combined);\n if (destConfig) destConfig.env = wrappedEnv;\n trackedCalls = calls;\n }\n }\n }\n\n // Don't initialize sources — unnecessary overhead\n if (flowConfig.sources) flowConfig.sources = {};\n\n const result = await module.startFlow(flowConfig);\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';\nimport { parseComponentRef } from '../../core/parse-component-ref.js';\n\nconst STEP_KINDS = ['source', 'destination', 'transformer'] as const;\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,\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\nexport interface 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 */\nexport function parseStep(step: string): ParsedStep {\n // Shared `<prefix>.<name>` parsing lives in core/parse-component-ref.\n // We layer the chain-aware logic (destination.NAME.before.TRANSFORMER) on top.\n const { prefix, name, rest } = parseComponentRef(step, {\n allowed: STEP_KINDS,\n messages: {\n invalidFormat: (input) =>\n `Invalid step format: \"${input}\". Expected \"source.NAME\" or \"destination.NAME\"`,\n invalidPrefix: (p) =>\n `Unsupported step type: \"${p}\". Use \"source\", \"destination\", or \"transformer\"`,\n missingName: (input, p) =>\n `Invalid step format: \"${input}\". Missing name after \"${p}.\"`,\n },\n });\n\n // Path-specific: destination.ga4.before.redact\n if (rest.length >= 2) {\n const chainType = rest[0];\n if (chainType !== 'before' && chainType !== 'next') {\n throw new Error(\n `Invalid chain type: \"${chainType}\". Use \"before\" or \"next\"`,\n );\n }\n const transformerId = rest[1];\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 (rest.length === 1) {\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 // Both push and simulate need a running collector by default.\n // Collector settings are spread onto the root config (not nested),\n // so `run` is a top-level key when the flow declares collector.run.\n config.run = true;\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';\nimport { startDrainPump } from './async-drain-pump.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 * Run the async-drain pump alongside `fn` to fire captured timers\n * immediately. Required for non-simulate web pushes whose destinations\n * await real timers during init (e.g., amplitude engagement plugin\n * awaiting a 10s setTimeout for CDN script load).\n *\n * Defaults to false to preserve `--simulate` snapshot ordering. The\n * dispatcher in `run.ts` sets this to true ONLY for the `'none'` route\n * (real `walkeros push`).\n */\n drainPump?: boolean;\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 __devExports?: Record<string, 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 {\n esmPath,\n platform,\n logger,\n snapshotCode,\n timeout,\n networkCalls,\n asyncDrain,\n drainPump,\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:\n 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. Node runtime import() accepts\n // file:// URLs; for paths embedded into source for esbuild bundling\n // use core/import-specifier.ts instead (esbuild rejects file://).\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 __devExports: module.__devExports,\n };\n\n // Execute step-specific logic\n if (timerControl) {\n // asyncDrain mode: no outer timeout (flush has its own wall-clock safety).\n // When drainPump is requested, fire captured timers alongside `fn` so\n // destinations awaiting an intercepted setTimeout during init don't\n // deadlock (see async-drain-pump.ts for context).\n const stopPump = drainPump ? startDrainPump(timerControl.pending) : null;\n let result: PushResult;\n try {\n result = await fn(flowModule);\n } finally {\n if (stopPump) stopPump();\n }\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\nexport interface 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 * The shared pending-timer map. Exposed so an external drain pump\n * (`async-drain-pump.ts`) can fire timers while `fn` is awaiting.\n * Mutating this map outside the pump is unsupported.\n */\n pending: Map<number, PendingTimer>;\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: typeof globalThis;\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 // Patches setTimeout/clearTimeout/setInterval/clearInterval on the target.\n // Uses Reflect to read/write properties dynamically. JSDOM's\n // `Window & typeof globalThis` is assignable to `typeof globalThis`.\n function patchTarget(target: typeof globalThis): void {\n targets.push({\n target,\n setTimeout: Reflect.get(target, 'setTimeout'),\n clearTimeout: Reflect.get(target, 'clearTimeout'),\n setInterval: Reflect.get(target, 'setInterval'),\n clearInterval: Reflect.get(target, 'clearInterval'),\n });\n\n const trackedSetTimeout = (\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, {\n id,\n callback,\n delay: delay ?? 0,\n type: 'timeout',\n args,\n cleared: false,\n });\n return id;\n };\n\n const trackedClear = (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 const trackedSetInterval = (\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, {\n id,\n callback,\n delay: delay ?? 0,\n type: 'interval',\n args,\n cleared: false,\n });\n return id;\n };\n\n Reflect.set(target, 'setTimeout', trackedSetTimeout);\n Reflect.set(target, 'clearTimeout', trackedClear);\n Reflect.set(target, 'setInterval', trackedSetInterval);\n Reflect.set(target, 'clearInterval', trackedClear);\n }\n\n // Patch globalThis (bare setTimeout in ESM bundles)\n patchTarget(globalThis);\n\n // Patch JSDOM window if provided and distinct\n if (options.domWindow && options.domWindow !== globalThis) {\n patchTarget(options.domWindow);\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 Reflect.set(saved.target, 'setTimeout', saved.setTimeout);\n Reflect.set(saved.target, 'clearTimeout', saved.clearTimeout);\n Reflect.set(saved.target, 'setInterval', saved.setInterval);\n Reflect.set(saved.target, 'clearInterval', saved.clearInterval);\n }\n pending.clear();\n }\n\n return { flush, countPending, restore, pending };\n}\n","import type { PendingTimer } from './async-drain.js';\n\nconst realSetImmediate = setImmediate;\n\nexport interface DrainPumpOptions {\n maxIterations?: number;\n maxWallMs?: number;\n}\n\nconst DEFAULT_MAX_ITERATIONS = 1000;\nconst DEFAULT_MAX_WALL_MS = 30_000;\n\nlet intervalRequeueCounter = -1;\n\n/**\n * Drain pump for the async-drain timer interception mechanism.\n *\n * The push command patches setTimeout/setInterval on globalThis + JSDOM\n * window to capture deferred work (see `async-drain.ts`). Without a pump,\n * captured timers only run after `fn(flowModule)` resolves (via flush()),\n * which deadlocks when a destination's init awaits one of those captured\n * timers (e.g., `@walkeros/web-destination-amplitude`'s engagement plugin\n * awaits a 10s setTimeout to give up on a CDN script load).\n *\n * This pump runs alongside `fn`, fires every non-cleared captured timer\n * on each tick (sorted by delay ascending to match `flush` ordering),\n * using REAL `setImmediate` saved at module load to avoid any patched\n * version. Re-registers `interval` timers after firing so periodic work\n * keeps cycling — same shape as flush()'s loop. Errors surface via\n * `console.warn` to match the flush contract.\n *\n * Two safety caps: maxIterations (re-pump count) and maxWallMs.\n * Defaults are generous (1000 iters, 30s) — typical destinations queue\n * 1-5 timers during init.\n *\n * Activate ONLY in non-simulate mode; --simulate routes use post-fn flush\n * so snapshot ordering remains stable.\n */\nexport function startDrainPump(\n pending: Map<number, PendingTimer>,\n options: DrainPumpOptions = {},\n): () => void {\n const maxIterations = options.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n const maxWallMs = options.maxWallMs ?? DEFAULT_MAX_WALL_MS;\n const start = Date.now();\n let running = true;\n let iterations = 0;\n\n const tick = (): void => {\n if (!running) return;\n if (iterations >= maxIterations) return;\n if (Date.now() - start > maxWallMs) return;\n\n if (pending.size === 0) {\n realSetImmediate(tick);\n return;\n }\n\n iterations += 1;\n\n const snapshot = [...pending.values()]\n .filter((t) => !t.cleared)\n .sort((a, b) => a.delay - b.delay);\n\n for (const timer of snapshot) {\n pending.delete(timer.id);\n try {\n timer.callback(...timer.args);\n } catch (err) {\n console.warn(`[async-drain] timer ${timer.id} threw during pump:`, err);\n }\n\n if (timer.type === 'interval' && !timer.cleared) {\n // Re-queue with a fresh id so a single-fire pump cycle catches it\n // again on the next tick. id space is module-scoped negative to\n // avoid colliding with the original setTimeout id counter.\n const requeued: PendingTimer = {\n ...timer,\n id: intervalRequeueCounter--,\n };\n pending.set(requeued.id, requeued);\n }\n }\n\n realSetImmediate(tick);\n };\n\n realSetImmediate(tick);\n\n return () => {\n running = false;\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { getPlatform, type Flow } from '@walkeros/core';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { loadBundleConfig } from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport { buildOverrides, type PushOverrides } from './overrides.js';\n\nexport type PrepareInput =\n | {\n mode: 'build';\n config: Flow.Json;\n flow?: string;\n simulate?: string[];\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n }\n | {\n mode: 'prebuilt';\n bundlePath: string;\n config: Flow.Json;\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;\n cleanup: () => Promise<void>;\n}\n\n/**\n * Shared preparation step: resolve config, build overrides, optionally bundle.\n *\n * Two modes:\n * - 'build': bundles the flow config to a temp ESM file (original behavior)\n * - 'prebuilt': uses an existing bundle path, skips bundling\n *\n * Both modes resolve flowSettings and overrides from the provided config object.\n */\nexport async function prepareFlow(input: PrepareInput): Promise<PreparedFlow> {\n const logger = createCLILogger({\n silent: input.silent,\n verbose: input.verbose,\n });\n\n // Resolve config to flowSettings + buildOptions\n logger.debug('Loading flow configuration');\n const { flowSettings, buildOptions } = loadBundleConfig(input.config, {\n configPath: process.cwd(),\n flowName: input.flow,\n });\n\n const platform = getPlatform(flowSettings);\n\n // Build overrides from --simulate/--mock flags\n const overrides = buildOverrides(\n { simulate: input.simulate, mock: input.mock },\n flowSettings,\n );\n\n if (input.mode === 'prebuilt') {\n // Prebuilt mode: return immediately with existing bundle, no cleanup needed\n return {\n bundlePath: input.bundlePath,\n platform,\n overrides,\n flowSettings,\n cleanup: async () => {},\n };\n }\n\n // Build mode: 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, 'flow.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 cleanup: async () => {\n await fs.remove(tempDir).catch(() => {});\n },\n };\n}\n","import { parseStep } from './overrides.js';\n\n/**\n * Route plan derived from raw `--simulate` flags. The dispatcher in\n * `index.ts` reads `kind` and either skips simulation (`none`), runs the\n * matching typed route once, or — for `destination` only — loops over\n * `ids` calling the typed route per id.\n *\n * Rules:\n * - Empty input → kind 'none'.\n * - Per-flag format must match `parseStep` (delegated, single source of truth).\n * - 4-part chain syntax (`destination.X.before.Y`) is `--mock`-only and rejected here.\n * - Mixed types in the same invocation throw.\n * - source.* and transformer.* simulate is single-target. Multiple flags throw.\n * - destination.* is multi-target. Duplicate ids are deduped.\n */\nexport type SimulatePlan =\n | { kind: 'none'; ids: [] }\n | { kind: 'source' | 'destination' | 'transformer'; ids: string[] };\n\nexport function planSimulate(flags: readonly string[]): SimulatePlan {\n if (flags.length === 0) return { kind: 'none', ids: [] };\n\n const parsed = flags.map((flag) => {\n const step = parseStep(flag);\n if (step.chainType) {\n throw new Error(\n `--simulate \"${flag}\": chain syntax (${step.type}.${step.name}.${step.chainType}.…) is not supported for --simulate. Use --mock for path-specific overrides.`,\n );\n }\n return step;\n });\n\n const types = new Set(parsed.map((p) => p.type));\n if (types.size > 1) {\n const sorted = [...types].sort();\n throw new Error(\n `Cannot --simulate ${sorted.join(' and ')} in the same invocation. Run separate commands for each step type.`,\n );\n }\n\n const [type] = types;\n const ids = [...new Set(parsed.map((p) => p.name))];\n\n if ((type === 'source' || type === 'transformer') && ids.length > 1) {\n throw new Error(\n `--simulate ${type}.* expects a single target; got ${ids.length}. Run one --simulate ${type}.NAME per invocation.`,\n );\n }\n\n return { kind: type, ids };\n}\n","import { planSimulate } from './plan-simulate.js';\n\nexport interface SimulateDispatch {\n route: 'none' | 'source' | 'destination' | 'transformer';\n ids: string[];\n}\n\n/**\n * Adapter between `planSimulate` and the dispatcher in `index.ts`.\n * Renames `kind` → `route` so the dispatcher's `switch` reads naturally.\n * Kept separate from planSimulate so parsing logic and call-site adaptation\n * can evolve independently.\n */\nexport function dispatchSimulate(flags: readonly string[]): SimulateDispatch {\n const plan = planSimulate(flags);\n return { route: plan.kind, ids: plan.ids };\n}\n","import {\n push,\n simulateDestination,\n simulateSource,\n simulateTransformer,\n} from './index.js';\nimport { dispatchSimulate } from './dispatch-simulate.js';\nimport {\n getErrorMessage,\n isStdinPiped,\n readStdinToTempFile,\n type Platform,\n} from '../../core/index.js';\nimport { loadJsonFromSource } from '../../config/index.js';\nimport type { WalkerOS } from '@walkeros/core';\nimport type { PushCommandOptions, PushResult } from './types.js';\n\n/**\n * Pure variant of `pushCommand` — produces a `PushResult` and never calls\n * `process.exit` or writes to stdout. The CLI wrapper in `index.ts` adds\n * formatting and exit codes on top.\n *\n * Validates `--simulate` flags upfront via `dispatchSimulate` so a malformed\n * flag fails fast (no wasted bundle). Routes to the correct typed function:\n * - `none` → `push()`\n * - `source` → `simulateSource()` (single id; multi rejected by dispatcher)\n * - `transformer` → `simulateTransformer()` (single id)\n * - `destination` → `runDestinationSimulationLoop()` (multi-target loop)\n */\nexport async function runPushCommand(\n options: PushCommandOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // 1. Validate --simulate flags FIRST. Fail fast before bundling/IO.\n const plan = dispatchSimulate(options.simulate ?? []);\n\n // 2. Resolve config: stdin > argument > default (preserves prior behavior).\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 // 3. Resolve string event inputs (path/URL → JSON).\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 // 4. Route to the correct typed function based on the plan.\n let result: PushResult;\n switch (plan.route) {\n case 'none':\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 break;\n\n case 'source':\n result = await simulateSource(config, resolvedEvent, {\n sourceId: plan.ids[0],\n flow: options.flow,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n });\n break;\n\n case 'transformer':\n result = await simulateTransformer(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n transformerId: plan.ids[0],\n flow: options.flow,\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n },\n );\n break;\n\n case 'destination':\n result = await runDestinationSimulationLoop(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n plan.ids,\n options,\n );\n break;\n }\n\n return result;\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Run `simulateDestination` once per destination id and aggregate into a\n * single `PushResult`. Stops on the first failure and returns a structured\n * error referencing the failed id; per-destination results are preserved\n * under `perDestination` for downstream inspection.\n */\nasync function runDestinationSimulationLoop(\n config: string,\n event: WalkerOS.DeepPartialEvent,\n destinationIds: string[],\n options: PushCommandOptions,\n): Promise<PushResult> {\n const startTime = Date.now();\n const perDestination: Record<string, PushResult> = {};\n\n for (const destinationId of destinationIds) {\n const r = await simulateDestination(config, event, {\n destinationId,\n flow: options.flow,\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n snapshot: options.snapshot,\n });\n perDestination[destinationId] = r;\n if (!r.success) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: `simulate destination.${destinationId}: ${r.error ?? 'unknown error'}`,\n perDestination,\n };\n }\n }\n\n return {\n success: true,\n duration: Date.now() - startTime,\n perDestination,\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/flow.mjs';\n return '/tmp/walkeros-flow.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';\nimport { throwIfRunnerAuthFailure } from './runner-auth-error.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 // Classify 401/403 (RunnerAuthError with typed reason).\n await throwIfRunnerAuthFailure(response);\n\n if (!response.ok) {\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 * Classified runner-auth error. Thrown by runtime fetchers on 401/403 so\n * the runner can log `runner_auth_forbidden scope=... flow=... deployment=...`\n * in a structured way and, where appropriate, exit cleanly rather than retry.\n *\n * `reason`:\n * - `'unauthorised'` — token missing, expired, or revoked (401)\n * - `'flow'` — token is not bound to this flow (403 FORBIDDEN_FLOW)\n * - `'scope'` — token lacks the required scope (403 FORBIDDEN_SCOPE)\n * - `'forbidden'` — 403 with no recognised error code\n */\nexport type RunnerAuthReason = 'unauthorised' | 'flow' | 'scope' | 'forbidden';\n\nexport class RunnerAuthError extends Error {\n constructor(\n public readonly status: number,\n public readonly reason: RunnerAuthReason,\n public readonly code: string | null,\n message: string,\n ) {\n super(message);\n this.name = 'RunnerAuthError';\n }\n}\n\ninterface AppErrorBody {\n error?: { code?: unknown; message?: unknown };\n}\n\nfunction isAppErrorBody(value: unknown): value is AppErrorBody {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: unknown }).error === 'object'\n );\n}\n\n/**\n * If the response is a 401 or 403 from the app, parse `{error: {code, message}}`\n * and throw a typed RunnerAuthError. For any other non-ok status the caller\n * handles errors as before.\n */\nexport async function throwIfRunnerAuthFailure(res: Response): Promise<void> {\n if (res.status !== 401 && res.status !== 403) return;\n\n let code: string | null = null;\n let message: string = res.statusText;\n\n try {\n const body: unknown = await res.clone().json();\n if (isAppErrorBody(body) && body.error) {\n if (typeof body.error.code === 'string') code = body.error.code;\n if (typeof body.error.message === 'string') message = body.error.message;\n }\n } catch {\n // Body not JSON — keep statusText as message.\n }\n\n const reason: RunnerAuthReason =\n res.status === 401\n ? 'unauthorised'\n : code === 'FORBIDDEN_FLOW'\n ? 'flow'\n : code === 'FORBIDDEN_SCOPE'\n ? 'scope'\n : 'forbidden';\n\n throw new RunnerAuthError(res.status, reason, code, message);\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 // Node's runtime import() accepts file:// URLs per ESM spec. This is\n // distinct from paths emitted into source for esbuild bundling — for\n // that, use core/import-specifier.ts (esbuild does not 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';\nimport { throwIfRunnerAuthFailure } from './runner-auth-error.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 (500, etc.).\n * Auth failures (401/403) are thrown as RunnerAuthError instead.\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 // Classify 401/403 with the app's error code (FORBIDDEN_FLOW, FORBIDDEN_SCOPE).\n await throwIfRunnerAuthFailure(res);\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 '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 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 { getFlowSettings, isObject } 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\n/**\n * Type guard for a parsed Flow.Json shape (after schema validation).\n * Used only in soft-resolve so we can call core's resolver without casts.\n */\nfunction isFlowJson(value: unknown): value is Flow.Json {\n if (!isObject(value)) return false;\n if (!('version' in value) || !('flows' in value)) return false;\n return isObject(value.flows);\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: Record<string, unknown> = isObject(input) ? input : {};\n const flowsValue = config.flows;\n const flows: Record<string, unknown> | undefined = isObject(flowsValue)\n ? flowsValue\n : undefined;\n if (flows && 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) {\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 (per-flow config.bundle.packages)\n let totalPackageCount = 0;\n if (flows) {\n for (const [flowName, flowValue] of Object.entries(flows)) {\n if (!isObject(flowValue)) continue;\n const flowConfig = flowValue.config;\n if (!isObject(flowConfig)) continue;\n const bundle = flowConfig.bundle;\n if (!isObject(bundle)) continue;\n const packages = bundle.packages;\n if (!isObject(packages)) continue;\n\n for (const [pkgName, pkgConfigValue] of Object.entries(packages)) {\n if (!isObject(pkgConfigValue)) continue;\n if (!pkgConfigValue.version && !pkgConfigValue.path) {\n warnings.push({\n path: `flows.${flowName}.config.bundle.packages.${pkgName}`,\n message: `Package \"${pkgName}\" has no version specified`,\n suggestion: 'Consider specifying a version for reproducible builds',\n });\n }\n }\n totalPackageCount += Object.keys(packages).length;\n }\n }\n if (totalPackageCount > 0) {\n details.packageCount = totalPackageCount;\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 (typed Flow.Json shape)\n if (errors.length === 0 && isFlowJson(input)) {\n const typedFlows: Record<string, Flow> = input.flows;\n const flowNames = Object.keys(typedFlows);\n const flowsToCheck = options.flow ? [options.flow] : flowNames;\n\n let totalConnections = 0;\n for (const name of flowsToCheck) {\n const flowSettings = typedFlows[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 = input.contract;\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 = typedFlows[name];\n if (!flowSettings) continue;\n\n for (const [destName, dest] of Object.entries(\n flowSettings.destinations || {},\n )) {\n if (!isObject(dest.config)) continue;\n const mapping = dest.config.mapping;\n if (!isObject(mapping)) 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 // 11. Soft-resolve $flow refs to surface warnings (does NOT throw on missing\n // keys / unknown flows; cycles still throw and become errors).\n if (errors.length === 0 && isFlowJson(input)) {\n const flowsMap = input.flows;\n const flowsToResolve = options.flow\n ? options.flow in flowsMap\n ? [options.flow]\n : []\n : Object.keys(flowsMap);\n\n for (const name of flowsToResolve) {\n try {\n getFlowSettings(input, name, {\n deferred: true, // don't fail on missing $env when validating\n strictFlowRefs: false,\n onWarning: (message) => {\n warnings.push({ path: `flows.${name}`, message });\n },\n });\n } catch (err) {\n // Only surface CYCLES as errors here; other resolver failures (missing\n // $var / etc.) are already reported by the schema/reference checker\n // above and should not double-fail this pass.\n const message = err instanceof Error ? err.message : String(err);\n if (/Cyclic \\$flow reference/.test(message)) {\n errors.push({\n path: `flows.${name}`,\n message,\n code: 'FLOW_CYCLE',\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): 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.length > 0)\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,\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 // Walk every named contract rule and look in its events map.\n // First match (entity exact or wildcard, action exact or wildcard) wins.\n let matched = false;\n for (const rule of Object.values(contract)) {\n const events = rule.events;\n if (!events) continue;\n\n const entityActions = events[event.entity] || events['*'];\n if (!entityActions) continue;\n\n const actionSchema = entityActions[event.action] || entityActions['*'];\n if (actionSchema) {\n matched = true;\n break;\n }\n }\n\n if (matched) {\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\n// __VERSION__ is replaced at build time by tsup's `define` (see tsup.config.ts).\n// In tests, it's set as a global by the shared jest config (@walkeros/config/jest).\ndeclare const __VERSION__: string;\n\nconst CLIENT_HEADER = 'walkeros-cli/' + __VERSION__;\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 client: CLIENT_HEADER,\n });\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 { z } from 'zod';\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\n/**\n * Zod schema for the device-code response from `POST /api/auth/device/code`.\n * Validates the trust boundary between the auth server and the CLI so a\n * malformed response cannot propagate `undefined` into the browser-opener\n * or subsequent token polling.\n */\nconst DeviceCodeResponseSchema = z.object({\n deviceCode: z.string().min(1),\n userCode: z.string().min(1),\n verificationUri: z.string().min(1),\n verificationUriComplete: z.string().optional(),\n // Server protocol allows 0 for both (e.g. fast retry / already expired).\n expiresIn: z.number().int().nonnegative(),\n interval: z.number().int().nonnegative(),\n});\n\n/**\n * Zod schema for the token response from `POST /api/auth/device/token` on 2xx.\n * Validates that the token and email are both present and are strings before\n * writing them to the on-disk config.\n */\nconst TokenResponseSchema = z.object({\n token: z.string().min(1),\n email: z.string().min(1),\n});\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\nexport interface DeviceCodeResult {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete?: string;\n expiresIn: number;\n interval: number;\n}\n\nexport interface DeviceCodeOptions {\n url?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface PollOptions {\n url?: string;\n fetch?: typeof globalThis.fetch;\n /** Timeout in milliseconds. Defaults to 60000 (60s). */\n timeoutMs?: number;\n /** Poll interval in milliseconds. Defaults to 5000. */\n intervalMs?: number;\n}\n\nexport type PollResult =\n | {\n success: true;\n status: 'authenticated';\n email: string;\n configPath: string;\n }\n | { success: false; status: 'pending' }\n | { success: false; status: 'error'; error: string };\n\nconst POLL_TIMEOUT_BUFFER_MS = 5000;\nconst DEFAULT_POLL_TIMEOUT_MS = 60000;\nconst DEFAULT_POLL_INTERVAL_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\n/**\n * Request a device code from the auth server.\n * First step of the device code flow — returns data needed to show\n * the user a code and URL, then poll for the token.\n */\nexport async function requestDeviceCode(\n options: DeviceCodeOptions = {},\n): Promise<DeviceCodeResult> {\n const appUrl = options.url || resolveAppUrl();\n const f = options.fetch ?? globalThis.fetch;\n\n const response = await f(`${appUrl}/api/auth/device/code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n throw new Error('Failed to request device code');\n }\n\n let raw: unknown;\n try {\n raw = await response.json();\n } catch {\n throw new Error('Malformed device code response');\n }\n\n const parsed = DeviceCodeResponseSchema.safeParse(raw);\n if (!parsed.success) {\n throw new Error('Malformed device code response');\n }\n\n return {\n deviceCode: parsed.data.deviceCode,\n userCode: parsed.data.userCode,\n verificationUri: parsed.data.verificationUri,\n verificationUriComplete: parsed.data.verificationUriComplete,\n expiresIn: parsed.data.expiresIn,\n interval: parsed.data.interval,\n };\n}\n\n/**\n * Poll the auth server until the device code is authorized, times out, or fails.\n * Second step of the device code flow.\n *\n * On success: writes config and returns authenticated result.\n * On timeout: returns pending (NOT an error — caller can retry).\n * On real error (denied, expired): returns error result.\n *\n * In-flight fetch requests are bounded by the remaining time to the deadline\n * via AbortController, so a hanging fetch cannot exceed the configured timeout.\n * Malformed JSON responses return an error result instead of throwing.\n */\nexport async function pollForToken(\n deviceCode: string,\n options: PollOptions = {},\n): Promise<PollResult> {\n const appUrl = options.url || resolveAppUrl();\n const f = options.fetch ?? globalThis.fetch;\n const timeoutMs = options.timeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n let intervalMs = options.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalMs));\n\n // Check if we've exceeded the deadline after sleeping\n if (Date.now() >= deadline) break;\n\n const remaining = Math.max(1, deadline - Date.now());\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), remaining);\n\n let tokenResponse: Response;\n try {\n 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 signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timeoutHandle);\n if (err instanceof Error && err.name === 'AbortError') {\n // Aborted by our deadline — fall through to the pending return below\n break;\n }\n throw err;\n } finally {\n clearTimeout(timeoutHandle);\n }\n\n const data = await safeJsonParse(tokenResponse);\n if (data === MALFORMED) {\n return {\n success: false,\n status: 'error',\n error: 'Server returned malformed response',\n };\n }\n\n if (tokenResponse.ok) {\n // ok=true but no token and no error field — treat as pending and continue.\n // Only try to validate as a token response if a `token` key is present.\n if (data.token === undefined) {\n continue;\n }\n const tokenParsed = TokenResponseSchema.safeParse(data);\n if (!tokenParsed.success) {\n return {\n success: false,\n status: 'error',\n error: 'Server returned malformed token response',\n };\n }\n const { token, email } = tokenParsed.data;\n writeConfig({ token, email, appUrl });\n const configPath = getConfigPath();\n return {\n success: true,\n status: 'authenticated',\n email,\n configPath,\n };\n }\n\n if (data.error === 'authorization_pending') continue;\n if (data.error === 'slow_down') {\n intervalMs += 5000;\n continue;\n }\n\n // Any other error: expired, denied, etc.\n const errField: unknown = data.error;\n let errorMsg: string;\n if (typeof errField === 'string') {\n errorMsg = errField;\n } else if (\n errField &&\n typeof errField === 'object' &&\n 'message' in errField &&\n typeof (errField as { message: unknown }).message === 'string'\n ) {\n errorMsg = (errField as { message: string }).message;\n } else {\n errorMsg = 'Authorization failed';\n }\n return { success: false, status: 'error', error: errorMsg };\n }\n\n return { success: false, status: 'pending' };\n}\n\nconst MALFORMED = Symbol('malformed-json');\n\nasync function safeJsonParse(\n response: Response,\n): Promise<Record<string, unknown> | typeof MALFORMED> {\n try {\n const parsed: unknown = await response.json();\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return MALFORMED;\n } catch {\n return MALFORMED;\n }\n}\n\nexport async function login(options: LoginOptions = {}): Promise<LoginResult> {\n const fetchOption = options.fetch ?? globalThis.fetch;\n const urlOption = options.url;\n\n // 1. Request device code\n let codeResult: DeviceCodeResult;\n try {\n codeResult = await requestDeviceCode({\n url: urlOption,\n fetch: fetchOption,\n });\n } catch {\n return { success: false, error: 'Failed to request device code' };\n }\n\n const {\n userCode,\n verificationUri,\n verificationUriComplete,\n expiresIn,\n interval,\n deviceCode,\n } = codeResult;\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 // Use expiresIn-based timeout (original behavior) with maxPollAttempts support\n const timeoutMs = expiresIn * 1000 + POLL_TIMEOUT_BUFFER_MS;\n const intervalMs = (interval ?? 5) * 1000;\n\n if (options.maxPollAttempts !== undefined) {\n // Legacy path: use attempt-based polling for backward compat with tests\n const appUrl = urlOption || resolveAppUrl();\n const f = fetchOption;\n let pollInterval = intervalMs;\n let attempts = 0;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline && attempts < options.maxPollAttempts) {\n attempts++;\n await new Promise((r) => setTimeout(r, pollInterval));\n\n const remaining = Math.max(1, deadline - Date.now());\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), remaining);\n\n let tokenResponse: Response;\n try {\n 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 signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timeoutHandle);\n if (err instanceof Error && err.name === 'AbortError') {\n break;\n }\n throw err;\n } finally {\n clearTimeout(timeoutHandle);\n }\n\n const data = await safeJsonParse(tokenResponse);\n if (data === MALFORMED) {\n return {\n success: false,\n error: 'Server returned malformed response',\n };\n }\n\n if (tokenResponse.ok) {\n if (data.token === undefined) {\n continue;\n }\n const tokenParsed = TokenResponseSchema.safeParse(data);\n if (!tokenParsed.success) {\n return {\n success: false,\n error: 'Server returned malformed token response',\n };\n }\n const { token, email } = tokenParsed.data;\n writeConfig({ token, email, appUrl });\n const configPath = getConfigPath();\n return { success: true, 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 const errField: unknown = data.error;\n const errorMsg =\n typeof errField === 'string' ? errField : 'Authorization failed';\n return { success: false, error: errorMsg };\n }\n\n return {\n success: false,\n error: 'Authorization timed out. Please try again.',\n };\n }\n\n // Standard path: delegate to pollForToken\n const pollResult = await pollForToken(deviceCode, {\n url: urlOption,\n fetch: fetchOption,\n timeoutMs,\n intervalMs,\n });\n\n if (pollResult.success) {\n return {\n success: true,\n email: pollResult.email,\n configPath: pollResult.configPath,\n };\n }\n\n if (pollResult.status === 'error') {\n return { success: false, error: pollResult.error };\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 createClient from 'openapi-fetch';\nimport type { paths } from '../types/api.gen.js';\nimport { getToken } from './auth.js';\nimport { resolveAppUrl } from '../lib/config-file.js';\nimport { clientContextHeaders } from './client-context.js';\n\nexport function createApiClient() {\n const token = getToken();\n if (!token) throw new Error('WALKEROS_TOKEN not set.');\n\n // Note: openapi-fetch fixes headers at createClient time. The CLI entry\n // point (and MCP boot path) call setClientContext before any API client is\n // constructed, so the client-context headers captured here are stable.\n return createClient<paths>({\n baseUrl: resolveAppUrl(),\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...clientContextHeaders(),\n },\n });\n}\n","export interface ApiErrorDetail {\n path: string;\n message: string;\n}\n\nexport interface ApiErrorOptions {\n code?: string;\n details?: ApiErrorDetail[];\n // Populated only for CLIENT_OUTDATED responses (HTTP 426).\n minVersion?: string;\n clientVersion?: string;\n client?: string;\n upgrade?: string;\n docs?: string;\n}\n\nexport class ApiError extends Error {\n code?: string;\n details?: ApiErrorDetail[];\n // Populated only for CLIENT_OUTDATED responses (HTTP 426).\n minVersion?: string;\n clientVersion?: string;\n client?: string;\n upgrade?: string;\n docs?: string;\n\n constructor(message: string, options?: ApiErrorOptions) {\n super(message);\n this.name = 'ApiError';\n this.code = options?.code;\n this.details = options?.details;\n this.minVersion = options?.minVersion;\n this.clientVersion = options?.clientVersion;\n this.client = options?.client;\n this.upgrade = options?.upgrade;\n this.docs = options?.docs;\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 *\n * For `code === 'CLIENT_OUTDATED'` (HTTP 426), also extracts the upgrade\n * metadata: `minVersion`, `clientVersion`, `client`, `upgrade`, `docs`.\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 const options: ApiErrorOptions = { code, details };\n if (code === 'CLIENT_OUTDATED') {\n options.minVersion = inner.minVersion as string | undefined;\n options.clientVersion = inner.clientVersion as string | undefined;\n options.client = inner.client as string | undefined;\n options.upgrade = inner.upgrade as string | undefined;\n options.docs = inner.docs as string | undefined;\n }\n throw new ApiError(message, options);\n }\n throw new ApiError(fallbackMessage);\n}\n\n/**\n * Pretty-print an error and exit. Recognises `ApiError` with\n * `code === 'CLIENT_OUTDATED'` as a dedicated upgrade-required path\n * (exit code 2), prints the upgrade and docs links, and otherwise\n * falls back to a generic error print with exit code 1.\n *\n * Designed to be used as a top-level handler (`process.on('uncaughtException', ...)`,\n * `program.parseAsync().catch(...)`) and as a drop-in replacement for\n * per-command `logger.error(msg); process.exit(1)` patterns.\n */\nexport function handleCliError(err: unknown): never {\n /* eslint-disable no-console */\n if (err instanceof ApiError && err.code === 'CLIENT_OUTDATED') {\n console.error(`\\n${err.message}\\n`);\n if (err.upgrade) console.error(` Upgrade: ${err.upgrade}`);\n if (err.docs) console.error(` Docs: ${err.docs}\\n`);\n process.exit(2);\n }\n const message = err instanceof Error ? err.message : String(err);\n console.error(message);\n process.exit(1);\n /* eslint-enable no-console */\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { handleCliError } from '../../core/api-error.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 handleCliError(error);\n }\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { handleCliError } from '../../core/api-error.js';\nimport { requireProjectId } from '../../core/auth.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 try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n handleCliError(error);\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 { handleCliError, throwApiError } from '../../core/api-error.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { writeResult } from '../../core/output.js';\nimport { isStdinPiped, readStdin } from '../../core/stdin.js';\nimport type { paths } from '../../types/api.gen.js';\nimport type { GlobalOptions } from '../../types/global.js';\nimport { listProjects } from '../projects/index.js';\n\n// === Types extracted from API spec ===\n\ntype FlowSummary =\n paths['/api/projects/{projectId}/flows']['get']['responses']['200']['content']['application/json']['flows'][number];\n\ntype Project =\n paths['/api/projects']['get']['responses']['200']['content']['application/json']['projects'][number];\n\nexport interface ProjectFlows {\n project: { id: Project['id']; name: Project['name'] };\n flows: FlowSummary[];\n}\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 listAllFlows(\n options?: Omit<ListFlowsOptions, 'projectId'>,\n): Promise<ProjectFlows[]> {\n const { projects } = await listProjects();\n const results: ProjectFlows[] = [];\n\n for (const project of projects) {\n const data = await listFlows({ ...options, projectId: project.id });\n results.push({\n project: { id: project.id, name: project.name },\n flows: data.flows,\n });\n }\n\n return results;\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 try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n handleCliError(error);\n }\n}\n\nexport async function listFlowsCommand(\n options: FlowsCommandOptions & {\n sort?: string;\n order?: string;\n includeDeleted?: boolean;\n },\n): Promise<void> {\n await handleResult(\n () =>\n listFlows({\n projectId: options.project,\n sort: options.sort as ListFlowsOptions['sort'],\n order: options.order as ListFlowsOptions['order'],\n includeDeleted: options.includeDeleted,\n }),\n options,\n );\n}\n\nexport async function getFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function createFlowCommand(\n name: string,\n options: FlowsCommandOptions & { content?: string },\n): Promise<void> {\n const content = options.content\n ? JSON.parse(options.content)\n : JSON.parse(await readFlowStdin());\n await handleResult(\n () => createFlow({ name, content, projectId: options.project }),\n options,\n );\n}\n\nexport async function updateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string; content?: string },\n): Promise<void> {\n const content = options.content ? JSON.parse(options.content) : undefined;\n await handleResult(\n () =>\n updateFlow({\n flowId,\n name: options.name,\n content,\n projectId: options.project,\n }),\n options,\n );\n}\n\nexport async function deleteFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function duplicateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string },\n): Promise<void> {\n await handleResult(\n () =>\n duplicateFlow({ flowId, name: options.name, projectId: options.project }),\n options,\n );\n}\n\nasync function readFlowStdin(): Promise<string> {\n if (!isStdinPiped()) {\n throw new Error('Content required: use --content or pipe via stdin');\n }\n return readStdin();\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport {\n ApiError,\n handleCliError,\n throwApiError,\n} 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 handleCliError(err);\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 handleCliError(err);\n }\n}\n","import { getPlatform } from '@walkeros/core';\nimport { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport { handleCliError, 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 flowId?: 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 if (options.flowId) params.set('flowId', options.flowId);\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\n/**\n * Summary of an active deployment returned by listDeployments, used when\n * disambiguating which deployment to operate on for a given flow.\n */\nexport interface DeploymentSummaryForFlow {\n slug: string;\n type: string;\n status: string;\n updatedAt: string;\n}\n\n/**\n * Error thrown by deleteDeploymentByFlowId and other flow-scoped helpers when\n * the flow has multiple active (non-deleted) deployments and the caller did\n * not disambiguate with an explicit slug.\n *\n * Callers (e.g. the MCP layer) can translate this into a structured error.\n * The CLI package does not depend on MCP helpers.\n */\nexport class DeploymentAmbiguityError extends Error {\n readonly code = 'MULTIPLE_DEPLOYMENTS';\n readonly details: DeploymentSummaryForFlow[];\n constructor(message: string, details: DeploymentSummaryForFlow[]) {\n super(message);\n this.name = 'DeploymentAmbiguityError';\n this.details = details;\n }\n}\n\n/**\n * Delete a deployment identified by flowId, optionally disambiguated by slug\n * when the flow has more than one active deployment. Throws\n * DeploymentAmbiguityError when the flow has >= 2 active deployments and no\n * slug is provided. Throws a plain Error when the flow has no matches or when\n * a provided slug does not belong to the flow.\n */\nexport async function deleteDeploymentByFlowId(options: {\n projectId?: string;\n flowId: string;\n slug?: string;\n}): Promise<unknown> {\n const { flowId, slug } = options;\n const projectId = options.projectId ?? requireProjectId();\n\n const listResp = (await listDeployments({ projectId, flowId })) as {\n deployments?: DeploymentSummaryForFlow[];\n };\n const matches = listResp.deployments ?? [];\n\n if (matches.length === 0) {\n throw new Error(`No deployments found for flow ${flowId}`);\n }\n\n if (slug !== undefined) {\n const hit = matches.find((m) => m.slug === slug);\n if (!hit) {\n throw new Error(`No deployment with slug ${slug} in flow ${flowId}`);\n }\n return deleteDeployment({ slug: hit.slug, projectId });\n }\n\n if (matches.length > 1) {\n throw new DeploymentAmbiguityError(\n `Flow ${flowId} has ${matches.length} active deployments; pass slug to disambiguate`,\n matches.map((m) => ({\n slug: m.slug,\n type: m.type,\n status: m.status,\n updatedAt: m.updatedAt,\n })),\n );\n }\n return deleteDeployment({ slug: matches[0].slug, projectId });\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 try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n handleCliError(error);\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 handleCliError(err);\n }\n}\n","import { createInterface } from 'readline';\nimport { readConfig, writeConfig } from '../../lib/config-file.js';\nimport { publicFetch } from '../../core/http.js';\nimport { handleCliError } from '../../core/api-error.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 handleCliError(error);\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 { readConfig, writeTelemetryOnlyConfig } from '../../lib/config-file.js';\nimport { createInstallationId } from '../../telemetry/install-id.js';\n\nfunction envOverrideReason(): string | undefined {\n if (process.env.DO_NOT_TRACK === '1' || process.env.DO_NOT_TRACK === 'true') {\n return 'DO_NOT_TRACK env var';\n }\n if (\n process.env.WALKEROS_TELEMETRY_DISABLED === '1' ||\n process.env.WALKEROS_TELEMETRY_DISABLED === 'true'\n ) {\n return 'WALKEROS_TELEMETRY_DISABLED env var';\n }\n return undefined;\n}\n\n/**\n * Report current telemetry state to stdout. Three possible outcomes:\n *\n * - Not yet chosen: config has no `telemetryEnabled` field.\n * - Enabled: `telemetryEnabled === true`.\n * - Disabled: `telemetryEnabled === false`, or forced off by an env var.\n */\nexport function telemetryStatusCommand(): void {\n const override = envOverrideReason();\n if (override) {\n process.stdout.write(\n `walkerOS telemetry: disabled (${override})\\n` +\n 'Unset the env var and run `walkeros telemetry status` to see the stored choice.\\n',\n );\n return;\n }\n\n const stored = readConfig()?.telemetryEnabled;\n if (stored === true) {\n process.stdout.write(\n 'walkerOS telemetry: enabled\\n' +\n 'Opt out any time with `walkeros telemetry disable`.\\n',\n );\n return;\n }\n if (stored === false) {\n process.stdout.write(\n 'walkerOS telemetry: disabled\\n' +\n 'Opt in any time with `walkeros telemetry enable`.\\n',\n );\n return;\n }\n process.stdout.write(\n 'walkerOS telemetry: not yet chosen (default: off)\\n' +\n 'Opt in with `walkeros telemetry enable`, or leave off, nothing is sent until you choose.\\n',\n );\n}\n\n/**\n * Persist explicit consent: `telemetryEnabled: true` plus a stable\n * installation UUID. `createInstallationId` is idempotent, re-enabling\n * preserves any existing UUID.\n */\nexport function telemetryEnableCommand(): void {\n const installationId = createInstallationId();\n writeTelemetryOnlyConfig({\n installationId,\n telemetryEnabled: true,\n });\n process.stdout.write(\n 'walkerOS telemetry enabled. Thank you for helping improve the tools.\\n' +\n 'Installation UUID: ' +\n installationId +\n '\\n',\n );\n}\n\n/**\n * Persist explicit refusal: `telemetryEnabled: false`. Does not create an\n * installation UUID, a disabled state has no need for a stable identifier.\n * Preserves any existing UUID (e.g. from a prior enable) so re-enabling\n * later keeps the same id.\n */\nexport function telemetryDisableCommand(): void {\n writeTelemetryOnlyConfig({ telemetryEnabled: false });\n process.stdout.write(\n 'walkerOS telemetry disabled. Nothing will be sent from this machine.\\n',\n );\n}\n","import { randomUUID } from 'crypto';\nimport { readConfig, writeTelemetryOnlyConfig } from '../lib/config-file.js';\n\n/**\n * Read the stored installation UUID if one exists. Never writes.\n *\n * Returns `undefined` when no config file exists or the config has no\n * `installationId` field, both mean the user has not opted in to telemetry\n * yet, so no persistent identifier has been created.\n */\nexport function getInstallationId(): string | undefined {\n return readConfig()?.installationId;\n}\n\n/**\n * Generate and persist an installation UUID if none exists yet, then return\n * it. Idempotent.\n *\n * This is the only function in the telemetry stack that may write an\n * installation identifier. Callers must only invoke it as part of an opt-in\n * action (the `walkeros telemetry enable` command). Any other caller is a\n * consent-before-write bug.\n */\nexport function createInstallationId(): string {\n const existing = readConfig()?.installationId;\n if (existing) return existing;\n const id = randomUUID();\n writeTelemetryOnlyConfig({ installationId: id });\n return id;\n}\n","/**\n * Publish-time wrap step.\n *\n * Takes a Stage 1 ESM skeleton produced via `bundle({ skipWrapper: true })`\n * and produces a wrapped output:\n * - `browser`: self-executing async IIFE that calls `wireConfig(__configData)`,\n * injects `env.window` / `env.document` into every source, then calls\n * `startFlow(config)` and optionally assigns the resulting collector/elb\n * onto `window`.\n * - `node`: ESM module whose default export is an async factory function\n * that the runtime container (see `runtime/load-bundle.ts:53-66`) calls\n * with a context to get back `{ collector, elb, httpHandler? }`.\n *\n * The skeleton must export `wireConfig`, `startFlow`, and `__configData`.\n * The skipWrapper branch of `bundleCore` already emits exactly that shape.\n */\n\nimport * as path from 'path';\nimport * as os from 'os';\nimport fs from 'fs-extra';\nimport * as esbuild from 'esbuild';\nimport {\n generateWrapEntry,\n generateWrapEntryServer,\n getNodeExternals,\n} from './bundler.js';\nimport type { MinifyOptions } from '../../types/bundle.js';\n\nexport interface WrapSkeletonOptions {\n /**\n * Absolute path to the Stage 1 skeleton ESM file. Must export\n * `wireConfig`, `startFlow`, and `__configData`.\n */\n skeletonPath: string;\n\n /** Target platform — controls which entry generator runs. */\n platform: 'browser' | 'node';\n\n /** Absolute path where the wrapped output will be written. */\n outputPath: string;\n\n /**\n * Browser-only: window property name for the collector.\n * When unset, no `window.*` assignment is emitted.\n */\n windowCollector?: string;\n\n /**\n * Browser-only: window property name for the elb function.\n * When unset, no `window.*` assignment is emitted.\n */\n windowElb?: string;\n\n /** Browser-only: CDN hostname for loading preview bundles. */\n previewOrigin?: string;\n /** Browser-only: project scope for preview URL isolation. */\n previewScope?: string;\n\n /**\n * esbuild target. @default 'es2018' for browser, 'node18' for node.\n */\n target?: string;\n\n /** Whether to minify the output. @default true */\n minify?: boolean;\n\n /** Fine-grained minification options, forwarded to esbuild. */\n minifyOptions?: MinifyOptions;\n}\n\nexport async function wrapSkeleton(\n options: WrapSkeletonOptions,\n): Promise<void> {\n const {\n skeletonPath,\n platform,\n outputPath,\n windowCollector,\n windowElb,\n target,\n minify = true,\n minifyOptions,\n } = options;\n\n if (\n options.previewScope &&\n !/^[a-zA-Z0-9_-]{1,64}$/.test(options.previewScope)\n ) {\n throw new Error(\n `Invalid previewScope \"${options.previewScope}\". Must match /^[a-zA-Z0-9_-]{1,64}$/.`,\n );\n }\n if (options.previewOrigin && !/^[a-z0-9.-]+$/.test(options.previewOrigin)) {\n throw new Error(\n `Invalid previewOrigin \"${options.previewOrigin}\". Must be a bare hostname matching /^[a-z0-9.-]+$/.`,\n );\n }\n\n if (!(await fs.pathExists(skeletonPath))) {\n throw new Error(`wrapSkeleton: skeleton not found at ${skeletonPath}`);\n }\n\n const absoluteSkeletonPath = path.resolve(skeletonPath);\n\n // Stage 2 entry imports from the skeleton via an absolute path.\n const entryText =\n platform === 'browser'\n ? generateWrapEntry(absoluteSkeletonPath, {\n ...(windowCollector ? { windowCollector } : {}),\n ...(windowElb ? { windowElb } : {}),\n ...(options.previewOrigin\n ? { previewOrigin: options.previewOrigin }\n : {}),\n ...(options.previewScope\n ? { previewScope: options.previewScope }\n : {}),\n platform,\n })\n : generateWrapEntryServer(absoluteSkeletonPath);\n\n // Write the entry to its own temp dir so the caller's outputPath isn't\n // polluted with intermediate files.\n const entryDir = await fs.mkdtemp(path.join(os.tmpdir(), 'walkeros-wrap-'));\n const entryPath = path.join(entryDir, 'flow.mjs');\n\n try {\n await fs.writeFile(entryPath, entryText);\n await fs.ensureDir(path.dirname(outputPath));\n\n const esbuildOptions: esbuild.BuildOptions = {\n entryPoints: [entryPath],\n bundle: true,\n format: 'esm',\n platform,\n outfile: outputPath,\n treeShaking: true,\n logLevel: 'error',\n minify,\n ...(minify && {\n minifyWhitespace: minifyOptions?.whitespace ?? true,\n minifyIdentifiers: minifyOptions?.identifiers ?? true,\n minifySyntax: minifyOptions?.syntax ?? true,\n legalComments: minifyOptions?.legalComments ?? 'none',\n charset: 'utf8' as const,\n }),\n };\n\n if (platform === 'browser') {\n esbuildOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n esbuildOptions.target = target ?? 'es2018';\n } else {\n // Match bundler.ts Stage 2 node config: externalize Node builtins,\n // prepend a createRequire banner so CommonJS deps keep working inside\n // an ESM wrapper.\n esbuildOptions.external = getNodeExternals();\n esbuildOptions.banner = {\n js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`,\n };\n esbuildOptions.target = target ?? 'node18';\n }\n\n await esbuild.build(esbuildOptions);\n } finally {\n await fs.remove(entryDir).catch(() => {});\n }\n}\n","import { requireProjectId } from '../../core/auth.js';\nimport { apiFetch } from '../../core/http.js';\nimport { throwApiError } from '../../core/api-error.js';\nimport { getFlow } from '../flows/index.js';\n\n// === Programmatic API ===\n\nexport interface ListPreviewsOptions {\n projectId?: string;\n flowId: string;\n}\n\nexport async function listPreviews(options: ListPreviewsOptions) {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiFetch(\n `/api/projects/${pid}/flows/${options.flowId}/previews`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to list previews');\n }\n return response.json();\n}\n\nexport interface GetPreviewOptions {\n projectId?: string;\n flowId: string;\n previewId: string;\n}\n\nexport async function getPreview(options: GetPreviewOptions) {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiFetch(\n `/api/projects/${pid}/flows/${options.flowId}/previews/${options.previewId}`,\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to get preview');\n }\n return response.json();\n}\n\nexport interface CreatePreviewOptions {\n projectId?: string;\n flowId: string;\n flowName?: string;\n flowSettingsId?: string;\n}\n\nexport async function createPreview(options: CreatePreviewOptions) {\n const pid = options.projectId ?? requireProjectId();\n\n let settingsId = options.flowSettingsId;\n if (!settingsId) {\n if (!options.flowName) {\n throw new Error('Either flowName or flowSettingsId is required');\n }\n // Resolve flow settings name → id (same pattern deploy uses)\n const flow = await getFlow({ projectId: pid, flowId: options.flowId });\n const settings = (\n flow as { settings?: Array<{ id: string; name: string }> }\n ).settings;\n const match = settings?.find((s) => s.name === options.flowName);\n if (!match) {\n throw new Error(\n `Flow settings named \"${options.flowName}\" not found on flow ${options.flowId}`,\n );\n }\n settingsId = match.id;\n }\n\n const response = await apiFetch(\n `/api/projects/${pid}/flows/${options.flowId}/previews`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ flowSettingsId: settingsId }),\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to create preview');\n }\n return response.json();\n}\n\nexport interface DeletePreviewOptions {\n projectId?: string;\n flowId: string;\n previewId: string;\n}\n\nexport async function deletePreview(options: DeletePreviewOptions) {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiFetch(\n `/api/projects/${pid}/flows/${options.flowId}/previews/${options.previewId}`,\n { method: 'DELETE' },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to delete preview');\n }\n // App returns 204 No Content on success; older surfaces may return JSON.\n if (response.status === 204) return null;\n return response.json().catch(() => null);\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,\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,\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,\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,\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","export { createEmitter } from './emitter.js';\nexport type { Emitter, EmitterOptions } from './emitter.js';\nexport { getInstallationId, createInstallationId } from './install-id.js';\nexport { isTelemetryEnabled, isDebugMode } from './consent.js';\nexport { getCiInfo } from './ci.js';\nexport type { CiInfo } from './ci.js';\n","import type { Collector, Elb, WalkerOS } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { destinationAPI } from '@walkeros/server-destination-api';\nimport { buildInitConfig } from './init-config.js';\nimport { getEnvironment } from './environment.js';\nimport { getInstallationId } from './install-id.js';\nimport { isTelemetryEnabled, isDebugMode } from './consent.js';\nimport { maybePrintFirstRunNotice } from './first-run-notice.js';\nimport { resolveAppUrl } from '../lib/config-file.js';\n\nconst SEND_TIMEOUT_MS = 1000;\n\nexport interface EmitterOptions {\n /** Caller supplies the v4 source verbatim (type, platform, etc). */\n source: WalkerOS.Source;\n packageVersion: string;\n session?: string;\n}\n\nexport interface Emitter {\n send(\n name: string,\n data: WalkerOS.Properties,\n timingMs?: number,\n sourceOverride?: Partial<WalkerOS.Source>,\n ): Promise<void>;\n}\n\n/**\n * Build the walkerOS telemetry emitter.\n *\n * Consent, debug, and first-run-notice are resolved up-front. When telemetry\n * is not enabled the returned `send` is a no-op that never initializes the\n * collector, never writes a config file, and never touches the network.\n *\n * In debug mode we synthesize the event shape that the collector would emit\n * and write it to stderr instead of starting a real collector. Keeps the\n * output deterministic and avoids paying for collector init when only\n * inspecting payloads.\n *\n * The production path lazily boots a collector on first `send`. The\n * `{ package, config }` shorthand produced by `buildInitConfig` is resolved\n * here into a real `{ code, config }` `Destination.Init<T>` by importing\n * `destinationAPI` from `@walkeros/server-destination-api`. This keeps\n * `init-config.ts` free of the server-destination runtime dependency while\n * centralizing the resolution in the one place that actually runs the flow.\n */\nexport async function createEmitter(opts: EmitterOptions): Promise<Emitter> {\n if (!isTelemetryEnabled()) {\n return {\n async send() {\n /* no-op */\n },\n };\n }\n\n const maybeDevice = getInstallationId();\n if (!maybeDevice) {\n // telemetryEnabled === true but no UUID: inconsistent config.\n // Stay silent rather than silently create one post-consent without an\n // explicit user action.\n return {\n async send() {\n /* no-op */\n },\n };\n }\n const device: string = maybeDevice;\n\n const debug = isDebugMode();\n const endpoint = resolveTelemetryEndpoint();\n if (!endpoint && !debug) {\n // No ingest URL configured. Consistent with the \"ship consent UX\n // without a backend\" contract: opted-in users produce no traffic in\n // v1. Debug mode still runs below because its sole purpose is\n // inspecting payloads locally.\n return {\n async send() {\n /* no-op */\n },\n };\n }\n\n // First-run notice is purely informational; suppress in debug mode so the\n // debug output stream stays predictable for tooling.\n if (!debug) maybePrintFirstRunNotice();\n\n const environment = getEnvironment();\n\n const baseSource: WalkerOS.Source = {\n ...opts.source,\n version: opts.packageVersion,\n };\n\n // Lazy collector init: only pay the cost on first send.\n let elbFn: Elb.Fn | null = null;\n async function ensureElb(): Promise<Elb.Fn> {\n if (elbFn) return elbFn;\n\n const telemetryConfig = buildInitConfig({\n installationId: device,\n session: opts.session,\n environment,\n endpoint: endpoint ?? '',\n });\n\n const collectorConfig: Collector.InitConfig = {\n consent: telemetryConfig.consent,\n user: telemetryConfig.user,\n destinations: {\n api: {\n code: destinationAPI,\n config: {\n settings: telemetryConfig.destinations.api.config,\n },\n },\n },\n };\n\n const { elb } = await startFlow(collectorConfig);\n elbFn = elb;\n return elbFn;\n }\n\n return {\n async send(name, data, timingMs = 0, sourceOverride) {\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name,\n data,\n timing: timingMs,\n source: { ...baseSource, ...sourceOverride },\n };\n\n if (debug) {\n const user: WalkerOS.User = {\n device,\n ...(opts.session ? { session: opts.session } : {}),\n os: environment.os,\n osVersion: environment.osVersion,\n language: environment.language,\n timezone: environment.timezone,\n node: environment.node,\n };\n const preview = {\n ...partialEvent,\n consent: { telemetry: true },\n user,\n };\n process.stderr.write(\n `[walkeros telemetry debug] ${JSON.stringify(preview)}\\n`,\n );\n return;\n }\n\n try {\n const elb = await ensureElb();\n await withTimeout(elb(partialEvent), SEND_TIMEOUT_MS);\n } catch {\n /* swallow: telemetry must never break the host process */\n }\n },\n };\n}\n\n/**\n * Resolve the telemetry ingest endpoint.\n *\n * Reuses `resolveAppUrl()` from `lib/config-file` so a single\n * `walkeros auth login` (which writes `appUrl` to the user config) wires\n * telemetry alongside auth. Order: env (`WALKEROS_APP_URL`) > user config\n * (`~/.config/walkeros/config.json:appUrl`) > undefined (telemetry no-ops).\n *\n * Hard-cut: `TELEMETRY_ENDPOINT` is no longer recognized.\n */\nexport function resolveTelemetryEndpoint(): string | undefined {\n const appUrl = resolveAppUrl();\n if (!appUrl) return undefined;\n return `${appUrl.replace(/\\/$/, '')}/api/telemetry`;\n}\n\nasync function withTimeout<T>(p: Promise<T>, ms: number): Promise<T> {\n return Promise.race<T>([\n p,\n new Promise<T>((_, reject) => {\n const t = setTimeout(() => reject(new Error('telemetry timeout')), ms);\n t.unref();\n }),\n ]);\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Environment } from './environment.js';\n\nexport interface InitConfigInput {\n installationId: string;\n session?: string;\n environment: Environment;\n endpoint: string;\n}\n\n/**\n * Telemetry destination reference using the flow-style package shorthand.\n *\n * @remarks\n * Intentionally narrower than `Destination.Init<T>` from `@walkeros/core`.\n * The telemetry emitter is responsible for resolving the `package` reference\n * into the actual destination `code` before handing the config to\n * `startFlow()`. Keeping the shorthand in the builder keeps this file free\n * of a runtime dependency on `@walkeros/server-destination-api`.\n */\nexport interface TelemetryDestinationReference {\n package: string;\n config: {\n url: string;\n };\n}\n\n/**\n * Telemetry-specific init config shape.\n *\n * @remarks\n * Mirrors the subset of `Collector.InitConfig` the telemetry emitter uses\n * (`consent`, `user`, `destinations`). The `destinations` entries use the\n * package-shorthand form rather than `Destination.InitDestinations` so this\n * module stays free of the server-destination-api dependency. The emitter\n * will translate the shorthand into a real `Destination.Init` before calling\n * `startFlow()`.\n */\nexport interface TelemetryInitConfig {\n consent: WalkerOS.Consent;\n user: WalkerOS.User;\n destinations: {\n api: TelemetryDestinationReference;\n };\n}\n\n/**\n * Build the init config used by the telemetry emitter. The collector merges\n * `user` and `consent` into every emitted event, so per-send code only needs\n * to pass `name`, `data`, `timing`, and `source`.\n *\n * `WalkerOS.User` extends `WalkerOS.Properties`, so carrying a custom `node`\n * field (e.g. `\"v22.0.0\"`) is structurally valid - `string` is a `Property`.\n */\nexport function buildInitConfig(input: InitConfigInput): TelemetryInitConfig {\n const user: WalkerOS.User = {\n device: input.installationId,\n os: input.environment.os,\n osVersion: input.environment.osVersion,\n language: input.environment.language,\n timezone: input.environment.timezone,\n node: input.environment.node,\n };\n if (input.session) user.session = input.session;\n\n return {\n consent: { telemetry: true },\n user,\n destinations: {\n api: {\n package: '@walkeros/server-destination-api',\n config: { url: input.endpoint },\n },\n },\n };\n}\n","import * as os from 'os';\n\nexport interface Environment {\n os: string;\n osVersion: string;\n node: string;\n language: string;\n timezone: string;\n}\n\nexport function getEnvironment(): Environment {\n const locale = Intl.DateTimeFormat().resolvedOptions();\n return {\n os: process.platform,\n osVersion: os.release(),\n node: process.version,\n language: locale.locale,\n timezone: locale.timeZone,\n };\n}\n","import { readConfig } from '../lib/config-file.js';\n\nfunction envFlag(name: string): boolean {\n const v = process.env[name];\n return v === '1' || v === 'true';\n}\n\n/**\n * Is telemetry actively enabled for this process?\n *\n * Returns `true` only when the user has given explicit consent via\n * `walkeros telemetry enable` (recorded as `telemetryEnabled: true` in the\n * config file). Every other state (no config, config without the field, or\n * `telemetryEnabled: false`) returns `false`.\n *\n * `DO_NOT_TRACK` and `WALKEROS_TELEMETRY_DISABLED` are honored as forced-off\n * overrides for backward compatibility and for users who want a belt-and-\n * braces guarantee even after opting in.\n */\nexport function isTelemetryEnabled(): boolean {\n if (envFlag('DO_NOT_TRACK')) return false;\n if (envFlag('WALKEROS_TELEMETRY_DISABLED')) return false;\n return readConfig()?.telemetryEnabled === true;\n}\n\n/** Whether telemetry debug logging is enabled via `WALKEROS_TELEMETRY_DEBUG`. */\nexport function isDebugMode(): boolean {\n return envFlag('WALKEROS_TELEMETRY_DEBUG');\n}\n","import { readConfig } from '../lib/config-file.js';\n\n/**\n * One-time informational notice inviting the user to opt in to anonymous\n * telemetry. Non-blocking. Writes nothing to disk. Suppressed on subsequent\n * runs by the presence of a config file (created by login, project\n * defaults, feedback preferences, or an explicit `walkeros telemetry\n * enable`). If the user never creates a config for any other reason, the\n * notice keeps appearing. That is acceptable: the notice is a one-line\n * informational message, not a prompt.\n */\nexport function maybePrintFirstRunNotice(): void {\n if (readConfig()) return;\n const msg =\n '\\n' +\n 'walkerOS can collect anonymous usage telemetry to help us improve the tools.\\n' +\n \"It's off by default. Nothing is sent until you run `walkeros telemetry enable`.\\n\" +\n 'What we would send: https://github.com/elbwalker/walkerOS/blob/main/packages/cli/src/telemetry/flow.json\\n\\n';\n process.stderr.write(msg);\n}\n","import ciInfo from 'ci-info';\n\nexport interface CiInfo {\n ci: boolean;\n ci_name?: string;\n}\n\ninterface CiInput {\n isCI: boolean;\n name?: string | null;\n}\n\n/**\n * CI environment detection. Accepts an injected input for testability;\n * production callers pass no argument and `ci-info` is read directly.\n */\nexport function getCiInfo(input?: CiInput): CiInfo {\n const isCI = input?.isCI ?? ciInfo.isCI;\n // Use property presence (not nullishness) so callers can pass `name: null`\n // explicitly to mean \"vendor unknown\" without falling through to ciInfo.name.\n const name = input && 'name' in input ? input.name : (ciInfo.name ?? null);\n if (!isCI) return { ci: false };\n return name ? { ci: true, ci_name: name } : { ci: true };\n}\n"],"mappings":";;;;;;;;;;;AACA,OAAO,WAAW;AAClB,SAAS,cAAc,aAAa;AAuB7B,SAAS,gBACd,UAA4B,CAAC,GACZ;AACjB,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EACX,IAAI;AACJ,QAAM,MAAM,SAAS,QAAQ,QAAQ,QAAQ;AAE7C,SAAO,aAAa;AAAA;AAAA,IAElB,OAAO,MAAM;AAAA,IACb,SAAS,CAAC,OAAO,SAAS,UAAU,UAAU;AAE5C,YAAM,YAAY,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO;AAC/D,YAAM,cAAc,GAAG,SAAS,GAAG,OAAO;AAG1C,UAAI,UAAU,MAAM,OAAO;AACzB,YAAI,CAAC,KAAM,SAAQ,MAAM,MAAM,IAAI,WAAW,CAAC;AAC/C;AAAA,MACF;AAGA,UAAI,UAAU,KAAM;AAGpB,UAAI,UAAU,MAAM,OAAO;AACzB,YAAI,CAAC,QAAS;AACd,YAAI,KAAK,WAAW,EAAE;AACtB;AAAA,MACF;AAGA,UAAI,WAAW;AAAA,IACjB;AAAA,IACA,aAAa,CAAC,SAAS;AACrB,UAAI,CAAC,OAAQ,KAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,IAChD;AAAA,EACF,CAAC;AACH;AAnEA;AAAA;AAAA;AAAA;AAAA;;;ACcO,SAAS,cAAqB;AACnC,MAAI,YAAY;AAChB,MAAI,UAAU;AAEd,SAAO;AAAA,IACL,QAAQ;AACN,kBAAY,KAAK,IAAI;AACrB,gBAAU;AAAA,IACZ;AAAA,IAEA,MAAM;AACJ,gBAAU,KAAK,IAAI;AACnB,aAAO,UAAU;AAAA,IACnB;AAAA,IAEA,aAAa;AACX,YAAM,cAAc,WAAW,KAAK,IAAI;AACxC,aAAO,cAAc;AAAA,IACvB;AAAA,IAEA,SAAS;AACP,YAAM,UAAU,KAAK,WAAW;AAChC,cAAQ,UAAU,KAAM,QAAQ,CAAC,IAAI;AAAA,IACvC;AAAA,EACF;AACF;AAvCA;AAAA;AAAA;AAAA;AAAA;;;ACIA,OAAO,QAAQ;AACf,OAAO,UAAU;AAMjB,eAAsB,YACpB,SACA,SACe;AACf,MAAI,QAAQ,QAAQ;AAClB,UAAM,aAAa,KAAK,QAAQ,QAAQ,MAAM;AAC9C,UAAM,GAAG,UAAU,KAAK,QAAQ,UAAU,CAAC;AAC3C,UAAM,GAAG,UAAU,YAAY,OAAO;AAAA,EACxC,OAAO;AACL,YAAQ,OAAO,MAAM,OAAO;AAC5B,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AACF;AAYO,SAAS,iBACd,SACA,MACA,OACA,UACe;AACf,SAAO;AAAA,IACL;AAAA,IACA,GAAI,QAAQ,EAAE,KAAK;AAAA,IACnB,GAAI,SAAS,EAAE,MAAM;AAAA,IACrB,GAAI,YAAY,EAAE,SAAS;AAAA,EAC7B;AACF;AAKO,SAAS,oBACd,MACA,UACe;AACf,SAAO,iBAAiB,MAAM,MAAM,QAAW,QAAQ;AACzD;AAKO,SAAS,kBACd,OACA,UACmB;AACnB,SAAO,iBAAwB,OAAO,QAAW,OAAO,QAAQ;AAClE;AAKO,SAAS,YAAY,OAAuB;AACjD,UAAQ,QAAQ,MAAM,QAAQ,CAAC;AACjC;AA1EA;AAAA;AAAA;AAAA;AAAA;;;ACOA,OAAO,QAAQ;AACf,OAAOA,WAAU;AAmBV,SAAS,WAAW,WAAoB,UAA4B;AACzE,QAAM,OAAO,UAAU;AAEvB,QAAM,eAAeA,MAAK,WAAW,IAAI,IAAI,OAAOA,MAAK,QAAQ,IAAI;AACrE,SAAOA,MAAK,KAAK,cAAc,GAAG,QAAQ;AAC5C;AAhCA,IAUM;AAVN;AAAA;AAAA;AAUA,IAAM,mBAAmB,GAAG,OAAO;AAAA;AAAA;;;ACVnC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,YAAY;AACrB,SAAS,eAAe;AAyBjB,SAAS,eAAuB;AACrC,QAAM,YAAY,QAAQ,IAAI;AAC9B,QAAM,OAAO,aAAa,KAAK,QAAQ,GAAG,SAAS;AACnD,SAAO,KAAK,MAAM,UAAU;AAC9B;AAKO,SAAS,gBAAwB;AACtC,SAAO,KAAK,aAAa,GAAG,aAAa;AAC3C;AAKO,SAAS,aAAoC;AAClD,QAAM,aAAa,cAAc;AACjC,MAAI;AACF,UAAM,UAAU,aAAa,YAAY,OAAO;AAChD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,YAAY,QAA8B;AACxD,QAAM,MAAM,aAAa;AACzB,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAElC,QAAM,aAAa,cAAc;AACjC,gBAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAC5E;AASO,SAAS,yBAAyB,SAGhC;AACP,QAAM,WAAW,WAAW,KAAK,CAAC;AAClC,cAAY,EAAE,GAAG,UAAU,GAAG,QAAQ,CAAC;AACzC;AAKO,SAAS,eAAwB;AACtC,QAAM,aAAa,cAAc;AACjC,MAAI,WAAW,UAAU,GAAG;AAC1B,eAAW,UAAU;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,sBAAsB,WAA0B;AAC9D,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAQ;AACb,cAAY,EAAE,GAAG,QAAQ,mBAAmB,UAAU,CAAC;AACzD;AAMO,SAAS,wBAA6C;AAC3D,QAAM,SAAS,WAAW;AAC1B,SAAO,QAAQ;AACjB;AAMO,SAAS,kBAAkB,WAAyB;AACzD,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,cAAY,EAAE,GAAG,QAAQ,kBAAkB,UAAU,CAAC;AACxD;AAKO,SAAS,oBAAmC;AACjD,QAAM,SAAS,WAAW;AAC1B,SAAO,QAAQ,oBAAoB;AACrC;AAQO,SAAS,eAGP;AACP,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,SAAU,QAAO,EAAE,OAAO,UAAU,QAAQ,MAAM;AAEtD,QAAM,SAAS,WAAW;AAC1B,MAAI,QAAQ,MAAO,QAAO,EAAE,OAAO,OAAO,OAAO,QAAQ,SAAS;AAElE,SAAO;AACT;AAMO,SAAS,qBAAoC;AAClD,SAAO,QAAQ,IAAI,yBAAyB;AAC9C;AAMO,SAAS,gBAAwB;AACtC,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,OAAQ,QAAO;AAEnB,QAAM,SAAS,WAAW;AAC1B,MAAI,QAAQ,OAAQ,QAAO,OAAO;AAElC,SAAO;AACT;AA/KA;AAAA;AAAA;AAAA;AAAA;;;ACgBO,SAAS,iBAAiB,OAGxB;AACP,QAAM,UAAU,QAAQ,IAAI;AAG5B,QAAM,OAAO,WAAW,MAAM,QAAQ;AACtC,YAAU,EAAE,MAAM,SAAS,MAAM,QAAQ;AAC3C;AAEO,SAAS,mBAA8C;AAC5D,SAAO;AACT;AAEO,SAAS,qBAA2B;AACzC,YAAU;AACZ;AAMO,SAAS,uBAA+C;AAC7D,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,SAAO;AAAA,IACL,cAAc,YAAY,QAAQ,IAAI,IAAI,QAAQ,OAAO;AAAA,IACzD,qBAAqB,QAAQ;AAAA,IAC7B,6BAA6B,QAAQ;AAAA,EACvC;AACF;AA9CA,IAOI;AAPJ;AAAA;AAAA;AAAA;AAAA;;;ACUA,SAAS,iBAAiB,SAA+C;AACvE,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,MAAI,mBAAmB,QAAS,QAAO,OAAO,YAAY,QAAQ,QAAQ,CAAC;AAC3E,MAAI,MAAM,QAAQ,OAAO,EAAG,QAAO,OAAO,YAAY,OAAO;AAC7D,SAAO;AACT;AAMO,SAAS,iBACd,OACA,SACwB;AACxB,QAAM,aAAa,iBAAiB,OAAO;AAC3C,MAAI,MAAO,YAAW,gBAAgB,UAAU,KAAK;AACrD,SAAO;AACT;AAOA,SAAS,aACP,OACA,SACwB;AACxB,SAAO;AAAA,IACL,GAAG,qBAAqB;AAAA,IACxB,GAAG,iBAAiB,OAAO,OAAO;AAAA,EACpC;AACF;AAMA,eAAsB,SACpBC,QACA,MACmB;AACnB,QAAM,UAAU,cAAc;AAC9B,QAAM,QAAQ,aAAa,GAAG;AAC9B,SAAO,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,IAChC,GAAG;AAAA,IACH,SAAS,aAAa,OAAO,MAAM,OAAO;AAAA,EAC5C,CAAC;AACH;AAMA,eAAsB,YACpBA,QACA,MACmB;AACnB,QAAM,UAAU,cAAc;AAC9B,SAAO,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,IAChC,GAAG;AAAA,IACH,SAAS;AAAA,MACP,GAAG,qBAAqB;AAAA,MACxB,GAAG,iBAAiB,MAAM,OAAO;AAAA,IACnC;AAAA,EACF,CAAC;AACH;AAMA,eAAsB,YACpBA,QACA,MACmB;AACnB,QAAM,UAAU,cAAc;AAC9B,QAAM,QAAQ,mBAAmB,KAAK,aAAa,GAAG;AACtD,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO,MAAM,GAAG,OAAO,GAAGA,MAAI,IAAI;AAAA,IAChC,GAAG;AAAA,IACH,SAAS,aAAa,OAAO,MAAM,OAAO;AAAA,EAC5C,CAAC;AACH;AAjGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;;;ACDA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAUV,SAAS,MAAM,KAAsB;AAC1C,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,GAAG;AACvB,WAAO,IAAI,aAAa,WAAW,IAAI,aAAa;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUA,eAAsB,mBAAmB,KAA8B;AACrE,QAAM,QAAQ,aAAa,GAAG;AAC9B,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,SAAS,iBAAiB,KAAK;AAAA,EACjC,CAAC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,mBAAmB,GAAG,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IACnE;AAAA,EACF;AACA,SAAO,SAAS,KAAK;AACvB;AAoCA,eAAe,eAAe,OAAgC;AAC5D,QAAM,UAAU,MAAM,KAAK;AAG3B,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO,mBAAmB,OAAO;AAAA,EACnC;AAGA,QAAM,eAAeA,MAAK,QAAQ,OAAO;AACzC,MAAI,MAAMD,IAAG,WAAW,YAAY,GAAG;AACrC,WAAOA,IAAG,SAAS,cAAc,OAAO;AAAA,EAC1C;AAGA,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AACtD,WAAO;AAAA,EACT;AAGA,QAAM,IAAI,MAAM,iCAAiC,YAAY,EAAE;AACjE;AA+BA,eAAsB,WACpB,OACA,SACqB;AACrB,QAAM,OAAO,SAAS,SAAS;AAE/B,MAAI,CAAC,MAAM;AACT,WAAO,eAAe,KAAK;AAAA,EAC7B;AAGA,QAAM,UAAU,MAAM,KAAK;AAE3B,MAAI;AACF,UAAM,UAAU,MAAM,eAAe,OAAO;AAG5C,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AAEd,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAG1E,QACE,aAAa,SAAS,WAAW,KACjC,aAAa,SAAS,iBAAiB,GACvC;AACA,YAAM;AAAA,IACR;AAGA,QAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AACtD,YAAM,IAAI;AAAA,QACR,iDAAiD,YAAY;AAAA,MAC/D;AAAA,IACF;AAGA,UAAM,IAAI,MAAM,gCAAgC,KAAK,KAAK,YAAY,EAAE;AAAA,EAC1E;AACF;AA4BA,eAAsB,eAAkB,YAAgC;AACtE,SAAO,WAAc,YAAY,EAAE,MAAM,KAAK,CAAC;AACjD;AA2CA,eAAsB,mBACpB,QACA,SAKY;AACZ,QAAM,YAAY,SAAS,QAAQ;AAGnC,MAAI,CAAC,UAAU,OAAO,KAAK,MAAM,IAAI;AACnC,QAAI,SAAS,SAAU,OAAM,IAAI,MAAM,GAAG,SAAS,cAAc;AACjE,QAAI,SAAS,aAAa,OAAW,QAAO,QAAQ;AACpD,WAAO,CAAC;AAAA,EACV;AAGA,MAAI;AACF,WAAO,MAAM,eAAkB,MAAM;AAAA,EACvC,SAAS,OAAO;AACd,UAAM,UAAU,OAAO,KAAK;AAG5B,QAAI,CAAC,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,GAAG,GAAG;AACxD,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAGA,UAAM,IAAI;AAAA,MACR,mBAAmB,SAAS,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACzF;AAAA,EACF;AACF;AArRA;AAAA;AAAA;AAMA;AACA;AAAA;AAAA;;;ACAA,OAAOE,WAAU;AAqBV,SAAS,aACd,WACA,WACA,SACQ;AAER,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAGA,MAAIA,MAAK,WAAW,SAAS,GAAG;AAC9B,WAAO;AAAA,EACT;AAGA,SAAOA,MAAK,QAAQ,WAAW,QAAQ,IAAI,GAAG,SAAS;AACzD;AA7CA;AAAA;AAAA;AAQA;AAAA;AAAA;;;ACCO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAXA,IAAAC,cAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAsBf,eAAsB,oBACpB,aACA,WACA,WACA,QAC2B;AAE3B,QAAM,eAAeD,MAAK,WAAW,SAAS,IAC1C,YACAA,MAAK,QAAQ,WAAW,SAAS;AAErC,QAAME,QAAO,MAAMD,IAAG,KAAK,YAAY,EAAE,MAAM,MAAM,IAAI;AAGzD,MAAIC,OAAM,OAAO,GAAG;AAClB,WAAO,EAAE,MAAM,aAAa,cAAc,MAAM,OAAO;AAAA,EACzD;AAGA,MAAI,CAACA,OAAM;AACT,eAAW,OAAO,CAAC,OAAO,QAAQ,OAAO,OAAO,GAAG;AACjD,YAAM,UAAU,eAAe;AAC/B,UAAI,MAAMD,IAAG,WAAW,OAAO,GAAG;AAChC,eAAO,EAAE,MAAM,aAAa,cAAc,SAAS,MAAM,OAAO;AAAA,MAClE;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR,iCAAiC,SAAS,iBAAiB,YAAY;AAAA,IACzE;AAAA,EACF;AAGA,MAAIC,MAAK,YAAY,GAAG;AACtB,UAAM,aAAa,MAAMD,IAAG;AAAA,MAC1BD,MAAK,KAAK,cAAc,cAAc;AAAA,IACxC;AAEA,QAAI,YAAY;AAEd,YAAM,WAAWA,MAAK,KAAK,cAAc,MAAM;AAC/C,YAAM,gBAAgB,MAAMC,IAAG,WAAW,QAAQ;AAElD,UAAI,CAAC,eAAe;AAClB,eAAO;AAAA,UACL,iBAAO,WAAW;AAAA,QACpB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,UAAU,gBAAgB,WAAW;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAGA,WAAO,EAAE,MAAM,aAAa,cAAc,MAAM,YAAY;AAAA,EAC9D;AAEA,QAAM,IAAI;AAAA,IACR,iCAAiC,SAAS,iBAAiB,YAAY;AAAA,EACzE;AACF;AAUA,eAAsB,iBACpB,UACA,WACA,QACiB;AACjB,QAAM,aAAaD,MAAK,KAAK,WAAW,gBAAgB,SAAS,IAAI;AAErE,MAAI,SAAS,SAAS,QAAQ;AAC5B,UAAMC,IAAG,UAAU,UAAU;AAG7B,UAAM,MAAMD,MAAK,QAAQ,SAAS,YAAY;AAC9C,UAAMC,IAAG,KAAK,SAAS,cAAcD,MAAK,KAAK,YAAY,QAAQ,GAAG,EAAE,CAAC;AAGzE,UAAMC,IAAG,UAAUD,MAAK,KAAK,YAAY,cAAc,GAAG;AAAA,MACxD,MAAM,SAAS;AAAA,MACf,MAAM,UAAU,GAAG;AAAA,IACrB,CAAC;AAED,WAAO;AAAA,MACL,+BAAwB,SAAS,IAAI,SAAS,SAAS,YAAY;AAAA,IACrE;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,aAAa;AACjC,UAAMC,IAAG,UAAUD,MAAK,QAAQ,UAAU,CAAC;AAG3C,UAAM,UAAU,MAAMC,IAAG,QAAQ,SAAS,YAAY;AACtD,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,CAAC,gBAAgB,UAAU,MAAM,EAAE,SAAS,KAAK,GAAG;AACvD,cAAMA,IAAG;AAAA,UACPD,MAAK,KAAK,SAAS,cAAc,KAAK;AAAA,UACtCA,MAAK,KAAK,YAAY,KAAK;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAGA,UAAMC,IAAG,UAAUD,MAAK,KAAK,YAAY,cAAc,GAAG;AAAA,MACxD,MAAM,SAAS;AAAA,MACf,MAAM;AAAA,IACR,CAAC;AAED,WAAO;AAAA,MACL,8BAAuB,SAAS,IAAI,SAAS,SAAS,YAAY;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAGA,QAAMC,IAAG,UAAUD,MAAK,QAAQ,UAAU,CAAC;AAG3C,QAAMC,IAAG;AAAA,IACPD,MAAK,KAAK,SAAS,cAAc,cAAc;AAAA,IAC/CA,MAAK,KAAK,YAAY,cAAc;AAAA,EACtC;AAGA,MAAI,SAAS,eAAe;AAC1B,UAAMC,IAAG,KAAK,SAAS,UAAUD,MAAK,KAAK,YAAY,MAAM,CAAC;AAAA,EAChE,OAAO;AAEL,UAAM,UAAU,MAAMC,IAAG,QAAQ,SAAS,YAAY;AACtD,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,CAAC,gBAAgB,UAAU,MAAM,EAAE,SAAS,KAAK,GAAG;AACvD,cAAMA,IAAG;AAAA,UACPD,MAAK,KAAK,SAAS,cAAc,KAAK;AAAA,UACtCA,MAAK,KAAK,YAAY,KAAK;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,0BAAmB,SAAS,IAAI,SAAS,SAAS,YAAY,EAAE;AAE5E,SAAO;AACT;AAjLA;AAAA;AAAA;AAAA;AAAA;;;ACOA,OAAOG,SAAQ;AAmBf,eAAsB,YACpB,WACA,kBACwB;AAExB,QAAM,UAAU,MAAM,YAAY,SAAS;AAG3C,MAAI;AACF,SAAK,MAAM,OAAO;AAClB,WAAO,EAAE,MAAM,UAAU,QAAQ;AAAA,EACnC,QAAQ;AAEN,UAAM,WAAW,oBAAoB,uBAAuB,SAAS;AACrE,WAAO,EAAE,MAAM,UAAU,SAAS,SAAS;AAAA,EAC7C;AACF;AAQO,SAAS,uBAAuB,WAA6B;AAElE,QAAM,YAAY,UAAU,MAAM,GAAG,EAAE,CAAC;AACxC,SAAO,UAAU,SAAS,MAAM,IAAI,WAAW;AACjD;AAQA,eAAe,YAAY,WAAoC;AAC7D,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,mBAAmB,SAAS;AAAA,EACrC;AAEA,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,SAAOA,IAAG,SAAS,WAAW,MAAM;AACtC;AAzEA;AAAA;AAAA;AAQA;AAAA;AAAA;;;ACRA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGV,SAAS,eAAwB;AACtC,SAAO,CAAC,QAAQ,MAAM;AACxB;AAEA,eAAsB,YAA6B;AACjD,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,QAAQ,OAAO;AACvC,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,QAAM,UAAU,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO;AACtD,MAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AACA,SAAO;AACT;AAMA,eAAsB,oBAAoB,OAAgC;AACxE,QAAM,UAAU,MAAM,UAAU;AAChC,QAAM,UAAU,WAAW,QAAW,SAAS,KAAK,OAAO;AAC3D,QAAMD,IAAG,UAAUC,MAAK,QAAQ,OAAO,CAAC;AACxC,QAAMD,IAAG,UAAU,SAAS,SAAS,OAAO;AAC5C,SAAO;AACT;AA9BA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACIO,SAAS,WAA+B;AAC7C,QAAM,SAAS,aAAa;AAC5B,SAAO,QAAQ;AACjB;AAEO,SAAS,iBAAyC;AACvD,QAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,SAAO,EAAE,eAAe,UAAU,KAAK,GAAG;AAC5C;AAMO,SAAS,kBAAiC;AAC/C,SAAO,mBAAmB,KAAK,aAAa,GAAG,SAAS;AAC1D;AAEO,SAAS,mBAA2B;AACzC,QAAM,YAAY,QAAQ,IAAI,uBAAuB,kBAAkB;AACvE,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO;AACT;AAhCA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACUO,SAAS,eAAe,QAAgC;AAC7D,QAAM,SAAqB,CAAC;AAC5B,QAAM,SAAS,OAAO,MAAM,MAAM;AAClC,QAAM,YAAY,OAAO,IAAI,KAAK;AAElC,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,MAAM,KAAK,EAAG;AAEnB,QAAI,YAAY;AAChB,UAAM,YAAsB,CAAC;AAE7B,eAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,UAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,oBAAY,KAAK,MAAM,CAAC,EAAE,KAAK;AAAA,MACjC,WAAW,KAAK,WAAW,OAAO,GAAG;AACnC,kBAAU,KAAK,KAAK,MAAM,CAAC,EAAE,UAAU,CAAC;AAAA,MAC1C;AAAA,IAEF;AAEA,QAAI,UAAU,SAAS,GAAG;AACxB,aAAO,KAAK,EAAE,MAAM,WAAW,MAAM,UAAU,KAAK,IAAI,EAAE,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,QAAQ,UAAU;AACrC;AApCA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,eAAe;AAyCjB,SAAS,cACd,OACA,QAAyB,UACF;AACvB,QAAM,SAAiC,CAAC;AACxC,QAAM,WAAqC,CAAC;AAC5C,QAAM,UAAkC,CAAC;AAGzC,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,QAAQ,UAAU,QAAQ;AAAA,EACnD;AAEA,QAAM,QAAQ;AAGd,MAAI,EAAE,UAAU,UAAU,MAAM,SAAS,QAAW;AAClD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH,WAAW,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,KAAK,MAAM,IAAI;AACrE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO,MAAM;AAAA,MACb,MAAM;AAAA,IACR,CAAC;AAAA,EACH,OAAO;AAEL,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AACvB,UAAI,UAAU,UAAU;AACtB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SACE;AAAA,UACF,OAAO;AAAA,UACP,MAAM;AAAA,QACR,CAAC;AACD,gBAAQ,SAAS;AACjB,gBAAQ,SAAS;AAAA,MACnB,WAAW,UAAU,YAAY;AAC/B,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,eAAe,IAAI;AAAA,QAC9B,CAAC;AACD,gBAAQ,SAAS;AACjB,gBAAQ,SAAS;AAAA,MACnB;AAAA,IAEF,OAAO;AACL,YAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,YAAM,SAAS,MAAM,IAAI;AACzB,YAAM,SAAS,MAAM,KAAK,GAAG;AAC7B,cAAQ,SAAS;AACjB,cAAQ,SAAS;AAAA,IACnB;AAAA,EACF;AAGA,MAAI,UAAU,WAAW;AACvB,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,UAAU,QAAQ;AAAA,EACjE;AAGA,QAAM,YAAY,mBAAmB,UAAU,KAAK;AACpD,MAAI,CAAC,UAAU,SAAS;AACtB,eAAW,SAAS,UAAU,MAAM,QAAQ;AAC1C,YAAM,YAAY,MAAM,KAAK,KAAK,GAAG;AACrC,UAAI,cAAc,OAAQ;AAC1B,aAAO,KAAK;AAAA,QACV,MAAM,aAAa;AAAA,QACnB,SAAS,MAAM;AAAA,QACf,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,UAAU,UAAU;AACtB,QAAI,CAAC,MAAM,SAAS;AAClB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,YAAQ,aAAa,CAAC,CAAC,MAAM;AAC7B,YAAQ,UAAU,CAAC,CAAC,MAAM;AAC1B,YAAQ,aAAa,CAAC,CAAC,MAAM;AAAA,EAC/B;AAEA,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,UAAU,QAAQ;AACjE;AA9IA,IAEQ;AAFR;AAAA;AAAA;AAEA,KAAM,EAAE,uBAAuB;AAAA;AAAA;;;ACF/B;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAQa;AARb;AAAA;AAAA;AAQO,IAAM,wBAAwB,CAAC,YACpC,QAAQ,QAAQ,OAAO,GAAG;AAAA;AAAA;;;AC2C5B,SAAS,gBACP,OACA,SACkB;AAClB,SAAQ,QAA8B,SAAS,KAAK;AACtD;AAUO,SAAS,kBACd,OACA,SAC6B;AAC7B,QAAM,EAAE,SAAS,WAAW,CAAC,EAAE,IAAI;AACnC,QAAM,cAAc,QAAQ,KAAK,KAAK;AAEtC,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,MAAM,SAAS,gBACjB,SAAS,cAAc,KAAK,IAC5B,mBAAmB,KAAK,2CAA2C,WAAW;AAClF,UAAM,IAAI,MAAM,GAAG;AAAA,EACrB;AAEA,QAAM,SAAS,MAAM,CAAC;AACtB,QAAM,OAAO,MAAM,CAAC;AAEpB,MAAI,CAAC,MAAM;AACT,UAAM,MAAM,SAAS,cACjB,SAAS,YAAY,OAAO,MAAM,IAClC,mBAAmB,KAAK,0BAA0B,MAAM;AAC5D,UAAM,IAAI,MAAM,GAAG;AAAA,EACrB;AAEA,MAAI,CAAC,gBAAgB,QAAQ,OAAO,GAAG;AACrC,UAAM,MAAM,SAAS,gBACjB,SAAS,cAAc,MAAM,IAC7B,iBAAiB,MAAM,eAAe,WAAW;AACrD,UAAM,IAAI,MAAM,GAAG;AAAA,EACrB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,MAAM,MAAM,CAAC;AAAA,EACrB;AACF;AAxGA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA,IAAAE;AACA;AACA;AACA;AACA;AACA;AAMA;AAEA;AACA;AACA;AACA;AAAA;AAAA;;;ACbA,SAAS,gBAAgB;AACzB,SAAS,WAAAC,gBAAe;AAiCjB,SAAS,aAAa,MAAkC;AAC7D,QAAM,SAAS,gBAAgB,IAAI;AACnC,SAAO,OAAO;AAChB;AAaO,SAAS,mBAAmB,MAA0B;AAM3D,MAAI,aAAa,IAAI,EAAG,QAAO;AAG/B,QAAM,SAAS,gBAAgB,IAAI;AACnC,MAAI,OAAO,SAAS;AAElB,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,QAAM,SAAS,OAAO,MAAM,OACzB,IAAI,CAAC,UAAU;AACd,UAAMC,SACJ,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,IAAI;AAC7D,WAAO,OAAOA,MAAI,KAAK,MAAM,OAAO;AAAA,EACtC,CAAC,EACA,KAAK,IAAI;AACZ,QAAM,IAAI,MAAM;AAAA,EAA2B,MAAM,EAAE;AACrD;AAQO,SAAS,kBAAkB,QAA6B;AAC7D,SAAO,OAAO,KAAK,OAAO,KAAK;AACjC;AA1FA,IAWQ;AAXR;AAAA;AAAA;AAWA,KAAM,EAAE,oBAAoBD;AAAA;AAAA;;;ACmDrB,SAAS,iBACd,UAC2C;AAC3C,SAAO,aAAa,QAAQ,qBAAqB;AACnD;AAQO,SAAS,iBAAiB,UAAoC;AACnE,SAAO,qBAAqB,QAAQ;AACtC;AA5EA,IAea,oBAiBA,uBAaA;AA7Cb;AAAA;AAAA;AAeO,IAAM,qBAAgE;AAAA,MAC3E,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,WAAW;AAAA,IACb;AAQO,IAAM,wBACX;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAKK,IAAM,uBAAuB;AAAA,MAClC,KAAK;AAAA,MACL,QAAQ;AAAA,IACV;AAAA;AAAA;;;ACzCA,OAAOE,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,iBAAiB,mBAA8B;AAoEjD,SAAS,iBACd,WACA,SACkB;AAKlB,QAAM,YAAY,0BAA0B,WAAW,QAAQ,MAAM;AAGrE,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,iBAAiB,kBAAa,MAAM;AAG1C,QAAM,WAAW,YAAY,QAAQ,QAAQ,UAAU,cAAc;AAGrE,MAAI,eAAe,gBAAgB,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;AACvE,QAAM,WAAW,YAAY,YAAY;AACzC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,gCAAgC,QAAQ;AAAA,IAC1C;AAAA,EACF;AAGA,MAAI,aAAa,OAAO;AACtB,mBAAe,gBAAgB,QAAQ,QAAQ;AAAA,EACjD;AAGA,QAAM,gBAAgB,iBAAiB,QAAQ;AAQ/C,QAAMC,UAAS,aAAa,QAAQ;AACpC,QAAM,WAA+CA,SAAQ,YAAY,CAAC;AAC1E,QAAM,YAAoCA,SAAQ,aAAa,CAAC;AAChE,QAAM,eAAeA,SAAQ;AAI7B,QAAM,SAAS,QAAQ,gBAAgB,UAAU,iBAAiB,QAAQ;AAI1E,QAAM,YAAY,MAAM,QAAQ,UAAU,IACtC,QAAQ,IAAI,IACZF,MAAK,QAAQ,QAAQ,UAAU;AAGnC,MAAI,WAAW,OAAO;AACtB,MAAI,CAAC,UAAU;AACb,UAAM,qBAAqBA,MAAK,QAAQ,WAAW,sBAAsB;AACzE,QAAIC,IAAG,eAAe,kBAAkB,GAAG;AACzC,iBAAW,CAAC,sBAAsB;AAAA,IACpC;AAAA,EACF;AAGA,QAAM,eAA6B;AAAA,IACjC,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,GAAG,QAAQ;AAAA,EACb;AAGA,QAAM,cAAc,eAAe,SAAS;AAC5C,MAAI,eAAe,QAAQ,QAAQ;AACjC,YAAQ,OAAO;AAAA,MACb,yBAAkB,QAAQ,KAAK,eAAe,MAAM;AAAA,IACtD;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAWA,SAAS,YACP,QACA,eACA,WACQ;AAER,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,UAAU,CAAC;AAAA,EACpB;AAGA,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,mBACsB,UAAU,KAAK,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF;AAGA,MAAI,CAAC,UAAU,SAAS,aAAa,GAAG;AACtC,UAAM,IAAI;AAAA,MACR,SAAS,aAAa;AAAA,mBACA,UAAU,KAAK,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AACT;AAYO,SAAS,aACd,WACA,SACoB;AAEpB,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,QAAQ,kBAAa,MAAM;AAEjC,MAAI,QAAQ,QAAQ;AAClB,YAAQ,OAAO;AAAA,MACb,yBAAkB,MAAM,MAAM,WAAW,MAAM,KAAK,IAAI,CAAC;AAAA,IAC3D;AAAA,EACF;AAGA,SAAO,MAAM;AAAA,IAAI,CAAC,SAChB,iBAAiB,WAAW;AAAA,MAC1B,GAAG;AAAA,MACH,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AA+BA,eAAsB,eACpB,YACA,SAC2B;AAC3B,QAAM,YAAY,MAAM,eAAe,UAAU;AACjD,SAAO,iBAAiB,WAAW,EAAE,YAAY,GAAG,QAAQ,CAAC;AAC/D;AAaA,SAAS,0BACP,WACA,QACS;AACT,MAAI,CAAC,cAAc,SAAS,EAAG,QAAO;AACtC,QAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,cAAc,KAAK,EAAG,QAAO;AAElC,MAAI,UAA0C;AAE9C,aAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,KAAK,GAAG;AACzD,QAAI,CAAC,cAAc,SAAS,EAAG;AAC/B,UAAM,aAAa,UAAU;AAC7B,QAAI,CAAC,cAAc,UAAU,EAAG;AAChC,UAAMC,UAAS,WAAW;AAC1B,QAAI,CAAC,cAAcA,OAAM,EAAG;AAC5B,QAAI,EAAE,cAAcA,SAAS;AAE7B,YAAQ;AAAA,MACN,mIAAmI,QAAQ;AAAA,IAC7I;AAEA,QAAI,CAAC,SAAS;AACZ,gBAAU;AAAA,QACR,GAAG;AAAA,QACH,OAAO,EAAE,GAAG,MAAM;AAAA,MACpB;AAAA,IACF;AACA,UAAM,eAAe,QAAQ;AAC7B,UAAM,YAAY,EAAE,GAAGA,QAAO;AAC9B,WAAO,UAAU;AACjB,UAAM,YAAY,EAAE,GAAG,YAAY,QAAQ,UAAU;AACrD,iBAAa,QAAQ,IAAI,EAAE,GAAG,WAAW,QAAQ,UAAU;AAAA,EAC7D;AAEA,SAAO,WAAW;AACpB;AAEA,SAAS,cAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAzUA,IAoBM;AApBN;AAAA;AAAA;AAWA;AAKA;AACA;AAGA,IAAM,yBAAyB;AAAA;AAAA;;;ACpB/B;AAAA;AAAA;AAQA;AAQA;AASA;AASA;AAAA;AAAA;;;AC3BO,SAAS,oBAAoB,OAAyB;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,WACE,MAAM,WAAW,QAAQ,KACzB,MAAM,WAAW,SAAS,KAC1B,MAAM,SAAS,iBAAiB;AAAA,EAEpC;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,KAAK,mBAAmB;AAAA,EACvC;AACA,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAI/C,WAAO,OAAO,OAAO,KAAgC,EAAE;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAUO,SAAS,uBAAuB,MAGrC;AACA,QAAM,YAAqC,CAAC;AAC5C,QAAM,YAAqC,CAAC;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,QAAQ,QAAQ;AAClB,gBAAU,GAAG,IAAI;AACjB;AAAA,IACF;AACA,QAAI,oBAAoB,KAAK,GAAG;AAC9B,gBAAU,GAAG,IAAI;AAAA,IACnB,OAAO;AACL,gBAAU,GAAG,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,UAAU;AAChC;AAzDA;AAAA;AAAA;AAAA;AAAA;;;ACQA,SAAS,qBAAqB;AAC9B,OAAO,YAAY;AAOZ,SAAS,iBAAiB,SAA0B;AAIzD,MAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,SAAO;AACT;AAKO,SAAS,eAAuB;AACrC,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAC9C;AAOA,eAAsB,mBACpB,aACA,SACA,MACiB;AACjB,QAAM,WAAW,YAAY,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE;AAEjE,MAAI,iBAAiB,OAAO,GAAG;AAC7B,UAAM,UAAU,QAAQ,aAAa;AACrC,UAAMC,SAAQ,GAAG,QAAQ,IAAI,OAAO,IAAI,OAAO;AAC/C,WAAO,cAAcA,QAAO,WAAW;AAAA,EACzC;AAGA,QAAM,QAAQ,GAAG,QAAQ,IAAI,OAAO;AACpC,SAAO,cAAc,OAAO,WAAW;AACzC;AAMA,SAAS,cAAc,SAAyB;AAC9C,QAAM,SAAS,KAAK,MAAM,OAAO;AACjC,SAAO,KAAK,UAAU,MAAM;AAC9B;AAMA,eAAsB,wBACpB,SACA,MACiB;AACjB,QAAM,UAAU,QAAQ,aAAa;AACrC,QAAM,aAAa,cAAc,OAAO;AACxC,QAAM,QAAQ,GAAG,UAAU,IAAI,OAAO;AACtC,SAAO,cAAc,OAAO,WAAW;AACzC;AA3EA,IAWM;AAXN;AAAA;AAAA;AAWA,IAAM,cAAc;AAAA;AAAA;;;ACXpB,OAAO,YAAY;AACnB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,gBAAgB;AACzB,OAAOC,SAAQ;AACf,OAAOC,aAAY;AAyBnB,eAAsB,uBACpB,aAAa,QAAQ,IAAI,GACzB,UAAUD,IAAG,QAAQ,GACD;AACpB,QAAM,SAAiC,CAAC;AACxC,QAAM,UAAU;AAAA,IACdF,MAAK,KAAK,SAAS,QAAQ;AAAA,IAC3BA,MAAK,KAAK,YAAY,QAAQ;AAAA,EAChC;AACA,aAAW,QAAQ,SAAS;AAC1B,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,SAAS,MAAM,OAAO;AAAA,IACxC,QAAQ;AACN;AAAA,IACF;AACA,eAAW,WAAW,QAAQ,MAAM,IAAI,GAAG;AACzC,YAAM,OAAO,QAAQ,KAAK;AAC1B,UAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,EAAG;AAC3D,YAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,UAAI,KAAK,EAAG;AACZ,YAAM,MAAM,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK;AACnC,UAAI,QAAQ,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK;AACpC,UACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC5C;AACA,gBAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,MAC3B;AACA,cAAQ,MAAM;AAAA,QACZ;AAAA,QACA,CAAC,OAAO,MAAM,QAAQ,IAAI,CAAC,KAAK;AAAA,MAClC;AACA,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,MAAI,WAAW,OAAO,UAAU,KAAK;AACrC,MAAI,CAAC,SAAS,SAAS,GAAG,EAAG,YAAW,GAAG,QAAQ;AACnD,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,QAAI,IAAI,SAAS,WAAW,KAAK,IAAI,WAAW,GAAG,GAAG;AACpD,YAAM,IAAI,OAAO,GAAG;AACpB,UAAI,CAAC,EAAE,SAAS,GAAG,EAAG,QAAO,GAAG,IAAI,GAAG,CAAC;AAAA,IAC1C;AAAA,EACF;AACA,SAAO,EAAE,GAAG,QAAQ,UAAU,cAAc,KAAK;AACnD;AAEA,eAAsB,YACpB,SACA,IACA,cACY;AACZ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAe,CAAC,GAAG,WAAW;AAChD,YAAQ,WAAW,MAAM,OAAO,IAAI,MAAM,YAAY,CAAC,GAAG,EAAE;AAAA,EAC9D,CAAC;AACD,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,CAAC,SAAS,OAAO,CAAC;AAAA,EAC9C,UAAE;AACA,iBAAa,KAAM;AAAA,EACrB;AACF;AAiCA,SAAS,oBAAoB,SAAiB,aAA6B;AACzE,SAAOA,MAAK,KAAK,SAAS,gBAAgB,WAAW;AACvD;AAEA,SAAS,0BACP,SACA,cACA,mBACQ;AACR,SAAOA,MAAK;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMA,eAAsB,gBACpB,UACA,QACA,WACA,YAAoC,CAAC,GACrC,YAAuB,aACc;AACrC,QAAM,WAAW,oBAAI,IAA2B;AAChD,QAAM,UAAU,oBAAI,IAAY;AAYhC,QAAM,mBAAmB,IAAI;AAAA,IAC3B,SAAS,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAClD;AACA,aAAW,gBAAgB,OAAO,KAAK,SAAS,GAAG;AACjD,QAAI,iBAAiB,IAAI,YAAY,GAAG;AACtC,aAAO;AAAA,QACL,gBAAgB,YAAY;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,CACpB,SACA,SACA,QACA,MACA,aACc;AACd,UAAM,eAAe,UAAU,OAAO;AACtC,QAAI,cAAc;AAChB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM,iBAAiB,OAAO,SAAS,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,MAAM,SAAS,MAAM,SAAS,QAAQ,MAAM,SAAS;AAAA,EAChE;AAEA,QAAM,QAAqB,SAAS,IAAI,CAAC,SAAS;AAAA,IAChD,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW,IAAI;AAAA,EACjB,EAAE;AAEF,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,OAAO,MAAM,MAAM;AACzB,UAAM,WAAW,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI;AAC1C,QAAI,QAAQ,IAAI,QAAQ,EAAG;AAC3B,YAAQ,IAAI,QAAQ;AAGpB,QAAI,CAAC,SAAS,IAAI,KAAK,IAAI,EAAG,UAAS,IAAI,KAAK,MAAM,CAAC,CAAC;AACxD,aAAS,IAAI,KAAK,IAAI,EAAG,KAAK;AAAA,MAC5B,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,IAClB,CAAC;AAGD,QAAI,KAAK,WAAW;AAClB,YAAM,eAAeA,MAAK,WAAW,KAAK,SAAS,IAC/C,KAAK,YACLA,MAAK,QAAQ,aAAa,QAAQ,IAAI,GAAG,KAAK,SAAS;AAG3D,YAAM,gBAAgBA,MAAK,KAAK,cAAc,cAAc;AAC5D,YAAM,aAAa,MAAMC,IAAG,WAAW,aAAa;AAEpD,UAAI,YAAY;AACd,YAAI;AAOF,gBAAM,UAA4B,MAAMA,IAAG,SAAS,aAAa;AAGjE,gBAAMG,QAAO,QAAQ,gBAAgB,CAAC;AACtC,qBAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQA,KAAI,GAAG;AACrD,gBAAI,OAAO,YAAY,UAAU;AAC/B,oBAAM;AAAA,gBACJ,cAAc,SAAS,SAAS,cAAc,KAAK,MAAM,KAAK;AAAA,cAChE;AAAA,YACF;AAAA,UACF;AAGA,gBAAMC,YAAW,QAAQ,oBAAoB,CAAC;AAC9C,gBAAMC,YAAW,QAAQ,wBAAwB,CAAC;AAClD,qBAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQD,SAAQ,GAAG;AACzD,gBAAI,OAAO,YAAY,UAAU;AAC/B,oBAAM,aAAaC,UAAS,OAAO,GAAG,aAAa;AACnD,oBAAM;AAAA,gBACJ;AAAA,kBACE;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,KAAK;AAAA,kBACL;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,iDAAiD,KAAK,IAAI,KAAK,KAAK;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAEA;AAAA,IACF;AAUA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM;AAAA,QACf,OAAO,SAAS,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS;AAAA,QACtD;AAAA,QACA,6BAA6B,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,MACrD;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,gCAAgC,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK;AAAA,MAClE;AACA;AAAA,IACF;AAGA,UAAM,OAAO,SAAS,gBAAgB,CAAC;AACvC,eAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,IAAI,GAAG;AACrD,UAAI,OAAO,YAAY,UAAU;AAC/B,cAAM;AAAA,UACJ,cAAc,SAAS,SAAS,cAAc,KAAK,MAAM,KAAK;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,SAAS,oBAAoB,CAAC;AAC/C,UAAM,WAAW,SAAS,wBAAwB,CAAC;AACnD,eAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACzD,UAAI,OAAO,YAAY,UAAU;AAC/B,cAAM,aAAa,SAAS,OAAO,GAAG,aAAa;AACnD,cAAM;AAAA,UACJ;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA,KAAK;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAaO,SAAS,wBACd,UACA,QACkB;AAClB,QAAM,WAAW,oBAAI,IAA6B;AAClD,QAAM,SAA0B,CAAC;AAEjC,aAAW,CAAC,MAAM,KAAK,KAAK,UAAU;AAEpC,UAAM,YAAY,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS;AAC/C,QAAI,WAAW;AACb,eAAS,IAAI,MAAM;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,QACT,WAAW,UAAU;AAAA,MACvB,CAAC;AACD;AAAA,IACF;AAGA,UAAM,eAAe,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,gBAAgB;AACtE,UAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,gBAAgB;AAGnE,QAAI;AACJ,QAAI,aAAa,SAAS,GAAG;AAC3B,oBAAc;AAAA,IAChB,OAAO;AAEL,YAAM,gBAAgB,UAAU,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AACzD,UAAI,cAAc,WAAW,GAAG;AAC9B,eAAO,MAAM,sCAAsC,IAAI,EAAE;AACzD;AAAA,MACF;AACA,oBAAc;AAAA,IAChB;AAGA,gBAAY;AAAA,MACV,CAAC,GAAG,MAAM,gBAAgB,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM;AAAA,IAChE;AAGA,UAAM,cAAc,YAAY,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AACnE,UAAM,cAAc,YAAY,KAAK,CAAC,MAAMH,QAAO,MAAM,EAAE,IAAI,MAAM,IAAI;AAEzE,QAAI;AACJ,UAAM,gBAAgB,oBAAI,IAAY;AAEtC,QAAI,aAAa;AAEf,sBAAgB,YAAY;AAAA,IAC9B,WAAW,YAAY,SAAS,GAAG;AAEjC,sBAAgB,YAAY,CAAC,EAAE;AAAA,IACjC,OAAO;AAEL,YAAM,gBAAgB,YACnB,OAAO,CAAC,MAAMA,QAAO,MAAM,EAAE,IAAI,MAAM,IAAI,EAC3C,IAAI,CAAC,MAAM,EAAE,IAAI;AACpB,YAAM,cAAc,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC;AAE9C,UAAI,YAAY,SAAS,GAAG;AAE1B,cAAM,SAAS,CAAC,GAAG,WAAW,EAAE,KAAKA,QAAO,QAAQ;AACpD,wBAAgB,OAAO,CAAC;AACxB,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,gBAAM,eAAe,OAAO,CAAC;AAC7B,gBAAM,YAAY,YACf,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EACrC,IAAI,CAAC,MAAM,EAAE,IAAI;AACpB,iBAAO,KAAK,EAAE,MAAM,SAAS,cAAc,UAAU,CAAC;AACtD,wBAAc,IAAI,YAAY;AAAA,QAChC;AAAA,MACF,WAAW,YAAY,WAAW,GAAG;AACnC,wBAAgB,YAAY,CAAC;AAAA,MAC/B,OAAO;AAEL,wBAAgB,YAAY,CAAC,EAAE;AAAA,MACjC;AAAA,IACF;AAGA,QAAIA,QAAO,MAAM,aAAa,GAAG;AAC/B,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,UAAW;AACpB,YAAIA,QAAO,MAAM,KAAK,IAAI,GAAG;AAE3B,cAAI,KAAK,SAAS,eAAe;AAC/B,gBAAI,KAAK,WAAW,kBAAkB;AACpC,qBAAO;AAAA,gBACL,GAAG,IAAI,IAAI,aAAa,iCAAiC,KAAK,IAAI,UAAU,KAAK,IAAI;AAAA,cACvF;AAAA,YACF,WAAW,CAAC,cAAc,IAAI,KAAK,IAAI,GAAG;AAExC,qBAAO,KAAK,EAAE,MAAM,SAAS,KAAK,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;AAChE,4BAAc,IAAI,KAAK,IAAI;AAAA,YAC7B;AAAA,UACF;AAAA,QACF,OAAO;AAEL,cACE,CAACA,QAAO,UAAU,eAAe,KAAK,MAAM;AAAA,YAC1C,mBAAmB;AAAA,UACrB,CAAC,GACD;AACA,gBAAI,KAAK,WAAW,kBAAkB;AACpC,qBAAO;AAAA,gBACL,GAAG,IAAI,IAAI,aAAa,oCAAoC,KAAK,IAAI,UAAU,KAAK,IAAI;AAAA,cAC1F;AAAA,YACF,OAAO;AAEL,qBAAO,KAAK,EAAE,MAAM,SAAS,KAAK,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,YAClE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,aAAS,IAAI,MAAM,EAAE,MAAM,SAAS,cAAc,CAAC;AAAA,EACrD;AAGA,QAAM,kBAAkB,oBAAI,IAA2B;AACvD,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO;AAC1C,UAAM,WAAW,gBAAgB,IAAI,GAAG;AACxC,QAAI,UAAU;AACZ,iBAAW,KAAK,MAAM,WAAW;AAC/B,YAAI,CAAC,SAAS,UAAU,SAAS,CAAC,EAAG,UAAS,UAAU,KAAK,CAAC;AAAA,MAChE;AAAA,IACF,OAAO;AACL,sBAAgB,IAAI,KAAK,EAAE,GAAG,OAAO,WAAW,CAAC,GAAG,MAAM,SAAS,EAAE,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,QAAQ,CAAC,GAAG,gBAAgB,OAAO,CAAC,EAAE;AAC3D;AAWA,eAAsB,+BACpB,UACA,WACA,QACA,WAAW,MACX,WACA,QACA,YAAoC,CAAC,GACrC,YAAuB,aACE;AACzB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMA,eAAe,qBACb,UACA,WACA,QACA,UACA,WACA,QACA,WACA,WACyB;AACzB,QAAM,eAAe,oBAAI,IAAoB;AAG7C,QAAM,wBAAwB,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAGjE,8BAA4B,QAAQ;AAGpC,SAAO,MAAM,wBAAwB;AACrC,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,aAAa,wBAAwB,UAAU,MAAM;AAC3D,QAAM,EAAE,UAAU,OAAO,IAAI;AAG7B,QAAMF,IAAG,UAAU,SAAS;AAG5B,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,KAAM,iBAAgB,IAAI,IAAI,MAAM,IAAI,IAAI;AAAA,EACtD;AAEA,aAAW,CAAC,MAAM,GAAG,KAAK,UAAU;AAElC,QAAI,IAAI,aAAa,gBAAgB,IAAI,IAAI,GAAG;AAC9C,YAAM,YAAY,IAAI,aAAa,gBAAgB,IAAI,IAAI;AAC3D,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA,aAAa,QAAQ,IAAI;AAAA,QACzB;AAAA,MACF;AACA,YAAM,gBAAgB,MAAM,iBAAiB,UAAU,WAAW,MAAM;AACxE,mBAAa,IAAI,MAAM,aAAa;AACpC;AAAA,IACF;AAEA,UAAM,cAAc,GAAG,IAAI,IAAI,IAAI,OAAO;AAC1C,UAAM,aAAa,oBAAoB,WAAW,IAAI;AACtD,UAAM,aAAa,MAAM;AAAA,MACvB,EAAE,MAAM,SAAS,IAAI,QAAQ;AAAA,MAC7B;AAAA,IACF;AAEA,QACE,YACC,MAAM,gBAAgB,EAAE,MAAM,SAAS,IAAI,QAAQ,GAAG,MAAM,GAC7D;AACA,UAAI,sBAAsB,IAAI,IAAI,GAAG;AACnC,eAAO,MAAM,eAAe,WAAW,WAAW;AAAA,MACpD;AACA,UAAI;AACF,cAAMA,IAAG,UAAUD,MAAK,QAAQ,UAAU,CAAC;AAC3C,cAAMC,IAAG,KAAK,YAAY,UAAU;AACpC,qBAAa,IAAI,MAAM,UAAU;AACjC;AAAA,MACF,QAAQ;AACN,eAAO,MAAM,kBAAkB,WAAW,qBAAqB;AAAA,MACjE;AAAA,IACF;AAEA,QAAI;AACF,YAAMA,IAAG,UAAUD,MAAK,QAAQ,UAAU,CAAC;AAC3C,YAAM,WACJ,QAAQ,IAAI,iBAAiB,WAAW,QAAQ,SAAS,KAAK;AAChE,YAAM;AAAA,QACJ,OAAO,QAAQ,aAAa,YAAY;AAAA,UACtC,GAAG;AAAA,UACH,OAAO;AAAA,QACT,CAAC;AAAA,QACD;AAAA,QACA,oCAAoC,8BAA8B,GAAI,MAAM,WAAW;AAAA,MACzF;AAEA,UAAI,sBAAsB,IAAI,IAAI,GAAG;AACnC,eAAO,MAAM,eAAe,WAAW,EAAE;AAAA,MAC3C;AAGA,UAAI,UAAU;AACZ,YAAI;AACF,gBAAMC,IAAG,UAAUD,MAAK,QAAQ,UAAU,CAAC;AAC3C,gBAAMC,IAAG,KAAK,YAAY,UAAU;AAAA,QACtC,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,mBAAa,IAAI,MAAM,UAAU;AAAA,IACnC,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,sBAAsB,WAAW,KAAK,KAAK,EAAE;AAAA,IAC/D;AAAA,EACF;AAGA,aAAW,aAAa,QAAQ;AAC9B,QAAI,eAAe,GAAG,UAAU,IAAI,IAAI,UAAU,OAAO;AAEzD,QAAI,CAACE,QAAO,MAAM,UAAU,OAAO,GAAG;AACpC,UAAI;AACF,cAAM,WAAW,MAAM;AAAA,UACrB,OAAO,SAAS,cAAc,SAAS;AAAA,UACvC;AAAA,UACA,6BAA6B,YAAY;AAAA,QAC3C;AACA,uBAAe,GAAG,UAAU,IAAI,IAAI,SAAS,OAAO;AAAA,MACtD,SAAS,OAAO;AACd,cAAM,IAAI;AAAA,UACR,uCAAuC,YAAY,KAAK,KAAK;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,eAAW,YAAY,UAAU,WAAW;AAC1C,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MACZ;AACA,UAAI;AACF,cAAMF,IAAG,UAAUD,MAAK,QAAQ,SAAS,CAAC;AAC1C,cAAM,WACJ,QAAQ,IAAI,iBAAiB,WAAW,QAAQ,SAAS,KAAK;AAChE,cAAM;AAAA,UACJ,OAAO,QAAQ,cAAc,WAAW;AAAA,YACtC,GAAG;AAAA,YACH,OAAO;AAAA,UACT,CAAC;AAAA,UACD;AAAA,UACA,sCAAsC,YAAY;AAAA,QACpD;AACA,eAAO,MAAM,WAAW,YAAY,UAAU,QAAQ,EAAE;AAAA,MAC1D,SAAS,OAAO;AACd,cAAM,IAAI;AAAA,UACR,4BAA4B,YAAY,QAAQ,QAAQ,KAAK,KAAK;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,cAAc,WAAW;AACpC;AAMA,eAAe,qBACb,KACA,QACiB;AACjB,QAAM,WAAW,WAAW,QAAQ,SAAS,UAAU;AACvD,QAAM,WAAW,MAAM,mBAAmB,IAAI,MAAM,IAAI,OAAO;AAC/D,SAAOA,MAAK,KAAK,UAAU,QAAQ;AACrC;AAEA,eAAe,gBACb,KACA,QACkB;AAClB,QAAM,aAAa,MAAM,qBAAqB,KAAK,MAAM;AACzD,SAAOC,IAAG,WAAW,UAAU;AACjC;AAEA,SAAS,4BAA4B,UAA2B;AAC9D,QAAM,aAAa,oBAAI,IAAsB;AAC7C,aAAW,OAAO,UAAU;AAC1B,QAAI,CAAC,WAAW,IAAI,IAAI,IAAI,EAAG,YAAW,IAAI,IAAI,MAAM,CAAC,CAAC;AAC1D,eAAW,IAAI,IAAI,IAAI,EAAG,KAAK,IAAI,OAAO;AAAA,EAC5C;AAEA,QAAM,YAAsB,CAAC;AAC7B,aAAW,CAAC,MAAM,QAAQ,KAAK,WAAW,QAAQ,GAAG;AACnD,UAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAC5C,QAAI,eAAe,SAAS,GAAG;AAC7B,gBAAU,KAAK,GAAG,IAAI,MAAM,eAAe,KAAK,IAAI,CAAC,GAAG;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,EAAgC,UAAU,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAG7E;AAAA,EACF;AACF;AAptBA,IAWa,6BAOA,aAgUP;AAlVN;AAAA;AAAA;AAMA;AAEA;AACA;AAEO,IAAM,8BAA8B;AAOpC,IAAM,cAAyB;AAAA,MACpC,UAAU;AAAA,MACV,cAAc;AAAA,MACd,OAAO;AAAA,IACT;AA4TA,IAAM,kBAAyD;AAAA,MAC7D,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,gBAAgB;AAAA,IAClB;AAAA;AAAA;;;ACvVA,SAAS,qBAAqB;AAE9B,YAAYM,WAAU;AACtB,YAAYC,SAAQ;AACpB,OAAO,eAAe;AA8BtB,eAAsB,aAAa,MAA0C;AAC3E,MAAI;AACF,UAAS,SAAK,KAAK,KAAK;AAAA,EAC1B,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,uCAAuC,KAAK,KAAK;AAAA,IAEnD;AAAA,EACF;AAMA,QAAM,WAAW,MAAS,aAAS,KAAK,IAAI;AAC5C,QAAM,iBAAiB,MAAM;AAAA,IAC3B,KAAK,iBAAiB,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAM,UAAU,CAAC,KAAK,OAAO,GAAG,cAAc;AAG9C,QAAM,EAAE,UAAU,QAAQ,IAAI,MAAM,cAAc,SAAS;AAAA,IACzD,MAAM;AAAA,EACR,CAAC;AAED,QAAM,aAAkB,cAAQ,KAAK,MAAM;AAC3C,MAAI,SAAS;AAEb,aAAW,QAAQ,UAAU;AAC3B,UAAM,SAAS,QAAQ,IAAI,IAAI;AAM/B,QAAI,QAAQ,QAAS;AAErB,UAAM,MAAW,cAAQ,YAAY,IAAI;AACzC,QAAI,CAAC,IAAI,WAAW,aAAkB,SAAG,KAAK,QAAQ,YAAY;AAChE,YAAM,IAAI;AAAA,QACR,2BAA2B,IAAI;AAAA,MAGjC;AAAA,IACF;AAEA,UAAM,MAAW,WAAK,UAAU,IAAI;AACpC,UAAS,UAAW,cAAQ,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,UAAS,aAAS,KAAK,GAAG;AAC1B,UAAM,IAAI,MAAS,SAAK,GAAG;AAC3B,QAAI,EAAE,OAAO,GAAO,OAAS,UAAM,KAAK,EAAE,IAAI;AAC9C;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,MAAM,KAAK,QAAQ,GAAG,QAAQ,QAAQ;AAC3D;AA0BO,SAAS,iBAAiB,MAA+B;AAC9D,QAAM,UAAU,KAAK,iBAAiB,OAAO,CAAC,QAAQ;AACpD,UAAM,WAAW,gBAAgB,GAAG;AACpC,WAAO,CAAC,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC;AAAA,EACxD,CAAC;AACD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,oDAAoD,QAAQ,KAAK,IAAI,CAAC;AAAA,IAIxE;AAAA,EACF;AACF;AA0BA,eAAe,oBACb,UACA,MACmB;AACnB,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAEnC,QAAM,WAAqB,CAAC;AAC5B,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,UAAU;AAC5B,QAAI,WAAW,KAAK,KAAK,EAAG,OAAM,KAAK,KAAK;AAAA,QACvC,UAAS,KAAK,KAAK;AAAA,EAC1B;AAEA,QAAM,mBAAmB,SAAS;AAAA,IAAI,CAAC,MAChC,iBAAW,CAAC,IAAI,IAAS,cAAQ,MAAM,CAAC;AAAA,EAC/C;AAEA,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,WAAW,MAAM,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;AAC9C,QAAM,eAAyB,CAAC;AAChC,QAAM,UAAU,MAAM,MAAM,OAAO,SAAS,YAAY;AAGtD,UAAM,WAAW,QAAQ,MAAW,SAAG,EAAE,KAAK,GAAG;AACjD,QAAI,SAAS,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG;AACrC,mBAAa,KAAK,OAAO;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO,CAAC,GAAG,kBAAkB,GAAG,YAAY;AAC9C;AASA,eAAe,UACb,MACA,KACA,OACe;AACf,MAAI;AACJ,MAAI;AACF,cAAU,MAAS,YAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACzD,QAAQ;AACN;AAAA,EACF;AACA,aAAW,SAAS,SAAS;AAC3B,UAAM,MAAW,WAAK,KAAK,MAAM,IAAI;AACrC,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,UAAU,MAAM,KAAK,KAAK;AAAA,IAClC,WAAW,MAAM,OAAO,GAAG;AACzB,YAAM,MAAM,KAAU,eAAS,MAAM,GAAG,CAAC;AAAA,IAC3C;AAAA,EACF;AACF;AAtNA,IAwIM;AAxIN;AAAA;AAAA;AAwIA,IAAM,aAAa;AAAA;AAAA;;;ACjInB,OAAOC,SAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;AA2B9B,SAAS,mBAAmB,QAAoC;AAC9D,SAAO,KAAK,UAAU;AAAA,IACpB,WAAW,CAAC,GAAG,OAAO,SAAS,EAAE,KAAK;AAAA,IACtC,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO,UAAU;AAAA,IACzB,eAAe,OAAO,iBAAiB;AAAA,IACvC,iBAAiB,OAAO,mBAAmB;AAAA,IAC3C,WAAW,OAAO,aAAa;AAAA,IAC/B,cAAc,OAAO;AAAA,EACvB,CAAC;AACH;AAOA,eAAe,oBACb,aACA,QACiB;AACjB,QAAM,cAAc,GAAG,WAAW;AAAA;AAAA,EAAU,mBAAmB,MAAM,CAAC;AACtE,SAAOA,eAAc,aAAa,EAAE;AACtC;AAKA,eAAsB,kBACpB,eACA,QACiB;AACjB,QAAM,WAAW,WAAW,QAAQ,SAAS,QAAQ;AACrD,QAAM,WAAW,MAAM,wBAAwB,aAAa;AAC5D,SAAOD,OAAK,KAAK,UAAU,GAAG,QAAQ,KAAK;AAC7C;AAKA,eAAsB,cACpB,eACA,QACkB;AAClB,QAAM,YAAY,MAAM,kBAAkB,eAAe,MAAM;AAC/D,SAAOD,IAAG,WAAW,SAAS;AAChC;AAKA,eAAsB,WACpB,eACA,aACA,QACe;AACf,QAAM,YAAY,MAAM,kBAAkB,eAAe,MAAM;AAC/D,QAAMA,IAAG,UAAUC,OAAK,QAAQ,SAAS,CAAC;AAC1C,QAAMD,IAAG,UAAU,WAAW,aAAa,OAAO;AACpD;AAKA,eAAsB,eACpB,eACA,QACwB;AACxB,QAAM,YAAY,MAAM,kBAAkB,eAAe,MAAM;AAE/D,MAAI,MAAMA,IAAG,WAAW,SAAS,GAAG;AAClC,WAAO,MAAMA,IAAG,SAAS,WAAW,OAAO;AAAA,EAC7C;AAEA,SAAO;AACT;AASA,eAAsB,iBACpB,aACA,QACA,QACiB;AACjB,QAAM,WAAW,WAAW,QAAQ,SAAS,MAAM;AACnD,QAAM,WAAW,MAAM,oBAAoB,aAAa,MAAM;AAC9D,SAAOC,OAAK,KAAK,UAAU,GAAG,QAAQ,KAAK;AAC7C;AAWA,eAAsB,UACpB,aACA,YACA,QACA,QACe;AACf,QAAM,YAAY,MAAM,iBAAiB,aAAa,QAAQ,MAAM;AACpE,QAAMD,IAAG,UAAUC,OAAK,QAAQ,SAAS,CAAC;AAC1C,QAAMD,IAAG,UAAU,WAAW,YAAY,OAAO;AACnD;AAEA,eAAsB,cACpB,aACA,QACA,QACwB;AACxB,QAAM,YAAY,MAAM,iBAAiB,aAAa,QAAQ,MAAM;AACpE,MAAI,MAAMA,IAAG,WAAW,SAAS,GAAG;AAClC,WAAOA,IAAG,SAAS,WAAW,OAAO;AAAA,EACvC;AACA,SAAO;AACT;AAQA,eAAsB,iBACpB,aACA,cACA,QACA,QACiB;AACjB,QAAM,WAAW,WAAW,QAAQ,SAAS,MAAM;AACnD,QAAM,WAAW,MAAM,oBAAoB,aAAa,MAAM;AAC9D,QAAM,YAAYC,OAAK,KAAK,UAAU,GAAG,QAAQ,MAAM;AAEvD,MAAI,CAAE,MAAMD,IAAG,WAAW,SAAS,GAAI;AACrC,UAAMA,IAAG,UAAUC,OAAK,QAAQ,SAAS,CAAC;AAC1C,UAAMD,IAAG,UAAU,WAAW,cAAc,OAAO;AAAA,EACrD;AAEA,SAAO;AACT;AA3LA;AAAA;AAAA;AAUA;AACA;AAAA;AAAA;;;ACXA,OAAO,YAAY;AACnB,OAAO,aAAa;AACpB,SAAS,sBAAsB;AAC/B,OAAOG,YAAU;AACjB,OAAOC,UAAQ;AAEf,SAAS,uBAAuB,yBAAyB;AAqJzD,SAAS,iBAAAC,sBAAqB;AA3I9B,SAAS,aAAa,MAAkC;AACtD,SACE,SAAS,QACT,OAAO,SAAS,YAChB,CAAC,MAAM,QAAQ,IAAI,KACnB,UAAU;AAEd;AAgBA,SAAS,eACP,MACA,SAC4B;AAC5B,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK;AAAA,EAChB;AACF;AAMA,SAAS,iBAAiB,MAAwB;AAChD,SAAO,aAAa,IAAI,KAAK,OAAO,SAAS;AAC/C;AAEA,SAAS,kBACP,MACA,MACA,KACM;AACN,QAAM,aAAa,CAAC,CAAC,IAAI;AACzB,QAAM,gBAAgB,aAAa,IAAI,IAAI;AAC3C,QAAM,UAAU,iBAAiB,IAAI,IAAI;AAGzC,MAAI,cAAc,eAAe;AAC/B,UAAM,IAAI;AAAA,MACR,GAAG,IAAI,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAGA,MAAI,CAAC,cAAc,CAAC,SAAS;AAC3B,UAAM,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,yCAAyC;AAAA,EAC3E;AACF;AAaA,SAAS,mBACP,QACA,QACA,KACA,OACA,mBACA,eACQ;AACR,QAAM,SAAS,OAAO,KAAK,QAAQ,UAAU,EAAE;AAC/C,QAAM,SAAS,OAAO,OAAO,OAAO,KAAK,QAAQ,UAAU,EAAE,IAAI;AACjE,QAAM,WAAW,OAAO,OAAO,UAAU,OAAO,IAAI,OAAO;AAC3D,QAAM,YACJ,SAAS,oBACL,GAAG,iBAAiB,KAAK,KAAK,UAAU,KAAK,CAAC,MAC9C;AAGN,MAAI,eAAe;AACjB,WAAO;AAAA;AAAA,UAED,QAAQ;AAAA,kBACA,KAAK,UAAU,UAAU,CAAC,CAAC,CAAC;AAAA,UACpC,SAAS,SAAS,MAAM,MAAM,EAAE;AAAA,gBAC1B,MAAM;AAAA;AAAA,gBAEN,KAAK,UAAU,UAAU,CAAC,CAAC,CAAC;AAAA,aAC/B,KAAK,UAAU,OAAO,CAAC,CAAC,CAAC,GAC9B,QACI;AAAA,QACJ,UAAU,MAAM,GAAG,EAAE,CAAC,KAClB,EACN;AAAA;AAAA,EAEJ;AAGA,SAAO;AAAA;AAAA,UAEC,QAAQ;AAAA;AAAA,UAER,SAAS,SAAS,MAAM,MAAM,EAAE;AAAA,gBAC1B,MAAM;AAAA;AAAA,gBAEN,KAAK,UAAU,UAAU,CAAC,CAAC,CAAC;AAAA,aAC/B,KAAK,UAAU,OAAO,CAAC,CAAC,CAAC,GAC9B,QACI;AAAA,QACJ,UAAU,MAAM,GAAG,EAAE,CAAC,KAClB,EACN;AAAA;AAEN;AAgCA,eAAsB,aACpB,UACA,WACA,WACA,QACe;AACf,aAAW,WAAW,UAAU;AAC9B,UAAM,aAAaF,OAAK,QAAQ,WAAW,OAAO;AAClD,UAAM,aAAaA,OAAK,SAAS,OAAO;AACxC,UAAM,WAAWA,OAAK,KAAK,WAAW,UAAU;AAGhD,UAAM,iBAAiBA,OAAK,QAAQ,SAAS;AAC7C,UAAM,iBAAiBA,OAAK,QAAQ,UAAU;AAC9C,QACE,mBAAmB,kBACnB,eAAe,WAAW,iBAAiBA,OAAK,GAAG,KACnD,eAAe,WAAW,iBAAiBA,OAAK,GAAG,GACnD;AACA,YAAM,IAAI;AAAA,QACR,+BAA+B,OAAO,kBAAkB,cAAc,2CAA2C,cAAc;AAAA,MACjI;AAAA,IACF;AAEA,QAAI,MAAMC,KAAG,WAAW,UAAU,GAAG;AACnC,YAAMA,KAAG,KAAK,YAAY,QAAQ;AAClC,aAAO,MAAM,UAAU,OAAO,YAAY;AAAA,IAC5C,OAAO;AACL,aAAO,KAAK,6BAA6B,OAAO,EAAE;AAAA,IACpD;AAAA,EACF;AACF;AAaA,SAAS,wBACP,cACA,cACA,cACQ;AACR,QAAM,iBAAiB;AAAA,IACrB,MAAM;AAAA,IACN,OAAO;AAAA,MACL,GAAG;AAAA;AAAA,MAEH,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACA,SAAO,KAAK,UAAU,cAAc;AACtC;AAEA,eAAsB,WACpB,cACA,cACA,QACA,YAAY,OACiB;AAC7B,QAAM,kBAAkB,KAAK,IAAI;AAGjC,QAAM,UAAU,OAAO,WAAW;AAClC,QAAM,WACJ,aAAa,WAAW,WAAW,QAAW,kBAAkB,OAAO,EAAE;AAC3E,QAAM,YAAY,aAAa,WAAW,WAAW;AAKrD,QAAM,YAAY,MAAM;AAAA,IACtB,aAAa,aAAa,QAAQ,IAAI;AAAA,EACxC;AAKA,QAAM,aAAaD,OAAK,QAAQ,aAAa,MAAM;AACnD,QAAM,eAAeA,OAAK,QAAQ,UAAU;AAQ5C,QAAMC,KAAG,OAAOD,OAAK,KAAK,cAAc,cAAc,CAAC;AACvD,QAAMC,KAAG,OAAOD,OAAK,KAAK,cAAc,cAAc,CAAC;AACvD,QAAMC,KAAG,OAAOD,OAAK,KAAK,cAAc,mBAAmB,CAAC;AAE5D,MAAI;AAEF,UAAMC,KAAG,UAAU,QAAQ;AAG3B,UAAM,oBACJ,OAAO,KAAK,aAAa,WAAW,CAAC,CAAC,EAAE,SAAS,KACjD,OAAO,KAAK,aAAa,gBAAgB,CAAC,CAAC,EAAE,SAAS;AAExD,QAAI,qBAAqB,CAAC,aAAa,SAAS,qBAAqB,GAAG;AACtE,mBAAa,SAAS,qBAAqB,IAAI,CAAC;AAAA,IAClD;AAGA,UAAM,eAAe,uBAAuB,YAAY;AACxD,eAAW,OAAO,cAAc;AAC9B,YAAM,cAAc,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,GAAG;AAE7D,UAAI,aAAa;AAGf,cAAM,UAAU,sBAAsB,GAAG;AACzC,YAAI,CAAC,aAAa,SAAS,OAAO,GAAG;AACnC,uBAAa,SAAS,OAAO,IAAI;AAAA,YAC/B,MAAM;AAAA,YACN,SAAS,CAAC,cAAc,OAAO,EAAE;AAAA,UACnC;AAAA,QACF;AAGA,mBAAW,WAAW;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,GAAY;AACV,gBAAM,QAAQ,eAAe,cAAc,OAAO;AAClD,cAAI,CAAC,MAAO;AACZ,qBAAW,QAAQ,OAAO,OAAO,KAAK,GAAG;AACvC,gBAAI,KAAK,YAAY,KAAK;AACxB,mBAAK,OAAO;AACZ,qBAAO,KAAK;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAAA,MACF,WAAW,CAAC,aAAa,SAAS,GAAG,GAAG;AACtC,qBAAa,SAAS,GAAG,IAAI,CAAC;AAAA,MAChC;AAAA,IACF;AAGA,WAAO,MAAM,sBAAsB;AAEnC,UAAM,gBAAgB,OAAO,QAAQ,aAAa,QAAQ,EAAE;AAAA,MAC1D,CAAC,CAAC,MAAM,aAAa,OAAO;AAAA,QAC1B;AAAA,QACA,SAAS,cAAc,WAAW;AAAA,QAClC,MAAM,cAAc;AAAA;AAAA,MACtB;AAAA,IACF;AAKA,UAAM,EAAE,cAAc,YAAY,iBAAiB,IACjD,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA;AAAA,MACb;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAMF,UAAM,4BAA4B,oBAAI,IAAY;AAClD,eAAW,CAAC,SAAS,OAAO,KAAK,aAAa,QAAQ,GAAG;AACvD,YAAM,cAAcD,OAAK,KAAK,SAAS,cAAc;AACrD,UAAI;AACJ,UAAI;AACF,kBAAU,MAAMC,KAAG,SAAS,WAAW;AAAA,MACzC,QAAQ;AACN;AAAA,MACF;AAEA,YAAM,gBAAgB,QAAQ;AAC9B,UACE,iBACA,OAAO,kBAAkB,YACzB,CAAC,MAAM,QAAQ,aAAa,GAC5B;AACA,cAAM,cAAe,cAA0C;AAC/D,YACE,eACA,OAAO,gBAAgB,YACvB,CAAC,MAAM,QAAQ,WAAW,KAC1B,CAAC,0BAA0B,IAAI,OAAO,GACtC;AACA,oCAA0B,IAAI,OAAO;AACrC,gBAAM,OAAO,OAAO,KAAK,WAAsC,EAC5D,KAAK,EACL,KAAK,IAAI;AACZ,iBAAO;AAAA,YACL,qBAAqB,OAAO,mCAAmC,IAAI;AAAA,UACrE;AAAA,QACF;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW,YAAY,GAAG;AAEpC,cAAM,eAAe,QAAQ;AAC7B,cAAM,cAAc,QAAQ;AAC5B,YAAI,CAAC,gBAAgB,OAAO,gBAAgB,UAAU;AACpD,kBAAQ,UAAU;AAAA,YAChB,KAAK;AAAA,cACH,QAAQ;AAAA,cACR,SAAS,QAAQ;AAAA,YACnB;AAAA,UACF;AACA,gBAAMA,KAAG,UAAU,aAAa,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAQA,UAAM,iBAAiB,CAAC,GAAG,iBAAiB,SAAS,QAAQ,CAAC,EAC3D,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EACrC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,OAAO,EAAE;AAC5C,UAAM,eAAe,MAAMC,eAAc,eAAe,KAAK,IAAI,GAAG,EAAE;AAQtE,UAAM,2BAA2B,OAAO,KAAK,aAAa,QAAQ,EAAE;AAAA,MAClE,CAAC,SAAS,CAAC,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG;AAAA,IACzD;AAIA,QAAI,aAAa,UAAU,OAAO;AAChC,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,cAAc,eAAe,SAAS;AAC3D,UAAI,QAAQ;AACV,cAAM,cAAc,MAAM,eAAe,eAAe,SAAS;AACjE,YAAI,aAAa;AACf,iBAAO,MAAM,oBAAoB;AAEjC,gBAAMD,KAAG,UAAUD,OAAK,QAAQ,UAAU,CAAC;AAC3C,gBAAMC,KAAG,UAAU,YAAY,WAAW;AAE1C,cAAI,aAAa,aAAa,QAAQ;AAGpC,kBAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAIA,gBAAME,SAAQ,MAAMF,KAAG,KAAK,UAAU;AACtC,gBAAMG,WAAUD,OAAM,OAAO,MAAM,QAAQ,CAAC;AAC5C,iBAAO,KAAK,WAAW,UAAU,KAAKC,OAAM,cAAc;AAE1D,cAAI,WAAW;AACb,kBAAM,eAAe,OAAO,QAAQ,aAAa,QAAQ,EAAE;AAAA,cACzD,CAAC,CAAC,MAAM,GAAG,OAAO;AAAA,gBAChB,MAAM,GAAG,IAAI,IAAI,IAAI,WAAW,QAAQ;AAAA,gBACxC,MAAM;AAAA;AAAA,cACR;AAAA,YACF;AACA,kBAAM,qBAAqB,gCAAgC;AAAA,cACzD,aAAa,QAAQ;AAAA,YACvB;AACA,mBAAO;AAAA,cACL,WAAWD,OAAM;AAAA,cACjB,UAAU;AAAA,cACV,WAAW,KAAK,IAAI,IAAI;AAAA,cACxB,sBAAsB,CAAC;AAAA,YACzB;AAAA,UACF;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAIA,UAAM,kBAAkBH,OAAK,KAAK,UAAU,cAAc;AAC1D,UAAMC,KAAG;AAAA,MACP;AAAA,MACA,KAAK,UAAU,EAAE,MAAM,SAAS,GAAG,MAAM,CAAC;AAAA,IAC5C;AAGA,WAAO,MAAM,sBAAsB;AACnC,UAAM,EAAE,WAAW,aAAa,QAAQ,IAAI,MAAM;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAIA,UAAMA,KAAG,UAAUD,OAAK,QAAQ,UAAU,CAAC;AAW3C,UAAM,gBAAoC;AAAA,MACxC,WAAW,oBAAI,IAAI;AAAA,MACnB,UAAU,aAAa,aAAa,SAAS,SAAS;AAAA,MACtD,QAAQ,cAAc,YAAY;AAAA,MAClC,WAAW,SAAS,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAAA,MAC3D,QAAQ,aAAa;AAAA,MACrB,QAAQ,aAAa;AAAA,MACrB,eAAe,aAAa;AAAA,MAC5B,iBAAiB,aAAa;AAAA,MAC9B,WAAW,aAAa;AAAA,MACxB;AAAA,IACF;AAGA,QAAI,eAA8B;AAClC,QAAI,aAAa,UAAU,OAAO;AAChC,qBAAe,MAAM,cAAc,WAAW,WAAW,aAAa;AAAA,IACxE;AAEA,QAAI,cAAc;AAChB,aAAO,MAAM,iDAAiD;AAAA,IAChE,OAAO;AAEL,aAAO;AAAA,QACL,4BAA4B,aAAa,UAAU,QAAQ,aAAa,aAAa,MAAM;AAAA,MAC7F;AACA,YAAM,YAAYA,OAAK,KAAK,UAAU,UAAU;AAChD,YAAMC,KAAG,UAAU,WAAW,SAAS;AAMvC,YAAM,iBAAiB;AAAA,QACrB,EAAE,GAAG,cAAc,QAAQ,MAAM;AAAA,QACjC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI;AACF,cAAM,QAAQ,MAAM,cAAc;AAAA,MACpC,SAAS,YAAY;AAEnB,cAAM;AAAA,UACJ;AAAA,UACA,aAAa,QAAQ;AAAA,QACvB;AAAA,MACF,UAAE;AAEA,cAAM,QAAQ,KAAK;AAAA,MACrB;AAEA,qBAAe,MAAMA,KAAG,SAAS,YAAY,OAAO;AAGpD,UAAI,aAAa,UAAU,OAAO;AAChC,cAAM,UAAU,WAAW,cAAc,WAAW,aAAa;AAAA,MACnE;AAAA,IACF;AAGA,UAAM,aAAa,MAAM;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,aAAa,eAAe,CAAC,SAAS;AAExC,YAAM,kBAAkB,wBAAwB,WAAW;AAAA;AAE3D,YAAM,SACJ,aAAa,aAAa,SACtB;AAAA,IACA;AACN,YAAM,YAAY,GAAG,MAAM,GAAG,YAAY;AAAA,EAAK,eAAe;AAC9D,YAAMA,KAAG,UAAU,YAAY,SAAS;AAAA,IAC1C,OAAO;AAEL,YAAM,eACH,aAAa,YAAY,YAAY,YAClC,iBAAiB,YAAY,aAAa;AAAA,QACxC,iBAAiB,aAAa;AAAA,QAC9B,WAAW,aAAa;AAAA,QACxB,UAAU,aAAa;AAAA,MACzB,CAAC,IACD,oBAAoB,YAAY,WAAW;AAEjD,YAAM,kBAAkBD,OAAK,KAAK,UAAU,YAAY;AACxD,YAAMC,KAAG,UAAU,iBAAiB,WAAW;AAG/C,YAAM,gBAAsC;AAAA,QAC1C,aAAa,CAAC,eAAe;AAAA,QAC7B,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,aAAa;AAAA,QACvB,SAAS;AAAA,QACT,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ,aAAa;AAAA,QACrB,GAAI,aAAa,UAAU;AAAA,UACzB,kBAAkB,aAAa,eAAe,cAAc;AAAA,UAC5D,mBAAmB,aAAa,eAAe,eAAe;AAAA,UAC9D,cAAc,aAAa,eAAe,UAAU;AAAA,UACpD,eAAe,aAAa,eAAe,iBAAiB;AAAA,UAC5D,SAAS;AAAA,QACX;AAAA,MACF;AAGA,UAAI,aAAa,aAAa,WAAW;AACvC,sBAAc,SAAS;AAAA,UACrB,wBAAwB;AAAA,UACxB,QAAQ;AAAA,QACV;AACA,sBAAc,SAAS,cAAc,YAAY;AAAA,MACnD,OAAO;AAML,sBAAc,WAAW;AAAA,UACvB,GAAG,iBAAiB;AAAA,UACpB,GAAG;AAAA,QACL;AACA,sBAAc,SAAS;AAAA,UACrB,IAAI;AAAA,QACN;AACA,sBAAc,SAAS,cAAc,YAAY;AAAA,MACnD;AAEA,UAAI;AACF,cAAM,QAAQ,MAAM,aAAa;AAAA,MACnC,UAAE;AACA,cAAM,QAAQ,KAAK;AAAA,MACrB;AAAA,IACF;AAGA,UAAM,cAAc,MAAMA,KAAG,KAAK,UAAU;AAC5C,UAAM,UAAU,YAAY,OAAO,MAAM,QAAQ,CAAC;AAClD,UAAM,cAAc,KAAK,IAAI,IAAI,mBAAmB,KAAM,QAAQ,CAAC;AACnE,WAAO,KAAK,WAAW,UAAU,KAAK,MAAM,QAAQ,SAAS,IAAI;AAGjE,QAAI,aAAa,UAAU,OAAO;AAChC,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,cAAc,MAAMA,KAAG,SAAS,YAAY,OAAO;AACzD,YAAM,WAAW,eAAe,aAAa,SAAS;AACtD,aAAO,MAAM,6BAA6B;AAAA,IAC5C;AAEA,QAAI,aAAa,aAAa,QAAQ;AAGpC,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAKA,QAAI;AACJ,QAAI,WAAW;AACb,cAAQ,MAAM;AAAA,QACZ;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa,WAAW,aAAa,QAAQ,SAAS,GAAG;AAC3D,YAAM,YAAYD,OAAK,QAAQ,UAAU;AACzC,YAAM;AAAA,QACJ,aAAa;AAAA,QACb,aAAa,aAAa,QAAQ,IAAI;AAAA,QACtC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM;AAAA,EACR,UAAE;AAEA,QAAI,CAAC,aAAa,SAAS;AACzB,MAAAC,KAAG,OAAO,QAAQ,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACpC;AAAA,EACF;AACF;AAEA,eAAe,mBACb,YACA,UACA,WACA,cACsB;AACtB,QAAM,QAAQ,MAAMA,KAAG,KAAK,UAAU;AACtC,QAAM,YAAY,MAAM;AACxB,QAAM,YAAY,KAAK,IAAI,IAAI;AAG/B,QAAM,eAAe,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM;AACjE,UAAM,gBAAgB,IAAI,OAAO,eAAe,IAAI,QAAQ,GAAG;AAC/D,UAAM,qBAAqB,IAAI;AAAA,MAC7B,wCAAwC,IAAI;AAAA,MAC5C;AAAA,IACF;AACA,UAAM,aACJ,cAAc,KAAK,YAAY,KAAK,mBAAmB,KAAK,YAAY;AAG1E,UAAM,gBAAgB,OAAO,KAAK,QAAQ,EAAE;AAC5C,UAAM,gBAAgB,aAClB,KAAK,MAAM,YAAY,aAAa,IACpC;AAEJ,WAAO;AAAA,MACL,MAAM,GAAG,IAAI,IAAI,IAAI,WAAW,QAAQ;AAAA,MACxC,MAAM;AAAA,IACR;AAAA,EACF,CAAC;AAGD,QAAM,qBAAqB,gCAAgC,KAAK,YAAY;AAC5E,QAAM,uBAAuB,CAAC;AAE9B,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;AAQA,SAAS,cAAc,cAAoC;AACzD,SACE,aAAa,WACZ,aAAa,aAAa,SAAS,WAAW;AAEnD;AAEA,SAAS,qBACP,cACA,WACA,YACA,SACA,cACA,QACA,uBAAiC,CAAC,GACZ;AAGtB,QAAM,QAAgC,CAAC;AAEvC,QAAM,cAAoC;AAAA,IACxC,aAAa,CAAC,SAAS;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ;AAAA;AAAA,IACR,UAAU,aAAa;AAAA,IACvB,SAAS;AAAA,IACT,eAAe;AAAA;AAAA;AAAA,IAEf,YAAY,CAAC,UAAU,MAAM;AAAA;AAAA,IAC7B,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ,aAAa;AAAA,IACrB,WAAW,aAAa;AAAA,IACxB,mBAAmB,CAAC,QAAQ,OAAO,OAAO,OAAO;AAAA;AAAA;AAAA,IAGjD,GAAI,aAAa,UAAU;AAAA,MACzB,kBAAkB,aAAa,eAAe,cAAc;AAAA,MAC5D,mBAAmB,aAAa,eAAe,eAAe;AAAA,MAC9D,cAAc,aAAa,eAAe,UAAU;AAAA,MACpD,eAAe,aAAa,eAAe,iBAAiB;AAAA,MAC5D,WAAW,aAAa,eAAe,aAAa;AAAA,MACpD,SAAS;AAAA,IACX;AAAA,EACF;AAGA,MAAI,aAAa,aAAa,WAAW;AACvC,gBAAY,SAAS;AAAA,MACnB,wBAAwB;AAAA,MACxB,QAAQ;AAAA,IACV;AAEA,gBAAY,WAAW,aAAa,YAAY,CAAC;AAAA,EACnD,WAAW,aAAa,aAAa,QAAQ;AAS3C,UAAM,gBAAgB,iBAAiB;AACvC,UAAM,iBAAiB,CAAC,eAAe,oBAAoB;AAC3D,QAAI,aAAa,SAAU,gBAAe,KAAK,aAAa,QAAQ;AACpE,gBAAY,WAAW,eAAe,KAAK;AAAA,EAI7C;AAIA,cAAY,SAAS,cAAc,YAAY;AAE/C,SAAO;AACT;AAUO,SAAS,mBACd,cACA,SACa;AACb,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,QAAQ,eAAe,cAAc,OAAO;AAElD,MAAI,OAAO;AACT,eAAW,CAAC,EAAE,UAAU,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,UAAI,OAAO,eAAe,YAAY,eAAe,KAAM;AAE3D,UAAI,OAAO,WAAW,YAAY,UAAU;AAC1C,iBAAS,IAAI,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAOO,SAAS,mBAA6B;AAC3C,QAAM,YAAsB,CAAC;AAC7B,aAAW,OAAO,gBAAgB;AAChC,QAAI,IAAI,WAAW,GAAG,EAAG;AACzB,cAAU,KAAK,KAAK,QAAQ,GAAG,IAAI,GAAG,GAAG,MAAM,QAAQ,GAAG,IAAI;AAAA,EAChE;AACA,SAAO;AACT;AAkBA,eAAe,iBACb,YACA,cACA,cACA,SACA,kBACA,QACe;AACf,QAAM,SAASD,OAAK,QAAQ,UAAU;AAMtC,QAAM,oBAA8B;AAAA,IAClC,GAAI,aAAa,QAAQ,QAAQ,gBAAgB,CAAC;AAAA,IAClD,GAAI,aAAa,gBAAgB,CAAC;AAAA,EACpC;AAMA,QAAM,cAAcA,OAAK,KAAK,SAAS,gBAAgB;AACvD,QAAMC,KAAG,SAAS,YAAY,WAAW;AAEzC,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,aAAa;AAAA,MAC1B,OAAO;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAAA,EACH,UAAE;AAGA,UAAMA,KAAG,OAAO,WAAW,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC7C;AAMA,QAAM,YAAYD,OAAK,SAAS,MAAMC,KAAG,SAAS,OAAO,GAAG,WAAW;AACvE,QAAM,kBAAkB,OAAO,SAAS,OAAO,CAAC,MAAM,MAAM,SAAS;AACrE,QAAMA,KAAG,OAAOD,OAAK,KAAK,QAAQ,SAAS,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAO5D,MAAI,iBAAiB,SAAS,GAAG;AAC/B,qBAAiB;AAAA,MACf,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,uBAAuB,YAAY;AACxD,QAAM,eAAuC,CAAC;AAC9C,aAAW,QAAQ,CAAC,GAAG,YAAY,EAAE,KAAK,GAAG;AAC3C,QAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,EAAG;AAClD,iBAAa,IAAI,IAAI;AAAA,EACvB;AAEA,QAAM,cAAcA,OAAK,KAAK,QAAQ,cAAc;AACpD,QAAMC,KAAG;AAAA,IACP;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,EAAE;AAAA,EACd;AACA,SAAO;AAAA,IACL,qBAAqB,OAAO,MAAM,mBAAmB,WAAW;AAAA,EAClE;AACF;AAMO,SAAS,uBAAuB,cAAiC;AACtE,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,WAAW,UAAU;AAC9B,eAAW,OAAO,mBAAmB,cAAc,OAAO,GAAG;AAC3D,kBAAY,IAAI,GAAG;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,0BACd,cAC0B;AAC1B,QAAM,sBAAsB,oBAAI,IAAyB;AAGzD,QAAM,eAAe,aAAa;AAElC,MAAI,cAAc;AAChB,eAAW,CAAC,EAAE,UAAU,KAAK,OAAO,QAAQ,YAAY,GAAG;AACzD,UACE,OAAO,WAAW,YAAY,YAC9B,OAAO,WAAW,SAAS,UAC3B;AAGA,cAAM,kBAAkB,WAAW,KAAK,WAAW,GAAG;AACtD,YAAI,CAAC,iBAAiB;AACpB,cAAI,CAAC,oBAAoB,IAAI,WAAW,OAAO,GAAG;AAChD,gCAAoB,IAAI,WAAW,SAAS,oBAAI,IAAI,CAAC;AAAA,UACvD;AACA,8BAAoB,IAAI,WAAW,OAAO,EAAG,IAAI,WAAW,IAAI;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAU,aAAa;AAE7B,MAAI,SAAS;AACX,eAAW,CAAC,EAAE,YAAY,KAAK,OAAO,QAAQ,OAAO,GAAG;AACtD,UACE,OAAO,aAAa,YAAY,YAChC,OAAO,aAAa,SAAS,UAC7B;AAGA,cAAM,kBAAkB,aAAa,KAAK,WAAW,GAAG;AACxD,YAAI,CAAC,iBAAiB;AACpB,cAAI,CAAC,oBAAoB,IAAI,aAAa,OAAO,GAAG;AAClD,gCAAoB,IAAI,aAAa,SAAS,oBAAI,IAAI,CAAC;AAAA,UACzD;AACA,8BAAoB,IAAI,aAAa,OAAO,EAAG,IAAI,aAAa,IAAI;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAe,aAAa;AAElC,MAAI,cAAc;AAChB,eAAW,CAAC,EAAE,iBAAiB,KAAK,OAAO,QAAQ,YAAY,GAAG;AAChE,UACE,OAAO,kBAAkB,YAAY,YACrC,OAAO,kBAAkB,SAAS,UAClC;AAEA,cAAM,kBAAkB,kBAAkB,KAAK,WAAW,GAAG;AAC7D,YAAI,CAAC,iBAAiB;AACpB,cAAI,CAAC,oBAAoB,IAAI,kBAAkB,OAAO,GAAG;AACvD,gCAAoB,IAAI,kBAAkB,SAAS,oBAAI,IAAI,CAAC;AAAA,UAC9D;AACA,8BACG,IAAI,kBAAkB,OAAO,EAC7B,IAAI,kBAAkB,IAAI;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAAS,aAAa;AAE5B,MAAI,QAAQ;AACV,eAAW,CAAC,EAAE,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AACpD,UACE,OAAO,YAAY,YAAY,YAC/B,OAAO,YAAY,SAAS,UAC5B;AACA,cAAM,kBAAkB,YAAY,KAAK,WAAW,GAAG;AACvD,YAAI,CAAC,iBAAiB;AACpB,cAAI,CAAC,oBAAoB,IAAI,YAAY,OAAO,GAAG;AACjD,gCAAoB,IAAI,YAAY,SAAS,oBAAI,IAAI,CAAC;AAAA,UACxD;AACA,8BAAoB,IAAI,YAAY,OAAO,EAAG,IAAI,YAAY,IAAI;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAWA,eAAe,yBACb,UACA,qBACA,gBACA,qBACA,eACA,qBACA,cACA,SACiC;AACjC,QAAM,mBAA6B,CAAC;AACpC,QAAM,eAAe,oBAAI,IAAI;AAAA,IAC3B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL,CAAC;AAED,aAAW,CAAC,aAAa,aAAa,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnE,UAAM,uBAAuB,aAAa,IAAI,WAAW;AACzD,UAAM,kBAAkB,oBAAoB,IAAI,WAAW;AAG3D,UAAM,yBAAmC,CAAC;AAI1C,QAAI,wBAAwB,CAAC,iBAAiB;AAC5C,YAAM,UAAU,sBAAsB,WAAW;AACjD,uBAAiB,KAAK,UAAU,OAAO,UAAU,WAAW,IAAI;AAAA,IAClE;AAGA,QAAI,iBAAiB;AACnB,YAAM,QAAQ,MAAM,KAAK,oBAAoB,IAAI,WAAW,CAAE;AAC9D,6BAAuB,KAAK,GAAG,KAAK;AAAA,IACtC;AAGA,QAAI,cAAc,WAAW,cAAc,QAAQ,SAAS,GAAG;AAC7D,YAAM,gBAAgB,CAAC,GAAG,IAAI,IAAI,cAAc,OAAO,CAAC;AAGxD,iBAAW,OAAO,eAAe;AAC/B,YAAI,IAAI,WAAW,aAAa,GAAG;AAEjC,cAAI,CAAC,wBAAwB,iBAAiB;AAC5C,kBAAM,oBAAoB,IAAI,QAAQ,eAAe,EAAE;AACvD,6BAAiB;AAAA,cACf,UAAU,iBAAiB,UAAU,WAAW;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AAEL,cAAI,CAAC,uBAAuB,SAAS,GAAG,GAAG;AACzC,mCAAuB,KAAK,GAAG;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QACE,gBAAgB,yBAChB,CAAC,uBAAuB,SAAS,WAAW,GAC5C;AACA,6BAAuB,KAAK,WAAW;AAAA,IACzC;AAGA,QAAI,uBAAuB,SAAS,GAAG;AACrC,YAAM,aAAa,uBAAuB,KAAK,IAAI;AACnD,uBAAiB,KAAK,YAAY,UAAU,YAAY,WAAW,IAAI;AAAA,IACzE;AAAA,EAGF;AAQA,QAAM,mBAA6B,CAAC;AACpC,MAAI,SAAS;AACX,eAAW,eAAe,cAAc;AACtC,YAAM,YAAY,aAAa,IAAI,WAAW;AAC9C,UAAI,CAAC,UAAW;AAEhB,UAAI;AACF,cAAM,cAAcD,OAAK,KAAK,WAAW,cAAc;AACvD,cAAM,UAAU,MAAMC,KAAG,SAAS,WAAW;AAC7C,cAAM,UAAU,QAAQ;AACxB,YAAI,WAAW,OAAO,YAAY,YAAY,WAAW,SAAS;AAChE,gBAAM,UAAU,SAAS,sBAAsB,WAAW,CAAC;AAC3D,2BAAiB;AAAA,YACf,eAAe,OAAO,UAAU,WAAW;AAAA,UAC7C;AACA,2BAAiB,KAAK,IAAI,WAAW,MAAM,OAAO,EAAE;AAAA,QACtD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,kBAAkB,iBAAiB;AAC9C;AAUO,SAAS,uBACd,YACA,SACM;AACN,aAAW,QAAQ,OAAO,KAAK,UAAU,GAAG;AAC1C,QAAI,CAAC,oBAAoB,KAAK,IAAI,GAAG;AACnC,YAAM,IAAI;AAAA,QACR,WAAW,OAAO,UAAU,IAAI,mEAAmE,KAAK,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC,CAAC;AAAA,MACzJ;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,wBACP,cACA,UACM;AACN,QAAM,OAAiD,CAAC;AAExD,WAAS,YAAY,KAAcD,QAAc;AAC/C,QAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,SAAS,GAAG;AACxD,WAAK,KAAK,EAAE,KAAK,IAAI,MAAM,CAAC,GAAG,UAAUA,OAAK,CAAC;AAC/C;AAAA,IACF;AACA,QAAI,QAAQ,QAAQ,OAAO,QAAQ,SAAU;AAI7C,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,kBAAY,KAAK,GAAGA,MAAI,IAAI,GAAG,EAAE;AAAA,IACnC;AAAA,EACF;AAGA,QAAM,aAAa;AAAA,IACjB,SAAS,aAAa,WAAW,CAAC;AAAA,IAClC,cAAc,aAAa,gBAAgB,CAAC;AAAA,IAC5C,cAAc,aAAa,gBAAgB,CAAC;AAAA,EAC9C;AACA,aAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC9D,eAAW,CAAC,IAAI,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AACxD,kBAAY,WAAW,GAAG,OAAO,IAAI,EAAE,EAAE;AAAA,IAC3C;AAAA,EACF;AAEA,aAAW,EAAE,KAAK,SAAS,KAAK,MAAM;AACpC,QAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACtB,YAAM,YACJ,SAAS,OAAO,IACZ,qBAAqB,MAAM,KAAK,QAAQ,EAAE,KAAK,IAAI,CAAC,KACpD;AACN,YAAM,IAAI;AAAA,QACR,2BAA2B,GAAG,QAAQ,QAAQ,kBAAa,GAAG,gBAAgB,SAAS;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AACF;AAMA,eAAsB,iBACpB,cACA,cACA,cACuE;AAEvE,QAAM,iBAAiB,mBAAmB,cAAc,SAAS;AACjE,QAAM,sBAAsB,mBAAmB,cAAc,cAAc;AAC3E,QAAM,sBAAsB,mBAAmB,cAAc,cAAc;AAC3E,QAAM,gBAAgB,mBAAmB,cAAc,QAAQ;AAC/D,QAAM,sBAAsB,0BAA0B,YAAY;AAGlE,QAAM,WAAW,IAAI,IAAI,OAAO,KAAK,aAAa,UAAU,CAAC,CAAC,CAAC;AAC/D,0BAAwB,cAAc,QAAQ;AAG9C,MAAI,aAAa;AACf,2BAAuB,aAAa,SAAS,SAAS;AACxD,MAAI,aAAa;AACf,2BAAuB,aAAa,cAAc,cAAc;AAClE,MAAI,aAAa;AACf,2BAAuB,aAAa,cAAc,cAAc;AAClE,MAAI,aAAa;AACf,2BAAuB,aAAa,QAAQ,QAAQ;AAOtD,QAAM,UACJ,aAAa,YAAY,SACrB,aAAa,YAAY,OACzB,aAAa,gBAAgB;AACnC,QAAM,EAAE,kBAAkB,iBAAiB,IAAI,MAAM;AAAA,IACnD,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cAAc,iBAAiB,KAAK,IAAI;AAC9C,QAAM,UACJ,OAAO,OAAO,aAAa,WAAW,CAAC,CAAC,EAAE;AAAA,IACxC,CAAC,MAAM,EAAE,WAAW,iBAAiB,EAAE,IAAI;AAAA,EAC7C,KACA,OAAO,OAAO,aAAa,gBAAgB,CAAC,CAAC,EAAE;AAAA,IAC7C,CAAC,MAAM,EAAE,WAAW,iBAAiB,EAAE,IAAI;AAAA,EAC7C;AAGF,MAAI,CAAC,SAAS;AACZ,UAAM,WAAW,aAAa,QAAQ;AACtC,WAAO;AAAA,MACL,WAAW,cAAc,GAAG,WAAW;AAAA;AAAA,EAAO,QAAQ,KAAK;AAAA,MAC3D,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAGA,QAAM,EAAE,mBAAmB,kBAAkB,YAAY,IACvD,uBAAuB,cAAc,mBAAmB;AAG1D,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,aAAa,QAAQ;AAAA,EACvB;AAGA,QAAM,kBACJ,iBAAiB,SAAS,IACtB;AAAA;AAAA,IAAsC,iBAAiB,KAAK,OAAO,CAAC;AAAA,MACpE;AAGN,QAAM,aAAa,mBAAmB;AACtC,QAAM,YAAY,cACd,GAAG,WAAW;AAAA;AAAA,EAAO,UAAU,KAC/B;AAEJ,SAAO,EAAE,WAAW,aAAa,SAAS,KAAK;AACjD;AAcA,SAAS,iBAAiB,YAA0B,MAAqB;AACvE,MAAI,CAAC,WAAW,UAAU,WAAW,OAAO,WAAW,GAAG;AACxD,WAAO,IAAI,MAAM,iBAAiB,WAAW,WAAW,UAAU,EAAE;AAAA,EACtE;AAEA,QAAM,aAAa,WAAW,OAAO,CAAC;AACtC,QAAM,WAAW,WAAW;AAE5B,MAAI,YAAY,SAAS,QAAQ,SAAS,KAAK,SAAS,UAAU,GAAG;AAEnE,UAAM,OAAO,SAAS;AACtB,UAAM,SAAS,SAAS;AACxB,UAAM,YAAY,KAAK,MAAM,IAAI;AACjC,UAAM,YAAY,UAAU,OAAO,CAAC,KAAK;AAEzC,WAAO,IAAI;AAAA,MACT,6BAA6B,IAAI,YAAY,MAAM;AAAA,IAC5C,SAAS;AAAA,IACT,IAAI,OAAO,SAAS,CAAC,CAAC;AAAA,EACxB,WAAW,IAAI;AAAA,IACtB;AAAA,EACF;AAGA,SAAO,IAAI;AAAA,IACT,gBAAgB,WAAW,IAAI;AAAA,KAC5B,WACG,QAAQ,SAAS,IAAI,IAAI,SAAS,IAAI,IAAI,SAAS,MAAM,KACzD;AAAA,EACR;AACF;AAWO,SAAS,uBACd,cACA,qBAKA;AACA,QAAM,UAAU,aAAa,WAAW,CAAC;AACzC,QAAM,eAAe,aAAa,gBAAgB,CAAC;AACnD,QAAM,eAAe,aAAa,gBAAgB,CAAC;AACnD,QAAM,SAAS,aAAa,UAAU,CAAC;AAGvC,QAAM,iBAA0D,CAAC;AAUjE,WAAS,eAAe,MAAwB;AAE9C,QAAI,KAAK,QAAQ,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,SAAS;AAC/D,aAAO,KAAK;AAAA,IACd;AACA,QACE,KAAK,QACL,OAAO,KAAK,SAAS,YACrB,KAAK,WACL,oBAAoB,IAAI,KAAK,OAAO,GACpC;AACA,aAAO,KAAK;AAAA,IACd;AACA,WAAO,sBAAsB,KAAK,OAAQ;AAAA,EAC5C;AAGA,WAAS,aAAa,MAAyC;AAC7D,UAAM,QAAiC,CAAC;AACxC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,UAAI,QAAQ,UAAU,QAAQ,UAAW;AACzC,UAAI,UAAU,UAAa,UAAU,MAAM;AACzC,cAAM,GAAG,IAAI;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,WAAS,oBACP,SACA,QACA,MACQ;AACR,UAAM,UAAU,eAAe,IAAI;AACnC,UAAM,YAAY,aAAa,IAAI;AACnC,UAAM,EAAE,WAAW,UAAU,IAAI,uBAAuB,SAAS;AAEjE,UAAM,cAAwB,CAAC;AAC/B,gBAAY,KAAK,SAAS,OAAO,EAAE;AAGnC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,UAAI,QAAQ,OAAQ;AACpB,kBAAY,KAAK,GAAG,GAAG,KAAK,mBAAmB,KAAK,CAAC,EAAE;AAAA,IACzD;AAGA,eAAW,OAAO,OAAO,KAAK,SAAS,GAAG;AACxC,kBAAY,KAAK,GAAG,GAAG,YAAY,OAAO,IAAI,MAAM,IAAI,GAAG,EAAE;AAAA,IAC/D;AAGA,QAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACrC,UAAI,CAAC,eAAe,OAAO,EAAG,gBAAe,OAAO,IAAI,CAAC;AACzD,qBAAe,OAAO,EAAE,MAAM,IAAI;AAAA,IACpC;AAEA,WAAO,OAAO,MAAM;AAAA,QAAc,YAAY,KAAK,WAAW,CAAC;AAAA;AAAA,EACjE;AAGA,SAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,MAAM,MAAM,MAAM;AAClD,sBAAkB,UAAU,MAAM,MAAM;AAAA,EAC1C,CAAC;AACD,SAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,MAAM,IAAI,MAAM;AACrD,sBAAkB,eAAe,MAAM,IAAI;AAAA,EAC7C,CAAC;AACD,SAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,MAAM,WAAW,MAAM;AAC5D,sBAAkB,eAAe,MAAM,WAAW;AAAA,EACpD,CAAC;AAGD,QAAM,iBAAiB,OAAO,QAAQ,OAAO,EAC1C,OAAO,CAAC,CAAC,EAAE,MAAM,MAAM,OAAO,WAAW,iBAAiB,OAAO,IAAI,CAAC,EACtE,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM;AACtB,QAAI,aAAa,OAAO,IAAI,GAAG;AAC7B,aAAO,OAAO,GAAG,KAAK,mBAAmB,OAAO,MAAO,OAAO,UAAqB,CAAC,GAAG,OAAO,KAAe,OAAO,MAAuC,MAAM,CAAC;AAAA,IACpK;AACA,WAAO,oBAAoB,WAAW,KAAK,MAAM;AAAA,EACnD,CAAC;AAGH,QAAM,sBAAsB,OAAO,QAAQ,YAAY,EACpD,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,WAAW,iBAAiB,KAAK,IAAI,CAAC,EAChE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM;AACpB,QAAI,aAAa,KAAK,IAAI,GAAG;AAC3B,aAAO,OAAO,GAAG,KAAK,mBAAmB,KAAK,MAAO,KAAK,UAAqB,CAAC,GAAG,KAAK,KAAe,KAAK,QAAQ,UAAU,IAAI,CAAC;AAAA,IACrI;AACA,WAAO,oBAAoB,gBAAgB,KAAK,IAAI;AAAA,EACtD,CAAC;AAGH,QAAM,sBAAsB,OAAO,QAAQ,YAAY,EACpD;AAAA,IACC,CAAC,CAAC,EAAE,WAAW,MACb,YAAY,WAAW,iBAAiB,YAAY,IAAI;AAAA,EAC5D,EACC,IAAI,CAAC,CAAC,KAAK,WAAW,MAAM;AAC3B,QAAI,aAAa,YAAY,IAAI,GAAG;AAClC,aAAO,OAAO,GAAG,KAAK,mBAAmB,YAAY,MAAO,YAAY,UAAqB,CAAC,GAAG,YAAY,KAAe,YAAY,MAAM,MAAM,CAAC;AAAA,IACvJ;AACA,WAAO,oBAAoB,gBAAgB,KAAK,WAAW;AAAA,EAC7D,CAAC;AAGH,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAChD,QAAI,MAAM,WAAW,iBAAiB,MAAM,IAAI,GAAG;AACjD,wBAAkB,SAAS,MAAM,KAAK;AAAA,IACxC;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,OAAO,QAAQ,MAAM,EACxC,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,WAAW,iBAAiB,MAAM,IAAI,CAAC,EACnE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,QAAI,aAAa,MAAM,IAAI,GAAG;AAC5B,aAAO,OAAO,GAAG,KAAK,mBAAmB,MAAM,MAAO,MAAM,UAAqB,CAAC,GAAG,MAAM,GAAa,CAAC;AAAA,IAC3G;AAEA,UAAM,UAAU,eAAe,KAAK;AACpC,UAAM,aAAa,aAAa,KAAK;AACrC,UAAM,EAAE,WAAW,UAAU,IAAI,uBAAuB,UAAU;AAElE,UAAM,cAAwB,CAAC;AAC/B,gBAAY,KAAK,SAAS,OAAO,EAAE;AAEnC,eAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACxD,UAAI,YAAY,OAAQ;AACxB,kBAAY,KAAK,GAAG,OAAO,KAAK,mBAAmB,KAAK,CAAC,EAAE;AAAA,IAC7D;AAEA,eAAW,WAAW,OAAO,KAAK,SAAS,GAAG;AAC5C,kBAAY,KAAK,GAAG,OAAO,mBAAmB,GAAG,IAAI,OAAO,EAAE;AAAA,IAChE;AAEA,QAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACrC,UAAI,CAAC,eAAe,QAAQ,EAAG,gBAAe,QAAQ,IAAI,CAAC;AAC3D,qBAAe,QAAQ,EAAE,GAAG,IAAI;AAAA,IAClC;AAEA,WAAO,OAAO,GAAG;AAAA,QAAc,YAAY,KAAK,WAAW,CAAC;AAAA;AAAA,EAC9D,CAAC;AAGH,QAAM,oBACJ,cAAc,SAAS,IACnB;AAAA,EAAqB,cAAc,KAAK,KAAK,CAAC;AAAA,MAC9C;AAGN,MAAI,eAAe;AACnB,MAAI,aAAa,WAAW;AAC1B,QAAI,oBAAoB,aAAa,SAAS,GAAG;AAE/C,qBAAe;AAAA,OAAW,mBAAmB,aAAa,SAAS,CAAC;AAAA,IACtE,OAAO;AAGL,qBAAe,WAAW,IAAI,EAAE,GAAG,aAAa,UAAU;AAC1D,qBAAe;AAAA;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,kBACJ,oBAAoB,SAAS,IACzB;AAAA;AAAA,EAAyB,oBAAoB,KAAK,KAAK,CAAC;AAAA,OACxD;AAEN,QAAM,mBAAmB;AAAA;AAAA,EAEzB,eAAe,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA,EAG1B,oBAAoB,KAAK,KAAK,CAAC;AAAA,KAC5B,eAAe;AAAA,UACV,YAAY;AAAA;AAGpB,QAAM,cAAc,KAAK,UAAU,gBAAgB,MAAM,CAAC;AAE1D,SAAO,EAAE,mBAAmB,kBAAkB,YAAY;AAC5D;AAMO,SAAS,8BACd,mBACA,kBACA,UACQ;AACR,QAAM,cAAc,WAAW;AAAA,EAAK,QAAQ;AAAA,IAAO;AAEnD,SAAO;AAAA,IACL,iBAAiB;AAAA;AAAA,mBAEF,gBAAgB,IAAI,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAMlD;AAOO,SAAS,oBACd,YACA,aACQ;AACR,QAAM,kBAAkB,sBAAsB,UAAU;AACxD,SAAO,0CAA0C,eAAe;AAAA;AAAA,uBAE3C,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBlC;AAOO,SAAS,iBACd,YACA,aACA,UAKI,CAAC,GACG;AACR,QAAM,cAAwB,CAAC;AAC/B,MAAI,QAAQ,iBAAiB;AAC3B,gBAAY;AAAA,MACV,gDAAgD,QAAQ,eAAe;AAAA,IACzE;AAAA,EACF;AACA,MAAI,QAAQ,WAAW;AACrB,gBAAY;AAAA,MACV,gDAAgD,QAAQ,SAAS;AAAA,IACnE;AAAA,EACF;AACA,QAAM,iBACJ,YAAY,SAAS,IAAI,OAAO,YAAY,KAAK,IAAI,IAAI;AAE3D,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WACJ,aAAa,YACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAUA;AAEN,QAAM,kBAAkB,sBAAsB,UAAU;AACxD,SAAO,0CAA0C,eAAe;AAAA;AAAA,uBAE3C,WAAW;AAAA;AAAA;AAAA,4CAGU,QAAQ;AAAA,uDACG,cAAc;AAAA;AAErE;AAWO,SAAS,kBACd,YACA,UAOI,CAAC,GACG;AACR,QAAM,cAAwB,CAAC;AAC/B,MAAI,QAAQ,iBAAiB;AAC3B,gBAAY;AAAA,MACV,gDAAgD,QAAQ,eAAe;AAAA,IACzE;AAAA,EACF;AACA,MAAI,QAAQ,WAAW;AACrB,gBAAY;AAAA,MACV,gDAAgD,QAAQ,SAAS;AAAA,IACnE;AAAA,EACF;AACA,QAAM,iBACJ,YAAY,SAAS,IAAI,OAAO,YAAY,KAAK,IAAI,IAAI;AAE3D,QAAM,aAAa,CAAC,EAAE,QAAQ,iBAAiB,QAAQ;AACvD,QAAM,uBAAuB,KAAK,UAAU,QAAQ,iBAAiB,EAAE;AACvE,QAAM,sBAAsB,KAAK,UAAU,QAAQ,gBAAgB,EAAE;AAErE,QAAM,iBAAiB,aACnB;AAAA;AAAA;AAAA,4BAGsB,oBAAoB;AAAA,2BACrB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA+CxC;AAEJ,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WACJ,aAAa,YACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAUA;AAEN,QAAM,kBAAkB,sBAAsB,UAAU;AACxD,SAAO,wDAAwD,eAAe;AAAA;AAAA,gBAEhE,cAAc;AAAA,4CACc,QAAQ;AAAA,uDACG,cAAc;AAAA;AAErE;AAWO,SAAS,wBAAwB,YAA4B;AAClE,QAAM,kBAAkB,sBAAsB,UAAU;AACxD,SAAO,wDAAwD,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBhF;AAMA,SAAS,mBAAmB,OAAwB;AAClD,SAAO,kBAAkB,OAAO,CAAC;AACnC;AAMO,SAAS,kBAAkB,OAAgB,QAAwB;AACxE,QAAM,SAAS,KAAK,OAAO,MAAM;AACjC,QAAM,aAAa,KAAK,OAAO,SAAS,CAAC;AAGzC,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,YAAM,UAAU,MAAM,MAAM,CAAC;AAC7B,aAAO,UAAU,OAAO;AAAA,IAC1B;AAEA,QAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,aAAO,MAAM,MAAM,CAAC;AAAA,IACtB;AAOA,UAAM,MAAM,kBAAkB,QAAQ,uBAAuB,MAAM;AACnE,UAAM,WAAW,IAAI;AAAA,MACnB,MACE,wCAGA,MACA;AAAA,MAEF;AAAA,IACF;AAEA,QAAI,SAAS,KAAK,KAAK,GAAG;AACxB,eAAS,YAAY;AAGrB,YAAM,SAAS,IAAI;AAAA,QACjB,MACE,MACA,wCAGA,MACA;AAAA,MAEJ;AACA,YAAM,YAAY,MAAM,MAAM,MAAM;AACpC,UAAI,WAAW;AACb,cAAM,CAAC,EAAE,MAAM,YAAY,IAAI;AAC/B,eAAO,iBAAiB,SACpB,eAAe,KAAK,UAAU,IAAI,CAAC,QAAQ,KAAK,UAAU,YAAY,CAAC,KACvE,eAAe,KAAK,UAAU,IAAI,CAAC;AAAA,MACzC;AAMA,YAAM,WAAqB,CAAC;AAC5B,UAAI,YAAY;AAChB,eAAS,YAAY;AACrB,UAAI;AACJ,cAAQ,IAAI,SAAS,KAAK,KAAK,OAAO,MAAM;AAE1C,cAAM,aAAa,MAChB,MAAM,WAAW,EAAE,KAAK,EACxB,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAM,KAAK,EACnB,QAAQ,YAAY,KAAK;AAC5B,cAAM,CAAC,EAAE,MAAM,YAAY,IAAI;AAC/B,cAAM,UACJ,iBAAiB,SACb,kBAAkB,KAAK,UAAU,IAAI,CAAC,QAAQ,KAAK,UAAU,YAAY,CAAC,MAC1E,kBAAkB,KAAK,UAAU,IAAI,CAAC;AAC5C,iBAAS,KAAK,aAAa,OAAO;AAClC,oBAAY,EAAE,QAAQ,EAAE,CAAC,EAAE;AAAA,MAC7B;AAEA,YAAM,WAAW,MACd,MAAM,SAAS,EACf,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAM,KAAK,EACnB,QAAQ,YAAY,KAAK;AAC5B,eAAS,KAAK,QAAQ;AACtB,aAAO,MAAM,SAAS,KAAK,EAAE,IAAI;AAAA,IACnC;AAEA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAGA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,QAAQ,MAAM;AAAA,MAClB,CAAC,MAAM,aAAa,kBAAkB,GAAG,SAAS,CAAC;AAAA,IACrD;AACA,WAAO;AAAA,EAAM,MAAM,KAAK,KAAK,CAAC;AAAA,EAAK,MAAM;AAAA,EAC3C;AAGA,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,UAAM,UAAU,OAAO,QAAQ,KAAK;AACpC,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAM,QAAQ,QAAQ;AAAA,MACpB,CAAC,CAAC,GAAG,CAAC,MACJ,GAAG,UAAU,GAAG,KAAK,UAAU,CAAC,CAAC,KAAK,kBAAkB,GAAG,SAAS,CAAC,CAAC;AAAA,IAC1E;AACA,WAAO;AAAA,EAAM,MAAM,KAAK,KAAK,CAAC;AAAA,EAAK,MAAM;AAAA,EAC3C;AAGA,SAAO,KAAK,UAAU,KAAK;AAC7B;AAngEA,IAqtCM;AArtCN;AAAA;AAAA;AAOA;AA8IA;AAIA;AAGA;AACA;AACA;AAujCA,IAAM,sBAAsB;AAAA;AAAA;;;ACrpCrB,SAASK,eAAc,QAAoC;AAChE,QAAM,SAAS,eAAe,MAAM;AACpC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,mBAAmB,MAAM,YAAY,OAAO,KAAK,cAAc,EAAE,KAAK,IAAI,CAAC;AAAA,IAC7E;AAAA,EACF;AACA,SAAO;AACT;AAxEA,IA6Ba;AA7Bb;AAAA;AAAA;AA6BO,IAAM,iBAET,OAAO,OAAO;AAAA,MAChB,KAAK,OAAO,OAAO;AAAA,QACjB,aAAa;AAAA,QACb,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AAAA,MACD,gBAAgB,OAAO,OAAO;AAAA,QAC5B,aAAa;AAAA,QACb,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AAAA,MACD,QAAQ,OAAO,OAAO;AAAA,QACpB,aAAa;AAAA,QACb,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AAAA,MACD,UAAU,OAAO,OAAO;AAAA,QACtB,aAAa;AAAA,QACb,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AAAA,MACD,MAAM,OAAO,OAAO;AAAA,QAClB,aAAa;AAAA,QACb,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAAA;AAAA;;;ACxDD,OAAOC,UAAQ;AAMR,SAAS,YAAY,KAAqB;AAC/C,SAAO,IAAI,MAAM,GAAG,EAAE,CAAC;AACzB;AASA,eAAsB,kBACpB,UACA,KACA,YAAY,KACG;AACf,QAAM,gBAAgB,MAAMA,KAAG,SAAS,QAAQ;AAEhD,QAAM,WAAW,OAAO,YAAmC;AACzD,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,kBAAkB,OAAO,cAAc,MAAM;AAAA,MAC/C;AAAA,MACA,QAAQ,YAAY,QAAQ,SAAS;AAAA,IACvC,CAAC;AAED,QAAI,SAAS,UAAU,OAAO,YAAY,GAAG;AAC3C,aAAO,SAAS,CAAC;AAAA,IACnB;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,kBAAkB,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,CAAC;AAClB;AArDA;AAAA;AAAA;AAAA;AAAA;;;ACUO,SAAS,aACd,OACA,QACM;AACN,SAAO,KAAK,+BAAwB;AACpC,SAAO,KAAK,SAAI,OAAO,EAAE,CAAC;AAG1B,QAAM,SAAS,YAAY,MAAM,SAAS;AAC1C,SAAO,KAAK,eAAe,MAAM,KAAK;AAGtC,QAAM,eAAe,MAAM,YAAY,KAAM,QAAQ,CAAC;AACtD,SAAO,KAAK,eAAe,WAAW,GAAG;AAGzC,QAAM,oBAAoB,MAAM,uBAC5B,qBACA;AACJ,SAAO,KAAK,iBAAiB,iBAAiB,EAAE;AAGhD,MAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,WAAO,KAAK;AAAA,mBAAsB;AAClC,UAAM,SAAS,QAAQ,CAAC,QAAQ;AAC9B,UAAI,IAAI,OAAO,GAAG;AAChB,cAAM,YAAY,YAAY,IAAI,IAAI;AACtC,eAAO,KAAK,YAAO,IAAI,IAAI,KAAK,SAAS,KAAK;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,KAAK,SAAI,OAAO,EAAE,CAAC;AAC5B;AA3CA;AAAA;AAAA;AAGA;AAAA;AAAA;;;ACGA,OAAOC,YAAU;AACjB,OAAOC,UAAQ;AAiDR,SAAS,kBACd,QACA,cACA,YACQ;AACR,QAAM,WAAWD,OAAK,QAAQ,MAAM;AACpC,QAAM,WACJ,aAAa,aAAa,YAAY,cAAc;AACtD,MAAI,YAAY;AACd,WAAOA,OAAK,KAAK,UAAU,YAAY,QAAQ;AAAA,EACjD;AACA,QAAM,MAAMA,OAAK,QAAQ,QAAQ;AACjC,MAAI,OAAO,SAAS,GAAG,KAAK,OAAO,SAASA,OAAK,GAAG,KAAK,CAAC,KAAK;AAC7D,WAAOA,OAAK,KAAK,UAAU,QAAQ;AAAA,EACrC;AACA,SAAO;AACT;AAEA,eAAsB,cACpB,SACe;AACf,QAAM,QAAQ,YAAY;AAC1B,QAAM,MAAM;AAGZ,QAAM,kBAAkB,CAAC,QAAQ;AACjC,QAAM,SAAS,gBAAgB;AAAA,IAC7B,GAAG;AAAA,IACH,QAAQ;AAAA,EACV,CAAC;AAED,MAAI;AAEF,QAAI,QAAQ,QAAQ,QAAQ,KAAK;AAC/B,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AACA,QAAI,QAAQ,OAAO,iBAAiB;AAClC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,QAAI;AACJ,QAAI;AAEJ,QAAI,aAAa,KAAK,CAAC,QAAQ,QAAQ;AACrC,YAAM,eAAe,MAAM,UAAU;AACrC,UAAI;AACF,oBAAY,KAAK,MAAM,YAAY;AAAA,MACrC,QAAQ;AACN,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AACA,mBAAaA,OAAK,QAAQ,QAAQ,IAAI,GAAG,mBAAmB;AAAA,IAC9D,OAAO;AACL,YAAM,OAAO,QAAQ,UAAU;AAC/B,mBAAa,aAAa,MAAM,QAAQ;AACxC,kBAAY,MAAM,eAAe,UAAU;AAAA,IAC7C;AAGA,UAAM,kBAAsC,QAAQ,MAChD,aAAa,WAAW,EAAE,YAAY,OAAO,CAAC,IAC9C;AAAA,MACE,iBAAiB,WAAW;AAAA,QAC1B;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,IACH;AAGJ,UAAM,UAKD,CAAC;AAEN,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,KAAK,iBAAiB;AACpB,UAAI;AAEF,YAAI,QAAQ,UAAU,QAAW;AAC/B,uBAAa,QAAQ,QAAQ;AAAA,QAC/B;AAGA,cAAM,cAAc,QAAQ,SAAS,MAAM,QAAQ,MAAM,IAAI;AAC7D,cAAM,YAAY,cAAc,QAAQ,SAAS;AAEjD,YAAI,aAAa;AAEf,gBAAM,MAAM,aAAa,aAAa,YAAY,QAAQ;AAC1D,uBAAa,SAAS;AAAA,YACpB;AAAA,YACA,cAAc,KAAK,IAAI,CAAC,GAAG,GAAG;AAAA,UAChC;AAAA,QACF,WAAW,QAAQ,QAAQ;AACzB,uBAAa,SAAS;AAAA,YACpB,QAAQ;AAAA,YACR;AAAA,YACA,QAAQ,MAAM,WAAW;AAAA,UAC3B;AAAA,QACF,OAAO;AAEL,gBAAM,MAAM,aAAa,aAAa,YAAY,QAAQ;AAC1D,uBAAa,SAAS,WAAW,QAAW,kBAAkB,GAAG;AAAA,QACnE;AAGA,YAAI,eAAe,QAAQ,KAAK;AAC9B,iBAAO,KAAK,kBAAkB,QAAQ,KAAK;AAAA,QAC7C,OAAO;AACL,iBAAO,KAAK,aAAa;AAAA,QAC3B;AAGA,cAAM,qBAAqB,QAAQ,SAAS,QAAQ;AACpD,cAAM,QAAQ,MAAM;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,gBAAQ,KAAK,EAAE,UAAU,SAAS,MAAM,MAAM,CAAC;AAG/C,YAAI,WAAW;AACb,gBAAM,kBAAkB,aAAa,QAAQ,SAAS;AACtD,iBAAO,KAAK,gBAAgB,YAAY,SAAS,CAAC,EAAE;AACpD,gBAAMC,KAAG,OAAO,aAAa,MAAM;AAAA,QACrC;AAGA,YAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAC3D,uBAAa,OAAO,MAAM;AAAA,QAC5B;AAIA,YAAI,mBAAmB,CAAC,QAAQ,MAAM;AACpC,gBAAM,gBAAgB,MAAMA,KAAG,SAAS,aAAa,MAAM;AAC3D,gBAAM,YAAY,eAAe,CAAC,CAAC;AAGnC,cAAI,QAAQ,OAAO,OAAO;AACxB,kBAAM,cACJ,aAAa,aAAa,YACtB,qBACA;AACN,mBAAO;AAAA,cACL,oCAAoC,WAAW;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,cAAM,eAAe,gBAAgB,KAAK;AAC1C,gBAAQ,KAAK,EAAE,UAAU,SAAS,OAAO,OAAO,aAAa,CAAC;AAE9D,YAAI,CAAC,QAAQ,KAAK;AAChB,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,IAAI;AAC3B,UAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,UAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE;AAEvD,QAAI,QAAQ,MAAM;AAChB,YAAM,aACJ,iBAAiB,IACb;AAAA,QACE;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,YACP,OAAO,QAAQ;AAAA,YACf,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA;AAAA,MACF,IACA;AAAA,QACE,GAAG,YAAY;AAAA,QACf;AAAA,MACF;AAEN,YAAM,YAAY,KAAK,UAAU,YAAY,MAAM,CAAC,IAAI,MAAM;AAAA,QAC5D,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,UAAI,QAAQ,KAAK;AACf,eAAO;AAAA,UACL;AAAA,iBAAoB,YAAY,IAAI,QAAQ,MAAM;AAAA,QACpD;AACA,YAAI,eAAe,GAAG;AACpB,iBAAO,MAAM,WAAW,YAAY,EAAE;AAAA,QACxC;AAAA,MACF;AAEA,UAAI,eAAe,GAAG;AACpB,cAAM,IAAI,MAAM,GAAG,YAAY,0BAA0B;AAAA,MAC3D;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,UAAM,WAAW,MAAM,WAAW;AAClC,UAAM,eAAe,gBAAgB,KAAK;AAE1C,QAAI,QAAQ,MAAM;AAChB,YAAM,YAAY,kBAAkB,cAAc,QAAQ;AAC1D,YAAM,YAAY,KAAK,UAAU,WAAW,MAAM,CAAC,IAAI,MAAM;AAAA,QAC3D,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,aAAO,MAAM,UAAU,YAAY,EAAE;AAAA,IACvC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAoCA,eAAsB,OACpB,cACA,UAYI,CAAC,GAC4C;AAEjD,MAAI;AACJ,MAAI,QAAQ,QAAQ;AAClB,sBAAkB,QAAQ;AAAA,EAC5B,WAAW,QAAQ,gBAAgB,gBAAgB,MAAM;AAGvD,sBAAkB;AAAA,EACpB,OAAO;AACL,sBAAkB;AAAA,EACpB;AAEA,QAAM,SAASC,eAAc,eAAe;AAG5C,MACE,QAAQ,gBAAgB,gBAAgB,UACxC,CAAC,QAAQ,UACT,QAAQ,IAAI,mCAAmC,KAC/C;AAEA,YAAQ;AAAA,MACN;AAAA,IAGF;AAAA,EACF;AAGA,MAAI;AAEJ,MAAI,aAAaF,OAAK,QAAQ,QAAQ,IAAI,GAAG,sBAAsB;AACnE,MAAI,OAAO,iBAAiB,UAAU;AAEpC,iBAAa,aAAa,cAAc,QAAQ;AAChD,gBAAY,MAAM,eAAe,UAAU;AAAA,EAC7C,OAAO;AACL,gBAAY;AAAA,EACd;AAIA,QAAM,kBAAyC;AAAA,IAC7C,GAAI,QAAQ,kBAAkB,CAAC;AAAA,IAC/B,aAAa,OAAO;AAAA,IACpB,SAAS,OAAO;AAAA,EAClB;AACA,QAAM,EAAE,cAAc,aAAa,IAAI,iBAAiB,WAAW;AAAA,IACjE;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,gBAAgB;AAAA,EAClB,CAAC;AAGD,MAAI,QAAQ,UAAU,QAAW;AAC/B,iBAAa,QAAQ,QAAQ;AAAA,EAC/B;AAGA,QAAM,SAAS,gBAAgB,OAAO;AAGtC,SAAO,MAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,SAAS;AAAA,EACnB;AACF;AApZA;AAAA;AAAA;AAQA;AACA;AAWA;AAMA;AAEA;AAEA;AACA;AACA;AAAA;AAAA;;;AChCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EACE,cAAAG;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA,gBAAAC;AAAA,OACK;AACP,SAAS,QAAAC,aAAY;AAOd,SAAS,WACd,UACA,YACA,eACA,SACM;AACN,EAAAH,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,eAAa,YAAYG,MAAK,UAAU,UAAU,CAAC;AACnD,EAAAF,eAAcE,MAAK,UAAU,aAAa,GAAG,eAAe,OAAO;AACnE,QAAM,OAAkB,EAAE,SAAS,WAAW,KAAK,IAAI,EAAE;AACzD,EAAAF,eAAcE,MAAK,UAAU,WAAW,GAAG,KAAK,UAAU,IAAI,GAAG,OAAO;AAC1E;AAEO,SAAS,UACd,UACgD;AAChD,MAAI;AACF,UAAM,WAAWA,MAAK,UAAU,WAAW;AAC3C,UAAM,aAAaA,MAAK,UAAU,UAAU;AAC5C,QAAI,CAACJ,YAAW,QAAQ,KAAK,CAACA,YAAW,UAAU,EAAG,QAAO;AAC7D,UAAM,OAAkB,KAAK,MAAMG,cAAa,UAAU,OAAO,CAAC;AAClE,WAAO,EAAE,YAAY,SAAS,KAAK,QAAQ;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAgB,UAAiC;AAC/D,MAAI;AACF,UAAM,aAAaC,MAAK,UAAU,aAAa;AAC/C,QAAI,CAACJ,YAAW,UAAU,EAAG,QAAO;AACpC,WAAOG,cAAa,YAAY,OAAO;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAjDA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAMA,OAAOE,YAAU;AACjB,OAAOC,UAAQ;AAef,eAAsB,oBACpB,YACA,SAK+D;AAE/D,QAAM,UAAU;AAAA,IACd;AAAA,IACA,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,EAC7D;AACA,QAAMA,KAAG,UAAU,OAAO;AAG1B,QAAM,WAAWD,OAAK,KAAK,SAAS,UAAU;AAG9C,QAAM,OAAO,YAAY;AAAA,IACvB,OAAO;AAAA,IACP,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,gBAAgB;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS,YAAY;AACnB,YAAMC,KAAG,OAAO,OAAO;AAAA,IACzB;AAAA,EACF;AACF;AAQO,SAAS,iBAAiB,YAA6B;AAC5D,SACE,WAAW,SAAS,MAAM,KAC1B,WAAW,SAAS,KAAK,KACzB,WAAW,SAAS,MAAM;AAE9B;AAzEA,IAAAC,cAAA;AAAA;AAAA;AAQA;AACA;AAAA;AAAA;;;ACDA;;;ACUA;AACA;AAQA;AACA;AACA;AACA;AA9BA,OAAOC,YAAU;AACjB,OAAOC,UAAQ;AACf;AAAA,EACE;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;AChBP;AAEA,IAAM,aAAa,CAAC,UAAU,eAAe,aAAa;AAiDnD,SAAS,eACd,OACA,YACe;AACf,QAAM,gBAAgB,MAAM,YAAY,CAAC;AACzC,QAAM,YAAY,MAAM,QAAQ,CAAC;AAGjC,MAAI,cAAc,WAAW,KAAK,UAAU,WAAW,GAAG;AACxD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,sBAAsB,oBAAI,IAAY;AAC5C,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,YAA2B,CAAC;AAGlC,aAAW,QAAQ,eAAe;AAChC,UAAM,EAAE,MAAM,KAAK,IAAI,UAAU,IAAI;AACrC,QAAI,SAAS,eAAe;AAC1B,oBAAc,IAAI,IAAI;AACtB,UAAI,CAAC,UAAU,aAAc,WAAU,eAAe,CAAC;AACvD,gBAAU,aAAa,IAAI,IAAI,EAAE,UAAU,KAAK;AAAA,IAClD,WAAW,SAAS,eAAe;AACjC,UAAI,CAAC,UAAU,aAAc,WAAU,eAAe,CAAC;AACvD,gBAAU,aAAa,IAAI,IAAI,EAAE,UAAU,KAAK;AAAA,IAClD,OAAO;AACL,0BAAoB,IAAI,IAAI;AAC5B,UAAI,CAAC,UAAU,QAAS,WAAU,UAAU,CAAC;AAC7C,gBAAU,QAAQ,IAAI,IAAI,EAAE,UAAU,KAAK;AAAA,IAC7C;AAAA,EACF;AAGA,QAAM,YAAY,oBAAoB,OAAO;AAC7C,QAAM,iBACJ,UAAU,gBAAgB,OAAO,KAAK,UAAU,YAAY,EAAE,SAAS;AACzE,QAAM,iBAAiB,cAAc,OAAO;AAC5C,QAAM,iBAAiB;AAAA,IACrB,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,EACpB,EAAE,OAAO,OAAO;AAEhB,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR,wBAAwB,eAAe,KAAK,OAAO,CAAC;AAAA,IAEtD;AAAA,EACF;AAGA,aAAW,QAAQ,WAAW;AAC5B,UAAM,UAAU,KAAK,QAAQ,GAAG;AAChC,QAAI,YAAY,IAAI;AAClB,YAAM,IAAI;AAAA,QACR,2BAA2B,IAAI;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,MAAM,GAAG,OAAO;AACtC,UAAM,YAAY,KAAK,MAAM,UAAU,CAAC;AACxC,UAAM,SAAS,UAAU,QAAQ;AAEjC,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,IAAI;AAAA,QACR,8DAA8D,OAAO,IAAI;AAAA,MAC3E;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,iBAAiB,CAAC,OAAO,WAAW;AACtD,YAAM,IAAI;AAAA,QACR,sCAAsC,OAAO,IAAI;AAAA,MACnD;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,oBAAc,KAAK,MAAM,SAAS;AAAA,IACpC,QAAQ;AAEN,oBAAc;AAAA,IAChB;AAEA,QAAI,OAAO,aAAa,OAAO,eAAe;AAE5C,YAAM,YAAY,eAAe,OAAO,IAAI,IAAI,OAAO,SAAS;AAChE,UAAI,CAAC,UAAU,iBAAkB,WAAU,mBAAmB,CAAC;AAC/D,UAAI,CAAC,UAAU,iBAAiB,SAAS;AACvC,kBAAU,iBAAiB,SAAS,IAAI,CAAC;AAC3C,gBAAU,iBAAiB,SAAS,EAAE,OAAO,aAAa,IAAI;AAAA,IAChE,OAAO;AAGL,UAAI,cAAc,IAAI,OAAO,IAAI,GAAG;AAClC,cAAM,IAAI;AAAA,UACR,gBAAgB,OAAO,IAAI;AAAA,QAC7B;AAAA,MACF;AAEA,gBAAU,IAAI,OAAO,IAAI;AAEzB,UAAI,CAAC,UAAU,aAAc,WAAU,eAAe,CAAC;AACvD,gBAAU,aAAa,OAAO,IAAI,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,EAAE;AAAA,IACxE;AAAA,EACF;AAGA,QAAM,kBAAkB,OAAO,KAAK,WAAW,gBAAgB,CAAC,CAAC;AACjE,QAAM,gBAAgB,oBAAI,IAAI,CAAC,GAAG,eAAe,GAAG,SAAS,CAAC;AAE9D,MAAI,cAAc,OAAO,GAAG;AAC1B,QAAI,CAAC,UAAU,aAAc,WAAU,eAAe,CAAC;AACvD,eAAW,YAAY,iBAAiB;AACtC,UAAI,CAAC,cAAc,IAAI,QAAQ,GAAG;AAChC,kBAAU,aAAa,QAAQ,IAAI,EAAE,QAAQ,EAAE,UAAU,KAAK,EAAE;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAcO,SAAS,UAAU,MAA0B;AAGlD,QAAM,EAAE,QAAQ,MAAM,KAAK,IAAI,kBAAkB,MAAM;AAAA,IACrD,SAAS;AAAA,IACT,UAAU;AAAA,MACR,eAAe,CAAC,UACd,yBAAyB,KAAK;AAAA,MAChC,eAAe,CAAC,MACd,2BAA2B,CAAC;AAAA,MAC9B,aAAa,CAAC,OAAO,MACnB,yBAAyB,KAAK,0BAA0B,CAAC;AAAA,IAC7D;AAAA,EACF,CAAC;AAGD,MAAI,KAAK,UAAU,GAAG;AACpB,UAAM,YAAY,KAAK,CAAC;AACxB,QAAI,cAAc,YAAY,cAAc,QAAQ;AAClD,YAAM,IAAI;AAAA,QACR,wBAAwB,SAAS;AAAA,MACnC;AAAA,IACF;AACA,UAAM,gBAAgB,KAAK,CAAC;AAC5B,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI;AAAA,QACR,yBAAyB,IAAI,sCAAsC,SAAS;AAAA,MAC9E;AAAA,IACF;AACA,WAAO,EAAE,MAAM,QAAQ,MAAM,WAAW,cAAc;AAAA,EACxD;AAGA,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,yBAAyB,IAAI,8BAA8B,IAAI;AAAA,IACjE;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,QAAQ,KAAK;AAC9B;;;AC9NO,SAAS,eACd,QACA,WACM;AAEN,MAAI,UAAU,cAAc;AAC1B,UAAM,eAAe,OAAO;AAG5B,QAAI,cAAc;AAChB,iBAAW,CAAC,IAAI,QAAQ,KAAK,OAAO,QAAQ,UAAU,YAAY,GAAG;AACnE,cAAM,OAAO,aAAa,EAAE;AAC5B,YAAI,CAAC,KAAM;AACX,YAAI,CAAC,KAAK,OAAQ,MAAK,SAAS,CAAC;AACjC,cAAM,aAAa,KAAK;AACxB,YAAI,SAAS,QAAQ,SAAU,YAAW,WAAW;AACrD,YAAI,SAAS,QAAQ,SAAS;AAC5B,qBAAW,OAAO,SAAS,OAAO;AACpC,YAAI,SAAS,KAAK;AAChB,qBAAW,MAAM,SAAS;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,SAAO,MAAM;AAGb,MAAI,UAAU,kBAAkB;AAC9B,UAAM,eAAe,OAAO;AAG5B,QAAI,cAAc;AAChB,iBAAW,CAAC,WAAW,KAAK,KAAK,OAAO;AAAA,QACtC,UAAU;AAAA,MACZ,GAAG;AACD,mBAAW,CAAC,eAAe,SAAS,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9D,gBAAM,cAAc,aAAa,aAAa;AAC9C,cAAI,CAAC,YAAa;AAClB,cAAI,CAAC,YAAY,OAAQ,aAAY,SAAS,CAAC;AAC/C,gBAAM,UAAU,YAAY;AAC5B,cAAI,CAAC,QAAQ,WAAY,SAAQ,aAAa,CAAC;AAC/C,UAAC,QAAQ,WAAuC,SAAS,IACvD;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACpDAC;AALA,OAAOC,YAAU;AACjB,SAAS,qBAAqB;AAC9B,SAAS,OAAO,sBAAsB;;;AC2C/B,SAAS,yBACd,UAAoC,CAAC,GACvB;AACd,MAAI,SAAS;AACb,QAAM,UAAU,oBAAI,IAA0B;AAG9C,QAAM,iBAAiB,WAAW,WAAW,KAAK,UAAU;AAC5D,QAAM,UAAyB,CAAC;AAKhC,WAAS,YAAY,QAAiC;AACpD,YAAQ,KAAK;AAAA,MACX;AAAA,MACA,YAAY,QAAQ,IAAI,QAAQ,YAAY;AAAA,MAC5C,cAAc,QAAQ,IAAI,QAAQ,cAAc;AAAA,MAChD,aAAa,QAAQ,IAAI,QAAQ,aAAa;AAAA,MAC9C,eAAe,QAAQ,IAAI,QAAQ,eAAe;AAAA,IACpD,CAAC;AAED,UAAM,oBAAoB,CACxB,UACA,UACG,SACQ;AACX,UAAI,OAAO,aAAa,WAAY,QAAO;AAC3C,YAAM,KAAK;AACX,cAAQ,IAAI,IAAI;AAAA,QACd;AAAA,QACA;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,CAAC,OAAuB;AAC3C,UAAI,MAAM,KAAM;AAChB,YAAM,QAAQ,OAAO,OAAO,WAAW,KAAK,OAAO,EAAE;AACrD,YAAM,QAAQ,QAAQ,IAAI,KAAK;AAC/B,UAAI,MAAO,OAAM,UAAU;AAAA,IAC7B;AAEA,UAAM,qBAAqB,CACzB,UACA,UACG,SACQ;AACX,UAAI,OAAO,aAAa,WAAY,QAAO;AAC3C,YAAM,KAAK;AACX,cAAQ,IAAI,IAAI;AAAA,QACd;AAAA,QACA;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AACD,aAAO;AAAA,IACT;AAEA,YAAQ,IAAI,QAAQ,cAAc,iBAAiB;AACnD,YAAQ,IAAI,QAAQ,gBAAgB,YAAY;AAChD,YAAQ,IAAI,QAAQ,eAAe,kBAAkB;AACrD,YAAQ,IAAI,QAAQ,iBAAiB,YAAY;AAAA,EACnD;AAGA,cAAY,UAAU;AAGtB,MAAI,QAAQ,aAAa,QAAQ,cAAc,YAAY;AACzD,gBAAY,QAAQ,SAAS;AAAA,EAC/B;AAGA,QAAM,kBAAkB,MACtB,IAAI,QAAc,CAACC,aAAY,eAAeA,UAAS,CAAC,CAAC;AAE3D,iBAAe,MAAM,cAAc,KAAqB;AACtD,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,UAAM,gBAAgB;AACtB,QAAI,aAAa;AAEjB,WAAO,aAAa,eAAe;AAEjC,YAAM,gBAAgB;AAGtB,YAAM,QAAQ,MAAM,KAAK,QAAQ,OAAO,CAAC,EACtC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEnC,UAAI,MAAM,WAAW,EAAG;AAGxB,iBAAW,SAAS,OAAO;AACzB,YAAI,MAAM,QAAS;AAEnB,gBAAQ,OAAO,MAAM,EAAE;AAEvB,YAAI,MAAM,SAAS,YAAY;AAC7B,gBAAM,UAAU;AAEhB,gBAAM,QAAQ;AACd,kBAAQ,IAAI,OAAO,EAAE,GAAG,OAAO,IAAI,OAAO,SAAS,MAAM,CAAC;AAAA,QAC5D;AAEA,YAAI;AACF,gBAAM,SAAS,GAAG,MAAM,IAAI;AAAA,QAC9B,SAAS,KAAK;AAEZ,kBAAQ,KAAK,uCAAuC,GAAG;AAAA,QACzD;AAAA,MACF;AAGA,YAAM,gBAAgB;AAGtB,UAAI,KAAK,IAAI,IAAI,UAAU;AACzB;AAAA,MACF;AAEA;AAAA,IACF;AAGA,YAAQ,MAAM;AAAA,EAChB;AAEA,WAAS,eAAuB;AAC9B,WAAO,MAAM,KAAK,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE;AAAA,EAChE;AAEA,WAAS,UAAgB;AACvB,eAAW,SAAS,SAAS;AAC3B,cAAQ,IAAI,MAAM,QAAQ,cAAc,MAAM,UAAU;AACxD,cAAQ,IAAI,MAAM,QAAQ,gBAAgB,MAAM,YAAY;AAC5D,cAAQ,IAAI,MAAM,QAAQ,eAAe,MAAM,WAAW;AAC1D,cAAQ,IAAI,MAAM,QAAQ,iBAAiB,MAAM,aAAa;AAAA,IAChE;AACA,YAAQ,MAAM;AAAA,EAChB;AAEA,SAAO,EAAE,OAAO,cAAc,SAAS,QAAQ;AACjD;;;ACjMA,IAAM,mBAAmB;AAOzB,IAAM,yBAAyB;AAC/B,IAAM,sBAAsB;AAE5B,IAAI,yBAAyB;AA0BtB,SAAS,eACd,SACA,UAA4B,CAAC,GACjB;AACZ,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,UAAU;AACd,MAAI,aAAa;AAEjB,QAAM,OAAO,MAAY;AACvB,QAAI,CAAC,QAAS;AACd,QAAI,cAAc,cAAe;AACjC,QAAI,KAAK,IAAI,IAAI,QAAQ,UAAW;AAEpC,QAAI,QAAQ,SAAS,GAAG;AACtB,uBAAiB,IAAI;AACrB;AAAA,IACF;AAEA,kBAAc;AAEd,UAAM,WAAW,CAAC,GAAG,QAAQ,OAAO,CAAC,EAClC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEnC,eAAW,SAAS,UAAU;AAC5B,cAAQ,OAAO,MAAM,EAAE;AACvB,UAAI;AACF,cAAM,SAAS,GAAG,MAAM,IAAI;AAAA,MAC9B,SAAS,KAAK;AACZ,gBAAQ,KAAK,uBAAuB,MAAM,EAAE,uBAAuB,GAAG;AAAA,MACxE;AAEA,UAAI,MAAM,SAAS,cAAc,CAAC,MAAM,SAAS;AAI/C,cAAM,WAAyB;AAAA,UAC7B,GAAG;AAAA,UACH,IAAI;AAAA,QACN;AACA,gBAAQ,IAAI,SAAS,IAAI,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,qBAAiB,IAAI;AAAA,EACvB;AAEA,mBAAiB,IAAI;AAErB,SAAO,MAAM;AACX,cAAU;AAAA,EACZ;AACF;;;AFrCA,eAAsB,gBACpB,SACA,IACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,IAAI;AACV,MAAI,aAAsB,eAAwB;AAClD,MAAI;AACJ,MAAI;AACJ,MAAI;AAGJ,MAAI,aAAa,OAAO;AACtB,UAAM,iBAAiB,IAAI,eAAe;AAC1C,UAAM,IAAI,MAAM,6CAA6C;AAAA,MAC3D,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AACD,kBAAc,EAAE;AAChB,oBAAgB,EAAE;AAClB,qBAAiB,EAAE;AACnB,MAAE,SAAS,IAAI;AACf,MAAE,WAAW,IAAI,OAAO;AACxB,WAAO,eAAe,QAAQ,aAAa;AAAA,MACzC,OAAO,IAAI,OAAO;AAAA,MAClB,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,CAAC;AAGD,QAAI,cAAc;AAChB,mBAAa,OAAO;AACpB,4BAAsB,KAAK,YAAY;AACvC,aAAO,QAAQ,IAAI,OAAO;AAAA,IAC5B;AAAA,EACF;AAIA,MAAI,YAAY;AACd,mBAAe,yBAAyB;AAAA,MACtC,WACE,aAAa,SAAS,MACjB,IAAI,SACL;AAAA,IACR,CAAC;AAAA,EACH;AAEA,MAAI;AAEF,QAAI,cAAc;AAChB,UAAI,aAAa,SAAS,KAAK;AAC7B,eAAO,MAAM,8BAA8B;AAC3C,YAAI,OAAO,KAAK,YAAY;AAAA,MAC9B,OAAO;AACL,eAAO,MAAM,6BAA6B;AAC1C,cAAM,KAAK,MAAM,OAAO,IAAI;AAC5B,WAAG,iBAAiB,YAAY;AAAA,MAClC;AAAA,IACF;AAKA,UAAM,UAAU,cAAcC,OAAK,QAAQ,OAAO,CAAC,EAAE;AACrD,UAAM,SAAS,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,IAAI,CAAC;AACtD,UAAM,EAAE,YAAY,WAAAC,WAAU,IAAI;AAElC,QAAI,OAAO,eAAe,cAAc,OAAOA,eAAc,YAAY;AACvE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAyB;AAAA,MAC7B;AAAA,MACA,WAAAA;AAAA,MACA,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO;AAAA,IACvB;AAGA,QAAI,cAAc;AAKhB,YAAM,WAAW,YAAY,eAAe,aAAa,OAAO,IAAI;AACpE,UAAI;AACJ,UAAI;AACF,iBAAS,MAAM,GAAG,UAAU;AAAA,MAC9B,UAAE;AACA,YAAI,SAAU,UAAS;AAAA,MACzB;AACA,YAAM,aAAa,MAAM,YAAY,WAAW,GAAI;AACpD,aAAO;AAAA,IACT,WAAW,SAAS;AAClB,YAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD;AAAA,UACE,MAAM,OAAO,IAAI,MAAM,sBAAsB,OAAO,IAAI,CAAC;AAAA,UACzD;AAAA,QACF;AAAA,MACF,CAAC;AACD,aAAO,MAAM,QAAQ,KAAK,CAAC,GAAG,UAAU,GAAG,cAAc,CAAC;AAAA,IAC5D;AAEA,WAAO,MAAM,GAAG,UAAU;AAAA,EAC5B,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB,OAAO,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACF,UAAE;AACA,QAAI,aAAc,cAAa,QAAQ;AACvC,QAAI,eAAe,QAAW;AAC5B,8BAAwB,UAAU;AAAA,IACpC;AACA,QAAI,aAAa,OAAO;AACtB,UAAI,gBAAgB,OAAW,GAAE,SAAS;AAAA,UACrC,QAAO,EAAE;AACd,UAAI,kBAAkB,OAAW,GAAE,WAAW;AAAA,UACzC,QAAO,EAAE;AACd,UAAI,mBAAmB,QAAW;AAChC,eAAO,eAAe,QAAQ,aAAa;AAAA,UACzC,OAAO;AAAA,UACP,cAAc;AAAA,UACd,UAAU;AAAA,QACZ,CAAC;AAAA,MACH,OAAO;AACL,eAAO,EAAE;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAQO,SAAS,sBACd,KACA,cACM;AAEN,MAAI,OAAO,SAAS,OAClB,OACA,SACsB;AACtB,UAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,MAAM,SAAS;AAC/D,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,OACJ,MAAM,SAAS,UAAa,MAAM,SAAS,OACvC,OAAO,KAAK,IAAI,IAChB;AAGN,UAAM,UAAkC,CAAC;AACzC,QAAI,MAAM,SAAS;AACjB,UAAI,KAAK,mBAAmB,SAAS;AACnC,aAAK,QAAQ,QAAQ,CAAC,GAAG,MAAM;AAC7B,kBAAQ,CAAC,IAAI;AAAA,QACf,CAAC;AAAA,MACH,WAAW,OAAO,KAAK,YAAY,UAAU;AAC3C,eAAO,QAAQ,KAAK,OAAiC,EAAE;AAAA,UACrD,CAAC,CAAC,GAAG,CAAC,MAAM;AACV,oBAAQ,CAAC,IAAI;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,iBAAa,KAAK;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAED,WAAO,IAAI,SAAS,IAAI,EAAE,QAAQ,KAAK,YAAY,KAAK,CAAC;AAAA,EAC3D;AAGA,MAAI,OAAO,UAAU,aAAa,CAChC,KACA,SACY;AACZ,UAAM,OAAO,SAAS,UAAa,SAAS,OAAO,OAAO,IAAI,IAAI;AAClE,iBAAa,KAAK,EAAE,MAAM,UAAU,KAAK,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC;AACtE,WAAO;AAAA,EACT;AACF;AAKO,SAAS,wBAAwB,YAAgC;AACtE,SAAO,QAAQ;AACjB;;;AG1QA;AACA;AACA;AACA;AANA,OAAOC,YAAU;AACjB,OAAOC,UAAQ;AACf,SAAS,eAAAC,oBAA8B;AA6CvC,eAAsB,YAAY,OAA4C;AAC5E,QAAM,SAAS,gBAAgB;AAAA,IAC7B,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,EACjB,CAAC;AAGD,SAAO,MAAM,4BAA4B;AACzC,QAAM,EAAE,cAAc,aAAa,IAAI,iBAAiB,MAAM,QAAQ;AAAA,IACpE,YAAY,QAAQ,IAAI;AAAA,IACxB,UAAU,MAAM;AAAA,EAClB,CAAC;AAED,QAAM,WAAWC,aAAY,YAAY;AAGzC,QAAM,YAAY;AAAA,IAChB,EAAE,UAAU,MAAM,UAAU,MAAM,MAAM,KAAK;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,YAAY;AAE7B,WAAO;AAAA,MACL,YAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,YAAY;AAAA,MAAC;AAAA,IACxB;AAAA,EACF;AAGA,SAAO,MAAM,6BAA6B;AAC1C,QAAM,UAAU;AAAA,IACd;AAAA,IACA,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,EAC9D;AACA,QAAMC,KAAG,UAAU,OAAO;AAC1B,QAAM,aAAaC,OAAK,KAAK,SAAS,UAAU;AAEhD,QAAM,mBAAmB;AAAA,IACvB,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,aAAa,QAAS,YAAuB;AAAA,IACvD,aAAa;AAAA;AAAA,EACf;AAEA,QAAM,WAAW,cAAc,kBAAkB,QAAQ,KAAK;AAE9D,SAAO,MAAM,mBAAmB,UAAU,EAAE;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,YAAY;AACnB,YAAMD,KAAG,OAAO,OAAO,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACzC;AAAA,EACF;AACF;;;ANxEA,SAAS,WAAAE,gBAAe;;;AOjBjB,SAAS,aAAa,OAAwC;AACnE,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAEvD,QAAM,SAAS,MAAM,IAAI,CAAC,SAAS;AACjC,UAAM,OAAO,UAAU,IAAI;AAC3B,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI;AAAA,QACR,eAAe,IAAI,oBAAoB,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS;AAAA,MACjF;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC/C,MAAI,MAAM,OAAO,GAAG;AAClB,UAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK;AAC/B,UAAM,IAAI;AAAA,MACR,qBAAqB,OAAO,KAAK,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,CAAC,IAAI,IAAI;AACf,QAAM,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAElD,OAAK,SAAS,YAAY,SAAS,kBAAkB,IAAI,SAAS,GAAG;AACnE,UAAM,IAAI;AAAA,MACR,cAAc,IAAI,mCAAmC,IAAI,MAAM,wBAAwB,IAAI;AAAA,IAC7F;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,IAAI;AAC3B;;;ACtCO,SAAS,iBAAiB,OAA4C;AAC3E,QAAM,OAAO,aAAa,KAAK;AAC/B,SAAO,EAAE,OAAO,KAAK,MAAM,KAAK,KAAK,IAAI;AAC3C;;;ACTA;AAMA;AAgBA,eAAsB,eACpB,SACqB;AACrB,QAAM,YAAY,KAAK,IAAI;AAE3B,MAAI;AAEF,UAAM,OAAO,iBAAiB,QAAQ,YAAY,CAAC,CAAC;AAGpD,QAAI;AACJ,QAAI,aAAa,KAAK,CAAC,QAAQ,QAAQ;AACrC,eAAS,MAAM,oBAAoB,MAAM;AAAA,IAC3C,OAAO;AACL,eAAS,QAAQ,UAAU;AAAA,IAC7B;AAGA,QAAI,gBAAyB,QAAQ;AACrC,QAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,sBAAgB,MAAM,mBAAmB,QAAQ,OAAO;AAAA,QACtD,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,QAAI;AACJ,YAAQ,KAAK,OAAO;AAAA,MAClB,KAAK;AACH,iBAAS,MAAM,KAAK,QAAQ,eAAe;AAAA,UACzC,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ;AAAA,UACd,SAAS,QAAQ;AAAA,UACjB,QAAQ,QAAQ;AAAA,UAChB,UAAU,QAAQ;AAAA,UAClB,MAAM,QAAQ;AAAA,UACd,UAAU,QAAQ;AAAA,QACpB,CAAC;AACD;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM,eAAe,QAAQ,eAAe;AAAA,UACnD,UAAU,KAAK,IAAI,CAAC;AAAA,UACpB,MAAM,QAAQ;AAAA,UACd,QAAQ,QAAQ;AAAA,UAChB,SAAS,QAAQ;AAAA,UACjB,UAAU,QAAQ;AAAA,QACpB,CAAC;AACD;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,YACE,eAAe,KAAK,IAAI,CAAC;AAAA,YACzB,MAAM,QAAQ;AAAA,YACd,MAAM,QAAQ;AAAA,YACd,QAAQ,QAAQ;AAAA,YAChB,SAAS,QAAQ;AAAA,YACjB,UAAU,QAAQ;AAAA,UACpB;AAAA,QACF;AACA;AAAA,MAEF,KAAK;AACH,iBAAS,MAAM;AAAA,UACb;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QACF;AACA;AAAA,IACJ;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB,OAAO,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;AAQA,eAAe,6BACb,QACA,OACA,gBACA,SACqB;AACrB,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,iBAA6C,CAAC;AAEpD,aAAW,iBAAiB,gBAAgB;AAC1C,UAAM,IAAI,MAAM,oBAAoB,QAAQ,OAAO;AAAA,MACjD;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,IACpB,CAAC;AACD,mBAAe,aAAa,IAAI;AAChC,QAAI,CAAC,EAAE,SAAS;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU,KAAK,IAAI,IAAI;AAAA,QACvB,OAAO,wBAAwB,aAAa,KAAK,EAAE,SAAS,eAAe;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,KAAK,IAAI,IAAI;AAAA,IACvB;AAAA,EACF;AACF;;;AT7GA,SAAS,mBACP,QACA,cACA,QACA,OACU;AACV,MAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,QAAM,OAAO;AAEb,MAAI,aAAa,IAAI,GAAG;AACtB,UAAM,WAAW,YAAY,IAAI;AACjC,UAAM,WAAW,YAAY,UAAW,kBAAkB,QAAQ,KAAK,CAAC;AACxE,QAAI,CAAC,SAAU,QAAO,CAAC;AACvB,WAAO,UAAU,UAAU,0BAA0B,YAAY,CAAC;AAAA,EACpE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,0BAA0B,YAAY;AAAA,EACxC;AACF;AAKA,eAAe,SACb,WACA,OACA,UAQI,CAAC,GACgB;AACrB,QAAM,SAAS,gBAAgB;AAAA,IAC7B,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI;AAEJ,MAAI;AAEF,WAAO,MAAM,sBAAsB;AACnC,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,IACV;AAEA,QAAI;AAGJ,QAAI;AACJ,QAAI,QAAQ,UAAU;AACpB,qBAAgB,MAAM,WAAW,QAAQ,UAAU;AAAA,QACjD,MAAM;AAAA,MACR,CAAC;AACD,aAAO,MAAM,oBAAoB,aAAa,MAAM,SAAS;AAAA,IAC/D;AAEA,QAAI,SAAS,SAAS,UAAU;AAC9B,eAAS,MAAM;AAAA,QACb;AAAA,UACE,QAAQ;AAAA,UACR,MAAM,QAAQ;AAAA,UACd,SAAS,QAAQ;AAAA,UACjB,MAAM,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,QAAQ;AACP,oBAAU;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,eAAS,MAAM;AAAA,QACb,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,CAAC,QAAQ;AACP,oBAAU;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB,OAAO,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACF,UAAE;AACA,QAAI,SAAS;AACX,YAAMC,KAAG,OAAO,OAAO,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACzC;AAAA,EACF;AACF;AASA,eAAsB,YAAY,SAA4C;AAC5E,QAAM,SAAS,MAAM,eAAe,OAAO;AAC3C,QAAM,WAAW,OAAO;AAGxB,MAAI;AACJ,MAAI,QAAQ,MAAM;AAChB,aAAS,KAAK,UAAU,EAAE,GAAG,QAAQ,SAAS,GAAG,MAAM,CAAC;AAAA,EAC1D,OAAO;AACL,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAO,SAAS;AAClB,YAAM,KAAK,2BAA2B;AACtC,UAAI,OAAO,aAAa,OAAO,OAAO,cAAc,UAAU;AAC5D,cAAM,aAAa,OAAO;AAI1B,YAAI,QAAQ,cAAc,WAAW;AACnC,gBAAM,KAAK,eAAe,WAAW,EAAE,EAAE;AAC3C,YAAI,YAAY,cAAc,WAAW;AACvC,gBAAM,KAAK,aAAa,WAAW,MAAM,EAAE;AAC7C,YAAI,YAAY,cAAc,WAAW;AACvC,gBAAM,KAAK,aAAa,WAAW,MAAM,EAAE;AAAA,MAC/C;AACA,YAAM,KAAK,eAAe,QAAQ,IAAI;AAAA,IACxC,OAAO;AACL,YAAM,KAAK,UAAU,OAAO,KAAK,EAAE;AAAA,IACrC;AACA,aAAS,MAAM,KAAK,IAAI;AAAA,EAC1B;AAGA,QAAM,YAAY,SAAS,MAAM,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAE3D,UAAQ,KAAK,OAAO,UAAU,IAAI,CAAC;AACrC;AAwBA,eAAsB,KACpB,cACA,OACA,UAKI,CAAC,GACgB;AACrB,MAAI,OAAO,iBAAiB,UAAU;AACpC,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAGA,QAAM,SAASC,SAAQ,mBAAmB,UAAU,KAAK;AACzD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO,kBAAkB,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACzG;AAAA,EACF;AAEA,SAAO,SAAS,cAAc,OAAO;AAAA,IACnC,MAAM,QAAQ,QAAQ;AAAA,IACtB,SAAS,QAAQ,WAAW;AAAA,IAC5B,QAAQ,QAAQ,UAAU;AAAA,IAC1B,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,EACpB,CAAC;AACH;AAKA,eAAe,kBACb,SACA,gBACA,QACA,YACA,cACqB;AAErB,SAAO,MAAM,4BAA4B;AACzC,QAAM,EAAE,cAAc,aAAa,IAAI,MAAM,eAAe,QAAQ,QAAS;AAAA,IAC3E,UAAU,QAAQ;AAAA,IAClB;AAAA,EACF,CAAC;AAED,QAAM,WAAWC,aAAY,YAAY;AAGzC,QAAM,YAAY,eAAe,EAAE,MAAM,QAAQ,KAAK,GAAG,YAAY;AAGrE,SAAO,MAAM,6BAA6B;AAC1C,QAAM,UAAU;AAAA,IACd;AAAA,IACA,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,EAC9D;AACA,aAAW,OAAO;AAClB,QAAMF,KAAG,UAAU,OAAO;AAC1B,QAAM,WAAWG,OAAK,KAAK,SAAS,UAAU;AAE9C,QAAM,mBAAmB;AAAA,IACvB,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,aAAa,QAAS,YAAuB;AAAA,IACvD,aAAa;AAAA;AAAA,EACf;AAEA,QAAM,WAAW,cAAc,kBAAkB,QAAQ,KAAK;AAE9D,SAAO,MAAM,mBAAmB,QAAQ,EAAE;AAE1C,SAAO;AAAA,IACL,gBAAgB,QAAQ,iBAAiB,aAAa,QAAQ,UAAU,SAAS;AAAA,EACnF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,WAAW,MAAQ;AAAA,EAClC;AACF;AAKA,eAAe,kBACb,eACA,UACA,gBACA,QACA,YACA,YAA2B,CAAC,GAC5B,cACqB;AAErB,QAAM,UAAU;AAAA,IACd;AAAA,IACA,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,EAC9D;AACA,aAAW,OAAO;AAClB,QAAMH,KAAG,UAAU,OAAO;AAC1B,QAAM,WAAWG,OAAK,KAAK,SAAS,UAAU;AAC9C,QAAMH,KAAG,UAAU,UAAU,eAAe,MAAM;AAElD,SAAO,MAAM,sBAAsB,QAAQ,EAAE;AAG7C,SAAO;AAAA,IACL,gBAAgB,QAAQ,iBAAiB,aAAa,QAAQ,UAAU,SAAS;AAAA,EACnF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,WAAW,MAAQ;AAAA,EAClC;AACF;AAMA,eAAe,uBACb,SACA,OACA,QACA,UACA,WACA,cACA,SACqB;AACrB,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,eAA8B,CAAC;AAErC,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,EAAE,SAAS,IAAK;AAAA;AAAA;AAAA;AAAA;AAAA,MAK5B,WAAW;AAAA,IACb;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,OAAO,WAAW,OAAO,gBAAgB,MAAS;AACjE,qBAAe,QAAQ,aAAa,CAAC,CAAC;AAEtC,YAAM,SAAS,MAAM,OAAO,UAAU,MAAM;AAC5C,UAAI,CAAC,QAAQ,WAAW;AACtB,cAAM,IAAI,MAAM,wCAAwC;AAE1D,YAAM,YAAY,OAAO;AAEzB,aAAO,KAAK,kBAAkB,MAAM,IAAI,EAAE;AAC1C,YAAM,YAAY,MAAM,UAAU,KAAK,KAAK;AAE5C,YAAM,UAAU,QAAQ,UAAU;AAElC,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,GAAI,aAAa,SAAS,IAAI,EAAE,aAAa,IAAI,CAAC;AAAA,QAClD,UAAU,KAAK,IAAI,IAAI;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;AAqBA,eAAsB,eACpB,cACA,OACA,SACqB;AACrB,QAAM,YAAY,KAAK,IAAI;AAG3B,MAAI;AACJ,MAAI,OAAO,iBAAiB,UAAU;AACpC,aAAU,MAAM,eAAe,YAAY;AAAA,EAC7C,OAAO;AACL,aAAS;AAAA,EACX;AAEA,QAAM,eAAe,QAAQ,aACzB;AAAA,IACE,MAAM;AAAA,IACN,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,UAAU,CAAC,YAAY,QAAQ,QAAQ;AAAA,IACvC,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,EACnB,IACA;AAAA,IACE,MAAM;AAAA,IACN;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,UAAU,CAAC,YAAY,QAAQ,QAAQ;AAAA,IACvC,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,EACnB;AAEJ,QAAM,WAAW,MAAM,YAAY,YAAY;AAE/C,MAAI;AACF,UAAM,SAAS,gBAAgB;AAAA,MAC7B,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,IACnB,CAAC;AAGD,UAAM,gBAAgB,SAAS,aAAa,WAAW,CAAC,GACtD,QAAQ,QACV;AAEA,QAAI,CAAC,cAAc,SAAS;AAC1B,YAAM,IAAI,MAAM,WAAW,QAAQ,QAAQ,0BAA0B;AAAA,IACvE;AAGA,QAAI;AACJ,QAAI,QAAQ,UAAU;AACpB,qBAAgB,MAAM,WAAW,QAAQ,UAAU;AAAA,QACjD,MAAM;AAAA,MACR,CAAC;AACD,aAAO,MAAM,oBAAoB,aAAa,MAAM,SAAS;AAAA,IAC/D;AAEA,UAAM,eAA8B,CAAC;AAErC,WAAO,MAAM;AAAA,MACX;AAAA,QACE,SAAS,SAAS;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,WAAW;AAEhB,cAAM,aAAa,OAAO,eAAe,aAAc,OAAQ;AAG/D,cAAM,gBAAgB,YAAY,UAAU;AAC5C,YAAI,CAAC,eAAe;AAClB,gBAAM,IAAI;AAAA,YACR,mBAAmB,aAAc,OAAO;AAAA,UAC1C;AAAA,QACF;AAEA,cAAM,aAAa,OAAO,WAAW,OAAO,gBAAgB,MAAS;AACrE,uBAAe,YAAY,SAAS,SAAS;AAI7C,cAAM,WAAyD,CAAC;AAEhE,mBAAW,QAAQ;AAAA,UACjB,GAAK,WAAW,SAAqC,CAAC;AAAA,UACtD,SAAS,CAAC,EAAE,GAAG,GAAqB,UAAmB;AACrD,qBAAS,KAAK,EAAE,OAAO,WAAW,KAAK,IAAI,EAAE,CAAC;AAC9C,mBAAO,EAAE,IAAI,KAAK;AAAA,UACpB;AAAA,QACF;AAEA,cAAM,WAAW,MAAM,cAAc,YAAY;AAAA,UAC/C,UAAU,QAAQ;AAAA,QACpB,CAAC;AACD,cAAM,EAAE,QAAQ,IAAI;AAEpB,eAAO,KAAK,mBAAmB;AAI/B,cAAM,cAAe,SAAS,CAAC;AAC/B,cAAM,UAAU,YAAY,WAAW;AACvC,cAAM,cAAc,YAAY;AAGhC,cAAM,QAAQ,aAAa,MAAM,aAAa,OAAO,EAAE,OAAO;AAE9D,YAAI,SAAS,MAAM,WAAW,SAAS;AACrC,gBAAM,SAAS,KAAK,UAAU,QAAQ,UAAU;AAAA,QAClD;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,UACT,GAAI,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,UAC1C,GAAI,aAAa,SAAS,IAAI,EAAE,aAAa,IAAI,CAAC;AAAA,UAClD,UAAU,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB,OAAO,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACF,UAAE;AACA,UAAM,SAAS,QAAQ;AAAA,EACzB;AACF;AAsBA,eAAsB,oBACpB,cACA,OACA,SACqB;AACrB,QAAM,YAAY,KAAK,IAAI;AAG3B,QAAM,SAASC,SAAQ,mBAAmB,UAAU,KAAK;AACzD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO,OAAO,MAAM;AAAA,IACtB;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,OAAO,iBAAiB,UAAU;AACpC,aAAU,MAAM,eAAe,YAAY;AAAA,EAC7C,OAAO;AACL,aAAS;AAAA,EACX;AAEA,QAAM,eAAe,QAAQ,aACzB;AAAA,IACE,MAAM;AAAA,IACN,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,UAAU,CAAC,iBAAiB,QAAQ,aAAa;AAAA,IACjD,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,EACnB,IACA;AAAA,IACE,MAAM;AAAA,IACN;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,UAAU,CAAC,iBAAiB,QAAQ,aAAa;AAAA,IACjD,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,EACnB;AAEJ,QAAM,WAAW,MAAM,YAAY,YAAY;AAE/C,MAAI;AACF,UAAM,SAAS,gBAAgB;AAAA,MAC7B,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,IACnB,CAAC;AAGD,QAAI;AACJ,QAAI,QAAQ,UAAU;AACpB,qBAAgB,MAAM,WAAW,QAAQ,UAAU;AAAA,QACjD,MAAM;AAAA,MACR,CAAC;AACD,aAAO,MAAM,oBAAoB,aAAa,MAAM,SAAS;AAAA,IAC/D;AAEA,UAAM,eAA8B,CAAC;AAErC,WAAO,MAAM;AAAA,MACX;AAAA,QACE,SAAS,SAAS;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,WAAW;AAChB,cAAM,aAAa,OAAO,WAAW,OAAO,gBAAgB,MAAS;AACrE,uBAAe,YAAY,SAAS,SAAS;AAG7C,YAAI,WAAW,QAAS,YAAW,UAAU,CAAC;AAC9C,YAAI,WAAW,aAAc,YAAW,eAAe,CAAC;AAExD,cAAM,SAAS,MAAM,OAAO,UAAU,UAAU;AAChD,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,yCAAyC;AAE3D,cAAM,YAAY,OAAO;AACzB,cAAM,cAAc,UAAU,eAAe,QAAQ,aAAa;AAElE,YAAI,CAAC,aAAa;AAChB,gBAAM,IAAI;AAAA,YACR,gBAAgB,QAAQ,aAAa,wCACrB,OAAO,KAAK,UAAU,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,MAAM;AAAA,UAChF;AAAA,QACF;AAEA,cAAM,cAAc,MAAM;AAAA,UACxB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV;AACA,YAAI,CAAC,aAAa;AAChB,gBAAM,IAAI;AAAA,YACR,gBAAgB,QAAQ,aAAa;AAAA,UACvC;AAAA,QACF;AAEA,cAAM,aAAa;AACnB,cAAM,SAAS,aAAa,QAAQ,aAAa;AACjD,cAAM,WAAyD,CAAC;AAEhE,iBAAS,KAAK,EAAE,OAAO,EAAE,GAAG,WAAW,GAAG,WAAW,KAAK,IAAI,EAAE,CAAC;AAEjE,eAAO,KAAK,2BAA2B,QAAQ,aAAa,EAAE;AAG9D,YAAI,iBAA4C;AAChD,cAAM,SAAS,YAAY,OAAO;AAClC,YAAI,UAAU,UAAU,cAAc;AACpC,gBAAM,iBAAiB;AAAA,YACrB;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA;AAAA,UACF;AACA,cAAI,eAAe,SAAS,GAAG;AAC7B,kBAAM,eAAe,MAAM;AAAA,cACzB;AAAA,cACA,UAAU;AAAA,cACV;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,eAAe,QAAQ,aAAa;AAAA,YACtC;AACA,gBAAI,iBAAiB,MAAM;AACzB,uBAAS,KAAK,EAAE,OAAO,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC;AACpD,oBAAM,UAAU,QAAQ,UAAU;AAClC,qBAAO;AAAA,gBACL,SAAS;AAAA,gBACT;AAAA,gBACA,UAAU,KAAK,IAAI,IAAI;AAAA,cACzB;AAAA,YACF;AACA,6BACE,MAAM,QAAQ,YAAY,IAAI,aAAa,CAAC,IAAI;AAAA,UAEpD;AAAA,QACF;AAEA,cAAM,aAAa,MAAM;AAAA,UACvB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAEA,YAAI,eAAe,OAAO;AACxB,mBAAS,KAAK,EAAE,OAAO,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,QACtD,WAAW,MAAM,QAAQ,UAAU,GAAG;AACpC,qBAAW,KAAK,YAAY;AAC1B,qBAAS,KAAK;AAAA,cACZ,OAAO,EAAE,SAAS;AAAA,cAClB,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AAAA,QACF,WACE,cACA,OAAO,eAAe,YACtB,WAAW,OACX;AACA,mBAAS,KAAK,EAAE,OAAO,WAAW,OAAO,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,QAClE,OAAO;AACL,mBAAS,KAAK,EAAE,OAAO,gBAAgB,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,QAChE;AAEA,cAAM,UAAU,QAAQ,UAAU;AAElC,eAAO;AAAA,UACL,SAAS;AAAA,UACT;AAAA,UACA,GAAI,aAAa,SAAS,IAAI,EAAE,aAAa,IAAI,CAAC;AAAA,UAClD,UAAU,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB,OAAO,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACF,UAAE;AACA,UAAM,SAAS,QAAQ;AAAA,EACzB;AACF;AAqBA,eAAsB,oBACpB,cACA,OACA,SACqB;AACrB,QAAM,YAAY,KAAK,IAAI;AAG3B,QAAM,SAASA,SAAQ,mBAAmB,UAAU,KAAK;AACzD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO,OAAO,MAAM;AAAA,IACtB;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,OAAO,iBAAiB,UAAU;AACpC,aAAU,MAAM,eAAe,YAAY;AAAA,EAC7C,OAAO;AACL,aAAS;AAAA,EACX;AAEA,QAAM,eAAe,QAAQ,aACzB;AAAA,IACE,MAAM;AAAA,IACN,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,UAAU,CAAC,iBAAiB,QAAQ,aAAa;AAAA,IACjD,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,EACnB,IACA;AAAA,IACE,MAAM;AAAA,IACN;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,UAAU,CAAC,iBAAiB,QAAQ,aAAa;AAAA,IACjD,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,EACnB;AAEJ,QAAM,WAAW,MAAM,YAAY,YAAY;AAE/C,MAAI;AACF,UAAM,SAAS,gBAAgB;AAAA,MAC7B,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,IACnB,CAAC;AAED,QAAI;AACJ,QAAI,QAAQ,UAAU;AACpB,qBAAgB,MAAM,WAAW,QAAQ,UAAU;AAAA,QACjD,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,eAA8B,CAAC;AAErC,WAAO,MAAM;AAAA,MACX;AAAA,QACE,SAAS,SAAS;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,WAAW;AAChB,cAAM,aAAa,OAAO,WAAW,OAAO,gBAAgB,MAAS;AACrE,uBAAe,YAAY,SAAS,SAAS;AAG7C,cAAM,WAAW,SAAS,aAAa,gBAAgB,CAAC,GACtD,QAAQ,aACV;AACA,YAAI,eAIC,CAAC;AAEN,YAAI,SAAS,SAAS;AACpB,gBAAM,aAAa,OAAO,eAAe,QAAQ,OAAO;AAUxD,gBAAM,SAAS,YAAY,UAAU;AAErC,cAAI,QAAQ,MAAM;AAChB,kBAAM,eAAe,WAAW;AAIhC,kBAAM,aAAa,aAAa,QAAQ,aAAa,GAAG;AACxD,gBAAI,YAAY;AACd,yBAAW,MAAM,OAAO;AAAA,YAC1B;AAEA,gBAAI,OAAO,YAAY,QAAQ;AAC7B,oBAAM,WAAW;AAAA,gBACf,GAAG,OAAO;AAAA,gBACV,YAAY,OAAO;AAAA,cACrB;AACA,oBAAM,EAAE,YAAY,MAAM,IAAI,QAAQ,QAAQ;AAC9C,kBAAI,WAAY,YAAW,MAAM;AACjC,6BAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAGA,YAAI,WAAW,QAAS,YAAW,UAAU,CAAC;AAE9C,cAAM,SAAS,MAAM,OAAO,UAAU,UAAU;AAChD,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,yCAAyC;AAE3D,cAAM,YAAY,OAAO;AAGzB,YACE,CAAC,UAAU,aAAa,QAAQ,aAAa,KAC7C,CAAC,UAAU,QAAQ,aAAa,QAAQ,aAAa,GACrD;AACA,gBAAM,IAAI;AAAA,YACR,gBAAgB,QAAQ,aAAa,wCACrB,OAAO,KAAK,UAAU,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,MAAM;AAAA,UAChF;AAAA,QACF;AAEA,eAAO,KAAK,2BAA2B,QAAQ,aAAa,EAAE;AAI9D,cAAM,YAAY,MAAM,UAAU,KAAK,OAAO;AAAA,UAC5C,SAAS,CAAC,QAAQ,aAAa;AAAA,QACjC,CAAC;AAED,cAAM,UAAU,QAAQ,UAAU;AAElC,eAAO;AAAA,UACL,SAAS;AAAA,UACT;AAAA,UACA,GAAI,aAAa,SAAS,IACtB,EAAE,OAAO,EAAE,CAAC,QAAQ,aAAa,GAAG,aAAa,EAAE,IACnD,CAAC;AAAA,UACL,GAAI,aAAa,SAAS,IAAI,EAAE,aAAa,IAAI,CAAC;AAAA,UAClD,UAAU,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB,OAAO,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACF,UAAE;AACA,UAAM,SAAS,QAAQ;AAAA,EACzB;AACF;;;AUl8BA;AACA;AACA;AACA;AACA;AARA,OAAOG,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;;;ACErB;AAFA,SAAS,cAAAC,aAAY,aAAAC,YAAW,iBAAAC,sBAAqB;AACrD,SAAS,WAAAC,gBAAe;AAQxB,SAAS,sBAA8B;AACrC,MAAIH,YAAW,WAAW,EAAG,QAAO;AACpC,SAAO;AACT;AAcA,SAASI,OAAM,OAAwB;AACrC,SAAO,MAAM,WAAW,SAAS,KAAK,MAAM,WAAW,UAAU;AACnE;AAKA,SAAS,kBAAkB,WAAmB,SAAuB;AACnE,QAAM,MAAMD,SAAQ,SAAS;AAC7B,MAAI,CAACH,YAAW,GAAG,GAAG;AACpB,IAAAC,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACA,EAAAC,eAAc,WAAW,SAAS,OAAO;AAC3C;AAMA,eAAe,YAAY,KAAa,WAAoC;AAC1E,QAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,YAAY,QAAQ,GAAM,EAAE,CAAC;AAEzE,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,+BAA+B,GAAG,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IAC/E;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,MAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,UAAM,IAAI,MAAM,uBAAuB,GAAG,WAAW;AAAA,EACvD;AAEA,oBAAkB,WAAW,OAAO;AACpC,SAAO;AACT;AAKA,eAAe,oBAAoB,WAAoC;AACrE,QAAM,UAAU,MAAM,UAAU;AAChC,oBAAkB,WAAW,OAAO;AACpC,SAAO;AACT;AAQA,eAAsB,cACpB,WACyB;AACzB,QAAM,YAAY,oBAAoB;AAGtC,MAAI,CAACE,OAAM,SAAS,KAAKJ,YAAW,SAAS,GAAG;AAC9C,WAAO,EAAE,MAAM,WAAW,QAAQ,OAAO;AAAA,EAC3C;AAIA,MAAII,OAAM,SAAS,GAAG;AACpB,UAAMC,SAAO,MAAM,YAAY,WAAW,SAAS;AACnD,WAAO,EAAE,MAAAA,QAAM,QAAQ,MAAM;AAAA,EAC/B;AAGA,MAAI,aAAa,GAAG;AAClB,UAAMA,SAAO,MAAM,oBAAoB,SAAS;AAChD,WAAO,EAAE,MAAAA,QAAM,QAAQ,QAAQ;AAAA,EACjC;AAGA,SAAO,EAAE,MAAM,WAAW,QAAQ,OAAO;AAC3C;;;AClHA;;;ACaO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACkB,QACA,QACA,MAChB,SACA;AACA,UAAM,OAAO;AALG;AACA;AACA;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAMA,SAAS,eAAe,OAAuC;AAC7D,SACE,OAAO,UAAU,YACjB,UAAU,QACV,WAAW,SACX,OAAQ,MAA6B,UAAU;AAEnD;AAOA,eAAsB,yBAAyB,KAA8B;AAC3E,MAAI,IAAI,WAAW,OAAO,IAAI,WAAW,IAAK;AAE9C,MAAI,OAAsB;AAC1B,MAAI,UAAkB,IAAI;AAE1B,MAAI;AACF,UAAM,OAAgB,MAAM,IAAI,MAAM,EAAE,KAAK;AAC7C,QAAI,eAAe,IAAI,KAAK,KAAK,OAAO;AACtC,UAAI,OAAO,KAAK,MAAM,SAAS,SAAU,QAAO,KAAK,MAAM;AAC3D,UAAI,OAAO,KAAK,MAAM,YAAY,SAAU,WAAU,KAAK,MAAM;AAAA,IACnE;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,SACJ,IAAI,WAAW,MACX,iBACA,SAAS,mBACP,SACA,SAAS,oBACP,UACA;AAEV,QAAM,IAAI,gBAAgB,IAAI,QAAQ,QAAQ,MAAM,OAAO;AAC7D;;;AD7CA,eAAsB,YACpB,SAC4B;AAC5B,QAAM,MAAM,GAAG,QAAQ,MAAM,iBAAiB,QAAQ,SAAS,UAAU,QAAQ,MAAM;AAEvF,QAAM,UAAU;AAAA,IACd,QAAQ;AAAA,IACR,QAAQ,WAAW,EAAE,iBAAiB,QAAQ,SAAS,IAAI;AAAA,EAC7D;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC;AAAA,IACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,MAAI,SAAS,WAAW,KAAK;AAC3B,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAGA,QAAM,yBAAyB,QAAQ;AAEvC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,wBAAwB,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IAChE;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAM,OAAO,SAAS,QAAQ,IAAI,MAAM,KAAK;AAC7C,QAAM,UAAU,KAAK,QAAQ,MAAM,EAAE;AAErC,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AF5CA;;;AIVA;AADA,SAAS,cAAAC,mBAAkB;;;ACA3B,SAAS,SAAS;AASX,IAAM,aAAa,EACvB,OAAO,EACP,IAAI,yBAAyB,EAC7B,IAAI,GAAG,yBAAyB,EAChC,IAAI,OAAO,4BAA4B,EACvC,SAAS,yBAAyB;AAS9B,IAAM,iBAAiB,EAC3B,OAAO,EACP,IAAI,GAAG,2BAA2B,EAClC,SAAS,4BAA4B;;;AC3BxC,SAAS,KAAAC,UAAS;AASX,IAAM,mBAAmBC,GAAE,OAAO;AAAA,EACvC,MAAM;AAAA,EACN,MAAM,WAAW,QAAQ,IAAI;AAAA,EAC7B,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AACtE,CAAC;;;ACbD,SAAS,KAAAC,UAAS;AAYX,IAAM,uBAAuBA,GACjC,KAAK,CAAC,YAAY,SAAS,QAAQ,SAAS,CAAC,EAC7C,SAAS,4DAA4D;AAUjE,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EAC5C,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,EACvE,MAAMA,GACH,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAWM,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,OAAOA,GACJ,OAAO,EACP,IAAI,CAAC,EACL,SAAS,4CAA4C;AAAA,EACxD,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,EACvE,MAAMA,GACH,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ;AAQO,IAAM,sBAAsBA,GAAE,OAAO,kBAAkB;;;AChE9D,SAAS,KAAAC,UAAS;AASX,IAAM,sBAAsBC,GAAE,OAAO;AAAA,EAC1C,QAAQA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,EAC7D,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,EACjE,OAAOA,GACJ,QAAQ,EACR,SAAS,EACT,QAAQ,IAAI,EACZ,SAAS,0BAA0B;AAAA,EACtC,OAAOA,GACJ,QAAQ,EACR,SAAS,EACT,QAAQ,IAAI,EACZ,SAAS,wBAAwB;AAAA,EACpC,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAC7E,CAAC;AAWM,IAAM,mBAAmB;AAAA,EAC9B,YAAY,eAAe;AAAA,IACzB;AAAA,EACF;AAAA,EACA,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,EACvE,OAAOA,GACJ,QAAQ,EACR,SAAS,EACT,QAAQ,IAAI,EACZ,SAAS,0BAA0B;AAAA,EACtC,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,+CAA+C;AAC7D;AAQO,IAAM,oBAAoBA,GAAE,OAAO,gBAAgB;;;ACxD1D,SAAS,KAAAC,UAAS;AASX,IAAM,iBAAiBC,GAC3B,KAAK,CAAC,OAAO,QAAQ,CAAC,EACtB,SAAS,oCAAoC;AAUzC,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EAC5C,QAAQA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,EAC7D,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,EACjE,MAAMA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAC/D,CAAC;AAWM,IAAM,qBAAqB;AAAA,EAChC,YAAY,eAAe;AAAA,IACzB;AAAA,EACF;AAAA,EACA,OAAOA,GACJ,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,EACvE,UAAU,eAAe,SAAS,EAAE,SAAS,6BAA6B;AAAA,EAC1E,MAAMA,GACH,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ;AAQO,IAAM,sBAAsBA,GAAE,OAAO,kBAAkB;;;AC/D9D,SAAS,KAAAC,UAAS;AAUX,IAAM,oBAAoBC,GAAE,OAAO;AAAA,EACxC,QAAQA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,EAC7D,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,EACjE,MAAMA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAC/D,CAAC;AAWM,IAAM,iBAAiB;AAAA,EAC5B,YAAY,eAAe,SAAS,iCAAiC;AAAA,EACrE,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,yCAAyC;AAAA,EAC3E,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,EACvE,UAAU,eAAe,SAAS,EAAE,SAAS,6BAA6B;AAC5E;AAQO,IAAM,kBAAkBA,GAAE,OAAO,cAAc;;;ANvB/C,SAAS,iBAAiB,UAA0B;AAEzD,QAAM,eAAe,aAAa,UAAU,QAAQ;AAEpD,MAAI,CAACC,YAAW,YAAY,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR,wBAAwB,QAAQ;AAAA,oBACT,YAAY;AAAA;AAAA,IAErC;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,aAAa,MAAoB;AAC/C,QAAM,SAAS,WAAW,UAAU,IAAI;AACxC,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,iBAAiB,IAAI;AAAA;AAAA;AAAA,IAGvB;AAAA,EACF;AACF;;;AJ/BAC;;;AWTA;AAHA,SAAS,iBAAAC,sBAAqB;AAC9B,OAAOC,UAAQ;;;ACTf,OAAO,UAAU;AASV,SAAS,mBACd,MACA,QACuB;AACvB,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,QAAI,cAA2C;AAE/C,UAAM,SAAS,KAAK,aAAa,CAAC,KAAK,QAAQ;AAE7C,UAAI,IAAI,QAAQ,aAAa,IAAI,WAAW,OAAO;AACjD,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,CAAC,CAAC;AACxC;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ,YAAY,IAAI,WAAW,OAAO;AAChD,cAAM,OAAO,cAAc,MAAM;AACjC,YAAI,UAAU,MAAM,EAAE,gBAAgB,mBAAmB,CAAC;AAC1D,YAAI;AAAA,UACF,KAAK,UAAU,EAAE,QAAQ,cAAc,UAAU,YAAY,CAAC;AAAA,QAChE;AACA;AAAA,MACF;AAGA,UAAI,aAAa;AACf,oBAAY,KAAK,GAAG;AACpB;AAAA,MACF;AAGA,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,EAAE,OAAO,iBAAiB,CAAC,CAAC;AAAA,IACrD,CAAC;AAED,WAAO,mBAAmB;AAC1B,WAAO,iBAAiB;AAExB,WAAO,OAAO,MAAM,WAAW,MAAM;AACnC,aAAO,KAAK,mCAAmC,IAAI,EAAE;AACrD,MAAAA,SAAQ;AAAA,QACN;AAAA,QACA,eAAe,SAAS;AACtB,wBAAc;AAAA,QAChB;AAAA,QACA,OAAO,MACL,IAAI,QAAc,CAAC,KAAK,QAAQ;AAC9B,iBAAO,MAAM,CAAC,QAAS,MAAM,IAAI,GAAG,IAAI,IAAI,CAAE;AAAA,QAChD,CAAC;AAAA,MACL,CAAC;AAAA,IACH,CAAC;AAED,WAAO,GAAG,SAAS,MAAM;AAAA,EAC3B,CAAC;AACH;;;ACxDA,SAAS,WAAAC,UAAS,WAAAC,gBAAe;;;ACOjC,SAAS,WAAAC,gBAAe;AACxB,SAAS,iBAAAC,sBAAqB;AAyB9B,eAAsB,WACpB,MACAC,UACA,QACuB;AACvB,QAAM,eAAeF,SAAQ,IAAI;AAIjC,QAAM,UAAUC,eAAc,YAAY,EAAE;AAG5C,UAAQ,QAAQ,qBAAqB,YAAY,EAAE;AACnD,QAAM,SAAS,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,IAAI,CAAC;AAEtD,MAAI,CAAC,OAAO,WAAW,OAAO,OAAO,YAAY,YAAY;AAC3D,UAAM,IAAI;AAAA,MACR,mBAAmB,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,UAAQ,QAAQ,6BAA6B;AAC7C,QAAM,SAAS,MAAM,OAAO,QAAQC,YAAW,CAAC,CAAC;AAEjD,MACE,CAAC,UACD,CAAC,OAAO,aACR,OAAO,OAAO,UAAU,SAAS,YACjC;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,GAAI,OAAO,OAAO,gBAAgB,aAC9B,EAAE,aAAa,OAAO,YAAY,IAClC,CAAC;AAAA,EACP;AACF;;;ADnDA,eAAsB,SACpB,MACA,QACA,QACA,cACA,cACqB;AACrB,QAAM,eAAeC,SAAQ,IAAI;AACjC,QAAM,UAAUC,SAAQ,YAAY;AACpC,UAAQ,MAAM,OAAO;AAErB,QAAM,cAAc;AAAA,IAClB,GAAG;AAAA,IACH,GAAI,eAAe,EAAE,QAAQ,aAAa,IAAI,CAAC;AAAA,IAC/C,GAAI,eAAe,EAAE,gBAAgB,EAAE,MAAM,OAAU,EAAE,IAAI,CAAC;AAAA,EAChE;AAEA,QAAM,SAAS,MAAM,WAAW,cAAc,aAAa,MAAM;AAGjE,MAAI,gBAAgB,OAAO,OAAO,gBAAgB,YAAY;AAC5D,iBAAa,eAAe,OAAO,WAAW;AAAA,EAChD;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,MACT,SAAS,OAAO,UAAU;AAAA,MAC1B,QAAQ,OAAO,UAAU;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,aAAa,OAAO;AAAA,EACtB;AACF;AAMA,eAAsB,SACpB,eACA,SACA,QACA,QACA,cACA,cACqB;AACrB,SAAO,KAAK,4CAA4C;AAGxD,MAAI,cAAc;AAChB,iBAAa,eAAe,IAAI;AAAA,EAClC;AAGA,MAAI;AACF,QAAI,cAAc,UAAU,SAAS;AACnC,YAAM,cAAc,UAAU,QAAQ,UAAU;AAAA,IAClD;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,qBAAqB,KAAK,EAAE;AAAA,EAC3C;AAGA,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,KAAK,2BAA2B;AACvC,SAAO;AACT;;;AEtGA,SAAS,mBAAmB;;;ACA5B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAE9B,IAAM,kBAAkB,cAAc,YAAY,GAAG;AACrD,IAAM,iBAAiBD,SAAQ,eAAe;AAM9C,SAAS,kBAA0B;AACjC,QAAM,QAAQ;AAAA,IACZC,MAAK,gBAAgB,iBAAiB;AAAA;AAAA,IACtCA,MAAK,gBAAgB,oBAAoB;AAAA;AAAA,EAC3C;AACA,aAAW,KAAK,OAAO;AACrB,QAAI;AACF,aAAOF,cAAa,GAAG,OAAO;AAAA,IAChC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO,KAAK,UAAU,EAAE,SAAS,QAAQ,CAAC;AAC5C;AAGO,IAAM,UAAkB,KAAK,MAAM,gBAAgB,CAAC,EAAE;;;ADzB7D;AAuBO,SAAS,oBACd,SACA,MACgB;AAChB,QAAM,eAA+C,CAAC;AACtD,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,QAAQ,YAAY,GAAG;AAC/D,UAAM,OAAO,KAAK,aAAa,IAAI,KAAK;AAAA,MACtC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AACA,iBAAa,IAAI,IAAI;AAAA,MACnB,OAAO,KAAK,QAAQ,KAAK;AAAA,MACzB,QAAQ,KAAK,SAAS,KAAK;AAAA,MAC3B,UAAU,KAAK,WAAW,KAAK;AAAA,IACjC;AAAA,EACF;AACA,SAAO;AAAA,IACL,UAAU,QAAQ,KAAK,KAAK;AAAA,IAC5B,WAAW,QAAQ,MAAM,KAAK;AAAA,IAC9B,cAAc,QAAQ,SAAS,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAMA,SAAS,qBACP,cAIqE;AACrE,QAAM,SAGF,CAAC;AACL,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,WAAO,IAAI,IAAI;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,aAAa,YAAY,CAAC,EAAE,SAAS,KAAK;AAEzC,SAAS,gBAAwB;AACtC,SAAO;AACT;AAoBO,SAAS,gBACd,QACA,QACiB;AACjB,MAAI,QAA+C;AACnD,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,gBAAgB,OAAO;AAE3B,MAAI,eAAgC;AAAA,IAClC,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,cAAc,CAAC;AAAA,EACjB;AAEA,iBAAe,WAA0B;AACvC,QAAI;AAEF,UAAI;AACJ,UAAI;AACJ,YAAM,SAAS,OAAO,cAAc;AACpC,UAAI,QAAQ;AACV,kBAAU;AAAA,UACR,IAAI,OAAO;AAAA,UACX,KAAK,OAAO;AAAA,UACZ,QAAQ,OAAO;AAAA,UACf,cAAc,qBAAqB,OAAO,YAAY;AAAA,QACxD;AACA,mBAAW,oBAAoB,SAAS,YAAY;AAAA,MACtD;AAEA,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,OAAO,MAAM,iBAAiB,OAAO,SAAS;AAAA,QACjD;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,iBAAiB,OAAO,OAAO;AAAA,YACtC,gBAAgB;AAAA,UAClB,CAAC;AAAA,UACD,MAAM,KAAK,UAAU;AAAA,YACnB;AAAA,YACA,QAAQ,OAAO;AAAA,YACf,GAAI,OAAO,gBAAgB;AAAA,cACzB,cAAc,OAAO;AAAA,YACvB;AAAA,YACA;AAAA,YACA,YAAY;AAAA,YACZ,QAAQ,KAAK,OAAO,KAAK,IAAI,IAAI,aAAa,GAAI;AAAA,YAClD,GAAI,YAAY,EAAE,SAAS;AAAA,UAC7B,CAAC;AAAA,UACD,QAAQ,YAAY,QAAQ,GAAM;AAAA,QACpC;AAAA,MACF;AAIA,UAAI,SAAS,MAAM,YAAY,SAAS;AACtC,uBAAe;AAAA,MACjB;AAEA,UAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,eAAO;AAAA,UACL,0BAA0B,SAAS,MAAM;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AAEd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO,KAAK,qBAAqB,OAAO,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,QAAc;AACrB,aAAS;AACT,UAAM,SAAS,OAAO,aAAa,OAAO,KAAK,OAAO,IAAI,IAAI;AAC9D,YAAQ,YAAY,MAAM,SAAS,GAAG,OAAO,aAAa,MAAM;AAAA,EAClE;AAEA,WAAS,OAAa;AACpB,QAAI,OAAO;AACT,oBAAc,KAAK;AACnB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,WAAS,oBAAoB,SAAuB;AAClD,oBAAgB;AAAA,EAClB;AAEA,SAAO,EAAE,OAAO,MAAM,UAAU,oBAAoB;AACtD;;;AEzKO,SAAS,aACd,QACA,QACc;AACd,MAAI,QAA+C;AACnD,MAAI;AAEJ,iBAAe,WAA0B;AACvC,QAAI;AACF,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B,GAAG,OAAO;AAAA,QACV;AAAA,MACF,CAAC;AAED,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO,MAAM,kBAAkB;AAC/B;AAAA,MACF;AAEA,aAAO,KAAK,uBAAuB,OAAO,OAAO,EAAE;AACnD,iBAAW,OAAO;AAElB,YAAM,OAAO,SAAS,OAAO,SAAS,OAAO,OAAO;AACpD,aAAO,KAAK,6BAA6B;AAAA,IAC3C,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO,MAAM,eAAe,OAAO,EAAE;AAAA,IACvC;AAAA,EACF;AAEA,WAAS,QAAc;AACrB,eAAW;AACX,UAAM,SAAS,OAAO,aAAa,QAAQ,KAAK,OAAO,IAAI,IAAI;AAC/D,YAAQ,YAAY,MAAM,SAAS,GAAG,OAAO,aAAa,MAAM;AAChE,WAAO;AAAA,MACL,iBAAiB,KAAK,OAAO,OAAO,aAAa,UAAU,GAAI,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,WAAS,OAAa;AACpB,QAAI,OAAO;AACT,oBAAc,KAAK;AACnB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAM,SAAS;AACjC;;;ACjEA;AAeO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YACkB,QAChB,YACA;AACA,UAAM,4BAA4B,MAAM,IAAI,UAAU,EAAE;AAHxC;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,aACpB,SACiC;AACjC,QAAM,EAAE,QAAQ,OAAO,WAAW,OAAO,IAAI;AAC7C,QAAM,MAAM,GAAG,MAAM,iBAAiB,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,MAAM,CAAC;AAEvG,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,SAAS,iBAAiB,OAAO,EAAE,gBAAgB,mBAAmB,CAAC;AAAA,EACzE,CAAC;AAGD,QAAM,yBAAyB,GAAG;AAElC,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,iBAAiB,IAAI,QAAQ,IAAI,UAAU;AAAA,EACvD;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,SAAO,KAAK;AACd;;;APfA;AA8BA,eAAsB,YAAY,SAAyC;AACzE,QAAM,EAAE,YAAY,MAAM,QAAQ,cAAc,IAAI,IAAI;AACxD,MAAI;AAGJ,MAAI,KAAK;AACP,UAAM,cAAc,KAAK,MAAM;AAAA,EACjC;AAEA,SAAO,KAAK,kBAAkB,OAAO,EAAE;AACvC,SAAO,KAAK,aAAa,cAAc,CAAC,EAAE;AAG1C,QAAM,eAAe,MAAM,mBAAmB,MAAM,MAAM;AAG1D,QAAM,gBAA+B,EAAE,KAAK;AAC5C,MAAI;AACJ,MAAI;AACF,aAAS,MAAM;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,aAAa,MAAM;AACzB,UAAM;AAAA,EACR;AAEA,SAAO,KAAK,cAAc;AAC1B,SAAO,KAAK,SAAS,IAAI,EAAE;AAG3B,MAAI,YAAoC;AACxC,MAAI,SAA8B;AAGlC,MAAI;AACJ,MAAI;AAEJ,MAAI,KAAK;AACP,gBAAY;AAAA,MACV;AAAA,QACE,QAAQ,IAAI;AAAA,QACZ,OAAO,IAAI;AAAA,QACX,WAAW,IAAI;AAAA,QACf,QAAQ,IAAI;AAAA,QACZ,cAAc,IAAI;AAAA,QAClB;AAAA,QACA,YAAY,IAAI;AAAA,QAChB,aAAa,MAAM,OAAO,UAAU;AAAA,MACtC;AAAA,MACA;AAAA,IACF;AACA,cAAU,MAAM;AAChB,WAAO,KAAK,4BAA4B,IAAI,sBAAsB,GAAI,IAAI;AAE1E,aAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,UACZ,QAAQ,IAAI;AAAA,UACZ,OAAO,IAAI;AAAA,UACX,WAAW,IAAI;AAAA,UACf,QAAQ,IAAI;AAAA,QACd;AAAA,QACA,YAAY,IAAI;AAAA,QAChB,UAAU,OAAO,SAAS,YAAY;AAEpC,cAAI;AACF,kBAAM,cAAc,KAAK,MAAM;AAAA,UACjC,SAAS,OAAO;AACd,mBAAO;AAAA,cACL,6DAA6D,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA,YAC7G;AACA;AAAA,UACF;AAEA,gBAAM,gBAAgB;AAAA,YACpB;AAAA,YACA,iBAAiB,KAAK,IAAI,CAAC;AAAA,UAC7B;AACA,UAAAG;AAAA,YACE;AAAA,YACA,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,YAC/B;AAAA,UACF;AAEA,gBAAM,kBAAkB,MAAM,IAAI,oBAAoB,eAAe;AAAA,YACnE,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,UAAU,IAAI;AAAA,UAChB,CAAC;AAED,mBAAS,MAAM;AAAA,YACb;AAAA,YACA,gBAAgB;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA;AAAA,YACE,IAAI;AAAA,YACJ,gBAAgB;AAAA,YAChB,KAAK,UAAU,OAAO;AAAA,YACtB;AAAA,UACF;AACA,0BAAgB;AAChB,cAAI,UAAW,WAAU,oBAAoB,OAAO;AAGpD,cAAI;AACF,kBAAM,qBAAqB,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AAC7C,cAAI;AACF,kBAAMC,KAAG,OAAO,iBAAiB,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AAGnD,iCAAuB,gBAAgB;AACvC,8BAAoB;AAEpB,iBAAO,KAAK,0BAA0B,OAAO,EAAE;AAAA,QACjD;AAAA,MACF;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM;AACb,WAAO,KAAK,0BAA0B,IAAI,iBAAiB,GAAI,IAAI;AAAA,EACrE;AAGA,QAAM,WAAW,OAAO,WAAmB;AACzC,WAAO,KAAK,YAAY,MAAM,oBAAoB;AAElD,UAAM,aAAa,WAAW,MAAM;AAClC,aAAO,MAAM,kCAAkC;AAC/C,cAAQ,KAAK,CAAC;AAAA,IAChB,GAAG,IAAK;AAER,QAAI;AACF,UAAI,OAAQ,QAAO,KAAK;AACxB,UAAI,UAAW,WAAU,KAAK;AAC9B,UAAI,OAAO,UAAU,SAAS;AAC5B,cAAM,OAAO,UAAU,QAAQ,UAAU;AAAA,MAC3C;AACA,YAAM,aAAa,MAAM;AAGzB,UAAI,qBAAsB,OAAM,qBAAqB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACrE,UAAI,kBAAmB,OAAMA,KAAG,OAAO,iBAAiB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAExE,aAAO,KAAK,mBAAmB;AAC/B,mBAAa,UAAU;AACvB,cAAQ,KAAK,CAAC;AAAA,IAChB,SAAS,OAAO;AACd,mBAAa,UAAU;AACvB,aAAO;AAAA,QACL,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAClF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,UAAQ,GAAG,WAAW,MAAM,SAAS,SAAS,CAAC;AAC/C,UAAQ,GAAG,UAAU,MAAM,SAAS,QAAQ,CAAC;AAG7C,QAAM,IAAI,QAAQ,MAAM;AAAA,EAAC,CAAC;AAC5B;AAEA,eAAe,cACb,KACA,QACe;AACf,MAAI;AACF,UAAM,UAAU,MAAM,aAAa;AAAA,MACjC,QAAQ,IAAI;AAAA,MACZ,OAAO,IAAI;AAAA,MACX,WAAW,IAAI;AAAA,MACf,QAAQ,IAAI;AAAA,IACd,CAAC;AACD,UAAM,QAAQ,OAAO,KAAK,OAAO,EAAE;AACnC,QAAI,QAAQ,GAAG;AACb,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,gBAAQ,IAAI,IAAI,IAAI;AAAA,MACtB;AACA,aAAO,KAAK,YAAY,KAAK,6BAA6B;AAAA,IAC5D;AAAA,EACF,SAAS,OAAO;AACd,QACE,iBAAiB,qBAChB,MAAM,WAAW,OAAO,MAAM,WAAW,MAC1C;AACA,YAAM;AAAA,IACR;AACA,WAAO;AAAA,MACL,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA,IAC5E;AACA,WAAO,KAAK,wDAAwD;AAAA,EACtE;AACF;;;AX5OA,SAAS,kBAA0B;AACjC,QAAM,WAAW,QAAQ,IAAI;AAC7B,QAAM,OAAO,YAAYC,MAAKC,SAAQ,GAAG,QAAQ;AACjD,SAAOD,MAAK,MAAM,UAAU;AAC9B;AAGA,eAAe,wBACb,YACA,SAC+D;AAC/D,QAAM,EAAE,qBAAAE,qBAAoB,IAAI,MAAM;AACtC,SAAOA,qBAAoB,YAAY,OAAO;AAChD;AAKA,eAAsB,WAAW,SAA2C;AAC1E,QAAM,QAAQ,YAAY;AAC1B,QAAM,MAAM;AAEZ,QAAM,SAAS,gBAAgB,OAAO;AAEtC,MAAI;AAEF,UAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAI,QAAQ,SAAS,QAAW;AAC9B,mBAAa,QAAQ,IAAI;AAAA,IAC3B;AAGA,UAAM,SAAS,QAAQ;AACvB,UAAM,YAAY,QAAQ;AAC1B,UAAM,QAAQ,gBAAgB;AAC9B,UAAM,SAAS,cAAc;AAC7B,UAAM,WAAW,QAAQ;AAEzB,QAAI;AAEJ,QAAI,QAAQ;AACV,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,UACL;AAAA;AAAA;AAAA,+BAEkC,MAAM;AAAA;AAAA,QAE1C;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,kBAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB,qBACE;AAAA,UACE,QAAQ,IAAI,+BACV,QAAQ,IAAI,sBACZ;AAAA,UACF;AAAA,QACF,IAAI;AAAA,QACN,gBACE;AAAA,UACE,QAAQ,IAAI,0BACV,QAAQ,IAAI,iBACZ;AAAA,UACF;AAAA,QACF,IAAI;AAAA,QACN,UACE,QAAQ,IAAI,sBACZ,QAAQ,IAAI,aACZ,gBAAgB;AAAA,QAClB;AAAA,QACA,qBAAqB;AAAA,MACvB;AAAA,IACF;AAGA,UAAM,aAAa,MAAM;AAAA,MACvB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAGA,WAAO,KAAK,kBAAkB;AAC9B,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,MAAM,QAAQ;AAAA,MAC7B,cAAc,QAAQ,UAAU,EAAE,OAAO,EAAE,IAAI;AAAA,MAC/C,KAAK;AAAA,IACP,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,WAAW,MAAM,WAAW,IAAI;AACtC,UAAM,eAAe,gBAAgB,KAAK;AAE1C,QAAI,QAAQ,MAAM;AAChB,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,aAAO,MAAM,UAAU,YAAY,EAAE;AAAA,IACvC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAUA,eAAe,kBACb,aACA,WACA,QACiB;AAEjB,MAAI,aAAa;AACf,UAAM,WAAW,MAAM,cAAc,WAAW;AAEhD,QAAI,SAAS,WAAW,SAAS;AAC/B,aAAO,KAAK,4BAA4B;AAAA,IAC1C,WAAW,SAAS,WAAW,OAAO;AACpC,aAAO,KAAK,0BAA0B;AAAA,IACxC,OAAO;AACL,aAAO,KAAK,WAAW,SAAS,IAAI,EAAE;AAAA,IACxC;AAEA,QAAI,iBAAiB,SAAS,IAAI,GAAG;AACnC,aAAOC,OAAK,QAAQ,SAAS,IAAI;AAAA,IACnC;AAGA,UAAM,WAAW,iBAAiB,SAAS,IAAI;AAC/C,WAAO,MAAM,sBAAsB;AACnC,UAAM,SAAS,MAAM,wBAAwB,UAAU;AAAA,MACrD,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU,WAAW;AAAA,IACvB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB;AAGA,MAAI,WAAW;AACb,WAAO,KAAK,6BAA6B;AACzC,QAAI;AACF,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B,QAAQ,UAAU;AAAA,QAClB,OAAO,UAAU;AAAA,QACjB,WAAW,UAAU;AAAA,QACrB,QAAQ,UAAU;AAAA,MACpB,CAAC;AAED,UAAI,OAAO,SAAS;AAClB,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA,iBAAiB,KAAK,IAAI,CAAC;AAAA,QAC7B;AACA,QAAAC;AAAA,UACE;AAAA,UACA,KAAK,UAAU,OAAO,SAAS,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AACA,eAAO,KAAK,mBAAmB,OAAO,OAAO,EAAE;AAE/C,eAAO,KAAK,kBAAkB;AAC9B,cAAM,eAAe,MAAM,wBAAwB,eAAe;AAAA,UAChE,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,UAAU,UAAU;AAAA,QACtB,CAAC;AAGD,YAAI;AACF,gBAAM,EAAE,YAAAC,YAAW,IAAI,MAAM;AAC7B,UAAAA;AAAA,YACE,UAAU;AAAA,YACV,aAAa;AAAA,YACb,KAAK,UAAU,OAAO,OAAO;AAAA,YAC7B,OAAO;AAAA,UACT;AAAA,QACF,QAAQ;AACN,iBAAO,MAAM,mCAAmC;AAAA,QAClD;AAEA,eAAO,aAAa;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA,MACrE;AAGA,YAAM,SAAS,UAAU,UAAU,QAAQ;AAC3C,UAAI,QAAQ;AACV,eAAO,KAAK,iCAAiC,OAAO,OAAO,GAAG;AAC9D,eAAO,OAAO;AAAA,MAChB;AAEA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc;AACpB,SAAO,MAAM,uCAAuC,WAAW,EAAE;AACjE,SAAOF,OAAK,QAAQ,WAAW;AACjC;AAKA,eAAsB,IAAI,SAAyC;AACjE,QAAM,YAAY,KAAK,IAAI;AAE3B,MAAI;AACF,UAAM,WAAW;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ,UAAU;AAAA,IAC5B,CAAC;AAED,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB,OAAO,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;;;AmB5RA;AACA;AAMA;AARA,OAAOG,YAAW;;;ACIlB,IAAM,eAAe,CAAC,WAAW,WAAW,UAAU,QAAQ,SAAS;AACvE,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,CAAC;AAEM,SAAS,iBAAiB,OAAgC;AAC/D,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AACvC,QAAM,UAAmC,CAAC;AAE1C,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,MAAM,YAAY,QAAQ,UAAU,QAAQ;AAAA,EACrE;AAEA,QAAM,YAAY;AAClB,QAAM,gBAAgB,OAAO,KAAK,SAAS;AAC3C,UAAQ,gBAAgB,cAAc;AAGtC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACrD,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,aAAa,IAAI;AAAA,QAC1B,MAAM;AAAA,MACR,CAAC;AACD;AAAA,IACF;AAEA,UAAM,MAAM;AAGZ,QAAI,IAAI,YAAY,QAAW;AAC7B,UAAI,OAAO,IAAI,YAAY,UAAU;AACnC,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SAAS;AAAA,UACT,MAAM;AAAA,QACR,CAAC;AAAA,MACH,WAAW,CAAC,cAAc,SAAS,IAAI,OAAO,GAAG;AAC/C,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SAAS,6CAA6C,IAAI,OAAO;AAAA,UACjE,OAAO,IAAI;AAAA,UACX,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,OAAO,cAAc;AAC9B,UAAI,OAAO,KAAK;AACd,YAAI,OAAO,IAAI,GAAG,MAAM,YAAY,IAAI,GAAG,MAAM,MAAM;AACrD,iBAAO,KAAK;AAAA,YACV,MAAM,GAAG,IAAI,IAAI,GAAG;AAAA,YACpB,SAAS,YAAY,GAAG;AAAA,YACxB,OAAO,IAAI,GAAG;AAAA,YACd,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,QAAW;AAC5B,UAAI,OAAO,IAAI,WAAW,YAAY,IAAI,WAAW,MAAM;AACzD,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SAAS;AAAA,UACT,MAAM;AAAA,QACR,CAAC;AAAA,MACH,OAAO;AACL;AAAA,UACE,IAAI;AAAA,UACJ,GAAG,IAAI;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,eAAe;AAChC,UAAM,UAAU,oBAAI,IAAY;AAChC,QAAI,UAAU;AACd,WAAO,SAAS;AACd,UAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SAAS,2BAA2B,CAAC,GAAG,SAAS,OAAO,EAAE,KAAK,UAAK,CAAC;AAAA,UACrE,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AACA,cAAQ,IAAI,OAAO;AACnB,YAAM,QAAQ,UAAU,OAAO;AAC/B,gBAAW,OAAO,WAAsB;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBACP,KACA,QACA,QACM;AACN,aAAW,CAAC,WAAW,WAAW,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC1D,QAAI,UAAU,KAAK,MAAM,IAAI;AAC3B,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,MAAM,IAAI,SAAS;AAAA,QAC5B,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AACD;AAAA,IACF;AAEA,QAAI,OAAO,gBAAgB,YAAY,gBAAgB,MAAM;AAC3D,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,MAAM,IAAI,SAAS;AAAA,QAC5B,SAAS,WAAW,SAAS;AAAA,QAC7B,OAAO;AAAA,QACP,MAAM;AAAA,MACR,CAAC;AACD;AAAA,IACF;AAEA,eAAW,CAAC,WAAW,WAAW,KAAK,OAAO;AAAA,MAC5C;AAAA,IACF,GAAG;AACD,UAAI,UAAU,KAAK,MAAM,IAAI;AAC3B,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,MAAM,IAAI,SAAS,IAAI,SAAS;AAAA,UACzC,SAAS;AAAA,UACT,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AAEA,UACE,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,MAAM,QAAQ,WAAW,GACzB;AACA,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,MAAM,IAAI,SAAS,IAAI,SAAS;AAAA,UACzC,SAAS;AAAA,UACT,OAAO,OAAO;AAAA,UACd,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AC5KA;AAGO,SAASC,eAAc,OAAgC;AAC5D,QAAM,SAAS,cAAkB,OAAO,QAAQ;AAEhD,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,MAAM;AAAA,IACN,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,SAAS,OAAO;AAAA,EAClB;AACF;;;ACZA,SAAS,mBAAAC,kBAAiB,YAAAC,iBAAgB;AAC1C,SAAS,WAAAC,gBAAe;AAOxB,IAAM,EAAE,oBAAAC,oBAAmB,IAAID;AAU/B,SAAS,WAAW,OAAoC;AACtD,MAAI,CAACD,UAAS,KAAK,EAAG,QAAO;AAC7B,MAAI,EAAE,aAAa,UAAU,EAAE,WAAW,OAAQ,QAAO;AACzD,SAAOA,UAAS,MAAM,KAAK;AAC7B;AAEO,SAAS,aACd,OACA,UAA+B,CAAC,GAChB;AAChB,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AACvC,QAAM,UAAmC,CAAC;AAK1C,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,MAAM,QAAQ,QAAQ,UAAU,QAAQ;AAAA,EACjE;AAGA,QAAM,aAAaE,oBAAmB,IAAI;AAG1C,aAAW,SAAS,WAAW,QAAQ;AACrC,WAAO,KAAK;AAAA,MACV,MAAM,MAAM,QAAQ;AAAA,MACpB,SAAS,MAAM;AAAA,MACf,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAGA,aAAW,SAAS,WAAW,UAAU;AACvC,aAAS,KAAK;AAAA,MACZ,MAAM,MAAM,QAAQ;AAAA,MACpB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAGA,QAAM,SAAkCF,UAAS,KAAK,IAAI,QAAQ,CAAC;AACnE,QAAM,aAAa,OAAO;AAC1B,QAAM,QAA6CA,UAAS,UAAU,IAClE,aACA;AACJ,MAAI,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC5C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAGA,MAAI,OAAO;AACT,UAAM,YAAY,OAAO,KAAK,KAAK;AACnC,YAAQ,YAAY;AACpB,YAAQ,YAAY,UAAU;AAG9B,QAAI,QAAQ,MAAM;AAChB,UAAI,CAAC,UAAU,SAAS,QAAQ,IAAI,GAAG;AACrC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,SAAS,QAAQ,IAAI,2BAA2B,UAAU,KAAK,IAAI,CAAC;AAAA,UAC7E,MAAM;AAAA,QACR,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,gBAAgB,QAAQ;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAGA,MAAI,oBAAoB;AACxB,MAAI,OAAO;AACT,eAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,KAAK,GAAG;AACzD,UAAI,CAACA,UAAS,SAAS,EAAG;AAC1B,YAAM,aAAa,UAAU;AAC7B,UAAI,CAACA,UAAS,UAAU,EAAG;AAC3B,YAAMG,UAAS,WAAW;AAC1B,UAAI,CAACH,UAASG,OAAM,EAAG;AACvB,YAAM,WAAWA,QAAO;AACxB,UAAI,CAACH,UAAS,QAAQ,EAAG;AAEzB,iBAAW,CAAC,SAAS,cAAc,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChE,YAAI,CAACA,UAAS,cAAc,EAAG;AAC/B,YAAI,CAAC,eAAe,WAAW,CAAC,eAAe,MAAM;AACnD,mBAAS,KAAK;AAAA,YACZ,MAAM,SAAS,QAAQ,2BAA2B,OAAO;AAAA,YACzD,SAAS,YAAY,OAAO;AAAA,YAC5B,YAAY;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AACA,2BAAqB,OAAO,KAAK,QAAQ,EAAE;AAAA,IAC7C;AAAA,EACF;AACA,MAAI,oBAAoB,GAAG;AACzB,YAAQ,eAAe;AAAA,EACzB;AAGA,MAAI,WAAW,SAAS;AACtB,YAAQ,UAAU,WAAW;AAAA,EAC/B;AAGA,MAAI,OAAO,WAAW,KAAK,WAAW,KAAK,GAAG;AAC5C,UAAM,aAAmC,MAAM;AAC/C,UAAM,YAAY,OAAO,KAAK,UAAU;AACxC,UAAM,eAAe,QAAQ,OAAO,CAAC,QAAQ,IAAI,IAAI;AAErD,QAAI,mBAAmB;AACvB,eAAW,QAAQ,cAAc;AAC/B,YAAM,eAAe,WAAW,IAAI;AACpC,UAAI,CAAC,aAAc;AAEnB,YAAM,cAAc,qBAAqB,YAAY;AACrD,iBAAW,QAAQ,aAAa;AAC9B,2BAAmB,MAAM,QAAQ,QAAQ;AAAA,MAC3C;AACA,0BAAoB,YAAY;AAGhC,YAAM,WAAW,MAAM;AACvB,UAAI,UAAU;AACZ,gCAAwB,cAAc,UAAU,QAAQ;AAAA,MAC1D;AAAA,IACF;AACA,YAAQ,qBAAqB;AAG7B,eAAW,QAAQ,cAAc;AAC/B,YAAM,eAAe,WAAW,IAAI;AACpC,UAAI,CAAC,aAAc;AAEnB,iBAAW,CAAC,UAAU,IAAI,KAAK,OAAO;AAAA,QACpC,aAAa,gBAAgB,CAAC;AAAA,MAChC,GAAG;AACD,YAAI,CAACA,UAAS,KAAK,MAAM,EAAG;AAC5B,cAAM,UAAU,KAAK,OAAO;AAC5B,YAAI,CAACA,UAAS,OAAO,EAAG;AAExB,mBAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,cAAI,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,SAAS,GAAG,GAAG;AAC3C,kBAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,qBAAS,KAAK;AAAA,cACZ,MAAM,eAAe,QAAQ;AAAA,cAC7B,SAAS,gBAAgB,GAAG;AAAA,cAC5B,YAAY,yBAAyB,MAAM,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,YAChF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,MAAI,OAAO,WAAW,KAAK,WAAW,KAAK,GAAG;AAC5C,UAAM,WAAW,MAAM;AACvB,UAAM,iBAAiB,QAAQ,OAC3B,QAAQ,QAAQ,WACd,CAAC,QAAQ,IAAI,IACb,CAAC,IACH,OAAO,KAAK,QAAQ;AAExB,eAAW,QAAQ,gBAAgB;AACjC,UAAI;AACF,QAAAD,iBAAgB,OAAO,MAAM;AAAA,UAC3B,UAAU;AAAA;AAAA,UACV,gBAAgB;AAAA,UAChB,WAAW,CAAC,YAAY;AACtB,qBAAS,KAAK,EAAE,MAAM,SAAS,IAAI,IAAI,QAAQ,CAAC;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,MACH,SAAS,KAAK;AAIZ,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAI,0BAA0B,KAAK,OAAO,GAAG;AAC3C,iBAAO,KAAK;AAAA,YACV,MAAM,SAAS,IAAI;AAAA,YACnB;AAAA,YACA,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAeA,SAAS,qBAAqB,QAAgC;AAC5D,QAAM,cAAgC,CAAC;AAGvC,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,WAAW,CAAC,CAAC,GAAG;AACjE,QAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,SAAU;AACtC,UAAM,YAAY,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,OAAO,CAAC,OAAO,IAAI;AACzE,eAAW,YAAY,WAAW;AAChC,YAAM,cAAc,OAAO,eAAe,QAAQ;AAClD,UAAI,aAAa,UAAU;AACzB,oBAAY,KAAK;AAAA,UACf,MAAM,EAAE,MAAM,UAAU,MAAM,UAAU,OAAO,SAAS;AAAA,UACxD,IAAI;AAAA,YACF,MAAM;AAAA,YACN,MAAM;AAAA,YACN,UAAU,YAAY;AAAA,UACxB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,aAAW,CAAC,MAAM,WAAW,KAAK,OAAO,QAAQ,OAAO,gBAAgB,CAAC,CAAC,GAAG;AAC3E,QAAI,CAAC,YAAY,QAAQ,CAAC,YAAY,SAAU;AAChD,UAAM,YAAY,MAAM,QAAQ,YAAY,IAAI,IAC5C,YAAY,OACZ,CAAC,YAAY,IAAI;AACrB,eAAW,YAAY,WAAW;AAChC,YAAM,kBAAkB,OAAO,eAAe,QAAQ;AACtD,UAAI,iBAAiB,UAAU;AAC7B,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,YACJ,MAAM;AAAA,YACN;AAAA,YACA,UAAU,YAAY;AAAA,UACxB;AAAA,UACA,IAAI;AAAA,YACF,MAAM;AAAA,YACN,MAAM;AAAA,YACN,UAAU,gBAAgB;AAAA,UAC5B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,gBAAgB,CAAC,CAAC,GAAG;AACpE,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,SAAU;AACpC,UAAM,cAAc,MAAM,QAAQ,KAAK,MAAM,IACzC,KAAK,SACL,CAAC,KAAK,MAAM;AAChB,eAAW,cAAc,aAAa;AACpC,YAAM,cAAc,OAAO,eAAe,UAAU;AACpD,UAAI,aAAa,UAAU;AACzB,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,MAAM;AAAA,YACN,UAAU,YAAY;AAAA,UACxB;AAAA,UACA,IAAI,EAAE,MAAM,eAAe,MAAM,UAAU,KAAK,SAAS;AAAA,QAC3D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBACP,MACA,QACA,UACM;AACN,QAAM,WAAW,OAAO,QAAQ,KAAK,KAAK,QAAQ,EAC/C,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,UAAa,GAAG,IAAI,SAAS,CAAC,EAC5D,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,EAAE;AAEhD,QAAM,QAAQ,OAAO,QAAQ,KAAK,GAAG,QAAQ,EAC1C,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,MAAS,EACtC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,GAAG,EAAE;AAE/C,QAAMK,SAAO,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,WAAM,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI;AAElF,MAAI,SAAS,WAAW,KAAK,MAAM,WAAW,GAAG;AAC/C,aAAS,KAAK;AAAA,MACZ,MAAAA;AAAA,MACA,SAAS;AAAA,MACT,YACE;AAAA,IACJ,CAAC;AACD;AAAA,EACF;AAEA,MAAI,WAAW;AACf,aAAW,OAAO,UAAU;AAC1B,eAAW,OAAO,OAAO;AACvB,UAAI,yBAAyB,IAAI,OAAO,IAAI,KAAK,GAAG;AAClD,mBAAW;AACX;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAU;AAAA,EAChB;AAEA,MAAI,CAAC,UAAU;AACb,WAAO,KAAK;AAAA,MACV,MAAAA;AAAA,MACA,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,SAAS,yBAAyB,GAAY,GAAqB;AACjE,MAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,MAAI,MAAM,QAAQ,MAAM,KAAM,QAAO,MAAM;AAC3C,MAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,EAAG,QAAO;AACjD,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,UAAM,QAAQ,OAAO,KAAK,CAAW;AACrC,UAAM,QAAQ,OAAO,KAAK,CAAW;AACrC,UAAM,SAAS,MAAM,OAAO,CAAC,MAAM,MAAM,SAAS,CAAC,CAAC;AACpD,WAAO,OAAO,UAAU,KAAK,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI;AAAA,EACjE;AACA,SAAO;AACT;AAEA,SAAS,wBACP,QACA,UACA,UACM;AACN,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,gBAAgB,CAAC,CAAC,GAAG;AACpE,QAAI,CAAC,KAAK,SAAU;AAEpB,eAAW,CAAC,QAAQ,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,GAAG;AAC7D,UAAI,CAAC,QAAQ,MAAM,OAAO,QAAQ,OAAO,SAAU;AAEnD,YAAM,QAAQ,QAAQ;AACtB,UAAI,CAAC,MAAM,UAAU,CAAC,MAAM,OAAQ;AAIpC,UAAI,UAAU;AACd,iBAAW,QAAQ,OAAO,OAAO,QAAQ,GAAG;AAC1C,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,OAAQ;AAEb,cAAM,gBAAgB,OAAO,MAAM,MAAM,KAAK,OAAO,GAAG;AACxD,YAAI,CAAC,cAAe;AAEpB,cAAM,eAAe,cAAc,MAAM,MAAM,KAAK,cAAc,GAAG;AACrE,YAAI,cAAc;AAChB,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS;AACX,iBAAS,KAAK;AAAA,UACZ,MAAM,eAAe,IAAI,aAAa,MAAM;AAAA,UAC5C,SAAS,4BAA4B,MAAM,MAAM,IAAI,MAAM,MAAM;AAAA,UACjE,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACvZO,SAAS,gBAAgB,OAAgC;AAC9D,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AACvC,QAAM,UAAmC,CAAC;AAG1C,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,MAAM,WAAW,QAAQ,UAAU,QAAQ;AAAA,EACpE;AAEA,QAAM,UAAU;AAChB,QAAM,WAAW,OAAO,KAAK,OAAO;AACpC,UAAQ,gBAAgB;AACxB,UAAQ,eAAe,SAAS;AAGhC,WAAS,QAAQ,CAAC,SAAS,UAAU;AAEnC,UAAM,aAAa,QAAQ,SAAS,GAAG;AACvC,UAAM,WAAW,QAAQ,SAAS,GAAG;AAErC,QAAI,CAAC,cAAc,CAAC,UAAU;AAC5B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,0BAA0B,OAAO;AAAA,QAC1C,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,QAAI,YAAY,OAAO,UAAU,SAAS,SAAS,GAAG;AACpD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YACE;AAAA,MACJ,CAAC;AAAA,IACH;AAGA,UAAM,OAAO,QAAQ,OAAO;AAC5B,UAAM,cAAc,MAAM,QAAQ,IAAI,IAClC,KAAK,MAAM,CAAC,MAAM,OAAO,MAAM,YAAY,MAAM,IAAI,IACrD,OAAO,SAAS,YAAY,SAAS;AAEzC,QAAI,CAAC,aAAa;AAChB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxEA,OAAO,SAAS;AAChB,SAAS,0BAA0B;AAOnC,IAAM,gBAAgB;AAEtB,IAAM,WAAW,CAAC,gBAAgB,WAAW,cAAc;AAM3D,SAAS,aACPC,QACA,YAC2E;AAC3E,QAAM,QAAQ,WAAW;AACzB,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAGhD,QAAM,WAAW,OAAO,KAAK,KAAK,EAAE,CAAC;AACrC,QAAM,OAAO,MAAM,QAAQ;AAC3B,MAAI,CAAC,KAAM,QAAO,SAAS,QAAQ;AAEnC,QAAM,QAAQA,OAAK,MAAM,GAAG;AAE5B,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,CAAC,SAAS,GAAG,IAAI;AACvB,QAAI,CAAC,SAAS,SAAS,OAAoC,GAAG;AAC5D,aAAO,oBAAoB,OAAO,sBAAsB,SAAS,KAAK,IAAI,CAAC;AAAA,IAC7E;AACA,UAAM,cAAc,KAAK,OAAO;AAChC,QAAI,CAAC,eAAe,EAAE,OAAO,cAAc;AACzC,aAAO,UAAU,GAAG,kBAAkB,OAAO;AAAA,IAC/C;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO,YAAY,GAAG;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,UAAiE,CAAC;AAExE,eAAW,WAAW,UAAU;AAC9B,YAAM,cAAc,KAAK,OAAO;AAChC,UAAI,eAAe,OAAO,aAAa;AACrC,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,OAAO,YAAY,GAAG;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO,UAAU,GAAG;AAAA,IACtB;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,WAAW,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AACxD,aAAO,kBAAkB,GAAG,iCAAiC,QAAQ,0CAA0C,GAAG;AAAA,IACpH;AACA,WAAO,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,KAAK,OAAO,QAAQ,CAAC,EAAE,MAAM;AAAA,EACrE;AAEA,SAAO,iBAAiBA,MAAI;AAC9B;AAMA,eAAsB,cACpBA,QACA,YACyB;AAEzB,QAAM,WAAW,aAAaA,QAAM,UAAU;AAC9C,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ,CAAC,EAAE,MAAAA,QAAM,SAAS,UAAU,MAAM,mBAAmB,CAAC;AAAA,MAC9D,UAAU,CAAC;AAAA,MACX,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,EAAE,SAAS,KAAK,MAAM,IAAI;AAGhC,QAAM,cAAc,MAAM;AAC1B,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ,CAAC;AAAA,MACT,UAAU,CAAC;AAAA,MACX,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAGA,MAAIC;AACJ,MAAI;AACF,UAAM,OAAO,MAAM,mBAAmB,aAAa;AAAA,MACjD,QAAQ;AAAA,IACV,CAAC;AACD,IAAAA,WAAU,KAAK;AAAA,EACjB,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,QACN;AAAA,UACE,MAAAD;AAAA,UACA,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UAClD,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,UAAU,CAAC;AAAA,MACX,SAAS,EAAE,SAAS,KAAK,SAAS,YAAY;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,iBAAiBC,UAAS;AAChC,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ,CAAC;AAAA,MACT,UAAU,CAAC;AAAA,MACX,SAAS,EAAE,SAAS,KAAK,MAAM,iCAAiC;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACrB,QAAM,WAAW,QAAQ;AAEzB,QAAM,MAAM,IAAI,IAAI,EAAE,WAAW,KAAK,CAAC;AACvC,QAAMC,YAAW,IAAI,QAAQ,cAAwB;AACrD,QAAM,UAAUA,UAAS,YAAY,CAAC,CAAC;AAEvC,MAAI,CAAC,SAAS;AACZ,UAAM,UAA6BA,UAAS,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACpE,MAAM,EAAE,gBAAgB;AAAA,MACxB,SAAS,EAAE,WAAW;AAAA,MACtB,MAAM,EAAE;AAAA,IACV,EAAE;AAEF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA,UAAU,CAAC;AAAA,MACX,SAAS,EAAE,SAAS,KAAK,SAAS,YAAY;AAAA,IAChD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,SAAS,EAAE,SAAS,KAAK,SAAS,YAAY;AAAA,EAChD;AACF;;;ALrJA,eAAsB,SACpB,MACA,OACA,UAA4C,CAAC,GACpB;AAEzB,MAAI,WAAW;AACf,MAAI,OAAO,UAAU,UAAU;AAC7B,eAAW,MAAM,mBAAmB,OAAO;AAAA,MACzC,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAGA,MAAI,QAAQ,MAAM;AAChB,WAAO,cAAc,QAAQ,MAAM,QAAmC;AAAA,EACxE;AAEA,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,iBAAiB,QAAQ;AAAA,IAClC,KAAK;AACH,aAAOC,eAAc,QAAQ;AAAA,IAC/B,KAAK;AACH,aAAO,aAAa,UAAU,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,gBAAgB,QAAQ;AAAA,IACjC;AACE,YAAM,IAAI,MAAM,4BAA4B,IAAI,EAAE;AAAA,EACtD;AACF;AAKA,SAAS,aACP,QACA,SACQ;AACR,MAAI,QAAQ,MAAM;AAChB,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,cAAc,OAAO,IAAI,KAAK;AACzC,QAAM,KAAK,EAAE;AAGb,MAAI,QAAQ,WAAW,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,GAAG;AAC7D,UAAM,KAAK,UAAU;AACrB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,OAAO,GAAG;AACzD,YAAM,KAAK,KAAK,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,IACjD;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,KAAK,qBAAqB;AAGhC,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,KAAKC,OAAM,IAAI,YAAO,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC;AAAA,EAC7D;AAGA,aAAW,WAAW,OAAO,UAAU;AACrC,UAAM,KAAKA,OAAM,OAAO,YAAO,QAAQ,IAAI,KAAK,QAAQ,OAAO,EAAE,CAAC;AAClE,QAAI,QAAQ,YAAY;AACtB,YAAM,KAAKA,OAAM,KAAK,cAAS,QAAQ,UAAU,EAAE,CAAC;AAAA,IACtD;AAAA,EACF;AAGA,MAAI,OAAO,OAAO;AAChB,UAAM,KAAKA,OAAM,MAAM,4BAAuB,CAAC;AAAA,EACjD;AAEA,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ,YAAY,OAAO,OAAO,MAAM,cAAc,OAAO,SAAS,MAAM;AAAA,EACtE;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,eAAsB,gBACpB,SACe;AAEf,QAAM,SAAS,gBAAgB,EAAE,GAAG,SAAS,QAAQ,KAAK,CAAC;AAE3D,MAAI;AAEF,QAAI;AACJ,QAAI,aAAa,KAAK,CAAC,QAAQ,OAAO;AACpC,YAAM,eAAe,MAAM,UAAU;AACrC,UAAI;AACF,gBAAQ,KAAK,MAAM,YAAY;AAAA,MACjC,QAAQ;AACN,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AAAA,IACF,OAAO;AACL,cAAQ,QAAQ;AAAA,IAClB;AAGA,UAAM,SAAS,MAAM,SAAS,QAAQ,MAAM,OAAO;AAAA,MACjD,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,IAChB,CAAC;AAGD,UAAM,YAAY,aAAa,QAAQ;AAAA,MACrC,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,IACnB,CAAC;AACD,UAAM,YAAY,YAAY,MAAM,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAG9D,QAAI,CAAC,OAAO,OAAO;AACjB,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,QAAQ,UAAU,OAAO,SAAS,SAAS,GAAG;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,UAAM,eAAe,gBAAgB,KAAK;AAE1C,QAAI,QAAQ,MAAM;AAChB,YAAM,cAAc,KAAK;AAAA,QACvB;AAAA,UACE,OAAO;AAAA,UACP,MAAM,QAAQ;AAAA,UACd,QAAQ;AAAA,YACN,EAAE,MAAM,SAAS,SAAS,cAAc,MAAM,cAAc;AAAA,UAC9D;AAAA,UACA,UAAU,CAAC;AAAA,UACX,SAAS,CAAC;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,YAAY,cAAc,MAAM,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAClE,OAAO;AACL,aAAO,MAAM,UAAU,YAAY,EAAE;AAAA,IACvC;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AMtLA;AACA;AAHA,SAAS,gBAAgB;AACzB,SAAS,KAAAC,UAAS;AAelB,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EACxC,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,iBAAiBA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjC,yBAAyBA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE7C,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACxC,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AACzC,CAAC;AAOD,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AACzB,CAAC;AAyDD,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAChC,IAAM,2BAA2B;AAEjC,eAAe,cAAc,KAA4B;AACvD,QAAM,EAAE,SAAS,KAAK,IAAI,MAAM,OAAO,MAAM;AAC7C,QAAM,KAAK,GAAG;AAChB;AAEA,eAAsB,aACpB,SACe;AACf,QAAM,SAAS,gBAAgB,OAAO;AAEtC,MAAI;AACF,UAAM,SAAS,MAAM,MAAM,EAAE,KAAK,QAAQ,IAAI,CAAC;AAE/C,QAAI,QAAQ,MAAM;AAChB,aAAO,KAAK,MAAM;AAAA,IACpB,WAAW,OAAO,SAAS;AACzB,aAAO,KAAK,gBAAgB,OAAO,KAAK,EAAE;AAC1C,aAAO,KAAK,mBAAmB,OAAO,UAAU,EAAE;AAAA,IACpD;AAEA,YAAQ,KAAK,OAAO,UAAU,IAAI,CAAC;AAAA,EACrC,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,QAAI,QAAQ,MAAM;AAChB,aAAO,KAAK,EAAE,SAAS,OAAO,OAAO,QAAQ,CAAC;AAAA,IAChD,OAAO;AACL,aAAO,MAAM,OAAO;AAAA,IACtB;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAOA,eAAsB,kBACpB,UAA6B,CAAC,GACH;AAC3B,QAAM,SAAS,QAAQ,OAAO,cAAc;AAC5C,QAAM,IAAI,QAAQ,SAAS,WAAW;AAEtC,QAAM,WAAW,MAAM,EAAE,GAAG,MAAM,yBAAyB;AAAA,IACzD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,EACzB,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,SAAS,KAAK;AAAA,EAC5B,QAAQ;AACN,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,QAAM,SAAS,yBAAyB,UAAU,GAAG;AACrD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,SAAO;AAAA,IACL,YAAY,OAAO,KAAK;AAAA,IACxB,UAAU,OAAO,KAAK;AAAA,IACtB,iBAAiB,OAAO,KAAK;AAAA,IAC7B,yBAAyB,OAAO,KAAK;AAAA,IACrC,WAAW,OAAO,KAAK;AAAA,IACvB,UAAU,OAAO,KAAK;AAAA,EACxB;AACF;AAcA,eAAsB,aACpB,YACA,UAAuB,CAAC,GACH;AACrB,QAAM,SAAS,QAAQ,OAAO,cAAc;AAC5C,QAAM,IAAI,QAAQ,SAAS,WAAW;AACtC,QAAM,YAAY,QAAQ,aAAa;AACvC,MAAI,aAAa,QAAQ,cAAc;AAEvC,QAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAGlD,QAAI,KAAK,IAAI,KAAK,SAAU;AAE5B,UAAM,YAAY,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC;AACnD,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,gBAAgB,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAEpE,QAAI;AACJ,QAAI;AACF,sBAAgB,MAAM,EAAE,GAAG,MAAM,0BAA0B;AAAA,QACzD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,YAAY,UAAU,SAAS,EAAE,CAAC;AAAA,QACzD,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,mBAAa,aAAa;AAC1B,UAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AAErD;AAAA,MACF;AACA,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,aAAa;AAAA,IAC5B;AAEA,UAAM,OAAO,MAAM,cAAc,aAAa;AAC9C,QAAI,SAAS,WAAW;AACtB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,cAAc,IAAI;AAGpB,UAAI,KAAK,UAAU,QAAW;AAC5B;AAAA,MACF;AACA,YAAM,cAAc,oBAAoB,UAAU,IAAI;AACtD,UAAI,CAAC,YAAY,SAAS;AACxB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,OAAO;AAAA,QACT;AAAA,MACF;AACA,YAAM,EAAE,OAAO,MAAM,IAAI,YAAY;AACrC,kBAAY,EAAE,OAAO,OAAO,OAAO,CAAC;AACpC,YAAM,aAAa,cAAc;AACjC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,UAAU,wBAAyB;AAC5C,QAAI,KAAK,UAAU,aAAa;AAC9B,oBAAc;AACd;AAAA,IACF;AAGA,UAAM,WAAoB,KAAK;AAC/B,QAAI;AACJ,QAAI,OAAO,aAAa,UAAU;AAChC,iBAAW;AAAA,IACb,WACE,YACA,OAAO,aAAa,YACpB,aAAa,YACb,OAAQ,SAAkC,YAAY,UACtD;AACA,iBAAY,SAAiC;AAAA,IAC/C,OAAO;AACL,iBAAW;AAAA,IACb;AACA,WAAO,EAAE,SAAS,OAAO,QAAQ,SAAS,OAAO,SAAS;AAAA,EAC5D;AAEA,SAAO,EAAE,SAAS,OAAO,QAAQ,UAAU;AAC7C;AAEA,IAAM,YAAY,uBAAO,gBAAgB;AAEzC,eAAe,cACb,UACqD;AACrD,MAAI;AACF,UAAM,SAAkB,MAAM,SAAS,KAAK;AAC5C,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,MAAM,UAAwB,CAAC,GAAyB;AAC5E,QAAM,cAAc,QAAQ,SAAS,WAAW;AAChD,QAAM,YAAY,QAAQ;AAG1B,MAAI;AACJ,MAAI;AACF,iBAAa,MAAM,kBAAkB;AAAA,MACnC,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,EAAE,SAAS,OAAO,OAAO,gCAAgC;AAAA,EAClE;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,SAAS,CAAC,QAAgB,QAAQ,OAAO,MAAM,MAAM,IAAI;AAC/D,SAAO;AAAA,wBAA2B,QAAQ,EAAE;AAC5C,SAAO,qBAAqB,2BAA2B,eAAe;AAAA,CAAI;AAE1E,QAAM,SAAS,QAAQ,WAAW;AAClC,MAAI;AACF,UAAM,OAAO,2BAA2B,eAAe;AACvD,WAAO,sBAAsB;AAAA,EAC/B,QAAQ;AACN,WAAO,mDAAmD;AAAA,EAC5D;AAEA,SAAO,2DAA2D;AAIlE,QAAM,YAAY,YAAY,MAAO;AACrC,QAAM,cAAc,YAAY,KAAK;AAErC,MAAI,QAAQ,oBAAoB,QAAW;AAEzC,UAAM,SAAS,aAAa,cAAc;AAC1C,UAAM,IAAI;AACV,QAAI,eAAe;AACnB,QAAI,WAAW;AACf,UAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,WAAO,KAAK,IAAI,IAAI,YAAY,WAAW,QAAQ,iBAAiB;AAClE;AACA,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AAEpD,YAAM,YAAY,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC;AACnD,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,gBAAgB,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAEpE,UAAI;AACJ,UAAI;AACF,wBAAgB,MAAM,EAAE,GAAG,MAAM,0BAA0B;AAAA,UACzD,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,YAAY,UAAU,SAAS,EAAE,CAAC;AAAA,UACzD,QAAQ,WAAW;AAAA,QACrB,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,qBAAa,aAAa;AAC1B,YAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AACrD;AAAA,QACF;AACA,cAAM;AAAA,MACR,UAAE;AACA,qBAAa,aAAa;AAAA,MAC5B;AAEA,YAAM,OAAO,MAAM,cAAc,aAAa;AAC9C,UAAI,SAAS,WAAW;AACtB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,cAAc,IAAI;AACpB,YAAI,KAAK,UAAU,QAAW;AAC5B;AAAA,QACF;AACA,cAAM,cAAc,oBAAoB,UAAU,IAAI;AACtD,YAAI,CAAC,YAAY,SAAS;AACxB,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,QACF;AACA,cAAM,EAAE,OAAO,MAAM,IAAI,YAAY;AACrC,oBAAY,EAAE,OAAO,OAAO,OAAO,CAAC;AACpC,cAAM,aAAa,cAAc;AACjC,eAAO,EAAE,SAAS,MAAM,OAAO,WAAW;AAAA,MAC5C;AAEA,UAAI,KAAK,UAAU,wBAAyB;AAC5C,UAAI,KAAK,UAAU,aAAa;AAC9B,wBAAgB;AAChB;AAAA,MACF;AAEA,YAAM,WAAoB,KAAK;AAC/B,YAAM,WACJ,OAAO,aAAa,WAAW,WAAW;AAC5C,aAAO,EAAE,SAAS,OAAO,OAAO,SAAS;AAAA,IAC3C;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,aAAa,MAAM,aAAa,YAAY;AAAA,IAChD,KAAK;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,WAAW,SAAS;AACtB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,WAAW;AAAA,MAClB,YAAY,WAAW;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,SAAS;AACjC,WAAO,EAAE,SAAS,OAAO,OAAO,WAAW,MAAM;AAAA,EACnD;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;;;AC9bA;AACA;AAOA,eAAsB,cACpB,SACe;AACf,QAAM,SAAS,gBAAgB,OAAO;AAEtC,QAAM,UAAU,aAAa;AAC7B,QAAM,aAAa,cAAc;AAEjC,MAAI,QAAQ,MAAM;AAChB,WAAO,KAAK,EAAE,SAAS,MAAM,QAAQ,CAAC;AAAA,EACxC,WAAW,SAAS;AAClB,WAAO,KAAK,kCAAkC,UAAU,EAAE;AAAA,EAC5D,OAAO;AACL,WAAO,KAAK,8BAA8B;AAAA,EAC5C;AAEA,UAAQ,KAAK,CAAC;AAChB;;;ACvBA;AACA;AACA;AAJA,OAAO,kBAAkB;AAMlB,SAAS,kBAAkB;AAChC,QAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,yBAAyB;AAKrD,SAAO,aAAoB;AAAA,IACzB,SAAS,cAAc;AAAA,IACvB,SAAS;AAAA,MACP,eAAe,UAAU,KAAK;AAAA,MAC9B,gBAAgB;AAAA,MAChB,GAAG,qBAAqB;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;;;ACLO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,SAA2B;AACtD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO,SAAS;AACrB,SAAK,UAAU,SAAS;AACxB,SAAK,aAAa,SAAS;AAC3B,SAAK,gBAAgB,SAAS;AAC9B,SAAK,SAAS,SAAS;AACvB,SAAK,UAAU,SAAS;AACxB,SAAK,OAAO,SAAS;AAAA,EACvB;AACF;AASO,SAAS,cAAc,OAAgB,iBAAgC;AAC5E,MACE,SACA,OAAO,UAAU,YACjB,WAAW,SACX,OAAQ,MAAkC,UAAU,UACpD;AACA,UAAM,QAAS,MAA6C;AAC5D,UAAM,UAAW,MAAM,WAAsB;AAC7C,UAAM,OAAO,MAAM;AACnB,UAAM,UAAW,MAAM,SAAqC;AAG5D,UAAM,UAA2B,EAAE,MAAM,QAAQ;AACjD,QAAI,SAAS,mBAAmB;AAC9B,cAAQ,aAAa,MAAM;AAC3B,cAAQ,gBAAgB,MAAM;AAC9B,cAAQ,SAAS,MAAM;AACvB,cAAQ,UAAU,MAAM;AACxB,cAAQ,OAAO,MAAM;AAAA,IACvB;AACA,UAAM,IAAI,SAAS,SAAS,OAAO;AAAA,EACrC;AACA,QAAM,IAAI,SAAS,eAAe;AACpC;AAYO,SAAS,eAAe,KAAqB;AAElD,MAAI,eAAe,YAAY,IAAI,SAAS,mBAAmB;AAC7D,YAAQ,MAAM;AAAA,EAAK,IAAI,OAAO;AAAA,CAAI;AAClC,QAAI,IAAI,QAAS,SAAQ,MAAM,cAAc,IAAI,OAAO,EAAE;AAC1D,QAAI,IAAI,KAAM,SAAQ,MAAM,cAAc,IAAI,IAAI;AAAA,CAAI;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAQ,MAAM,OAAO;AACrB,UAAQ,KAAK,CAAC;AAEhB;;;AC5FA;AACA;AAKA,eAAsB,SAAS;AAC7B,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,kBAAkB;AAC3D,MAAI,MAAO,OAAM,IAAI,MAAM,MAAM,OAAO,WAAW,mBAAmB;AACtE,SAAO;AACT;AASA,eAAsB,cACpB,SACe;AACf,QAAM,SAAS,gBAAgB,OAAO;AACtC,MAAI;AACF,UAAM,SAAS,MAAM,OAAO;AAC5B,QAAI,QAAQ,MAAM;AAChB,YAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAAA,IAC5D,OAAO;AACL,YAAM,OAAO;AACb,UAAI,KAAK,MAAO,QAAO,KAAK,GAAG,KAAK,KAAK,EAAE;AAC3C,UAAI,KAAK,OAAQ,QAAO,KAAK,SAAS,KAAK,MAAM,EAAE;AACnD,UAAI,KAAK,UAAW,QAAO,KAAK,YAAY,KAAK,SAAS,EAAE;AAAA,IAC9D;AAAA,EACF,SAAS,OAAO;AACd,mBAAe,KAAK;AAAA,EACtB;AACF;;;ACrCA;AACA;AAKA,eAAsB,eAAe;AACnC,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,eAAe;AACxD,MAAI,MAAO,OAAM,IAAI,MAAM,MAAM,OAAO,WAAW,yBAAyB;AAC5E,SAAO;AACT;AAEA,eAAsB,WAAW,UAAkC,CAAC,GAAG;AACrE,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,6BAA6B;AAAA,IACpE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,EAAE;AAAA,EACpC,CAAC;AACD,MAAI,MAAO,OAAM,IAAI,MAAM,MAAM,OAAO,WAAW,uBAAuB;AAC1E,SAAO;AACT;AAEA,eAAsB,cAAc,SAA2B;AAC7D,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK,iBAAiB;AAAA,IACzD,MAAM,EAAE,MAAM,QAAQ,KAAK;AAAA,EAC7B,CAAC;AACD,MAAI;AACF,UAAM,IAAI,MAAM,MAAM,OAAO,WAAW,0BAA0B;AACpE,SAAO;AACT;AAEA,eAAsB,cAAc,SAGjC;AACD,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,MAAM,6BAA6B;AAAA,IACtE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,EAAE;AAAA,IAClC,MAAM,EAAE,MAAM,QAAQ,KAAK;AAAA,EAC7B,CAAC;AACD,MAAI;AACF,UAAM,IAAI,MAAM,MAAM,OAAO,WAAW,0BAA0B;AACpE,SAAO;AACT;AAEA,eAAsB,cAAc,UAAkC,CAAC,GAAG;AACxE,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,OAAO,6BAA6B;AAAA,IACvE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,EAAE;AAAA,EACpC,CAAC;AACD,MAAI;AACF,UAAM,IAAI,MAAM,MAAM,OAAO,WAAW,0BAA0B;AACpE,SAAO,QAAQ,EAAE,SAAS,KAAK;AACjC;AAWA,eAAe,aACb,IACA,SACe;AACf,MAAI;AACF,UAAM,SAAS,MAAM,GAAG;AACxB,UAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAAA,EAC5D,SAAS,OAAO;AACd,mBAAe,KAAK;AAAA,EACtB;AACF;AAEA,eAAsB,oBACpB,SACe;AACf,QAAM,aAAa,MAAM,aAAa,GAAG,OAAO;AAClD;AAEA,eAAsB,kBACpB,WACA,SACe;AACf,QAAM;AAAA,IACJ,MAAM,WAAW,EAAE,WAAW,aAAa,QAAQ,QAAQ,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,MACA,SACe;AACf,QAAM,aAAa,MAAM,cAAc,EAAE,KAAK,CAAC,GAAG,OAAO;AAC3D;AAEA,eAAsB,qBACpB,WACA,SACe;AACf,QAAM,OAAO,QAAQ;AACrB,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AACA,QAAM;AAAA,IACJ,MACE,cAAc;AAAA,MACZ,WAAW,aAAa,QAAQ;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,WACA,SACe;AACf,QAAM;AAAA,IACJ,MAAM,cAAc,EAAE,WAAW,aAAa,QAAQ,QAAQ,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;;;ACjIA;AACA;AACA;AA2BA,eAAsB,UAAU,UAA4B,CAAC,GAAG;AAC9D,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,mCAAmC;AAAA,IAC1E,QAAQ;AAAA,MACN,MAAM,EAAE,WAAW,GAAG;AAAA,MACtB,OAAO;AAAA,QACL,MAAM,QAAQ;AAAA,QACd,OAAO,QAAQ;AAAA,QACf,iBAAiB,QAAQ,iBAAiB,SAAS;AAAA,MACrD;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,MAAO,eAAc,OAAO,sBAAsB;AACtD,SAAO;AACT;AAEA,eAAsB,aACpB,SACyB;AACzB,QAAM,EAAE,SAAS,IAAI,MAAM,aAAa;AACxC,QAAM,UAA0B,CAAC;AAEjC,aAAW,WAAW,UAAU;AAC9B,UAAM,OAAO,MAAM,UAAU,EAAE,GAAG,SAAS,WAAW,QAAQ,GAAG,CAAC;AAClE,YAAQ,KAAK;AAAA,MACX,SAAS,EAAE,IAAI,QAAQ,IAAI,MAAM,QAAQ,KAAK;AAAA,MAC9C,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,QAAQ,SAI3B;AACD,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO;AAAA,IACnC;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,QACN,MAAM,EAAE,WAAW,IAAI,QAAQ,QAAQ,OAAO;AAAA,QAC9C,OAAO,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAO,eAAc,OAAO,oBAAoB;AACpD,SAAO;AACT;AAEA,eAAsB,WAAW,SAI9B;AACD,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK,mCAAmC;AAAA,IAC3E,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,EAAE;AAAA;AAAA,IAElC,MAAM,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAQ;AAAA,EACtD,CAAC;AACD,MAAI,MAAO,eAAc,OAAO,uBAAuB;AACvD,SAAO;AACT;AAEA,eAAsB,WAAW,SAM9B;AACD,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,OAAgC,CAAC;AACvC,MAAI,QAAQ,SAAS,OAAW,MAAK,OAAO,QAAQ;AACpD,MAAI,QAAQ,YAAY,OAAW,MAAK,SAAS,QAAQ;AACzD,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO;AAAA,IACnC;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,MAAM,EAAE,WAAW,IAAI,QAAQ,QAAQ,OAAO,EAAE;AAAA;AAAA,MAE1D;AAAA,MACA,GAAI,QAAQ,cAAc;AAAA,QACxB,SAAS,EAAE,gBAAgB,+BAA+B;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAO,eAAc,OAAO,uBAAuB;AACvD,SAAO;AACT;AAEA,eAAsB,WAAW,SAG9B;AACD,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO;AAAA,IACnC;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,MAAM,EAAE,WAAW,IAAI,QAAQ,QAAQ,OAAO,EAAE;AAAA,IAC5D;AAAA,EACF;AACA,MAAI,MAAO,eAAc,OAAO,uBAAuB;AACvD,SAAO,QAAQ,EAAE,SAAS,KAAK;AACjC;AAEA,eAAsB,cAAc,SAIjC;AACD,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO;AAAA,IACnC;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,MAAM,EAAE,WAAW,IAAI,QAAQ,QAAQ,OAAO,EAAE;AAAA,MAC1D,MAAM,EAAE,MAAM,QAAQ,KAAK;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,MAAO,eAAc,OAAO,0BAA0B;AAC1D,SAAO;AACT;AAUA,eAAeC,cACb,IACA,SACe;AACf,MAAI;AACF,UAAM,SAAS,MAAM,GAAG;AACxB,UAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAAA,EAC5D,SAAS,OAAO;AACd,mBAAe,KAAK;AAAA,EACtB;AACF;AAEA,eAAsB,iBACpB,SAKe;AACf,QAAMA;AAAA,IACJ,MACE,UAAU;AAAA,MACR,WAAW,QAAQ;AAAA,MACnB,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAsB,eACpB,QACA,SACe;AACf,QAAMA;AAAA,IACJ,MAAM,QAAQ,EAAE,QAAQ,WAAW,QAAQ,QAAQ,CAAC;AAAA,IACpD;AAAA,EACF;AACF;AAEA,eAAsB,kBACpB,MACA,SACe;AACf,QAAM,UAAU,QAAQ,UACpB,KAAK,MAAM,QAAQ,OAAO,IAC1B,KAAK,MAAM,MAAM,cAAc,CAAC;AACpC,QAAMA;AAAA,IACJ,MAAM,WAAW,EAAE,MAAM,SAAS,WAAW,QAAQ,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,eAAsB,kBACpB,QACA,SACe;AACf,QAAM,UAAU,QAAQ,UAAU,KAAK,MAAM,QAAQ,OAAO,IAAI;AAChE,QAAMA;AAAA,IACJ,MACE,WAAW;AAAA,MACT;AAAA,MACA,MAAM,QAAQ;AAAA,MACd;AAAA,MACA,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAsB,kBACpB,QACA,SACe;AACf,QAAMA;AAAA,IACJ,MAAM,WAAW,EAAE,QAAQ,WAAW,QAAQ,QAAQ,CAAC;AAAA,IACvD;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,QACA,SACe;AACf,QAAMA;AAAA,IACJ,MACE,cAAc,EAAE,QAAQ,MAAM,QAAQ,MAAM,WAAW,QAAQ,QAAQ,CAAC;AAAA,IAC1E;AAAA,EACF;AACF;AAEA,eAAe,gBAAiC;AAC9C,MAAI,CAAC,aAAa,GAAG;AACnB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO,UAAU;AACnB;;;AC1QA;AACA;AAMA;AACA;AACA;AAMA,eAAe,kBAAkB,SAIb;AAClB,QAAM,OAAO,MAAM,QAAQ;AAAA,IACzB,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,EACrB,CAAC;AACD,QAAM,WAAY,KACf;AACH,MAAI,CAAC,UAAU,QAAQ;AACrB,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,QAAM,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,QAAQ;AAC9D,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,SAAS,QAAQ,QAAQ,2BAA2B,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAC5F;AAAA,EACF;AACA,SAAO,MAAM;AACf;AAEA,eAAe,sBAAsB,SAGf;AACpB,QAAM,OAAO,MAAM,QAAQ;AAAA,IACzB,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,EACrB,CAAC;AACD,QAAM,WAAY,KAAgD;AAClE,SAAO,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC;AAC1C;AAcA,eAAsB,uBACpB,WACA,cACA,SAK2B;AAC3B,QAAM,YAAY,QAAQ,WAAW;AAErC,QAAM,WAAW,MAAM;AAAA,IACrB,iBAAiB,SAAS,gBAAgB,YAAY;AAAA,IACtD;AAAA,MACE,SAAS,EAAE,QAAQ,oBAAoB;AAAA,MACvC,QAAQ,QAAQ,UAAU,YAAY,QAAQ,SAAS;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,kBAAkB,SAAS,MAAM,EAAE;AACrE,MAAI,CAAC,SAAS,KAAM,OAAM,IAAI,MAAM,kBAAkB;AAEtD,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAkC;AACtC,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,EAAE,QAAQ,UAAU,IAAI,eAAe,MAAM;AACnD,eAAS;AAET,iBAAW,SAAS,QAAQ;AAC1B,YAAI,MAAM,SAAS,UAAU;AAC3B,gBAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAClC,mBAAS;AACT,kBAAQ,WAAW,KAAK,QAAQ,KAAK,aAAa,IAAI;AAAA,QACxD;AACA,YAAI,MAAM,SAAS,QAAQ;AACzB,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,OAAO,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAChC;AAEA,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,sCAAsC;AACnE,SAAO;AACT;AAcA,eAAsB,OAAO,SAAwB;AACnD,QAAM,YAAY,QAAQ,aAAa,iBAAiB;AACxD,QAAM,SAAS,gBAAgB;AAE/B,MAAI,QAAQ,UAAU;AACpB,UAAM,aAAa,MAAM,kBAAkB;AAAA,MACzC,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB,CAAC;AACD,WAAO,eAAe;AAAA,MACpB,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AAGA,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO;AAAA,IACnC;AAAA,IACA,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,QAAQ,QAAQ,OAAO,EAAE,EAAE;AAAA,EAC5D;AAEA,MAAI,OAAO;AACT,QAAI;AACF,oBAAc,OAAO,4BAA4B;AAAA,IACnD,SAAS,GAAG;AACV,UAAI,aAAa,YAAY,EAAE,SAAS,oBAAoB;AAC1D,cAAM,QAAQ,MAAM,sBAAsB;AAAA,UACxC,QAAQ,QAAQ;AAAA,UAChB;AAAA,QACF,CAAC;AACD,cAAM,IAAI;AAAA,UACR;AAAA,aAAkF,MAAM,KAAK,IAAI,CAAC;AAAA,UAClG,EAAE,MAAM,mBAAmB;AAAA,QAC7B;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,KAAM,QAAO;AAG1B,QAAM,SAAS,MAAM,uBAAuB,WAAW,KAAK,cAAc;AAAA,IACxE,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAED,SAAO,EAAE,GAAG,MAAM,GAAG,OAAO;AAC9B;AAGA,eAAe,eAAe,SAQ3B;AACD,QAAM,EAAE,QAAQ,WAAW,WAAW,IAAI;AAG1C,QAAM,WAAW,MAAM;AAAA,IACrB,iBAAiB,SAAS,UAAU,MAAM,aAAa,UAAU;AAAA,IACjE,EAAE,QAAQ,OAAO;AAAA,EACnB;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,kBAAc,MAAM,kBAAkB,SAAS,MAAM,GAAG;AAAA,EAC1D;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,CAAC,QAAQ,KAAM,QAAO;AAG1B,QAAM,SAAS,MAAM,uBAAuB,WAAW,KAAK,cAAc;AAAA,IACxE,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAED,SAAO,EAAE,GAAG,MAAM,GAAG,OAAO;AAC9B;AAEA,eAAsB,cAAc,SAIjC;AACD,QAAM,YAAY,QAAQ,aAAa,iBAAiB;AAExD,MAAI,QAAQ,UAAU;AACpB,UAAM,aAAa,MAAM,kBAAkB;AAAA,MACzC,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB,CAAC;AACD,UAAM,WAAW,MAAM;AAAA,MACrB,iBAAiB,SAAS,UAAU,QAAQ,MAAM,aAAa,UAAU;AAAA,IAC3E;AACA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,oBAAc,MAAM,0BAA0B;AAAA,IAChD;AACA,WAAO,SAAS,KAAK;AAAA,EACvB;AAEA,QAAM,SAAS,gBAAgB;AAE/B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO;AAAA,IACnC;AAAA,IACA,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,QAAQ,QAAQ,OAAO,EAAE,EAAE;AAAA,EAC5D;AACA,MAAI,MAAO,eAAc,OAAO,0BAA0B;AAC1D,SAAO;AACT;AAaA,IAAM,eAAuC;AAAA,EAC3C,UAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,WAAW;AAAA,EACX,0BAA0B;AAAA,EAC1B,sBAAsB;AAAA,EACtB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AACV;AAEA,eAAsB,cACpB,QACA,SACA;AACA,QAAM,MAAM,gBAAgB,OAAO;AAEnC,QAAM,YAAY,QAAQ,UACtB,SAAS,QAAQ,SAAS,EAAE,IAAI,MAChC;AAEJ,MAAI;AACF,UAAM,SAAS,MAAM,OAAO;AAAA,MAC1B;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,MAClB,MAAM,QAAQ,SAAS;AAAA,MACvB,SAAS;AAAA,MACT,UAAU,QAAQ,OACd,SACA,CAAC,QAAQ,cAAc;AACrB,cAAM,MAAM,YAAY,GAAG,MAAM,IAAI,SAAS,KAAK;AACnD,YAAI;AAAA,UACF,aAAa,GAAG,KAAK,aAAa,MAAM,KAAK,WAAW,MAAM;AAAA,QAChE;AAAA,MACF;AAAA,IACN,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,YAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAC1D;AAAA,IACF;AAEA,UAAM,IAAI;AAEV,QAAI,EAAE,WAAW,aAAa;AAC5B,UAAI,KAAK,cAAc,EAAE,SAAS,EAAE;AAAA,IACtC,WAAW,EAAE,WAAW,UAAU;AAChC,UAAI,KAAK,WAAW,EAAE,YAAY,EAAE;AAAA,IACtC,WAAW,EAAE,WAAW,UAAU;AAChC,UAAI,MAAM,WAAW,EAAE,gBAAgB,eAAe,EAAE;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB,WAAW,EAAE,WAAW,YAAY;AAClC,UAAI,KAAK,uBAAuB,EAAE,YAAY,KAAK,EAAE,IAAI,GAAG;AAAA,IAC9D,OAAO;AACL,UAAI,KAAK,WAAW,EAAE,MAAM,EAAE;AAAA,IAChC;AAAA,EACF,SAAS,KAAK;AACZ,mBAAe,GAAG;AAAA,EACpB;AACF;AAEA,eAAsB,qBACpB,QACA,SACA;AACA,QAAM,MAAM,gBAAgB,OAAO;AAEnC,MAAI;AACF,UAAM,SAAS,MAAM,cAAc;AAAA,MACjC;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,IACpB,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,YAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAC1D;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ;AACX,UAAI,KAAK,qBAAqB;AAC9B;AAAA,IACF;AAEA,UAAM,IAAI;AACV,QAAI,KAAK,eAAe,EAAE,EAAE,EAAE;AAC9B,QAAI,KAAK,SAAS,EAAE,IAAI,EAAE;AAC1B,QAAI,KAAK,WAAW,EAAE,MAAM,EAAE;AAC9B,QAAI,EAAE,aAAc,KAAI,KAAK,aAAa,EAAE,YAAY,EAAE;AAC1D,QAAI,EAAE,UAAW,KAAI,KAAK,QAAQ,EAAE,SAAS,EAAE;AAC/C,QAAI,EAAE,aAAc,KAAI,MAAM,UAAU,EAAE,YAAY,EAAE;AAAA,EAC1D,SAAS,KAAK;AACZ,mBAAe,GAAG;AAAA,EACpB;AACF;;;ACxWA;AACA;AAFA,SAAS,eAAAC,oBAAmB;AAI5B;AACA;AACA;AAYA,eAAsB,gBAAgB,UAAkC,CAAC,GAAG;AAC1E,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AACjD,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,QAAQ,KAAM,QAAO,IAAI,QAAQ,QAAQ,IAAI;AACjD,MAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACvD,MAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACvD,QAAM,KAAK,OAAO,SAAS;AAE3B,QAAM,WAAW,MAAM;AAAA,IACrB,iBAAiB,EAAE,eAAe,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,EACtD;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,kBAAc,MAAM,4BAA4B;AAAA,EAClD;AACA,SAAO,SAAS,KAAK;AACvB;AAqBO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EACzC,OAAO;AAAA,EACP;AAAA,EACT,YAAY,SAAiB,SAAqC;AAChE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;AASA,eAAsB,yBAAyB,SAI1B;AACnB,QAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,QAAM,YAAY,QAAQ,aAAa,iBAAiB;AAExD,QAAM,WAAY,MAAM,gBAAgB,EAAE,WAAW,OAAO,CAAC;AAG7D,QAAM,UAAU,SAAS,eAAe,CAAC;AAEzC,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,iCAAiC,MAAM,EAAE;AAAA,EAC3D;AAEA,MAAI,SAAS,QAAW;AACtB,UAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAC/C,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,2BAA2B,IAAI,YAAY,MAAM,EAAE;AAAA,IACrE;AACA,WAAO,iBAAiB,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACvD;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,QAAQ,MAAM,QAAQ,QAAQ,MAAM;AAAA,MACpC,QAAQ,IAAI,CAAC,OAAO;AAAA,QAClB,MAAM,EAAE;AAAA,QACR,MAAM,EAAE;AAAA,QACR,QAAQ,EAAE;AAAA,QACV,WAAW,EAAE;AAAA,MACf,EAAE;AAAA,IACJ;AAAA,EACF;AACA,SAAO,iBAAiB,EAAE,MAAM,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC;AAC9D;AAEA,eAAsB,oBAAoB,SAGvC;AACD,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AAEjD,QAAM,WAAW,MAAM;AAAA,IACrB,iBAAiB,EAAE,gBAAgB,QAAQ,IAAI;AAAA,EACjD;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,kBAAc,MAAM,0BAA0B;AAAA,EAChD;AACA,SAAO,SAAS,KAAK;AACvB;AAEA,eAAsB,iBAAiB,SAIpC;AACD,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AAEjD,QAAM,WAAW,MAAM,SAAS,iBAAiB,EAAE,gBAAgB;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,EACnE,CAAC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,kBAAc,MAAM,6BAA6B;AAAA,EACnD;AACA,SAAO,SAAS,KAAK;AACvB;AAEA,eAAsB,iBAAiB,SAGpC;AACD,QAAM,KAAK,QAAQ,aAAa,iBAAiB;AAEjD,QAAM,WAAW,MAAM;AAAA,IACrB,iBAAiB,EAAE,gBAAgB,QAAQ,IAAI;AAAA,IAC/C,EAAE,QAAQ,SAAS;AAAA,EACrB;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,kBAAc,MAAM,6BAA6B;AAAA,EACnD;AACA,QAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,SAAO,QAAQ,EAAE,SAAS,KAAK;AACjC;AAaA,eAAeC,cACb,IACA,SACe;AACf,MAAI;AACF,UAAM,SAAS,MAAM,GAAG;AACxB,UAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAAA,EAC5D,SAAS,OAAO;AACd,mBAAe,KAAK;AAAA,EACtB;AACF;AAEA,eAAsB,uBACpB,SACe;AACf,QAAMA;AAAA,IACJ,MACE,gBAAgB;AAAA,MACd,WAAW,QAAQ;AAAA,MACnB,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAsB,2BACpB,MACA,SACe;AACf,QAAMA;AAAA,IACJ,MAAM,oBAAoB,EAAE,MAAM,WAAW,QAAQ,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,SACe;AACf,QAAMA;AAAA,IACJ,MACE,iBAAiB;AAAA,MACf,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,MACA,SACe;AACf,QAAMA;AAAA,IACJ,MAAM,iBAAiB,EAAE,MAAM,WAAW,QAAQ,QAAQ,CAAC;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,eAAsB,oBACpB,QACA,SACe;AACf,QAAM,MAAM,gBAAgB,OAAO;AAEnC,MAAI;AACF,QAAI;AAEJ,QAAI,CAAC,QAAQ;AACX,UAAI;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,eAAe,OAAO,WAAW,MAAM;AAE7C,QAAI,cAAc;AAEhB,YAAM,KAAK,QAAQ,WAAW,iBAAiB;AAC/C,YAAM,OAAO,MAAM,SAAS,iBAAiB,EAAE,UAAU,MAAM,EAAE;AACjE,UAAI,CAAC,KAAK,IAAI;AACZ,cAAM,OAAO,MAAM,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC/C,sBAAc,MAAM,wBAAwB,MAAM,EAAE;AAAA,MACtD;AACA,YAAM,OAAQ,MAAM,KAAK,KAAK;AAC9B,UAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,oBAAoB;AAEtD,YAAM,aAAa,KAAK;AACxB,YAAM,QAAQ,WAAW;AACzB,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,oCAAoC;AAChE,YAAM,WAAW,QAAQ,QAAQ,OAAO,KAAK,KAAK,EAAE,CAAC;AACrD,UAAI,CAAC,SAAU,OAAM,IAAI,MAAM,0BAA0B;AACzD,YAAM,eAAe,MAAM,QAAQ;AACnC,UAAI,CAAC,gBAAgB,OAAO,iBAAiB;AAC3C,cAAM,IAAI,MAAM,qBAAqB;AAEvC,UAAI,SAAS,aAAc,QAAO;AAAA,eACzB,YAAY,aAAc,QAAO;AAAA,UACrC,OAAM,IAAI,MAAM,sCAAsC;AAAA,IAC7D,OAAO;AAEL,YAAMC,UAAS,MAAM,eAAe,QAAQ;AAAA,QAC1C,UAAU,QAAQ;AAAA,MACpB,CAAC;AACD,aAAOC,aAAYD,QAAO,YAAY;AAAA,IACxC;AAGA,UAAM,aAAa,MAAM,iBAAiB;AAAA,MACxC;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,IACrB,CAAC;AAED,UAAM,SAAS;AAEf,QAAI,QAAQ,MAAM;AAChB,YAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAC1D;AAAA,IACF;AAGA,QAAI,KAAK,uBAAuB,OAAO,EAAE,EAAE;AAC3C,QAAI,KAAK,YAAY,OAAO,IAAI,EAAE;AAClC,QAAI,KAAK,YAAY,OAAO,IAAI,EAAE;AAClC,QAAI,OAAO,aAAa;AACtB,UAAI,KAAK,YAAY,OAAO,WAAW,EAAE;AACzC,UAAI,KAAK,sDAAiD;AAAA,IAC5D;AACA,QAAI,KAAK,EAAE;AACX,QAAI,KAAK,cAAc;AACvB,QAAI;AAAA,MACF,kBAAkB,eAAe,cAAc,MAAM,aAAa,OAAO,EAAE;AAAA,IAC7E;AACA,QAAI,KAAK,EAAE;AACX,QAAI,KAAK,SAAS;AAClB,QAAI;AAAA,MACF,yCAAyC,OAAO,eAAe,SAAS;AAAA,IAC1E;AACA,QAAI,KAAK,6DAA6D;AACtE,QAAI,KAAK,mCAAmC;AAAA,EAC9C,SAAS,KAAK;AACZ,mBAAe,GAAG;AAAA,EACpB;AACF;;;ACjUA;AACA;AAFA,SAAS,uBAAuB;AAIhC;AASA,eAAsB,SACpB,MACA,SACe;AACf,QAAM,SAAS,WAAW;AAE1B,QAAM,YAAY,SAAS,aAAa,QAAQ,qBAAqB;AAErE,QAAM,UAKF,EAAE,KAAK;AAEX,MAAI,SAAS,SAAS;AACpB,YAAQ,UAAU,QAAQ;AAAA,EAC5B;AAEA,MAAI,CAAC,aAAa,QAAQ,OAAO;AAC/B,YAAQ,SAAS,OAAO;AACxB,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,WAAW;AACb,cAAQ,YAAY;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,YAAY,iBAAiB;AAAA,IAClD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,+BAA+B,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IACvE;AAAA,EACF;AACF;AAIA,eAAsB,gBAAgB,MAA6B;AACjE,QAAM,SAAS,gBAAgB,CAAC,CAAC;AACjC,MAAI;AACF,UAAM,SAAS,WAAW;AAC1B,QAAI;AAEJ,QAAI,QAAQ,sBAAsB,QAAW;AAE3C,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,MACF;AACA,YAAM,oBAAoB,CAAC,OAAO,YAAY,EAAE,WAAW,GAAG;AAG9D,UAAI,QAAQ;AACV,oBAAY,EAAE,GAAG,QAAQ,kBAAkB,CAAC;AAAA,MAC9C,OAAO;AACL,oBAAY;AAAA,UACV,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AACA,kBAAY;AAAA,IACd,OAAO;AACL,kBAAY,OAAO;AAAA,IACrB;AAEA,UAAM,SAAS,MAAM,EAAE,UAAU,CAAC;AAClC,WAAO,KAAK,wBAAwB;AAAA,EACtC,SAAS,OAAO;AACd,mBAAe,KAAK;AAAA,EACtB;AACF;AAEA,SAAS,WAAW,UAAmC;AACrD,SAAO,IAAI,QAAQ,CAACE,aAAY;AAC9B,UAAM,KAAK,gBAAgB;AAAA,MACzB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,OAAG,SAAS,UAAU,CAAC,WAAW;AAChC,SAAG,MAAM;AACT,MAAAA,SAAQ,MAAM;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AACH;;;ACtGA;;;ACCA;AADA,SAAS,kBAAkB;AAUpB,SAAS,oBAAwC;AACtD,SAAO,WAAW,GAAG;AACvB;AAWO,SAAS,uBAA+B;AAC7C,QAAM,WAAW,WAAW,GAAG;AAC/B,MAAI,SAAU,QAAO;AACrB,QAAM,KAAK,WAAW;AACtB,2BAAyB,EAAE,gBAAgB,GAAG,CAAC;AAC/C,SAAO;AACT;;;AD1BA,SAAS,oBAAwC;AAC/C,MAAI,QAAQ,IAAI,iBAAiB,OAAO,QAAQ,IAAI,iBAAiB,QAAQ;AAC3E,WAAO;AAAA,EACT;AACA,MACE,QAAQ,IAAI,gCAAgC,OAC5C,QAAQ,IAAI,gCAAgC,QAC5C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AASO,SAAS,yBAA+B;AAC7C,QAAM,WAAW,kBAAkB;AACnC,MAAI,UAAU;AACZ,YAAQ,OAAO;AAAA,MACb,iCAAiC,QAAQ;AAAA;AAAA;AAAA,IAE3C;AACA;AAAA,EACF;AAEA,QAAM,SAAS,WAAW,GAAG;AAC7B,MAAI,WAAW,MAAM;AACnB,YAAQ,OAAO;AAAA,MACb;AAAA,IAEF;AACA;AAAA,EACF;AACA,MAAI,WAAW,OAAO;AACpB,YAAQ,OAAO;AAAA,MACb;AAAA,IAEF;AACA;AAAA,EACF;AACA,UAAQ,OAAO;AAAA,IACb;AAAA,EAEF;AACF;AAOO,SAAS,yBAA+B;AAC7C,QAAM,iBAAiB,qBAAqB;AAC5C,2BAAyB;AAAA,IACvB;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AACD,UAAQ,OAAO;AAAA,IACb,8FAEE,iBACA;AAAA,EACJ;AACF;AAQO,SAAS,0BAAgC;AAC9C,2BAAyB,EAAE,kBAAkB,MAAM,CAAC;AACpD,UAAQ,OAAO;AAAA,IACb;AAAA,EACF;AACF;;;A9CxBA;;;AgDvCA;AAJA,YAAYC,YAAU;AACtB,YAAYC,SAAQ;AACpB,OAAOC,UAAQ;AACf,YAAYC,cAAa;AAkDzB,eAAsB,aACpB,SACe;AACf,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,IAAI;AAEJ,MACE,QAAQ,gBACR,CAAC,wBAAwB,KAAK,QAAQ,YAAY,GAClD;AACA,UAAM,IAAI;AAAA,MACR,yBAAyB,QAAQ,YAAY;AAAA,IAC/C;AAAA,EACF;AACA,MAAI,QAAQ,iBAAiB,CAAC,gBAAgB,KAAK,QAAQ,aAAa,GAAG;AACzE,UAAM,IAAI;AAAA,MACR,0BAA0B,QAAQ,aAAa;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,CAAE,MAAMD,KAAG,WAAW,YAAY,GAAI;AACxC,UAAM,IAAI,MAAM,uCAAuC,YAAY,EAAE;AAAA,EACvE;AAEA,QAAM,uBAA4B,eAAQ,YAAY;AAGtD,QAAM,YACJ,aAAa,YACT,kBAAkB,sBAAsB;AAAA,IACtC,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjC,GAAI,QAAQ,gBACR,EAAE,eAAe,QAAQ,cAAc,IACvC,CAAC;AAAA,IACL,GAAI,QAAQ,eACR,EAAE,cAAc,QAAQ,aAAa,IACrC,CAAC;AAAA,IACL;AAAA,EACF,CAAC,IACD,wBAAwB,oBAAoB;AAIlD,QAAM,WAAW,MAAMA,KAAG,QAAa,YAAQ,WAAO,GAAG,gBAAgB,CAAC;AAC1E,QAAM,YAAiB,YAAK,UAAU,UAAU;AAEhD,MAAI;AACF,UAAMA,KAAG,UAAU,WAAW,SAAS;AACvC,UAAMA,KAAG,UAAe,eAAQ,UAAU,CAAC;AAE3C,UAAM,iBAAuC;AAAA,MAC3C,aAAa,CAAC,SAAS;AAAA,MACvB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,MACV;AAAA,MACA,GAAI,UAAU;AAAA,QACZ,kBAAkB,eAAe,cAAc;AAAA,QAC/C,mBAAmB,eAAe,eAAe;AAAA,QACjD,cAAc,eAAe,UAAU;AAAA,QACvC,eAAe,eAAe,iBAAiB;AAAA,QAC/C,SAAS;AAAA,MACX;AAAA,IACF;AAEA,QAAI,aAAa,WAAW;AAC1B,qBAAe,SAAS;AAAA,QACtB,wBAAwB;AAAA,QACxB,QAAQ;AAAA,MACV;AACA,qBAAe,SAAS,UAAU;AAAA,IACpC,OAAO;AAIL,qBAAe,WAAW,iBAAiB;AAC3C,qBAAe,SAAS;AAAA,QACtB,IAAI;AAAA,MACN;AACA,qBAAe,SAAS,UAAU;AAAA,IACpC;AAEA,UAAc,eAAM,cAAc;AAAA,EACpC,UAAE;AACA,UAAMA,KAAG,OAAO,QAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1C;AACF;;;AhD5FA;AACA;AASA;;;AiDtFA;AACA;AAWA,eAAsB,aAAa,SAA8B;AAC/D,QAAM,MAAM,QAAQ,aAAa,iBAAiB;AAClD,QAAM,WAAW,MAAM;AAAA,IACrB,iBAAiB,GAAG,UAAU,QAAQ,MAAM;AAAA,EAC9C;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,kBAAc,MAAM,yBAAyB;AAAA,EAC/C;AACA,SAAO,SAAS,KAAK;AACvB;AAQA,eAAsB,WAAW,SAA4B;AAC3D,QAAM,MAAM,QAAQ,aAAa,iBAAiB;AAClD,QAAM,WAAW,MAAM;AAAA,IACrB,iBAAiB,GAAG,UAAU,QAAQ,MAAM,aAAa,QAAQ,SAAS;AAAA,EAC5E;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,kBAAc,MAAM,uBAAuB;AAAA,EAC7C;AACA,SAAO,SAAS,KAAK;AACvB;AASA,eAAsB,cAAc,SAA+B;AACjE,QAAM,MAAM,QAAQ,aAAa,iBAAiB;AAElD,MAAI,aAAa,QAAQ;AACzB,MAAI,CAAC,YAAY;AACf,QAAI,CAAC,QAAQ,UAAU;AACrB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,UAAM,OAAO,MAAM,QAAQ,EAAE,WAAW,KAAK,QAAQ,QAAQ,OAAO,CAAC;AACrE,UAAM,WACJ,KACA;AACF,UAAM,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,QAAQ;AAC/D,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,wBAAwB,QAAQ,QAAQ,uBAAuB,QAAQ,MAAM;AAAA,MAC/E;AAAA,IACF;AACA,iBAAa,MAAM;AAAA,EACrB;AAEA,QAAM,WAAW,MAAM;AAAA,IACrB,iBAAiB,GAAG,UAAU,QAAQ,MAAM;AAAA,IAC5C;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,gBAAgB,WAAW,CAAC;AAAA,IACrD;AAAA,EACF;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,kBAAc,MAAM,0BAA0B;AAAA,EAChD;AACA,SAAO,SAAS,KAAK;AACvB;AAQA,eAAsB,cAAc,SAA+B;AACjE,QAAM,MAAM,QAAQ,aAAa,iBAAiB;AAClD,QAAM,WAAW,MAAM;AAAA,IACrB,iBAAiB,GAAG,UAAU,QAAQ,MAAM,aAAa,QAAQ,SAAS;AAAA,IAC1E,EAAE,QAAQ,SAAS;AAAA,EACrB;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,kBAAc,MAAM,0BAA0B;AAAA,EAChD;AAEA,MAAI,SAAS,WAAW,IAAK,QAAO;AACpC,SAAO,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACzC;;;AjD6BA;AAcA;AAKA;;;AkDlIO,SAAS,YACd,QACA,aACA,YACqB;AACrB,MAAI,YAAY;AACd,WAAO,kBAAkB,QAAQ,aAAa,UAAU;AAAA,EAC1D;AAEA,SAAO,uBAAuB,QAAQ,WAAW;AACnD;AAEA,SAAS,kBACP,QACA,aACA,YACqB;AACrB,QAAM,WAAW,WAAW,QAAQ,GAAG;AACvC,MAAI,aAAa,IAAI;AACnB,UAAM,IAAI;AAAA,MACR,2BAA2B,UAAU;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,OAAO,WAAW,UAAU,GAAG,QAAQ;AAC7C,QAAM,OAAO,WAAW,UAAU,WAAW,CAAC;AAE9C,QAAM,UAAU,WAAW,QAAQ,IAAI;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,MAAM,IAAI,wBAAwB;AAAA,EACpD;AAEA,QAAM,OAAO,QAAQ,IAAI;AACzB,MAAI,CAAC,MAAM;AACT,UAAM,YAAY,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI;AAChD,UAAM,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,2BAA2B,SAAS,EAAE;AAAA,EACxE;AAEA,QAAM,WAAY,KAAgD;AAClE,MAAI,CAAC,YAAY,CAAC,SAAS,WAAW,GAAG;AACvC,UAAM,YAAY,WAAW,OAAO,KAAK,QAAQ,EAAE,KAAK,IAAI,IAAI;AAChE,UAAM,IAAI;AAAA,MACR,YAAY,WAAW,kBAAkB,IAAI,KAAK,IAAI,iBAAiB,SAAS;AAAA,IAClF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA,SAAS,SAAS,WAAW;AAAA,EAK/B;AACF;AAEA,SAAS,uBACP,QACA,aACqB;AACrB,QAAM,UAAiC,CAAC;AAExC,QAAM,YAAwB,CAAC,UAAU,eAAe,aAAa;AAErE,aAAW,QAAQ,WAAW;AAC5B,UAAM,UAAU,WAAW,QAAQ,IAAI;AACvC,QAAI,CAAC,QAAS;AAEd,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,YAAM,WAAY,KACf;AACH,UAAI,YAAY,SAAS,WAAW,GAAG;AACrC,gBAAQ,KAAK;AAAA,UACX,UAAU;AAAA,UACV,UAAU;AAAA,UACV;AAAA,UACA,SAAS,SAAS,WAAW;AAAA,QAK/B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,YAAY,WAAW,yBAAyB;AAAA,EAClE;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,YAAY,QACf,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,IAAI,EAAE,QAAQ,EAAE,EACxC,KAAK,IAAI;AACZ,UAAM,IAAI;AAAA,MACR,YAAY,WAAW,8BAA8B,SAAS;AAAA,IAChE;AAAA,EACF;AAEA,SAAO,QAAQ,CAAC;AAClB;AAEA,SAAS,WACP,QACA,MACqC;AACrC,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB;AACE,YAAM,IAAI;AAAA,QACR,uBAAuB,IAAI;AAAA,MAC7B;AAAA,EACJ;AACF;;;AC5IO,SAAS,cACd,UACA,QACuE;AACvE,QAAM,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC;AACpD,QAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC;AAEhD,MAAI,gBAAgB,WAAW;AAC7B,WAAO,EAAE,UAAU,QAAQ,OAAO,KAAK;AAAA,EACzC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,MAAM;AAAA,EAAc,WAAW;AAAA;AAAA;AAAA,EAAgB,SAAS;AAAA,EAC1D;AACF;;;ACpBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;;;ACoDxB,SAAS,gBAAgB,OAA6C;AAC3E,QAAM,OAAsB;AAAA,IAC1B,QAAQ,MAAM;AAAA,IACd,IAAI,MAAM,YAAY;AAAA,IACtB,WAAW,MAAM,YAAY;AAAA,IAC7B,UAAU,MAAM,YAAY;AAAA,IAC5B,UAAU,MAAM,YAAY;AAAA,IAC5B,MAAM,MAAM,YAAY;AAAA,EAC1B;AACA,MAAI,MAAM,QAAS,MAAK,UAAU,MAAM;AAExC,SAAO;AAAA,IACL,SAAS,EAAE,WAAW,KAAK;AAAA,IAC3B;AAAA,IACA,cAAc;AAAA,MACZ,KAAK;AAAA,QACH,SAAS;AAAA,QACT,QAAQ,EAAE,KAAK,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;;;AC3EA,YAAYE,SAAQ;AAUb,SAAS,iBAA8B;AAC5C,QAAM,SAAS,KAAK,eAAe,EAAE,gBAAgB;AACrD,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,WAAc,YAAQ;AAAA,IACtB,MAAM,QAAQ;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,EACnB;AACF;;;ACnBA;AAEA,SAAS,QAAQ,MAAuB;AACtC,QAAM,IAAI,QAAQ,IAAI,IAAI;AAC1B,SAAO,MAAM,OAAO,MAAM;AAC5B;AAcO,SAAS,qBAA8B;AAC5C,MAAI,QAAQ,cAAc,EAAG,QAAO;AACpC,MAAI,QAAQ,6BAA6B,EAAG,QAAO;AACnD,SAAO,WAAW,GAAG,qBAAqB;AAC5C;AAGO,SAAS,cAAuB;AACrC,SAAO,QAAQ,0BAA0B;AAC3C;;;AC5BA;AAWO,SAAS,2BAAiC;AAC/C,MAAI,WAAW,EAAG;AAClB,QAAM,MACJ;AAIF,UAAQ,OAAO,MAAM,GAAG;AAC1B;;;AJXA;AAEA,IAAM,kBAAkB;AAqCxB,eAAsB,cAAc,MAAwC;AAC1E,MAAI,CAAC,mBAAmB,GAAG;AACzB,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MAEb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,kBAAkB;AACtC,MAAI,CAAC,aAAa;AAIhB,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MAEb;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAiB;AAEvB,QAAM,QAAQ,YAAY;AAC1B,QAAM,WAAW,yBAAyB;AAC1C,MAAI,CAAC,YAAY,CAAC,OAAO;AAKvB,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MAEb;AAAA,IACF;AAAA,EACF;AAIA,MAAI,CAAC,MAAO,0BAAyB;AAErC,QAAM,cAAc,eAAe;AAEnC,QAAM,aAA8B;AAAA,IAClC,GAAG,KAAK;AAAA,IACR,SAAS,KAAK;AAAA,EAChB;AAGA,MAAI,QAAuB;AAC3B,iBAAe,YAA6B;AAC1C,QAAI,MAAO,QAAO;AAElB,UAAM,kBAAkB,gBAAgB;AAAA,MACtC,gBAAgB;AAAA,MAChB,SAAS,KAAK;AAAA,MACd;AAAA,MACA,UAAU,YAAY;AAAA,IACxB,CAAC;AAED,UAAM,kBAAwC;AAAA,MAC5C,SAAS,gBAAgB;AAAA,MACzB,MAAM,gBAAgB;AAAA,MACtB,cAAc;AAAA,QACZ,KAAK;AAAA,UACH,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,UAAU,gBAAgB,aAAa,IAAI;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,IAAI,IAAI,MAAM,UAAU,eAAe;AAC/C,YAAQ;AACR,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,KAAK,MAAM,MAAM,WAAW,GAAG,gBAAgB;AACnD,YAAM,eAA0C;AAAA,QAC9C;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ,EAAE,GAAG,YAAY,GAAG,eAAe;AAAA,MAC7C;AAEA,UAAI,OAAO;AACT,cAAM,OAAsB;AAAA,UAC1B;AAAA,UACA,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,UAChD,IAAI,YAAY;AAAA,UAChB,WAAW,YAAY;AAAA,UACvB,UAAU,YAAY;AAAA,UACtB,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,QACpB;AACA,cAAM,UAAU;AAAA,UACd,GAAG;AAAA,UACH,SAAS,EAAE,WAAW,KAAK;AAAA,UAC3B;AAAA,QACF;AACA,gBAAQ,OAAO;AAAA,UACb,8BAA8B,KAAK,UAAU,OAAO,CAAC;AAAA;AAAA,QACvD;AACA;AAAA,MACF;AAEA,UAAI;AACF,cAAM,MAAM,MAAM,UAAU;AAC5B,cAAMC,aAAY,IAAI,YAAY,GAAG,eAAe;AAAA,MACtD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAYO,SAAS,2BAA+C;AAC7D,QAAM,SAAS,cAAc;AAC7B,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,GAAG,OAAO,QAAQ,OAAO,EAAE,CAAC;AACrC;AAEA,eAAeA,aAAe,GAAe,IAAwB;AACnE,SAAO,QAAQ,KAAQ;AAAA,IACrB;AAAA,IACA,IAAI,QAAW,CAAC,GAAG,WAAW;AAC5B,YAAM,IAAI,WAAW,MAAM,OAAO,IAAI,MAAM,mBAAmB,CAAC,GAAG,EAAE;AACrE,QAAE,MAAM;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACH;;;AK5LA,OAAO,YAAY;AAgBZ,SAAS,UAAU,OAAyB;AACjD,QAAM,OAAO,OAAO,QAAQ,OAAO;AAGnC,QAAM,OAAO,SAAS,UAAU,QAAQ,MAAM,OAAQ,OAAO,QAAQ;AACrE,MAAI,CAAC,KAAM,QAAO,EAAE,IAAI,MAAM;AAC9B,SAAO,OAAO,EAAE,IAAI,MAAM,SAAS,KAAK,IAAI,EAAE,IAAI,KAAK;AACzD;","names":["path","path","fs","path","path","init_utils","path","fs","stat","fs","fs","path","init_utils","schemas","path","path","fs","bundle","input","path","fs","os","semver","deps","peerDeps","peerMeta","path","fs","fs","path","getHashServer","path","fs","getHashServer","stats","sizeKB","resolveTarget","fs","path","fs","resolveTarget","existsSync","mkdirSync","writeFileSync","readFileSync","join","path","fs","init_utils","path","fs","getPlatform","init_utils","path","resolve","path","startFlow","path","fs","getPlatform","getPlatform","fs","path","schemas","fs","schemas","getPlatform","path","path","writeFileSync","homedir","join","existsSync","mkdirSync","writeFileSync","dirname","isUrl","path","existsSync","z","z","z","z","z","z","z","z","z","existsSync","init_utils","writeFileSync","fs","resolve","resolve","dirname","resolve","pathToFileURL","context","resolve","dirname","readFileSync","dirname","join","writeFileSync","fs","join","homedir","prepareBundleForRun","path","writeFileSync","writeCache","chalk","validateEvent","getFlowSettings","isObject","schemas","validateFlowConfig","bundle","path","path","schemas","validate","validateEvent","chalk","z","handleResult","getPlatform","handleResult","result","getPlatform","resolve","path","os","fs","esbuild","os","withTimeout"]}