@walkeros/cli 4.9.0-next-1793116456867 → 4.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -7
- package/dist/cli.js +1599 -1460
- package/dist/examples/README.md +7 -5
- package/dist/examples/customers/README.md +3 -3
- package/dist/examples/flow-complete.json +55 -25
- package/dist/examples/flow-complete.md +48 -19
- package/dist/examples/flow-selfhost-test.json +3 -1
- package/dist/examples/index.d.ts +25 -1
- package/dist/examples/index.js +86 -32
- package/dist/examples/index.js.map +1 -1
- package/dist/examples/server-collect.json +1 -2
- package/dist/examples/shared/README.md +3 -0
- package/dist/examples/shared/products/SKU-1 +1 -0
- package/dist/examples/shared/products/SKU-2 +1 -0
- package/dist/examples/web-serve.json +4 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/validate.js +1 -1
- package/examples/README.md +7 -5
- package/examples/customers/README.md +3 -3
- package/examples/flow-complete.json +55 -25
- package/examples/flow-complete.md +48 -19
- package/examples/flow-selfhost-test.json +3 -1
- package/examples/server-collect.json +1 -2
- package/examples/shared/README.md +3 -0
- package/examples/shared/products/SKU-1 +1 -0
- package/examples/shared/products/SKU-2 +1 -0
- package/examples/web-serve.json +4 -0
- package/package.json +30 -30
- package/src/telemetry/flow.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/bundle/index.ts","../src/core/cli-logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/tmp.ts","../src/core/asset-resolver.ts","../src/config/utils.ts","../src/core/fetch-failure.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/event-validation.ts","../src/core/import-specifier.ts","../src/core/parse-component-ref.ts","../src/core/tmp-names.ts","../src/commands/bundle/archive.ts","../src/config/validators.ts","../src/config/build-defaults.ts","../src/config/loader.ts","../src/core/content-digest.ts","../src/config/window-collector.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/config-classifier.ts","../src/core/step-packages.ts","../src/core/package-manager.ts","../src/core/cache-utils.ts","../src/core/atomic-cache.ts","../src/core/package-spec.ts","../src/commands/bundle/nft-trace.ts","../src/commands/bundle/assert-consumer-deps.ts","../src/commands/bundle/build-flags.ts","../src/core/build-cache.ts","../src/version.ts","../src/commands/bundle/targets.ts","../src/commands/bundle/upload.ts","../src/commands/bundle/stats.ts","../src/commands/push/index.ts","../src/core/redact-line.ts","../src/core/to-printable.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/simulation-result.ts","../src/commands/push/prepare.ts","../src/core/known-secrets.ts","../src/commands/push/plan-simulate.ts","../src/commands/push/dispatch-simulate.ts","../src/commands/push/run.ts","../src/commands/push/dev-examples.ts","../src/core/resolve-export-name.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/scope.ts","../src/commands/validate/validators/resolve.ts","../src/commands/validate/validators/settings.ts","../src/core/package-info.ts","../src/commands/validate/validators/mapping.ts","../src/commands/validate/validators/entry.ts","../src/commands/validate/types.ts","../src/commands/auth/index.ts","../src/core/api-error.ts","../src/core/app-fetch.ts","../src/lib/config-file.ts","../src/lib/secure-url.ts","../src/core/client-context.ts","../src/core/app-paths.ts","../src/commands/api/index.ts","../src/telemetry/install-id.ts","../src/commands/telemetry/index.ts","../src/index.ts","../src/commands/bundle/wrap.ts","../src/commands/bundle/manifest.ts","../src/schemas/build-manifest.ts","../src/commands/bundle/fetch-retry.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":["/**\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 { tmpRunDir } from '../../core/tmp-names.js';\nimport { packBundleDir } from './archive.js';\nimport type { Flow, Logger } from '@walkeros/core';\nimport type { BundleStats } from './bundler.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, type BundleProvenance } 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 /** Release id baked into config.collector.release. Beats an authored one. */\n release?: string;\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\n/** Recognizes the packed-archive output extensions. */\nfunction isArchiveOutput(output: string): boolean {\n const lower = output.toLowerCase();\n return lower.endsWith('.tar.gz') || lower.endsWith('.tgz');\n}\n\n/**\n * Run the core bundler, transparently producing a packed `.tar.gz`/`.tgz`\n * artifact when `buildOptions.output` carries an archive extension.\n *\n * For a `.tar.gz`/`.tgz` output on the node platform, the build is redirected\n * into a temp directory so `runNftServerPath` populates `flow.mjs` +\n * `node_modules/` + `package.json` there; the directory is then packed into\n * the archive at the user's output path and the temp dir is removed. Non\n * archive outputs (`.mjs`, directory, stdout, web `.js`) pass straight through\n * to `bundleCore` unchanged.\n *\n * Web bundles are single-file IIFEs with no sibling `node_modules` to pack, so\n * requesting an archive extension for a web/browser platform is an error.\n */\nasync function runBundleCoreWithArchive(\n flowSettings: Flow,\n buildOptions: BuildOptions,\n logger: Logger.Instance,\n showStats: boolean,\n provenance: BundleProvenance,\n): Promise<BundleStats | void> {\n if (!isArchiveOutput(buildOptions.output)) {\n return bundleCore(\n flowSettings,\n buildOptions,\n logger,\n showStats,\n provenance,\n );\n }\n\n if (buildOptions.platform !== 'node') {\n throw new Error(\n `Archive output (${path.extname(buildOptions.output)}) is only supported for server (node) flows. ` +\n 'Web bundles are a single-file IIFE with no node_modules to pack — use a .js output instead.',\n );\n }\n\n const archivePath = path.resolve(buildOptions.output);\n // mkdtemp guarantees a unique dir even for same-millisecond parallel node\n // archive builds (e.g. --all), which a Date.now() suffix cannot.\n const tempDir = await tmpRunDir('archive');\n\n try {\n const stats = await bundleCore(\n flowSettings,\n { ...buildOptions, output: path.join(tempDir, 'flow.mjs') },\n logger,\n showStats,\n provenance,\n );\n\n // node_modules/ is only present when nft copied ≥1 traced file. A flow\n // whose deps esbuild fully inlines emits flow.mjs + package.json only, so\n // pack just the entries that exist (tar.c throws ENOENT on a missing path).\n // flow.mjs and package.json are mandatory; their absence is a real error.\n for (const required of ['flow.mjs', 'package.json']) {\n if (!(await fs.pathExists(path.join(tempDir, required)))) {\n throw new Error(\n `Bundle archive build is missing ${required}; cannot pack ${archivePath}.`,\n );\n }\n }\n const candidates = ['flow.mjs', 'node_modules', 'package.json'];\n const entries: string[] = [];\n for (const entry of candidates) {\n if (await fs.pathExists(path.join(tempDir, entry))) entries.push(entry);\n }\n\n await fs.ensureDir(path.dirname(archivePath));\n await packBundleDir(tempDir, archivePath, entries);\n logger.debug(`Packed bundle archive: ${archivePath}`);\n\n return stats;\n } finally {\n await fs.remove(tempDir).catch(() => {});\n }\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 if (options.all && options.output && isArchiveOutput(options.output)) {\n throw new Error(\n 'Cannot use --all with an archive output (.tar.gz/.tgz). Archive packing produces one file per flow; point -o at a directory instead.',\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 configDigest,\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 = path.join(\n await tmpRunDir('bundle'),\n `bundle${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 // The bundler bakes flow name + release into the collector before\n // codegen, so the deployed flow stamps real provenance on\n // event.source.release.\n const stats = await runBundleCoreWithArchive(\n flowSettings,\n buildOptions,\n logger,\n shouldCollectStats === true,\n { flowName, release: options.release, configDigest },\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(path.dirname(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 * @param options.buildEnv - Base env for web `$env` (default `process.env`)\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 * Release id baked into `config.collector.release`, stamping this flow's\n * entry in `event.source.release` at runtime. Beats an authored release;\n * omitted, the release is a content id of config, packages and CLI.\n */\n release?: 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 * Base environment web `$env` references resolve against, beneath the\n * flow's declared `config.bundle.env`. Omitted, it is `process.env` (a\n * local build). Pass `{}` for a hosted build, which then resolves against\n * the declared values alone and never the building process's own env.\n */\n buildEnv?: Record<string, string | undefined>;\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 externalizeDev: preset.externalizeDev,\n };\n const { flowSettings, buildOptions, flowName, configDigest } =\n loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flowName,\n buildOverrides: mergedOverrides,\n buildEnv: options.buildEnv,\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 (packs a .tar.gz/.tgz artifact when output requests it)\n // The bundler bakes flow name + release into the collector so the deployed\n // flow stamps real provenance on event.source.release.\n return await runBundleCoreWithArchive(\n flowSettings,\n buildOptions,\n logger,\n options.stats ?? false,\n { flowName, release: options.release, configDigest },\n );\n}\n","import chalk from 'chalk';\nimport {\n createCLILogger as createCoreCLILogger,\n createCLILoggerConfig as createCoreCLILoggerConfig,\n type CLILoggerColors,\n type CLILoggerOptions,\n} from '@walkeros/core/node';\nimport type { Logger } from '@walkeros/core';\n\nexport type { CLILoggerOptions };\n\n/**\n * The CLI's terminal colours. Binding them here matters: the shared factory in\n * `@walkeros/core/node` defaults every level to identity, so a plain re-export\n * would silently drop red ERROR output at every CLI call site.\n */\nconst CLI_COLORS: CLILoggerColors = { error: chalk.red };\n\n/**\n * Build the `Logger.Config` backing the CLI logger, with the CLI's colours.\n * See `createCLILoggerConfig` in `@walkeros/core/node` for the handler contract.\n */\nexport function createCLILoggerConfig(\n options: CLILoggerOptions = {},\n): Logger.Config {\n return createCoreCLILoggerConfig(options, CLI_COLORS);\n}\n\n/**\n * Create a core Logger.Instance with CLI-appropriate behavior.\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 return createCoreCLILogger(options, CLI_COLORS);\n}\n","export { createTimer, type Timer } from '@walkeros/core';\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 * Temp path helpers live in `@walkeros/core/node`, shared with the runtime.\n * All temp files go to os.tmpdir() by default.\n */\nexport {\n getTmpPath,\n createTmpResolver,\n getDefaultTmpRoot,\n type TmpResolver,\n} from '@walkeros/core/node';\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 * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { fetchFailureReason } from '../core/fetch-failure.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/** A config input named an http(s) URL that could not be read. */\nexport class ConfigFetchError extends Error {\n readonly url: string;\n /** The HTTP status, when the host answered. */\n readonly status?: number;\n\n constructor(message: string, url: string, status?: number) {\n super(message);\n this.name = 'ConfigFetchError';\n this.url = url;\n this.status = status;\n }\n}\n\n/**\n * Fetch content from a URL as a string.\n * Shared helper for all URL-loading paths.\n *\n * A plain GET with no credential for every host: a config input is any URL\n * the person names, and a link to a saved flow carries its own signature.\n *\n * @param url - HTTP/HTTPS URL to fetch\n * @returns Response body as a string\n * @throws ConfigFetchError if the host cannot be reached or answers non-OK\n */\nexport async function fetchContentString(url: string): Promise<string> {\n let response: Response;\n try {\n response = await fetch(url);\n } catch (error) {\n throw new ConfigFetchError(\n `Could not reach ${url}: ${fetchFailureReason(error)}`,\n url,\n );\n }\n if (!response.ok) {\n throw new ConfigFetchError(\n `Failed to fetch ${url}: ${response.status} ${response.statusText}`.trimEnd(),\n url,\n response.status,\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 (a URL that could not be read, a file not\n // found) as-is\n if (error instanceof ConfigFetchError || errorMessage.includes('not found'))\n throw error;\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","function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Why a request did not reach its host: `timeout after <ms> ms`, or the\n * network error with its code, such as `fetch failed (ECONNREFUSED)`. Read by\n * shape, not instanceof: an abort's DOMException can come from another realm.\n */\nexport function fetchFailureReason(error: unknown, timeoutMs?: number): string {\n if (!isRecord(error)) return String(error);\n if (error.name === 'TimeoutError')\n return timeoutMs === undefined\n ? 'timeout'\n : `timeout after ${timeoutMs} ms`;\n const message =\n typeof error.message === 'string' ? error.message : String(error);\n const cause = error.cause;\n const code =\n isRecord(cause) && typeof cause.code === 'string' ? cause.code : undefined;\n return code ? `${message} (${code})` : message;\n}\n","export { getErrorMessage } from '@walkeros/core';\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(\n stream: NodeJS.ReadableStream = process.stdin,\n): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n // A stream may yield strings as well as buffers.\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : 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","/** The one credential the CLI sends: WALKEROS_TOKEN, a token from Account > Automation tokens. */\nexport function resolveAccessToken(): string | null {\n const token = process.env.WALKEROS_TOKEN;\n return token ? token : null;\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","/**\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","import path from 'path';\nimport fs from 'fs-extra';\nimport { getTmpPath } from './tmp.js';\n\n/** What a per-run temp dir is for; names the middle path segment. */\nexport type TmpRunKind =\n | 'push'\n | 'build'\n | 'bundle'\n | 'wrap'\n | 'archive'\n | 'setup';\n\n/**\n * Create a unique per-run temp dir `<root>/walkeros/<kind>/<6 chars>`.\n *\n * Every segment stays short, so log redaction never mistakes a temp path for\n * a secret-shaped token run (a timestamp plus a random suffix, or a UUID, is\n * exactly that shape). The caller removes the dir when done.\n */\nexport async function tmpRunDir(\n kind: TmpRunKind,\n tmpDir?: string,\n): Promise<string> {\n const parent = getTmpPath(tmpDir, 'walkeros', kind);\n await fs.ensureDir(parent);\n return fs.mkdtemp(parent + path.sep);\n}\n","import { c as tarCreate } from 'tar';\n\n/**\n * Pack a node-platform bundle directory into a gzip tarball.\n *\n * The directory is expected to be shaped like `runNftServerPath` leaves it:\n * `flow.mjs` (the factory), an optional sibling `node_modules/`, and\n * `package.json`. Entries are added relative to `dir` (`cwd`), so the resulting\n * archive holds them at its root with no absolute paths.\n *\n * The caller passes the exact `entries` to pack (relative to `dir`). The\n * caller is responsible for filtering to entries that exist on disk: when a\n * flow's deps are fully inlined by esbuild, no `node_modules/` is emitted and\n * `tar.c` would otherwise throw `ENOENT` on the missing path.\n *\n * @param dir - Directory containing the bundle artifacts to pack.\n * @param outFile - Destination `.tar.gz`/`.tgz` path for the gzip tarball.\n * @param entries - Relative entries to include (e.g. `flow.mjs`, `package.json`).\n */\nexport async function packBundleDir(\n dir: string,\n outFile: string,\n entries: string[],\n): Promise<void> {\n await tarCreate({ gzip: true, cwd: dir, file: outFile }, entries);\n}\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n * Uses Zod schemas from @walkeros/core for Flow.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};\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 { validateFlowStructure } from '@walkeros/core/dev';\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';\nimport { configDigest } from '../core/content-digest.js';\nimport {\n assertWindowCollector,\n type WindowCollectorSource,\n} from './window-collector.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 * Digest of the deferred flow settings, the config input of the default\n * release. Never carries an env or secret value.\n */\n configDigest: 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 /**\n * Base environment for web `$env` resolution, layered BENEATH the flow's\n * declared `config.bundle.env`. Omitted, it is the shell's `process.env`\n * (local builds). Pass `{}` for a hermetic build that resolves against the\n * declared values alone. Server flows are unaffected: their `$env` is read\n * at runtime.\n */\n buildEnv?: Record<string, string | undefined>;\n /** Logger for warnings */\n logger?: {\n warn: (message: string) => void;\n info: (message: string) => void;\n };\n}\n\n/**\n * The bundle preflight: the structural checks `walkeros validate` runs\n * (`validateFlowStructure`), on the flow being built. A flow validate\n * rejects (an unknown key, a mapping field with no effect at its position,\n * a malformed reference) stops here, before anything is resolved or built,\n * and the error names every path.\n */\nfunction assertFlowStructure(config: Flow.Json, flowName: string): void {\n const { errors } = validateFlowStructure({\n ...config,\n flows: { [flowName]: config.flows[flowName] },\n });\n if (errors.length === 0) return;\n const lines = errors.map((error) => ` - ${error.path}: ${error.message}`);\n throw new Error(`Invalid configuration:\\n${lines.join('\\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 assertFlowStructure(config, flowName);\n assertLiteralBuildEnv(config, flowName);\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 const flowConfigDigest = configDigest(flowSettings, flowName);\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. The\n // values come from an explicit map, never from an ambient read, so a build\n // inside a process holding its own secrets cannot inline them.\n if (platform === 'web') {\n flowSettings = getFlowSettings(config, flowName, {\n env: resolveBuildEnv(flowSettings.config?.bundle?.env, options.buildEnv),\n });\n }\n\n // Auto-inject validator transformers for any step-level `validate?:`\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 + flow settings + CLI overrides\n const buildOptions: BuildOptions = {\n ...buildDefaults,\n ...settingsToBuildOptions(platform, flowSettings.config?.settings, {\n path: `flows.${flowName}.config.settings.windowCollector`,\n written: config.flows[flowName]?.config?.settings?.windowCollector,\n }),\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 configDigest: flowConfigDigest,\n };\n}\n\n/**\n * The build options a flow's `config.settings` controls. Each key is mapped\n * explicitly, so an unknown settings key never reaches generated code.\n *\n * - `windowCollector` (web): the global the collector instance is assigned\n * to. It is interpolated into the generated entry, so the resolved value\n * must be a JavaScript identifier.\n */\nexport function settingsToBuildOptions(\n platform: 'web' | 'server',\n settings: Flow.Settings | undefined,\n source: WindowCollectorSource = {},\n): Pick<BuildOptions, 'windowCollector'> {\n if (platform !== 'web' || settings?.windowCollector === undefined) return {};\n return {\n windowCollector: assertWindowCollector(settings.windowCollector, source),\n };\n}\n\n/** Any reference or marker the resolver would act on inside a string. */\nconst REFERENCE_PATTERN =\n /\\$(?:env|var|secret|flow|contract)\\.|\\$code:|__WALKEROS_(?:ENV|SECRET):/;\n\n/**\n * `config.bundle.env` values are the declared build values themselves, so\n * each must be a literal string. A reference there would be resolved (or\n * turned into a runtime marker) instead of declared, so it is refused. The\n * message names keys only, never values.\n */\nfunction assertLiteralBuildEnv(config: Flow.Json, flowName: string): void {\n const declared = config.flows[flowName]?.config?.bundle?.env;\n if (!declared) return;\n const refs = Object.entries(declared)\n .filter(([, value]) => REFERENCE_PATTERN.test(value))\n .map(([key]) => key);\n if (refs.length > 0) {\n throw new Error(\n `config.bundle.env values must be literal strings; references are not allowed in: ${refs.join(', ')}`,\n );\n }\n}\n\n/**\n * The map web `$env` references resolve against: the base environment\n * (`process.env` unless the caller passes one) with the flow's declared\n * `config.bundle.env` on top.\n */\nexport function resolveBuildEnv(\n declared: Record<string, string> | undefined,\n base: Record<string, string | undefined> = process.env,\n): Record<string, string | undefined> {\n return { ...base, ...(declared ?? {}) };\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 /**\n * The config at `configPath`, already read by the caller: it is used\n * instead of reading the path again (`configPath` still anchors\n * relative paths).\n */\n raw?: unknown;\n },\n): Promise<LoadConfigResult> {\n const { raw, ...rest } = options ?? {};\n const rawConfig = raw !== undefined ? raw : await loadJsonConfig(configPath);\n return loadBundleConfig(rawConfig, { configPath, ...rest });\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 * Content digests for build cache keys and the default release id.\n *\n * Every input is content the bundler consumes: the deferred flow settings,\n * the resolved package set (local packages by the bytes of their installed\n * copy) and the CLI version. Environment and secret values are never inputs,\n * only their markers, so a digest leaks none of them.\n */\n\nimport { createHash } from 'node:crypto';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\n\nconst DIGEST_LENGTH = 12;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** JSON with object keys sorted at every depth. Arrays keep their order. */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(value, (_key, inner: unknown) => {\n if (!isRecord(inner)) return inner;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(inner).sort()) sorted[key] = inner[key];\n return sorted;\n });\n}\n\n/**\n * Hash a flow's deferred settings (its `$env` and `$secret` references are\n * still markers). `collector.release` is left out and `collector.name`\n * defaults to the flow name, so the digest names the config the release is\n * derived from. Declared `config.bundle.env` values are reduced to their keys:\n * they are the values web `$env` references resolve to.\n */\nexport function configDigest(flowSettings: Flow, flowName: string): string {\n const collector: Record<string, unknown> = {\n ...(flowSettings.collector ?? {}),\n };\n delete collector.release;\n collector.name ??= flowName;\n\n const config = flowSettings.config;\n const declaredEnv = config?.bundle?.env;\n const hashedConfig =\n config && declaredEnv\n ? {\n ...config,\n bundle: { ...config.bundle, env: Object.keys(declaredEnv).sort() },\n }\n : config;\n\n return createHash('sha256')\n .update(canonicalJson({ ...flowSettings, config: hashedConfig, collector }))\n .digest('hex');\n}\n\n/**\n * Hash an installed package directory: every file by relative path and bytes,\n * a symlink by its target. Paths are sorted, so file system order and mtimes\n * never change the result.\n */\nexport async function hashInstalledDir(dir: string): Promise<string> {\n const hash = createHash('sha256');\n for (const rel of await listFiles(dir, '')) {\n const abs = path.join(dir, rel);\n const stat = await fs.lstat(abs);\n hash.update(`${rel}\\0`);\n hash.update(\n stat.isSymbolicLink() ? await fs.readlink(abs) : await fs.readFile(abs),\n );\n hash.update('\\0');\n }\n return hash.digest('hex').slice(0, DIGEST_LENGTH);\n}\n\nasync function listFiles(root: string, rel: string): Promise<string[]> {\n const entries = await fs.readdir(path.join(root, rel), {\n withFileTypes: true,\n });\n const files: string[] = [];\n for (const entry of entries) {\n const entryRel = rel ? `${rel}/${entry.name}` : entry.name;\n if (entry.isDirectory()) files.push(...(await listFiles(root, entryRel)));\n else files.push(entryRel);\n }\n return files.sort();\n}\n\nexport interface ReleaseDigestInput {\n /** {@link configDigest} of the flow. */\n configDigest: string;\n /** Sorted `name@version` lines, a local package as `name@local:<hash>`. */\n versions: string[];\n /** CLI version, since generated code changes with it. */\n toolchain: string;\n}\n\n/** Default release id: 12 lowercase hex over config, packages and CLI. */\nexport function releaseDigest(input: ReleaseDigestInput): string {\n return createHash('sha256')\n .update(\n canonicalJson({\n config: input.configDigest,\n versions: input.versions,\n toolchain: input.toolchain,\n }),\n )\n .digest('hex')\n .slice(0, DIGEST_LENGTH);\n}\n","import { checkWindowCollector } from '@walkeros/core';\n\n/** Where a collector global name came from, for the error message. */\nexport interface WindowCollectorSource {\n /** Setting path, e.g. `flows.web.config.settings.windowCollector`. */\n path?: string;\n /** The value as written, when it was a `$var` / `$env` reference. */\n written?: unknown;\n}\n\n/**\n * Return `value` as the collector global name, or throw when it is not a\n * JavaScript identifier or names a reserved global. The name is interpolated\n * into generated code, so every build path checks it before use.\n */\nexport function assertWindowCollector(\n value: unknown,\n source: WindowCollectorSource = {},\n): string {\n const check = checkWindowCollector(value);\n if (check.ok) return check.name;\n const path = source.path ?? 'config.settings.windowCollector';\n const subject =\n source.written !== undefined && source.written !== value\n ? `${JSON.stringify(source.written)} resolved to ${JSON.stringify(value)}, which`\n : JSON.stringify(value);\n throw new Error(`${path}: ${subject} ${check.reason}.`);\n}\n","import esbuild from 'esbuild';\nimport { builtinModules } from 'module';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport fs from 'fs-extra';\nimport type { Flow, MoinTarget, ObserveWeb, PreviewKey } from '@walkeros/core';\nimport {\n getPlatform,\n packageNameToVariable,\n getStepRuntimeProps,\n ENV_MARKER_PREFIX,\n SECRET_MARKER_PREFIX,\n STEP_FUNCTION_KEYS,\n isPathStepEntry,\n isObject,\n} from '@walkeros/core';\nimport {\n classifyStepProperties,\n containsCodeMarkers,\n} from './config-classifier.js';\nimport {\n validateComponentNames,\n validateReference,\n validateStoreReferences,\n} from '@walkeros/core/dev';\n\n// Re-export the structural validators so existing import sites keep resolving\n// them from `./bundler`. The implementations live in `@walkeros/core/dev` so\n// they can run without loading esbuild.\nexport { validateComponentNames, validateReference, validateStoreReferences };\n\nimport {\n parsePackageSpec,\n detectStepPackages,\n collectAllStepPackages,\n applyStepPackages,\n} from '../../core/step-packages.js';\n\n// Re-export so existing import sites (tests, public entry) keep resolving\n// them from './bundler'. Implementations live in core/step-packages so they\n// can run without loading esbuild.\nexport {\n parsePackageSpec,\n detectStepPackages,\n collectAllStepPackages,\n applyStepPackages,\n};\n\n/**\n * Type guard to check if a code value is an InlineCode object: `push`, an\n * optional `type`, and the other step functions (`STEP_FUNCTION_KEYS`).\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 * A reference carries inline code when it is an InlineCode object or (legacy)\n * a string. Used by the codegen step-filtering below.\n */\nfunction hasCodeReference(code: unknown): boolean {\n return isInlineCode(code) || typeof code === 'string';\n}\n\n/**\n * Generates inline code for any component type (source, destination,\n * transformer, store). Emits every step function the code defines\n * (`STEP_FUNCTION_KEYS`: push, pushBatch, init, on, destroy), each with its\n * $code: prefix removed, so none is dropped on the way into the bundle.\n *\n * @param inline - InlineCode object with push, optional type and functions\n * @param runtimeProps - The step's runtime fields (`getStepRuntimeProps`),\n * emitted beside the code. `config` and `env` default to `{}`.\n * @param isDestination - Whether this is a destination (uses different code structure)\n */\nfunction generateInlineCode(\n inline: Flow.Code,\n runtimeProps: Record<string, unknown>,\n isDestination?: boolean,\n): string {\n const typeLine = inline.type ? `type: '${inline.type}',` : '';\n const functionLines = STEP_FUNCTION_KEYS.flatMap((key) => {\n const fn = inline[key];\n return fn ? [`${key}: ${fn.replace('$code:', '')}`] : [];\n }).join(',\\n ');\n\n const props: Record<string, unknown> = {\n config: {},\n env: {},\n ...runtimeProps,\n };\n const propLines = Object.entries(props)\n .map(([key, value]) => `${key}: ${processConfigValue(value)}`)\n .join(',\\n ');\n\n // Destinations have a different structure - code is the instance directly\n if (isDestination) {\n return `{\n code: {\n ${typeLine}\n config: ${processConfigValue(props.config)},\n ${functionLines}\n },\n ${propLines}\n }`;\n }\n\n // Sources, transformers and stores use factory pattern\n return `{\n code: async (context) => ({\n ${typeLine}\n config: context.config,\n ${functionLines}\n }),\n ${propLines}\n }`;\n}\nimport type { BuildOptions } from '../../types/bundle.js';\nimport {\n downloadPackagesWithResolution,\n loadNpmConfigForPacote,\n} from '../../core/package-manager.js';\nimport {\n traceAndCopy,\n assertDepsTraced,\n collectImportedPackages,\n} from './nft-trace.js';\nimport { assertConsumerDepsSatisfied } from './assert-consumer-deps.js';\nimport { buildFlagDefines, flowNeeds, needsMarker } from './build-flags.js';\nimport type { Logger } from '@walkeros/core';\nimport { getHashServer } from '@walkeros/server-core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { tmpRunDir } from '../../core/tmp-names.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';\nimport { assertWindowCollector } from '../../config/window-collector.js';\nimport { hashInstalledDir, releaseDigest } from '../../core/content-digest.js';\nimport { VERSION } from '../../version.js';\n\nexport interface BundleStats {\n totalSize: number;\n packages: { name: string }[];\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 */\nexport function 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 // The format the served artifact is emitted in, derived from `platform`\n // (browser=iife, node=esm) rather than the declared `buildOptions.format`.\n // Including it in the key one-time-invalidates any cache entry written by an\n // older CLI that emitted ESM for a browser build, so a stale ESM artifact is\n // never served. It does NOT detect a runtime divergence: because it is\n // re-derived from `platform`, removing the `format:'iife'` line below would\n // not change this key. The durable cross-version cache bust is the\n // version/toolchain hash, not this field.\n emittedFormat: resolveEmittedFormat(buildOptions),\n versionsHash,\n // Generated code changes with the CLI, so a CLI upgrade never serves a\n // build made by the previous version.\n toolchain: VERSION,\n };\n return JSON.stringify(configForCache);\n}\n\n/**\n * The format the served (stage-2 / wrap) artifact is emitted in, derived from\n * platform. Browser artifacts are IIFE-wrapped so internal declarations stay\n * private; node/server artifacts stay ESM (they rely on a `createRequire`\n * banner and bare ESM imports). Stage-1 skeletons are always ESM and are not\n * served, so they are not represented here.\n */\nfunction resolveEmittedFormat(buildOptions: BuildOptions): 'iife' | 'esm' {\n return buildOptions.platform === 'browser' ? 'iife' : 'esm';\n}\n\n/**\n * Provenance a `bundle` run bakes onto the collector. Push and simulate pass\n * none, so their events keep the runtime release.\n */\nexport interface BundleProvenance {\n /** Keys this flow's entry in `event.source.release`. */\n flowName: string;\n /** Explicit release id (`--release`). Beats an authored one. */\n release?: string;\n /** Config input of the default release, from `loadBundleConfig`. */\n configDigest: string;\n}\n\n/**\n * The resolved top-level set as sorted `name@version` lines. A local package\n * has no version, so it is named by the content of its installed copy: a\n * rebuilt `path` package gives a new line.\n */\nexport async function resolvedVersionLines(\n topLevel: Map<string, { version: string }>,\n packagePaths: Map<string, string>,\n): Promise<string[]> {\n const lines: string[] = [];\n for (const [name, pkg] of [...topLevel.entries()].sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n const installed = packagePaths.get(name);\n lines.push(\n pkg.version === 'local' && installed\n ? `${name}@local:${await hashInstalledDir(installed)}`\n : `${name}@${pkg.version}`,\n );\n }\n return lines;\n}\n\nexport async function bundleCore(\n flowSettings: Flow,\n buildOptions: BuildOptions,\n logger: Logger.Instance,\n showStats = false,\n provenance?: BundleProvenance,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n\n // Shared cache root\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 // Per-build isolation: a unique working dir, created right before the\n // `try` whose `finally` removes it.\n const TEMP_DIR = buildOptions.tempDir || (await tmpRunDir('build'));\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 applyStepPackages(flowSettings, buildOptions.packages, logger);\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 // Defense-in-depth: walk every installed package and assert that each\n // declared dependency resolves (Node-style nearest-ancestor lookup) to a\n // satisfying version. Catches resolver bugs, future regressions, and\n // unforeseen hoisting issues before esbuild/nft pick up wrong code.\n if (process.env.BUNDLER_STRICT_RANGES !== '0') {\n await assertConsumerDepsSatisfied(TEMP_DIR, logger);\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 = await resolvedVersionLines(\n resolutionResult.topLevel,\n packagePaths,\n );\n const versionsHash = await getHashServer(sortedVersions.join('\\n'), 12);\n\n // Collector defaults, for every call shape (`walkeros push` and simulate\n // pass no provenance), then provenance: both before the L1 check and\n // codegen, so they sit in both the cache key and the artifact.\n applyCollectorDefaults(flowSettings);\n if (provenance) {\n applyCollectorProvenance(\n flowSettings,\n provenance.flowName,\n provenance.release,\n () =>\n releaseDigest({\n configDigest: provenance.configDigest,\n versions: sortedVersions,\n toolchain: VERSION,\n }),\n );\n }\n // Step packages externalized by esbuild. Use the packages the user (or\n // auto-add) actually declared, not pacote's full top-level set: peer\n // dependencies pacote installs (e.g. zod for schema validation) are\n // inlined unless declared. The nft cross-check narrows this further to\n // the declared packages the bundle actually imports.\n const declaredPackages = 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 await finishArtifact(\n outputPath,\n flowSettings,\n buildOptions,\n TEMP_DIR,\n declaredPackages,\n logger,\n );\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 }),\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, devPackages } =\n await createEntryPoint(flowSettings, buildOptions, packagePaths, logger);\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 // Deploy browser skeletons (externalizeDev) externalize each `<pkg>/dev`\n // so the lazy registry is not inlined; in-process simulate/push inline it.\n // Record the externals only when they are actually emitted, otherwise two\n // builds with identical entry code but different inline/external `/dev`\n // would alias the same L2 slot and one would receive the other's bytes.\n externals: new Set(\n buildOptions.platform === 'browser' &&\n buildOptions.externalizeDev === true\n ? devPackages.map((p) => `${p}/dev`)\n : [],\n ),\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 // Retained but inert (deprecation surface): no codegen reads it anymore.\n // Keeping it here only over-keys the code cache, which is harmless.\n windowElb: buildOptions.windowElb,\n versionsHash,\n toolchain: VERSION,\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 declaredPackages,\n devPackages,\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 // The skeleton is the build-once, introspectable currency every downstream\n // consumer shares: it exports wireConfig/startFlow/__configData (+__devExports)\n // so simulate and preview can introspect and re-wire it, while web/server\n // deploy wrap or run it. One artifact, many targets, so do NOT collapse it into\n // a finished bundle here. For node, step packages stay EXTERNAL on purpose so\n // nft materializes them into a sibling node_modules/ the host resolves on disk\n // (the only way native addons like sqlite .node files can ship); inlining here\n // would break server simulate and native destinations.\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 // A browser skeleton ends with its flow's needs, which the publish-time\n // wrap reads to define the build flags. Appended after the cached stage\n // 1 code, so the code cache key is unchanged.\n const needs =\n buildOptions.platform === 'browser'\n ? `\\n${needsMarker(flowNeeds(flowSettings))}\\n`\n : '';\n const esmOutput = `${banner}${compiledCode}\\n${dataDeclaration}${needs}`;\n await fs.writeFile(outputPath, esmOutput);\n } else {\n // Production path: stage 2 esbuild compilation. Reached only by `cdn`\n // (withDev:false), which emits no `__devExports` registry, so there is no\n // `import('<pkg>/dev')` to externalize here. A future registry-bearing\n // non-skeleton browser target would need to externalize `<pkg>/dev` on the\n // browser branch below (gated on `externalizeDev`) to stay dev-free.\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 observe: readObserveConnect(flowSettings, logger),\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 // Emit the final browser artifact as an IIFE. The served bundle runs\n // as a classic <script> at global scope, so an ESM body would leak its\n // minified top-level declarations (e.g. `ga`) onto `window` and collide\n // with globals like Google Analytics. The IIFE wraps everything in a\n // private closure; the intentional `window.elb`/`window.walkerOS`\n // assignments live inside the entry's own async IIFE and reference\n // `window` explicitly, so they still run. The browser entry has zero\n // exports, so no `globalName` is needed (one would add a window var).\n stage2Options.format = 'iife';\n // The entry's Tag Mode loader comes from the CLI's own web-core,\n // never from a copy in TEMP_DIR, which may predate it.\n stage2Options.plugins = [cliPackagesPlugin()];\n // Every build flag is defined from the flow's needs, so a feature the\n // flow does not use folds out (see build-flags.ts).\n stage2Options.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n ...buildFlagDefines(flowNeeds(flowSettings)),\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 = [...getNodeExternals(), ...declaredPackages];\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 await finishArtifact(\n outputPath,\n flowSettings,\n buildOptions,\n TEMP_DIR,\n declaredPackages,\n logger,\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 return stats;\n } catch (error) {\n throw error;\n } finally {\n // Clean up per-build directory (contains entry.js with potential secrets).\n // Awaited: a process that exits right after the build must not leave it.\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR).catch(() => {});\n }\n }\n}\n\n/**\n * Whether a build ships the flow's `include` folders. Only a server artifact\n * reads them at runtime; a browser bundle is served on its own. Shared by the\n * bundler and the manifest build gate, so both agree on when `include` reads\n * the local disk.\n */\nexport function includeApplies(buildOptions: {\n platform: 'node' | 'browser';\n}): boolean {\n return buildOptions.platform !== 'browser';\n}\n\n/**\n * The steps every build runs once its output file is written, whether it came\n * from the cache or a fresh esbuild run, so the two paths cannot drift.\n */\nasync function finishArtifact(\n outputPath: string,\n flowSettings: Flow,\n buildOptions: BuildOptions,\n tempDir: string,\n declaredPackages: string[],\n logger: Logger.Instance,\n): Promise<void> {\n if (buildOptions.platform === 'node') {\n // Server path: trace the emitted bundle, copy used files into\n // `outDir/node_modules/`, write an informational sidecar package.json.\n // This emits the sibling node_modules/ that every server host (deploy\n // container, simulate-server) resolves the external @walkeros/* from.\n // Load-bearing, do not remove.\n await runNftServerPath(\n outputPath,\n flowSettings,\n buildOptions,\n tempDir,\n declaredPackages,\n logger,\n );\n }\n // Web flows don't ship a sidecar node_modules: esbuild emits a\n // self-contained IIFE.\n\n if (!buildOptions.include || buildOptions.include.length === 0) return;\n if (!includeApplies(buildOptions)) {\n logger.info(\n 'include is ignored for web builds: a browser bundle cannot read local folders.',\n );\n return;\n }\n await copyIncludes(\n buildOptions.include,\n buildOptions.configDir || process.cwd(),\n path.dirname(outputPath),\n logger,\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 // Report the packages bundled. Per-package byte attribution is not available\n // without the esbuild metafile, which this two-stage pipeline does not\n // capture, so the breakdown is names only — never a synthesized size.\n const packageStats = Object.entries(packages).map(([name, pkg]) => ({\n name: `${name}@${pkg.version || 'latest'}`,\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 devPackages: 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 // MUST stay ESM: the stage-1 skeleton is imported (via `await import`) for\n // its named exports (`wireConfig`/`startFlow`/`__configData`/`__devExports`)\n // by simulate/preview/push and the wrap step. esbuild's `iife` format\n // silently drops exports, which would break those consumers.\n format: 'esm' as esbuild.Format,\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n absWorkingDir: tempDir, // Resolve modules from temp directory\n // alias removed - not needed with absWorkingDir\n mainFields: ['module', 'main'], // Prefer ESM over CJS\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\n sourcemap: buildOptions.sourcemap,\n resolveExtensions: ['.mjs', '.js', '.ts', '.json'], // Prefer .mjs\n\n // Enhanced minification options when minify is enabled\n ...(buildOptions.minify && {\n minifyWhitespace: buildOptions.minifyOptions?.whitespace ?? true,\n minifyIdentifiers: buildOptions.minifyOptions?.identifiers ?? true,\n minifySyntax: buildOptions.minifyOptions?.syntax ?? true,\n legalComments: buildOptions.minifyOptions?.legalComments ?? 'none',\n keepNames: buildOptions.minifyOptions?.keepNames ?? false,\n charset: 'utf8',\n }),\n };\n\n // Platform-specific configurations\n if (buildOptions.platform === 'browser') {\n baseOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n // For browser bundles, let users handle Node.js built-ins as needed.\n // Externalize each `<pkg>/dev` ONLY for deploy skeletons\n // (`externalizeDev: true`). Then the registry stays a literal\n // `import('<pkg>/dev')` instead of inlining the /dev graph (zod schemas\n // etc.), and the deploy wrap DCEs the unreferenced registry to zero bytes.\n //\n // For in-process simulate/push (`externalizeDev: false`/undefined), do NOT\n // externalize: esbuild inlines the /dev graph back into the single ESM, so\n // the lazy thunk resolves an already-bundled module. That is what lets the\n // lean simulate-server (cli + core only, no sibling node_modules) resolve\n // schemas host-free. `devPackages` is also empty for the finished IIFE\n // (`cdn`, withDev:false), so the list is empty there regardless.\n const devSubpathExternals =\n buildOptions.externalizeDev === true\n ? devPackages.map((p) => `${p}/dev`)\n : [];\n baseOptions.external = [\n ...(buildOptions.external || []),\n ...devSubpathExternals,\n ];\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. Keeping step packages\n // external (not inlined) is what lets the host resolve them from the\n // nft-traced sibling node_modules/, which is what makes server simulate\n // and native-addon destinations work; inlining would regress both.\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 * 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// Marks the plugin's own lookup, so it is not intercepted again.\nconst CLI_PACKAGES = 'walkeros-cli-packages';\n\n/**\n * Resolves every `@walkeros/core` and `@walkeros/web-core` import of a\n * generated entry (the Tag Mode loader, the preview activator) from this\n * module's own location: the CLI's own walkerOS packages, the ones it was\n * installed with. Resolving from the entry's temp dir would walk up through\n * every `node_modules` above it, where another copy (a flow's pinned one, or a\n * stray install in a shared temp root) can shadow it, or predate the loader.\n */\nexport function cliPackagesPlugin(): esbuild.Plugin {\n const resolveDir = path.dirname(fileURLToPath(import.meta.url));\n return {\n name: CLI_PACKAGES,\n setup(build) {\n build.onResolve(\n { filter: /^@walkeros\\/(core|web-core)$/ },\n async (args) => {\n if (args.pluginData === CLI_PACKAGES) return undefined;\n const resolved = await build.resolve(args.path, {\n kind: args.kind,\n resolveDir,\n pluginData: CLI_PACKAGES,\n });\n if (resolved.errors.length > 0) return { errors: resolved.errors };\n return { path: resolved.path, sideEffects: resolved.sideEffects };\n },\n );\n },\n };\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 * `declaredPackages` are the non-path `bundle.packages` keys. Those the\n * bundle imports must reach the trace (the cross-check catches\n * dynamic-require regressions and hoisted-symlink mistakes); those nothing\n * imports or traces get a warning.\n */\nasync function runNftServerPath(\n outputPath: string,\n flowSettings: Flow,\n buildOptions: BuildOptions,\n tempDir: string,\n declaredPackages: 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 declared package the bundle imports must appear in\n // the trace output. Catches hoisted-symlink misses, nft per-release\n // regressions, and dynamic-require deps nft cannot statically follow.\n if (declaredPackages.length > 0) {\n const unused = assertDepsTraced({\n fileList: trimmedFileList,\n declaredPackages,\n importedPackages: await collectImportedPackages(outputPath),\n });\n for (const name of unused) {\n logger.warn(\n `Package ${name} is declared in bundle.packages but nothing imports it; it is not in the bundle. Remove it from bundle.packages if unused.`,\n );\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 * Detects named-import requests across sources, destinations, transformers, stores.\n * Returns a map of package names to sets of export names that must be named-imported.\n */\nexport function detectNamedImports(\n flowSettings: Flow,\n): Map<string, Set<string>> {\n const namedImports = new Map<string, Set<string>>();\n\n const addNamed = (pkg: string, importName: string): void => {\n if (!namedImports.has(pkg)) namedImports.set(pkg, new Set());\n namedImports.get(pkg)!.add(importName);\n };\n\n const visit = (\n bucket: Record<string, { package?: string; import?: string }> | undefined,\n ): void => {\n if (!bucket) return;\n for (const step of Object.values(bucket)) {\n if (typeof step.package === 'string' && typeof step.import === 'string') {\n addNamed(step.package, step.import);\n }\n }\n };\n\n visit(flowSettings.sources);\n visit(flowSettings.destinations);\n visit(flowSettings.transformers);\n visit(flowSettings.stores);\n\n return namedImports;\n}\n\ninterface ImportGenerationResult {\n importStatements: string[];\n devExportEntries: string[];\n // `'<pkg>': [\"exportA\", \"exportB\"]` per package declaring\n // `walkerOS.exports`, read from the copy being bundled. Emitted beside\n // `__devExports` so simulate can tell which export a step's examples\n // belong to.\n packageExportEntries: string[];\n // Packages that received a lazy `/dev` registry entry. Exposed so a later\n // browser-build step can externalize the same `<pkg>/dev` specifiers without\n // recomputing the set (preventing drift between the registry and externals).\n devPackages: 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 namedImports: 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 hasNamed = namedImports.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 a named import is specified (allows packages without default export)\n if (isUsedByDestOrSource && !hasNamed) {\n const varName = packageNameToVariable(packageName);\n importStatements.push(`import ${varName} from '${packageName}';`);\n }\n\n // 2. Generate named import when steps reference an export by name\n if (hasNamed) {\n const codes = Array.from(namedImports.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 || hasNamed) {\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 named imports\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 // Register the /dev surface for packages that expose a ./dev export as a\n // lazy dynamic import: `'<pkg>': () => import('<pkg>/dev')`. The specifier\n // stays a literal so a node host can resolve it and esbuild can statically\n // analyse it. Because the registry entry is an unreferenced thunk, the\n // deploy wrap DCEs the whole /dev graph (zod schemas, etc.) to zero bytes,\n // while simulate/push await the thunk to pull the dev module in on demand.\n // The same dev-package set is reused for browser-build externals via\n // computeDevPackages, so the registry and externals can never drift apart.\n const devPackages = withDev\n ? await computeDevPackages(usedPackages, packagePaths)\n : [];\n const devExportEntries = devPackages.map(\n (packageName) => `'${packageName}': () => import('${packageName}/dev')`,\n );\n const packageExports = withDev\n ? await computePackageExports(usedPackages, packagePaths)\n : {};\n const packageExportEntries = Object.entries(packageExports).map(\n ([packageName, exportNames]) =>\n `'${packageName}': ${JSON.stringify(exportNames)}`,\n );\n\n return {\n importStatements,\n devExportEntries,\n packageExportEntries,\n devPackages,\n };\n}\n\n/**\n * Reads the export names each package declares in its package.json\n * `walkerOS.exports`, from the copy being bundled (`packagePaths`).\n * Packages without the field are left out.\n */\nexport async function computePackageExports(\n usedPackages: Iterable<string>,\n packagePaths: Map<string, string>,\n): Promise<Record<string, string[]>> {\n const result: Record<string, string[]> = {};\n for (const packageName of usedPackages) {\n const localPath = packagePaths.get(packageName);\n if (!localPath) continue;\n\n try {\n const pkgJson = await fs.readJSON(path.join(localPath, 'package.json'));\n const exports = pkgJson?.walkerOS?.exports;\n if (exports && typeof exports === 'object' && !Array.isArray(exports))\n result[packageName] = Object.keys(exports);\n } catch {\n // Package doesn't have a readable package.json, skip gracefully\n }\n }\n return result;\n}\n\n/**\n * Resolves which of the given packages expose a `./dev` subpath export.\n * Single source of truth for the lazy `/dev` registry codegen and for the\n * browser build's `/dev` externals, keeping the two in lockstep.\n */\nexport async function computeDevPackages(\n usedPackages: Iterable<string>,\n packagePaths: Map<string, string>,\n): Promise<string[]> {\n const devPackages: string[] = [];\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 devPackages.push(packageName);\n }\n } catch {\n // Package doesn't have a readable package.json, skip gracefully\n }\n }\n return devPackages;\n}\n\n/** Package name of the browser source, the single writer of window[settings.elb]. */\nconst BROWSER_SOURCE_PACKAGE = '@walkeros/web-source-browser';\n\n/**\n * Strip an optional version/range suffix from a package spec so\n * `@walkeros/web-source-browser@2.0.0` matches the bare package name.\n */\nfunction packageSpecName(spec: string): string {\n return parsePackageSpec(spec).name;\n}\n\n/** Read `config.settings.elb` from a source step, or undefined if not a string. */\nfunction readSourceElb(source: Flow.Source): string | undefined {\n if (!isObject(source.config)) return undefined;\n const settings = source.config.settings;\n if (!isObject(settings)) return undefined;\n return typeof settings.elb === 'string' ? settings.elb : undefined;\n}\n\n/**\n * Forward the deprecated `flow.config.settings.windowElb` build hint onto the\n * browser source's own `config.settings.elb`.\n *\n * The browser source is the single writer of `window[settings.elb]` (default\n * 'elb'); the bundle no longer emits a competing `window[windowElb] = elb`\n * assignment. Forwarding keeps a custom global name working through the\n * deprecation window. Runs before config embedding so the forwarded value lands\n * inside the bundle's `__configData`.\n *\n * Matches only the canonical `@walkeros/web-source-browser` package by design:\n * this is a conservative deprecation shim, so forks or renamed repackages of the\n * browser source get the \"no effect\" warning rather than a silent forward.\n *\n * Never mutates the input flow. Warns once, naming both keys.\n */\nexport function bridgeWindowElb(flow: Flow, logger?: Logger.Instance): Flow {\n const raw = flow.config?.settings?.windowElb;\n if (typeof raw !== 'string' || raw === '') return flow;\n const windowElb = raw;\n\n const sources = flow.sources ?? {};\n const browserEntries = Object.entries(sources).filter(\n ([, source]) =>\n typeof source.package === 'string' &&\n packageSpecName(source.package) === BROWSER_SOURCE_PACKAGE,\n );\n\n if (browserEntries.length === 0) {\n logger?.warn(\n `config.settings.windowElb \"${windowElb}\" has no effect: the flow has no ${BROWSER_SOURCE_PACKAGE} source to install window[\"${windowElb}\"]. Remove config.settings.windowElb or add a browser source.`,\n );\n return flow;\n }\n\n const toForward = browserEntries.filter(\n ([, source]) => readSourceElb(source) === undefined,\n );\n\n if (toForward.length === 0) {\n logger?.warn(\n `config.settings.windowElb \"${windowElb}\" is ignored: the browser source already sets config.settings.elb. Remove the deprecated config.settings.windowElb.`,\n );\n return flow;\n }\n\n // Apply on a shallow clone so the input flow is never mutated.\n const nextSources: Record<string, Flow.Source> = { ...sources };\n for (const [id, source] of toForward) {\n const config = isObject(source.config) ? source.config : {};\n const settings = isObject(config.settings) ? config.settings : {};\n nextSources[id] = {\n ...source,\n config: { ...config, settings: { ...settings, elb: windowElb } },\n };\n }\n\n const forwardedIds = toForward.map(([id]) => id).join(', ');\n logger?.warn(\n `config.settings.windowElb is deprecated; set config.settings.elb on the browser source instead. Forwarded windowElb \"${windowElb}\" to config.settings.elb on sources.${forwardedIds}.`,\n );\n\n return { ...flow, sources: nextSources };\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 logger?: Logger.Instance,\n): Promise<{\n codeEntry: string;\n dataPayload: string;\n hasFlow: boolean;\n devPackages: string[];\n}> {\n // Bridge the deprecated windowElb build hint onto the browser source's\n // settings.elb before any config embedding, so the forwarded value is baked\n // into the __configData payload below.\n flowSettings = bridgeWindowElb(flowSettings, logger);\n\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 namedImports = detectNamedImports(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 {\n importStatements,\n devExportEntries,\n packageExportEntries,\n devPackages,\n } = await generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n transformerPackages,\n storePackages,\n namedImports,\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 devPackages,\n };\n }\n\n // Build split config object (code skeleton + data payload)\n const { storesDeclaration, codeConfigObject, dataPayload } =\n buildSplitConfigObject(flowSettings, namedImports);\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 // Declared exports per package, beside the registry (same withDev gate).\n // Always emitted with the dev surface, `{}` included, so a bundle without\n // it is reliably one built before it existed.\n const packageExportsBlock = withDev\n ? packageExportEntries.length > 0\n ? `\\nexport const __packageExports = {\\n ${packageExportEntries.join(',\\n ')},\\n};`\n : '\\nexport const __packageExports = {};'\n : '';\n\n // Return ESM module (imports + wireConfig + startFlow re-export + optional devExports)\n const fullModule = wireConfigModule + devExportsBlock + packageExportsBlock;\n const codeEntry = importsCode\n ? `${importsCode}\\n\\n${fullModule}`\n : fullModule;\n\n return { codeEntry, dataPayload, hasFlow: true, devPackages };\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 the wireConfig data payload for a flow as a plain object.\n *\n * This is the same object the bundler bakes into a skeleton as\n * `__configData` (section, step id, data-layer props), produced by the\n * same classification pass the bundler uses. Callers that inject data at\n * simulate time (the `data` option of the simulate functions) must build\n * the FULL payload from the FULL config with this helper; injection\n * replaces the baked payload, it does not merge.\n *\n * Mirrors the bundler's own call path (`detectNamedImports` feeding\n * `buildSplitConfigObject`) so the result stays identical to the baked\n * payload by construction.\n */\nexport function buildDataPayload(flowSettings: Flow): Record<string, unknown> {\n return buildSplitConfigObject(flowSettings, detectNamedImports(flowSettings))\n .dataPayloadObj;\n}\n\n/**\n * Bake the collector defaults a flow's platform sets: a server collector\n * skips consent-denied events (`consentDenied: 'skip'`, counted in\n * `status.destinations[id].skipped`, DEBUG) instead of queueing them, since\n * no consent change ever reaches a server flow after the event. An authored\n * `collector.consentDenied` wins; a web flow keeps the collector default\n * (`'queue'`).\n */\nexport function applyCollectorDefaults(flowSettings: Flow): void {\n if (getPlatform(flowSettings) !== 'server') return;\n const collector = flowSettings.collector ?? {};\n collector.consentDenied ??= 'skip';\n flowSettings.collector = collector;\n}\n\n/**\n * Bake flow-config provenance onto the collector before codegen.\n *\n * The flow name keys this flow's entry in `event.source.release`; the release\n * value stamps that key. An authored `collector.name` is kept. The release is\n * the explicit id when given, then an authored `collector.release`, then\n * `fallback()`, so a standalone bundle carries a release instead of the\n * runtime `__VERSION__` default.\n */\nexport function applyCollectorProvenance(\n flowSettings: Flow,\n flowName: string,\n release: string | undefined,\n fallback: () => string,\n): void {\n const collector = flowSettings.collector ?? {};\n collector.name ??= flowName;\n collector.release = release ?? collector.release ?? fallback();\n flowSettings.collector = collector;\n}\n\n/**\n * Build split config object from flow configuration.\n * Produces THREE outputs:\n * - codeConfigObject: skeleton with code references and __data.* placeholders\n * - dataPayloadObj: plain JSON-serializable object with settings, mappings, etc.\n * - dataPayload: the stringified form of dataPayloadObj the codegen embeds\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 namedImports: Map<string, Set<string>>,\n): {\n storesDeclaration: string;\n codeConfigObject: string;\n dataPayloadObj: Record<string, unknown>;\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 // Named-import step: use the user-specified export name\n if (typeof step.import === 'string' && step.package) {\n return step.import;\n }\n // Default-import step: derive the variable from the package name\n return packageNameToVariable(step.package!);\n }\n\n // Helper to build a split step entry for the code skeleton. `codeVar` is\n // undefined for a code-free path step: the runtime synthesizes its push.\n function buildSplitStepEntry(\n section: string,\n stepId: string,\n codeVar: string | undefined,\n runtimeProps: Record<string, unknown>,\n ): string {\n const { codeProps, dataProps } = classifyStepProperties(runtimeProps);\n\n const codeEntries: string[] = [];\n if (codeVar !== undefined) codeEntries.push(`code: ${codeVar}`);\n\n // Code-layer props (serialized with processConfigValue)\n for (const [key, value] of Object.entries(codeProps)) {\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 // Single emission path for every step kind. Which fields reach the runtime\n // is decided by STEP_FIELD_ROLES in @walkeros/core (getStepRuntimeProps),\n // never by a hand-written field list here.\n function buildStepEntry(\n kind: Flow.StepKind,\n section: string,\n stepId: string,\n step: FlowStep,\n ): string {\n const runtimeProps = getStepRuntimeProps(step, kind);\n if (isInlineCode(step.code)) {\n return ` ${stepId}: ${generateInlineCode(step.code, runtimeProps, kind === 'Destination')}`;\n }\n const codeVar = isPathStepEntry({ ...step }, kind)\n ? undefined\n : resolveCodeVar(step);\n return buildSplitStepEntry(section, stepId, codeVar, runtimeProps);\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]) => buildStepEntry('Source', 'sources', key, source));\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations)\n .filter(([, dest]) => dest.package || hasCodeReference(dest.code))\n .map(([key, dest]) =>\n buildStepEntry('Destination', 'destinations', key, dest),\n );\n\n // Build transformers (including code-free path steps)\n const transformersEntries = Object.entries(transformers)\n .filter(\n ([, transformer]) =>\n transformer.package ||\n hasCodeReference(transformer.code) ||\n isPathStepEntry({ ...transformer }, 'Transformer'),\n )\n .map(([key, transformer]) =>\n buildStepEntry('Transformer', '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]) => buildStepEntry('Store', 'stores', key, store));\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, dataPayloadObj, dataPayload };\n}\n\n/**\n * Runtime guard emitted once into the bundle preamble. Deferred $secret\n * references serialize to `__walkerosRequireSecret(\"KEY\", process.env[\"KEY\"])`;\n * this helper throws a clear key-only error when the secret is absent or empty,\n * instead of letting `undefined` flow downstream into a cryptic failure. It\n * collapses missing and empty (no value oracle) and never logs or echoes the\n * value.\n */\nconst SECRET_GUARD_HELPER = `function __walkerosRequireSecret(key, val) {\n if (val == null || val === '') throw new Error('WalkerOS: required secret \"' + key + '\" is not set');\n return val;\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 `${SECRET_GUARD_HELPER}\n\nexport function wireConfig(__data) {\n ${storesDeclaration}\n\n const config = ${codeConfigObject};${codeSection}\n\n return config;\n}\n\nexport { startFlow };`;\n}\n\n/**\n * The runner contract's logger merge, emitted into every server factory\n * entry: the host (`runneros`) passes `context.logger` (masking, the error\n * ring tap), optionally `context.logLevel` (a level it forces, `--verbose`)\n * and `context.onLogger` (receives the flow's own `{ level, format }` before\n * the collector starts). The flow's level and format win over the host's;\n * a flow handler runs first, then the host's, which runs once per line,\n * always. The flow handler's `originalHandler` does nothing: the host prints\n * every line, masked and in the flow's format.\n */\nconst HOST_LOGGER_MERGE = ` // The host's logger (masking, its error ring) joins the flow's own: the\n // flow's level and format win, unless the host forces a level (--verbose);\n // the flow's handler runs first, then the host's, once per line, always.\n // The flow handler's originalHandler does nothing, so no line prints a\n // second time unmasked. The host learns the flow's settings before the\n // collector starts, so every line, the first included, has its format.\n if (context.logger) {\n const own = config.logger || {};\n const host = context.logger;\n if (context.onLogger) context.onLogger({ level: own.level, format: own.format });\n const level = context.logLevel ?? own.level ?? host.level;\n const printedByHost = () => {};\n const handler = own.handler && host.handler\n ? (lvl, message, ctx, scope) => {\n try {\n own.handler(lvl, message, ctx, scope, printedByHost);\n } finally {\n host.handler(lvl, message, ctx, scope, printedByHost);\n }\n }\n : host.handler || own.handler;\n config.logger = {\n ...host,\n ...(level !== undefined ? { level } : {}),\n ...(own.format ? { format: own.format } : {}),\n ...(handler ? { handler } : {}),\n };\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${HOST_LOGGER_MERGE}\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 // Telemetry observer installation: the host (pipeline.ts) builds the\n // observer functions via createTelemetryObserver + createBatchedPoster\n // and forwards them through context. Added to collector.observers so the\n // runtime self-emission loop drives them.\n if (context.observers) {\n for (const observer of context.observers) {\n result.collector.observers.add(observer);\n }\n }\n\n // The host forwards the level supplier beside the observers; the collector\n // capture path reads it to decide destination call capture at trace.\n if (context.observeLevel) result.collector.observeLevel = context.observeLevel;\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 * Read the STATIC observe connect config from a flow's `config.observe`.\n * Returns the public `{ url, binding }` pair (trimmed) plus the optional\n * `level`/`sample` controls only when both pair members are non-empty\n * strings; anything else yields undefined so the web entry emits zero\n * observe wiring bytes. Every carried field is public; dropping `level`\n * here would silently override an explicit `level: 'off'` with the\n * runtime's `standard` default once a credential attaches. A block that\n * names `url` or `binding` but does not form a usable pair (missing,\n * empty, or whitespace-only member) warns at build time, because silent\n * zero-wiring in a minified bundle is invisible to the author. A pure\n * level/sample block is valid managed-telemetry config, not a failed\n * connect pair, and stays silent. Secrets never live in flow config: the\n * runtime connect module reads the per-session credential out-of-band at\n * boot.\n */\nexport function readObserveConnect(\n flowSettings: Flow,\n logger?: Logger.Instance,\n): ObserveWeb | undefined {\n const observe = flowSettings.config?.observe;\n if (!observe) return undefined;\n const { url, binding, level, sample } = observe;\n if (url === undefined && binding === undefined) return undefined;\n const trimmedUrl = typeof url === 'string' ? url.trim() : '';\n const trimmedBinding = typeof binding === 'string' ? binding.trim() : '';\n if (trimmedUrl !== '' && trimmedBinding !== '') {\n return {\n url: trimmedUrl,\n binding: trimmedBinding,\n // Same JSON-borne prudence as the pair: only known-shaped public\n // values reach the emitted literal.\n ...(level === 'off' || level === 'standard' || level === 'trace'\n ? { level }\n : {}),\n // Sample is a fraction in [0, 1] per the Flow.Observe contract; the\n // range test also drops NaN and the infinities.\n ...(typeof sample === 'number' && sample >= 0 && sample <= 1\n ? { sample }\n : {}),\n };\n }\n const missing = [\n ...(trimmedUrl === '' ? ['url'] : []),\n ...(trimmedBinding === '' ? ['binding'] : []),\n ].join(' and ');\n logger?.warn(\n `config.observe has no effect: missing or empty ${missing}. Observe connect wiring was skipped; set both config.observe.url and config.observe.binding to non-empty public values.`,\n );\n return undefined;\n}\n\n/** Imports the page's Observe credential slot into a browser entry. */\nconst OBSERVE_SLOT_IMPORT =\n \"import { pageObserveSlot } from '@walkeros/web-core';\\n\";\n\n/**\n * Emit the STATIC observe connect assignment for a generated entry: bake\n * ONLY the public connect values (`url` + `binding`, plus the optional\n * `flowId`/`level`/`sample` scoping) onto the startFlow config, beside the\n * page slot the web arm reads its credential through. The runtime connect\n * module inside startFlow does the credential work at boot (the per-session\n * secret arrives out-of-band via the `elbObserve` companion); no emitted\n * byte here is ever secret. The entry imports the slot with\n * `OBSERVE_SLOT_IMPORT`.\n */\nfunction emitObserveAssignment(observe: ObserveWeb): string {\n const literal: ObserveWeb = {\n url: observe.url,\n binding: observe.binding,\n ...(observe.flowId !== undefined ? { flowId: observe.flowId } : {}),\n ...(observe.level !== undefined ? { level: observe.level } : {}),\n ...(observe.sample !== undefined ? { sample: observe.sample } : {}),\n };\n return `\n config.observe = { ...${JSON.stringify(literal)}, slot: pageObserveSlot() };`;\n}\n\n/** Imports the Tag Mode loader into a browser entry. */\nconst MOIN_IMPORT = \"import { moin } from '@walkeros/web-core';\\n\";\n\n/**\n * The Tag Mode loader call, the first statement of a browser entry: the\n * production target when none is given, or the target a deploy passes. A\n * target must be an https origin and an https base ending in `/`, so a\n * malformed value fails the build instead of shipping a loader that never\n * loads; its values are emitted as string literals.\n */\nfunction emitMoinCall(target?: MoinTarget): string {\n if (!target)\n return `\n moin();`;\n const app = parseHttps(target.app);\n if (!app || app.origin !== target.app) {\n throw new Error(\n `Invalid moin.app \"${target.app}\". Must be an https origin such as https://app.example.com.`,\n );\n }\n const base = parseHttps(target.base);\n if (\n !base ||\n base.href !== target.base ||\n base.username ||\n base.password ||\n base.search ||\n base.hash ||\n !base.pathname.endsWith('/')\n ) {\n throw new Error(\n `Invalid moin.base \"${target.base}\". Must be an https URL ending in \"/\" without query or fragment.`,\n );\n }\n return `\n moin({ app: ${JSON.stringify(target.app)}, base: ${JSON.stringify(target.base)} });`;\n}\n\nfunction parseHttps(value: string): URL | undefined {\n try {\n const url = new URL(value);\n return url.protocol === 'https:' ? url : undefined;\n } catch {\n return 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 * STATIC observe connect config baked onto the startFlow config. PUBLIC\n * values only (url + binding); the runtime connect module reads the\n * per-session credential out-of-band at boot. Absent = zero observe\n * wiring bytes in the emitted entry.\n */\n observe?: ObserveWeb;\n } = {},\n): string {\n const assignments: string[] = [];\n if (options.windowCollector) {\n assignments.push(\n ` if (typeof window !== 'undefined') window['${assertWindowCollector(options.windowCollector)}'] = collector;`,\n );\n }\n // windowElb is intentionally NOT assigned here: the browser source is the\n // single writer of window[settings.elb]. Emitting it too raced the source's\n // own assignment. `windowElb` survives as a deprecated build hint that the\n // config bridge forwards onto the browser source's settings.elb.\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\n const observeImport = options.observe ? OBSERVE_SLOT_IMPORT : '';\n const observeBlock = options.observe\n ? emitObserveAssignment(options.observe)\n : '';\n\n const loaderImport = platform === 'browser' ? MOIN_IMPORT : '';\n const loaderCall = platform === 'browser' ? emitMoinCall() : '';\n\n return `${loaderImport}${observeImport}import { startFlow, wireConfig } from '${stage1Specifier}';\n\nconst __configData = ${dataPayload};\n\n(async () => {${loaderCall}\n const config = wireConfig(__configData);${envBlock}${observeBlock}\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 */\n/**\n * Preview activation wiring. When present and enabled, the generated entry\n * imports the activator from web-core and lets it decide whether a preview\n * bundle boots in place of this flow. The bundle carries only PUBLIC values: a\n * keyring, an issuer, and opaque bindings. Never a project id, never a secret.\n */\nexport interface WrapEntryPreview {\n enabled: boolean;\n keyring: PreviewKey[];\n iss: string;\n /** Opaque project binding. Omitted only on demo hosts. */\n pb?: string;\n /** Demo hosts only: accept another project's preview, confined to demoAllowlist. */\n acceptForeign?: boolean;\n demoAllowlist?: string[];\n /** Bare CDN hostname. */\n previewOrigin: string;\n}\n\nexport function generateWrapEntry(\n stage1Path: string,\n options: {\n windowCollector?: string;\n windowElb?: string;\n /**\n * Preview activation wiring. Only host (deploy) wraps set this: the\n * preview-artifact wrap always omits it, so an activated preview can\n * never re-verify its own grant and re-inject itself.\n */\n preview?: WrapEntryPreview;\n /**\n * Preview-ARTIFACT wiring (the third wrap variant). When set, the emitted\n * entry reads the session-forwarding grant from\n * `localStorage['elbPreviewSession']` (the companion slot the activator\n * persists alongside the activation grant) at boot and stamps it as the\n * `X-Walkeros-Preview` header on each named server-bound destination\n * (`config.destinations[k].config.settings.headers`), before `startFlow`.\n * The grant is never baked into the artifact.\n *\n * Mutually exclusive with `preview`: a host bundle ACTIVATES a preview, an\n * artifact INJECTS its grant. An artifact that also baked the activator\n * would re-verify the stored grant and re-inject itself (infinite\n * recursion), so setting both throws.\n */\n previewGrantTargets?: 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 * STATIC observe connect config baked onto the startFlow config. PUBLIC\n * values only (`url` + `binding`, plus optional `flowId`/`level`/`sample`\n * scoping); the runtime connect module reads the per-session credential\n * out-of-band at boot via the `elbObserve` slot. This is the\n * preview-artifact observation wiring: it bakes no ingest token.\n */\n observe?: ObserveWeb;\n /**\n * The Tag Mode loader target, internal deploy data like the preview\n * keyring. Absent, the loader trusts the production app.\n */\n moin?: MoinTarget;\n } = {},\n): string {\n const assignments: string[] = [];\n if (options.windowCollector) {\n assignments.push(\n ` if (typeof window !== 'undefined') window['${assertWindowCollector(options.windowCollector)}'] = collector;`,\n );\n }\n // windowElb is intentionally NOT assigned here (see generateWebEntry): the\n // browser source is the single writer of window[settings.elb].\n const assignmentCode =\n assignments.length > 0 ? '\\n' + assignments.join('\\n') : '';\n\n // A host bundle activates a preview; a preview artifact injects its grant.\n // Baking both would let an activated artifact re-verify the stored grant and\n // re-inject itself (infinite recursion), so refuse the combination loudly\n // rather than pick a silent precedence that hides a caller bug.\n if (\n options.preview !== undefined &&\n options.previewGrantTargets !== undefined\n ) {\n throw new Error(\n 'generateWrapEntry: `preview` (host activator) and `previewGrantTargets` ' +\n '(preview-artifact injection) are mutually exclusive. A host bundle ' +\n 'activates a preview; an artifact injects its grant. Pass at most one.',\n );\n }\n\n const preview = options.preview;\n const previewEnabled = !!preview?.enabled;\n\n // The activator is imported (not inlined) so its logic is tested as a module\n // and DCE keeps it out of every bundle that does not enable preview.\n const previewImport = previewEnabled\n ? `import { browserSwapActivator } from '@walkeros/web-core';\\n`\n : '';\n\n // Preview-artifact variant: read the SESSION-FORWARDING grant (the\n // companion the activator persists to localStorage['elbPreviewSession'])\n // at boot and stamp it as the X-Walkeros-Preview header on each named\n // server-bound destination, before startFlow. Never the activation grant\n // in 'elbPreview': the session container only accepts session-bound\n // grants, so that value could only ever be rejected (sb-mismatch). The\n // grant value never appears as a literal — only the runtime localStorage\n // read. localStorage access is wrapped in try/catch (Safari private mode\n // throws) and an absent key skips injection entirely so a plain page\n // boots normally.\n const grantTargets = options.previewGrantTargets ?? [];\n const previewGrantBlock =\n grantTargets.length > 0\n ? `\n // --- Preview grant injection ---\n try {\n const __previewGrant =\n typeof localStorage !== 'undefined'\n ? localStorage.getItem('elbPreviewSession')\n : null;\n if (__previewGrant && config.destinations) {\n${grantTargets\n .map((key) => {\n const ref = `config.destinations[${singleQuoteLiteral(key)}]`;\n return ` if (${ref}) {\n const __dest = ${ref};\n const __cfg = __dest.config || (__dest.config = {});\n const __settings = __cfg.settings || (__cfg.settings = {});\n const __headers = __settings.headers || (__settings.headers = {});\n __headers['X-Walkeros-Preview'] = __previewGrant;\n }`;\n })\n .join('\\n')}\n }\n } catch (__err) {\n // localStorage can throw (Safari private mode); boot without the grant.\n }\n // --- End preview grant injection ---`\n : '';\n\n const previewBlock =\n previewEnabled && preview\n ? `\n // --- Preview activation ---\n if (await browserSwapActivator(${JSON.stringify({\n keyring: preview.keyring,\n iss: preview.iss,\n pb: preview.pb,\n acceptForeign: preview.acceptForeign,\n demoAllowlist: preview.demoAllowlist,\n previewOrigin: preview.previewOrigin,\n })})) return;\n // --- End preview activation ---\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\n // STATIC observe connect wiring (see emitObserveAssignment): baked inside\n // the IIFE AFTER the activator's early return, so an activated page (the\n // artifact swapped in) never also installs the host's connect module.\n const observeImport = options.observe ? OBSERVE_SLOT_IMPORT : '';\n const observeBlock = options.observe\n ? emitObserveAssignment(options.observe)\n : '';\n\n // The loader runs first, before the activator: host and artifact both call\n // it, and its page guard keeps the first one.\n const loaderImport = platform === 'browser' ? MOIN_IMPORT : '';\n const loaderCall = platform === 'browser' ? emitMoinCall(options.moin) : '';\n\n return `${loaderImport}${previewImport}${observeImport}import { startFlow, wireConfig, __configData } from '${stage1Specifier}';\n\n(async () => {${loaderCall}${previewBlock}\n const config = wireConfig(__configData);${envBlock}${previewGrantBlock}${observeBlock}\n const { collector, elb } = await startFlow(config);${assignmentCode}\n})();`;\n}\n\n/**\n * Emit a single-quoted JS string literal for a destination key. Destination\n * keys come from a validated flow config, but escaping backslash and single\n * quote keeps the emitted codegen well-formed for any key and matches the\n * single-quote convention the preview-injection tests pin.\n */\nfunction singleQuoteLiteral(value: string): string {\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\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${HOST_LOGGER_MERGE}\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 // Telemetry observer installation: the host (pipeline.ts) builds the\n // observer functions via createTelemetryObserver + createBatchedPoster\n // and forwards them through context. Added to collector.observers so the\n // runtime self-emission loop drives them.\n if (context.observers) {\n for (const observer of context.observers) {\n result.collector.observers.add(observer);\n }\n }\n\n // The host forwards the level supplier beside the observers; the collector\n // capture path reads it to decide destination call capture at trace.\n if (context.observeLevel) result.collector.observeLevel = context.observeLevel;\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 secret markers → guarded process.env read. The secret marker is\n // ALWAYS a whole-string value (never embedded inline), so we match the full\n // string. We wrap the read in __walkerosRequireSecret so an absent or empty\n // secret fails with a clear key-only error at startup instead of surfacing\n // later as a cryptic downstream failure (e.g. GCP ADC metadata lookup). The\n // secret VALUE is never inlined — only the env read + guard are emitted.\n if (value.startsWith(SECRET_MARKER_PREFIX)) {\n const name = value.slice(SECRET_MARKER_PREFIX.length);\n return `__walkerosRequireSecret(${JSON.stringify(name)}, process.env[${JSON.stringify(name)}])`;\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","import { SECRET_MARKER_PREFIX } from '@walkeros/core';\n\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 * - __WALKEROS_SECRET: prefix (guarded process.env read for a deferred secret)\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 value.includes(SECRET_MARKER_PREFIX)\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 * Step-package normalization shared by bundle, setup, validate and the MCP's\n * flow_examples.\n *\n * Pure flow-config logic: which packages do the flow's steps declare, and\n * what is the effective {name, version | path} for each after merging inline\n * step specs with config.bundle.packages pins. Lives in core/ so every\n * command and tool that reads a step's package runs the exact same precedence\n * (a bundle pin always wins; an unversioned bundle entry is filled from the\n * first inline version; conflicting inline versions with no pin throw;\n * local paths become synthetic packageNameToVariable keys).\n */\nimport type { Flow, Logger } from '@walkeros/core';\nimport { packageNameToVariable } from '@walkeros/core';\nimport type { ComponentKind } from './resolve-export-name.js';\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 */\nexport type FlowStepRecord =\n | Record<string, Flow.Source>\n | Record<string, Flow.Destination>\n | Record<string, Flow.Transformer>\n | Record<string, Flow.Store>;\nexport function 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/** A step package spec that is a local path (`./x`, `../x`, `/abs/x`). */\nfunction isLocalPath(spec: string): boolean {\n return spec.startsWith('.') || spec.startsWith('/');\n}\n\n/**\n * Split a step package spec into bare name and optional version suffix.\n * `@walkeros/x@1.2.3` → { name: '@walkeros/x', version: '1.2.3' }.\n * The scope `@` at index 0 is never a separator. A trailing `@` is ignored.\n * Alias/git/file suffixes are not interpreted — the resolver handles or\n * rejects them downstream.\n */\nexport function parsePackageSpec(spec: string): {\n name: string;\n version?: string;\n} {\n const at = spec.lastIndexOf('@');\n if (at <= 0) return { name: spec };\n const version = spec.slice(at + 1);\n return version\n ? { name: spec.slice(0, at), version }\n : { name: spec.slice(0, at) };\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 * 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 * Auto-adds every step-declared package (sources, destinations, transformers,\n * stores) to `packages`, mutating `flowSettings` in place so each step's\n * `package` field points at the key that ends up in `packages`.\n *\n * Local paths (`.` or `/` prefixed) are normalized to a synthetic\n * `packageNameToVariable` key so the regular default-import codegen wires\n * them up automatically.\n *\n * npm specs go through `parsePackageSpec` to split an inline version\n * (`@walkeros/x@1.2.3`) from the bare name. Precedence policy:\n * - An explicit `config.bundle.packages` version always wins; a disagreeing\n * inline version only warns (bundle pin is authoritative).\n * - An unversioned bundle entry is filled from the first inline version seen\n * for that bare name, preserving any other fields already on the entry.\n * - Two different inline versions for the same bare name, with no bundle\n * pin to arbitrate, are ambiguous — throw naming both steps' versions\n * rather than silently picking one.\n * - Identical inline versions across steps are fine (no-op).\n * Alias/git/file suffixes are not special-cased: `parsePackageSpec` splits on\n * the last `@` and the resolver handles or rejects the rest downstream.\n */\nexport function applyStepPackages(\n flowSettings: Flow,\n packages: Record<string, Flow.BundlePackage>,\n logger: Logger.Instance,\n): void {\n const stepPackages = collectAllStepPackages(flowSettings);\n // Bundle-pinned version per bare name, captured the first time each name is\n // encountered — i.e. before this function's own fill-ins can be mistaken\n // for a real `config.bundle.packages` pin on a later iteration.\n const originalPins = new Map<string, boolean>();\n // Inline version already seen per bare name (with no real bundle pin),\n // used to detect a second, different inline version for the same name.\n const inlineSeen = new Map<string, string>();\n\n const rewriteSteps = (from: string, to: string): void => {\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 === from) {\n step.package = to;\n }\n }\n }\n };\n\n for (const pkg of stepPackages) {\n if (isLocalPath(pkg)) {\n // Normalize: convert path-based package: to packages section entry.\n // The synthetic key acts as the package name for downstream codegen,\n // so the regular default-import flow wires it up automatically.\n const varName = packageNameToVariable(pkg);\n if (!packages[varName]) {\n packages[varName] = {\n path: pkg,\n };\n }\n\n // Rewrite all components that reference the raw path to point at the\n // synthetic packages-section key instead.\n rewriteSteps(pkg, varName);\n continue;\n }\n\n const { name, version } = parsePackageSpec(pkg);\n\n if (!originalPins.has(name)) {\n const entry = packages[name];\n // A `path` entry is a pin too: local paths win at resolution, so the\n // inline versions the steps declare can never be used.\n originalPins.set(\n name,\n entry?.version !== undefined || entry?.path !== undefined,\n );\n }\n const hasBundlePin = originalPins.get(name) === true;\n\n if (name !== pkg) {\n // Rewrite every step that declared the versioned spec to the bare\n // name, mirroring the local-path rewrite above.\n rewriteSteps(pkg, name);\n }\n\n if (version && !hasBundlePin) {\n const seen = inlineSeen.get(name);\n if (seen !== undefined && seen !== version) {\n throw new Error(\n `Conflicting inline versions for ${name}: \"${seen}\" and \"${version}\" are ` +\n `declared by different steps. Pin one version in config.bundle.packages.`,\n );\n }\n inlineSeen.set(name, version);\n }\n\n const existing = packages[name];\n if (!existing) {\n packages[name] = version ? { version } : {};\n } else if (version && !existing.path) {\n // A path entry decides on its own; stamping a version onto it would\n // record a version that resolution never consults.\n if (!existing.version) {\n existing.version = version; // fill an unversioned bundle entry\n } else if (existing.version !== version) {\n logger.warn(\n `Package ${name}: config.bundle.packages pins ${existing.version}; ` +\n `a step declares ${version} inline. Using the bundle pin.`,\n );\n }\n }\n }\n}\n\nexport interface ResolvedStepPackage {\n /** Bare package name after normalization (inline version stripped, local path replaced by synthetic key). */\n packageName: string;\n /** The package as messages and results name it: the bare npm name, or a step's own local path as written. */\n label: string;\n /** Effective bundle entry: version pin and/or local path per bundle precedence. */\n spec: Flow.BundlePackage;\n /** flow.config.bundle.overrides, for transitive pins. */\n overrides: Record<string, string>;\n /** Deep clone of the flow with step.package rewritten to bare names; the input flow is never mutated. */\n normalizedFlow: Flow;\n}\n\nconst KIND_TO_SECTION = {\n source: 'sources',\n transformer: 'transformers',\n destination: 'destinations',\n store: 'stores',\n} as const;\n\n/**\n * Resolve the effective package spec for one step by running the SAME\n * normalization the bundler runs over the whole flow (applyStepPackages),\n * on a clone so the caller's flow stays untouched. The clone comes back as\n * `normalizedFlow` with `step.package` rewritten to the bare name, which is\n * also what resolveExportName needs to match `bundle.packages[pkg].imports`.\n */\nexport function resolveStepPackage(\n flow: Flow,\n kind: ComponentKind,\n id: string,\n logger: Logger.Instance,\n): ResolvedStepPackage {\n const normalizedFlow = structuredClone(flow);\n const packages: Record<string, Flow.BundlePackage> = structuredClone(\n normalizedFlow.config?.bundle?.packages ?? {},\n );\n applyStepPackages(normalizedFlow, packages, logger);\n\n const bucket = getFlowSection(normalizedFlow, KIND_TO_SECTION[kind]);\n const step = bucket?.[id];\n if (!step) {\n const available = Object.keys(bucket ?? {}).join(', ') || '(none)';\n throw new Error(\n `${kind} \"${id}\" not found in flow. Available: ${available}`,\n );\n }\n if (typeof step.package !== 'string') {\n throw new Error(\n `${kind}.${id} has no \"package\" (inline code cannot be set up).`,\n );\n }\n\n const declared = getFlowSection(flow, KIND_TO_SECTION[kind])?.[id]?.package;\n return {\n packageName: step.package,\n label:\n declared !== undefined && isLocalPath(declared) ? declared : step.package,\n spec: packages[step.package] ?? {},\n overrides: normalizedFlow.config?.bundle?.overrides ?? {},\n normalizedFlow,\n };\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 './local-packages.js';\nimport type { Logger } from '@walkeros/core';\nimport { getPackageCacheKey } from './cache-utils.js';\nimport { getTmpPath } from './tmp.js';\nimport {\n isCacheDirComplete,\n readCacheDir,\n writeCacheDir,\n} from './atomic-cache.js';\nimport {\n assertRegistrySpecs,\n assertTransitiveRegistrySpec,\n isRegistrySpec,\n} from './package-spec.js';\n\nexport interface NpmConfig {\n registry: string;\n [key: string]: unknown;\n}\n\n/**\n * `ignoreScripts` is NOT the fix for install-time code execution, and must\n * not be read as one. pacote honours it in exactly one place, the directory\n * fetcher's `prepare` gate (`lib/dir.js`), so it closes `file:` and directory\n * specs only. The git fetcher's `#prepareDir` (`lib/git.js`) spawns a full\n * `npm install --force` whose default CLI config carries no\n * `--ignore-scripts` and passes `--include=dev --include=peer\n * --include=optional`, so it does NOT close `git:`. What closes `git:` is the\n * spec-type gate in `./package-spec.ts`, which refuses every non-registry\n * spec before pacote sees it. This flag is defence in depth behind that gate.\n */\nconst IGNORE_SCRIPTS = { ignoreScripts: true } as const;\n\nexport const PACOTE_OPTS: NpmConfig = {\n registry: 'https://registry.npmjs.org/',\n preferOnline: true,\n where: undefined,\n ...IGNORE_SCRIPTS,\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 // IGNORE_SCRIPTS goes last so an .npmrc cannot switch it off. See its\n // comment: it closes `file:` and directories, not `git:`.\n return { ...merged, registry, preferOnline: true, ...IGNORE_SCRIPTS };\n}\n\n// ============================================================\n// Resilient pacote downloads\n// ============================================================\n\n/**\n * Bounded, classified retry around a single pacote call (`extract`/`manifest`).\n *\n * pacote 21.x forwards `opts.signal` end-to-end (npm-registry-fetch →\n * make-fetch-happen → minipass-fetch). Passing a per-attempt AbortController\n * both bounds the call AND cancels the in-flight fetch, so a timed-out attempt\n * does not leave a detached download running. The previous `withTimeout` race\n * only rejected the wrapper while the real fetch kept running; the signal path\n * replaces it.\n *\n * Only TRANSIENT failures (timeouts, network blips) are retried. Deterministic\n * npm failures (404, auth, bad spec, integrity) fail fast. A total wall-clock\n * budget clamps every attempt to the remaining time so a sequential download\n * loop never holds far longer than the budget. The budget pattern mirrors\n * `runtime/fetch-retry.ts` but is copied here to avoid coupling the bundler to\n * the runtime.\n */\n\n/** Number of attempts (the first try plus retries). */\nexport const PACOTE_RETRY_ATTEMPTS = 3;\n\n/** Per-attempt timeout before the attempt is aborted. */\nconst PACOTE_PER_ATTEMPT_TIMEOUT_MS = 60_000;\n\n/** Total wall-clock budget across all attempts (including backoff sleeps). */\nconst PACOTE_MAX_TOTAL_MS = 90_000;\n\n/**\n * Floor of remaining budget below which starting another attempt is pointless:\n * a sub-second timeout would abort before the socket connects.\n */\nconst MIN_ATTEMPT_BUDGET_MS = 1_000;\n\n/** Base backoff before retry #2 and #3. The last entry repeats if needed. */\nconst BASE_BACKOFF_MS: readonly number[] = [2_000, 5_000];\n\n/** Jitter band applied to each backoff: ±20%. */\nconst JITTER = 0.2;\n\n/**\n * npm error codes that are permanent: an outer retry cannot help, so fail fast.\n * `EINTEGRITY` is permanent at this layer because pacote already cache-busts and\n * retries it once internally; a second outer pass just re-throws.\n */\nconst PERMANENT_ERROR_CODES: ReadonlySet<string> = new Set([\n 'E404',\n 'ETARGET',\n 'EINVALIDPACKAGENAME',\n 'E401',\n 'E403',\n 'EINTEGRITY',\n 'Z_DATA_ERROR',\n]);\n\n/** Read an optional string `code` off an unknown error without casting. */\nfunction readErrorCode(value: unknown): string | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const code = Reflect.get(value, 'code');\n return typeof code === 'string' ? code : undefined;\n}\n\n/** A permanent error should not be retried (fail fast). */\nfunction isPermanentError(error: unknown): boolean {\n const code = readErrorCode(error);\n return code !== undefined && PERMANENT_ERROR_CODES.has(code);\n}\n\n/** Backoff delay (with jitter) before the retry following attempt index `i`. */\nfunction backoffForAttempt(index: number): number {\n const base =\n BASE_BACKOFF_MS[Math.min(index, BASE_BACKOFF_MS.length - 1)] ?? 0;\n const spread = base * JITTER;\n return base + (Math.random() * 2 - 1) * spread;\n}\n\n/** Promise-based sleep that fake timers can drive in tests. */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/** Short, safe description of a thrown error for the exhaustion message. */\nfunction describeError(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\n/**\n * Attach an `AbortSignal` to pacote options. `signal` is forwarded by pacote at\n * runtime (npm-registry-fetch → make-fetch-happen) but is not part of the\n * `@types/pacote` Options surface; widen via intersection rather than casting.\n */\nfunction withSignal(\n opts: pacote.Options,\n signal: AbortSignal,\n): pacote.Options & { signal: AbortSignal } {\n return { ...opts, signal };\n}\n\nexport interface PacoteRetryOptions {\n attempts?: number;\n perAttemptTimeoutMs?: number;\n maxTotalMs?: number;\n}\n\n/**\n * Run a pacote operation with bounded retry, a per-attempt abort, and a total\n * wall-clock budget. `fn` receives the per-attempt `AbortSignal` to forward as\n * `opts.signal`. Throws after attempts/budget are spent, or immediately on a\n * permanent error.\n */\nexport async function withPacoteRetry<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n label: string,\n options: PacoteRetryOptions = {},\n): Promise<T> {\n const attempts = options.attempts ?? PACOTE_RETRY_ATTEMPTS;\n const perAttemptTimeoutMs =\n options.perAttemptTimeoutMs ?? PACOTE_PER_ATTEMPT_TIMEOUT_MS;\n const maxTotalMs = options.maxTotalMs ?? PACOTE_MAX_TOTAL_MS;\n\n const start = Date.now();\n let lastError: unknown;\n let made = 0;\n\n for (let attempt = 0; attempt < attempts; attempt++) {\n // Clamp each attempt to the remaining budget so the total wall-clock is\n // genuinely bounded. Stop if too little budget remains for a real attempt.\n const remaining = maxTotalMs - (Date.now() - start);\n if (remaining <= MIN_ATTEMPT_BUDGET_MS) break;\n const attemptTimeoutMs = Math.min(perAttemptTimeoutMs, remaining);\n\n made = attempt + 1;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), attemptTimeoutMs);\n try {\n return await fn(controller.signal);\n } catch (error) {\n lastError = error;\n // Permanent failures never benefit from a retry.\n if (isPermanentError(error)) throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n\n const isLastAttempt = attempt === attempts - 1;\n const budgetSpent = Date.now() - start >= maxTotalMs;\n if (isLastAttempt || budgetSpent) break;\n\n const sleepMs = Math.min(\n backoffForAttempt(attempt),\n maxTotalMs - (Date.now() - start),\n );\n if (sleepMs <= 0) break;\n await delay(sleepMs);\n }\n\n throw new Error(\n `Failed ${label} after ${made} attempts: ${describeError(lastError)}`,\n );\n}\n\n/**\n * `pacote.extract` with resilient retry. Retrying into the same dir is safe:\n * pacote empties `dest` before each extract, so no redundant pre-clean is\n * needed. The `cache` opt (when present) is preserved across attempts.\n */\nexport function extractWithResilience(\n spec: string,\n dest: string,\n opts: pacote.Options,\n _logger: Logger.Instance,\n retryOptions?: PacoteRetryOptions,\n): Promise<pacote.FetchResult> {\n return withPacoteRetry(\n (signal) => pacote.extract(spec, dest, withSignal(opts, signal)),\n `download ${spec}`,\n retryOptions,\n );\n}\n\n/** `pacote.manifest` with resilient retry. */\nexport function manifestWithResilience(\n spec: string,\n opts: pacote.Options,\n _logger: Logger.Instance,\n retryOptions?: PacoteRetryOptions,\n): Promise<pacote.AbbreviatedManifest & pacote.ManifestResult> {\n return withPacoteRetry(\n (signal) => pacote.manifest(spec, withSignal(opts, signal)),\n `fetch manifest ${spec}`,\n retryOptions,\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 // Every spec that can reach pacote must be a registry fetch. Direct pins\n // and override values are checked up front, all at once, before any\n // network call; transitive specs are checked as they are dequeued.\n assertRegistrySpecs([\n ...packages\n .filter((pkg) => !pkg.path)\n .map((pkg) => ({ name: pkg.name, spec: pkg.version, from: 'flow.json' })),\n // An override for a directly-local package is ignored (warned above),\n // so it is never fetched and not validated either.\n ...Object.entries(overrides)\n .filter(([name]) => !directLocalNames.has(name))\n .map(([name, spec]) => ({\n name,\n spec,\n from: 'config.bundle.overrides',\n })),\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\n // A transitive spec for a name the flow supplies from disk is dropped\n // before it is recorded: the local copy wins resolution, so the spec is\n // never fetched and cannot reach pacote around the check below.\n if (\n !item.localPath &&\n item.source !== 'direct' &&\n directLocalNames.has(item.name)\n ) {\n continue;\n }\n\n // An OPTIONAL dependency with a non-registry spec is skipped (never\n // recorded, never fetched), as npm would skip an optional dependency it\n // cannot install; every other non-registry transitive spec fails closed.\n if (!item.localPath && item.source !== 'direct') {\n if (item.optional && !isRegistrySpec(item.name, item.spec, true)) {\n logger.warn(\n `Skipping optional dependency ${item.name}@${item.spec} (from ${item.from}): only npm registry specs are installed`,\n );\n continue;\n }\n assertTransitiveRegistrySpec(item);\n }\n\n // Record this spec for EVERY queue item — the same name@spec can arrive\n // from multiple consumers (e.g., common AND pubsub both declare arrify@^2.0.0),\n // and the resolver needs to know all of them to nest correctly under each.\n // De-dup only exact (name@spec, from) tuples defensively.\n if (!allSpecs.has(item.name)) allSpecs.set(item.name, []);\n const existing = allSpecs.get(item.name)!;\n if (!existing.some((s) => s.spec === item.spec && s.from === item.from)) {\n existing.push({\n spec: item.spec,\n source: item.source,\n from: item.from,\n optional: item.optional,\n localPath: item.localPath,\n });\n }\n\n // Walk transitive deps only once per name@spec (prevents cycles).\n const visitKey = `${item.name}@${item.spec}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\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 manifestWithResilience(\n `${item.name}@${item.spec}`,\n npmConfig,\n logger,\n );\n } catch (error) {\n // A persistent manifest miss silently under-resolves the dependency\n // graph (the consumer's transitive deps are never queued). Escalate to\n // warn so the gap is visible, then continue resolving the rest.\n logger.warn(\n `Failed to fetch manifest for ${item.name}@${item.spec} after retries; its dependencies may be unresolved: ${error instanceof Error ? error.message : String(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 async function resolveVersionConflicts(\n allSpecs: Map<string, VersionSpec[]>,\n logger: Logger.Instance,\n npmConfig: pacote.Options = {},\n): Promise<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 function nestLoser(spec: VersionSpec, alreadyNested: Set<string>): void {\n if (spec.localPath) return;\n if (alreadyNested.has(spec.spec)) return;\n // Skip non-semver loser specs (git URLs, file:, tags) — pacote can resolve them but\n // we cannot statically verify satisfaction. Log and let pacote handle it.\n if (\n semver.valid(spec.spec) === null &&\n semver.validRange(spec.spec) === null\n ) {\n logger.debug(\n `Skipping non-semver loser spec for ${name}: ${spec.spec} from ${spec.from}`,\n );\n return;\n }\n // Gather all consumers sharing this exact spec string (mirror line 414-417 pattern)\n const consumers = activeSpecs\n .filter((s) => s.spec === spec.spec)\n .map((s) => s.from);\n nested.push({ name, version: spec.spec, consumers });\n alreadyNested.add(spec.spec);\n }\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 // Resolve chosenVersion to a concrete version we can validate against.\n // If chosen is already exact, use it directly. If it's a range/tag, ask pacote\n // what concrete version it would actually install.\n let concreteVersion: string;\n if (semver.valid(chosenVersion)) {\n concreteVersion = chosenVersion;\n } else {\n try {\n const manifest = await manifestWithResilience(\n `${name}@${chosenVersion}`,\n npmConfig,\n logger,\n );\n concreteVersion = manifest.version;\n } catch (err) {\n if (process.env.BUNDLER_STRICT_RANGES === '0') {\n logger.warn(\n `Could not resolve ${name}@${chosenVersion} for strict validation: ${err instanceof Error ? err.message : String(err)}. Skipping range validation (BUNDLER_STRICT_RANGES=0).`,\n );\n topLevel.set(name, { name, version: chosenVersion });\n continue;\n }\n throw new Error(\n `Failed to resolve ${name}@${chosenVersion} for range conflict validation. ` +\n `Set BUNDLER_STRICT_RANGES=0 to bypass with a warning. ` +\n `Original error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // Validate every spec against the concrete version. Non-satisfying specs get nested.\n for (const spec of specs) {\n if (spec.localPath) continue;\n if (spec.spec === chosenVersion) continue; // identical strings can't conflict\n\n const satisfied = semver.valid(spec.spec)\n ? spec.spec === concreteVersion\n : semver.validRange(spec.spec)\n ? semver.satisfies(concreteVersion, spec.spec, {\n includePrerelease: true,\n })\n : true; // non-semver (git, file:, tag) — let pacote handle, don't nest blindly\n\n if (satisfied) continue;\n\n if (spec.source === 'peerDependency') {\n logger.warn(\n `${name}@${concreteVersion} does not satisfy peer constraint ${spec.spec} (from ${spec.from})`,\n );\n } else {\n nestLoser(spec, alreadyNested);\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 = await resolveVersionConflicts(allSpecs, logger, npmConfig);\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 readCacheDir(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 // Retrying into the same dir is safe: pacote empties `dest` before each\n // extract, so no redundant pre-clean is needed here.\n await extractWithResilience(\n packageSpec,\n packageDir,\n { ...npmConfig, cache: cacheDir },\n logger,\n );\n\n if (userSpecifiedPackages.has(name)) {\n logger.debug(`Downloading ${packageSpec}`);\n }\n\n // Cache for future use\n if (useCache) {\n await writeCacheDir(packageDir, cachedPath, logger, {\n label: packageSpec,\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 manifestWithResilience(\n resolvedSpec,\n npmConfig,\n logger,\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 extractWithResilience(\n resolvedSpec,\n nestedDir,\n { ...npmConfig, cache: cacheDir },\n logger,\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 // Entries without the completion marker (cut short, or written before the\n // marker existed) are misses, so a truncated entry heals on the next build.\n return isCacheDirComplete(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 * 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';\nimport { canonicalJson } from './content-digest.js';\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 return canonicalJson(JSON.parse(content));\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","/**\n * Atomic cache writes.\n *\n * A cache entry is written to a `.tmp-<rand>` sibling first and renamed into\n * place only when complete, so a write cut short (a full disk, a crash) never\n * leaves a valid-looking entry behind. Directory entries carry a completion\n * marker written LAST; an entry without it (written before this module, or\n * poisoned) is a miss and is replaced by the next write.\n */\n\nimport crypto from 'crypto';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Logger } from '@walkeros/core';\nimport { getErrorMessage } from './utils.js';\n\n/** Marker file inside a complete cache directory entry. */\nexport const CACHE_COMPLETE_MARKER = '.walkeros-complete';\n\nconst TMP_INFIX = '.tmp-';\nconst BASE36 = '0123456789abcdefghijklmnopqrstuvwxyz';\nconst TMP_NAME = /\\.tmp-[0-9a-z]{8}$/;\n\n/** Copies a directory tree; `fs.copy` in production, injectable for tests. */\nexport type CopyDir = (src: string, dest: string) => Promise<void>;\n\nexport interface WriteCacheDirOptions {\n /** Names the entry in the warning, e.g. `name@version`. */\n label?: string;\n copy?: CopyDir;\n}\n\nfunction tempSibling(dest: string): string {\n const rand = Array.from(\n crypto.randomBytes(8),\n (byte) => BASE36[byte % BASE36.length],\n ).join('');\n return `${dest}${TMP_INFIX}${rand}`;\n}\n\nfunction errorCode(error: unknown): string | undefined {\n // Not `instanceof Error`: fs errors can come from another realm.\n if (typeof error === 'object' && error !== null && 'code' in error) {\n const code = error.code;\n return typeof code === 'string' ? code : undefined;\n }\n return undefined;\n}\n\nfunction isOccupied(error: unknown): boolean {\n const code = errorCode(error);\n return code === 'EEXIST' || code === 'ENOTEMPTY';\n}\n\n/** True for a `.tmp-*` name this module writes before a rename. */\nexport function isCacheTempName(name: string): boolean {\n return TMP_NAME.test(name);\n}\n\n/** True when `dir` holds a completed cache entry (its marker exists). */\nexport async function isCacheDirComplete(dir: string): Promise<boolean> {\n return fs.pathExists(path.join(dir, CACHE_COMPLETE_MARKER));\n}\n\n/** Copy a cache entry out of the cache, without its completion marker. */\nexport async function readCacheDir(src: string, dest: string): Promise<void> {\n const marker = path.join(src, CACHE_COMPLETE_MARKER);\n await fs.copy(src, dest, { filter: (file) => file !== marker });\n}\n\n/**\n * Remove `.tmp-*` leftovers in `dir` older than `maxAgeMs`. Fresh ones may\n * belong to a write in flight and are kept. Never throws.\n */\nexport async function sweepStaleCacheTemps(\n dir: string,\n maxAgeMs = 3_600_000,\n): Promise<void> {\n let entries: string[];\n try {\n entries = await fs.readdir(dir);\n } catch {\n return;\n }\n const cutoff = Date.now() - maxAgeMs;\n await Promise.all(\n entries.filter(isCacheTempName).map(async (entry) => {\n const entryPath = path.join(dir, entry);\n try {\n const stats = await fs.stat(entryPath);\n if (stats.mtimeMs < cutoff) await fs.remove(entryPath);\n } catch {\n // Removed concurrently, or unreadable: the next sweep retries.\n }\n }),\n );\n}\n\n/**\n * Move `tmp` into place at an occupied `dest` whose entry is NOT complete.\n * The old entry is moved aside atomically first, so a complete entry that a\n * concurrent writer renamed in meanwhile is put back instead of deleted.\n */\nasync function replaceIncomplete(tmp: string, dest: string): Promise<void> {\n const aside = tempSibling(dest);\n let moved = false;\n try {\n await fs.rename(dest, aside);\n moved = true;\n } catch (error) {\n if (errorCode(error) !== 'ENOENT') throw error;\n }\n const restore = moved && (await isCacheDirComplete(aside));\n const winner = restore ? aside : tmp;\n const loser = restore ? tmp : aside;\n try {\n await fs.rename(winner, dest);\n } catch (error) {\n // A concurrent writer finished first: its entry stands, ours is a copy.\n if (!isOccupied(error) || !(await isCacheDirComplete(dest))) {\n if (!restore && moved) await fs.remove(aside);\n throw error;\n }\n await fs.remove(winner);\n }\n await fs.remove(loser);\n}\n\n/**\n * Copy `src` into the cache at `dest` atomically. Never throws: the build\n * already has its own copy, so a failed cache write only warns.\n */\nexport async function writeCacheDir(\n src: string,\n dest: string,\n logger: Logger.Instance,\n options: WriteCacheDirOptions = {},\n): Promise<void> {\n const copy: CopyDir = options.copy ?? ((from, to) => fs.copy(from, to));\n const dir = path.dirname(dest);\n const tmp = tempSibling(dest);\n try {\n await fs.ensureDir(dir);\n await sweepStaleCacheTemps(dir);\n await copy(src, tmp);\n await fs.writeFile(path.join(tmp, CACHE_COMPLETE_MARKER), '');\n try {\n await fs.rename(tmp, dest);\n } catch (error) {\n if (!isOccupied(error)) throw error;\n if (await isCacheDirComplete(dest)) {\n await fs.remove(tmp);\n return;\n }\n await replaceIncomplete(tmp, dest);\n }\n } catch (error) {\n await fs.remove(tmp).catch(() => {});\n const label = options.label ?? path.basename(dest);\n logger.warn(\n `Package cache write failed for ${label}: ${getErrorMessage(error)}. The build continues without caching it.`,\n );\n }\n}\n\n/**\n * Write a single cache file atomically: a temp sibling, then a rename, so a\n * reader sees the old file, the new file, or none, never a partial one.\n */\nexport async function writeCacheFile(\n dest: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(dest);\n const tmp = tempSibling(dest);\n await fs.ensureDir(dir);\n await sweepStaleCacheTemps(dir);\n try {\n await fs.writeFile(tmp, content, 'utf-8');\n await fs.rename(tmp, dest);\n } catch (error) {\n await fs.remove(tmp).catch(() => {});\n throw error;\n }\n}\n","/**\n * Spec-type gate for every package spec the bundler hands to pacote.\n *\n * pacote picks a fetcher from the spec TYPE, and two of those fetchers run\n * code: the git fetcher prepares a clone with a full `npm install`, and the\n * directory fetcher (behind `file:`) runs the package's `prepare` script. So\n * the only specs allowed to reach pacote are registry fetches: a `version`,\n * `range` or `tag`. Everything else (`git`, `github:`, `file:`, `link:`,\n * directories, tarball URLs, `npm:` aliases) is refused before any network\n * call.\n *\n * Local packages are not specs: `config.bundle.packages[x].path` and step\n * packages beginning with `.` or `/` are copied from disk by the CLI and never\n * reach pacote, so they are not gated here.\n *\n * Transitive dependencies are gated too, because an override or a direct pin\n * can select a version whose own dependencies carry a git spec. A transitive\n * `npm:` alias is allowed when its target is itself a registry spec: real\n * published packages use them, and pacote resolves them from the registry.\n */\n\nimport npa from 'npm-package-arg';\n\n/** Spec types that fetch from the npm registry, the only ones allowed. */\nconst REGISTRY_SPEC_TYPES: ReadonlySet<string> = new Set([\n 'version',\n 'range',\n 'tag',\n]);\n\nexport interface SpecCheck {\n name: string;\n spec: string;\n /** Where the spec came from, for the error message (e.g. `flow.json`). */\n from: string;\n}\n\n/**\n * True when `name@spec` is a registry fetch for exactly `name`.\n * `allowAlias` admits an `npm:` alias whose target is a registry spec.\n */\nexport function isRegistrySpec(\n name: string,\n spec: string,\n allowAlias = false,\n): boolean {\n try {\n const parsed = npa.resolve(name, spec);\n if (REGISTRY_SPEC_TYPES.has(parsed.type)) return parsed.name === name;\n if (allowAlias && parsed.type === 'alias') {\n return REGISTRY_SPEC_TYPES.has(parsed.subSpec.type);\n }\n return false;\n } catch {\n // npm-package-arg throws on invalid names, tags and URL protocols.\n return false;\n }\n}\n\n/** A package spec that is not a registry version, range or tag. */\nexport class UnsupportedPackageSpecError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UnsupportedPackageSpecError';\n }\n}\n\nfunction formatSpec(check: SpecCheck): string {\n return `${check.name}@${check.spec} (from ${check.from})`;\n}\n\n/**\n * Throw one error naming every spec a flow declares that is not a registry\n * version, range or tag. Used for direct packages and override values.\n */\nexport function assertRegistrySpecs(checks: ReadonlyArray<SpecCheck>): void {\n const bad = checks.filter((c) => !isRegistrySpec(c.name, c.spec));\n if (bad.length === 0) return;\n throw new UnsupportedPackageSpecError(\n `Unsupported package spec: ${bad.map(formatSpec).join(', ')}. ` +\n `Only npm registry versions, ranges and tags can be bundled. ` +\n `For a package on disk use config.bundle.packages.<name>.path.`,\n );\n}\n\n/** Throw when a transitive dependency spec is not a registry fetch. */\nexport function assertTransitiveRegistrySpec(check: SpecCheck): void {\n if (isRegistrySpec(check.name, check.spec, true)) return;\n throw new UnsupportedPackageSpecError(\n `Unsupported dependency spec: ${formatSpec(check)}. ` +\n `The bundler only installs dependencies from the npm registry; ` +\n `git, file, directory and URL dependencies are refused because ` +\n `fetching them can run install scripts.`,\n );\n}\n","import esbuild from 'esbuild';\nimport { 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 declared package the\n * bundle imports 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 is the declared `bundle.packages` the bundle imports\n * (`collectImportedPackages`). A declared package nothing imports is not an\n * error: a dependency used only for its types, or a leftover entry, never\n * reaches the bundle. Such packages are returned (unless the trace reached\n * them through another package) so the caller can warn. The check is\n * shallow on purpose: we only verify the package's `package.json` reached\n * the trace, not every file inside. If the manifest is there, nft followed\n * the imports and copied what it found; if a deeper file is missing the\n * user adds it via `flow.<name>.config.bundle.traceInclude`.\n */\nexport interface AssertDepsOptions {\n fileList: string[];\n declaredPackages: string[];\n importedPackages: ReadonlySet<string>;\n}\n\n/**\n * Throws when an imported declared package is missing from the trace.\n * Returns the declared packages that are neither imported nor traced.\n */\nexport function assertDepsTraced(opts: AssertDepsOptions): string[] {\n const isTraced = (dep: string): boolean => {\n const manifest = `node_modules/${dep}/package.json`;\n return opts.fileList.some((f) => f.endsWith(manifest));\n };\n const missing = opts.declaredPackages.filter(\n (dep) => opts.importedPackages.has(dep) && !isTraced(dep),\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 return opts.declaredPackages.filter(\n (dep) => !opts.importedPackages.has(dep) && !isTraced(dep),\n );\n}\n\n/**\n * Package names of every bare import (static, dynamic, or require) in a\n * built bundle, read from esbuild's metafile with all packages external.\n * Subpaths collapse to their package (`@scope/pkg/dev` is `@scope/pkg`).\n */\nexport async function collectImportedPackages(\n file: string,\n): Promise<Set<string>> {\n let result: esbuild.BuildResult<{ metafile: true; write: false }>;\n try {\n result = await esbuild.build({\n entryPoints: [file],\n bundle: true,\n write: false,\n metafile: true,\n packages: 'external',\n platform: 'node',\n format: 'esm',\n logLevel: 'silent',\n });\n } finally {\n await esbuild.stop();\n }\n\n const imported = new Set<string>();\n for (const input of Object.values(result.metafile.inputs)) {\n for (const entry of input.imports) {\n if (entry.external) imported.add(packageNameOf(entry.path));\n }\n }\n return imported;\n}\n\nfunction packageNameOf(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@')\n ? segments.slice(0, 2).join('/')\n : segments[0];\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","import fs from 'fs-extra';\nimport * as path from 'path';\nimport semver from 'semver';\nimport type { Logger } from '@walkeros/core';\n\ninterface PackageJson {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n}\n\nexport interface DepViolation {\n consumerName: string;\n consumerVersion: string;\n depName: string;\n declaredRange: string;\n installedVersion: string;\n installedDir: string;\n}\n\n/**\n * Walks every installed package under `<root>/node_modules/**` and reports each\n * case where a declared dependency resolves (via Node-style nearest-ancestor\n * lookup) to a version that does NOT satisfy the declared range.\n *\n * Defense-in-depth observability for the bundler's resolver. Returns the list\n * of violations and emits a `logger.warn` for each. Does NOT throw — many\n * mismatches are benign npm transitives that nft will prune from the shipped\n * bundle. If a runtime error like \"X is not a function\" surfaces despite the\n * resolver fix, look at these warnings to find the culprit, then add an\n * `overrides` entry in your flow's package.json.\n */\nexport async function assertConsumerDepsSatisfied(\n root: string,\n logger: Logger.Instance,\n): Promise<DepViolation[]> {\n const consumers = await collectInstalledPackages(\n path.join(root, 'node_modules'),\n );\n const violations: DepViolation[] = [];\n\n for (const consumer of consumers) {\n const pkg = consumer.pkg;\n if (!pkg.dependencies) continue;\n for (const [depName, declaredRange] of Object.entries(pkg.dependencies)) {\n const installed = await resolveSiblingOrAncestor(\n consumer.dir,\n depName,\n root,\n );\n if (!installed) {\n logger.debug(\n `assertConsumerDepsSatisfied: ${pkg.name}@${pkg.version} declares ${depName}@${declaredRange} but it's not installed`,\n );\n continue;\n }\n // git/file:/tag — can't statically verify\n if (\n semver.validRange(declaredRange) === null &&\n semver.valid(declaredRange) === null\n ) {\n logger.debug(\n `assertConsumerDepsSatisfied: skipping non-semver declared range ${depName}@${declaredRange} from ${pkg.name}`,\n );\n continue;\n }\n const satisfied = semver.valid(declaredRange)\n ? declaredRange === installed.version\n : semver.satisfies(installed.version, declaredRange, {\n includePrerelease: true,\n });\n if (!satisfied) {\n const violation: DepViolation = {\n consumerName: pkg.name ?? '<unknown>',\n consumerVersion: pkg.version ?? '<unknown>',\n depName,\n declaredRange,\n installedVersion: installed.version,\n installedDir: installed.dir,\n };\n violations.push(violation);\n logger.warn(\n `Bundler dep mismatch: ${violation.consumerName}@${violation.consumerVersion} declares ${depName}@${declaredRange} but resolved to ${installed.version} at ${installed.dir}. If this surfaces at runtime, add an \"overrides\" entry to your flow's package.json.`,\n );\n }\n }\n }\n\n return violations;\n}\n\ninterface InstalledPackage {\n dir: string;\n pkg: PackageJson;\n}\n\nasync function collectInstalledPackages(\n nodeModulesDir: string,\n): Promise<InstalledPackage[]> {\n const result: InstalledPackage[] = [];\n if (!(await fs.pathExists(nodeModulesDir))) return result;\n\n async function walk(dir: string) {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const full = path.join(dir, entry.name);\n // Scoped package: recurse into @scope dir, treat children as packages\n if (entry.name.startsWith('@')) {\n const scopedEntries = await fs.readdir(full, { withFileTypes: true });\n for (const scoped of scopedEntries) {\n if (!scoped.isDirectory()) continue;\n await collectOne(path.join(full, scoped.name));\n }\n continue;\n }\n await collectOne(full);\n }\n }\n\n async function collectOne(pkgDir: string) {\n const pkgJsonPath = path.join(pkgDir, 'package.json');\n if (!(await fs.pathExists(pkgJsonPath))) return;\n const pkg = (await fs.readJson(pkgJsonPath)) as PackageJson;\n result.push({ dir: pkgDir, pkg });\n // Recurse into nested node_modules\n const nestedNm = path.join(pkgDir, 'node_modules');\n if (await fs.pathExists(nestedNm)) await walk(nestedNm);\n }\n\n await walk(nodeModulesDir);\n return result;\n}\n\n/**\n * Node-style resolution: search `<consumerDir>/node_modules/<depName>`, then walk\n * up to each ancestor's `node_modules/<depName>` until we find one or hit `root`.\n */\nasync function resolveSiblingOrAncestor(\n consumerDir: string,\n depName: string,\n root: string,\n): Promise<{ dir: string; version: string } | null> {\n let current = consumerDir;\n while (true) {\n const candidate = path.join(current, 'node_modules', depName);\n const pkgJson = path.join(candidate, 'package.json');\n if (await fs.pathExists(pkgJson)) {\n const pkg = (await fs.readJson(pkgJson)) as PackageJson;\n if (pkg.version) return { dir: candidate, version: pkg.version };\n }\n const parent = path.dirname(current);\n if (parent === current || !current.startsWith(root)) return null;\n current = parent;\n }\n}\n","import type { BuildFlag, Flow } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\n\n/**\n * Build-time feature flags for browser bundles (see @walkeros/core\n * build-flags). The CLI defines every flag, true or false, so no guard\n * survives into a bundle and a feature the flow does not use folds out.\n * Only browser bundles get them: the `cdn` stage 2 and the browser wrap.\n */\n\n/** The optional runtime features a flow uses. */\nexport interface FlowNeeds {\n observe: boolean;\n stores: boolean;\n state: boolean;\n}\n\n/** Whether a step declares `state`. A config the CLI cannot read counts. */\nfunction carriesState(step: { state?: unknown; config?: unknown }): boolean {\n if (step.state !== undefined) return true;\n if (step.config === undefined) return false;\n return !isObject(step.config) || step.config.state !== undefined;\n}\n\n/** Read the optional runtime features off a flow's config. */\nexport function flowNeeds(flow: Flow): FlowNeeds {\n const steps = [\n ...Object.values(flow.sources ?? {}),\n ...Object.values(flow.transformers ?? {}),\n ...Object.values(flow.destinations ?? {}),\n ];\n return {\n observe:\n flow.config?.observe !== undefined ||\n flow.collector?.observe !== undefined,\n stores: Object.keys(flow.stores ?? {}).length > 0,\n state: steps.some(carriesState),\n };\n}\n\n/**\n * The esbuild `define` map for a browser bundle. Validation is always off:\n * the CLI validates the flow at build time. Without needs (a skeleton from an\n * older CLI) every flag is on, which is the full behaviour.\n */\nexport function buildFlagDefines(\n needs: FlowNeeds | undefined,\n): Record<BuildFlag, string> {\n if (!needs) {\n return {\n __WALKEROS_OBSERVE__: 'true',\n __WALKEROS_STORES__: 'true',\n __WALKEROS_STATE__: 'true',\n __WALKEROS_VALIDATE__: 'true',\n };\n }\n return {\n __WALKEROS_OBSERVE__: String(needs.observe),\n __WALKEROS_STORES__: String(needs.stores),\n __WALKEROS_STATE__: String(needs.state),\n __WALKEROS_VALIDATE__: 'false',\n };\n}\n\n/**\n * A browser skeleton ends with its flow's needs, so the publish-time wrap can\n * define the flags without the flow. The wrap reads it as text, the way it\n * reads the `__devExports` registry.\n */\nconst NEEDS_MARKER = 'walkeros:needs';\n\nexport function needsMarker(needs: FlowNeeds): string {\n return `/* ${NEEDS_MARKER} ${JSON.stringify(needs)} */`;\n}\n\n/** The needs a skeleton carries; undefined when an older CLI wrote it. */\nexport function readNeedsMarker(skeleton: string): FlowNeeds | undefined {\n const match = new RegExp(`/\\\\* ${NEEDS_MARKER} (\\\\{[^}]*\\\\}) \\\\*/\\\\s*$`).exec(\n skeleton,\n );\n if (!match) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(match[1]);\n } catch {\n return undefined;\n }\n if (!isObject(parsed)) return undefined;\n const { observe, stores, state } = parsed;\n if (\n typeof observe !== 'boolean' ||\n typeof stores !== 'boolean' ||\n typeof state !== 'boolean'\n )\n return undefined;\n return { observe, stores, state };\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 { writeCacheFile } from './atomic-cache.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 /** CLI version: stage-1 codegen changes with it. */\n toolchain: 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 toolchain: inputs.toolchain,\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 writeCacheFile(cachePath, buildOutput);\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 writeCacheFile(cachePath, codeOutput);\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 writeCacheFile(cachePath, compiledCode);\n }\n\n return cachePath;\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","/**\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 /**\n * If true, the skeleton carries the lazy `/dev` registry\n * (`'<pkg>': () => import('<pkg>/dev')`) so simulate/push can await schemas\n * on demand. Every skeleton target sets this true: the registry is an\n * unreferenced thunk, so the deploy wrap DCEs the whole /dev graph to zero\n * bytes. Only the finished IIFE (`cdn`) sets this false, since it has no\n * registry and needs none.\n */\n withDev: boolean;\n /**\n * Gates whether the browser build externalizes each `<pkg>/dev` subpath.\n *\n * Deploy skeletons (`cdn-skeleton`, `runner`) set this true: `<pkg>/dev` is\n * externalized so the lazy registry stays a literal `import('<pkg>/dev')` and\n * the deploy wrap DCEs the whole /dev graph to zero bytes.\n *\n * In-process targets (`simulate`, `push`) set this false: `<pkg>/dev` is NOT\n * externalized, so esbuild inlines the /dev graph into the single ESM. The\n * lazy thunk then resolves an already-bundled module, which is what lets the\n * lean simulate-server (cli + core only, no sibling node_modules) resolve\n * schemas host-free. Node platform is unaffected by this flag: it always keeps\n * step packages external, and that bare external prefix-covers `<pkg>/dev`.\n */\n externalizeDev: 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 externalizeDev: false,\n platform: 'browser',\n injectEnv: true,\n }),\n // skipWrapper emits the introspectable skeleton (not a finished bundle),\n // consumed by simulate/preview/deploy; node keeps step packages external for\n // on-disk resolution (see the skeleton branch in bundler.ts). Every skeleton\n // carries the lazy /dev registry (withDev:true); it is an unreferenced thunk\n // the deploy wrap DCEs, so a skeleton with the registry is safe to deploy.\n // The browser skeleton additionally externalizes each `<pkg>/dev` so the\n // registry stays a literal `import()` rather than inlining the /dev graph.\n 'cdn-skeleton': Object.freeze({\n skipWrapper: true,\n withDev: true,\n externalizeDev: true,\n platform: 'browser',\n injectEnv: false,\n }),\n runner: Object.freeze({\n skipWrapper: true,\n withDev: true,\n externalizeDev: true,\n platform: 'node',\n injectEnv: false,\n }),\n simulate: Object.freeze({\n skipWrapper: true,\n withDev: true,\n externalizeDev: false,\n platform: 'node',\n injectEnv: false,\n }),\n push: Object.freeze({\n skipWrapper: true,\n withDev: true,\n externalizeDev: false,\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 (names only — per-package byte sizes are not measured)\n if (stats.packages.length > 0) {\n logger.info(`\\nPackages:`);\n stats.packages.forEach((pkg) => {\n logger.info(` • ${pkg.name}`);\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 })),\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { createIngest, getPlatform, stepId } from '@walkeros/core';\nimport {\n enrichEvent,\n transformerInit,\n runCollectorNext,\n runTransformerChain,\n wrapEnv,\n} from '@walkeros/collector';\nimport {\n createCLILogger,\n createCLILoggerConfig,\n} from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n detectInput,\n writeResult,\n type Platform,\n} from '../../core/index.js';\n\nimport type {\n Collector,\n Flow,\n FlowState,\n Ingest,\n Logger,\n Simulation,\n Source,\n WalkerOS,\n} from '@walkeros/core';\nimport { tmpRunDir } from '../../core/tmp-names.js';\nimport { scrubJson, scrubSecrets } from '../../core/redact-line.js';\nimport { toPrintable } from '../../core/to-printable.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 { buildSimulationResult } from './simulation-result.js';\nimport { prepareFlow } from './prepare.js';\nimport { schemas } from '@walkeros/core/dev';\nimport { runPushCommandWithSecrets } from './run.js';\nimport { collectKnownSecrets } from '../../core/known-secrets.js';\nimport { legacyExportRefusal, selectDevExamples } from './dev-examples.js';\nimport { resolveExportName } from '../../core/resolve-export-name.js';\n\n/**\n * Narrow runtime check used by the CLI output formatter to read fields off\n * an opaque `elbResult`. Avoids spreading `as Record<string, unknown>`\n * everywhere a few fields are pulled.\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\n/** A flow config (`Flow.Json`): an object with a `flows` object. */\nexport function isFlowJson(value: unknown): value is Flow.Json {\n return isRecord(value) && isRecord(value.flows);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * The trigger instance a source's `createTrigger` resolves to. `trigger`\n * fires a (type, options) trigger; the returned function takes the captured\n * content. `flow.collector.command` lets the simulator request a shutdown.\n * The bundle carries no compile-time types, so the simulator pins only the\n * members it actually reads and keeps the rest opaque.\n */\ninterface TriggerInstance {\n trigger: (\n type?: string,\n options?: unknown,\n ) => (content?: unknown) => Promise<unknown>;\n flow?: {\n collector?: {\n command?: (command: string) => Promise<unknown>;\n };\n };\n}\n\n/**\n * Signature of a source package's `createTrigger`, narrowed off the awaited\n * `/dev` module. The simulator only needs it to be callable and resolve to a\n * `TriggerInstance`; the bundle carries no compile-time types so the\n * parameters stay opaque.\n */\ntype CreateTrigger = (...args: unknown[]) => Promise<TriggerInstance>;\n\n/**\n * Type predicate narrowing an opaque value to a callable. Used instead of a\n * cast so `getCreateTrigger` can return a precisely typed function without\n * the banned `Function` type or an `as` assertion.\n */\nfunction isCallable(value: unknown): value is CreateTrigger {\n return typeof value === 'function';\n}\n\n/**\n * Narrow the awaited `/dev` module of a source package down to the\n * `createTrigger` of the step's export (see `selectDevExamples`), validating\n * each hop with `in`/`typeof` instead of a cast. Returns `undefined` if any\n * hop is missing or the wrong shape.\n */\nfunction getCreateTrigger(\n devModule: unknown,\n exportName: string | undefined,\n): CreateTrigger | undefined {\n const examples = selectDevExamples(devModule, exportName);\n if (!examples || !('createTrigger' in examples)) return undefined;\n const createTrigger = examples.createTrigger;\n return isCallable(createTrigger) ? createTrigger : undefined;\n}\n\n/**\n * Shape of a destination package's simulation `/dev` env, narrowed off the\n * awaited `/dev` module. `push` is the env object handed to the destination;\n * `simulation` lists `call:<fn>` markers the wrapper should track.\n */\ninterface DevEnv {\n push?: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Narrow the awaited `/dev` module of a package down to the `examples.env` of\n * the step's export (see `selectDevExamples`), validating each hop with\n * `in`/`typeof` instead of a cast. Returns `undefined` if any hop is missing\n * or the wrong shape.\n */\nfunction getDevEnv(\n devModule: unknown,\n exportName: string | undefined,\n): DevEnv | undefined {\n const examples = selectDevExamples(devModule, exportName);\n if (!examples || !('env' in examples)) return undefined;\n const env = examples.env;\n if (!isRecord(env)) return undefined;\n const result: DevEnv = {};\n if ('push' in env && isRecord(env.push)) result.push = env.push;\n if ('simulation' in env && isStringArray(env.simulation))\n result.simulation = env.simulation;\n return result;\n}\n\n/**\n * Injects each flow store's dev-examples mock env (`examples.env.push` of\n * the store's export, resolved like steps) before `startFlow`, so a store\n * that reaches the network at start (Sheets existence check, token\n * exchange) runs against its mock in every simulation. The store definition\n * object is mutated in place: `$store.<id>` env references resolve by\n * identity. A store whose package ships no mock env (fs, memory: local\n * only) runs as configured; its id is returned for a debug line.\n */\nexport async function applyStoreMockEnvs(\n flowConfig: { stores?: unknown },\n flowSettings: Flow,\n devExports: Record<string, () => Promise<unknown>> | undefined,\n): Promise<string[]> {\n const unmocked: string[] = [];\n const stores = flowConfig.stores;\n if (!isRecord(stores)) return unmocked;\n\n for (const [storeId, storeDef] of Object.entries(stores)) {\n const packageName = flowSettings.stores?.[storeId]?.package;\n const loadDev = packageName ? devExports?.[packageName] : undefined;\n const devModule =\n typeof loadDev === 'function' ? await loadDev() : undefined;\n const { exportName } = resolveExportName(flowSettings, 'store', storeId);\n const push = getDevEnv(devModule, exportName)?.push;\n\n if (!push || !isRecord(storeDef)) {\n unmocked.push(storeId);\n continue;\n }\n\n // `context.env` (the def's top-level `env`) is read first by the store\n // packages, so the mock replaces it and always wins over a configured\n // env. Assigned by reference: a mock's getters stay live.\n storeDef.env = push;\n }\n\n return unmocked;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(isString);\n}\n\n/** How the running flow logs: `json` routes its logs to stderr. */\ninterface FlowLogOptions {\n json?: boolean;\n silent?: boolean;\n verbose?: boolean;\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 raw?: unknown;\n knownSecrets?: readonly string[];\n } = {},\n): Promise<PushResult> {\n // Known once the config is read; the logger reads the list per line.\n let known: readonly string[] = options.knownSecrets ?? [];\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets: () => known,\n });\n const startTime = Date.now();\n let tempDir: string | undefined;\n\n try {\n // Detect input type. A `raw` config was already read by the caller: it\n // is a config, and this run reads the input no more.\n logger.debug('Detecting input type');\n const detected =\n options.raw !== undefined\n ? { type: 'config' as const }\n : 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 // The config as read once: the one `raw`, else the detected content.\n const raw: unknown =\n options.raw !== undefined\n ? options.raw\n : 'content' in detected\n ? JSON.parse(detected.content)\n : undefined;\n const knownSecrets =\n options.knownSecrets ??\n (isFlowJson(raw) ? collectKnownSecrets(raw) : []);\n known = knownSecrets;\n result = await executeConfigPush(\n {\n config: inputPath,\n flow: options.flow,\n json: options.json,\n silent: options.silent,\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 { raw, knownSecrets },\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 options,\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, knownSecrets } = await runPushCommandWithSecrets(options);\n const output = renderPushOutput(result, {\n json: options.json,\n knownSecrets,\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 * The `walkeros push` output (`--json` or text). Simulate output carries the\n * recorded vendor calls, whose arguments can hold credentials. It egresses\n * like a log line: serialize, then scrub, masking the values of the secrets\n * the flow references (`knownSecrets`) whatever their shape. A number that\n * prints a known secret is masked before serializing, so `--json` stays JSON.\n */\nexport function renderPushOutput(\n result: PushResult,\n options: { json?: boolean; knownSecrets?: readonly string[] } = {},\n): string {\n const knownSecrets = options.knownSecrets ?? [];\n return options.json\n ? scrubJson(result, { known: knownSecrets, space: 2 })\n : scrubSecrets(formatPushResult(result, { knownSecrets }), {\n known: knownSecrets,\n });\n}\n\nconst MAX_CALL_ARGS_LENGTH = 300;\n\n/** Compact JSON of one printable value; `undefined` has no JSON form. */\nfunction compactJson(value: unknown): string {\n return JSON.stringify(toPrintable(value)) ?? 'undefined';\n}\n\n/**\n * One call's arguments as compact JSON, cut at 300 chars. Scrubbed before the\n * cut so a secret straddling the cut cannot lose the context that marks it.\n */\nfunction formatCallArgs(\n args: unknown[],\n knownSecrets: readonly string[],\n): string {\n const text = scrubSecrets(args.map(compactJson).join(','), {\n known: knownSecrets,\n });\n return text.length > MAX_CALL_ARGS_LENGTH\n ? `${text.slice(0, MAX_CALL_ARGS_LENGTH - 3)}...`\n : text;\n}\n\n/** `granted functional, marketing` style list of the granted keys. */\nfunction grantedKeys(consent: WalkerOS.Consent | undefined): string {\n const keys = Object.entries(consent ?? {})\n .filter(([, granted]) => granted)\n .map(([key]) => key);\n return keys.length > 0 ? keys.join(', ') : 'none';\n}\n\n/** One line saying why a simulated destination sent nothing. */\nfunction formatSkipped(skipped: Simulation.Skipped): string {\n if (skipped.reason === 'pending') {\n const waits = skipped.require?.length ? skipped.require.join(', ') : '';\n return ` pending: waits for ${waits || 'its require'} (require)`;\n }\n return ` skipped: consent (requires ${grantedKeys(skipped.required)}; granted ${grantedKeys(skipped.granted)})`;\n}\n\nfunction formatSimulation(\n simulation: Simulation.Result,\n knownSecrets: readonly string[],\n): string[] {\n const lines = [` ${simulation.step}.${simulation.name}`];\n if (simulation.error) {\n lines.push(` error: ${simulation.error.message}`);\n return lines;\n }\n if (simulation.step === 'destination') {\n // No key with calls: the destination has no rule for the event and\n // pushed it as is. No key and no calls: it was skipped before mapping.\n const unmapped =\n simulation.calls.length > 0 ? 'none' : 'none (skipped before mapping)';\n lines.push(` mapping: ${simulation.mappingKey ?? unmapped}`);\n if (simulation.skipped) lines.push(formatSkipped(simulation.skipped));\n for (const call of simulation.calls)\n lines.push(\n ` call ${call.fn}(${formatCallArgs(call.args, knownSecrets)})`,\n );\n if (simulation.calls.length === 0) lines.push(' no calls');\n return lines;\n }\n for (const call of simulation.calls)\n lines.push(\n ` call ${call.fn}(${formatCallArgs(call.args, knownSecrets)})`,\n );\n for (const event of simulation.events)\n lines.push(` event ${formatCallArgs([event], knownSecrets)}`);\n if (simulation.events.length === 0) lines.push(' no events');\n return lines;\n}\n\n/**\n * Text output of `walkeros push`: the outcome, the push result or one block\n * per simulated step (its mapping, why nothing was sent, recorded calls), the\n * error, the duration. Call arguments are scrubbed here (before their cut),\n * masking `knownSecrets`; `pushCommand` scrubs the whole text at egress.\n */\nexport function formatPushResult(\n result: PushResult,\n options: { knownSecrets?: readonly string[] } = {},\n): string {\n const knownSecrets = options.knownSecrets ?? [];\n const lines: string[] = [];\n // Reflect the actual outcome. `success: true` only when no destination\n // recorded a failure during init/push/destroy (see executeDestinationPush).\n lines.push(`success: ${result.success}`);\n if (result.success) {\n const elbResult = isRecord(result.elbResult) ? result.elbResult : undefined;\n if (elbResult) {\n if (typeof elbResult.id === 'string')\n lines.push(` Event ID: ${elbResult.id}`);\n if (typeof elbResult.entity === 'string')\n lines.push(` Entity: ${elbResult.entity}`);\n if (typeof elbResult.action === 'string')\n lines.push(` Action: ${elbResult.action}`);\n }\n }\n for (const simulation of result.simulations ?? [])\n lines.push(...formatSimulation(simulation, knownSecrets));\n if (!result.success && result.error) lines.push(` Error: ${result.error}`);\n lines.push(` Duration: ${result.duration}ms`);\n return lines.join('\\n');\n}\n\n/**\n * High-level push function for programmatic usage.\n *\n * WARNING: This makes real API calls to real endpoints.\n * Events will be sent to configured destinations (analytics, CRM, etc.).\n *\n * @param configOrPath - Path to flow configuration file or pre-built bundle\n * @param event - Event object to push\n * @param options - Push options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.json - Format output as JSON (default: false)\n * @returns Push result with success status, elb result, and duration\n *\n * @example\n * ```typescript\n * const result = await push('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n * ```\n */\nexport async function push(\n configOrPath: string | unknown,\n event: unknown,\n options: PushOptions & {\n flow?: string;\n platform?: Platform;\n mock?: string[];\n snapshot?: string;\n /**\n * The config at `configOrPath`, already read by the caller: used as is,\n * the path is not read again (it still anchors relative paths).\n */\n raw?: unknown;\n /**\n * Values masked in the flow's logs. Defaults to the values of the\n * secrets the config references (see `collectKnownSecrets`).\n */\n knownSecrets?: readonly 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 raw: options.raw,\n knownSecrets: options.knownSecrets,\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 loaded: { raw: unknown; knownSecrets: readonly string[] },\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 raw: loaded.raw,\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 = await tmpRunDir('push');\n setTempDir(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 options,\n loaded.knownSecrets,\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 flowLogs: FlowLogOptions = {},\n): Promise<PushResult> {\n // Write bundle to temp file\n const tempDir = await tmpRunDir('push');\n setTempDir(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 flowLogs,\n );\n}\n\n/**\n * Execute non-simulated destination push (full pipeline).\n * Uses withFlowContext for environment setup and cleanup.\n *\n * Server platform deliberately disables timer interception and the drain\n * pump. Real `walkeros push` against destinations that use gRPC SDKs\n * (Pub/Sub, BigQuery, Kafka, AWS SDK v3, etc.) needs native Node timers:\n * those clients drive batch flush via `setTimeout` and keepalive via\n * `setInterval`, and intercepted timers break the gRPC client's state\n * machine, causing `topic.publishMessage()` to never resolve. Web platform\n * keeps interception + pump for backwards compatibility with destinations\n * whose init awaits a long captured timer (e.g. amplitude engagement\n * plugin) inside JSDOM. Simulate routes have their own call sites and\n * keep interception for deterministic snapshots.\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 flowLogs: FlowLogOptions = {},\n knownSecrets?: readonly string[],\n): Promise<PushResult> {\n const startTime = Date.now();\n const networkCalls: NetworkCall[] = [];\n const isServer = platform === 'server';\n\n return withFlowContext(\n {\n esmPath,\n platform,\n logger,\n snapshotCode,\n timeout,\n // Network polyfills are JSDOM-only; on server real push we want real\n // network so omit the capture array.\n ...(isServer ? {} : { networkCalls }),\n // Server real push: native Node primitives, no interception.\n // Web real push: keep interception + pump (see fn-level docstring).\n ...(isServer\n ? {}\n : {\n asyncDrain: { timeout: 5000 },\n drainPump: true,\n }),\n },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, overrides || {});\n routeFlowLogs(config, flowLogs, knownSecrets);\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 // Any-fail policy: if any wired destination's init/push/destroy\n // logged a failure, surface it on the PushResult. The collector\n // tallies failures at `status.destinations[id].failed` (incremented\n // in collector/src/destination.ts both for init throws and for push\n // throws), and increments `status.failed` per occurrence.\n const failedIds = collectFailedDestinations(collector);\n const success = failedIds.length === 0;\n const error = success\n ? undefined\n : buildFailureSummary(failedIds, collector);\n\n return {\n success,\n ...(error !== undefined ? { error } : {}),\n elbResult: elbResult as PushResult['elbResult'],\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n}\n\n/**\n * Minimal view of the collector status surface we read here. We only need\n * the per-destination failure counter the collector already tracks; the\n * full Collector.Instance type is not exported through the dynamically\n * imported bundle, so we narrow it locally without `any`.\n */\ninterface CollectorStatusView {\n status?: {\n destinations?: Record<string, { failed?: number; count?: number }>;\n };\n destinations?: Record<string, { type?: string }>;\n}\n\n/**\n * Read the failed-destination ids from the collector after shutdown.\n * Returns ids whose `status.destinations[id].failed` is > 0.\n */\nfunction collectFailedDestinations(collector: unknown): string[] {\n if (collector === null || typeof collector !== 'object') return [];\n const view = collector as CollectorStatusView;\n const destStatus = view.status?.destinations;\n if (!destStatus) return [];\n const failed: string[] = [];\n for (const [id, s] of Object.entries(destStatus)) {\n if (s && typeof s.failed === 'number' && s.failed > 0) failed.push(id);\n }\n return failed;\n}\n\n/**\n * Build a single-line, public-safe failure summary. We intentionally do\n * NOT include inner error messages or stack traces here: a server\n * endpoint that returns `PushResult` to a client must not leak\n * destination-internal errors. Detailed error context already flows\n * through the destination's scoped logger.\n */\nfunction buildFailureSummary(failedIds: string[], collector: unknown): string {\n const view = (\n collector !== null && typeof collector === 'object' ? collector : {}\n ) as CollectorStatusView;\n const dests = view.destinations ?? {};\n const labels = failedIds.map((id) => {\n const type = dests[id]?.type;\n return type ? `${id} (${type})` : id;\n });\n const noun = failedIds.length === 1 ? 'destination' : 'destinations';\n return `Push failed for ${noun}: ${labels.join(', ')}`;\n}\n\n/**\n * Routes the running flow's own logs (collector, steps) through the CLI\n * handler. In `--json` mode stdout carries only the result, so they go to\n * stderr like the CLI's. A simulation and a real push of a flow config always\n * route them, passing the values of the secrets the flow references\n * (`knownSecrets`) so every line is masked; a prebuilt bundle without\n * `--json` keeps the flow's own logger. The flow's configured level still\n * gates what reaches the handler.\n */\nfunction routeFlowLogs(\n flowConfig: { logger?: Logger.Config },\n options: FlowLogOptions,\n knownSecrets?: readonly string[],\n): void {\n if (!options.json && knownSecrets === undefined) return;\n const { handler } = createCLILoggerConfig({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\n });\n flowConfig.logger = { ...flowConfig.logger, handler };\n}\n\n/**\n * Shared data-injection seam for all simulate functions.\n */\nexport interface SimulateDataOptions {\n /**\n * Wire-config data payload to execute instead of the bundle's baked\n * `__configData`. Shape: the split-config data payload the bundler\n * emits (section, step id, data-layer props), as built by\n * `buildDataPayload`.\n *\n * The payload REPLACES the baked data, there is no deep-merge: build\n * the full payload from the full config. Injection granularity follows\n * the skeleton's `__data` references, which are emitted per TOP-LEVEL\n * step prop. Changed values for any nested key under an existing\n * top-level data prop (e.g. a new entity-action rule inside an existing\n * `mapping`) take effect without a rebundle. An entirely NEW top-level\n * data prop on a step has no `__data` reference in the skeleton, so it\n * is IGNORED by injection and requires a rebundle.\n */\n data?: Record<string, unknown>;\n}\n\nexport interface SimulateSourceOptions extends SimulateDataOptions {\n /** Log to stderr so stdout carries only the result (`push --json`). */\n json?: boolean;\n sourceId: string;\n bundlePath?: string;\n flow?: string;\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n /**\n * Web sources only: the absolute URL of the simulated page. Defaults to the\n * input trigger's `options.url` when it is a string, else\n * `http://localhost`.\n */\n pageUrl?: string;\n /**\n * The collector's starting consent, handed to `startFlow` as its state\n * (e.g. the consent a gated source such as the session source waits for).\n * Never recorded as a call: only the source's own commands are.\n */\n consent?: WalkerOS.Consent;\n}\n\nexport const PAGE_URL_SCOPE_ERROR =\n '--page-url sets the page of a simulated web source; for request context use --ingest.';\n\nconst DEFAULT_PAGE_URL = 'http://localhost';\n\n/**\n * The page a simulated web source runs on: an explicit `pageUrl`, else the\n * trigger's `options.url` when it is a string, else `http://localhost`.\n */\nfunction resolvePageUrl(input: unknown, pageUrl: string | undefined): string {\n const url = pageUrl ?? triggerUrl(input) ?? DEFAULT_PAGE_URL;\n let parsed: URL | undefined;\n try {\n parsed = new URL(url);\n } catch {\n parsed = undefined;\n }\n // http(s) only: an opaque origin (file:, about:, data:) has no storage.\n if (parsed?.protocol !== 'http:' && parsed?.protocol !== 'https:')\n throw new Error(\n `--page-url must be an absolute http(s) URL, e.g. https://www.example.com/ (got \"${url}\")`,\n );\n return parsed.href;\n}\n\nfunction triggerUrl(input: unknown): string | undefined {\n if (!isRecord(input) || !isRecord(input.trigger)) return undefined;\n const { options } = input.trigger;\n return isRecord(options) && isString(options.url) ? options.url : undefined;\n}\n\n/** A source definition's `code`, narrowed off the untyped wired config. */\nfunction isSourceInit(value: unknown): value is Source.Init {\n return typeof value === 'function';\n}\n\n/** Commands a source uses to wire itself up, not effects it emits. */\nconst WIRING_COMMANDS = new Set(['on', 'hook', 'destination']);\n\n/**\n * Wraps a source's `code` so the walker commands the source itself issues are\n * recorded in its call shape (`elb`, first argument verbatim): every\n * `env.command(name, data)` and every `env.elb('walker <name>', data)`, except\n * the wiring commands. The env is patched in place before `code` runs, so the\n * collector's own env object (and every scope derived from it) stays the one\n * the source sees. Commands the collector issues itself (`startFlow`'s starting\n * state, the simulator's shutdown) never pass through the source's env.\n */\nfunction recordSourceCommands(\n code: Source.Init,\n calls: Simulation.Call[],\n): Source.Init {\n const record = (first: unknown, data: unknown, name: string): void => {\n if (WIRING_COMMANDS.has(name)) return;\n calls.push({ fn: 'elb', args: [first, data], ts: Date.now() });\n };\n return (context) => {\n const { env } = context;\n env.command = new Proxy(env.command, {\n apply(target, thisArg, args: unknown[]) {\n const [name, data] = args;\n if (typeof name === 'string') record(name, data, name);\n return Reflect.apply(target, thisArg, args);\n },\n });\n env.elb = new Proxy(env.elb, {\n apply(target, thisArg, args: unknown[]) {\n const [first, data] = args;\n // The elb protocol: a `walker ` string is a command (see createElb).\n if (typeof first === 'string' && first.startsWith('walker '))\n record(first, data, first.slice('walker '.length));\n return Reflect.apply(target, thisArg, args);\n },\n });\n return code(context);\n };\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<Simulation.Result> {\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 json: options.json,\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 json: options.json,\n };\n\n const prepared = await prepareFlow(prepareInput);\n // Values of the secrets the flow references: masked in every log line.\n const knownSecrets = collectKnownSecrets(config);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\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 if (options.pageUrl !== undefined && prepared.platform !== 'web')\n throw new Error(PAGE_URL_SCOPE_ERROR);\n const pageUrl =\n prepared.platform === 'web'\n ? resolvePageUrl(input, options.pageUrl)\n : undefined;\n\n return await withFlowContext<Simulation.Result>(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n offline: true,\n pageUrl,\n },\n async (module) => {\n // Look up createTrigger from the lazy __devExports registry: await the\n // thunk to pull the /dev module in, then narrow without a cast.\n const loadDev = module.__devExports?.[sourceConfig!.package!];\n const devModule =\n typeof loadDev === 'function' ? await loadDev() : undefined;\n const { exportName } = resolveExportName(\n prepared.flowSettings,\n 'source',\n options.sourceId,\n );\n const legacyRefusal = legacyExportRefusal(\n devModule,\n module.__packageExports,\n sourceConfig!.package!,\n exportName,\n );\n if (legacyRefusal) throw new Error(legacyRefusal);\n const createTrigger = getCreateTrigger(devModule, exportName);\n if (!createTrigger) {\n throw new Error(\n `Source package \"${sourceConfig!.package}\" has no createTrigger in /dev export` +\n (exportName ? ` for export ${exportName}` : ''),\n );\n }\n\n const flowConfig = module.wireConfig(\n options.data ?? module.__configData ?? undefined,\n );\n applyOverrides(flowConfig, prepared.overrides);\n routeFlowLogs(flowConfig, options, knownSecrets);\n const unmockedStores = await applyStoreMockEnvs(\n flowConfig,\n prepared.flowSettings,\n module.__devExports,\n );\n if (unmockedStores.length > 0)\n logger.debug(\n `Stores without a mock env run as configured: ${unmockedStores.join(', ')}`,\n );\n\n // Only the simulated source starts: another source (the browser\n // source's page view, a CMP) would add events of its own.\n const wiredSources: unknown = flowConfig.sources;\n const wiredSource = isRecord(wiredSources)\n ? wiredSources[options.sourceId]\n : undefined;\n // A copy, so what this run writes to it (env, config) stays here.\n const source: Record<string, unknown> | undefined = isRecord(\n wiredSource,\n )\n ? {\n ...wiredSource,\n ...(isRecord(wiredSource.config)\n ? { config: { ...wiredSource.config } }\n : {}),\n }\n : undefined;\n flowConfig.sources = source ? { [options.sourceId]: source } : {};\n // No destination starts: the captured events stop at the collector.\n if (flowConfig.destinations) flowConfig.destinations = {};\n\n // The walker commands the source issues are its effects: recorded\n // from its own env, on this run's copy of the definition.\n const commandCalls: Simulation.Call[] = [];\n if (source && isSourceInit(source.code))\n source.code = recordSourceCommands(source.code, commandCalls);\n\n // A source whose package declares simulation calls runs on its mock\n // env (e.g. a queue client), and those calls are recorded like a\n // destination's. Other sources keep the simulated world (the JSDOM\n // page for web sources).\n let trackedCalls: Simulation.Call[] = [];\n const devEnv = getDevEnv(devModule, exportName);\n if (source && devEnv?.push && devEnv.simulation?.length) {\n const { wrappedEnv, calls } = wrapEnv({\n ...devEnv.push,\n simulation: devEnv.simulation,\n });\n source.env = {\n ...(isRecord(source.env) ? source.env : {}),\n ...wrappedEnv,\n };\n trackedCalls = calls;\n }\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<{\n event: WalkerOS.DeepPartialEvent;\n timestamp: number;\n }> = [];\n\n flowConfig.hooks = {\n ...((flowConfig.hooks as Record<string, unknown>) || {}),\n prePush: (\n { fn }: { fn: Function },\n event: WalkerOS.DeepPartialEvent,\n ) => {\n captured.push({ event, timestamp: Date.now() });\n return { ok: true }; // Stop propagation — don't call fn\n },\n };\n\n if (options.consent) flowConfig.consent = options.consent;\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 buildSimulationResult({\n step: 'source',\n name: options.sourceId,\n startTime,\n captured,\n // One timeline: the source's commands and its mock-env calls.\n usage: {\n [options.sourceId]: [...commandCalls, ...trackedCalls].sort(\n (a, b) => a.ts - b.ts,\n ),\n },\n });\n },\n (error) =>\n buildSimulationResult({\n step: 'source',\n name: options.sourceId,\n startTime,\n error,\n }),\n );\n } catch (error) {\n return buildSimulationResult({\n step: 'source',\n name: options.sourceId,\n startTime,\n error,\n });\n } finally {\n await prepared.cleanup();\n }\n}\n\n/**\n * Runs a transformer the way the runtime does: through the one chain runner\n * (`runTransformerChain`), starting at the transformer. Its `before` chain\n * (via `runTransformerBefore` inside the runner), its push and its route all\n * run, resolved hop by hop with `{ ingest, event }`. Returns every finished\n * copy; empty when the event was dropped or stopped.\n */\nexport async function runTransformerSimulation(\n collector: Collector.Instance,\n transformerId: string,\n event: WalkerOS.DeepPartialEvent,\n ingest: Ingest,\n): Promise<WalkerOS.DeepPartialEvent[]> {\n const result = await runTransformerChain(\n collector,\n collector.transformers,\n transformerId,\n event,\n ingest,\n undefined,\n `transformer.${transformerId}`,\n );\n return result.copies.map((copy) => copy.event);\n}\n\n/**\n * The ingest a simulated step starts from: the caller's keys, deep-cloned so\n * no nested object is shared between runs, under a fresh runtime `_meta`\n * (a caller-supplied `_meta` never wins).\n */\nfunction simulateIngest(\n stepName: string,\n ingest: Omit<Ingest, '_meta'> | undefined,\n): Ingest {\n return {\n ...(ingest ? structuredClone(ingest) : {}),\n _meta: createIngest(stepName)._meta,\n };\n}\n\nexport interface SimulateTransformerOptions extends SimulateDataOptions {\n /** Log to stderr so stdout carries only the result (`push --json`). */\n json?: boolean;\n transformerId: string;\n bundlePath?: string;\n flow?: string;\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n /**\n * Pipeline context the transformer reads via `ctx.ingest` (e.g. a decoder\n * reads `ingest.url`). Merged onto a fresh ingest so `_meta` is always\n * present; provide only the keys the step reads.\n */\n ingest?: Omit<Ingest, '_meta'>;\n /** The collector's starting consent, handed to `startFlow` as its state. */\n consent?: WalkerOS.Consent;\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 from the target transformer on, exactly as the runtime does\n * (`runTransformerSimulation`).\n *\n * Captured array: one entry per finished copy. When the event was dropped\n * or stopped, a single `null` entry.\n */\nexport async function simulateTransformer(\n configOrPath: string | Flow.Json,\n event: WalkerOS.DeepPartialEvent,\n options: SimulateTransformerOptions,\n): Promise<Simulation.Result> {\n const startTime = Date.now();\n\n // Validate event with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return buildSimulationResult({\n step: 'transformer',\n name: options.transformerId,\n startTime,\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 json: options.json,\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 json: options.json,\n };\n\n const prepared = await prepareFlow(prepareInput);\n // Values of the secrets the flow references: masked in every log line.\n const knownSecrets = collectKnownSecrets(config);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\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<Simulation.Result>(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n offline: true,\n },\n async (module) => {\n const flowConfig = module.wireConfig(\n options.data ?? module.__configData ?? undefined,\n );\n applyOverrides(flowConfig, prepared.overrides);\n routeFlowLogs(flowConfig, options, knownSecrets);\n const unmockedStores = await applyStoreMockEnvs(\n flowConfig,\n prepared.flowSettings,\n module.__devExports,\n );\n if (unmockedStores.length > 0)\n logger.debug(\n `Stores without a mock env run as configured: ${unmockedStores.join(', ')}`,\n );\n\n // Don't initialize sources or destinations during transformer simulation.\n if (flowConfig.sources) flowConfig.sources = {};\n if (flowConfig.destinations) flowConfig.destinations = {};\n if (options.consent) flowConfig.consent = options.consent;\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 = simulateIngest(options.transformerId, options.ingest);\n // Output events only: each entry is a transformer output, or `null`\n // when the event was dropped. `buildSimulationResult` drops null\n // entries so a drop yields `events: []` and a passthrough yields\n // `events: [<event>]`.\n const captured: Array<{\n event: WalkerOS.DeepPartialEvent | null;\n timestamp: number;\n }> = [];\n\n logger.info(`Simulating transformer: ${options.transformerId}`);\n\n // The runtime path: the one chain runner, starting at the\n // transformer (its before chain, its push, its route).\n const outputs = await runTransformerSimulation(\n collector,\n options.transformerId,\n inputEvent,\n ingest,\n );\n if (outputs.length === 0) {\n captured.push({ event: null, timestamp: Date.now() });\n }\n for (const output of outputs) {\n captured.push({ event: output, timestamp: Date.now() });\n }\n\n await collector.command('shutdown');\n\n return buildSimulationResult({\n step: 'transformer',\n name: options.transformerId,\n startTime,\n captured,\n });\n },\n (error) =>\n buildSimulationResult({\n step: 'transformer',\n name: options.transformerId,\n startTime,\n error,\n }),\n );\n } catch (error) {\n return buildSimulationResult({\n step: 'transformer',\n name: options.transformerId,\n startTime,\n error,\n });\n } finally {\n await prepared.cleanup();\n }\n}\n\n/**\n * Runs the collector step the way the runtime does: the runtime's own\n * enrichment (`enrichEvent`), then the collector's own chain\n * (`collector.next`) through `runCollectorNext`, the function\n * `pushToDestinations` calls. Returns every finished copy (one without a\n * fork, one per surviving fork); empty when the chain dropped the event.\n */\nexport async function runCollectorSimulation(\n collector: Collector.Instance,\n event: WalkerOS.DeepPartialEvent,\n ingest: Ingest = createIngest('collector'),\n): Promise<WalkerOS.Event[]> {\n const enriched = enrichEvent(collector, event);\n const result = await runCollectorNext(collector, enriched, { ingest });\n return result.copies.map((copy) => copy.event);\n}\n\nexport interface SimulateCollectorOptions extends SimulateDataOptions {\n /** Log to stderr so stdout carries only the result (`push --json`). */\n json?: boolean;\n collectorName: string;\n bundlePath?: string;\n flow?: string;\n /** `collector.next.TRANSFORMER=VALUE` mocks for the collector's chain. */\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n state?: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n timing?: number; // sets collector.timing, the base from which prepareEvent computes the relative event.timing\n };\n /**\n * Pipeline context the collector's chain (`collector.next`) reads via\n * `ctx.ingest`. Merged onto a fresh ingest so `_meta` is always the\n * runtime's.\n */\n ingest?: Omit<Ingest, '_meta'>;\n}\n\n/**\n * Self-contained collector simulation.\n *\n * Takes a post-next `DeepPartialEvent` and an optional collector-state\n * snapshot, then returns what the runtime hands to the destination fan-out:\n * the enriched event after the collector's own chain (`collector.next`), one\n * entry per finished copy, or a single `null` entry when the chain dropped\n * the event. Runs `runCollectorSimulation`; it does not reimplement the\n * enrichment or the chain.\n */\nexport async function simulateCollector(\n configOrPath: string | Flow.Json,\n event: WalkerOS.DeepPartialEvent,\n options: SimulateCollectorOptions,\n): Promise<Simulation.Result> {\n const startTime = Date.now();\n\n // Validate event with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return buildSimulationResult({\n step: 'collector',\n name: options.collectorName,\n startTime,\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: ['collector.' + options.collectorName],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n }\n : {\n mode: 'build' as const,\n config,\n flow: options.flow,\n simulate: ['collector.' + options.collectorName],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n };\n\n const prepared = await prepareFlow(prepareInput);\n // Values of the secrets the flow references: masked in every log line.\n const knownSecrets = collectKnownSecrets(config);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\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<Simulation.Result>(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n offline: true,\n },\n async (module) => {\n const flowConfig = module.wireConfig(\n options.data ?? module.__configData ?? undefined,\n );\n applyOverrides(flowConfig, prepared.overrides);\n routeFlowLogs(flowConfig, options, knownSecrets);\n const unmockedStores = await applyStoreMockEnvs(\n flowConfig,\n prepared.flowSettings,\n module.__devExports,\n );\n if (unmockedStores.length > 0)\n logger.debug(\n `Stores without a mock env run as configured: ${unmockedStores.join(', ')}`,\n );\n\n // Don't initialize sources or destinations during collector 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\n // Seed collector state from the snapshot. These are plain mutable\n // instance props; pure enrichment needs no `run()`.\n if (options.state) {\n if (options.state.consent !== undefined)\n collector.consent = options.state.consent;\n if (options.state.user !== undefined)\n collector.user = options.state.user;\n if (options.state.globals !== undefined)\n collector.globals = options.state.globals;\n if (options.state.timing !== undefined)\n collector.timing = options.state.timing;\n }\n\n const outputs = await runCollectorSimulation(\n collector,\n event,\n simulateIngest('collector', options.ingest),\n );\n const captured: Array<{\n event: WalkerOS.DeepPartialEvent | null;\n timestamp: number;\n }> =\n outputs.length > 0\n ? outputs.map((output) => ({\n event: output,\n timestamp: Date.now(),\n }))\n : [{ event: null, timestamp: Date.now() }];\n\n await collector.command('shutdown');\n\n return buildSimulationResult({\n step: 'collector',\n name: options.collectorName,\n startTime,\n captured,\n });\n },\n (error) =>\n buildSimulationResult({\n step: 'collector',\n name: options.collectorName,\n startTime,\n error,\n }),\n );\n } catch (error) {\n return buildSimulationResult({\n step: 'collector',\n name: options.collectorName,\n startTime,\n error,\n });\n } finally {\n await prepared.cleanup();\n }\n}\n\nexport interface SimulateDestinationOptions extends SimulateDataOptions {\n /** Log to stderr so stdout carries only the result (`push --json`). */\n json?: boolean;\n destinationId: string;\n bundlePath?: string;\n flow?: string;\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n /**\n * Pipeline context the destination's `before` chain and push read via\n * `ctx.ingest` (e.g. `userAgent` for a conversion API). Merged onto a\n * fresh ingest so `_meta` is always the runtime's.\n */\n ingest?: Omit<Ingest, '_meta'>;\n /**\n * The collector's starting consent: handed to `startFlow` as its initial\n * state, which applies it pre-run as a consent command that only the target\n * (the one registered destination) hears. A `require: [\"consent\"]`\n * destination starts, the consent gate sees it, and a Consent Mode target\n * records its consent update. The event's own consent still applies.\n */\n consent?: WalkerOS.Consent;\n /**\n * Run `collector.command(command, event)` instead of pushing the event: a\n * step example with `command` (e.g. `consent`), whose `in` is the command's\n * data. With `consent`, the starting state applies first, then the command.\n */\n command?: Flow.StepCommand;\n}\n\n/** A consent record: an object of booleans. */\nfunction isConsentRecord(value: unknown): value is WalkerOS.Consent {\n return (\n isRecord(value) &&\n Object.values(value).every((granted) => typeof granted === 'boolean')\n );\n}\n\n/** The `require` entries of a pending destination definition. */\nfunction pendingRequire(definition: unknown): string[] {\n if (!isRecord(definition) || !isRecord(definition.config)) return [];\n const { require } = definition.config;\n return isStringArray(require) ? require : [];\n}\n\n/**\n * Self-contained destination simulation.\n *\n * Takes a DeepPartialEvent, validates it with Zod, loads the flow config,\n * bundles it, then starts the flow with ONLY the target destination (no\n * other destination initializes against its real env) and `consent` as the\n * collector's starting state. It pushes the event through the full pipeline\n * (consent checks, event mapping, createEvent enrichment, before chains), or\n * runs `command` with the event as its data. When nothing was sent, the\n * result's `skipped` says why, from the collector's own records.\n */\nexport async function simulateDestination(\n configOrPath: string | Flow.Json,\n event: WalkerOS.DeepPartialEvent | Record<string, unknown>,\n options: SimulateDestinationOptions,\n): Promise<Simulation.Result> {\n const startTime = Date.now();\n\n // Validate event with Zod. A command's data is not an event.\n const parsed = options.command\n ? undefined\n : schemas.PartialEventSchema.safeParse(event);\n if (parsed && !parsed.success) {\n return buildSimulationResult({\n step: 'destination',\n name: options.destinationId,\n startTime,\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 json: options.json,\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 json: options.json,\n };\n\n const prepared = await prepareFlow(prepareInput);\n // Values of the secrets the flow references: masked in every log line.\n const knownSecrets = collectKnownSecrets(config);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\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<Simulation.Result>(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n offline: true,\n },\n async (module) => {\n const flowConfig = module.wireConfig(\n options.data ?? module.__configData ?? undefined,\n );\n\n // Only the target starts: no source, and no other destination, whose\n // init would run against its real env (a vendor script, an SDK\n // client). A missing target fails here, naming the flow's\n // destinations. The target's config is a copy, so what this run\n // writes to it (env, require, overrides) stays in this run.\n const wiredDestinations: unknown = flowConfig.destinations;\n const wiredTarget = isRecord(wiredDestinations)\n ? wiredDestinations[options.destinationId]\n : undefined;\n if (!isRecord(wiredTarget)) {\n const available = isRecord(wiredDestinations)\n ? Object.keys(wiredDestinations).join(', ')\n : '';\n throw new Error(\n `Destination \"${options.destinationId}\" not found in collector. ` +\n `Available: ${available || 'none'}`,\n );\n }\n const target: Record<string, unknown> = {\n ...wiredTarget,\n config: isRecord(wiredTarget.config) ? { ...wiredTarget.config } : {},\n };\n flowConfig.destinations = { [options.destinationId]: target };\n if (flowConfig.sources) flowConfig.sources = {};\n // The starting consent is initial collector state: startFlow applies\n // it pre-run as a consent command, heard only by the target.\n if (options.consent) flowConfig.consent = options.consent;\n\n applyOverrides(flowConfig, prepared.overrides);\n routeFlowLogs(flowConfig, options, knownSecrets);\n const unmockedStores = await applyStoreMockEnvs(\n flowConfig,\n prepared.flowSettings,\n module.__devExports,\n );\n if (unmockedStores.length > 0)\n logger.debug(\n `Stores without a mock env run as configured: ${unmockedStores.join(', ')}`,\n );\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 // Await the lazy __devExports thunk, then narrow without a cast.\n const loadDev = module.__devExports?.[destPkg.package];\n const devModule =\n typeof loadDev === 'function' ? await loadDev() : undefined;\n const { exportName } = resolveExportName(\n prepared.flowSettings,\n 'destination',\n options.destinationId,\n );\n const legacyRefusal = legacyExportRefusal(\n devModule,\n module.__packageExports,\n destPkg.package,\n exportName,\n );\n if (legacyRefusal) throw new Error(legacyRefusal);\n const devEnv = getDevEnv(devModule, exportName);\n\n // Without a mock env the destination would run against its real\n // vendor client. Refuse before startFlow so init never runs.\n if (!devEnv?.push) {\n throw new Error(\n `No mock env for ${destPkg.package} export ${exportName ?? 'default'}: simulate would call the real vendor. Add examples.env.push to the package's dev examples.`,\n );\n }\n\n const destConfig = target.config;\n if (isRecord(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 (isRecord(destConfig)) destConfig.env = wrappedEnv;\n trackedCalls = calls;\n }\n }\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 // Capture the matched mapping rule key from the runtime's own\n // FlowState emissions: the destination push site emits per-event\n // records carrying the mappingKey that processEventMapping computed.\n // Observing the wired execution keeps a single rule-matching\n // authority and automatically reflects injected data payloads.\n let mappingKey: string | undefined;\n const targetStepId = stepId('destination', options.destinationId);\n // The in, out, and error phases can all carry the key, so capture on\n // presence rather than pinning a phase: a throwing destination still\n // reports which rule matched.\n // A failed init or push of the target is recorded as its error\n // phase; the result carries it so the simulation reports failure.\n let stepError: string | undefined;\n // The consent gate's own record of a skipped event: what the\n // destination requires and the collector consent at that hop.\n let consentSkip:\n | { required?: WalkerOS.Consent; consent?: WalkerOS.Consent }\n | undefined;\n let delivered = false;\n const captureMappingKey = (state: FlowState): void => {\n if (state.stepId !== targetStepId) return;\n if (state.mappingKey) mappingKey = state.mappingKey;\n if (state.phase === 'error' && state.error && stepError === undefined)\n stepError = state.error.message;\n if (state.phase === 'out') delivered = true;\n if (state.phase === 'skip' && state.skipReason === 'consent') {\n const required = state.meta?.required;\n consentSkip = {\n ...(isConsentRecord(required) ? { required } : {}),\n ...(state.consent ? { consent: state.consent } : {}),\n };\n }\n };\n // Guarded: a prebuilt bundle may carry a collector without an\n // observer channel; degrade to an undefined key instead of throwing.\n if (collector.observers instanceof Set) {\n collector.observers.add(captureMappingKey);\n }\n\n if (options.command) {\n // A command example: its calls (e.g. gtag consent update) are the\n // output, recorded as they happen.\n await collector.command(options.command, event);\n } else {\n // Full pipeline: consent, mapping, enrichment, before chains.\n await collector.push(event, {\n include: [options.destinationId],\n ingest: simulateIngest(options.destinationId, options.ingest),\n });\n }\n\n // Why nothing was sent: still waiting for its require, or skipped\n // at the consent gate (queued with `queue: true`).\n const pending = collector.pending.destinations[options.destinationId];\n let skipped: Simulation.Skipped | undefined;\n if (pending) {\n skipped = { reason: 'pending', require: pendingRequire(pending) };\n } else if (consentSkip && !delivered) {\n const eventConsent =\n 'consent' in event && isConsentRecord(event.consent)\n ? event.consent\n : {};\n skipped = {\n reason: 'consent',\n ...(consentSkip.required ? { required: consentSkip.required } : {}),\n granted: { ...consentSkip.consent, ...eventConsent },\n };\n }\n\n await collector.command('shutdown');\n\n return buildSimulationResult({\n step: 'destination',\n name: options.destinationId,\n startTime,\n usage: trackedCalls.length\n ? { [options.destinationId]: trackedCalls }\n : undefined,\n mappingKey,\n skipped,\n ...(stepError !== undefined ? { error: stepError } : {}),\n });\n },\n (error) =>\n buildSimulationResult({\n step: 'destination',\n name: options.destinationId,\n startTime,\n error,\n }),\n );\n } catch (error) {\n return buildSimulationResult({\n step: 'destination',\n name: options.destinationId,\n startTime,\n error,\n });\n } finally {\n await prepared.cleanup();\n }\n}\n\n// Export types\nexport type { PushCommandOptions, PushResult };\n","/**\n * The shared secret redactor lives in `@walkeros/core/node` so the CLI logger,\n * the runtime logger and the runtime heartbeat share one set of patterns.\n */\nexport { scrubJson, scrubSecrets, redactLine } from '@walkeros/core/node';\n","/**\n * The simulate output formatter lives in `@walkeros/core/node` so the CLI\n * `push` output and the MCP `flow_simulate` result print values the same way.\n */\nexport { toPrintable } from '@walkeros/core/node';\n","import type { Flow } from '@walkeros/core';\nimport { parseComponentRef } from '../../core/parse-component-ref.js';\n\nconst STEP_KINDS = [\n 'source',\n 'destination',\n 'transformer',\n 'collector',\n] 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 * - `--mock destination.NAME.before.T=VALUE` mocks transformer T on that chain\n * - `--mock collector.next.T=VALUE` mocks transformer T in `collector.next`\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 === 'collector') {\n // Collector enrichment carries no per-step overrides.\n continue;\n } else 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 === 'collector' && !parsed.chainType) {\n throw new Error(\n `Use --mock collector.next.TRANSFORMER=VALUE to mock a step of the collector's chain`,\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, or\n // collector.next.bot for the collector's own chain.\n const chainPath =\n parsed.type === 'collector'\n ? `collector.${parsed.chainType}`\n : `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' | 'collector';\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 * and the collector's chain: `collector.next.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 // The collector's own chain: collector.next.bot\n if (prefix === 'collector' && rest.length > 0) {\n if (name !== 'next' || rest.length !== 1 || !rest[0]) {\n throw new Error(\n `Invalid step format: \"${step}\". Expected \"collector.next.TRANSFORMER\"`,\n );\n }\n return {\n type: prefix,\n name,\n chainType: 'next',\n transformerId: rest[0],\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 {\n JSDOM,\n VirtualConsole,\n requestInterceptor,\n type ResourcesOptions,\n} 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 and XHR are stubbed, recording 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 /** Web only: the URL of the simulated page. Defaults to `http://localhost`. */\n pageUrl?: string;\n /**\n * Web only, for simulate runs: the page answers every resource request (a\n * vendor loader's `<script src>`, an iframe, a stylesheet) locally instead\n * of fetching it. A real push loads resources as a browser would.\n */\n offline?: boolean;\n}\n\n/**\n * JSDOM window members a web step reaches as bare globals (a CMP trigger's\n * `new CustomEvent`, a session source's `localStorage`, an `instanceof\n * Element` check). Exposed for the run, so events are created in the page's\n * own realm and its nodes pass type checks as in a browser, and restored after.\n * Vendor SDKs read some at import, before any step runs: mixpanel-browser\n * probes `new XMLHttpRequest()`, posthog-js reads `location` and adopts\n * `self`. `XMLHttpRequest` is the recording one of `applyNetworkPolyfills`.\n */\nconst DOM_GLOBALS = [\n 'CustomEvent',\n 'Event',\n 'localStorage',\n 'sessionStorage',\n 'Node',\n 'Element',\n 'HTMLElement',\n 'Document',\n 'ShadowRoot',\n 'XMLHttpRequest',\n 'location',\n 'self',\n] as const;\n\n/**\n * Defines each DOM global from the JSDOM window and returns a restore that\n * puts every previous property descriptor back (deleting the ones that were\n * absent). Descriptors, not values: reading Node's own `localStorage` getter\n * would run it.\n */\nexport function exposeDomGlobals(domWindow: object): () => void {\n const saved = DOM_GLOBALS.map(\n (name) =>\n [name, Object.getOwnPropertyDescriptor(globalThis, name)] as const,\n );\n // Read every value before defining any: a getter that throws (JSDOM's\n // storage on an opaque origin) leaves the globals untouched.\n const values = DOM_GLOBALS.map(\n (name) => [name, Reflect.get(domWindow, name)] as const,\n );\n for (const [name, value] of values) {\n Object.defineProperty(globalThis, name, {\n value,\n configurable: true,\n writable: true,\n });\n }\n return () => {\n for (const [name, descriptor] of saved) {\n if (descriptor) Object.defineProperty(globalThis, name, descriptor);\n else Reflect.deleteProperty(globalThis, name);\n }\n };\n}\n\n/**\n * Loosely typed module shape from a dynamically imported ESM bundle.\n * The bundle has no compile-time types, so we use permissive signatures\n * and let the callbacks do runtime validation (e.g., \"collector missing push\").\n */\nexport interface FlowModule {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wireConfig: (data?: unknown) => any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n startFlow: (config: unknown) => Promise<any>;\n __configData?: unknown;\n /**\n * Registry of lazy /dev loaders, one per package that exposes a `./dev`\n * export. Each entry is a thunk that dynamically imports the dev module on\n * demand, so the deploy wrap can DCE the unreferenced /dev graph to zero\n * bytes. Read sites must call and await the thunk, then narrow the result.\n */\n __devExports?: Record<string, () => Promise<unknown>>;\n /**\n * Export names each package declares in `walkerOS.exports`, read at build\n * time from the copy that was bundled. Absent in bundles built before it.\n */\n __packageExports?: Record<string, string[]>;\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 */\n/**\n * Default error mapper used by real-push call sites: produces a `PushResult`\n * error envelope. Simulate call sites override this with a mapper that returns\n * a `Simulation.Result` instead.\n */\nfunction defaultPushError(error: unknown, startTime: number): PushResult {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n}\n\n// Real-push call sites: default `PushResult`, no error mapper needed.\nexport function withFlowContext(\n options: FlowContextOptions,\n fn: (module: FlowModule) => Promise<PushResult>,\n): Promise<PushResult>;\n// Simulate call sites: arbitrary result type with an explicit error mapper.\nexport function withFlowContext<T>(\n options: FlowContextOptions,\n fn: (module: FlowModule) => Promise<T>,\n onError: (error: unknown, startTime: number) => T,\n): Promise<T>;\nexport async function withFlowContext<T>(\n options: FlowContextOptions,\n fn: (module: FlowModule) => Promise<T | PushResult>,\n onError?: (error: unknown, startTime: number) => T,\n): Promise<T | PushResult> {\n const {\n esmPath,\n platform,\n logger,\n snapshotCode,\n timeout,\n networkCalls,\n asyncDrain,\n drainPump,\n pageUrl,\n offline,\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 let restoreDomGlobals: (() => void) | 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: pageUrl ?? 'http://localhost',\n runScripts: 'dangerously',\n resources: offline ? offlineResources() : '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 // Inside the try, so a failure here still restores window, document\n // and navigator in the finally.\n if (dom) restoreDomGlobals = exposeDomGlobals(dom.window);\n\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 //\n // A node skeleton keeps `@walkeros/*` step packages as EXTERNAL bare\n // imports. Node resolves those bare specifiers by walking `node_modules`\n // up from the IMPORTING FILE's directory (`esmPath`), not from cwd, and\n // the `?t=` cache-buster does not affect resolution. So externals load\n // from a `node_modules/` co-located next to `esmPath`. Callers that point\n // `esmPath` at a prebuilt skeleton MUST place the traced sibling\n // `node_modules/` in the same directory.\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 __packageExports: module.__packageExports,\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: T | 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 (onError ?? defaultPushError)(error, startTime);\n } finally {\n if (timerControl) timerControl.restore();\n if (savedFetch !== undefined) {\n cleanupNetworkPolyfills(savedFetch);\n }\n if (restoreDomGlobals) restoreDomGlobals();\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, sendBeacon and XMLHttpRequest polyfills on the JSDOM\n * window. All 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 // JSDOM's own XMLHttpRequest sends for real, a synchronous one from a\n // worker process. Like fetch and sendBeacon above, the stand-in records\n // instead, on a real web push too: the page's requests are reported, never\n // sent. The stand-in is not the full interface, so it is defined rather\n // than assigned.\n Object.defineProperty(dom.window, 'XMLHttpRequest', {\n value: createRecordingXhr(dom, networkCalls),\n configurable: true,\n writable: true,\n });\n}\n\ntype XhrHandler = ((event: Event) => void) | null;\n\n/**\n * An XMLHttpRequest whose `send` records the call and completes it with an\n * empty 200, like the fetch polyfill. It never opens a connection. `abort`\n * after `send` ends the request with abort instead, as the spec's does.\n */\nfunction createRecordingXhr(dom: JSDOM, networkCalls: NetworkCall[]) {\n const PageEvent = dom.window.Event;\n return class XMLHttpRequest extends dom.window.EventTarget {\n static readonly UNSENT = 0;\n static readonly OPENED = 1;\n static readonly HEADERS_RECEIVED = 2;\n static readonly LOADING = 3;\n static readonly DONE = 4;\n readonly UNSENT = 0;\n readonly OPENED = 1;\n readonly HEADERS_RECEIVED = 2;\n readonly LOADING = 3;\n readonly DONE = 4;\n readyState = 0;\n status = 0;\n statusText = '';\n responseType = '';\n response = '';\n responseText = '';\n responseURL = '';\n timeout = 0;\n withCredentials = false;\n onreadystatechange: XhrHandler = null;\n onload: XhrHandler = null;\n onabort: XhrHandler = null;\n onloadend: XhrHandler = null;\n #method = 'GET';\n #url = '';\n #async = true;\n #headers: Record<string, string> = {};\n #pending = false;\n\n open(method: string, url: string | URL, async = true): void {\n this.#method = method.toUpperCase();\n this.#url = String(url);\n this.#async = async;\n this.#headers = {};\n this.#pending = false;\n this.readyState = 1;\n }\n\n setRequestHeader(name: string, value: string): void {\n this.#headers[name] = value;\n }\n\n getResponseHeader(): string | null {\n return null;\n }\n\n getAllResponseHeaders(): string {\n return '';\n }\n\n overrideMimeType(): void {}\n\n abort(): void {\n const pending = this.#pending;\n this.#pending = false;\n if (!pending && this.readyState !== 4) return;\n // Ends as a network error, then back to UNSENT: with events only while\n // the request is pending, silently once it is done.\n this.status = 0;\n this.statusText = '';\n if (pending) this.#finish('abort', this.onabort);\n this.readyState = 0;\n }\n\n send(body?: unknown): void {\n networkCalls.push({\n type: 'xhr',\n url: this.#url,\n method: this.#method,\n body: body !== undefined && body !== null ? String(body) : null,\n headers: { ...this.#headers },\n timestamp: Date.now(),\n });\n this.#pending = true;\n if (this.#async) queueMicrotask(() => this.#complete());\n else this.#complete();\n }\n\n #complete(): void {\n if (!this.#pending) return;\n this.#pending = false;\n this.status = 200;\n this.statusText = 'OK';\n this.responseURL = this.#url;\n this.#finish('load', this.onload);\n }\n\n #finish(outcome: 'load' | 'abort', onOutcome: XhrHandler): void {\n this.readyState = 4;\n const handlers: Array<[string, XhrHandler]> = [\n ['readystatechange', this.onreadystatechange],\n [outcome, onOutcome],\n ['loadend', this.onloadend],\n ];\n for (const [type, handler] of handlers) {\n const event = new PageEvent(type);\n this.dispatchEvent(event);\n handler?.call(this, event);\n }\n }\n };\n}\n\n/**\n * Resource loading of a simulated page: every request (a vendor loader's\n * script, an iframe, a stylesheet) is answered with an empty 200 before any\n * dispatcher runs, so none leaves the process.\n */\nfunction offlineResources(): ResourcesOptions {\n return {\n interceptors: [requestInterceptor(() => new Response('', { status: 200 }))],\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 type { Simulation, WalkerOS } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/utils.js';\n\n/**\n * Captured event entry produced by the simulate functions. The event may be\n * `null`/`undefined` when a transformer drops the event; those entries are\n * filtered out of the final `events` array.\n */\ninterface CapturedEntry {\n event: WalkerOS.DeepPartialEvent | null | undefined;\n timestamp: number;\n}\n\n/** Tracked env call recorded during destination simulation. */\ninterface TrackedCall {\n fn: string;\n args: unknown[];\n ts: number;\n}\n\nexport interface BuildSimulationResultArgs {\n step: Simulation.Result['step'];\n name: string;\n startTime: number;\n captured?: CapturedEntry[];\n usage?: Record<string, TrackedCall[]>;\n /** Entity-action key of the matched mapping rule (destination simulations). */\n mappingKey?: string;\n /** Why a destination sent nothing (destination simulations). */\n skipped?: Simulation.Skipped;\n error?: unknown;\n}\n\n/** Type guard that narrows a captured entry to a non-null event. */\nfunction hasEvent(\n entry: CapturedEntry,\n): entry is { event: WalkerOS.DeepPartialEvent; timestamp: number } {\n return entry.event != null;\n}\n\n/** Normalize an unknown error into an `Error` instance. */\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(getErrorMessage(error));\n}\n\n/**\n * Assemble a core `Simulation.Result` from the raw outputs of the CLI simulate\n * functions. Pure: maps captured entries to output events (dropping dropped\n * events), flattens per-destination tracked calls into a single `calls` array,\n * and computes the elapsed duration.\n */\nexport function buildSimulationResult(\n args: BuildSimulationResultArgs,\n): Simulation.Result {\n const { step, name, startTime, captured, usage, mappingKey, skipped, error } =\n args;\n\n const events: WalkerOS.DeepPartialEvent[] = (captured ?? [])\n .filter(hasEvent)\n .map((entry) => entry.event);\n\n const calls: Simulation.Call[] = usage\n ? Object.values(usage)\n .flat()\n .map((call) => ({ fn: call.fn, args: call.args, ts: call.ts }))\n : [];\n\n return {\n step,\n name,\n events,\n calls,\n duration: Date.now() - startTime,\n ...(mappingKey !== undefined ? { mappingKey } : {}),\n ...(skipped !== undefined ? { skipped } : {}),\n ...(error !== undefined ? { error: toError(error) } : {}),\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 { collectKnownSecrets } from '../../core/known-secrets.js';\nimport { tmpRunDir } from '../../core/tmp-names.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 /** Log to stderr so stdout carries only the result. */\n json?: 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 /** Log to stderr so stdout carries only the result. */\n json?: 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 stderr: input.json,\n knownSecrets: collectKnownSecrets(input.config),\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 = await tmpRunDir('push');\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 { REF_SECRET } from '@walkeros/core';\nimport type { Flow } from '@walkeros/core';\n\n/**\n * The values of every `$secret.NAME` the flow references, read from `env`.\n * Names that are unset or empty there are ignored. Hand the result to\n * `scrubSecrets(line, { known })` or the logger's `knownSecrets` so a secret\n * value is masked whatever its shape.\n */\nexport function collectKnownSecrets(\n flow: Flow.Json,\n env: NodeJS.ProcessEnv = process.env,\n): string[] {\n const names = new Set<string>();\n collectSecretNames(flow, names);\n const values = new Set<string>();\n for (const name of names) {\n const value = env[name];\n if (value) values.add(value);\n }\n return [...values];\n}\n\nfunction collectSecretNames(value: unknown, names: Set<string>): void {\n if (typeof value === 'string') {\n const match = value.match(REF_SECRET);\n if (match) names.add(match[1]);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) collectSecretNames(item, names);\n return;\n }\n if (value && typeof value === 'object') {\n for (const item of Object.values(value)) collectSecretNames(item, names);\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 | {\n kind: 'source' | 'destination' | 'transformer' | 'collector';\n ids: string[];\n };\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 (\n (type === 'source' || type === 'transformer' || type === 'collector') &&\n ids.length > 1\n ) {\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 kind: 'none' | 'source' | 'destination' | 'transformer' | 'collector';\n ids: string[];\n}\n\n/**\n * Adapter between `planSimulate` and the dispatcher in `index.ts`.\n * Carries forward `planSimulate`'s `kind` discriminator unchanged, kept\n * 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 { kind: plan.kind, ids: plan.ids };\n}\n","import {\n PAGE_URL_SCOPE_ERROR,\n isFlowJson,\n push,\n simulateCollector,\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, loadJsonConfig } from '../../config/index.js';\nimport { collectKnownSecrets } from '../../core/known-secrets.js';\nimport { isObject } from '@walkeros/core';\nimport type { Flow, Ingest, Simulation, WalkerOS } from '@walkeros/core';\nimport type { PushCommandOptions, PushResult } from './types.js';\n\n/**\n * Adapt a step `Simulation.Result` into the CLI's `PushResult` envelope. The\n * `walkeros push --simulate` command path formats and exits on a `PushResult`;\n * the programmatic simulate functions return the unified `Simulation.Result`.\n * This boundary keeps the command behavior identical while the functions\n * expose the richer shape to library consumers.\n */\nfunction simulationToPushResult(result: Simulation.Result): PushResult {\n return {\n success: !result.error,\n duration: result.duration,\n ...(result.error ? { error: result.error.message } : {}),\n simulations: [result],\n };\n}\n\nconst INGEST_SCOPE_ERROR =\n '--ingest applies to transformer, collector and destination simulation only';\n\nconst CONSENT_SCOPE_ERROR =\n \"--consent sets the collector's starting consent for a simulation; a real push uses the flow's own consent.\";\n\nconst CONSENT_SHAPE_ERROR = '--consent must be a JSON object of booleans';\n\nconst COMMAND_SCOPE_ERROR = '--command applies to destination simulation only.';\n\nfunction isConsent(value: unknown): value is WalkerOS.Consent {\n return (\n isObject(value) &&\n Object.values(value).every((granted) => typeof granted === 'boolean')\n );\n}\n\n/**\n * Resolve the collector's starting consent: the raw `--consent` source (JSON\n * string, file path or URL) wins over a programmatic `consent`.\n */\nasync function resolveConsent(\n options: PushCommandOptions,\n): Promise<WalkerOS.Consent | undefined> {\n if (options.consentSource === undefined) return options.consent;\n const loaded: unknown = await loadJsonFromSource(options.consentSource, {\n name: 'consent',\n });\n if (!isConsent(loaded)) throw new Error(CONSENT_SHAPE_ERROR);\n return loaded;\n}\n\n/**\n * The config a run reads, loaded ONCE: a flow config is handed on as the\n * object (simulate) or as `raw` (real push), so a URL is fetched once and the\n * secrets masked are those of the flow that runs. Anything else (a prebuilt\n * bundle, an unreadable path) keeps the path for the step to read and\n * report.\n */\nasync function loadFlowJson(config: string): Promise<Flow.Json | undefined> {\n try {\n const loaded: unknown = await loadJsonConfig(config);\n return isFlowJson(loaded) ? loaded : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve the pipeline context a simulated step reads: the raw `--ingest`\n * source (JSON string, file path or URL) wins over a programmatic `ingest`.\n */\nasync function resolveIngest(\n options: PushCommandOptions,\n): Promise<Omit<Ingest, '_meta'> | undefined> {\n if (options.ingestSource === undefined) return options.ingest;\n const loaded: unknown = await loadJsonFromSource(options.ingestSource, {\n name: 'ingest',\n });\n if (!isObject(loaded)) throw new Error('--ingest must be a JSON object');\n return loaded;\n}\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 return (await runPushCommandWithSecrets(options)).result;\n}\n\n/**\n * `runPushCommand`, plus the values of the secrets the flow config references\n * (see `collectKnownSecrets`), so `pushCommand` can mask them in its output.\n */\nexport async function runPushCommandWithSecrets(\n options: PushCommandOptions,\n): Promise<{ result: PushResult; knownSecrets: string[] }> {\n const loaded: { knownSecrets: string[] } = { knownSecrets: [] };\n const result = await runPush(options, loaded);\n return { result, knownSecrets: loaded.knownSecrets };\n}\n\nasync function runPush(\n options: PushCommandOptions,\n loaded: { knownSecrets: string[] },\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 configPath: string;\n if (isStdinPiped() && !options.config) {\n configPath = await readStdinToTempFile('push');\n } else {\n configPath = options.config || 'bundle.config.json';\n }\n const flowJson = await loadFlowJson(configPath);\n const config: string | Flow.Json = flowJson ?? configPath;\n const knownSecrets = flowJson ? collectKnownSecrets(flowJson) : [];\n loaded.knownSecrets = knownSecrets;\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. Resolve --ingest. Only a simulated transformer, collector or\n // destination has a pipeline context to seed.\n const ingest = await resolveIngest(options);\n if (ingest && (plan.kind === 'none' || plan.kind === 'source'))\n throw new Error(INGEST_SCOPE_ERROR);\n\n // 5. Scope checks of the other simulate flags, then --consent: the\n // collector's starting state of a simulation (for a source, the state its\n // trigger's flow starts from). A real push runs the flow's own consent.\n if (options.command !== undefined && plan.kind !== 'destination')\n throw new Error(COMMAND_SCOPE_ERROR);\n if (options.pageUrl !== undefined && plan.kind !== 'source')\n throw new Error(PAGE_URL_SCOPE_ERROR);\n const consent = await resolveConsent(options);\n if (consent && plan.kind === 'none') throw new Error(CONSENT_SCOPE_ERROR);\n\n // 6. Route to the correct typed function based on the plan.\n let result: PushResult;\n switch (plan.kind) {\n case 'none':\n result = await push(configPath, resolvedEvent, {\n raw: flowJson,\n knownSecrets,\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 = simulationToPushResult(\n await simulateSource(config, resolvedEvent, {\n sourceId: plan.ids[0],\n flow: options.flow,\n pageUrl: options.pageUrl,\n consent,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n snapshot: options.snapshot,\n }),\n );\n break;\n\n case 'transformer':\n result = simulationToPushResult(\n await simulateTransformer(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n transformerId: plan.ids[0],\n flow: options.flow,\n mock: options.mock,\n ingest,\n consent,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n snapshot: options.snapshot,\n },\n ),\n );\n break;\n\n case 'collector':\n result = simulationToPushResult(\n await simulateCollector(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n collectorName: plan.ids[0],\n flow: options.flow,\n mock: options.mock,\n ingest,\n state: consent ? { consent } : undefined,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n snapshot: options.snapshot,\n },\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 ingest,\n consent,\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` that keeps every per-destination result. Stops on the\n * first failure and returns a structured error referencing the failed id.\n */\nasync function runDestinationSimulationLoop(\n config: string | Flow.Json,\n event: WalkerOS.DeepPartialEvent,\n destinationIds: string[],\n options: PushCommandOptions,\n ingest: Omit<Ingest, '_meta'> | undefined,\n consent: WalkerOS.Consent | undefined,\n): Promise<PushResult> {\n const startTime = Date.now();\n const simulations: Simulation.Result[] = [];\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 ingest,\n consent,\n command: options.command,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n snapshot: options.snapshot,\n });\n simulations.push(r);\n if (r.error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: `simulate destination.${destinationId}: ${r.error.message}`,\n simulations,\n };\n }\n }\n\n return {\n success: true,\n duration: Date.now() - startTime,\n simulations,\n };\n}\n","function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\n/**\n * Selects the dev examples of one export from a package's awaited `/dev`\n * module.\n *\n * A package with several exports (`walkerOS.exports` in its package.json)\n * ships `exportExamples`, a map from export name to that export's examples,\n * the default export included. A package with one export ships only\n * `examples`.\n *\n * - Map present, export named: `exportExamples[exportName]`. A name missing\n * from the map resolves to `undefined`, never to another export's examples.\n * - Map present, no export name (the step uses the default export):\n * `examples`, which by convention holds the default export's examples.\n * - No map: `examples`.\n *\n * `exportName` comes from `resolveExportName` (step `import`, else\n * `bundle.packages[pkg].imports[0]`, else default).\n */\nexport function selectDevExamples(\n devModule: unknown,\n exportName: string | undefined,\n): Record<string, unknown> | undefined {\n if (!isRecord(devModule)) return undefined;\n\n const map = devModule.exportExamples;\n if (isRecord(map) && exportName !== undefined) {\n const selected = map[exportName];\n return isRecord(selected) ? selected : undefined;\n }\n\n const examples = devModule.examples;\n return isRecord(examples) ? examples : undefined;\n}\n\n/**\n * A package version from before export-keyed examples ships only\n * `examples` (the default export's), even when it declares several\n * exports. For a step naming an export, those examples may belong to\n * another export, so simulate must refuse instead of running that export's\n * mock (or none) against the real vendor. Returns the refusal message, or\n * `undefined` when the examples can be trusted.\n *\n * `packageExports` is the bundle's `__packageExports` (declared exports per\n * package, read at build time from the bundled copy). A bundle without it\n * (built before it existed) cannot tell single- from multi-export packages,\n * so a step naming an export without a map is refused.\n */\nexport function legacyExportRefusal(\n devModule: unknown,\n packageExports: Record<string, string[]> | undefined,\n packageName: string,\n exportName: string | undefined,\n): string | undefined {\n if (exportName === undefined) return undefined;\n if (isRecord(devModule) && isRecord(devModule.exportExamples))\n return undefined;\n if (packageExports) {\n const declared = packageExports[packageName];\n if (!declared || declared.length <= 1) return undefined;\n }\n return `No mock env for ${packageName} export ${exportName}: this package version predates export-keyed examples; use a version with exportExamples or a local path.`;\n}\n","/**\n * Shared resolver for the export name to import from a flow component's\n * package.\n *\n * Both `walkeros bundle` and `walkeros setup` need to know which named export\n * (or default) to pull off a package referenced by a flow component. The\n * precedence chain is:\n *\n * 1. `flow.<kind>.<id>.import` if set (named export selector at the step).\n * 2. `flow.config.bundle.packages[<package>].imports[0]` if set.\n * 3. Otherwise undefined; the caller falls back to the package's `default`\n * export.\n *\n * This lives in `cli/src/core/` so both `commands/bundle/*` and\n * `commands/setup/*` import the same function. Duplicating the chain is how\n * setup ended up out of sync with bundle (Bug F: `setup destination.pubsub`\n * routed through BigQuery's setup because it ignored the `code` field and\n * always grabbed `mod.default`).\n */\n\nimport type { Flow, StepType } from '@walkeros/core';\n\nexport type ComponentKind = StepType;\n\nexport type ResolveSource = 'import' | 'imports' | 'default';\n\nexport interface ResolvedExportName {\n /**\n * The named export to pull off the imported module, or `undefined` to\n * indicate the caller should use the package's `default` export.\n */\n exportName: string | undefined;\n /** Which precedence step produced the result (useful for diagnostics). */\n source: ResolveSource;\n}\n\ninterface FlowStepView {\n package?: string;\n import?: string;\n}\n\nfunction getStep(\n flow: Flow,\n kind: ComponentKind,\n id: string,\n): FlowStepView | undefined {\n switch (kind) {\n case 'source':\n return flow.sources?.[id];\n case 'transformer':\n return flow.transformers?.[id];\n case 'destination':\n return flow.destinations?.[id];\n case 'store':\n return flow.stores?.[id];\n }\n}\n\nfunction getBundlePackages(\n flow: Flow,\n): Record<string, Flow.BundlePackage> | undefined {\n return flow.config?.bundle?.packages;\n}\n\n/**\n * Read the first entry of `bundle.packages[<package>].imports` if it is a\n * non-empty string. Returns `undefined` otherwise.\n */\nfunction readFirstImport(\n packages: Record<string, Flow.BundlePackage> | undefined,\n packageName: string | undefined,\n): string | undefined {\n if (!packages || !packageName) return undefined;\n const pkg = packages[packageName];\n if (!pkg || !pkg.imports || pkg.imports.length === 0) return undefined;\n const first = pkg.imports[0];\n return typeof first === 'string' && first.length > 0 ? first : undefined;\n}\n\n/**\n * Resolve the export name to import for a flow component's package.\n *\n * See module docs for the precedence chain. Inline code (`code` is an object)\n * doesn't enter this resolver at all — setup rejects inline code at a higher\n * layer.\n */\nexport function resolveExportName(\n flow: Flow,\n kind: ComponentKind,\n id: string,\n): ResolvedExportName {\n const step = getStep(flow, kind, id);\n if (!step) return { exportName: undefined, source: 'default' };\n\n const packageName = step.package;\n const importName = step.import;\n\n // 1. Explicit `import` field on the step wins.\n if (typeof importName === 'string' && importName.length > 0) {\n return { exportName: importName, source: 'import' };\n }\n\n // 2. Fallback to bundle.packages[pkg].imports[0].\n const firstImport = readFirstImport(getBundlePackages(flow), packageName);\n if (firstImport) {\n return { exportName: firstImport, source: 'imports' };\n }\n\n // 3. Default export.\n return { exportName: undefined, source: 'default' };\n}\n","// walkerOS/packages/cli/src/commands/validate/index.ts\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { isObject } from '@walkeros/core';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n isStdinPiped,\n readStdin,\n writeResult,\n} from '../../core/index.js';\nimport { loadJsonConfig } from '../../config/index.js';\nimport {\n validateContract,\n validateEvent,\n validateMapping,\n} from './validators/index.js';\nimport { validateEntry } from './validators/entry.js';\nimport { isFlowJson } from './scope.js';\nimport { validateFlowWithPackages } from './validators/flow.js';\nimport type { ValidateOptions } from '../../schemas/validate.js';\nimport {\n USAGE_CODES,\n type ValidateCheck,\n type ValidateCommandOptions,\n type ValidateResult,\n type ValidationError,\n type ValidationType,\n} from './types.js';\n\n/**\n * Options that do not apply to the validation type: `--path` and `--flow`\n * address flow files only, `--offline` removes the package settings check\n * of a whole-file flow run. Never ignored silently (OPTION_NOT_APPLICABLE).\n */\nfunction inapplicableOptions(\n type: ValidationType,\n options: ValidateOptions,\n): ValidationError[] {\n const errors: ValidationError[] = [];\n if (options.offline === true && (type !== 'flow' || options.path)) {\n errors.push({\n path: 'options.offline',\n message:\n type === 'flow'\n ? '--offline removes the package settings check, which is all --path checks; drop one of them'\n : `--offline applies to a whole flow file and does not apply to -t ${type}`,\n code: 'OPTION_NOT_APPLICABLE',\n });\n }\n if (type === 'flow') return errors;\n if (options.path !== undefined) {\n errors.push({\n path: 'options.path',\n message: `--path addresses an entry in a flow file and does not apply to -t ${type}`,\n code: 'OPTION_NOT_APPLICABLE',\n });\n }\n if (options.flow !== undefined) {\n errors.push({\n path: 'options.flow',\n message: `--flow names a flow in a flow file and does not apply to -t ${type}`,\n code: 'OPTION_NOT_APPLICABLE',\n });\n }\n return errors;\n}\n\n/**\n * `-t contract` on a flow file validates its `contract` section, exactly as\n * on the section alone (M-dispatch).\n */\nfunction validateContractInput(input: unknown): ValidateResult {\n if (!isFlowJson(input)) return validateContract(input);\n const contract = isObject(input) ? input.contract : undefined;\n if (contract === undefined) {\n return {\n valid: false,\n type: 'contract',\n errors: [\n {\n path: 'contract',\n message: 'The flow file has no contract section to validate',\n code: 'NO_CONTRACT_SECTION',\n },\n ],\n warnings: [],\n details: {},\n };\n }\n return validateContract(contract);\n}\n\n/**\n * The directory a local `path` package resolves against: the input file's,\n * when the input is a file on disk. Otherwise none, and no disk reads.\n */\nfunction configDirOf(input: unknown): string | undefined {\n if (typeof input !== 'string') return undefined;\n const candidate = path.resolve(input);\n return fs.existsSync(candidate) && fs.statSync(candidate).isFile()\n ? path.dirname(candidate)\n : undefined;\n}\n\n/** Whole-document validations state their one check as their scope. */\nfunction withDocumentScope(\n result: ValidateResult,\n check: ValidateCheck,\n): ValidateResult {\n return {\n ...result,\n details: {\n ...result.details,\n scope: result.details.scope ?? { flows: [], checks: [check] },\n skipped: result.details.skipped ?? [],\n },\n };\n}\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: ValidateOptions = {},\n): Promise<ValidateResult> {\n // Resolve string inputs (file paths, URLs, JSON strings) to parsed objects.\n // A path that cannot be read or parsed is an input error, never a document.\n let resolved = input;\n if (typeof input === 'string') {\n if (input.trim() === '') throw new Error(`${type} is required`);\n resolved = await loadJsonConfig(input);\n }\n\n const misuse = inapplicableOptions(type, options);\n if (misuse.length > 0) {\n return {\n valid: false,\n type,\n errors: misuse,\n warnings: [],\n details: { scope: { flows: [], checks: [] }, skipped: [] },\n };\n }\n\n const result = await validateByType(type, input, resolved, options);\n return options.strict === true ? escalateStrict(result) : result;\n}\n\n/**\n * `strict` turns warnings and skipped checks into failures (C4), in every\n * entry point (C9): the result is invalid, with the findings unchanged.\n */\nfunction escalateStrict(result: ValidateResult): ValidateResult {\n const skipped = result.details.skipped ?? [];\n if (result.warnings.length === 0 && skipped.length === 0) return result;\n return { ...result, valid: false };\n}\n\nasync function validateByType(\n type: ValidationType,\n input: unknown,\n resolved: unknown,\n options: ValidateOptions,\n): Promise<ValidateResult> {\n switch (type) {\n case 'contract':\n return withDocumentScope(validateContractInput(resolved), 'contract');\n case 'event':\n return withDocumentScope(validateEvent(resolved), 'event');\n case 'flow':\n if (options.path !== undefined) {\n return validateEntry(options.path, resolved, {\n flow: options.flow,\n configDir: options.configDir ?? configDirOf(input),\n });\n }\n return validateFlowWithPackages(resolved, {\n flow: options.flow,\n strict: options.strict,\n offline: options.offline,\n configDir: options.configDir ?? configDirOf(input),\n });\n case 'mapping':\n return withDocumentScope(validateMapping(resolved), 'mapping');\n default:\n throw new Error(`Unknown validation type: ${type}`);\n }\n}\n\n/** One line naming what the run covered (C6). */\nfunction formatScope(result: ValidateResult): string | undefined {\n const scope = result.details.scope;\n if (!scope) return undefined;\n const parts: string[] = [];\n if (scope.flows.length > 0) parts.push(`flows ${scope.flows.join(', ')}`);\n if (scope.entry) {\n const { section, key, flows, searchedFlows } = scope.entry;\n const name = section ? `${section}.${key}` : key;\n parts.push(\n `entry ${name} in ${flows.join(', ') || 'no flow'} (searched ${searchedFlows.join(', ') || 'none'})`,\n );\n }\n parts.push(`${scope.checks.length} check(s): ${scope.checks.join(', ')}`);\n if (scope.offline) parts.push('offline: package settings not checked');\n return `Scope: ${parts.join('; ')}`;\n}\n\n/**\n * Format validation result for CLI output.\n */\nfunction formatResult(\n result: ValidateResult,\n options: { json?: boolean; verbose?: boolean; exitCode: number },\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 const scopeLine = formatScope(result);\n if (scopeLine) {\n lines.push(scopeLine);\n lines.push('');\n }\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 // Skips are listed whatever the verbosity (C5)\n const skipped = result.details.skipped ?? [];\n for (const skip of skipped) {\n lines.push(\n chalk.gray(` - skipped ${skip.check} at ${skip.path}: ${skip.reason}`),\n );\n }\n\n // The verdict line follows the exit code: a run that fails under\n // --strict (exit 2) never reads as passed.\n if (options.exitCode === 2) {\n lines.push(\n chalk.red(\n ` ✗ Failed under --strict: ${result.warnings.length} warning(s) and ${skipped.length} skipped check(s) count as failures`,\n ),\n );\n } else if (result.valid && skipped.length === 0) {\n lines.push(chalk.green(` ✓ All checks passed`));\n } else if (result.valid) {\n lines.push(\n chalk.green(\n ` ✓ No errors in checked scope; ${skipped.length} check(s) skipped`,\n ),\n );\n }\n\n lines.push('');\n lines.push(\n `Summary: ${result.errors.length} error(s), ${result.warnings.length} warning(s), ${skipped.length} skipped`,\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 let exitCode: number;\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 strict: options.strict,\n offline: options.offline,\n });\n\n exitCode = exitCodeOf(result, options.strict === true);\n\n // Format and write result; --silent suppresses stdout, never a file\n if (!options.silent || options.output) {\n const formatted = formatResult(result, {\n json: options.json,\n verbose: options.verbose,\n exitCode,\n });\n await writeResult(formatted + '\\n', { output: options.output });\n }\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: { scope: { flows: [], checks: [] }, skipped: [] },\n },\n null,\n 2,\n );\n await writeResult(errorOutput + '\\n', { output: options.output });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n exitCode = 3;\n }\n process.exit(exitCode);\n}\n\n/**\n * Exit code (C7): 3 could not run, 1 errors, 2 warnings or skips under\n * --strict, 0 valid.\n */\nfunction exitCodeOf(result: ValidateResult, strict: boolean): number {\n if (\n result.errors.some((e) =>\n USAGE_CODES.some((usageCode) => usageCode === e.code),\n )\n )\n return 3;\n if (result.errors.length > 0) return 1;\n const skipped = result.details.skipped ?? [];\n if (strict && (result.warnings.length > 0 || skipped.length > 0)) return 2;\n return result.valid ? 0 : 1;\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 { CONTRACT_RULE_KEYS, isObject } from '@walkeros/core';\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst KNOWN_KEYS = new Set<string>(CONTRACT_RULE_KEYS);\n\n/** Event parts once offered as contract sections; nothing enforces them. */\nconst SECTION_KEYS = ['globals', 'context', 'custom', 'user', 'consent'];\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 for $-prefixed root keys (flat app shape)\n for (const name of contractNames) {\n if (name.startsWith('$')) {\n errors.push({\n path: name,\n message:\n `\"${name}\" is not a named contract entry. This looks like the flat ` +\n 'shape; use named ContractRule entries, lift $tagging to the rule ' +\n 'field \"tagging\", and nest entity-action schemas under \"events\".',\n code: 'FLAT_CONTRACT_SHAPE',\n });\n }\n }\n\n // Check each named contract entry\n for (const [name, entry] of Object.entries(contracts)) {\n // Skip $-prefixed names (already reported above)\n if (name.startsWith('$')) {\n continue;\n }\n\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 const keys = Object.keys(obj);\n const unknownKeys = keys.filter((k) => !KNOWN_KEYS.has(k));\n const hasKnownKey = keys.some((k) => KNOWN_KEYS.has(k));\n const objectValuedUnknown = unknownKeys.filter(\n (k) => isObject(obj[k]) && !SECTION_KEYS.includes(k),\n );\n\n // Check for flat entity-action maps (object-valued keys without known keys)\n if (!hasKnownKey && objectValuedUnknown.length > 0) {\n errors.push({\n path: name,\n message:\n `Contract \"${name}\" looks like a flat entity-action map. Nest ` +\n 'entity-action schemas under an \"events\" key of a named ContractRule.',\n code: 'FLAT_CONTRACT_SHAPE',\n });\n continue;\n }\n\n // Unknown keys are errors: the contract schema is closed, and the\n // validate transformer would never apply them.\n for (const key of unknownKeys) {\n errors.push({\n path: `${name}.${key}`,\n message: SECTION_KEYS.includes(key)\n ? `Contract section \"${key}\" is not enforced: the validate transformer reads only \"events\" and \"schema\". Put the rule into \"schema\" (a JSON Schema for the whole event), for example \"schema\": { \"properties\": { \"${key}\": { ... } } }.`\n : `Unknown contract key \"${key}\" is not supported. Known keys: ${[...KNOWN_KEYS].join(', ')}.`,\n code: 'UNKNOWN_CONTRACT_KEY',\n });\n }\n\n // Validate tagging\n if (obj.tagging !== undefined && typeof obj.tagging !== 'number') {\n errors.push({\n path: `${name}.tagging`,\n message: 'tagging must be a number',\n code: 'INVALID_TAGGING',\n });\n }\n\n // Validate schema\n if (obj.schema !== undefined && !isObject(obj.schema)) {\n errors.push({\n path: `${name}.schema`,\n message: 'schema must be a JSON Schema object',\n code: 'INVALID_SCHEMA',\n });\n }\n\n // Validate extend\n if (obj.extend !== undefined) {\n if (typeof obj.extend !== 'string') {\n errors.push({\n path: `${name}.extend`,\n message: 'extend must be a string',\n code: 'INVALID_EXTENDS',\n });\n } else if (!contractNames.includes(obj.extend)) {\n errors.push({\n path: `${name}.extend`,\n message: `extend references non-existent contract \"${obj.extend}\"`,\n value: obj.extend,\n code: 'INVALID_EXTENDS',\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 extend: one error per cycle, at its first member.\n const reportedCycles = new Set<string>();\n for (const name of contractNames) {\n const chain: string[] = [];\n let current = name;\n while (current) {\n const start = chain.indexOf(current);\n if (start !== -1) {\n const cycle = chain.slice(start);\n const key = [...cycle].sort().join('\\u0000');\n if (!reportedCycles.has(key)) {\n reportedCycles.add(key);\n errors.push({\n path: `${cycle[0]}.extend`,\n message: `Circular extend chain: ${[...cycle, current].join(' → ')}`,\n code: 'CIRCULAR_EXTENDS',\n });\n }\n break;\n }\n chain.push(current);\n const entry = contracts[current];\n current =\n isObject(entry) && typeof entry.extend === 'string' ? entry.extend : '';\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, Transformer, WalkerOS } from '@walkeros/core';\nimport {\n checkWindowCollector,\n ENV_MARKER_PREFIX,\n getByPath,\n getRouteGraph,\n isObject,\n REF_CONTRACT,\n resolveContracts,\n SECRET_MARKER_PREFIX,\n validateStepEntry,\n} from '@walkeros/core';\nimport {\n checkStepKeys,\n schemas,\n validateFlowStructure,\n} from '@walkeros/core/dev';\nimport {\n validateEventAgainstContract,\n type ContractSource,\n} from '@walkeros/transformer-validate';\nimport {\n describeScope,\n ENTRY_SECTIONS,\n flowOfPath,\n isFlowJson,\n resolveScope,\n type ResolvedScope,\n} from '../scope.js';\nimport type {\n ValidateCheck,\n ValidateDeferred,\n ValidateDetails,\n ValidateResult,\n ValidateSkip,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\nimport { validateContract } from './contract.js';\nimport { resolveFlow, type FlowResolution } from './resolve.js';\nimport {\n checkStepSettings,\n createSettingsContext,\n type CheckedPackage,\n type SettingsOutcome,\n} from './settings.js';\n\nconst { validateFlowConfig } = schemas;\n\ninterface FlowValidateOptions {\n flow?: string;\n /** When true, contract violations are reported as errors instead of warnings. */\n strict?: boolean;\n}\n\ninterface FlowPackageOptions extends FlowValidateOptions {\n /** Skip the package settings check (no network); named in the scope. */\n offline?: boolean;\n /** Directory local `path` packages resolve against (the input file's). */\n configDir?: string;\n}\n\n/** Removed packages: reported as a warning for one minor (D3), then errors. */\nconst DEPRECATED_PACKAGES: Record<string, string> = {\n '@walkeros/store-memory':\n 'has been removed. Use the built-in cache by omitting cache.store, or remove the store declaration if it was only used as a cache target.',\n};\n\n/** Step sections and their kind, for the closed key check of every step. */\nconst STEP_KINDS = [\n ['sources', 'Source'],\n ['transformers', 'Transformer'],\n ['destinations', 'Destination'],\n ['stores', 'Store'],\n] as const;\n\n/** Everything the synchronous checks produced, for the package pass. */\ninterface FlowRun {\n result: ValidateResult;\n scope: ResolvedScope;\n typed?: Flow.Json;\n resolved: Map<string, Flow>;\n checks: ValidateCheck[];\n skipped: ValidateSkip[];\n gate: (name: string) => string | undefined;\n}\n\n/**\n * Validate a flow file without the network: schema and references, the\n * root contract, the bundler's structural preflight, routes, examples and\n * resolution of every flow in scope. `validate()` adds the package settings\n * check on top (see {@link validateFlowWithPackages}).\n */\nexport function validateFlow(\n input: unknown,\n options: FlowValidateOptions = {},\n): ValidateResult {\n return runFlowChecks(input, options).result;\n}\n\n/**\n * The whole-file run of `validate()`: {@link validateFlow} plus every step\n * with a `package` in scope checked against its package settings schema at\n * the pinned version. An unknown settings key is an error where the package\n * closes its schema (`additionalProperties: false`), as every closed schema\n * is; other findings are warnings for one minor (D3). A schema that cannot\n * be loaded is a skip; `offline` removes the check and says so.\n */\nexport async function validateFlowWithPackages(\n input: unknown,\n options: FlowPackageOptions = {},\n): Promise<ValidateResult> {\n const run = runFlowChecks(input, options);\n const { result, scope } = run;\n if (options.offline) {\n const described = describeScope(scope, run.checks);\n described.offline = true;\n result.details.scope = described;\n return result;\n }\n\n run.checks.push('flow:package-settings');\n const context = createSettingsContext(options.configDir);\n const deferred: ValidateDeferred[] = [];\n const packages: CheckedPackage[] = [];\n // Checks run in parallel; outcomes are applied in step order afterwards,\n // so the result does not depend on which schema arrives first.\n const pending: Array<Promise<SettingsOutcome>> = [];\n for (const name of scope.flows) {\n const flow = run.resolved.get(name);\n const rawFlow = run.typed?.flows[name];\n const reason = run.gate(name);\n if (!flow || !rawFlow || reason) {\n run.skipped.push({\n path: `flows.${name}`,\n check: 'flow:package-settings',\n reason: reason ?? `flows.${name} did not resolve`,\n code: 'GATED_BY_ERRORS',\n });\n continue;\n }\n for (const section of ENTRY_SECTIONS) {\n const steps = isObject(rawFlow[section]) ? rawFlow[section] : {};\n for (const [key, entry] of Object.entries(steps)) {\n if (!isObject(entry) || entry.package === undefined) continue;\n const target = { flow: name, section, key, entry };\n pending.push(\n checkStepSettings(target, flow, 'flow:package-settings', context),\n );\n }\n }\n }\n for (const outcome of await Promise.all(pending)) {\n for (const finding of outcome.findings) {\n if (finding.keyword === 'additionalProperties')\n result.errors.push(finding);\n else result.warnings.push(finding);\n }\n run.skipped.push(...outcome.skipped);\n deferred.push(...outcome.deferred);\n if (outcome.checked) packages.push(outcome.checked);\n }\n\n result.details.scope = describeScope(scope, run.checks);\n result.details.deferred = [...(result.details.deferred ?? []), ...deferred];\n if (packages.length > 0) result.details.packages = packages;\n result.valid = result.errors.length === 0;\n return result;\n}\n\nfunction runFlowChecks(input: unknown, options: FlowValidateOptions): FlowRun {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const skipped: ValidateSkip[] = [];\n const checks: ValidateCheck[] = ['file:schema', 'flow:schema'];\n const details: ValidateDetails = {};\n const resolved = new Map<string, Flow>();\n // `valid` is set once every error-producing check has run; the package\n // pass only adds warnings and skips.\n const result: ValidateResult = {\n valid: false,\n type: 'flow',\n errors,\n warnings,\n details,\n };\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 const scope = resolveScope(input, { flow: options.flow });\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 {\n result,\n scope,\n resolved,\n checks,\n skipped,\n gate: () => 'the input cannot be serialized',\n };\n }\n\n // 2. Scope: every per-flow check below runs on scope.flows only.\n errors.push(...scope.errors);\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 const allFlows = scope.allFlows;\n const inScope = (path: string): boolean => {\n const flow = flowOfPath(path, allFlows);\n return flow === undefined || scope.flows.includes(flow);\n };\n\n // 3. The root contract, validated as `-t contract` validates it, with\n // paths under `contract.`. A file-level check: it runs whatever --flow.\n let contractErrors = 0;\n if ('contract' in config) {\n checks.push('file:contract');\n const contract = validateContract(config.contract);\n contractErrors = contract.errors.length;\n for (const error of contract.errors)\n errors.push({ ...error, path: `contract.${error.path}` });\n for (const warning of contract.warnings)\n warnings.push({ ...warning, path: `contract.${warning.path}` });\n }\n\n // 4. Run core validation (Zod schema + reference checking). File-level\n // findings always count; per-flow findings only for flows in scope.\n // Core's own contract-resolution error at `contract` is the same\n // finding the contract check above already reported in detail.\n const coreResult = validateFlowConfig(json);\n for (const issue of coreResult.errors) {\n const path = issue.path || 'root';\n if (!inScope(path)) continue;\n if (\n (path === 'contract' || path.startsWith('contract.')) &&\n contractErrors > 0\n )\n continue;\n errors.push({\n path,\n message: issue.message,\n code: issue.code ?? 'SCHEMA_VALIDATION',\n });\n }\n for (const issue of coreResult.warnings) {\n const path = issue.path || 'root';\n if (!inScope(path)) continue;\n warnings.push({ path, message: issue.message, code: 'CONFIG_WARNING' });\n }\n\n // 5. CLI-specific: check for empty flows\n if (flows && allFlows.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. Step entries, closed (single source of truth in @walkeros/core):\n // a transformer entry's shape, and an unknown key on a destination or\n // store entry or in any step's `config`, which the runtime would\n // ignore (UNKNOWN_KEY errors). Removed packages warn\n // (DEPRECATED_PACKAGE) for one minor (D3).\n checks.push('flow:steps');\n for (const flowName of scope.flows) {\n const flowValue = flows?.[flowName];\n if (!isObject(flowValue)) continue;\n const transformersValue = flowValue.transformers;\n if (isObject(transformersValue)) {\n for (const [name, transformerValue] of Object.entries(\n transformersValue,\n )) {\n if (!isObject(transformerValue)) continue;\n const result = validateStepEntry(transformerValue, 'Transformer');\n if (!result.ok) {\n errors.push({\n path: `flows.${flowName}.transformers.${name}`,\n message: result.reason || 'Invalid transformer entry.',\n code: result.code,\n });\n }\n }\n }\n for (const [section, kind] of STEP_KINDS) {\n const steps = flowValue[section];\n if (!isObject(steps)) continue;\n for (const [name, step] of Object.entries(steps)) {\n if (!isObject(step)) continue;\n const at = `flows.${flowName}.${section}.${name}`;\n errors.push(...checkStepKeys(step, kind, at));\n const pkg = step.package;\n if (typeof pkg === 'string' && pkg in DEPRECATED_PACKAGES) {\n warnings.push({\n path: at,\n message: `${kind} \"${name}\" uses ${pkg}, which ${DEPRECATED_PACKAGES[pkg]}`,\n code: 'DEPRECATED_PACKAGE',\n });\n }\n }\n }\n checkWebLoggerFormat(flowName, flowValue, errors);\n }\n\n // 7. Extract flow details\n if (flows) {\n details.flowNames = allFlows;\n details.flowCount = allFlows.length;\n }\n\n // 8. CLI-specific: warn about packages without version (per-flow config.bundle.packages)\n checks.push('flow:package-versions');\n let totalPackageCount = 0;\n for (const flowName of scope.flows) {\n const flowValue = flows?.[flowName];\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 code: 'PACKAGE_VERSION_MISSING',\n });\n }\n }\n totalPackageCount += Object.keys(packages).length;\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 checks run per flow on shapes core has already validated: a\n // flow with its own errors, or a file with file-level errors (its\n // shape, its contract), skips them, and every skip is listed.\n const typed = isFlowJson(input) ? input : undefined;\n const gate = (name: string): string | undefined => {\n if (\n !typed ||\n errors.some((e) => flowOfPath(e.path, allFlows) === undefined)\n )\n return 'file-level errors: the file shape or its contract is not valid';\n if (errors.some((e) => flowOfPath(e.path, allFlows) === name))\n return `earlier errors in flows.${name}`;\n return undefined;\n };\n const perFlow = (\n stageChecks: ValidateCheck[],\n run: (name: string, flow: Flow, file: Flow.Json) => void,\n ): void => {\n checks.push(...stageChecks);\n for (const name of scope.flows) {\n const reason = gate(name);\n const flow = typed?.flows[name];\n if (reason || !typed || !flow) {\n for (const check of stageChecks) {\n skipped.push({\n path: `flows.${name}`,\n check,\n reason: reason ?? `flows.${name} is not a flow object`,\n code: 'GATED_BY_ERRORS',\n });\n }\n continue;\n }\n run(name, flow, typed);\n }\n };\n\n // 10a. The bundler's own structural preflight (identifier names, package\n // xor code, per-flow $store targets, closed keys, mapping fields that\n // do nothing at their position, mapping values, whole-value\n // references), so a valid result implies the bundle preflight passes.\n // A flow with earlier errors skips it, so nothing is reported twice.\n perFlow(['flow:structure'], (name, flow, file) => {\n const structure = validateFlowStructure({\n ...file,\n flows: { [name]: flow },\n });\n errors.push(...structure.errors);\n warnings.push(...structure.warnings);\n });\n\n // 10b. Route checks on every chain field, read through core's\n // getRouteGraph. Unknown targets are errors; shapes the schema\n // accepts but the author probably did not intend are warnings.\n perFlow(['flow:routes'], (name, flow) => {\n lintFlowRoutes(name, flow, errors, warnings);\n });\n\n // Each flow is resolved once, as the bundler resolves it: the validate\n // step check below reads its settings from there, 10d reports failures.\n const resolutions = new Map<string, FlowResolution>();\n const resolutionOf = (name: string, file: Flow.Json): FlowResolution => {\n let resolution = resolutions.get(name);\n if (!resolution) {\n resolution = resolveFlow(file, name);\n resolutions.set(name, resolution);\n }\n return resolution;\n };\n\n // 10c. Cross-step example compatibility, validate step examples against\n // their contract, and flat dot-separated mapping keys.\n let totalConnections: number | undefined;\n perFlow(\n ['flow:examples', 'flow:contract-examples', 'flow:mapping-keys'],\n (name, flow, file) => {\n const connections = buildConnectionGraph(flow);\n for (const conn of connections) {\n checkCompatibility(name, conn, errors, warnings);\n }\n totalConnections = (totalConnections ?? 0) + connections.length;\n\n // Contracts bind only where a transformer-validate step links them,\n // with exactly that step's settings, as at runtime. The config-level\n // contract block binds nothing by itself.\n const resolution = resolutionOf(name, file);\n for (const [stepName, transformer] of Object.entries(\n flow.transformers || {},\n )) {\n if (!isValidateStep(transformer)) continue;\n const resolvedConfig = resolution.ok\n ? resolution.flow.transformers?.[stepName]?.config\n : undefined;\n checkValidateStepExamples(\n `flows.${name}.transformers.${stepName}`,\n transformer,\n file.contract,\n errors,\n warnings,\n options.strict === true,\n skipped,\n isObject(resolvedConfig) && isObject(resolvedConfig.settings)\n ? resolvedConfig.settings\n : undefined,\n );\n }\n\n for (const [destName, dest] of Object.entries(flow.destinations || {})) {\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: `flows.${name}.destinations.${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 code: 'MAPPING_DOT_KEY',\n });\n }\n }\n }\n },\n );\n if (totalConnections !== undefined) {\n details.connectionsChecked = totalConnections;\n }\n\n // 10d. Resolve every flow as the bundler does. Every resolver failure\n // (unknown $var, unresolvable $flow, unknown contract, cycles) is an\n // error, since the bundle of that flow fails the same way. Values\n // known only at runtime ($env without default, $secret) stay deferred.\n // The collector global is checked on its resolved value; an `$env`\n // value is known only at build time and stays deferred.\n const deferred: ValidateDeferred[] = [];\n perFlow(['flow:resolve'], (name, flow, file) => {\n const resolution = resolutionOf(name, file);\n if (!resolution.ok) {\n errors.push(resolution.error);\n return;\n }\n resolved.set(name, resolution.flow);\n checkResolvedWindowCollector(name, flow, resolution.flow, errors, deferred);\n });\n\n details.scope = describeScope(scope, checks);\n details.skipped = skipped;\n details.deferred = deferred;\n result.valid = errors.length === 0;\n\n return {\n result,\n scope,\n typed,\n resolved,\n checks,\n skipped,\n gate,\n };\n}\n\n/**\n * A `$var` / `$env` collector global, checked on its resolved value as the\n * build checks it. A literal is already checked by the schema; a value that\n * needs the build env is deferred to the build.\n */\nfunction checkResolvedWindowCollector(\n name: string,\n raw: Flow,\n flow: Flow,\n errors: ValidationError[],\n deferred: ValidateDeferred[],\n): void {\n const written = raw.config?.settings?.windowCollector;\n const value = flow.config?.settings?.windowCollector;\n if (\n flow.config?.platform !== 'web' ||\n typeof written !== 'string' ||\n !/\\$(?:var|env)\\./.test(written)\n )\n return;\n const path = `flows.${name}.config.settings.windowCollector`;\n if (typeof value === 'string' && value.includes(ENV_MARKER_PREFIX)) {\n deferred.push({ path, reference: written });\n return;\n }\n const check = checkWindowCollector(value);\n if (check.ok) return;\n errors.push({\n path,\n message: `${JSON.stringify(written)} resolved to ${JSON.stringify(value)}, which ${check.reason}`,\n code: 'SCHEMA_VALIDATION',\n });\n}\n\n/**\n * `logger.format` chooses text or JSON lines for a server flow's output; a\n * web flow logs to the browser console, where it has no effect. Checked on\n * the collector's logger and on every step's `config.logger`.\n */\nfunction checkWebLoggerFormat(\n flowName: string,\n flow: Record<string, unknown>,\n errors: ValidationError[],\n): void {\n if (!isObject(flow.config) || flow.config.platform !== 'web') return;\n const at = `flows.${flowName}`;\n const loggers: Array<[string, unknown]> = [];\n if (isObject(flow.collector))\n loggers.push([`${at}.collector.logger`, flow.collector.logger]);\n for (const [section] of STEP_KINDS) {\n const steps = flow[section];\n if (!isObject(steps)) continue;\n for (const [name, step] of Object.entries(steps)) {\n if (isObject(step) && isObject(step.config))\n loggers.push([\n `${at}.${section}.${name}.config.logger`,\n step.config.logger,\n ]);\n }\n }\n for (const [path, logger] of loggers) {\n if (!isObject(logger) || logger.format === undefined) continue;\n errors.push({\n path: `${path}.format`,\n message:\n 'logger.format applies to server flows only: a web flow logs to the browser console, which has no output format. Remove it.',\n code: 'WEB_LOGGER_FORMAT',\n });\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\n/**\n * Every transformer id a route can reach, read through core's\n * `getRouteGraph` (the one enumerator over the compiled route form). An\n * over-approximation by design: static validation has no event, so every\n * branch counts.\n */\nfunction routeTargets(spec: Transformer.Route | undefined): string[] {\n if (spec === undefined) return [];\n const targets = new Set<string>();\n for (const node of getRouteGraph(spec)) {\n for (const target of node.targets) targets.add(target);\n }\n return [...targets];\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 = routeTargets(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 = routeTargets(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 = routeTargets(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 flowName: string,\n conn: StepConnection,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n const fromOuts = Object.entries(conn.from.examples)\n .filter(([, ex]) => hasComparableOut(ex.out))\n .map(([name, ex]) => ({ name, value: ex.out }));\n\n // A command example's `in` is a walker command payload, never a pushed event\n const toIns = Object.entries(conn.to.examples)\n .filter(([, ex]) => ex.in !== undefined && !ex.command)\n .map(([name, ex]) => ({ name, value: ex.in }));\n\n const path = `flows.${flowName}.${conn.from.type}s.${conn.from.name} → ${conn.to.type}s.${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 code: 'EXAMPLES_INCOMPLETE',\n });\n return;\n }\n\n const hasMatch = fromOuts.some((out) =>\n outEvents(out.value).some((event) =>\n toIns.some((inp) => isStructurallyCompatible(event, inp.value)),\n ),\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\n/** An effect tuple of a StepOut: a string head, then the call arguments. */\ntype StepOutEffect = [string, ...unknown[]];\n\n/**\n * A StepOut is an array whose every entry is an array with a string head\n * (`[]` included): `[['elb', event]]`, `[['return', { event }]]`, ...\n */\nfunction isStepOut(value: unknown): value is StepOutEffect[] {\n return (\n Array.isArray(value) &&\n value.every((entry) => Array.isArray(entry) && typeof entry[0] === 'string')\n );\n}\n\n/**\n * Events a `return` effect passes on: `{ event }` yields the event, a bare\n * object is the event itself, an array is a fan-out read item by item by the\n * same rule. `false` and other values pass nothing on.\n */\nfunction returnedEvents(value: unknown): unknown[] {\n if (isObject(value)) return [isObject(value.event) ? value.event : value];\n if (Array.isArray(value)) return value.flatMap(returnedEvents);\n return [];\n}\n\n/**\n * The events an example `out` hands to the next step. A StepOut yields the\n * object argument of each `elb` effect and the events of each `return`\n * effect; every other head (`message.ack`, `response`, vendor calls) yields\n * nothing. A non-StepOut value is the output itself (back compat), when it\n * is a non-empty array, string or object.\n */\nfunction outEvents(out: unknown): unknown[] {\n if (isStepOut(out)) {\n return out.flatMap(([head, first]) => {\n if (head === 'elb') return isObject(first) ? [first] : [];\n if (head === 'return') return returnedEvents(first);\n return [];\n });\n }\n if (Array.isArray(out) || typeof out === 'string')\n return out.length > 0 ? [out] : [];\n return isObject(out) && Object.keys(out).length > 0 ? [out] : [];\n}\n\nfunction hasComparableOut(out: unknown): boolean {\n return outEvents(out).length > 0;\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\n/**\n * Checks every chain field of a flow (source `before`/`next`, transformer\n * `before`/`next`, destination `before`/`next`, `collector.next`):\n *\n * - error: a route target that is not a transformer of the flow. At runtime\n * an unknown id is skipped with a warning, so a misspelled step (for\n * example a redaction branch) would otherwise fail open.\n * - warning: entries after an unconditional `stop` never run.\n * - warning: `many: []` selects nothing; `many: [\"x\"]` is just `next`.\n * - warning: an array made only of route configs is first-match.\n */\nfunction lintFlowRoutes(\n flowName: string,\n flow: Flow,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n const known = new Set(Object.keys(flow.transformers || {}));\n const check = (\n spec: Transformer.Route | undefined,\n position: string,\n ): void => {\n if (spec !== undefined) lintRoute(spec, position, known, errors, warnings);\n };\n const at = `flows.${flowName}`;\n\n for (const [name, source] of Object.entries(flow.sources || {})) {\n check(source.before, `${at}.sources.${name}.before`);\n check(source.next, `${at}.sources.${name}.next`);\n }\n for (const [name, transformer] of Object.entries(flow.transformers || {})) {\n check(transformer.before, `${at}.transformers.${name}.before`);\n check(transformer.next, `${at}.transformers.${name}.next`);\n }\n check(flow.collector?.next, `${at}.collector.next`);\n for (const [name, dest] of Object.entries(flow.destinations || {})) {\n check(dest.before, `${at}.destinations.${name}.before`);\n check(dest.next, `${at}.destinations.${name}.next`);\n }\n}\n\ntype RoutePath = (string | number)[];\n\n/** The raw value at `path` inside a route (a plain lookup, no grammar). */\nfunction routeAt(spec: Transformer.Route, path: RoutePath): unknown {\n let current: unknown = spec;\n for (const key of path) {\n if (typeof key === 'number')\n current = Array.isArray(current) ? current[key] : undefined;\n else current = isObject(current) ? current[key] : undefined;\n }\n return current;\n}\n\n/**\n * Lints one route through `getRouteGraph`. Every branch node, and every\n * enclosing decision it lists in `via`, is looked at once by its path.\n */\nfunction lintRoute(\n spec: Transformer.Route,\n position: string,\n known: Set<string>,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n const where = (path: RoutePath) =>\n path.length > 0 ? `${position}.${path.join('.')}` : position;\n const reported = new Set<string>();\n const once = (key: string): boolean => {\n if (reported.has(key)) return false;\n reported.add(key);\n return true;\n };\n\n for (const node of getRouteGraph(spec)) {\n for (const target of node.targets) {\n if (known.has(target) || !once(`unknown:${target}`)) continue;\n errors.push({\n path: position,\n message: `Unknown transformer \"${target}\" in route at ${position}`,\n code: 'UNKNOWN_ROUTE_TARGET',\n });\n }\n\n // Entries after an unconditional stop never run (a `many` entry's stop\n // ends only its own copy, so it does not shadow its siblings).\n const last = node.path[node.path.length - 1];\n if (node.stop && !node.match && node.kind !== 'many') {\n const self = routeAt(spec, node.path);\n const list = routeAt(spec, node.path.slice(0, -1));\n if (\n isObject(self) &&\n self.stop === true &&\n typeof last === 'number' &&\n Array.isArray(list) &&\n last < list.length - 1 &&\n once(`stop:${where(node.path)}`)\n ) {\n const at = where(node.path);\n warnings.push({\n path: at,\n message: `dead code after stop at ${at}: entries after an unconditional stop never run`,\n code: 'ROUTE_DEAD_CODE',\n suggestion:\n 'Remove the entries after the stop, or give the stop a match.',\n });\n }\n }\n\n if (\n node.kind === 'many' &&\n last === 'many' &&\n node.targets.length === 0 &&\n once(`empty:${where(node.path)}`)\n ) {\n const at = where(node.path.slice(0, -1));\n warnings.push({\n path: at,\n message: `empty many at ${at}: selects no branch, so it has no effect`,\n code: 'ROUTE_EMPTY_MANY',\n suggestion: 'Add two or more branch targets to many, or remove it.',\n });\n }\n\n for (const decision of [...(node.via ?? []), node]) {\n const index = decision.path[decision.path.length - 1];\n if (typeof index !== 'number') continue;\n const listPath = decision.path.slice(0, -1);\n const list = routeAt(spec, listPath);\n if (!Array.isArray(list)) continue;\n const at = where(listPath);\n\n if (\n decision.kind === 'many' &&\n list.length === 1 &&\n once(`single:${at}`)\n ) {\n const only = list[0];\n const hint =\n typeof only === 'string'\n ? `use 'next: \"${only}\"' for clarity`\n : `use 'next' for clarity`;\n warnings.push({\n path: at,\n message: `single-entry many at ${at}: ${hint}`,\n code: 'ROUTE_SINGLE_MANY',\n suggestion: 'Replace many with next when only one branch exists.',\n });\n }\n\n // A pure route-config array is compiled as an implicit `one`.\n const explicitOne = listPath[listPath.length - 1] === 'one';\n if (\n decision.kind === 'one' &&\n !explicitOne &&\n list.length > 1 &&\n once(`first-match:${at}`)\n ) {\n warnings.push({\n path: at,\n message: `first-match array at ${at}: an array made only of route configs is an implicit one, the first matching entry wins`,\n code: 'ROUTE_FIRST_MATCH',\n suggestion:\n 'Write { \"one\": [...] } explicitly, or add the step ids as a sequence to run every entry in order.',\n });\n }\n }\n }\n}\n\n/**\n * Whether a value holds a `$env` or `$secret` value: resolved to the\n * resolver's deferred marker, or still written as the reference.\n */\nfunction hasRuntimeValue(value: unknown): boolean {\n if (typeof value === 'string')\n return (\n value.includes(ENV_MARKER_PREFIX) ||\n value.startsWith(SECRET_MARKER_PREFIX) ||\n /\\$(?:env|secret)\\./.test(value)\n );\n if (Array.isArray(value)) return value.some(hasRuntimeValue);\n return isObject(value) && Object.values(value).some(hasRuntimeValue);\n}\n\nconst VALIDATE_PACKAGE = '@walkeros/transformer-validate';\n\n/** A transformer step that runs `@walkeros/transformer-validate`. */\nexport function isValidateStep(step: Flow.Transformer): boolean {\n return step.package === VALIDATE_PACKAGE;\n}\n\ntype StepContracts =\n | { ok: true; sources: ContractSource[] }\n | { ok: false; index?: number; message: string };\n\n/**\n * The contract sources a validate step runs with, as at runtime: a whole\n * `$contract.<name>(.<path>)` string resolves against the config-level\n * contract definitions, an inline schema is used as given. An entry that\n * does not resolve says which one and why; the step is then not judged.\n */\nfunction resolveStepContracts(\n entries: unknown[],\n contract: Flow.Contract | undefined,\n): StepContracts {\n let resolved: Record<string, Flow.ContractRule> = {};\n if (contract) {\n try {\n resolved = resolveContracts(contract);\n } catch (error) {\n return {\n ok: false,\n message: `the root contract does not resolve (${error instanceof Error ? error.message : String(error)})`,\n };\n }\n }\n\n const sources: ContractSource[] = [];\n for (const [index, entry] of entries.entries()) {\n if (isObject(entry)) {\n sources.push(entry);\n continue;\n }\n const match = typeof entry === 'string' ? entry.match(REF_CONTRACT) : null;\n if (!match)\n return {\n ok: false,\n index,\n message: 'an entry must be a $contract reference or a JSON Schema',\n };\n if (!(match[1] in resolved))\n return {\n ok: false,\n index,\n message: `contract \"${match[1]}\" is not defined in the root contract (defined: ${Object.keys(resolved).join(', ') || 'none'})`,\n };\n const rule: unknown = match[2]\n ? getByPath(resolved[match[1]], match[2])\n : resolved[match[1]];\n if (!isObject(rule))\n return {\n ok: false,\n index,\n message: `${match[0]} does not point at a contract rule object`,\n };\n sources.push(rule);\n }\n return { ok: true, sources };\n}\n\n/**\n * Check a validate step's own examples against its own contract and\n * settings: the verdict the step reaches on `in` must agree with what `out`\n * shows. A valid event goes on (its `output.isValid` flag, when shown, is\n * true); an invalid one is dropped in `strict` mode and otherwise goes on\n * with the flag false. A disagreement is CONTRACT_VIOLATION (error when\n * {@link strict}, else warning). Deterministic: the verdict comes from the\n * shared {@link validateEventAgainstContract} runtime authority.\n * `stepPath` is the step's result path, `flows.<flow>.transformers.<name>`.\n * A contract entry that does not resolve is an error (UNRESOLVED_CONTRACT),\n * examples or not; a contract setting that is not a list is a skip.\n * `resolvedSettings` are the step's settings as the resolver produced them\n * (`$var` and `$contract` resolved, as the runtime sees them); without them\n * the settings as written are read.\n */\nexport function checkValidateStepExamples(\n stepPath: string,\n step: Flow.Transformer,\n contract: Flow.Contract | undefined,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n strict: boolean,\n skipped?: ValidateSkip[],\n resolvedSettings?: Record<string, unknown>,\n): void {\n const settings =\n resolvedSettings ??\n (isObject(step.config) && isObject(step.config.settings)\n ? step.config.settings\n : {});\n const contractPath = `${stepPath}.config.settings.contract`;\n // A contract that is set but not a list cannot be judged statically.\n if (settings.contract !== undefined && !Array.isArray(settings.contract)) {\n if (step.examples)\n skipped?.push({\n path: stepPath,\n check: 'flow:contract-examples',\n reason:\n 'config.settings.contract is not a list, so the step cannot be judged statically',\n code: 'CONTRACT_NOT_STATIC',\n });\n return;\n }\n const resolution: StepContracts = Array.isArray(settings.contract)\n ? resolveStepContracts(settings.contract, contract)\n : { ok: true, sources: [] };\n if (!resolution.ok) {\n errors.push({\n path:\n resolution.index === undefined\n ? contractPath\n : `${contractPath}.${resolution.index}`,\n message: `The validate step's contract does not resolve: ${resolution.message}`,\n code: 'UNRESOLVED_CONTRACT',\n });\n return;\n }\n if (!step.examples) return;\n const contracts = resolution.sources;\n // A `$env` or `$secret` value in the contract is known only when the\n // bundle builds or runs; judged on its literal text, JSON Schema would\n // ignore it. The check is deferred, and the skip says so.\n if (contracts.some(hasRuntimeValue)) {\n skipped?.push({\n path: stepPath,\n check: 'flow:contract-examples',\n reason:\n 'the contract uses a $env or $secret value, known only when the bundle builds or runs, so the examples cannot be judged statically',\n code: 'CONTRACT_NOT_STATIC',\n });\n return;\n }\n\n const mode = settings.mode === 'strict' ? 'strict' : 'pass';\n const format = settings.format === true;\n const output = isObject(settings.output) ? settings.output : {};\n const isValidPath =\n typeof output.isValid === 'string' ? output.isValid : 'source.valid';\n\n for (const [exName, example] of Object.entries(step.examples)) {\n if (example.command || !isObject(example.in)) continue;\n if (example.out === undefined) continue;\n\n const event: WalkerOS.DeepPartialEvent = example.in;\n const verdict = validateEventAgainstContract(event, undefined, {\n contracts,\n format,\n });\n const passed = outEvents(example.out);\n const dropped =\n isStepOut(example.out) &&\n example.out.some(([head, first]) => head === 'return' && first === false);\n\n let agrees: boolean;\n if (mode === 'strict' && !verdict.isValid) {\n agrees = dropped && passed.length === 0;\n } else {\n agrees =\n passed.length > 0 &&\n passed.every((out) => {\n if (!isValidPath) return true;\n const flag = getByPath(out, isValidPath);\n return verdict.isValid ? flag !== false : flag === false;\n });\n }\n if (agrees) continue;\n\n const reason = verdict.isValid\n ? 'the event satisfies the contract'\n : `the event breaks the contract (${verdict.errors\n .map((e) => `${e.path || '/'}: ${e.message}`)\n .join('; ')})`;\n const expected =\n mode === 'strict' && !verdict.isValid\n ? 'drops it ([\"return\", false])'\n : `passes it on${isValidPath ? ` with ${isValidPath} ${verdict.isValid}` : ''}`;\n const path = `${stepPath}.examples.${exName}.out`;\n const message = `Example out disagrees with the validate step: ${reason}, so with mode \"${mode}\" the step ${expected}.`;\n\n if (strict) {\n errors.push({ path, message, code: 'CONTRACT_VIOLATION' });\n } else {\n warnings.push({\n path,\n message,\n suggestion:\n 'Make the example out show what the validate step does with its settings.',\n code: 'CONTRACT_VIOLATION',\n });\n }\n }\n}\n","// walkerOS/packages/cli/src/commands/validate/scope.ts\n\nimport type { Flow } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\nimport type { ValidateCheck, ValidateScope, ValidationError } from './types.js';\n\n/**\n * A parsed Flow.Json shape (a `version` and a `flows` object), so the\n * validators can hand it to core's resolver and preflight without casts.\n */\nexport function isFlowJson(value: unknown): value is Flow.Json {\n return isObject(value) && 'version' in value && isObject(value.flows);\n}\n\n/** Step sections a `--path` can address. */\nexport const ENTRY_SECTIONS = [\n 'sources',\n 'destinations',\n 'transformers',\n 'stores',\n] as const;\n\nexport type EntrySection = (typeof ENTRY_SECTIONS)[number];\n\nfunction isEntrySection(value: string): value is EntrySection {\n return ENTRY_SECTIONS.some((section) => section === value);\n}\n\nexport interface ScopeOptions {\n flow?: string;\n path?: string;\n}\n\nexport interface ScopeEntry {\n flow: string;\n section: EntrySection;\n key: string;\n entry: Record<string, unknown>;\n}\n\nexport interface ResolvedScope {\n /** Every flow in the file, in file order. */\n allFlows: string[];\n /** Flows every per-flow check runs on. */\n flows: string[];\n /** Entries a `--path` addressed, one per flow that has it. */\n entries: ScopeEntry[];\n /** Flows searched for the `--path` entry (empty without a path). */\n searchedFlows: string[];\n /** The entry a `--path` names, when one was given and parsed. */\n target?: { section?: EntrySection; key: string };\n /** FLOW_NOT_FOUND, ENTRY_NOT_FOUND, AMBIGUOUS_ENTRY, UNSUPPORTED_SECTION, INVALID_PATH. */\n errors: ValidationError[];\n}\n\n/**\n * The one place validate picks flows and entries. `flow` narrows to that\n * flow; without it every flow is in scope. `path` (`section.key` or `key`)\n * addresses the entry in every flow in scope that has it.\n */\nexport function resolveScope(\n config: unknown,\n options: ScopeOptions = {},\n): ResolvedScope {\n const flowsValue = isObject(config) ? config.flows : undefined;\n const flowMap = isObject(flowsValue) ? flowsValue : {};\n const allFlows = Object.keys(flowMap);\n\n let flows = allFlows;\n if (options.flow !== undefined) {\n if (!allFlows.includes(options.flow)) {\n return {\n allFlows,\n flows: [],\n entries: [],\n searchedFlows: [],\n errors: [\n {\n path: 'flows',\n message: `Flow \"${options.flow}\" not found. Available: ${allFlows.join(', ') || 'none'}`,\n code: 'FLOW_NOT_FOUND',\n },\n ],\n };\n }\n flows = [options.flow];\n }\n\n const path = options.path;\n if (path === undefined) {\n return { allFlows, flows, entries: [], searchedFlows: [], errors: [] };\n }\n\n const parts = path.split('.');\n let sections: readonly EntrySection[] = ENTRY_SECTIONS;\n let section: EntrySection | undefined;\n let key: string;\n if (parts.length === 2 && parts[0] !== '' && parts[1] !== '') {\n if (!isEntrySection(parts[0])) {\n return {\n allFlows,\n flows,\n entries: [],\n searchedFlows: [],\n errors: [\n {\n path,\n message: `Section \"${parts[0]}\" cannot be addressed by --path. Use one of: ${ENTRY_SECTIONS.join(', ')}`,\n code: 'UNSUPPORTED_SECTION',\n },\n ],\n };\n }\n section = parts[0];\n sections = [section];\n key = parts[1];\n } else if (parts.length === 1 && parts[0] !== '') {\n key = parts[0];\n } else {\n return {\n allFlows,\n flows,\n entries: [],\n searchedFlows: [],\n errors: [\n {\n path,\n message: `Invalid path \"${path}\". Use \"section.key\" or just \"key\"`,\n code: 'INVALID_PATH',\n },\n ],\n };\n }\n\n const entries: ScopeEntry[] = [];\n for (const flow of flows) {\n const flowValue = flowMap[flow];\n if (!isObject(flowValue)) continue;\n for (const candidate of sections) {\n const sectionValue = flowValue[candidate];\n if (!isObject(sectionValue)) continue;\n const entry = sectionValue[key];\n if (isObject(entry))\n entries.push({ flow, section: candidate, key, entry });\n }\n }\n\n const matched = [...new Set(entries.map((entry) => entry.section))];\n if (matched.length > 1) {\n return {\n allFlows,\n flows,\n entries: [],\n searchedFlows: flows,\n target: { key },\n errors: [\n {\n path,\n message: `Ambiguous key \"${key}\" found in multiple sections: ${matched.join(', ')}. Use dot-notation (e.g., ${matched[0]}.${key})`,\n code: 'AMBIGUOUS_ENTRY',\n },\n ],\n };\n }\n\n const target = { section: section ?? matched[0], key };\n if (entries.length === 0) {\n return {\n allFlows,\n flows,\n entries,\n searchedFlows: flows,\n target,\n errors: [\n {\n path,\n message: `Entry \"${key}\" not found in ${section ?? 'any section'} of flow(s): ${flows.join(', ') || 'none'}`,\n code: 'ENTRY_NOT_FOUND',\n },\n ],\n };\n }\n\n return {\n allFlows,\n flows,\n entries,\n searchedFlows: flows,\n target,\n errors: [],\n };\n}\n\n/** The flow a result path belongs to, or undefined for a file-level path. */\nexport function flowOfPath(\n path: string,\n flowNames: readonly string[],\n): string | undefined {\n return flowNames.find(\n (name) => path === `flows.${name}` || path.startsWith(`flows.${name}.`),\n );\n}\n\n/** `details.scope` for a resolved scope and the checks the run included. */\nexport function describeScope(\n resolved: ResolvedScope,\n checks: ValidateCheck[],\n): ValidateScope {\n const scope: ValidateScope = { flows: resolved.flows, checks };\n if (resolved.target) {\n const { section, key } = resolved.target;\n scope.entry = {\n ...(section ? { section } : {}),\n key,\n flows: [...new Set(resolved.entries.map((entry) => entry.flow))],\n searchedFlows: resolved.searchedFlows,\n };\n }\n return scope;\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/resolve.ts\n\nimport type { Flow } from '@walkeros/core';\nimport {\n FlowCycleError,\n FlowReferenceError,\n getFlowSettings,\n getErrorMessage,\n} from '@walkeros/core';\nimport type { ValidateCode, ValidationError } from '../types.js';\n\nexport type FlowResolution =\n | { ok: true; flow: Flow }\n | { ok: false; error: ValidationError };\n\n/**\n * Resolve one flow exactly as the bundler does (`getFlowSettings` with\n * deferred `$env`/`$secret`, and `$flow` refs as strict as the bundle). A\n * resolver failure is an error at `flows.<name>`: the bundle of this flow\n * fails the same way.\n */\nexport function resolveFlow(file: Flow.Json, name: string): FlowResolution {\n try {\n const flow = getFlowSettings(file, name, { deferred: true });\n return { ok: true, flow };\n } catch (error) {\n return {\n ok: false,\n error: {\n path: `flows.${name}`,\n message: getErrorMessage(error),\n code: resolutionCode(error),\n },\n };\n }\n}\n\n/** The code of a resolver failure, read from its type. */\nfunction resolutionCode(error: unknown): ValidateCode {\n if (error instanceof FlowReferenceError) return error.code;\n if (error instanceof FlowCycleError) return error.code;\n return 'UNRESOLVED_REFERENCE';\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/settings.ts\n\nimport Ajv, { type ErrorObject, type ValidateFunction } from 'ajv';\nimport type { Flow } from '@walkeros/core';\nimport {\n createLogger,\n ENV_MARKER_PREFIX,\n getErrorMessage,\n isObject,\n REF_CODE_PREFIX,\n REF_STORE,\n SECRET_MARKER_PREFIX,\n} from '@walkeros/core';\nimport {\n resolveExportName,\n type ComponentKind,\n} from '../../../core/resolve-export-name.js';\nimport {\n resolveStepPackage,\n type ResolvedStepPackage,\n} from '../../../core/step-packages.js';\nimport { readStepPackageInfo } from '../../../core/package-info.js';\nimport type { EntrySection } from '../scope.js';\nimport type {\n ValidateCheck,\n ValidateDeferred,\n ValidateSkip,\n ValidationError,\n} 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\n// Resolving a step's package logs only a warning (a bundle pin over a\n// disagreeing inline version); the version checked is in details.packages.\nconst LOGGER = createLogger();\n\n/** One step whose settings are checked against its package schema. */\nexport interface SettingsTarget {\n flow: string;\n section: EntrySection;\n key: string;\n /** The step as written in the file (package, bundle pins). */\n entry: Record<string, unknown>;\n}\n\nexport interface SettingsContext {\n /** Directory a local `path` package resolves against; unset: no disk reads. */\n configDir?: string;\n /** Schemas fetched in this run, by package source. */\n cache: Map<string, Promise<PackageSchema>>;\n /** Settings validators compiled in this run, by package source and export. */\n compiled: Map<string, CompiledSettings | undefined>;\n}\n\nexport interface CheckedPackage {\n path: string;\n package: string;\n version?: string;\n}\n\nexport interface SettingsOutcome {\n findings: ValidationError[];\n skipped: ValidateSkip[];\n deferred: ValidateDeferred[];\n checked?: CheckedPackage;\n}\n\nexport interface PackageSchema {\n version?: string;\n /** The default export's settings schema. */\n settings: unknown;\n /** Schemas per export, keyed by export name (multi-export packages). */\n exportSchemas?: Record<string, unknown>;\n /** Export names the package declares. */\n exports?: string[];\n}\n\nexport type SettingsSelection =\n | { ok: true; settings: unknown }\n | { ok: false; reason: string };\n\n/** A settings schema compiled once per package source, export and run. */\ntype CompiledSettings =\n | { ok: true; validate: ValidateFunction }\n | { ok: false; message: string };\n\nexport function createSettingsContext(configDir?: string): SettingsContext {\n return { configDir, cache: new Map(), compiled: new Map() };\n}\n\n/**\n * The settings schema for the export a step imports, by the same rule\n * simulate uses for dev examples: no export named takes `settings`; a\n * per-export map takes that export's entry and never another export's; a\n * package declaring at most one export takes `settings` for its only step\n * export; a multi-export package without a map, or a package that does not\n * publish its exports, cannot be checked.\n */\nexport function selectSettingsSchema(\n pkg: PackageSchema,\n packageLabel: string,\n exportName: string | undefined,\n): SettingsSelection {\n if (exportName === undefined) return { ok: true, settings: pkg.settings };\n if (pkg.exportSchemas) {\n const entry = Object.prototype.hasOwnProperty.call(\n pkg.exportSchemas,\n exportName,\n )\n ? pkg.exportSchemas[exportName]\n : undefined;\n if (!isObject(entry))\n return {\n ok: false,\n reason: `${packageLabel} has no export \"${exportName}\"`,\n };\n return { ok: true, settings: entry.settings };\n }\n if (pkg.exports && pkg.exports.length < 2)\n return { ok: true, settings: pkg.settings };\n return {\n ok: false,\n reason: `${packageLabel} predates per-export settings schemas; the step imports \"${exportName}\"`,\n };\n}\n\nconst SECTION_KIND: Record<EntrySection, ComponentKind> = {\n sources: 'source',\n transformers: 'transformer',\n destinations: 'destination',\n stores: 'store',\n};\n\n/** Segments of an Ajv instance path (a JSON pointer). */\nfunction pointerSegments(pointer: string): string[] {\n if (pointer === '') return [];\n return pointer\n .split('/')\n .slice(1)\n .map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'));\n}\n\nfunction valueAt(root: unknown, segments: string[]): unknown {\n let current = root;\n for (const segment of segments) {\n if (Array.isArray(current)) current = current[Number(segment)];\n else if (isObject(current)) current = current[segment];\n else return undefined;\n }\n return current;\n}\n\n// The bundler's deferred-$env marker grammar (see bundle/bundler.ts): a\n// default runs until whitespace, a quote or the next marker.\nconst MARKER = ENV_MARKER_PREFIX.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\nconst ENV_MARKER = new RegExp(\n `${MARKER}([a-zA-Z_][a-zA-Z0-9_]*)(?::((?:(?!${MARKER})[^\\\\s\"'])*))?`,\n 'g',\n);\n\ninterface PreparedSettings {\n value: unknown;\n /** Instance paths known only at runtime, with the reference as written. */\n deferred: Array<{ segments: string[]; reference: string }>;\n}\n\n/**\n * The placeholder rule, applied to settings already resolved by\n * `getFlowSettings(..., { deferred: true })`: `$var` and `$flow` values are\n * already resolved (an unresolvable one fails the flow first); `$env.NAME:default`\n * is checked as its default; `$env.NAME` without default, `$secret`, `$store`\n * and `$code` are known only at runtime and deferred.\n */\nfunction prepareSettings(settings: unknown): PreparedSettings {\n const deferred: PreparedSettings['deferred'] = [];\n const walk = (value: unknown, segments: string[]): unknown => {\n if (Array.isArray(value))\n return value.map((item, index) => walk(item, [...segments, `${index}`]));\n if (isObject(value))\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n walk(item, [...segments, key]),\n ]),\n );\n if (typeof value !== 'string') return value;\n\n if (value.startsWith(SECRET_MARKER_PREFIX)) {\n deferred.push({\n segments,\n reference: `$secret.${value.slice(SECRET_MARKER_PREFIX.length)}`,\n });\n return value;\n }\n if (value.includes(ENV_MARKER_PREFIX)) {\n let runtimeOnly = false;\n const withDefaults = value.replace(\n ENV_MARKER,\n (_match, _name: string, fallback: string | undefined) => {\n if (fallback === undefined) runtimeOnly = true;\n return fallback ?? '';\n },\n );\n if (!runtimeOnly) return withDefaults;\n deferred.push({\n segments,\n reference: value.replace(\n ENV_MARKER,\n (_match, name: string, fallback: string | undefined) =>\n fallback === undefined\n ? `$env.${name}`\n : `$env.${name}:${fallback}`,\n ),\n });\n return value;\n }\n if (REF_STORE.test(value) || value.startsWith(REF_CODE_PREFIX)) {\n deferred.push({ segments, reference: value });\n }\n return value;\n };\n return { value: walk(settings, []), deferred };\n}\n\nfunction isUnder(segments: string[], prefix: string[]): boolean {\n return prefix.every((segment, index) => segments[index] === segment);\n}\n\nasync function loadSchema(\n resolved: ResolvedStepPackage,\n context: SettingsContext,\n): Promise<PackageSchema> {\n const info = await readStepPackageInfo(resolved, {\n configDir: context.configDir,\n client: CLIENT_HEADER,\n });\n return {\n version: info.version,\n settings: info.schemas.settings,\n ...(info.exportSchemas ? { exportSchemas: info.exportSchemas } : {}),\n ...(info.exports ? { exports: Object.keys(info.exports) } : {}),\n };\n}\n\n/**\n * Compile a package's settings schema. A schema Ajv cannot compile (an\n * unknown keyword, a bad `$ref`) cannot be checked against, so it is a\n * failed compile the caller reports as a skip, never a crash of the run.\n */\nfunction compileSettings(settings: unknown): CompiledSettings | undefined {\n if (!isObject(settings)) return undefined;\n // Formats such as `uri` and `email` are not bundled with Ajv; ignore them\n // instead of failing to compile. Every structural keyword is still checked.\n const ajv = new Ajv({ allErrors: true, validateFormats: false });\n try {\n return { ok: true, validate: ajv.compile(settings) };\n } catch (error) {\n return { ok: false, message: getErrorMessage(error) };\n }\n}\n\nfunction sourceKey({ packageName, spec }: ResolvedStepPackage): string {\n return spec.path !== undefined\n ? `path:${spec.path}`\n : `${packageName}@${spec.version ?? 'latest'}`;\n}\n\nfunction cachedSchema(\n resolved: ResolvedStepPackage,\n context: SettingsContext,\n): Promise<PackageSchema> {\n const key = sourceKey(resolved);\n let pending = context.cache.get(key);\n if (!pending) {\n pending = loadSchema(resolved, context);\n context.cache.set(key, pending);\n }\n return pending;\n}\n\nfunction cachedCompile(\n resolved: ResolvedStepPackage,\n exportName: string | undefined,\n settings: unknown,\n context: SettingsContext,\n): CompiledSettings | undefined {\n const key = `${sourceKey(resolved)}#${exportName ?? ''}`;\n if (context.compiled.has(key)) return context.compiled.get(key);\n const compiled = compileSettings(settings);\n context.compiled.set(key, compiled);\n return compiled;\n}\n\n/**\n * Check one step's resolved `config.settings` against its package's\n * settings schema, at the version the bundle would install. Findings are\n * returned for the caller to report as errors or warnings; a check that\n * cannot run is a skip; values known only at runtime are deferred.\n */\nexport async function checkStepSettings(\n target: SettingsTarget,\n resolvedFlow: Flow,\n check: ValidateCheck,\n context: SettingsContext,\n): Promise<SettingsOutcome> {\n const at = `flows.${target.flow}.${target.section}.${target.key}`;\n const outcome: SettingsOutcome = { findings: [], skipped: [], deferred: [] };\n const spec =\n typeof target.entry.package === 'string' ? target.entry.package : '';\n if (!spec) {\n outcome.skipped.push({\n path: at,\n check,\n reason: 'No package field, so there is no settings schema to fetch',\n code: 'NO_PACKAGE',\n });\n return outcome;\n }\n\n // The package source the bundle would install for this step.\n let resolved: ResolvedStepPackage;\n try {\n resolved = resolveStepPackage(\n resolvedFlow,\n SECTION_KIND[target.section],\n target.key,\n LOGGER,\n );\n } catch (error) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Schema for ${spec} could not be loaded: ${getErrorMessage(error)}`,\n code: 'SCHEMA_UNAVAILABLE',\n });\n return outcome;\n }\n const { label } = resolved;\n const pinned =\n resolved.spec.path === undefined ? resolved.spec.version : undefined;\n\n let schema: PackageSchema;\n try {\n schema = await cachedSchema(resolved, context);\n } catch (error) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Schema for ${label}${pinned ? `@${pinned}` : ''} could not be loaded: ${getErrorMessage(error)}`,\n code: 'SCHEMA_UNAVAILABLE',\n });\n return outcome;\n }\n outcome.checked = {\n path: at,\n package: label,\n ...(schema.version ? { version: schema.version } : {}),\n };\n\n // The export the step imports, resolved as the bundler resolves it.\n const { exportName } = resolveExportName(\n resolved.normalizedFlow,\n SECTION_KIND[target.section],\n target.key,\n );\n const version = schema.version ?? pinned;\n const selection = selectSettingsSchema(\n schema,\n version ? `${label}@${version}` : label,\n exportName,\n );\n if (!selection.ok) {\n outcome.skipped.push({\n path: at,\n check,\n reason: selection.reason,\n code: 'NO_SETTINGS_SCHEMA',\n });\n return outcome;\n }\n\n const compiled = cachedCompile(\n resolved,\n exportName,\n selection.settings,\n context,\n );\n if (!compiled) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Package ${label} has no settings schema`,\n code: 'NO_SETTINGS_SCHEMA',\n });\n return outcome;\n }\n if (!compiled.ok) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `The settings schema of ${label} cannot be compiled: ${compiled.message}`,\n code: 'SCHEMA_UNAVAILABLE',\n });\n return outcome;\n }\n const validate = compiled.validate;\n\n const step = stepOf(resolvedFlow, target.section, target.key);\n const config = isObject(step?.config) ? step.config : {};\n const prepared = prepareSettings(config.settings ?? {});\n const base = `${at}.config.settings`;\n for (const { segments, reference } of prepared.deferred) {\n outcome.deferred.push({\n path: [base, ...segments].join('.'),\n reference,\n });\n }\n\n if (validate(prepared.value)) return outcome;\n\n for (const e of validate.errors || []) {\n const segments = pointerSegments(e.instancePath);\n if (prepared.deferred.some((d) => isUnder(segments, d.segments))) continue;\n const finding: ValidationError = {\n path: [base, ...segments].join('.'),\n message: describeAjvError(e),\n code: 'ENTRY_SCHEMA',\n keyword: e.keyword,\n };\n if (segments.length > 0) finding.value = valueAt(prepared.value, segments);\n outcome.findings.push(finding);\n }\n return outcome;\n}\n\n/** Ajv's message, naming the offending key where Ajv only reports it in params. */\nfunction describeAjvError(error: ErrorObject): string {\n const message = error.message || 'Unknown error';\n const extra: unknown = error.params.additionalProperty;\n return error.keyword === 'additionalProperties' && typeof extra === 'string'\n ? `${message}: \"${extra}\"`\n : message;\n}\n\nfunction stepOf(\n flow: Flow,\n section: EntrySection,\n key: string,\n): Flow.Step | undefined {\n switch (section) {\n case 'sources':\n return flow.sources?.[key];\n case 'destinations':\n return flow.destinations?.[key];\n case 'transformers':\n return flow.transformers?.[key];\n case 'stores':\n return flow.stores?.[key];\n }\n}\n","/**\n * The walkerOS metadata of a step's package, read from the source\n * resolveStepPackage picked: a local path from its walkerOS.json on disk,\n * any other package from the CDN at the pinned version. Every tool that has\n * a flow reads a step's package here, so all of them read the same source\n * the bundle installs.\n *\n * Node built-ins only: this module is reachable from the `dev` and\n * `validate` entries, which a server process loads without the bundler or\n * the package manager.\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { WalkerOSPackage } from '@walkeros/core';\nimport { fetchPackage, isObject, parseWalkerOSJson } from '@walkeros/core';\nimport type { ResolvedStepPackage } from './step-packages.js';\n\n/** A package's walkerOS.json content, plus the version read (absent for a local package whose package.json names none). */\nexport type StepPackageInfo = Omit<\n WalkerOSPackage,\n 'packageName' | 'version' | 'description'\n> & {\n version?: string;\n};\n\nfunction readJson(file: string): unknown {\n return JSON.parse(fs.readFileSync(file, 'utf-8'));\n}\n\n/**\n * Read the walkerOS metadata of a resolved step package. A local path\n * resolves against `configDir`; without one nothing is read from disk and\n * the read fails. `client` names the calling tool in the CDN request.\n */\nexport async function readStepPackageInfo(\n resolved: Pick<ResolvedStepPackage, 'packageName' | 'spec'>,\n options: { configDir?: string; client: string },\n): Promise<StepPackageInfo> {\n const { packageName, spec } = resolved;\n if (spec.path === undefined)\n return fetchPackage(packageName, {\n ...(spec.version ? { version: spec.version } : {}),\n client: options.client,\n });\n\n if (options.configDir === undefined)\n throw new Error(\n 'it is a local path package and the input is not a file, so there is no directory to read it from',\n );\n const root = path.isAbsolute(spec.path)\n ? spec.path\n : path.resolve(options.configDir, spec.path);\n const file = [\n path.join(root, 'dist', 'walkerOS.json'),\n path.join(root, 'walkerOS.json'),\n ].find((candidate) => fs.existsSync(candidate));\n if (!file) throw new Error(`no walkerOS.json under ${root}`);\n const meta = readJson(file);\n if (!isObject(meta)) throw new Error(`${file} is not a JSON object`);\n const pkgFile = path.join(root, 'package.json');\n const pkg = fs.existsSync(pkgFile) ? readJson(pkgFile) : undefined;\n const version =\n isObject(pkg) && typeof pkg.version === 'string' ? pkg.version : undefined;\n return { ...parseWalkerOSJson(meta), ...(version ? { version } : {}) };\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/mapping.ts\n\nimport { isObject } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport type {\n ValidateDetails,\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst { RuleSchema } = schemas.MappingSchemas;\n\nfunction isRule(value: unknown): boolean {\n return isObject(value) && RuleSchema.safeParse(value).success;\n}\n\n/**\n * The nested runtime shape: an entity key whose value maps actions to a rule\n * or a list of rules (`{ page: { view: { name: 'page_view' } } }`).\n */\nfunction isNestedActions(\n key: string,\n value: unknown,\n): value is Record<string, unknown> {\n if (key.includes(' ') || !isObject(value)) return false;\n const rules = Object.values(value);\n return (\n rules.length > 0 &&\n rules.every((rule) =>\n Array.isArray(rule)\n ? rule.length > 0 && rule.every(isRule)\n : isRule(rule),\n )\n );\n}\n\nexport function validateMapping(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: ValidateDetails = {};\n\n // Must be an object\n if (!isObject(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;\n const nestedPatterns: string[] = [];\n const flatPatterns: string[] = [];\n for (const [key, value] of Object.entries(mapping)) {\n if (isNestedActions(key, value)) {\n for (const action of Object.keys(value))\n nestedPatterns.push(`${key} ${action}`);\n } else {\n flatPatterns.push(key);\n }\n }\n const patterns = [...nestedPatterns, ...flatPatterns];\n details.eventPatterns = patterns;\n details.patternCount = patterns.length;\n\n // Validate each flat \"entity action\" pattern (legacy flat shape)\n flatPatterns.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 !== flatPatterns.length - 1) {\n warnings.push({\n path: '*',\n code: 'CATCH_ALL_NOT_LAST',\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 { describeScope, isFlowJson, resolveScope } from '../scope.js';\nimport type {\n ValidateDeferred,\n ValidateResult,\n ValidateSkip,\n ValidationError,\n} from '../types.js';\nimport { resolveFlow, type FlowResolution } from './resolve.js';\nimport {\n checkStepSettings,\n createSettingsContext,\n type CheckedPackage,\n} from './settings.js';\n\n/**\n * Validate an entry (source, destination, transformer or store) addressed by\n * `path` (`section.key` or `key`) against its package's published JSON\n * Schema, in every flow that has it, or only in `options.flow`. Settings are\n * checked as the flow resolves them (the placeholder rule); a flow that does\n * not resolve is an error and its entry check a skip.\n */\nexport async function validateEntry(\n path: string,\n flowConfig: unknown,\n options: { flow?: string; configDir?: string } = {},\n): Promise<ValidateResult> {\n const resolved = resolveScope(flowConfig, { flow: options.flow, path });\n const errors: ValidationError[] = [...resolved.errors];\n const skipped: ValidateSkip[] = [];\n const deferred: ValidateDeferred[] = [];\n const packages: CheckedPackage[] = [];\n const context = createSettingsContext(options.configDir);\n const file = isFlowJson(flowConfig) ? flowConfig : undefined;\n const resolutions = new Map<string, FlowResolution>();\n\n for (const target of resolved.entries) {\n const at = `flows.${target.flow}.${target.section}.${target.key}`;\n let resolution = resolutions.get(target.flow);\n if (!resolution && file) {\n resolution = resolveFlow(file, target.flow);\n resolutions.set(target.flow, resolution);\n if (!resolution.ok) errors.push(resolution.error);\n }\n if (!resolution?.ok) {\n skipped.push({\n path: at,\n check: 'entry:settings',\n reason: `flows.${target.flow} does not resolve, so its settings cannot be checked`,\n code: 'GATED_BY_ERRORS',\n });\n continue;\n }\n const outcome = await checkStepSettings(\n target,\n resolution.flow,\n 'entry:settings',\n context,\n );\n errors.push(...outcome.findings);\n skipped.push(...outcome.skipped);\n deferred.push(...outcome.deferred);\n if (outcome.checked) packages.push(outcome.checked);\n }\n\n return {\n valid: errors.length === 0,\n type: 'entry',\n errors,\n warnings: [],\n details: {\n scope: describeScope(resolved, ['entry:settings']),\n skipped,\n deferred,\n ...(packages.length > 0 ? { packages } : {}),\n },\n };\n}\n","// walkerOS/packages/cli/src/commands/validate/types.ts\n\nimport type {\n ValidateResult as CoreValidateResult,\n ValidationError as CoreValidationError,\n ValidationType,\n ValidationWarning as CoreValidationWarning,\n} from '@walkeros/core/dev';\n\n// Base result types are declared in @walkeros/core/dev beside\n// validateFlowStructure, so consumers can type its return without the CLI.\n// The CLI narrows them: every code comes from VALIDATE_CODES, and the\n// details carry the scope, skips and deferred values of the run.\nexport type { ValidateResultType, ValidationType } from '@walkeros/core/dev';\n\n/**\n * Every code an error, warning or skip of `validate` can carry. Agents and\n * tests branch on these, never on message text.\n */\nexport const VALIDATE_CODES = [\n // Input and options\n 'INPUT_ERROR',\n 'SERIALIZATION_ERROR',\n 'OPTION_NOT_APPLICABLE',\n // Scope (--flow, --path)\n 'FLOW_NOT_FOUND',\n 'ENTRY_NOT_FOUND',\n 'AMBIGUOUS_ENTRY',\n 'UNSUPPORTED_SECTION',\n 'INVALID_PATH',\n // Flow file\n 'SCHEMA_VALIDATION',\n 'CONFIG_WARNING',\n 'EMPTY_FLOWS',\n 'UNKNOWN_KEY',\n 'CONFLICT',\n 'MISSING_PACKAGE',\n 'OBSOLETE_CODE_STRING',\n 'INVALID_IMPORT',\n 'INVALID_CODE_SHAPE',\n 'PACKAGE_VERSION_MISSING',\n 'DEPRECATED_PACKAGE',\n 'UNKNOWN_ROUTE_TARGET',\n 'ROUTE_DEAD_CODE',\n 'ROUTE_EMPTY_MANY',\n 'ROUTE_SINGLE_MANY',\n 'ROUTE_FIRST_MATCH',\n 'INCOMPATIBLE_EXAMPLES',\n 'EXAMPLES_INCOMPLETE',\n 'CONTRACT_VIOLATION',\n 'MAPPING_DOT_KEY',\n 'FLOW_REF_WARNING',\n 'WEB_LOGGER_FORMAT',\n 'FLOW_CYCLE',\n 'VAR_CYCLE',\n // Structure (the bundler's own preflight, validateFlowStructure)\n 'INVALID_COMPONENT_NAME',\n 'INVALID_REFERENCE',\n 'STORE_REFERENCE_NOT_FOUND',\n 'STATE_STORE_UNKNOWN',\n 'STATE_STORE_FILE',\n 'MAPPING_NO_OP',\n 'MAPPING_VALUE_NO_OPERATOR',\n 'MAPPING_VALUE_PRODUCERS',\n 'BATCH_WITHOUT_PUSH_BATCH',\n 'MALFORMED_REFERENCE',\n // Resolution (getFlowSettings, as the bundler resolves the flow)\n 'UNRESOLVED_REFERENCE',\n 'MISSING_ENV',\n 'WEB_SECRET_REF',\n 'UNRESOLVED_CONTRACT',\n // Entry settings against the package schema\n 'ENTRY_SCHEMA',\n // Contract\n 'NO_CONTRACT_SECTION',\n 'INVALID_CONTRACT',\n 'FLAT_CONTRACT_SHAPE',\n 'INVALID_CONTRACT_ENTRY',\n 'UNKNOWN_CONTRACT_KEY',\n 'INVALID_TAGGING',\n 'INVALID_SCHEMA',\n 'INVALID_EXTENDS',\n 'INVALID_EVENTS',\n 'CIRCULAR_EXTENDS',\n 'INVALID_ENTITY_KEY',\n 'INVALID_ENTITY',\n 'INVALID_ACTION_KEY',\n 'INVALID_SCHEMA_ENTRY',\n // Event\n 'NOT_AN_OBJECT',\n 'MISSING_EVENT_NAME',\n 'EMPTY_EVENT_NAME',\n 'INVALID_EVENT_NAME',\n // Mapping\n 'INVALID_MAPPING_TYPE',\n 'INVALID_EVENT_PATTERN',\n 'INVALID_RULE_TYPE',\n 'CATCH_ALL_NOT_LAST',\n // Skips (details.skipped[].code)\n 'GATED_BY_ERRORS',\n 'CONTRACT_NOT_STATIC',\n 'NO_PACKAGE',\n 'NO_SETTINGS_SCHEMA',\n 'SCHEMA_UNAVAILABLE',\n] as const;\n\nexport type ValidateCode = (typeof VALIDATE_CODES)[number];\n\n/** Codes that mean validate could not run as asked (CLI exit 3). */\nexport const USAGE_CODES: readonly ValidateCode[] = ['OPTION_NOT_APPLICABLE'];\n\n/**\n * Named checks a run includes (`details.scope.checks`). `file:` checks run\n * on the whole file whatever `--flow` says; `flow:` checks run per flow in\n * scope; `entry:` checks run per entry `--path` addressed.\n */\nexport type ValidateCheck =\n | 'file:schema'\n | 'file:contract'\n | 'flow:schema'\n | 'flow:steps'\n | 'flow:structure'\n | 'flow:package-versions'\n | 'flow:routes'\n | 'flow:examples'\n | 'flow:contract-examples'\n | 'flow:mapping-keys'\n | 'flow:resolve'\n | 'flow:package-settings'\n | 'entry:settings'\n | 'contract'\n | 'event'\n | 'mapping';\n\nexport interface ValidateScopeEntry {\n /** Section of the addressed entry, when the path or the match names one. */\n section?: string;\n key: string;\n /** Flows that have the entry and were checked. */\n flows: string[];\n /** Flows searched for the entry. */\n searchedFlows: string[];\n}\n\n/** What a run covered (C6). */\nexport interface ValidateScope {\n flows: string[];\n entry?: ValidateScopeEntry;\n checks: ValidateCheck[];\n /** Set when `offline` removed the package settings check from `checks`. */\n offline?: true;\n}\n\n/** A check the scope includes that did not run (C5). */\nexport interface ValidateSkip {\n path: string;\n check: ValidateCheck;\n reason: string;\n code: ValidateCode;\n}\n\n/** A value known only at runtime, not schema-checked (info, not a skip). */\nexport interface ValidateDeferred {\n path: string;\n reference: string;\n}\n\nexport interface ValidateDetails {\n scope?: ValidateScope;\n skipped?: ValidateSkip[];\n deferred?: ValidateDeferred[];\n [key: string]: unknown;\n}\n\n// `code` stays core's `string` for consumers; validate emits only\n// ValidateCode values.\nexport interface ValidationError extends CoreValidationError {\n /** The JSON Schema keyword of an ENTRY_SCHEMA error. */\n keyword?: string;\n}\n\nexport interface ValidationWarning extends CoreValidationWarning {\n keyword?: string;\n}\n\nexport interface ValidateResult extends CoreValidateResult {\n errors: ValidationError[];\n warnings: ValidationWarning[];\n details: ValidateDetails;\n}\n\nexport interface ValidateCommandOptions {\n type: ValidationType;\n input?: string;\n output?: string;\n flow?: string; // Flow name for multi-flow configs\n path?: string; // Entry path for dot-notation validation (e.g., \"destinations.snowplow\")\n json?: boolean;\n verbose?: boolean;\n strict?: boolean;\n /** Skip every package settings check (no network); named in the scope. */\n offline?: boolean;\n silent?: boolean;\n}\n","import { z } from 'zod';\nimport { handleCliError } from '../../core/api-error.js';\nimport { appErrorMessage, appFetch } from '../../core/app-fetch.js';\nimport { APP_PATHS } from '../../core/app-paths.js';\nimport { resolveAccessToken } from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\nimport { NOT_SIGNED_IN } from '../api/index.js';\n\n// === Programmatic API ===\n\n/** The parsed JSON body, or null when the body is not JSON. */\nasync function readJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return null;\n }\n}\n\n/** Who the current credential belongs to, as the app answers it. */\nexport async function whoami(): Promise<unknown> {\n const token = resolveAccessToken();\n if (!token) throw new Error(NOT_SIGNED_IN);\n const response = await appFetch(APP_PATHS.whoami, { token });\n const body = await readJson(response);\n if (!response.ok)\n throw new Error(appErrorMessage(body) ?? `HTTP ${response.status}`);\n return body;\n}\n\n// === CLI Command Handler ===\n\nconst IdentitySchema = z.object({\n email: z.string().optional(),\n userId: z.string().optional(),\n});\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 identity = IdentitySchema.safeParse(result);\n if (!identity.success) {\n logger.info(JSON.stringify(result));\n return;\n }\n const data = identity.data;\n if (data.email) logger.info(data.email);\n if (data.userId) logger.info(`User: ${data.userId}`);\n }\n } catch (error) {\n handleCliError(error);\n }\n}\n","export interface ApiErrorDetail {\n path: string;\n message: string;\n}\n\nexport interface ApiErrorOptions {\n code?: string;\n details?: ApiErrorDetail[];\n // HTTP status of the failed response, when known.\n status?: number;\n // True when the failure is worth retrying (e.g. 429 / 503 with Retry-After).\n retryable?: boolean;\n // Seconds to wait before retrying, parsed from the Retry-After header.\n retryAfterSeconds?: number;\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\n// Exit code for a retryable failure (e.g. rate limited). Distinct from the\n// generic failure (1) and upgrade-required (2) so CI can branch on it.\n// Mirrors the BSD sysexits.h EX_TEMPFAIL convention.\nexport const EXIT_RETRYABLE = 75;\n\nexport class ApiError extends Error {\n code?: string;\n details?: ApiErrorDetail[];\n status?: number;\n retryable?: boolean;\n retryAfterSeconds?: number;\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.status = options?.status;\n this.retryable = options?.retryable;\n this.retryAfterSeconds = options?.retryAfterSeconds;\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 * Emit a stable, parseable machine-readable error line so CI can branch on\n * the failure without string-matching prose. Format:\n *\n * error: code=<CODE> retryable=<bool>[ retryAfter=<seconds>] message=<text>\n *\n * `code` is `UNKNOWN` for non-ApiError failures. The line always starts with\n * `error: code=` and the human-readable message comes last.\n */\nfunction machineReadableErrorLine(err: unknown): string {\n const code = err instanceof ApiError ? (err.code ?? 'UNKNOWN') : 'UNKNOWN';\n const retryable = err instanceof ApiError ? err.retryable === true : false;\n const retryAfter =\n err instanceof ApiError && err.retryAfterSeconds !== undefined\n ? ` retryAfter=${err.retryAfterSeconds}`\n : '';\n const message = err instanceof Error ? err.message : String(err);\n return `error: code=${code} retryable=${retryable}${retryAfter} message=${message}`;\n}\n\n/**\n * Pretty-print an error and exit. Always prints a machine-readable code line\n * first (see `machineReadableErrorLine`). Recognises `ApiError` with\n * `code === 'CLIENT_OUTDATED'` as a dedicated upgrade-required path\n * (exit code 2) and prints the upgrade and docs links. Retryable failures\n * (e.g. rate limited) exit with `EXIT_RETRYABLE` (75). Everything else\n * exits 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 console.error(machineReadableErrorLine(err));\n\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\n if (err instanceof ApiError && err.retryable) {\n const hint =\n err.retryAfterSeconds !== undefined\n ? ` Retry after ${err.retryAfterSeconds}s.`\n : ' This is temporary, retry shortly.';\n console.error(`${err.message}${hint}`);\n process.exit(EXIT_RETRYABLE);\n }\n\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n /* eslint-enable no-console */\n}\n","import { z } from 'zod';\nimport { resolveAppUrl } from '../lib/config-file.js';\nimport { requireSecureUrl } from '../lib/secure-url.js';\nimport { clientContextHeaders } from './client-context.js';\n\nexport interface AppFetchInit {\n method?: string;\n /** The app, default `resolveAppUrl()`; trailing slashes are trimmed. */\n baseUrl?: string;\n /** Sent as `Authorization: Bearer <token>` unless the caller set Authorization. */\n token?: string | null;\n headers?: Readonly<Record<string, string>>;\n body?: string;\n signal?: AbortSignal;\n redirect?: RequestRedirect;\n fetch?: typeof fetch;\n}\n\nconst AppErrorSchema = z.object({\n error: z.object({ message: z.string().min(1) }),\n});\n\n/** The message of the app's error envelope `{ error: { message } }`, or undefined. */\nexport function appErrorMessage(body: unknown): string | undefined {\n const parsed = AppErrorSchema.safeParse(body);\n return parsed.success ? parsed.data.error.message : undefined;\n}\n\n/**\n * Call the walkerOS app. Every request carries the client-context headers\n * (`User-Agent`, `X-WalkerOS-Client`, `X-WalkerOS-Client-Version`); caller\n * headers win over them; a request carrying Authorization goes only to a\n * secure URL (`requireSecureUrl`). `path` starts with `/` and may carry a query.\n */\nexport async function appFetch(\n path: string,\n init: AppFetchInit = {},\n): Promise<Response> {\n const url = `${(init.baseUrl ?? resolveAppUrl()).replace(/\\/+$/, '')}${path}`;\n const headers = new Headers(clientContextHeaders());\n for (const [name, value] of Object.entries(init.headers ?? {}))\n headers.set(name, value);\n if (init.token && !headers.has('Authorization'))\n headers.set('Authorization', `Bearer ${init.token}`);\n if (headers.has('Authorization')) requireSecureUrl(url);\n const request: RequestInit = { headers };\n if (init.method && init.method !== 'GET') request.method = init.method;\n if (init.body !== undefined) request.body = init.body;\n if (init.signal) request.signal = init.signal;\n if (init.redirect) request.redirect = init.redirect;\n return (init.fetch ?? fetch)(url, request);\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n chmodSync,\n renameSync,\n} from 'fs';\nimport { randomBytes } from 'crypto';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\n/**\n * The CLI's own settings. It holds no credential: the CLI authenticates with\n * WALKEROS_TOKEN only, and sign-in fields an older CLI left in the file are\n * never read.\n */\nexport interface WalkerOSConfig {\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 * Replace the config file wholesale, atomically and with 0600 permissions.\n *\n * A reader that catches the file mid-write would see truncated JSON and treat\n * the file as missing, so the content is written to a temp file and renamed,\n * which is atomic within a directory.\n *\n * The temp path is unique per write. Nothing locks the file, so two writers\n * (two `telemetry` commands, say) can be in here at once: on one shared name\n * they would write over each other's temp file and rename it twice, and the\n * slower one would fail outright when the faster renamed the file out from\n * under its `chmod`.\n */\nfunction replaceConfigFile(config: WalkerOSConfig): void {\n const dir = getConfigDir();\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n\n const configPath = getConfigPath();\n const tempPath = `${configPath}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`;\n try {\n writeFileSync(tempPath, JSON.stringify(config, null, 2), { mode: 0o600 });\n // `writeFileSync`'s mode is masked by the process umask, so it alone does\n // not guarantee 0600 on the file the rename puts in place.\n chmodSync(tempPath, 0o600);\n renameSync(tempPath, configPath);\n } catch (error) {\n // A unique name is never reused, so a temp left behind by a failure would\n // sit in the config directory forever.\n try {\n unlinkSync(tempPath);\n } catch {\n // Never created, or already renamed into place.\n }\n throw error;\n }\n}\n\n/**\n * Merge `config` into the stored config and write the result.\n *\n * Merging rather than replacing, because the file holds fields owned by\n * unrelated commands: a writer that knows only about telemetry would otherwise\n * drop `appUrl`, `defaultProjectId` and `anonymousFeedback`.\n *\n * A key passed explicitly as `undefined` is removed from the written file.\n */\nexport function writeConfig(config: WalkerOSConfig): void {\n replaceConfigFile({ ...(readConfig() ?? {}), ...config });\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 writeConfig(partial);\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","/**\n * Whether a host is the local machine.\n *\n * Loopback traffic never reaches a network segment, so there is nobody in the\n * path to read a token off it. RFC 8252 section 8.3 and OAuth 2.1 both carve\n * out exactly this case, and `http://localhost:3000` is the documented\n * walkerOS development flow.\n */\nfunction isLoopback(hostname: string): boolean {\n // `URL` lowercases the hostname and keeps the brackets on an IPv6 literal.\n return (\n hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '[::1]'\n );\n}\n\n/**\n * Refuse a URL that would carry a walkerOS credential in the clear.\n *\n * Every bearer the CLI holds (session, refresh, deploy) is sent to whatever\n * host the app URL names, and that string is user-settable: `WALKEROS_APP_URL`,\n * the config file, and `--url` all feed it. Over plain http to a remote host,\n * anything on the path reads the token.\n *\n * Applied where a credential is ATTACHED, never inside `resolveAppUrl`. That\n * resolver is the tempting single funnel, but it also feeds the paths that\n * merely REPORT the target: telemetry resolves it under a top-level await\n * with no `try`, and diagnostics and the health probe exist to NAME a bad\n * app URL. A resolver that throws poisons the error reporting.\n *\n * Returns the URL, so a caller can pass its value straight through. A string\n * that is not a URL at all is returned untouched: it fails at the request\n * itself, and inferring a scheme for it would only hide that.\n */\nexport function requireSecureUrl(url: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return url;\n }\n\n if (parsed.protocol !== 'http:' || isLoopback(parsed.hostname)) return url;\n\n throw new Error(\n `Refusing to send walkerOS credentials over plain http to ${url}. ` +\n 'Use https, or localhost / 127.0.0.1 / [::1] for local development.',\n );\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 and the MCP server calls it on boot.\n * The `WALKEROS_CLIENT_TYPE` env var overrides the resolved type (env wins\n * 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.\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","/**\n * The app operations the CLI itself calls: identity, health, telemetry and\n * the public API document. The app keeps every one in its public API set, so\n * its change rule protects them. The only file in the CLI that names an app\n * path; `walkeros api` takes its path from the person.\n */\nexport const APP_PATHS = {\n whoami: '/api/auth/whoami',\n health: '/api/health',\n telemetry: '/api/telemetry',\n openapi: '/api/openapi.json',\n} as const;\n","import { once } from 'node:events';\nimport { readFile } from 'node:fs/promises';\nimport type { Command, CommanderError } from 'commander';\nimport { z } from 'zod';\nimport { appErrorMessage, appFetch } from '../../core/app-fetch.js';\nimport { APP_PATHS } from '../../core/app-paths.js';\nimport { resolveAccessToken } from '../../core/auth.js';\nimport { fetchFailureReason } from '../../core/fetch-failure.js';\nimport { readStdin } from '../../core/stdin.js';\nimport { resolveAppUrl } from '../../lib/config-file.js';\nimport { requireSecureUrl } from '../../lib/secure-url.js';\n\n/**\n * `walkeros api <METHOD> <path>`: one authenticated request to the walkerOS\n * app, its answer copied to stdout as it arrives. The CLI knows no operation\n * of the app beyond its own fixed ones; the person names the path.\n */\n\nexport const EXIT = {\n ok: 0,\n http: 1,\n usage: 2,\n auth: 3,\n unreachable: 4,\n} as const;\nexport type ApiExit = (typeof EXIT)[keyof typeof EXIT];\n\nexport interface ApiCommandIO {\n stdout: NodeJS.WritableStream;\n stderr: NodeJS.WritableStream;\n stdin: NodeJS.ReadableStream;\n}\n\nexport interface ApiRequestOptions {\n method: string;\n /** Starts with `/`; query parameters ride in it. */\n path: string;\n /** `'<json>'`, `'@file.json'` or `'-'` (stdin). */\n data?: string;\n /** Each `'Name: value'`; repeatable. */\n header: string[];\n /** Fills `{projectId}`; falls back to WALKEROS_PROJECT_ID. */\n project?: string;\n yes?: boolean;\n}\n\n/** Shown when there is no credential to send. */\nexport const NOT_SIGNED_IN =\n 'no token: set WALKEROS_TOKEN to a token from Account > Automation tokens in the walkerOS app';\n\nconst METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);\n/** Error bodies are read back for the stderr line; a bigger one is not parsed. */\nconst ERROR_BODY_LIMIT = 64 * 1024;\n\nclass UsageError extends Error {}\n\nfunction defaultIO(): ApiCommandIO {\n return {\n stdout: process.stdout,\n stderr: process.stderr,\n stdin: process.stdin,\n };\n}\n\nfunction line(out: NodeJS.WritableStream, text: string): void {\n out.write(`walkeros api: ${text}\\n`);\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction parseJson(text: string): unknown {\n try {\n const value: unknown = JSON.parse(text);\n return value;\n } catch {\n return undefined;\n }\n}\n\n/** The origin of a URL for a message, or the URL itself when it is not one. */\nfunction originOf(url: string): string {\n try {\n return new URL(url).origin;\n } catch {\n return url;\n }\n}\n\nfunction fillPath(path: string, project: string | undefined): string {\n if (!path.startsWith('/'))\n throw new UsageError(`the path must start with /: ${path}`);\n let filled = path;\n if (filled.includes('{projectId}')) {\n if (!project)\n throw new UsageError(\n '{projectId} needs --project or WALKEROS_PROJECT_ID',\n );\n filled = filled.split('{projectId}').join(encodeURIComponent(project));\n }\n const left = /\\{[^}]+\\}/.exec(filled);\n if (left) throw new UsageError(`fill ${left[0]} in the path`);\n return filled;\n}\n\nfunction parseHeaders(values: readonly string[]): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const value of values) {\n const colon = value.indexOf(':');\n if (colon <= 0) throw new UsageError(`a header is 'Name: value': ${value}`);\n const name = value.slice(0, colon).trim();\n if (name.toLowerCase() === 'authorization')\n throw new UsageError(\n 'set the token with WALKEROS_TOKEN, not with an Authorization header',\n );\n headers[name] = value.slice(colon + 1).trim();\n }\n return headers;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n const lower = name.toLowerCase();\n return Object.keys(headers).some((key) => key.toLowerCase() === lower);\n}\n\n/** The body as given: the argument, a file's content, or stdin. */\nasync function readData(\n data: string,\n stdin: NodeJS.ReadableStream,\n): Promise<string> {\n if (data === '-') {\n try {\n return await readStdin(stdin);\n } catch (error) {\n throw new UsageError(`--data -: ${messageOf(error)}`);\n }\n }\n if (data.startsWith('@')) {\n const file = data.slice(1);\n try {\n return await readFile(file, 'utf-8');\n } catch (error) {\n throw new UsageError(\n `cannot read the --data file ${file}: ${messageOf(error)}`,\n );\n }\n }\n return data;\n}\n\ninterface PreparedRequest {\n method: string;\n path: string;\n headers: Record<string, string>;\n body?: string;\n}\n\n/** Every usage check, in order, before anything is resolved or sent. */\nasync function prepare(\n options: ApiRequestOptions,\n stdin: NodeJS.ReadableStream,\n): Promise<PreparedRequest> {\n const method = options.method.toUpperCase();\n if (!METHODS.has(method))\n throw new UsageError(\n `unknown method ${options.method}: use GET, POST, PUT, PATCH or DELETE`,\n );\n if (method === 'DELETE' && !options.yes)\n throw new UsageError('DELETE needs --yes');\n if (method === 'GET' && options.data !== undefined)\n throw new UsageError('GET takes no --data');\n const path = fillPath(\n options.path,\n options.project || process.env.WALKEROS_PROJECT_ID,\n );\n const headers = parseHeaders(options.header);\n if (options.data === undefined) return { method, path, headers };\n const body = await readData(options.data, stdin);\n if (!hasHeader(headers, 'Content-Type'))\n headers['Content-Type'] = 'application/json';\n return { method, path, headers, body };\n}\n\n/** Copy the answer to stdout as it arrives; keep an error body for the stderr line. */\nasync function relay(response: Response, io: ApiCommandIO): Promise<ApiExit> {\n const kept: Uint8Array[] = [];\n let keptBytes = 0;\n try {\n const reader = response.body?.getReader();\n for (;;) {\n if (!reader) break;\n const { done, value } = await reader.read();\n if (done) break;\n if (!io.stdout.write(value)) await once(io.stdout, 'drain');\n if (!response.ok && keptBytes < ERROR_BODY_LIMIT) {\n kept.push(value);\n keptBytes += value.byteLength;\n }\n }\n } catch (error) {\n line(\n io.stderr,\n `the connection broke while reading the answer: ${fetchFailureReason(error)}`,\n );\n return EXIT.unreachable;\n }\n if (response.ok) return EXIT.ok;\n const message = appErrorMessage(\n parseJson(Buffer.concat(kept).toString('utf-8')),\n );\n line(\n io.stderr,\n `HTTP ${response.status} ${response.statusText}`.trimEnd() +\n (message ? `: ${message}` : ''),\n );\n return response.status === 401 ? EXIT.auth : EXIT.http;\n}\n\n/**\n * Send one request to the app and print its answer. Exit 0 for 2xx, 1 for any\n * other status, 2 for a usage error (nothing sent), 3 without a credential or\n * on 401, 4 when the app cannot be reached or the answer breaks off.\n */\nexport async function runApi(\n options: ApiRequestOptions,\n io: ApiCommandIO = defaultIO(),\n): Promise<ApiExit> {\n let request: PreparedRequest;\n try {\n request = await prepare(options, io.stdin);\n } catch (error) {\n if (!(error instanceof UsageError)) throw error;\n line(io.stderr, error.message);\n return EXIT.usage;\n }\n\n const token = resolveAccessToken();\n if (!token) {\n line(io.stderr, NOT_SIGNED_IN);\n return EXIT.auth;\n }\n\n const appUrl = resolveAppUrl();\n try {\n requireSecureUrl(`${appUrl.replace(/\\/+$/, '')}${request.path}`);\n } catch (error) {\n line(io.stderr, messageOf(error));\n return EXIT.usage;\n }\n\n let response: Response;\n try {\n response = await appFetch(request.path, {\n method: request.method,\n baseUrl: appUrl,\n token,\n headers: request.headers,\n body: request.body,\n });\n } catch (error) {\n line(\n io.stderr,\n `could not reach ${originOf(appUrl)}: ${fetchFailureReason(error)}`,\n );\n return EXIT.unreachable;\n }\n return relay(response, io);\n}\n\nexport interface ApiOperation {\n /** Upper case. */\n method: string;\n path: string;\n summary?: string;\n description?: string;\n parameters?: unknown[];\n requestBody?: unknown;\n responses?: Record<string, unknown>;\n}\n\nexport interface ApiListOptions {\n filter?: string;\n json?: boolean;\n}\n\nconst OPERATION_METHODS = [\n 'get',\n 'put',\n 'post',\n 'delete',\n 'patch',\n 'head',\n 'options',\n] as const;\n\nconst DocumentSchema = z.object({\n paths: z.record(z.string(), z.record(z.string(), z.unknown())),\n components: z\n .record(z.string(), z.record(z.string(), z.unknown()))\n .optional(),\n});\n\nconst OperationSchema = z.object({\n summary: z.string().optional(),\n description: z.string().optional(),\n parameters: z.array(z.unknown()).optional(),\n requestBody: z.unknown().optional(),\n responses: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst COMPONENT_REF = /^#\\/components\\/([^/]+)\\/([^/]+)$/;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Every operation of an OpenAPI document, sorted by path, then method. */\nexport function listOperations(document: unknown): ApiOperation[] {\n const parsed = DocumentSchema.safeParse(document);\n if (!parsed.success) return [];\n const operations: ApiOperation[] = [];\n for (const [path, item] of Object.entries(parsed.data.paths)) {\n for (const method of OPERATION_METHODS) {\n if (!(method in item)) continue;\n const operation = OperationSchema.safeParse(item[method]);\n if (!operation.success) continue;\n operations.push({\n method: method.toUpperCase(),\n path,\n ...operation.data,\n });\n }\n }\n const order = (a: string, b: string): number => (a < b ? -1 : a > b ? 1 : 0);\n return operations.sort(\n (a, b) => order(a.path, b.path) || order(a.method, b.method),\n );\n}\n\n/** Operations whose `METHOD /path summary` contains the filter, case-insensitive. */\nexport function filterOperations(\n operations: ApiOperation[],\n filter?: string,\n): ApiOperation[] {\n if (!filter) return operations;\n const needle = filter.toLowerCase();\n return operations.filter((operation) =>\n `${operation.method} ${operation.path} ${operation.summary ?? ''}`\n .toLowerCase()\n .includes(needle),\n );\n}\n\n/** The components the operations reference (`#/components/<kind>/<name>`), followed transitively. */\nexport function referencedComponents(\n document: unknown,\n operations: ApiOperation[],\n): Record<string, Record<string, unknown>> {\n const parsed = DocumentSchema.safeParse(document);\n const available = (parsed.success && parsed.data.components) || {};\n const found: Record<string, Record<string, unknown>> = {};\n const visited = new Set<string>();\n const queue: unknown[] = [...operations];\n for (let index = 0; index < queue.length; index += 1) {\n const value = queue[index];\n if (Array.isArray(value)) {\n queue.push(...value);\n continue;\n }\n if (!isRecord(value)) continue;\n for (const [key, child] of Object.entries(value)) {\n if (key !== '$ref' || typeof child !== 'string') {\n queue.push(child);\n continue;\n }\n const match = COMPONENT_REF.exec(child);\n if (!match || visited.has(child)) continue;\n visited.add(child);\n const [, kind, name] = match;\n const component = available[kind]?.[name];\n if (component === undefined) continue;\n found[kind] = { ...found[kind], [name]: component };\n queue.push(component);\n }\n }\n return found;\n}\n\nfunction formatOperation(operation: ApiOperation): string {\n const summary = operation.summary ? ` ${operation.summary}` : '';\n return `${operation.method.padEnd(6)} ${operation.path}${summary}`;\n}\n\n/**\n * List the operations of the app's live public API document. Exit 0 (also\n * when nothing matches), 1 for a non-2xx answer or a body that is not an\n * OpenAPI document, 4 when the app cannot be reached.\n */\nexport async function runApiList(\n options: ApiListOptions,\n io: Pick<ApiCommandIO, 'stdout' | 'stderr'> = defaultIO(),\n): Promise<ApiExit> {\n const appUrl = resolveAppUrl();\n let text: string;\n try {\n const response = await appFetch(APP_PATHS.openapi, { baseUrl: appUrl });\n if (!response.ok) {\n line(\n io.stderr,\n `HTTP ${response.status} ${response.statusText}`.trimEnd() +\n ` for ${APP_PATHS.openapi}`,\n );\n return EXIT.http;\n }\n text = await response.text();\n } catch (error) {\n line(\n io.stderr,\n `could not reach ${originOf(appUrl)}: ${fetchFailureReason(error)}`,\n );\n return EXIT.unreachable;\n }\n\n const document = parseJson(text);\n if (!DocumentSchema.safeParse(document).success) {\n line(io.stderr, 'the answer is not an OpenAPI document (no paths)');\n return EXIT.http;\n }\n\n const operations = filterOperations(listOperations(document), options.filter);\n if (operations.length === 0) {\n line(io.stderr, `no operation matches \"${options.filter ?? ''}\"`);\n return EXIT.ok;\n }\n\n io.stdout.write(\n options.json\n ? JSON.stringify(\n {\n operations,\n components: referencedComponents(document, operations),\n },\n null,\n 2,\n ) + '\\n'\n : operations\n .map((operation) => formatOperation(operation) + '\\n')\n .join(''),\n );\n return EXIT.ok;\n}\n\nconst OptionsSchema = z.object({\n data: z.string().optional(),\n header: z.array(z.string()).default([]),\n project: z.string().optional(),\n yes: z.boolean().optional(),\n});\n\nconst collect = (value: string, previous: string[]): string[] => [\n ...previous,\n value,\n];\n\nexport function registerApiCommand(\n program: Command,\n exit: (code: number) => never = (code) => process.exit(code),\n): void {\n const usageExit = (error: CommanderError): never =>\n exit(error.exitCode === 0 ? 0 : EXIT.usage);\n const api = program\n .command('api')\n .description(\n 'Send an authenticated request to the walkerOS app API and print the answer as it arrives',\n )\n .argument('<method>', 'GET, POST, PUT, PATCH or DELETE')\n .argument(\n '<path>',\n 'the API path with its query, for example /api/projects/{projectId}/flows',\n )\n .option(\n '-d, --data <body>',\n 'request body: JSON, @file.json, or - for stdin',\n )\n .option(\n '-H, --header <header>',\n \"extra header 'Name: value' (repeatable)\",\n collect,\n [],\n )\n .option(\n '-p, --project <id>',\n 'fills {projectId} (default: WALKEROS_PROJECT_ID)',\n )\n .option('-y, --yes', 'confirm a DELETE')\n .exitOverride(usageExit)\n .action(async (method: string, path: string, raw: unknown) => {\n const options = OptionsSchema.parse(raw);\n process.exitCode = await runApi({ method, path, ...options });\n });\n\n api\n .command('ls [filter]')\n .description(\n 'List the public API operations from the live OpenAPI document of the app',\n )\n .option('--json', 'print each operation with its parameters and schemas')\n .exitOverride(usageExit)\n .action(async (filter: string | undefined, raw: unknown) => {\n const { json } = z.object({ json: z.boolean().optional() }).parse(raw);\n process.exitCode = await runApiList({ filter, json });\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","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","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 { validateCommand } from './commands/validate/index.js';\nexport { whoamiCommand } from './commands/auth/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 { buildDataPayload } from './commands/bundle/bundler.js';\nexport {\n classifyStepProperties,\n containsCodeMarkers,\n} from './commands/bundle/config-classifier.js';\nexport { validateFlowStructure } from '@walkeros/core/dev';\nexport { wrapSkeleton } from './commands/bundle/wrap.js';\nexport {\n runBuildManifest,\n resolveManifestSource,\n BUILD_MANIFEST_ENV,\n} from './commands/bundle/manifest.js';\nexport type { RunBuildManifestResult } from './commands/bundle/manifest.js';\nexport {\n BUILD_MANIFEST_VERSION,\n BUILD_ERROR_CODES,\n BuildManifestSchema,\n BuildArtifactSchema,\n BuildBundleArtifactSchema,\n BuildWrapArtifactSchema,\n BuildWrapOptionsSchema,\n BuildResultSchema,\n} from './schemas/build-manifest.js';\nexport type {\n BuildManifest,\n BuildArtifact,\n BuildWrapOptions,\n BuildResult,\n BuildErrorCode,\n} from './schemas/build-manifest.js';\nexport type { WrapSkeletonOptions } from './commands/bundle/wrap.js';\nexport {\n push,\n simulateSource,\n simulateTransformer,\n simulateDestination,\n simulateCollector,\n formatPushResult,\n} from './commands/push/index.js';\nexport type {\n SimulateDataOptions,\n SimulateSourceOptions,\n SimulateTransformerOptions,\n SimulateDestinationOptions,\n SimulateCollectorOptions,\n} from './commands/push/index.js';\nexport { validate } from './commands/validate/index.js';\nexport { resolveAccessToken } from './core/auth.js';\nexport { ApiError } 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 { appFetch, appErrorMessage } from './core/app-fetch.js';\nexport type { AppFetchInit } from './core/app-fetch.js';\nexport { APP_PATHS } from './core/app-paths.js';\nexport { whoami } from './commands/auth/index.js';\nexport { readConfig, writeConfig, resolveAppUrl } from './lib/config-file.js';\nexport { VERSION } from './version.js';\nexport type { WalkerOSConfig } from './lib/config-file.js';\n\n// === Utilities ===\n// Export utilities for programmatic usage\nexport { loadConfig, loadJsonConfig } from './config/utils.js';\nexport { collectKnownSecrets } from './core/known-secrets.js';\nexport { resolveExportName } from './core/resolve-export-name.js';\nexport { selectDevExamples } from './commands/push/dev-examples.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 { PushResult } from './commands/push/types.js';\nexport type { PrepareInput, PreparedFlow } from './commands/push/prepare.js';\nexport type { GlobalOptions } from './types/global.js';\nexport type {\n ValidateResult,\n ValidationType,\n ValidationError,\n ValidationWarning,\n ValidateCode,\n ValidateCheck,\n ValidateScope,\n ValidateSkip,\n ValidateDeferred,\n} from './commands/validate/types.js';\nexport { VALIDATE_CODES } from './commands/validate/types.js';\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 { fileURLToPath } from 'url';\nimport fs from 'fs-extra';\nimport * as esbuild from 'esbuild';\nimport {\n cliPackagesPlugin,\n generateWrapEntry,\n generateWrapEntryServer,\n getNodeExternals,\n} from './bundler.js';\nimport type { MoinTarget, ObserveWeb } from '@walkeros/core';\nimport { tmpRunDir } from '../../core/tmp-names.js';\nimport { buildFlagDefines, readNeedsMarker } from './build-flags.js';\nimport type { WrapEntryPreview } 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 /**\n * Browser-only: preview activation wiring. Only host (deploy) wraps set\n * this; the preview-artifact wrap always omits it, per the anti-recursion\n * invariant in `generateWrapEntry`.\n */\n preview?: WrapEntryPreview;\n\n /**\n * Browser-only: preview-ARTIFACT grant injection. The preview-artifact wrap\n * sets this to the server-bound destination keys that should receive the\n * `X-Walkeros-Preview` header read from `localStorage['elbPreviewSession']` at boot.\n * Mutually exclusive with `preview` (a host activates, an artifact injects);\n * passing both throws.\n */\n previewGrantTargets?: string[];\n\n /**\n * Browser-only: STATIC observe connect config baked onto the startFlow\n * config. PUBLIC values only (`url` + `binding`, plus optional\n * `flowId`/`level`/`sample` scoping); the runtime connect module reads the\n * per-session credential out-of-band at boot via the `elbObserve` slot.\n * This is the preview-artifact observation wiring: it bakes no ingest\n * token into the emitted bytes.\n */\n observe?: ObserveWeb;\n\n /**\n * Browser-only: the Tag Mode loader target, internal deploy data the stage\n * app passes like the preview keyring. Absent, the loader trusts the\n * production app.\n */\n moin?: MoinTarget;\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\n/**\n * Extracts the `<pkg>/dev` specifiers from a skeleton's lazy `__devExports`\n * registry by reading its literal `import('<pkg>/dev')` thunks. The registry is\n * the authoritative `/dev` list (it is codegen'd from the same `computeDevPackages`\n * set), so deriving the externals from the skeleton text cannot drift from it.\n * A skeleton with no registry (e.g. a `cdn`-shaped build) yields `[]`.\n */\nexport function extractDevExternals(skeletonText: string): string[] {\n const pattern = /import\\(\\s*['\"]([^'\"]+\\/dev)['\"]\\s*\\)/g;\n const found = new Set<string>();\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(skeletonText)) !== null) {\n found.add(match[1]);\n }\n return Array.from(found);\n}\n\n/**\n * Returns the candidate `node_modules` dirs esbuild should consult for\n * the wrap step's stage 2 entry. We start at this module's own location\n * and walk upward, since the wrap step always runs from inside the CLI\n * package: either via `node_modules/@walkeros/cli/dist/...` or directly\n * from the workspace source tree during tests.\n */\nfunction getNodeResolutionPaths(): string[] {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates: string[] = [];\n let dir = here;\n // Walk up at most 8 levels looking for node_modules dirs.\n for (let i = 0; i < 8; i++) {\n const candidate = path.join(dir, 'node_modules');\n candidates.push(candidate);\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return candidates;\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 // A host bundle activates a preview; a preview artifact injects its grant.\n // Refuse the combination at the app-facing boundary (generateWrapEntry\n // enforces the same invariant) so a caller wiring both surfaces a clear error\n // here rather than a codegen-time throw.\n if (options.preview && options.previewGrantTargets) {\n throw new Error(\n 'wrapSkeleton: `preview` (host activator) and `previewGrantTargets` ' +\n '(preview-artifact injection) are mutually exclusive. Pass at most one.',\n );\n }\n\n // previewOrigin is non-optional on WrapEntryPreview: an empty string is\n // still a config error (it bakes a broken `https:///preview/<art>.js` URL\n // into the bundle), so it must fail the same charset check as a malformed\n // hostname rather than short-circuit past it via falsy-string skip.\n // The typeof gate matters despite the `string` type: an untyped JS/JSON\n // caller can pass undefined, and RegExp.test coerces it to the string\n // \"undefined\", which MATCHES the hostname charset and would bake\n // `https://undefined/preview/…` into the bundle.\n if (\n options.preview &&\n (typeof options.preview.previewOrigin !== 'string' ||\n !/^[a-z0-9.-]+$/.test(options.preview.previewOrigin))\n ) {\n throw new Error(\n `Invalid previewOrigin \"${options.preview.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 // The skeleton's lazy `__devExports` registry carries literal\n // `import('<pkg>/dev')` thunks. The browser wrap inlines step packages, so\n // without externalizing `<pkg>/dev` esbuild would resolve those literals while\n // building the graph: it errors in a lean install where `<pkg>/dev` is absent,\n // or inlines the /dev graph (a deploy-purity violation) where it resolves.\n // Externalizing them makes the wrap skip resolution and lets DCE drop the\n // unreferenced registry. A `cdn`-shaped skeleton has no registry, so this is [].\n const skeletonText = await fs.readFile(absoluteSkeletonPath, 'utf-8');\n const devExternals = extractDevExternals(skeletonText);\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.preview ? { preview: options.preview } : {}),\n ...(options.previewGrantTargets\n ? { previewGrantTargets: options.previewGrantTargets }\n : {}),\n platform,\n ...(options.observe ? { observe: options.observe } : {}),\n ...(options.moin ? { moin: options.moin } : {}),\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 tmpRunDir('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 // Resolve `@walkeros/web-core` (the Tag Mode loader and the preview\n // activator) from the CLI package's own dependency tree and the\n // workspace root. Without this, esbuild looks under the temp entryDir\n // which has no node_modules. The wrap step always runs from inside the\n // CLI process; both the CLI's local node_modules and the workspace root\n // are safe anchors.\n nodePaths: getNodeResolutionPaths(),\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 // Emit the final browser artifact as an IIFE. The deployed bundle is\n // served as a classic <script> at global scope, so an ESM body would leak\n // its minified top-level declarations (e.g. `ga`) onto `window` and\n // collide with globals like Google Analytics. The IIFE wraps everything\n // in a private closure; the intentional `window.elb`/`window.walkerOS`\n // assignments live inside the entry's own async IIFE and reference\n // `window` explicitly, so they still run. The entry has zero exports, so\n // no `globalName` is needed.\n esbuildOptions.format = 'iife';\n // The entry's web-core imports (the Tag Mode loader, the preview\n // activator) come from the CLI's own web-core, never from a copy above\n // the temp dir.\n esbuildOptions.plugins = [cliPackagesPlugin()];\n // Build flags from the needs the skeleton carries. Only a baked observe\n // config adds to them: the recorder runs only for a collector that has\n // one. A skeleton without needs (an older CLI) keeps every flag on.\n const needs = readNeedsMarker(skeletonText);\n esbuildOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n ...buildFlagDefines(\n needs && {\n ...needs,\n observe: needs.observe || options.observe !== undefined,\n },\n ),\n };\n // Externalize `<pkg>/dev` so the wrap skips resolving the lazy registry's\n // literals and DCE drops the unreferenced registry (see above). The node\n // branch needs no equivalent: it inlines step packages and tree-shakes the\n // unreferenced registry away without re-inlining the /dev graph (verified).\n esbuildOptions.external = devExternals;\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","/**\n * `walkeros bundle --manifest <source>`: build from a manifest.\n *\n * Fetches a manifest (see `schemas/build-manifest.ts`), refuses it unless its\n * `toolchain` is this CLI's exact version, builds each artifact in order,\n * PUTs every output to its own URL, and finally PUTs a structured result to\n * `resultPutUrl`. Web `$env` resolves against `manifest.buildEnv` plus the\n * flow's `config.bundle.env`, never against this process's environment.\n *\n * Messages are written for the orchestrator to show a user, so they never\n * carry a URL query string (presigned credentials live there).\n */\n\nimport crypto from 'crypto';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { FlowReferenceError } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { UnsupportedPackageSpecError } from '../../core/package-spec.js';\nimport { loadBundleConfig, type LoadConfigResult } from '../../config/index.js';\nimport { tmpRunDir } from '../../core/tmp-names.js';\nimport { VERSION } from '../../version.js';\nimport {\n BuildManifestSchema,\n type BuildArtifact,\n type BuildErrorCode,\n type BuildManifest,\n type BuildResult,\n} from '../../schemas/build-manifest.js';\nimport { bundle } from './index.js';\nimport { includeApplies } from './bundler.js';\nimport { wrapSkeleton } from './wrap.js';\nimport { fetchWithRetry, type FetchRetryOptions } from './fetch-retry.js';\n\n/** Env var a bare `--manifest` reads its source from. */\nexport const BUILD_MANIFEST_ENV = 'BUILD_MANIFEST_URL';\n\nclass BuildError extends Error {\n constructor(\n readonly code: BuildErrorCode,\n message: string,\n ) {\n super(message);\n this.name = 'BuildError';\n }\n}\n\nconst STEP_SECTIONS = [\n 'sources',\n 'destinations',\n 'transformers',\n 'stores',\n] as const;\n\n/**\n * A manifest build refuses every config-chosen filesystem path: local step\n * packages (`.` or `/` prefixed), `bundle.packages.<name>.path`,\n * `bundle.traceInclude` and, for a server build, `include`. On a laptop\n * those read the user's own disk; in a build job they would read the job's\n * filesystem into the artifact. Checked\n * on the RESOLVED flow, so a `$var` cannot smuggle a path past it. The\n * message names locations only, never the path values.\n */\nfunction assertNoLocalPaths(loaded: LoadConfigResult): void {\n const locations: string[] = [];\n for (const [name, pkg] of Object.entries(loaded.buildOptions.packages)) {\n if (pkg.path !== undefined) {\n locations.push(`config.bundle.packages.${name}.path`);\n }\n }\n if (loaded.buildOptions.traceInclude?.length) {\n locations.push('config.bundle.traceInclude');\n }\n // The default `./shared` probe resolves inside the empty work dir, so a\n // non-empty list here always came from the config's own `include`. A web\n // build never reads it, so it is refused only where it applies.\n if (\n loaded.buildOptions.include?.length &&\n includeApplies(loaded.buildOptions)\n ) {\n locations.push('include');\n }\n for (const section of STEP_SECTIONS) {\n for (const [id, step] of Object.entries(\n loaded.flowSettings[section] ?? {},\n )) {\n const pkg = step.package;\n if (\n typeof pkg === 'string' &&\n (pkg.startsWith('.') || pkg.startsWith('/'))\n ) {\n locations.push(`${section}.${id}.package`);\n }\n }\n }\n if (locations.length > 0) {\n throw new BuildError(\n 'LOCAL_PATH_NOT_ALLOWED',\n `Local filesystem paths are not allowed in a manifest build: ${locations.join(', ')}`,\n );\n }\n}\n\n/** Map an error thrown while loading or building to a result code. */\nfunction classify(error: unknown, phase: 'config' | 'build'): BuildErrorCode {\n if (error instanceof BuildError) return error.code;\n if (error instanceof FlowReferenceError) {\n return error.code === 'MISSING_ENV'\n ? 'MISSING_BUILD_ENV'\n : 'WEB_SECRET_REF';\n }\n if (error instanceof UnsupportedPackageSpecError) {\n return 'UNSUPPORTED_PACKAGE_SPEC';\n }\n return phase === 'config' ? 'INVALID_CONFIG' : 'BUILD_FAILED';\n}\n\nfunction isHttpUrl(source: string): boolean {\n return source.startsWith('http://') || source.startsWith('https://');\n}\n\n/** Retry hooks for the build's network calls; see `fetchWithRetry`. */\nexport type BuildRetryOptions = Pick<FetchRetryOptions, 'warn' | 'sleep'>;\n\nasync function readManifestSource(\n source: string,\n retry: BuildRetryOptions,\n): Promise<unknown> {\n let text: string;\n if (isHttpUrl(source)) {\n const response = await fetchWithRetry(\n source,\n {},\n { ...retry, label: 'Manifest download', timeoutMs: 30_000 },\n );\n text = await response.text();\n } else {\n text = await fs.readFile(source, 'utf-8');\n }\n return JSON.parse(text);\n}\n\n/** Default Content-Type for an output, from its name. */\nfunction contentTypeFor(outputName: string): string {\n const lower = outputName.toLowerCase();\n if (lower.endsWith('.tar.gz') || lower.endsWith('.tgz')) {\n return 'application/gzip';\n }\n return 'application/javascript';\n}\n\nasync function put(\n url: string,\n body: BodyInit,\n contentType: string,\n headers: Record<string, string>,\n retry: BuildRetryOptions,\n): Promise<void> {\n // Header values are never logged: a presign may sign secrets into them.\n // A failure is reported as UPLOAD_FAILED, never as a build failure.\n try {\n await fetchWithRetry(\n url,\n {\n method: 'PUT',\n body,\n headers: { ...headers, 'Content-Type': contentType },\n },\n { ...retry, label: 'Upload', timeoutMs: 60_000 },\n );\n } catch (error) {\n throw new BuildError('UPLOAD_FAILED', getErrorMessage(error));\n }\n}\n\nasync function download(\n url: string,\n dest: string,\n retry: BuildRetryOptions,\n): Promise<void> {\n let response: Response;\n try {\n response = await fetchWithRetry(\n url,\n {},\n { ...retry, label: 'Skeleton download', timeoutMs: 60_000 },\n );\n } catch (error) {\n throw new BuildError('BUILD_FAILED', getErrorMessage(error));\n }\n await fs.writeFile(dest, Buffer.from(await response.arrayBuffer()));\n}\n\nasync function buildArtifact(\n manifest: BuildManifest,\n configPath: string,\n artifact: BuildArtifact,\n workDir: string,\n index: number,\n outputs: Map<string, string>,\n retry: BuildRetryOptions,\n): Promise<string> {\n const output = path.join(workDir, 'out', artifact.outputName);\n await fs.ensureDir(path.dirname(output));\n\n if (artifact.target === 'wrap') {\n let skeletonPath: string;\n if ('url' in artifact.skeleton) {\n skeletonPath = path.join(workDir, `skeleton-${index}.mjs`);\n await download(artifact.skeleton.url, skeletonPath, retry);\n } else {\n // Schema guarantees an earlier bundle artifact with this name.\n const built = outputs.get(artifact.skeleton.artifact);\n if (!built) {\n throw new BuildError(\n 'INVALID_MANIFEST',\n `No built artifact named \"${artifact.skeleton.artifact}\"`,\n );\n }\n skeletonPath = built;\n }\n await wrapSkeleton({\n skeletonPath,\n platform: artifact.platform,\n outputPath: output,\n ...artifact.options,\n });\n return output;\n }\n\n const scratch = path.join(workDir, `cli-${index}`);\n await fs.ensureDir(scratch);\n // A config FILE inside the empty work dir, so includes and relative paths\n // resolve there and never against whatever directory the CLI runs in.\n await bundle(configPath, {\n ...(manifest.flowName ? { flowName: manifest.flowName } : {}),\n target: artifact.target,\n silent: true,\n // Each build starts clean: the build cache would hold inlined values.\n cache: false,\n // The base env is the manifest's, NEVER this process's own.\n buildEnv: manifest.buildEnv ?? {},\n buildOverrides: { output, tempDir: scratch },\n });\n return output;\n}\n\nexport interface RunBuildManifestResult {\n result: BuildResult;\n /** False when the result could not be PUT (or the manifest was unreadable). */\n reported: boolean;\n}\n\n/**\n * Run a manifest build end to end. Never throws: every failure becomes a\n * result, and `reported` says whether that result reached `resultPutUrl`.\n * Each download and upload retries transient failures; `retry.warn` hears\n * about every retry.\n */\nexport async function runBuildManifest(\n source: string,\n retry: BuildRetryOptions = {},\n): Promise<RunBuildManifestResult> {\n const report = (url: string, result: BuildResult) =>\n reportResult(url, result, retry);\n const result: BuildResult = { ok: false, toolchain: VERSION, artifacts: [] };\n const fail = (code: BuildErrorCode, message: string, outputName?: string) => {\n result.error = outputName\n ? { code, message, outputName }\n : { code, message };\n };\n\n let raw: unknown;\n try {\n raw = await readManifestSource(source, retry);\n } catch (error) {\n fail('INVALID_MANIFEST', getErrorMessage(error));\n return { result, reported: false };\n }\n\n const parsed = BuildManifestSchema.safeParse(raw);\n if (!parsed.success) {\n fail(\n 'INVALID_MANIFEST',\n parsed.error.issues\n .map((issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`)\n .join('; '),\n );\n // Report to the result URL when it is at least readable.\n const resultPutUrl = BuildManifestSchema.shape.resultPutUrl.safeParse(\n typeof raw === 'object' && raw !== null && 'resultPutUrl' in raw\n ? raw.resultPutUrl\n : undefined,\n );\n if (!resultPutUrl.success) return { result, reported: false };\n return { result, reported: await report(resultPutUrl.data, result) };\n }\n const manifest = parsed.data;\n\n if (manifest.toolchain !== VERSION) {\n fail(\n 'TOOLCHAIN_MISMATCH',\n `Manifest expects @walkeros/cli ${manifest.toolchain}, this is ${VERSION}`,\n );\n return { result, reported: await report(manifest.resultPutUrl, result) };\n }\n\n const workDir = await tmpRunDir('build');\n try {\n // Load once up front so a config error is reported as one, before any\n // package is fetched.\n const configPath = path.join(workDir, 'flow.json');\n if (manifest.flowConfig) {\n try {\n await fs.writeJson(configPath, manifest.flowConfig);\n const loaded = loadBundleConfig(manifest.flowConfig, {\n configPath,\n flowName: manifest.flowName,\n buildEnv: manifest.buildEnv ?? {},\n });\n assertNoLocalPaths(loaded);\n } catch (error) {\n fail(classify(error, 'config'), getErrorMessage(error));\n return {\n result,\n reported: await report(manifest.resultPutUrl, result),\n };\n }\n }\n\n const outputs = new Map<string, string>();\n for (const [index, artifact] of manifest.artifacts.entries()) {\n try {\n const output = await buildArtifact(\n manifest,\n configPath,\n artifact,\n workDir,\n index,\n outputs,\n retry,\n );\n outputs.set(artifact.outputName, output);\n const content = await fs.readFile(output);\n await put(\n artifact.putUrl,\n content,\n artifact.contentType ?? contentTypeFor(artifact.outputName),\n artifact.headers ?? {},\n retry,\n );\n result.artifacts.push({\n target: artifact.target,\n outputName: artifact.outputName,\n bytes: content.length,\n sha256: crypto.createHash('sha256').update(content).digest('hex'),\n });\n } catch (error) {\n fail(\n classify(error, 'build'),\n getErrorMessage(error),\n artifact.outputName,\n );\n return {\n result,\n reported: await report(manifest.resultPutUrl, result),\n };\n }\n }\n\n result.ok = true;\n return { result, reported: await report(manifest.resultPutUrl, result) };\n } finally {\n await fs.remove(workDir).catch(() => {});\n }\n}\n\nasync function reportResult(\n url: string,\n result: BuildResult,\n retry: BuildRetryOptions,\n): Promise<boolean> {\n try {\n await put(url, JSON.stringify(result), 'application/json', {}, retry);\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface BundleManifestCommandOptions {\n /** Manifest URL or file path; `true` (bare flag) reads BUILD_MANIFEST_URL. */\n manifest: string | true;\n json?: boolean;\n verbose?: boolean;\n silent?: boolean;\n}\n\nconst MANIFEST_FLAGS: ReadonlySet<string> = new Set([\n 'manifest',\n 'json',\n 'verbose',\n 'silent',\n]);\n\n/**\n * Inputs `--manifest` would silently ignore, as flag names. The manifest\n * carries the whole build, so any of them is a usage error. `cache` is\n * commander's `--no-cache` default (true) and only counts when switched off.\n */\nexport function manifestFlagConflicts(\n file: string | undefined,\n options: Record<string, unknown>,\n): string[] {\n const conflicts = file ? ['a config file'] : [];\n for (const [key, value] of Object.entries(options)) {\n if (MANIFEST_FLAGS.has(key) || value === undefined) continue;\n if (key === 'cache' && value === true) continue;\n conflicts.push(key === 'cache' ? '--no-cache' : `--${key}`);\n }\n return conflicts;\n}\n\n/** Resolve the `--manifest` value, falling back to the env for a bare flag. */\nexport function resolveManifestSource(\n manifest: string | true,\n env: Record<string, string | undefined> = process.env,\n): string {\n if (manifest !== true) return manifest;\n const fromEnv = env[BUILD_MANIFEST_ENV];\n if (!fromEnv) {\n throw new Error(\n `--manifest needs a URL or path, or ${BUILD_MANIFEST_ENV} in the environment`,\n );\n }\n return fromEnv;\n}\n\nexport async function bundleManifestCommand(\n options: BundleManifestCommandOptions,\n): Promise<void> {\n const logger = createCLILogger({ ...options, stderr: true });\n let source: string;\n try {\n source = resolveManifestSource(options.manifest);\n } catch (error) {\n logger.error(`Error: ${getErrorMessage(error)}`);\n process.exit(1);\n }\n\n const { result, reported } = await runBuildManifest(source, {\n warn: (message) => logger.warn(message),\n });\n\n if (options.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n } else if (result.ok) {\n for (const artifact of result.artifacts) {\n logger.info(\n `Built ${artifact.outputName} (${artifact.target}, ${artifact.bytes} bytes)`,\n );\n }\n } else if (result.error) {\n logger.error(`Error [${result.error.code}]: ${result.error.message}`);\n }\n if (!reported) logger.error('Result could not be reported');\n\n process.exit(result.ok && reported ? 0 : 1);\n}\n","/**\n * Build Manifest Schemas\n *\n * The contract of `walkeros bundle --manifest`: a build orchestrator writes a\n * manifest, the CLI builds every requested artifact, PUTs each output to its\n * own URL, then PUTs a structured result to `resultPutUrl`. Any orchestrator\n * can drive it (a CI job, a hosted build job, a self-hoster's script); nothing\n * in it is specific to one.\n *\n * Evolution rule: unknown TOP-LEVEL keys are tolerated and ignored, so an\n * orchestrator can add a field for its own bookkeeping without a CLI release.\n * A field the CLI must ACT on needs a CLI release, and `toolchain` makes the\n * CLI refuse a manifest written for a different version rather than silently\n * ignoring what it does not understand. Artifact entries and wrap options are\n * strict for the same reason: an ignored option there would change the bytes.\n *\n * Build env: web `$env.NAME` resolves against `buildEnv` with the flow's\n * `config.bundle.env` on top (declared wins), never against the CLI process's\n * own environment. `config.bundle.env` values are taken as literals: a\n * reference inside one (`\"$env.X\"`) is not resolved at build time and must\n * not be relied on. A `$flow.<sibling>` reference resolves against the ENTRY\n * flow's declared env, never the sibling's own `config.bundle.env`, so a\n * value the sibling declares for itself is `MISSING_BUILD_ENV` here.\n *\n * Local paths: a manifest build refuses every config-chosen filesystem input\n * (local step packages, `bundle.packages.<name>.path`, `bundle.traceInclude`,\n * `include`) with `LOCAL_PATH_NOT_ALLOWED`, before anything is fetched.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport type { BundleTarget } from '../commands/bundle/targets.js';\nimport type { WrapSkeletonOptions } from '../commands/bundle/wrap.js';\n\n/** Current manifest format version. */\nexport const BUILD_MANIFEST_VERSION = 1;\n\nconst HttpUrlSchema = z.url({ protocol: /^https?$/ });\n\n/**\n * A bare file name: the output is written inside the build's own temp dir, so\n * path separators and leading dots are refused.\n */\nconst OutputNameSchema = z\n .string()\n .regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/, 'Must be a bare file name')\n .describe('Output file name; its extension picks the format (.tar.gz packs)');\n\nconst BUNDLE_TARGET_NAMES = [\n 'cdn',\n 'cdn-skeleton',\n 'runner',\n 'simulate',\n 'push',\n] as const satisfies ReadonlyArray<BundleTarget>;\n\n// Compile-time completeness: a new BundleTarget fails here until listed.\ntype MissingTarget = Exclude<\n BundleTarget,\n (typeof BUNDLE_TARGET_NAMES)[number]\n>;\nconst bundleTargetsComplete: [MissingTarget] extends [never] ? true : never =\n true;\nvoid bundleTargetsComplete;\n\n/** Header names the CLI sets itself and an artifact may not override. */\nconst RESERVED_HEADERS: ReadonlySet<string> = new Set([\n 'content-type',\n 'content-length',\n 'host',\n]);\n\nconst OutputFields = {\n outputName: OutputNameSchema,\n putUrl: HttpUrlSchema.describe('Presigned PUT for exactly this output'),\n contentType: z\n .string()\n .min(1)\n .optional()\n .describe('Content-Type sent with the PUT (must match a signed header)'),\n headers: z\n .record(z.string().min(1), z.string())\n .refine(\n (headers) =>\n Object.keys(headers).every(\n (name) => !RESERVED_HEADERS.has(name.toLowerCase()),\n ),\n 'Content-Type, Content-Length and Host are set by the CLI',\n )\n .optional()\n .describe(\n 'Extra headers sent with the PUT (for headers a presign signs); never logged',\n ),\n};\n\nexport const BuildBundleArtifactSchema = z\n .object({\n target: z.enum(BUNDLE_TARGET_NAMES).describe('Named bundle target'),\n ...OutputFields,\n })\n .strict();\n\nexport const BuildWrapOptionsSchema = z\n .object({\n windowCollector: z.string().min(1).optional(),\n windowElb: z.string().min(1).optional(),\n preview: z\n .object({\n enabled: z.boolean(),\n keyring: z.array(\n z.object({ kid: z.string(), spki: z.string() }).strict(),\n ),\n iss: z.string(),\n pb: z.string().optional(),\n acceptForeign: z.boolean().optional(),\n demoAllowlist: z.array(z.string()).optional(),\n previewOrigin: z.string(),\n })\n .strict()\n .optional(),\n previewGrantTargets: z.array(z.string()).optional(),\n observe: z\n .object({\n url: z.string(),\n binding: z.string(),\n flowId: z.string().optional(),\n level: z.enum(['off', 'standard', 'trace']).optional(),\n sample: z.number().min(0).max(1).optional(),\n })\n .strict()\n .optional(),\n moin: z\n .object({ app: z.string(), base: z.string() })\n .strict()\n .optional()\n .describe('Tag Mode loader target; absent, the production app'),\n minify: z.boolean().optional(),\n minifyOptions: z\n .object({\n identifiers: z.boolean().optional(),\n syntax: z.boolean().optional(),\n whitespace: z.boolean().optional(),\n keepNames: z.boolean().optional(),\n legalComments: z\n .enum(['none', 'inline', 'eof', 'linked', 'external'])\n .optional(),\n })\n .strict()\n .optional(),\n target: z.string().min(1).optional().describe('esbuild target'),\n })\n .strict()\n .describe('Options forwarded to wrapSkeleton');\n\nexport const BuildWrapArtifactSchema = z\n .object({\n target: z.literal('wrap'),\n platform: z.enum(['browser', 'node']),\n skeleton: z\n .union([\n z.object({ url: HttpUrlSchema }).strict(),\n z.object({ artifact: OutputNameSchema }).strict(),\n ])\n .describe(\n 'The skeleton to wrap: a GET URL, or the outputName of an earlier bundle artifact in this manifest',\n ),\n options: BuildWrapOptionsSchema.optional(),\n ...OutputFields,\n })\n .strict();\n\nexport const BuildArtifactSchema = z.union([\n BuildBundleArtifactSchema,\n BuildWrapArtifactSchema,\n]);\n\nexport const BuildManifestSchema = z\n .object({\n version: z.literal(BUILD_MANIFEST_VERSION),\n toolchain: z\n .string()\n .min(1)\n .describe('Exact @walkeros/cli version; any other version refuses'),\n flowConfig: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Flow.Json to bundle; required when any bundle artifact is'),\n flowName: z.string().min(1).optional(),\n buildEnv: z\n .record(z.string(), z.string())\n .optional()\n .describe(\n \"Base env for web $env, beneath config.bundle.env. Never the CLI process's own env\",\n ),\n artifacts: z.array(BuildArtifactSchema).min(1),\n resultPutUrl: HttpUrlSchema.describe('Presigned PUT for the result JSON'),\n })\n .loose()\n .superRefine((manifest, ctx) => {\n const seen = new Set<string>();\n const bundled = new Set<string>();\n manifest.artifacts.forEach((artifact, index) => {\n if (seen.has(artifact.outputName)) {\n ctx.addIssue({\n code: 'custom',\n path: ['artifacts', index, 'outputName'],\n message: `Duplicate outputName \"${artifact.outputName}\"`,\n });\n }\n seen.add(artifact.outputName);\n if (artifact.target !== 'wrap') {\n bundled.add(artifact.outputName);\n if (!manifest.flowConfig) {\n ctx.addIssue({\n code: 'custom',\n path: ['flowConfig'],\n message: 'flowConfig is required for bundle artifacts',\n });\n }\n } else if (\n 'artifact' in artifact.skeleton &&\n !bundled.has(artifact.skeleton.artifact)\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['artifacts', index, 'skeleton', 'artifact'],\n message: `No earlier bundle artifact named \"${artifact.skeleton.artifact}\"`,\n });\n }\n });\n })\n .meta({ id: 'BuildManifest', title: 'walkeros bundle --manifest input' });\n\nexport type BuildManifest = z.infer<typeof BuildManifestSchema>;\nexport type BuildArtifact = z.infer<typeof BuildArtifactSchema>;\nexport type BuildWrapOptions = z.infer<typeof BuildWrapOptionsSchema>;\n\n// Compile-time, both directions: parsed wrap options must be accepted by\n// wrapSkeleton, and every wrapSkeleton option except the three the command\n// supplies itself must be reachable through the manifest.\nconst wrapOptionsFit = (\n options: BuildWrapOptions,\n): Partial<WrapSkeletonOptions> => options;\nvoid wrapOptionsFit;\ntype UnreachableWrapOption = Exclude<\n keyof WrapSkeletonOptions,\n keyof BuildWrapOptions | 'skeletonPath' | 'platform' | 'outputPath'\n>;\nconst wrapOptionsComplete: [UnreachableWrapOption] extends [never]\n ? true\n : never = true;\nvoid wrapOptionsComplete;\n\n/**\n * Error codes a result can carry. User-config codes first, then build and\n * infrastructure codes.\n */\nexport const BUILD_ERROR_CODES = [\n 'INVALID_MANIFEST',\n 'TOOLCHAIN_MISMATCH',\n 'INVALID_CONFIG',\n 'MISSING_BUILD_ENV',\n 'WEB_SECRET_REF',\n 'UNSUPPORTED_PACKAGE_SPEC',\n 'LOCAL_PATH_NOT_ALLOWED',\n 'BUILD_FAILED',\n 'UPLOAD_FAILED',\n] as const;\n\nexport type BuildErrorCode = (typeof BUILD_ERROR_CODES)[number];\n\nexport const BuildResultSchema = z\n .object({\n ok: z.boolean(),\n toolchain: z.string().describe('The CLI version that ran the build'),\n artifacts: z\n .array(\n z.object({\n target: z.string(),\n outputName: z.string(),\n bytes: z.number().int().nonnegative(),\n sha256: z.string(),\n }),\n )\n .describe('Outputs PUT successfully, in manifest order'),\n error: z\n .object({\n code: z.enum(BUILD_ERROR_CODES),\n message: z.string(),\n outputName: z\n .string()\n .optional()\n .describe('The artifact being built when the error occurred'),\n })\n .optional(),\n })\n .meta({ id: 'BuildResult', title: 'walkeros bundle --manifest result' });\n\nexport type BuildResult = z.infer<typeof BuildResultSchema>;\n","/**\n * One retry policy for every network call of a manifest build: the manifest\n * download, a skeleton download and each PUT. A transient failure (the fetch\n * rejects, times out, or answers 5xx or 429) is retried; any other status\n * fails at once, since an expired or wrong presign never heals.\n *\n * Messages never carry the URL, its query or a header value: presigned\n * credentials live there.\n */\n\n/** Waits before attempt 2 and 3. Their count sets the attempt limit. */\nconst BACKOFF_MS = [1000, 3000] as const;\n\nexport interface FetchRetryOptions {\n /** Names the call in warnings and errors, e.g. `Manifest download`. */\n label: string;\n /** Per-attempt timeout; each attempt gets a fresh signal. */\n timeoutMs: number;\n /** Called once per retry with a ready-to-print line. */\n warn?: (message: string) => void;\n /** Injectable for tests. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nfunction defaultSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isTransientStatus(status: number): boolean {\n return status >= 500 || status === 429;\n}\n\nfunction causeDetail(error: object): string | undefined {\n if (!('cause' in error)) return undefined;\n const cause = error.cause;\n if (typeof cause !== 'object' || cause === null) return undefined;\n if ('code' in cause && typeof cause.code === 'string') return cause.code;\n // A plain `Error` name says nothing (undici's `bad port`, for one).\n if (\n 'name' in cause &&\n typeof cause.name === 'string' &&\n cause.name !== 'Error'\n ) {\n return cause.name;\n }\n return undefined;\n}\n\n/**\n * A short, safe reason for a failed fetch: `fetch failed (ECONNRESET)`,\n * `timed out after 30s` or `HTTP 503`. Read from the error's name, its\n * `cause.code` or `cause.name`, or the response status. Never from an error\n * message, which may repeat the URL.\n */\nexport function describeFetchError(\n failure: unknown,\n timeoutMs?: number,\n): string {\n if (failure instanceof Response) return `HTTP ${failure.status}`;\n // Structural, not `instanceof Error`: a DOMException or an undici error may\n // come from another realm.\n if (typeof failure !== 'object' || failure === null) return 'fetch failed';\n if ('name' in failure && failure.name === 'TimeoutError') {\n return timeoutMs === undefined\n ? 'timed out'\n : `timed out after ${timeoutMs / 1000}s`;\n }\n const detail = causeDetail(failure);\n if (detail) return `fetch failed (${detail})`;\n return 'fetch failed';\n}\n\n/**\n * `fetch` with the build retry policy. Resolves with an ok response, or\n * throws an Error whose message names the label, the attempt count and the\n * reason, e.g. `Manifest download failed after 3 attempts: HTTP 503`.\n */\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n options: FetchRetryOptions,\n): Promise<Response> {\n const { label, timeoutMs, warn, sleep = defaultSleep } = options;\n const maxAttempts = BACKOFF_MS.length + 1;\n\n for (let attempt = 1; ; attempt++) {\n let failure: unknown;\n try {\n const response = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (response.ok) return response;\n failure = response;\n } catch (error) {\n failure = error;\n }\n\n const reason = describeFetchError(failure, timeoutMs);\n if (failure instanceof Response && !isTransientStatus(failure.status)) {\n throw new Error(`${label} failed: ${reason}`);\n }\n\n const delay = BACKOFF_MS[attempt - 1];\n if (delay === undefined) {\n throw new Error(\n `${label} failed after ${maxAttempts} attempts: ${reason}`,\n );\n }\n warn?.(\n `${label} attempt ${attempt}/${maxAttempts} failed: ${reason}, retrying in ${delay / 1000}s`,\n );\n await sleep(delay);\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';\nimport { APP_PATHS } from '../core/app-paths.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 // The emitter is its own flow. Its version is not stamped on source.version;\n // it rides source.release under the emitter's surface key (cli/mcp), stamped\n // by the collector from config.collector.{name,release} below.\n const baseSource: WalkerOS.Source = {\n ...opts.source,\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 // Flow identity: the emitter surface (cli/mcp) keys source.release, its\n // package version is the release. createEvent stamps\n // source.release = { [type]: packageVersion } from these.\n name: opts.source.type,\n release: opts.packageVersion,\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 // The debug path bypasses the collector, so replicate the\n // source.release stamp createEvent applies on the live path.\n source: {\n ...partialEvent.source,\n release: { [opts.source.type]: opts.packageVersion },\n },\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 telemetry goes to the\n * same app as every other CLI request. Order: env (`WALKEROS_APP_URL`) > user\n * config (`~/.config/walkeros/config.json:appUrl`) > undefined (telemetry\n * 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(/\\/+$/, '')}${APP_PATHS.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 an explicit\n * `walkeros telemetry enable` or `disable`). If the user never creates a\n * config for any other reason, the notice keeps appearing. That is acceptable: the notice\n * is a one-line 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","fs","path","fs","path","path","fs","path","path","fs","stat","fs","fs","fs","path","fs","path","path","fs","fs","path","schemas","path","path","fs","path","fs","isRecord","stat","path","bundle","path","fs","bundle","esbuild","path","fileURLToPath","fs","getPlatform","packageNameToVariable","SECRET_MARKER_PREFIX","isObject","path","fs","semver","input","path","fs","fs","path","path","resolve","fs","deps","peerDeps","peerMeta","nestLoser","alreadyNested","semver","path","fs","fs","path","semver","isObject","getHashServer","fs","path","getHashServer","getHashServer","path","fs","fs","path","dirname","join","path","fs","getHashServer","stats","sizeKB","esbuild","fileURLToPath","build","packageNameToVariable","isObject","getPlatform","release","stepId","SECRET_MARKER_PREFIX","resolveTarget","fs","path","fs","configDigest","resolveTarget","path","fs","getPlatform","path","delay","resolve","path","startFlow","path","fs","getPlatform","getPlatform","path","fs","schemas","isObject","isRecord","isRecord","push","fs","schemas","getPlatform","path","context","require","fs","path","chalk","isObject","isObject","validateEvent","checkWindowCollector","ENV_MARKER_PREFIX","isObject","SECRET_MARKER_PREFIX","schemas","validateFlowStructure","isObject","isFlowJson","path","getFlowSettings","getErrorMessage","resolveFlow","ENV_MARKER_PREFIX","getErrorMessage","isObject","SECRET_MARKER_PREFIX","fs","path","isObject","isObject","ENV_MARKER_PREFIX","SECRET_MARKER_PREFIX","context","getErrorMessage","validate","validateFlowConfig","schemas","STEP_KINDS","context","isObject","path","validateFlowConfig","result","STEP_KINDS","bundle","isFlowJson","validateFlowStructure","resolveFlow","ENV_MARKER_PREFIX","checkWindowCollector","once","SECRET_MARKER_PREFIX","isObject","schemas","path","context","isFlowJson","resolveFlow","isFlowJson","isObject","validateEvent","chalk","z","readFileSync","join","path","readFile","z","z","z","readJson","z","validateFlowStructure","path","fileURLToPath","fs","esbuild","fileURLToPath","fs","crypto","path","fs","FlowReferenceError","z","z","z","resolve","delay","FlowReferenceError","fs","path","result","crypto","os"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/bundle/index.ts","../src/core/cli-logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/tmp.ts","../src/core/asset-resolver.ts","../src/config/utils.ts","../src/core/fetch-failure.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/event-validation.ts","../src/core/import-specifier.ts","../src/core/parse-component-ref.ts","../src/core/tmp-names.ts","../src/commands/bundle/archive.ts","../src/config/validators.ts","../src/config/build-defaults.ts","../src/config/loader.ts","../src/core/content-digest.ts","../src/config/window-collector.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/config-classifier.ts","../src/core/step-packages.ts","../src/core/package-manager.ts","../src/core/cache-utils.ts","../src/core/atomic-cache.ts","../src/core/package-spec.ts","../src/commands/bundle/nft-trace.ts","../src/commands/bundle/assert-consumer-deps.ts","../src/commands/bundle/build-flags.ts","../src/core/build-cache.ts","../src/version.ts","../src/commands/bundle/targets.ts","../src/commands/bundle/upload.ts","../src/commands/bundle/stats.ts","../src/commands/push/index.ts","../src/core/redact-line.ts","../src/core/to-printable.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/simulation-result.ts","../src/commands/push/prepare.ts","../src/core/known-secrets.ts","../src/commands/push/plan-simulate.ts","../src/commands/push/dispatch-simulate.ts","../src/commands/push/run.ts","../src/commands/push/dev-examples.ts","../src/core/resolve-export-name.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/scope.ts","../src/commands/validate/validators/resolve.ts","../src/commands/validate/validators/settings.ts","../src/core/package-info.ts","../src/commands/validate/validators/mapping.ts","../src/commands/validate/validators/entry.ts","../src/commands/validate/types.ts","../src/commands/auth/index.ts","../src/core/api-error.ts","../src/core/app-fetch.ts","../src/lib/config-file.ts","../src/lib/secure-url.ts","../src/core/client-context.ts","../src/core/app-paths.ts","../src/commands/api/index.ts","../src/telemetry/install-id.ts","../src/commands/telemetry/index.ts","../src/index.ts","../src/commands/bundle/wrap.ts","../src/commands/bundle/manifest.ts","../src/schemas/build-manifest.ts","../src/commands/bundle/fetch-retry.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":["/**\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 { tmpRunDir } from '../../core/tmp-names.js';\nimport { packBundleDir } from './archive.js';\nimport type { Flow, Logger } from '@walkeros/core';\nimport type { BundleStats } from './bundler.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, type BundleProvenance } 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 /** Release id baked into config.collector.release. Beats an authored one. */\n release?: string;\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\n/** Recognizes the packed-archive output extensions. */\nfunction isArchiveOutput(output: string): boolean {\n const lower = output.toLowerCase();\n return lower.endsWith('.tar.gz') || lower.endsWith('.tgz');\n}\n\n/**\n * Run the core bundler, transparently producing a packed `.tar.gz`/`.tgz`\n * artifact when `buildOptions.output` carries an archive extension.\n *\n * For a `.tar.gz`/`.tgz` output on the node platform, the build is redirected\n * into a temp directory so `runNftServerPath` populates `flow.mjs` +\n * `node_modules/` + `package.json` there; the directory is then packed into\n * the archive at the user's output path and the temp dir is removed. Non\n * archive outputs (`.mjs`, directory, stdout, web `.js`) pass straight through\n * to `bundleCore` unchanged.\n *\n * Web bundles are single-file IIFEs with no sibling `node_modules` to pack, so\n * requesting an archive extension for a web/browser platform is an error.\n */\nasync function runBundleCoreWithArchive(\n flowSettings: Flow,\n buildOptions: BuildOptions,\n logger: Logger.Instance,\n showStats: boolean,\n provenance: BundleProvenance,\n): Promise<BundleStats | void> {\n if (!isArchiveOutput(buildOptions.output)) {\n return bundleCore(\n flowSettings,\n buildOptions,\n logger,\n showStats,\n provenance,\n );\n }\n\n if (buildOptions.platform !== 'node') {\n throw new Error(\n `Archive output (${path.extname(buildOptions.output)}) is only supported for server (node) flows. ` +\n 'Web bundles are a single-file IIFE with no node_modules to pack — use a .js output instead.',\n );\n }\n\n const archivePath = path.resolve(buildOptions.output);\n // mkdtemp guarantees a unique dir even for same-millisecond parallel node\n // archive builds (e.g. --all), which a Date.now() suffix cannot.\n const tempDir = await tmpRunDir('archive');\n\n try {\n const stats = await bundleCore(\n flowSettings,\n { ...buildOptions, output: path.join(tempDir, 'flow.mjs') },\n logger,\n showStats,\n provenance,\n );\n\n // node_modules/ is only present when nft copied ≥1 traced file. A flow\n // whose deps esbuild fully inlines emits flow.mjs + package.json only, so\n // pack just the entries that exist (tar.c throws ENOENT on a missing path).\n // flow.mjs and package.json are mandatory; their absence is a real error.\n for (const required of ['flow.mjs', 'package.json']) {\n if (!(await fs.pathExists(path.join(tempDir, required)))) {\n throw new Error(\n `Bundle archive build is missing ${required}; cannot pack ${archivePath}.`,\n );\n }\n }\n const candidates = ['flow.mjs', 'node_modules', 'package.json'];\n const entries: string[] = [];\n for (const entry of candidates) {\n if (await fs.pathExists(path.join(tempDir, entry))) entries.push(entry);\n }\n\n await fs.ensureDir(path.dirname(archivePath));\n await packBundleDir(tempDir, archivePath, entries);\n logger.debug(`Packed bundle archive: ${archivePath}`);\n\n return stats;\n } finally {\n await fs.remove(tempDir).catch(() => {});\n }\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 if (options.all && options.output && isArchiveOutput(options.output)) {\n throw new Error(\n 'Cannot use --all with an archive output (.tar.gz/.tgz). Archive packing produces one file per flow; point -o at a directory instead.',\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 configDigest,\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 = path.join(\n await tmpRunDir('bundle'),\n `bundle${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 // The bundler bakes flow name + release into the collector before\n // codegen, so the deployed flow stamps real provenance on\n // event.source.release.\n const stats = await runBundleCoreWithArchive(\n flowSettings,\n buildOptions,\n logger,\n shouldCollectStats === true,\n { flowName, release: options.release, configDigest },\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(path.dirname(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 * @param options.buildEnv - Base env for web `$env` (default `process.env`)\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 * Release id baked into `config.collector.release`, stamping this flow's\n * entry in `event.source.release` at runtime. Beats an authored release;\n * omitted, the release is a content id of config, packages and CLI.\n */\n release?: 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 * Base environment web `$env` references resolve against, beneath the\n * flow's declared `config.bundle.env`. Omitted, it is `process.env` (a\n * local build). Pass `{}` for a hosted build, which then resolves against\n * the declared values alone and never the building process's own env.\n */\n buildEnv?: Record<string, string | undefined>;\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 externalizeDev: preset.externalizeDev,\n };\n const { flowSettings, buildOptions, flowName, configDigest } =\n loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flowName,\n buildOverrides: mergedOverrides,\n buildEnv: options.buildEnv,\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 (packs a .tar.gz/.tgz artifact when output requests it)\n // The bundler bakes flow name + release into the collector so the deployed\n // flow stamps real provenance on event.source.release.\n return await runBundleCoreWithArchive(\n flowSettings,\n buildOptions,\n logger,\n options.stats ?? false,\n { flowName, release: options.release, configDigest },\n );\n}\n","import chalk from 'chalk';\nimport {\n createCLILogger as createCoreCLILogger,\n createCLILoggerConfig as createCoreCLILoggerConfig,\n type CLILoggerColors,\n type CLILoggerOptions,\n} from '@walkeros/core/node';\nimport type { Logger } from '@walkeros/core';\n\nexport type { CLILoggerOptions };\n\n/**\n * The CLI's terminal colours. Binding them here matters: the shared factory in\n * `@walkeros/core/node` defaults every level to identity, so a plain re-export\n * would silently drop red ERROR output at every CLI call site.\n */\nconst CLI_COLORS: CLILoggerColors = { error: chalk.red };\n\n/**\n * Build the `Logger.Config` backing the CLI logger, with the CLI's colours.\n * See `createCLILoggerConfig` in `@walkeros/core/node` for the handler contract.\n */\nexport function createCLILoggerConfig(\n options: CLILoggerOptions = {},\n): Logger.Config {\n return createCoreCLILoggerConfig(options, CLI_COLORS);\n}\n\n/**\n * Create a core Logger.Instance with CLI-appropriate behavior.\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 return createCoreCLILogger(options, CLI_COLORS);\n}\n","export { createTimer, type Timer } from '@walkeros/core';\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 * Temp path helpers live in `@walkeros/core/node`, shared with the runtime.\n * All temp files go to os.tmpdir() by default.\n */\nexport {\n getTmpPath,\n createTmpResolver,\n getDefaultTmpRoot,\n type TmpResolver,\n} from '@walkeros/core/node';\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 * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { fetchFailureReason } from '../core/fetch-failure.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/** A config input named an http(s) URL that could not be read. */\nexport class ConfigFetchError extends Error {\n readonly url: string;\n /** The HTTP status, when the host answered. */\n readonly status?: number;\n\n constructor(message: string, url: string, status?: number) {\n super(message);\n this.name = 'ConfigFetchError';\n this.url = url;\n this.status = status;\n }\n}\n\n/**\n * Fetch content from a URL as a string.\n * Shared helper for all URL-loading paths.\n *\n * A plain GET with no credential for every host: a config input is any URL\n * the person names, and a link to a saved flow carries its own signature.\n *\n * @param url - HTTP/HTTPS URL to fetch\n * @returns Response body as a string\n * @throws ConfigFetchError if the host cannot be reached or answers non-OK\n */\nexport async function fetchContentString(url: string): Promise<string> {\n let response: Response;\n try {\n response = await fetch(url);\n } catch (error) {\n throw new ConfigFetchError(\n `Could not reach ${url}: ${fetchFailureReason(error)}`,\n url,\n );\n }\n if (!response.ok) {\n throw new ConfigFetchError(\n `Failed to fetch ${url}: ${response.status} ${response.statusText}`.trimEnd(),\n url,\n response.status,\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 (a URL that could not be read, a file not\n // found) as-is\n if (error instanceof ConfigFetchError || errorMessage.includes('not found'))\n throw error;\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","function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Why a request did not reach its host: `timeout after <ms> ms`, or the\n * network error with its code, such as `fetch failed (ECONNREFUSED)`. Read by\n * shape, not instanceof: an abort's DOMException can come from another realm.\n */\nexport function fetchFailureReason(error: unknown, timeoutMs?: number): string {\n if (!isRecord(error)) return String(error);\n if (error.name === 'TimeoutError')\n return timeoutMs === undefined\n ? 'timeout'\n : `timeout after ${timeoutMs} ms`;\n const message =\n typeof error.message === 'string' ? error.message : String(error);\n const cause = error.cause;\n const code =\n isRecord(cause) && typeof cause.code === 'string' ? cause.code : undefined;\n return code ? `${message} (${code})` : message;\n}\n","export { getErrorMessage } from '@walkeros/core';\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(\n stream: NodeJS.ReadableStream = process.stdin,\n): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n // A stream may yield strings as well as buffers.\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : 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","/** The one credential the CLI sends: WALKEROS_TOKEN, a token from Account > Automation tokens. */\nexport function resolveAccessToken(): string | null {\n const token = process.env.WALKEROS_TOKEN;\n return token ? token : null;\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","/**\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","import path from 'path';\nimport fs from 'fs-extra';\nimport { getTmpPath } from './tmp.js';\n\n/** What a per-run temp dir is for; names the middle path segment. */\nexport type TmpRunKind =\n | 'push'\n | 'build'\n | 'bundle'\n | 'wrap'\n | 'archive'\n | 'setup';\n\n/**\n * Create a unique per-run temp dir `<root>/walkeros/<kind>/<6 chars>`.\n *\n * Every segment stays short, so log redaction never mistakes a temp path for\n * a secret-shaped token run (a timestamp plus a random suffix, or a UUID, is\n * exactly that shape). The caller removes the dir when done.\n */\nexport async function tmpRunDir(\n kind: TmpRunKind,\n tmpDir?: string,\n): Promise<string> {\n const parent = getTmpPath(tmpDir, 'walkeros', kind);\n await fs.ensureDir(parent);\n return fs.mkdtemp(parent + path.sep);\n}\n","import { c as tarCreate } from 'tar';\n\n/**\n * Pack a node-platform bundle directory into a gzip tarball.\n *\n * The directory is expected to be shaped like `runNftServerPath` leaves it:\n * `flow.mjs` (the factory), an optional sibling `node_modules/`, and\n * `package.json`. Entries are added relative to `dir` (`cwd`), so the resulting\n * archive holds them at its root with no absolute paths.\n *\n * The caller passes the exact `entries` to pack (relative to `dir`). The\n * caller is responsible for filtering to entries that exist on disk: when a\n * flow's deps are fully inlined by esbuild, no `node_modules/` is emitted and\n * `tar.c` would otherwise throw `ENOENT` on the missing path.\n *\n * @param dir - Directory containing the bundle artifacts to pack.\n * @param outFile - Destination `.tar.gz`/`.tgz` path for the gzip tarball.\n * @param entries - Relative entries to include (e.g. `flow.mjs`, `package.json`).\n */\nexport async function packBundleDir(\n dir: string,\n outFile: string,\n entries: string[],\n): Promise<void> {\n await tarCreate({ gzip: true, cwd: dir, file: outFile }, entries);\n}\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n * Uses Zod schemas from @walkeros/core for Flow.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};\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 { validateFlowStructure } from '@walkeros/core/dev';\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';\nimport { configDigest } from '../core/content-digest.js';\nimport {\n assertWindowCollector,\n type WindowCollectorSource,\n} from './window-collector.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 * Digest of the deferred flow settings, the config input of the default\n * release. Never carries an env or secret value.\n */\n configDigest: 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 /**\n * Base environment for web `$env` resolution, layered BENEATH the flow's\n * declared `config.bundle.env`. Omitted, it is the shell's `process.env`\n * (local builds). Pass `{}` for a hermetic build that resolves against the\n * declared values alone. Server flows are unaffected: their `$env` is read\n * at runtime.\n */\n buildEnv?: Record<string, string | undefined>;\n /** Logger for warnings */\n logger?: {\n warn: (message: string) => void;\n info: (message: string) => void;\n };\n}\n\n/**\n * The bundle preflight: the structural checks `walkeros validate` runs\n * (`validateFlowStructure`), on the flow being built. A flow validate\n * rejects (an unknown key, a mapping field with no effect at its position,\n * a malformed reference) stops here, before anything is resolved or built,\n * and the error names every path.\n */\nfunction assertFlowStructure(config: Flow.Json, flowName: string): void {\n const { errors } = validateFlowStructure({\n ...config,\n flows: { [flowName]: config.flows[flowName] },\n });\n if (errors.length === 0) return;\n const lines = errors.map((error) => ` - ${error.path}: ${error.message}`);\n throw new Error(`Invalid configuration:\\n${lines.join('\\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 assertFlowStructure(config, flowName);\n assertLiteralBuildEnv(config, flowName);\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 const flowConfigDigest = configDigest(flowSettings, flowName);\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. The\n // values come from an explicit map, never from an ambient read, so a build\n // inside a process holding its own secrets cannot inline them.\n if (platform === 'web') {\n flowSettings = getFlowSettings(config, flowName, {\n env: resolveBuildEnv(flowSettings.config?.bundle?.env, options.buildEnv),\n });\n }\n\n // Auto-inject validator transformers for any step-level `validate?:`\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 + flow settings + CLI overrides\n const buildOptions: BuildOptions = {\n ...buildDefaults,\n ...settingsToBuildOptions(platform, flowSettings.config?.settings, {\n path: `flows.${flowName}.config.settings.windowCollector`,\n written: config.flows[flowName]?.config?.settings?.windowCollector,\n }),\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 configDigest: flowConfigDigest,\n };\n}\n\n/**\n * The build options a flow's `config.settings` controls. Each key is mapped\n * explicitly, so an unknown settings key never reaches generated code.\n *\n * - `windowCollector` (web): the global the collector instance is assigned\n * to. It is interpolated into the generated entry, so the resolved value\n * must be a JavaScript identifier.\n */\nexport function settingsToBuildOptions(\n platform: 'web' | 'server',\n settings: Flow.Settings | undefined,\n source: WindowCollectorSource = {},\n): Pick<BuildOptions, 'windowCollector'> {\n if (platform !== 'web' || settings?.windowCollector === undefined) return {};\n return {\n windowCollector: assertWindowCollector(settings.windowCollector, source),\n };\n}\n\n/** Any reference or marker the resolver would act on inside a string. */\nconst REFERENCE_PATTERN =\n /\\$(?:env|var|secret|flow|contract)\\.|\\$code:|__WALKEROS_(?:ENV|SECRET):/;\n\n/**\n * `config.bundle.env` values are the declared build values themselves, so\n * each must be a literal string. A reference there would be resolved (or\n * turned into a runtime marker) instead of declared, so it is refused. The\n * message names keys only, never values.\n */\nfunction assertLiteralBuildEnv(config: Flow.Json, flowName: string): void {\n const declared = config.flows[flowName]?.config?.bundle?.env;\n if (!declared) return;\n const refs = Object.entries(declared)\n .filter(([, value]) => REFERENCE_PATTERN.test(value))\n .map(([key]) => key);\n if (refs.length > 0) {\n throw new Error(\n `config.bundle.env values must be literal strings; references are not allowed in: ${refs.join(', ')}`,\n );\n }\n}\n\n/**\n * The map web `$env` references resolve against: the base environment\n * (`process.env` unless the caller passes one) with the flow's declared\n * `config.bundle.env` on top.\n */\nexport function resolveBuildEnv(\n declared: Record<string, string> | undefined,\n base: Record<string, string | undefined> = process.env,\n): Record<string, string | undefined> {\n return { ...base, ...(declared ?? {}) };\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 /**\n * The config at `configPath`, already read by the caller: it is used\n * instead of reading the path again (`configPath` still anchors\n * relative paths).\n */\n raw?: unknown;\n },\n): Promise<LoadConfigResult> {\n const { raw, ...rest } = options ?? {};\n const rawConfig = raw !== undefined ? raw : await loadJsonConfig(configPath);\n return loadBundleConfig(rawConfig, { configPath, ...rest });\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 * Content digests for build cache keys and the default release id.\n *\n * Every input is content the bundler consumes: the deferred flow settings,\n * the resolved package set (local packages by the bytes of their installed\n * copy) and the CLI version. Environment and secret values are never inputs,\n * only their markers, so a digest leaks none of them.\n */\n\nimport { createHash } from 'node:crypto';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\n\nconst DIGEST_LENGTH = 12;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** JSON with object keys sorted at every depth. Arrays keep their order. */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(value, (_key, inner: unknown) => {\n if (!isRecord(inner)) return inner;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(inner).sort()) sorted[key] = inner[key];\n return sorted;\n });\n}\n\n/**\n * Hash a flow's deferred settings (its `$env` and `$secret` references are\n * still markers). `collector.release` is left out and `collector.name`\n * defaults to the flow name, so the digest names the config the release is\n * derived from. Declared `config.bundle.env` values are reduced to their keys:\n * they are the values web `$env` references resolve to.\n */\nexport function configDigest(flowSettings: Flow, flowName: string): string {\n const collector: Record<string, unknown> = {\n ...(flowSettings.collector ?? {}),\n };\n delete collector.release;\n collector.name ??= flowName;\n\n const config = flowSettings.config;\n const declaredEnv = config?.bundle?.env;\n const hashedConfig =\n config && declaredEnv\n ? {\n ...config,\n bundle: { ...config.bundle, env: Object.keys(declaredEnv).sort() },\n }\n : config;\n\n return createHash('sha256')\n .update(canonicalJson({ ...flowSettings, config: hashedConfig, collector }))\n .digest('hex');\n}\n\n/**\n * Hash an installed package directory: every file by relative path and bytes,\n * a symlink by its target. Paths are sorted, so file system order and mtimes\n * never change the result.\n */\nexport async function hashInstalledDir(dir: string): Promise<string> {\n const hash = createHash('sha256');\n for (const rel of await listFiles(dir, '')) {\n const abs = path.join(dir, rel);\n const stat = await fs.lstat(abs);\n hash.update(`${rel}\\0`);\n hash.update(\n stat.isSymbolicLink() ? await fs.readlink(abs) : await fs.readFile(abs),\n );\n hash.update('\\0');\n }\n return hash.digest('hex').slice(0, DIGEST_LENGTH);\n}\n\nasync function listFiles(root: string, rel: string): Promise<string[]> {\n const entries = await fs.readdir(path.join(root, rel), {\n withFileTypes: true,\n });\n const files: string[] = [];\n for (const entry of entries) {\n const entryRel = rel ? `${rel}/${entry.name}` : entry.name;\n if (entry.isDirectory()) files.push(...(await listFiles(root, entryRel)));\n else files.push(entryRel);\n }\n return files.sort();\n}\n\nexport interface ReleaseDigestInput {\n /** {@link configDigest} of the flow. */\n configDigest: string;\n /** Sorted `name@version` lines, a local package as `name@local:<hash>`. */\n versions: string[];\n /** CLI version, since generated code changes with it. */\n toolchain: string;\n}\n\n/** Default release id: 12 lowercase hex over config, packages and CLI. */\nexport function releaseDigest(input: ReleaseDigestInput): string {\n return createHash('sha256')\n .update(\n canonicalJson({\n config: input.configDigest,\n versions: input.versions,\n toolchain: input.toolchain,\n }),\n )\n .digest('hex')\n .slice(0, DIGEST_LENGTH);\n}\n","import { checkWindowCollector } from '@walkeros/core';\n\n/** Where a collector global name came from, for the error message. */\nexport interface WindowCollectorSource {\n /** Setting path, e.g. `flows.web.config.settings.windowCollector`. */\n path?: string;\n /** The value as written, when it was a `$var` / `$env` reference. */\n written?: unknown;\n}\n\n/**\n * Return `value` as the collector global name, or throw when it is not a\n * JavaScript identifier or names a reserved global. The name is interpolated\n * into generated code, so every build path checks it before use.\n */\nexport function assertWindowCollector(\n value: unknown,\n source: WindowCollectorSource = {},\n): string {\n const check = checkWindowCollector(value);\n if (check.ok) return check.name;\n const path = source.path ?? 'config.settings.windowCollector';\n const subject =\n source.written !== undefined && source.written !== value\n ? `${JSON.stringify(source.written)} resolved to ${JSON.stringify(value)}, which`\n : JSON.stringify(value);\n throw new Error(`${path}: ${subject} ${check.reason}.`);\n}\n","import esbuild from 'esbuild';\nimport { builtinModules } from 'module';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport fs from 'fs-extra';\nimport type { Flow, MoinTarget, ObserveWeb, PreviewKey } from '@walkeros/core';\nimport {\n getPlatform,\n packageNameToVariable,\n getStepRuntimeProps,\n ENV_MARKER_PREFIX,\n SECRET_MARKER_PREFIX,\n STEP_FUNCTION_KEYS,\n isPathStepEntry,\n isObject,\n} from '@walkeros/core';\nimport {\n classifyStepProperties,\n containsCodeMarkers,\n} from './config-classifier.js';\nimport {\n validateComponentNames,\n validateReference,\n validateStoreReferences,\n} from '@walkeros/core/dev';\n\n// Re-export the structural validators so existing import sites keep resolving\n// them from `./bundler`. The implementations live in `@walkeros/core/dev` so\n// they can run without loading esbuild.\nexport { validateComponentNames, validateReference, validateStoreReferences };\n\nimport {\n parsePackageSpec,\n detectStepPackages,\n collectAllStepPackages,\n applyStepPackages,\n} from '../../core/step-packages.js';\n\n// Re-export so existing import sites (tests, public entry) keep resolving\n// them from './bundler'. Implementations live in core/step-packages so they\n// can run without loading esbuild.\nexport {\n parsePackageSpec,\n detectStepPackages,\n collectAllStepPackages,\n applyStepPackages,\n};\n\n/**\n * Type guard to check if a code value is an InlineCode object: `push`, an\n * optional `type`, and the other step functions (`STEP_FUNCTION_KEYS`).\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 * A reference carries inline code when it is an InlineCode object or (legacy)\n * a string. Used by the codegen step-filtering below.\n */\nfunction hasCodeReference(code: unknown): boolean {\n return isInlineCode(code) || typeof code === 'string';\n}\n\n/**\n * Generates inline code for any component type (source, destination,\n * transformer, store). Emits every step function the code defines\n * (`STEP_FUNCTION_KEYS`: push, pushBatch, init, on, destroy), each with its\n * $code: prefix removed, so none is dropped on the way into the bundle.\n *\n * @param inline - InlineCode object with push, optional type and functions\n * @param runtimeProps - The step's runtime fields (`getStepRuntimeProps`),\n * emitted beside the code. `config` and `env` default to `{}`.\n * @param isDestination - Whether this is a destination (uses different code structure)\n */\nfunction generateInlineCode(\n inline: Flow.Code,\n runtimeProps: Record<string, unknown>,\n isDestination?: boolean,\n): string {\n const typeLine = inline.type ? `type: '${inline.type}',` : '';\n const functionLines = STEP_FUNCTION_KEYS.flatMap((key) => {\n const fn = inline[key];\n return fn ? [`${key}: ${fn.replace('$code:', '')}`] : [];\n }).join(',\\n ');\n\n const props: Record<string, unknown> = {\n config: {},\n env: {},\n ...runtimeProps,\n };\n const propLines = Object.entries(props)\n .map(([key, value]) => `${key}: ${processConfigValue(value)}`)\n .join(',\\n ');\n\n // Destinations have a different structure - code is the instance directly\n if (isDestination) {\n return `{\n code: {\n ${typeLine}\n config: ${processConfigValue(props.config)},\n ${functionLines}\n },\n ${propLines}\n }`;\n }\n\n // Sources, transformers and stores use factory pattern\n return `{\n code: async (context) => ({\n ${typeLine}\n config: context.config,\n ${functionLines}\n }),\n ${propLines}\n }`;\n}\nimport type { BuildOptions } from '../../types/bundle.js';\nimport {\n downloadPackagesWithResolution,\n loadNpmConfigForPacote,\n} from '../../core/package-manager.js';\nimport {\n traceAndCopy,\n assertDepsTraced,\n collectImportedPackages,\n} from './nft-trace.js';\nimport { assertConsumerDepsSatisfied } from './assert-consumer-deps.js';\nimport { buildFlagDefines, flowNeeds, needsMarker } from './build-flags.js';\nimport type { Logger } from '@walkeros/core';\nimport { getHashServer } from '@walkeros/server-core';\nimport { getTmpPath } from '../../core/tmp.js';\nimport { tmpRunDir } from '../../core/tmp-names.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';\nimport { assertWindowCollector } from '../../config/window-collector.js';\nimport { hashInstalledDir, releaseDigest } from '../../core/content-digest.js';\nimport { VERSION } from '../../version.js';\n\nexport interface BundleStats {\n totalSize: number;\n packages: { name: string }[];\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 */\nexport function 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 // The format the served artifact is emitted in, derived from `platform`\n // (browser=iife, node=esm) rather than the declared `buildOptions.format`.\n // Including it in the key one-time-invalidates any cache entry written by an\n // older CLI that emitted ESM for a browser build, so a stale ESM artifact is\n // never served. It does NOT detect a runtime divergence: because it is\n // re-derived from `platform`, removing the `format:'iife'` line below would\n // not change this key. The durable cross-version cache bust is the\n // version/toolchain hash, not this field.\n emittedFormat: resolveEmittedFormat(buildOptions),\n versionsHash,\n // Generated code changes with the CLI, so a CLI upgrade never serves a\n // build made by the previous version.\n toolchain: VERSION,\n };\n return JSON.stringify(configForCache);\n}\n\n/**\n * The format the served (stage-2 / wrap) artifact is emitted in, derived from\n * platform. Browser artifacts are IIFE-wrapped so internal declarations stay\n * private; node/server artifacts stay ESM (they rely on a `createRequire`\n * banner and bare ESM imports). Stage-1 skeletons are always ESM and are not\n * served, so they are not represented here.\n */\nfunction resolveEmittedFormat(buildOptions: BuildOptions): 'iife' | 'esm' {\n return buildOptions.platform === 'browser' ? 'iife' : 'esm';\n}\n\n/**\n * Provenance a `bundle` run bakes onto the collector. Push and simulate pass\n * none, so their events keep the runtime release.\n */\nexport interface BundleProvenance {\n /** Keys this flow's entry in `event.source.release`. */\n flowName: string;\n /** Explicit release id (`--release`). Beats an authored one. */\n release?: string;\n /** Config input of the default release, from `loadBundleConfig`. */\n configDigest: string;\n}\n\n/**\n * The resolved top-level set as sorted `name@version` lines. A local package\n * has no version, so it is named by the content of its installed copy: a\n * rebuilt `path` package gives a new line.\n */\nexport async function resolvedVersionLines(\n topLevel: Map<string, { version: string }>,\n packagePaths: Map<string, string>,\n): Promise<string[]> {\n const lines: string[] = [];\n for (const [name, pkg] of [...topLevel.entries()].sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n const installed = packagePaths.get(name);\n lines.push(\n pkg.version === 'local' && installed\n ? `${name}@local:${await hashInstalledDir(installed)}`\n : `${name}@${pkg.version}`,\n );\n }\n return lines;\n}\n\nexport async function bundleCore(\n flowSettings: Flow,\n buildOptions: BuildOptions,\n logger: Logger.Instance,\n showStats = false,\n provenance?: BundleProvenance,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n\n // Shared cache root\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 // Per-build isolation: a unique working dir, created right before the\n // `try` whose `finally` removes it.\n const TEMP_DIR = buildOptions.tempDir || (await tmpRunDir('build'));\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 applyStepPackages(flowSettings, buildOptions.packages, logger);\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 // Defense-in-depth: walk every installed package and assert that each\n // declared dependency resolves (Node-style nearest-ancestor lookup) to a\n // satisfying version. Catches resolver bugs, future regressions, and\n // unforeseen hoisting issues before esbuild/nft pick up wrong code.\n if (process.env.BUNDLER_STRICT_RANGES !== '0') {\n await assertConsumerDepsSatisfied(TEMP_DIR, logger);\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 = await resolvedVersionLines(\n resolutionResult.topLevel,\n packagePaths,\n );\n const versionsHash = await getHashServer(sortedVersions.join('\\n'), 12);\n\n // Collector defaults, for every call shape (`walkeros push` and simulate\n // pass no provenance), then provenance: both before the L1 check and\n // codegen, so they sit in both the cache key and the artifact.\n applyCollectorDefaults(flowSettings);\n if (provenance) {\n applyCollectorProvenance(\n flowSettings,\n provenance.flowName,\n provenance.release,\n () =>\n releaseDigest({\n configDigest: provenance.configDigest,\n versions: sortedVersions,\n toolchain: VERSION,\n }),\n );\n }\n // Step packages externalized by esbuild. Use the packages the user (or\n // auto-add) actually declared, not pacote's full top-level set: peer\n // dependencies pacote installs (e.g. zod for schema validation) are\n // inlined unless declared. The nft cross-check narrows this further to\n // the declared packages the bundle actually imports.\n const declaredPackages = 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 await finishArtifact(\n outputPath,\n flowSettings,\n buildOptions,\n TEMP_DIR,\n declaredPackages,\n logger,\n );\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 }),\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, devPackages } =\n await createEntryPoint(flowSettings, buildOptions, packagePaths, logger);\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 // Deploy browser skeletons (externalizeDev) externalize each `<pkg>/dev`\n // so the lazy registry is not inlined; in-process simulate/push inline it.\n // Record the externals only when they are actually emitted, otherwise two\n // builds with identical entry code but different inline/external `/dev`\n // would alias the same L2 slot and one would receive the other's bytes.\n externals: new Set(\n buildOptions.platform === 'browser' &&\n buildOptions.externalizeDev === true\n ? devPackages.map((p) => `${p}/dev`)\n : [],\n ),\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 // Retained but inert (deprecation surface): no codegen reads it anymore.\n // Keeping it here only over-keys the code cache, which is harmless.\n windowElb: buildOptions.windowElb,\n versionsHash,\n toolchain: VERSION,\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 declaredPackages,\n devPackages,\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 // The skeleton is the build-once, introspectable currency every downstream\n // consumer shares: it exports wireConfig/startFlow/__configData (+__devExports)\n // so simulate and preview can introspect and re-wire it, while web/server\n // deploy wrap or run it. One artifact, many targets, so do NOT collapse it into\n // a finished bundle here. For node, step packages stay EXTERNAL on purpose so\n // nft materializes them into a sibling node_modules/ the host resolves on disk\n // (the only way native addons like sqlite .node files can ship); inlining here\n // would break server simulate and native destinations.\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 // A browser skeleton ends with its flow's needs, which the publish-time\n // wrap reads to define the build flags. Appended after the cached stage\n // 1 code, so the code cache key is unchanged.\n const needs =\n buildOptions.platform === 'browser'\n ? `\\n${needsMarker(flowNeeds(flowSettings))}\\n`\n : '';\n const esmOutput = `${banner}${compiledCode}\\n${dataDeclaration}${needs}`;\n await fs.writeFile(outputPath, esmOutput);\n } else {\n // Production path: stage 2 esbuild compilation. Reached only by `cdn`\n // (withDev:false), which emits no `__devExports` registry, so there is no\n // `import('<pkg>/dev')` to externalize here. A future registry-bearing\n // non-skeleton browser target would need to externalize `<pkg>/dev` on the\n // browser branch below (gated on `externalizeDev`) to stay dev-free.\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 observe: readObserveConnect(flowSettings, logger),\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 // Emit the final browser artifact as an IIFE. The served bundle runs\n // as a classic <script> at global scope, so an ESM body would leak its\n // minified top-level declarations (e.g. `ga`) onto `window` and collide\n // with globals like Google Analytics. The IIFE wraps everything in a\n // private closure; the intentional `window.elb`/`window.walkerOS`\n // assignments live inside the entry's own async IIFE and reference\n // `window` explicitly, so they still run. The browser entry has zero\n // exports, so no `globalName` is needed (one would add a window var).\n stage2Options.format = 'iife';\n // The entry's Tag Mode loader comes from the CLI's own web-core,\n // never from a copy in TEMP_DIR, which may predate it.\n stage2Options.plugins = [cliPackagesPlugin()];\n // Every build flag is defined from the flow's needs, so a feature the\n // flow does not use folds out (see build-flags.ts).\n stage2Options.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n ...buildFlagDefines(flowNeeds(flowSettings)),\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 = [...getNodeExternals(), ...declaredPackages];\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 await finishArtifact(\n outputPath,\n flowSettings,\n buildOptions,\n TEMP_DIR,\n declaredPackages,\n logger,\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 return stats;\n } catch (error) {\n throw error;\n } finally {\n // Clean up per-build directory (contains entry.js with potential secrets).\n // Awaited: a process that exits right after the build must not leave it.\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR).catch(() => {});\n }\n }\n}\n\n/**\n * Whether a build ships the flow's `include` folders. Only a server artifact\n * reads them at runtime; a browser bundle is served on its own. Shared by the\n * bundler and the manifest build gate, so both agree on when `include` reads\n * the local disk.\n */\nexport function includeApplies(buildOptions: {\n platform: 'node' | 'browser';\n}): boolean {\n return buildOptions.platform !== 'browser';\n}\n\n/**\n * The steps every build runs once its output file is written, whether it came\n * from the cache or a fresh esbuild run, so the two paths cannot drift.\n */\nasync function finishArtifact(\n outputPath: string,\n flowSettings: Flow,\n buildOptions: BuildOptions,\n tempDir: string,\n declaredPackages: string[],\n logger: Logger.Instance,\n): Promise<void> {\n if (buildOptions.platform === 'node') {\n // Server path: trace the emitted bundle, copy used files into\n // `outDir/node_modules/`, write an informational sidecar package.json.\n // This emits the sibling node_modules/ that every server host (deploy\n // container, simulate-server) resolves the external @walkeros/* from.\n // Load-bearing, do not remove.\n await runNftServerPath(\n outputPath,\n flowSettings,\n buildOptions,\n tempDir,\n declaredPackages,\n logger,\n );\n }\n // Web flows don't ship a sidecar node_modules: esbuild emits a\n // self-contained IIFE.\n\n if (!buildOptions.include || buildOptions.include.length === 0) return;\n if (!includeApplies(buildOptions)) {\n logger.info(\n 'include is ignored for web builds: a browser bundle cannot read local folders.',\n );\n return;\n }\n await copyIncludes(\n buildOptions.include,\n buildOptions.configDir || process.cwd(),\n path.dirname(outputPath),\n logger,\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 // Report the packages bundled. Per-package byte attribution is not available\n // without the esbuild metafile, which this two-stage pipeline does not\n // capture, so the breakdown is names only — never a synthesized size.\n const packageStats = Object.entries(packages).map(([name, pkg]) => ({\n name: `${name}@${pkg.version || 'latest'}`,\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 devPackages: 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 // MUST stay ESM: the stage-1 skeleton is imported (via `await import`) for\n // its named exports (`wireConfig`/`startFlow`/`__configData`/`__devExports`)\n // by simulate/preview/push and the wrap step. esbuild's `iife` format\n // silently drops exports, which would break those consumers.\n format: 'esm' as esbuild.Format,\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n absWorkingDir: tempDir, // Resolve modules from temp directory\n // alias removed - not needed with absWorkingDir\n mainFields: ['module', 'main'], // Prefer ESM over CJS\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\n sourcemap: buildOptions.sourcemap,\n resolveExtensions: ['.mjs', '.js', '.ts', '.json'], // Prefer .mjs\n\n // Enhanced minification options when minify is enabled\n ...(buildOptions.minify && {\n minifyWhitespace: buildOptions.minifyOptions?.whitespace ?? true,\n minifyIdentifiers: buildOptions.minifyOptions?.identifiers ?? true,\n minifySyntax: buildOptions.minifyOptions?.syntax ?? true,\n legalComments: buildOptions.minifyOptions?.legalComments ?? 'none',\n keepNames: buildOptions.minifyOptions?.keepNames ?? false,\n charset: 'utf8',\n }),\n };\n\n // Platform-specific configurations\n if (buildOptions.platform === 'browser') {\n baseOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n // For browser bundles, let users handle Node.js built-ins as needed.\n // Externalize each `<pkg>/dev` ONLY for deploy skeletons\n // (`externalizeDev: true`). Then the registry stays a literal\n // `import('<pkg>/dev')` instead of inlining the /dev graph (zod schemas\n // etc.), and the deploy wrap DCEs the unreferenced registry to zero bytes.\n //\n // For in-process simulate/push (`externalizeDev: false`/undefined), do NOT\n // externalize: esbuild inlines the /dev graph back into the single ESM, so\n // the lazy thunk resolves an already-bundled module. That is what lets the\n // lean simulate-server (cli + core only, no sibling node_modules) resolve\n // schemas host-free. `devPackages` is also empty for the finished IIFE\n // (`cdn`, withDev:false), so the list is empty there regardless.\n const devSubpathExternals =\n buildOptions.externalizeDev === true\n ? devPackages.map((p) => `${p}/dev`)\n : [];\n baseOptions.external = [\n ...(buildOptions.external || []),\n ...devSubpathExternals,\n ];\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. Keeping step packages\n // external (not inlined) is what lets the host resolve them from the\n // nft-traced sibling node_modules/, which is what makes server simulate\n // and native-addon destinations work; inlining would regress both.\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 * 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// Marks the plugin's own lookup, so it is not intercepted again.\nconst CLI_PACKAGES = 'walkeros-cli-packages';\n\n/**\n * Resolves every `@walkeros/core` and `@walkeros/web-core` import of a\n * generated entry (the Tag Mode loader, the preview activator) from this\n * module's own location: the CLI's own walkerOS packages, the ones it was\n * installed with. Resolving from the entry's temp dir would walk up through\n * every `node_modules` above it, where another copy (a flow's pinned one, or a\n * stray install in a shared temp root) can shadow it, or predate the loader.\n */\nexport function cliPackagesPlugin(): esbuild.Plugin {\n const resolveDir = path.dirname(fileURLToPath(import.meta.url));\n return {\n name: CLI_PACKAGES,\n setup(build) {\n build.onResolve(\n { filter: /^@walkeros\\/(core|web-core)$/ },\n async (args) => {\n if (args.pluginData === CLI_PACKAGES) return undefined;\n const resolved = await build.resolve(args.path, {\n kind: args.kind,\n resolveDir,\n pluginData: CLI_PACKAGES,\n });\n if (resolved.errors.length > 0) return { errors: resolved.errors };\n return { path: resolved.path, sideEffects: resolved.sideEffects };\n },\n );\n },\n };\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 * `declaredPackages` are the non-path `bundle.packages` keys. Those the\n * bundle imports must reach the trace (the cross-check catches\n * dynamic-require regressions and hoisted-symlink mistakes); those nothing\n * imports or traces get a warning.\n */\nasync function runNftServerPath(\n outputPath: string,\n flowSettings: Flow,\n buildOptions: BuildOptions,\n tempDir: string,\n declaredPackages: 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 declared package the bundle imports must appear in\n // the trace output. Catches hoisted-symlink misses, nft per-release\n // regressions, and dynamic-require deps nft cannot statically follow.\n if (declaredPackages.length > 0) {\n const unused = assertDepsTraced({\n fileList: trimmedFileList,\n declaredPackages,\n importedPackages: await collectImportedPackages(outputPath),\n });\n for (const name of unused) {\n logger.warn(\n `Package ${name} is declared in bundle.packages but nothing imports it; it is not in the bundle. Remove it from bundle.packages if unused.`,\n );\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 * Detects named-import requests across sources, destinations, transformers, stores.\n * Returns a map of package names to sets of export names that must be named-imported.\n */\nexport function detectNamedImports(\n flowSettings: Flow,\n): Map<string, Set<string>> {\n const namedImports = new Map<string, Set<string>>();\n\n const addNamed = (pkg: string, importName: string): void => {\n if (!namedImports.has(pkg)) namedImports.set(pkg, new Set());\n namedImports.get(pkg)!.add(importName);\n };\n\n const visit = (\n bucket: Record<string, { package?: string; import?: string }> | undefined,\n ): void => {\n if (!bucket) return;\n for (const step of Object.values(bucket)) {\n if (typeof step.package === 'string' && typeof step.import === 'string') {\n addNamed(step.package, step.import);\n }\n }\n };\n\n visit(flowSettings.sources);\n visit(flowSettings.destinations);\n visit(flowSettings.transformers);\n visit(flowSettings.stores);\n\n return namedImports;\n}\n\ninterface ImportGenerationResult {\n importStatements: string[];\n devExportEntries: string[];\n // `'<pkg>': [\"exportA\", \"exportB\"]` per package declaring\n // `walkerOS.exports`, read from the copy being bundled. Emitted beside\n // `__devExports` so simulate can tell which export a step's examples\n // belong to.\n packageExportEntries: string[];\n // Packages that received a lazy `/dev` registry entry. Exposed so a later\n // browser-build step can externalize the same `<pkg>/dev` specifiers without\n // recomputing the set (preventing drift between the registry and externals).\n devPackages: 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 namedImports: 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 hasNamed = namedImports.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 a named import is specified (allows packages without default export)\n if (isUsedByDestOrSource && !hasNamed) {\n const varName = packageNameToVariable(packageName);\n importStatements.push(`import ${varName} from '${packageName}';`);\n }\n\n // 2. Generate named import when steps reference an export by name\n if (hasNamed) {\n const codes = Array.from(namedImports.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 || hasNamed) {\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 named imports\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 // Register the /dev surface for packages that expose a ./dev export as a\n // lazy dynamic import: `'<pkg>': () => import('<pkg>/dev')`. The specifier\n // stays a literal so a node host can resolve it and esbuild can statically\n // analyse it. Because the registry entry is an unreferenced thunk, the\n // deploy wrap DCEs the whole /dev graph (zod schemas, etc.) to zero bytes,\n // while simulate/push await the thunk to pull the dev module in on demand.\n // The same dev-package set is reused for browser-build externals via\n // computeDevPackages, so the registry and externals can never drift apart.\n const devPackages = withDev\n ? await computeDevPackages(usedPackages, packagePaths)\n : [];\n const devExportEntries = devPackages.map(\n (packageName) => `'${packageName}': () => import('${packageName}/dev')`,\n );\n const packageExports = withDev\n ? await computePackageExports(usedPackages, packagePaths)\n : {};\n const packageExportEntries = Object.entries(packageExports).map(\n ([packageName, exportNames]) =>\n `'${packageName}': ${JSON.stringify(exportNames)}`,\n );\n\n return {\n importStatements,\n devExportEntries,\n packageExportEntries,\n devPackages,\n };\n}\n\n/**\n * Reads the export names each package declares in its package.json\n * `walkerOS.exports`, from the copy being bundled (`packagePaths`).\n * Packages without the field are left out.\n */\nexport async function computePackageExports(\n usedPackages: Iterable<string>,\n packagePaths: Map<string, string>,\n): Promise<Record<string, string[]>> {\n const result: Record<string, string[]> = {};\n for (const packageName of usedPackages) {\n const localPath = packagePaths.get(packageName);\n if (!localPath) continue;\n\n try {\n const pkgJson = await fs.readJSON(path.join(localPath, 'package.json'));\n const exports = pkgJson?.walkerOS?.exports;\n if (exports && typeof exports === 'object' && !Array.isArray(exports))\n result[packageName] = Object.keys(exports);\n } catch {\n // Package doesn't have a readable package.json, skip gracefully\n }\n }\n return result;\n}\n\n/**\n * Resolves which of the given packages expose a `./dev` subpath export.\n * Single source of truth for the lazy `/dev` registry codegen and for the\n * browser build's `/dev` externals, keeping the two in lockstep.\n */\nexport async function computeDevPackages(\n usedPackages: Iterable<string>,\n packagePaths: Map<string, string>,\n): Promise<string[]> {\n const devPackages: string[] = [];\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 devPackages.push(packageName);\n }\n } catch {\n // Package doesn't have a readable package.json, skip gracefully\n }\n }\n return devPackages;\n}\n\n/** Package name of the browser source, the single writer of window[settings.elb]. */\nconst BROWSER_SOURCE_PACKAGE = '@walkeros/web-source-browser';\n\n/**\n * Strip an optional version/range suffix from a package spec so\n * `@walkeros/web-source-browser@2.0.0` matches the bare package name.\n */\nfunction packageSpecName(spec: string): string {\n return parsePackageSpec(spec).name;\n}\n\n/** Read `config.settings.elb` from a source step, or undefined if not a string. */\nfunction readSourceElb(source: Flow.Source): string | undefined {\n if (!isObject(source.config)) return undefined;\n const settings = source.config.settings;\n if (!isObject(settings)) return undefined;\n return typeof settings.elb === 'string' ? settings.elb : undefined;\n}\n\n/**\n * Forward the deprecated `flow.config.settings.windowElb` build hint onto the\n * browser source's own `config.settings.elb`.\n *\n * The browser source is the single writer of `window[settings.elb]` (default\n * 'elb'); the bundle no longer emits a competing `window[windowElb] = elb`\n * assignment. Forwarding keeps a custom global name working through the\n * deprecation window. Runs before config embedding so the forwarded value lands\n * inside the bundle's `__configData`.\n *\n * Matches only the canonical `@walkeros/web-source-browser` package by design:\n * this is a conservative deprecation shim, so forks or renamed repackages of the\n * browser source get the \"no effect\" warning rather than a silent forward.\n *\n * Never mutates the input flow. Warns once, naming both keys.\n */\nexport function bridgeWindowElb(flow: Flow, logger?: Logger.Instance): Flow {\n const raw = flow.config?.settings?.windowElb;\n if (typeof raw !== 'string' || raw === '') return flow;\n const windowElb = raw;\n\n const sources = flow.sources ?? {};\n const browserEntries = Object.entries(sources).filter(\n ([, source]) =>\n typeof source.package === 'string' &&\n packageSpecName(source.package) === BROWSER_SOURCE_PACKAGE,\n );\n\n if (browserEntries.length === 0) {\n logger?.warn(\n `config.settings.windowElb \"${windowElb}\" has no effect: the flow has no ${BROWSER_SOURCE_PACKAGE} source to install window[\"${windowElb}\"]. Remove config.settings.windowElb or add a browser source.`,\n );\n return flow;\n }\n\n const toForward = browserEntries.filter(\n ([, source]) => readSourceElb(source) === undefined,\n );\n\n if (toForward.length === 0) {\n logger?.warn(\n `config.settings.windowElb \"${windowElb}\" is ignored: the browser source already sets config.settings.elb. Remove the deprecated config.settings.windowElb.`,\n );\n return flow;\n }\n\n // Apply on a shallow clone so the input flow is never mutated.\n const nextSources: Record<string, Flow.Source> = { ...sources };\n for (const [id, source] of toForward) {\n const config = isObject(source.config) ? source.config : {};\n const settings = isObject(config.settings) ? config.settings : {};\n nextSources[id] = {\n ...source,\n config: { ...config, settings: { ...settings, elb: windowElb } },\n };\n }\n\n const forwardedIds = toForward.map(([id]) => id).join(', ');\n logger?.warn(\n `config.settings.windowElb is deprecated; set config.settings.elb on the browser source instead. Forwarded windowElb \"${windowElb}\" to config.settings.elb on sources.${forwardedIds}.`,\n );\n\n return { ...flow, sources: nextSources };\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 logger?: Logger.Instance,\n): Promise<{\n codeEntry: string;\n dataPayload: string;\n hasFlow: boolean;\n devPackages: string[];\n}> {\n // Bridge the deprecated windowElb build hint onto the browser source's\n // settings.elb before any config embedding, so the forwarded value is baked\n // into the __configData payload below.\n flowSettings = bridgeWindowElb(flowSettings, logger);\n\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 namedImports = detectNamedImports(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 {\n importStatements,\n devExportEntries,\n packageExportEntries,\n devPackages,\n } = await generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n transformerPackages,\n storePackages,\n namedImports,\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 devPackages,\n };\n }\n\n // Build split config object (code skeleton + data payload)\n const { storesDeclaration, codeConfigObject, dataPayload } =\n buildSplitConfigObject(flowSettings, namedImports);\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 // Declared exports per package, beside the registry (same withDev gate).\n // Always emitted with the dev surface, `{}` included, so a bundle without\n // it is reliably one built before it existed.\n const packageExportsBlock = withDev\n ? packageExportEntries.length > 0\n ? `\\nexport const __packageExports = {\\n ${packageExportEntries.join(',\\n ')},\\n};`\n : '\\nexport const __packageExports = {};'\n : '';\n\n // Return ESM module (imports + wireConfig + startFlow re-export + optional devExports)\n const fullModule = wireConfigModule + devExportsBlock + packageExportsBlock;\n const codeEntry = importsCode\n ? `${importsCode}\\n\\n${fullModule}`\n : fullModule;\n\n return { codeEntry, dataPayload, hasFlow: true, devPackages };\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 the wireConfig data payload for a flow as a plain object.\n *\n * This is the same object the bundler bakes into a skeleton as\n * `__configData` (section, step id, data-layer props), produced by the\n * same classification pass the bundler uses. Callers that inject data at\n * simulate time (the `data` option of the simulate functions) must build\n * the FULL payload from the FULL config with this helper; injection\n * replaces the baked payload, it does not merge.\n *\n * Mirrors the bundler's own call path (`detectNamedImports` feeding\n * `buildSplitConfigObject`) so the result stays identical to the baked\n * payload by construction.\n */\nexport function buildDataPayload(flowSettings: Flow): Record<string, unknown> {\n return buildSplitConfigObject(flowSettings, detectNamedImports(flowSettings))\n .dataPayloadObj;\n}\n\n/**\n * Bake the collector defaults a flow's platform sets: a server collector\n * skips consent-denied events (`consentDenied: 'skip'`, counted in\n * `status.destinations[id].skipped`, DEBUG) instead of queueing them, since\n * no consent change ever reaches a server flow after the event. An authored\n * `collector.consentDenied` wins; a web flow keeps the collector default\n * (`'queue'`).\n */\nexport function applyCollectorDefaults(flowSettings: Flow): void {\n if (getPlatform(flowSettings) !== 'server') return;\n const collector = flowSettings.collector ?? {};\n collector.consentDenied ??= 'skip';\n flowSettings.collector = collector;\n}\n\n/**\n * Bake flow-config provenance onto the collector before codegen.\n *\n * The flow name keys this flow's entry in `event.source.release`; the release\n * value stamps that key. An authored `collector.name` is kept. The release is\n * the explicit id when given, then an authored `collector.release`, then\n * `fallback()`, so a standalone bundle carries a release instead of the\n * runtime `__VERSION__` default.\n */\nexport function applyCollectorProvenance(\n flowSettings: Flow,\n flowName: string,\n release: string | undefined,\n fallback: () => string,\n): void {\n const collector = flowSettings.collector ?? {};\n collector.name ??= flowName;\n collector.release = release ?? collector.release ?? fallback();\n flowSettings.collector = collector;\n}\n\n/**\n * Build split config object from flow configuration.\n * Produces THREE outputs:\n * - codeConfigObject: skeleton with code references and __data.* placeholders\n * - dataPayloadObj: plain JSON-serializable object with settings, mappings, etc.\n * - dataPayload: the stringified form of dataPayloadObj the codegen embeds\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 namedImports: Map<string, Set<string>>,\n): {\n storesDeclaration: string;\n codeConfigObject: string;\n dataPayloadObj: Record<string, unknown>;\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 // Named-import step: use the user-specified export name\n if (typeof step.import === 'string' && step.package) {\n return step.import;\n }\n // Default-import step: derive the variable from the package name\n return packageNameToVariable(step.package!);\n }\n\n // Helper to build a split step entry for the code skeleton. `codeVar` is\n // undefined for a code-free path step: the runtime synthesizes its push.\n function buildSplitStepEntry(\n section: string,\n stepId: string,\n codeVar: string | undefined,\n runtimeProps: Record<string, unknown>,\n ): string {\n const { codeProps, dataProps } = classifyStepProperties(runtimeProps);\n\n const codeEntries: string[] = [];\n if (codeVar !== undefined) codeEntries.push(`code: ${codeVar}`);\n\n // Code-layer props (serialized with processConfigValue)\n for (const [key, value] of Object.entries(codeProps)) {\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 // Single emission path for every step kind. Which fields reach the runtime\n // is decided by STEP_FIELD_ROLES in @walkeros/core (getStepRuntimeProps),\n // never by a hand-written field list here.\n function buildStepEntry(\n kind: Flow.StepKind,\n section: string,\n stepId: string,\n step: FlowStep,\n ): string {\n const runtimeProps = getStepRuntimeProps(step, kind);\n if (isInlineCode(step.code)) {\n return ` ${stepId}: ${generateInlineCode(step.code, runtimeProps, kind === 'Destination')}`;\n }\n const codeVar = isPathStepEntry({ ...step }, kind)\n ? undefined\n : resolveCodeVar(step);\n return buildSplitStepEntry(section, stepId, codeVar, runtimeProps);\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]) => buildStepEntry('Source', 'sources', key, source));\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations)\n .filter(([, dest]) => dest.package || hasCodeReference(dest.code))\n .map(([key, dest]) =>\n buildStepEntry('Destination', 'destinations', key, dest),\n );\n\n // Build transformers (including code-free path steps)\n const transformersEntries = Object.entries(transformers)\n .filter(\n ([, transformer]) =>\n transformer.package ||\n hasCodeReference(transformer.code) ||\n isPathStepEntry({ ...transformer }, 'Transformer'),\n )\n .map(([key, transformer]) =>\n buildStepEntry('Transformer', '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]) => buildStepEntry('Store', 'stores', key, store));\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, dataPayloadObj, dataPayload };\n}\n\n/**\n * Runtime guard emitted once into the bundle preamble. Deferred $secret\n * references serialize to `__walkerosRequireSecret(\"KEY\", process.env[\"KEY\"])`;\n * this helper throws a clear key-only error when the secret is absent or empty,\n * instead of letting `undefined` flow downstream into a cryptic failure. It\n * collapses missing and empty (no value oracle) and never logs or echoes the\n * value.\n */\nconst SECRET_GUARD_HELPER = `function __walkerosRequireSecret(key, val) {\n if (val == null || val === '') throw new Error('WalkerOS: required secret \"' + key + '\" is not set');\n return val;\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 `${SECRET_GUARD_HELPER}\n\nexport function wireConfig(__data) {\n ${storesDeclaration}\n\n const config = ${codeConfigObject};${codeSection}\n\n return config;\n}\n\nexport { startFlow };`;\n}\n\n/**\n * The runner contract's logger merge, emitted into every server factory\n * entry: the host (`runneros`) passes `context.logger` (masking, the error\n * ring tap), optionally `context.logLevel` (a level it forces, `--verbose`)\n * and `context.onLogger` (receives the flow's own `{ level, format }` before\n * the collector starts). The flow's level and format win over the host's;\n * a flow handler runs first, then the host's, which runs once per line,\n * always. The flow handler's `originalHandler` does nothing: the host prints\n * every line, masked and in the flow's format.\n */\nconst HOST_LOGGER_MERGE = ` // The host's logger (masking, its error ring) joins the flow's own: the\n // flow's level and format win, unless the host forces a level (--verbose);\n // the flow's handler runs first, then the host's, once per line, always.\n // The flow handler's originalHandler does nothing, so no line prints a\n // second time unmasked. The host learns the flow's settings before the\n // collector starts, so every line, the first included, has its format.\n if (context.logger) {\n const own = config.logger || {};\n const host = context.logger;\n if (context.onLogger) context.onLogger({ level: own.level, format: own.format });\n const level = context.logLevel ?? own.level ?? host.level;\n const printedByHost = () => {};\n const handler = own.handler && host.handler\n ? (lvl, message, ctx, scope) => {\n try {\n own.handler(lvl, message, ctx, scope, printedByHost);\n } finally {\n host.handler(lvl, message, ctx, scope, printedByHost);\n }\n }\n : host.handler || own.handler;\n config.logger = {\n ...host,\n ...(level !== undefined ? { level } : {}),\n ...(own.format ? { format: own.format } : {}),\n ...(handler ? { handler } : {}),\n };\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${HOST_LOGGER_MERGE}\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 // Telemetry observer installation: the host (pipeline.ts) builds the\n // observer functions via createTelemetryObserver + createBatchedPoster\n // and forwards them through context. Added to collector.observers so the\n // runtime self-emission loop drives them.\n if (context.observers) {\n for (const observer of context.observers) {\n result.collector.observers.add(observer);\n }\n }\n\n // The host forwards the level supplier beside the observers; the collector\n // capture path reads it to decide destination call capture at trace.\n if (context.observeLevel) result.collector.observeLevel = context.observeLevel;\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 * Read the STATIC observe connect config from a flow's `config.observe`.\n * Returns the public `{ url, binding }` pair (trimmed) plus the optional\n * `level`/`sample` controls only when both pair members are non-empty\n * strings; anything else yields undefined so the web entry emits zero\n * observe wiring bytes. Every carried field is public; dropping `level`\n * here would silently override an explicit `level: 'off'` with the\n * runtime's `standard` default once a credential attaches. A block that\n * names `url` or `binding` but does not form a usable pair (missing,\n * empty, or whitespace-only member) warns at build time, because silent\n * zero-wiring in a minified bundle is invisible to the author. A pure\n * level/sample block is valid managed-telemetry config, not a failed\n * connect pair, and stays silent. Secrets never live in flow config: the\n * runtime connect module reads the per-session credential out-of-band at\n * boot.\n */\nexport function readObserveConnect(\n flowSettings: Flow,\n logger?: Logger.Instance,\n): ObserveWeb | undefined {\n const observe = flowSettings.config?.observe;\n if (!observe) return undefined;\n const { url, binding, level, sample } = observe;\n if (url === undefined && binding === undefined) return undefined;\n const trimmedUrl = typeof url === 'string' ? url.trim() : '';\n const trimmedBinding = typeof binding === 'string' ? binding.trim() : '';\n if (trimmedUrl !== '' && trimmedBinding !== '') {\n return {\n url: trimmedUrl,\n binding: trimmedBinding,\n // Same JSON-borne prudence as the pair: only known-shaped public\n // values reach the emitted literal.\n ...(level === 'off' || level === 'standard' || level === 'trace'\n ? { level }\n : {}),\n // Sample is a fraction in [0, 1] per the Flow.Observe contract; the\n // range test also drops NaN and the infinities.\n ...(typeof sample === 'number' && sample >= 0 && sample <= 1\n ? { sample }\n : {}),\n };\n }\n const missing = [\n ...(trimmedUrl === '' ? ['url'] : []),\n ...(trimmedBinding === '' ? ['binding'] : []),\n ].join(' and ');\n logger?.warn(\n `config.observe has no effect: missing or empty ${missing}. Observe connect wiring was skipped; set both config.observe.url and config.observe.binding to non-empty public values.`,\n );\n return undefined;\n}\n\n/** Imports the page's Observe credential slot into a browser entry. */\nconst OBSERVE_SLOT_IMPORT =\n \"import { pageObserveSlot } from '@walkeros/web-core';\\n\";\n\n/**\n * Emit the STATIC observe connect assignment for a generated entry: bake\n * ONLY the public connect values (`url` + `binding`, plus the optional\n * `flowId`/`level`/`sample` scoping) onto the startFlow config, beside the\n * page slot the web arm reads its credential through. The runtime connect\n * module inside startFlow does the credential work at boot (the per-session\n * secret arrives out-of-band via the `elbObserve` companion); no emitted\n * byte here is ever secret. The entry imports the slot with\n * `OBSERVE_SLOT_IMPORT`.\n */\nfunction emitObserveAssignment(observe: ObserveWeb): string {\n const literal: ObserveWeb = {\n url: observe.url,\n binding: observe.binding,\n ...(observe.flowId !== undefined ? { flowId: observe.flowId } : {}),\n ...(observe.level !== undefined ? { level: observe.level } : {}),\n ...(observe.sample !== undefined ? { sample: observe.sample } : {}),\n };\n return `\n config.observe = { ...${JSON.stringify(literal)}, slot: pageObserveSlot() };`;\n}\n\n/** Imports the Tag Mode loader into a browser entry. */\nconst MOIN_IMPORT = \"import { moin } from '@walkeros/web-core';\\n\";\n\n/**\n * The Tag Mode loader call, the first statement of a browser entry: the\n * production target when none is given, or the target a deploy passes. A\n * target must be an https origin and an https base ending in `/`, so a\n * malformed value fails the build instead of shipping a loader that never\n * loads; its values are emitted as string literals.\n */\nfunction emitMoinCall(target?: MoinTarget): string {\n if (!target)\n return `\n moin();`;\n const app = parseHttps(target.app);\n if (!app || app.origin !== target.app) {\n throw new Error(\n `Invalid moin.app \"${target.app}\". Must be an https origin such as https://app.example.com.`,\n );\n }\n const base = parseHttps(target.base);\n if (\n !base ||\n base.href !== target.base ||\n base.username ||\n base.password ||\n base.search ||\n base.hash ||\n !base.pathname.endsWith('/')\n ) {\n throw new Error(\n `Invalid moin.base \"${target.base}\". Must be an https URL ending in \"/\" without query or fragment.`,\n );\n }\n return `\n moin({ app: ${JSON.stringify(target.app)}, base: ${JSON.stringify(target.base)} });`;\n}\n\nfunction parseHttps(value: string): URL | undefined {\n try {\n const url = new URL(value);\n return url.protocol === 'https:' ? url : undefined;\n } catch {\n return 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 * STATIC observe connect config baked onto the startFlow config. PUBLIC\n * values only (url + binding); the runtime connect module reads the\n * per-session credential out-of-band at boot. Absent = zero observe\n * wiring bytes in the emitted entry.\n */\n observe?: ObserveWeb;\n } = {},\n): string {\n const assignments: string[] = [];\n if (options.windowCollector) {\n assignments.push(\n ` if (typeof window !== 'undefined') window['${assertWindowCollector(options.windowCollector)}'] = collector;`,\n );\n }\n // windowElb is intentionally NOT assigned here: the browser source is the\n // single writer of window[settings.elb]. Emitting it too raced the source's\n // own assignment. `windowElb` survives as a deprecated build hint that the\n // config bridge forwards onto the browser source's settings.elb.\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\n const observeImport = options.observe ? OBSERVE_SLOT_IMPORT : '';\n const observeBlock = options.observe\n ? emitObserveAssignment(options.observe)\n : '';\n\n const loaderImport = platform === 'browser' ? MOIN_IMPORT : '';\n const loaderCall = platform === 'browser' ? emitMoinCall() : '';\n\n return `${loaderImport}${observeImport}import { startFlow, wireConfig } from '${stage1Specifier}';\n\nconst __configData = ${dataPayload};\n\n(async () => {${loaderCall}\n const config = wireConfig(__configData);${envBlock}${observeBlock}\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 */\n/**\n * Preview activation wiring. When present and enabled, the generated entry\n * imports the activator from web-core and lets it decide whether a preview\n * bundle boots in place of this flow. The bundle carries only PUBLIC values: a\n * keyring, an issuer, and opaque bindings. Never a project id, never a secret.\n */\nexport interface WrapEntryPreview {\n enabled: boolean;\n keyring: PreviewKey[];\n iss: string;\n /** Opaque project binding. Omitted only on demo hosts. */\n pb?: string;\n /** Demo hosts only: accept another project's preview, confined to demoAllowlist. */\n acceptForeign?: boolean;\n demoAllowlist?: string[];\n /** Bare CDN hostname. */\n previewOrigin: string;\n}\n\nexport function generateWrapEntry(\n stage1Path: string,\n options: {\n windowCollector?: string;\n windowElb?: string;\n /**\n * Preview activation wiring. Only host (deploy) wraps set this: the\n * preview-artifact wrap always omits it, so an activated preview can\n * never re-verify its own grant and re-inject itself.\n */\n preview?: WrapEntryPreview;\n /**\n * Preview-ARTIFACT wiring (the third wrap variant). When set, the emitted\n * entry reads the session-forwarding grant from\n * `localStorage['elbPreviewSession']` (the companion slot the activator\n * persists alongside the activation grant) at boot and stamps it as the\n * `X-Walkeros-Preview` header on each named server-bound destination\n * (`config.destinations[k].config.settings.headers`), before `startFlow`.\n * The grant is never baked into the artifact.\n *\n * Mutually exclusive with `preview`: a host bundle ACTIVATES a preview, an\n * artifact INJECTS its grant. An artifact that also baked the activator\n * would re-verify the stored grant and re-inject itself (infinite\n * recursion), so setting both throws.\n */\n previewGrantTargets?: 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 * STATIC observe connect config baked onto the startFlow config. PUBLIC\n * values only (`url` + `binding`, plus optional `flowId`/`level`/`sample`\n * scoping); the runtime connect module reads the per-session credential\n * out-of-band at boot via the `elbObserve` slot. This is the\n * preview-artifact observation wiring: it bakes no ingest token.\n */\n observe?: ObserveWeb;\n /**\n * The Tag Mode loader target, internal deploy data like the preview\n * keyring. Absent, the loader trusts the production app.\n */\n moin?: MoinTarget;\n } = {},\n): string {\n const assignments: string[] = [];\n if (options.windowCollector) {\n assignments.push(\n ` if (typeof window !== 'undefined') window['${assertWindowCollector(options.windowCollector)}'] = collector;`,\n );\n }\n // windowElb is intentionally NOT assigned here (see generateWebEntry): the\n // browser source is the single writer of window[settings.elb].\n const assignmentCode =\n assignments.length > 0 ? '\\n' + assignments.join('\\n') : '';\n\n // A host bundle activates a preview; a preview artifact injects its grant.\n // Baking both would let an activated artifact re-verify the stored grant and\n // re-inject itself (infinite recursion), so refuse the combination loudly\n // rather than pick a silent precedence that hides a caller bug.\n if (\n options.preview !== undefined &&\n options.previewGrantTargets !== undefined\n ) {\n throw new Error(\n 'generateWrapEntry: `preview` (host activator) and `previewGrantTargets` ' +\n '(preview-artifact injection) are mutually exclusive. A host bundle ' +\n 'activates a preview; an artifact injects its grant. Pass at most one.',\n );\n }\n\n const preview = options.preview;\n const previewEnabled = !!preview?.enabled;\n\n // The activator is imported (not inlined) so its logic is tested as a module\n // and DCE keeps it out of every bundle that does not enable preview.\n const previewImport = previewEnabled\n ? `import { browserSwapActivator } from '@walkeros/web-core';\\n`\n : '';\n\n // Preview-artifact variant: read the SESSION-FORWARDING grant (the\n // companion the activator persists to localStorage['elbPreviewSession'])\n // at boot and stamp it as the X-Walkeros-Preview header on each named\n // server-bound destination, before startFlow. Never the activation grant\n // in 'elbPreview': the session container only accepts session-bound\n // grants, so that value could only ever be rejected (sb-mismatch). The\n // grant value never appears as a literal — only the runtime localStorage\n // read. localStorage access is wrapped in try/catch (Safari private mode\n // throws) and an absent key skips injection entirely so a plain page\n // boots normally.\n const grantTargets = options.previewGrantTargets ?? [];\n const previewGrantBlock =\n grantTargets.length > 0\n ? `\n // --- Preview grant injection ---\n try {\n const __previewGrant =\n typeof localStorage !== 'undefined'\n ? localStorage.getItem('elbPreviewSession')\n : null;\n if (__previewGrant && config.destinations) {\n${grantTargets\n .map((key) => {\n const ref = `config.destinations[${singleQuoteLiteral(key)}]`;\n return ` if (${ref}) {\n const __dest = ${ref};\n const __cfg = __dest.config || (__dest.config = {});\n const __settings = __cfg.settings || (__cfg.settings = {});\n const __headers = __settings.headers || (__settings.headers = {});\n __headers['X-Walkeros-Preview'] = __previewGrant;\n }`;\n })\n .join('\\n')}\n }\n } catch (__err) {\n // localStorage can throw (Safari private mode); boot without the grant.\n }\n // --- End preview grant injection ---`\n : '';\n\n const previewBlock =\n previewEnabled && preview\n ? `\n // --- Preview activation ---\n if (await browserSwapActivator(${JSON.stringify({\n keyring: preview.keyring,\n iss: preview.iss,\n pb: preview.pb,\n acceptForeign: preview.acceptForeign,\n demoAllowlist: preview.demoAllowlist,\n previewOrigin: preview.previewOrigin,\n })})) return;\n // --- End preview activation ---\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\n // STATIC observe connect wiring (see emitObserveAssignment): baked inside\n // the IIFE AFTER the activator's early return, so an activated page (the\n // artifact swapped in) never also installs the host's connect module.\n const observeImport = options.observe ? OBSERVE_SLOT_IMPORT : '';\n const observeBlock = options.observe\n ? emitObserveAssignment(options.observe)\n : '';\n\n // The loader runs first, before the activator: host and artifact both call\n // it, and its page guard keeps the first one.\n const loaderImport = platform === 'browser' ? MOIN_IMPORT : '';\n const loaderCall = platform === 'browser' ? emitMoinCall(options.moin) : '';\n\n return `${loaderImport}${previewImport}${observeImport}import { startFlow, wireConfig, __configData } from '${stage1Specifier}';\n\n(async () => {${loaderCall}${previewBlock}\n const config = wireConfig(__configData);${envBlock}${previewGrantBlock}${observeBlock}\n const { collector, elb } = await startFlow(config);${assignmentCode}\n})();`;\n}\n\n/**\n * Emit a single-quoted JS string literal for a destination key. Destination\n * keys come from a validated flow config, but escaping backslash and single\n * quote keeps the emitted codegen well-formed for any key and matches the\n * single-quote convention the preview-injection tests pin.\n */\nfunction singleQuoteLiteral(value: string): string {\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\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${HOST_LOGGER_MERGE}\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 // Telemetry observer installation: the host (pipeline.ts) builds the\n // observer functions via createTelemetryObserver + createBatchedPoster\n // and forwards them through context. Added to collector.observers so the\n // runtime self-emission loop drives them.\n if (context.observers) {\n for (const observer of context.observers) {\n result.collector.observers.add(observer);\n }\n }\n\n // The host forwards the level supplier beside the observers; the collector\n // capture path reads it to decide destination call capture at trace.\n if (context.observeLevel) result.collector.observeLevel = context.observeLevel;\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 secret markers → guarded process.env read. The secret marker is\n // ALWAYS a whole-string value (never embedded inline), so we match the full\n // string. We wrap the read in __walkerosRequireSecret so an absent or empty\n // secret fails with a clear key-only error at startup instead of surfacing\n // later as a cryptic downstream failure (e.g. GCP ADC metadata lookup). The\n // secret VALUE is never inlined — only the env read + guard are emitted.\n if (value.startsWith(SECRET_MARKER_PREFIX)) {\n const name = value.slice(SECRET_MARKER_PREFIX.length);\n return `__walkerosRequireSecret(${JSON.stringify(name)}, process.env[${JSON.stringify(name)}])`;\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","import { SECRET_MARKER_PREFIX } from '@walkeros/core';\n\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 * - __WALKEROS_SECRET: prefix (guarded process.env read for a deferred secret)\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 value.includes(SECRET_MARKER_PREFIX)\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 * Step-package normalization shared by bundle, setup, validate and the MCP's\n * flow_examples.\n *\n * Pure flow-config logic: which packages do the flow's steps declare, and\n * what is the effective {name, version | path} for each after merging inline\n * step specs with config.bundle.packages pins. Lives in core/ so every\n * command and tool that reads a step's package runs the exact same precedence\n * (a bundle pin always wins; an unversioned bundle entry is filled from the\n * first inline version; conflicting inline versions with no pin throw;\n * local paths become synthetic packageNameToVariable keys).\n */\nimport type { Flow, Logger } from '@walkeros/core';\nimport { packageNameToVariable } from '@walkeros/core';\nimport type { ComponentKind } from './resolve-export-name.js';\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 */\nexport type FlowStepRecord =\n | Record<string, Flow.Source>\n | Record<string, Flow.Destination>\n | Record<string, Flow.Transformer>\n | Record<string, Flow.Store>;\nexport function 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/** A step package spec that is a local path (`./x`, `../x`, `/abs/x`). */\nfunction isLocalPath(spec: string): boolean {\n return spec.startsWith('.') || spec.startsWith('/');\n}\n\n/**\n * Split a step package spec into bare name and optional version suffix.\n * `@walkeros/x@1.2.3` → { name: '@walkeros/x', version: '1.2.3' }.\n * The scope `@` at index 0 is never a separator. A trailing `@` is ignored.\n * Alias/git/file suffixes are not interpreted — the resolver handles or\n * rejects them downstream.\n */\nexport function parsePackageSpec(spec: string): {\n name: string;\n version?: string;\n} {\n const at = spec.lastIndexOf('@');\n if (at <= 0) return { name: spec };\n const version = spec.slice(at + 1);\n return version\n ? { name: spec.slice(0, at), version }\n : { name: spec.slice(0, at) };\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 * 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 * Auto-adds every step-declared package (sources, destinations, transformers,\n * stores) to `packages`, mutating `flowSettings` in place so each step's\n * `package` field points at the key that ends up in `packages`.\n *\n * Local paths (`.` or `/` prefixed) are normalized to a synthetic\n * `packageNameToVariable` key so the regular default-import codegen wires\n * them up automatically.\n *\n * npm specs go through `parsePackageSpec` to split an inline version\n * (`@walkeros/x@1.2.3`) from the bare name. Precedence policy:\n * - An explicit `config.bundle.packages` version always wins; a disagreeing\n * inline version only warns (bundle pin is authoritative).\n * - An unversioned bundle entry is filled from the first inline version seen\n * for that bare name, preserving any other fields already on the entry.\n * - Two different inline versions for the same bare name, with no bundle\n * pin to arbitrate, are ambiguous — throw naming both steps' versions\n * rather than silently picking one.\n * - Identical inline versions across steps are fine (no-op).\n * Alias/git/file suffixes are not special-cased: `parsePackageSpec` splits on\n * the last `@` and the resolver handles or rejects the rest downstream.\n */\nexport function applyStepPackages(\n flowSettings: Flow,\n packages: Record<string, Flow.BundlePackage>,\n logger: Logger.Instance,\n): void {\n const stepPackages = collectAllStepPackages(flowSettings);\n // Bundle-pinned version per bare name, captured the first time each name is\n // encountered — i.e. before this function's own fill-ins can be mistaken\n // for a real `config.bundle.packages` pin on a later iteration.\n const originalPins = new Map<string, boolean>();\n // Inline version already seen per bare name (with no real bundle pin),\n // used to detect a second, different inline version for the same name.\n const inlineSeen = new Map<string, string>();\n\n const rewriteSteps = (from: string, to: string): void => {\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 === from) {\n step.package = to;\n }\n }\n }\n };\n\n for (const pkg of stepPackages) {\n if (isLocalPath(pkg)) {\n // Normalize: convert path-based package: to packages section entry.\n // The synthetic key acts as the package name for downstream codegen,\n // so the regular default-import flow wires it up automatically.\n const varName = packageNameToVariable(pkg);\n if (!packages[varName]) {\n packages[varName] = {\n path: pkg,\n };\n }\n\n // Rewrite all components that reference the raw path to point at the\n // synthetic packages-section key instead.\n rewriteSteps(pkg, varName);\n continue;\n }\n\n const { name, version } = parsePackageSpec(pkg);\n\n if (!originalPins.has(name)) {\n const entry = packages[name];\n // A `path` entry is a pin too: local paths win at resolution, so the\n // inline versions the steps declare can never be used.\n originalPins.set(\n name,\n entry?.version !== undefined || entry?.path !== undefined,\n );\n }\n const hasBundlePin = originalPins.get(name) === true;\n\n if (name !== pkg) {\n // Rewrite every step that declared the versioned spec to the bare\n // name, mirroring the local-path rewrite above.\n rewriteSteps(pkg, name);\n }\n\n if (version && !hasBundlePin) {\n const seen = inlineSeen.get(name);\n if (seen !== undefined && seen !== version) {\n throw new Error(\n `Conflicting inline versions for ${name}: \"${seen}\" and \"${version}\" are ` +\n `declared by different steps. Pin one version in config.bundle.packages.`,\n );\n }\n inlineSeen.set(name, version);\n }\n\n const existing = packages[name];\n if (!existing) {\n packages[name] = version ? { version } : {};\n } else if (version && !existing.path) {\n // A path entry decides on its own; stamping a version onto it would\n // record a version that resolution never consults.\n if (!existing.version) {\n existing.version = version; // fill an unversioned bundle entry\n } else if (existing.version !== version) {\n logger.warn(\n `Package ${name}: config.bundle.packages pins ${existing.version}; ` +\n `a step declares ${version} inline. Using the bundle pin.`,\n );\n }\n }\n }\n}\n\nexport interface ResolvedStepPackage {\n /** Bare package name after normalization (inline version stripped, local path replaced by synthetic key). */\n packageName: string;\n /** The package as messages and results name it: the bare npm name, or a step's own local path as written. */\n label: string;\n /** Effective bundle entry: version pin and/or local path per bundle precedence. */\n spec: Flow.BundlePackage;\n /** flow.config.bundle.overrides, for transitive pins. */\n overrides: Record<string, string>;\n /** Deep clone of the flow with step.package rewritten to bare names; the input flow is never mutated. */\n normalizedFlow: Flow;\n}\n\nconst KIND_TO_SECTION = {\n source: 'sources',\n transformer: 'transformers',\n destination: 'destinations',\n store: 'stores',\n} as const;\n\n/**\n * Resolve the effective package spec for one step by running the SAME\n * normalization the bundler runs over the whole flow (applyStepPackages),\n * on a clone so the caller's flow stays untouched. The clone comes back as\n * `normalizedFlow` with `step.package` rewritten to the bare name, which is\n * also what resolveExportName needs to match `bundle.packages[pkg].imports`.\n */\nexport function resolveStepPackage(\n flow: Flow,\n kind: ComponentKind,\n id: string,\n logger: Logger.Instance,\n): ResolvedStepPackage {\n const normalizedFlow = structuredClone(flow);\n const packages: Record<string, Flow.BundlePackage> = structuredClone(\n normalizedFlow.config?.bundle?.packages ?? {},\n );\n applyStepPackages(normalizedFlow, packages, logger);\n\n const bucket = getFlowSection(normalizedFlow, KIND_TO_SECTION[kind]);\n const step = bucket?.[id];\n if (!step) {\n const available = Object.keys(bucket ?? {}).join(', ') || '(none)';\n throw new Error(\n `${kind} \"${id}\" not found in flow. Available: ${available}`,\n );\n }\n if (typeof step.package !== 'string') {\n throw new Error(\n `${kind}.${id} has no \"package\" (inline code cannot be set up).`,\n );\n }\n\n const declared = getFlowSection(flow, KIND_TO_SECTION[kind])?.[id]?.package;\n return {\n packageName: step.package,\n label:\n declared !== undefined && isLocalPath(declared) ? declared : step.package,\n spec: packages[step.package] ?? {},\n overrides: normalizedFlow.config?.bundle?.overrides ?? {},\n normalizedFlow,\n };\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 './local-packages.js';\nimport type { Logger } from '@walkeros/core';\nimport { getPackageCacheKey } from './cache-utils.js';\nimport { getTmpPath } from './tmp.js';\nimport {\n isCacheDirComplete,\n readCacheDir,\n writeCacheDir,\n} from './atomic-cache.js';\nimport {\n assertRegistrySpecs,\n assertTransitiveRegistrySpec,\n isRegistrySpec,\n} from './package-spec.js';\n\nexport interface NpmConfig {\n registry: string;\n [key: string]: unknown;\n}\n\n/**\n * `ignoreScripts` is NOT the fix for install-time code execution, and must\n * not be read as one. pacote honours it in exactly one place, the directory\n * fetcher's `prepare` gate (`lib/dir.js`), so it closes `file:` and directory\n * specs only. The git fetcher's `#prepareDir` (`lib/git.js`) spawns a full\n * `npm install --force` whose default CLI config carries no\n * `--ignore-scripts` and passes `--include=dev --include=peer\n * --include=optional`, so it does NOT close `git:`. What closes `git:` is the\n * spec-type gate in `./package-spec.ts`, which refuses every non-registry\n * spec before pacote sees it. This flag is defence in depth behind that gate.\n */\nconst IGNORE_SCRIPTS = { ignoreScripts: true } as const;\n\nexport const PACOTE_OPTS: NpmConfig = {\n registry: 'https://registry.npmjs.org/',\n preferOnline: true,\n where: undefined,\n ...IGNORE_SCRIPTS,\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 // IGNORE_SCRIPTS goes last so an .npmrc cannot switch it off. See its\n // comment: it closes `file:` and directories, not `git:`.\n return { ...merged, registry, preferOnline: true, ...IGNORE_SCRIPTS };\n}\n\n// ============================================================\n// Resilient pacote downloads\n// ============================================================\n\n/**\n * Bounded, classified retry around a single pacote call (`extract`/`manifest`).\n *\n * pacote 21.x forwards `opts.signal` end-to-end (npm-registry-fetch →\n * make-fetch-happen → minipass-fetch). Passing a per-attempt AbortController\n * both bounds the call AND cancels the in-flight fetch, so a timed-out attempt\n * does not leave a detached download running. The previous `withTimeout` race\n * only rejected the wrapper while the real fetch kept running; the signal path\n * replaces it.\n *\n * Only TRANSIENT failures (timeouts, network blips) are retried. Deterministic\n * npm failures (404, auth, bad spec, integrity) fail fast. A total wall-clock\n * budget clamps every attempt to the remaining time so a sequential download\n * loop never holds far longer than the budget. The budget pattern mirrors\n * `runtime/fetch-retry.ts` but is copied here to avoid coupling the bundler to\n * the runtime.\n */\n\n/** Number of attempts (the first try plus retries). */\nexport const PACOTE_RETRY_ATTEMPTS = 3;\n\n/** Per-attempt timeout before the attempt is aborted. */\nconst PACOTE_PER_ATTEMPT_TIMEOUT_MS = 60_000;\n\n/** Total wall-clock budget across all attempts (including backoff sleeps). */\nconst PACOTE_MAX_TOTAL_MS = 90_000;\n\n/**\n * Floor of remaining budget below which starting another attempt is pointless:\n * a sub-second timeout would abort before the socket connects.\n */\nconst MIN_ATTEMPT_BUDGET_MS = 1_000;\n\n/** Base backoff before retry #2 and #3. The last entry repeats if needed. */\nconst BASE_BACKOFF_MS: readonly number[] = [2_000, 5_000];\n\n/** Jitter band applied to each backoff: ±20%. */\nconst JITTER = 0.2;\n\n/**\n * npm error codes that are permanent: an outer retry cannot help, so fail fast.\n * `EINTEGRITY` is permanent at this layer because pacote already cache-busts and\n * retries it once internally; a second outer pass just re-throws.\n */\nconst PERMANENT_ERROR_CODES: ReadonlySet<string> = new Set([\n 'E404',\n 'ETARGET',\n 'EINVALIDPACKAGENAME',\n 'E401',\n 'E403',\n 'EINTEGRITY',\n 'Z_DATA_ERROR',\n]);\n\n/** Read an optional string `code` off an unknown error without casting. */\nfunction readErrorCode(value: unknown): string | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const code = Reflect.get(value, 'code');\n return typeof code === 'string' ? code : undefined;\n}\n\n/** A permanent error should not be retried (fail fast). */\nfunction isPermanentError(error: unknown): boolean {\n const code = readErrorCode(error);\n return code !== undefined && PERMANENT_ERROR_CODES.has(code);\n}\n\n/** Backoff delay (with jitter) before the retry following attempt index `i`. */\nfunction backoffForAttempt(index: number): number {\n const base =\n BASE_BACKOFF_MS[Math.min(index, BASE_BACKOFF_MS.length - 1)] ?? 0;\n const spread = base * JITTER;\n return base + (Math.random() * 2 - 1) * spread;\n}\n\n/** Promise-based sleep that fake timers can drive in tests. */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/** Short, safe description of a thrown error for the exhaustion message. */\nfunction describeError(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\n/**\n * Attach an `AbortSignal` to pacote options. `signal` is forwarded by pacote at\n * runtime (npm-registry-fetch → make-fetch-happen) but is not part of the\n * `@types/pacote` Options surface; widen via intersection rather than casting.\n */\nfunction withSignal(\n opts: pacote.Options,\n signal: AbortSignal,\n): pacote.Options & { signal: AbortSignal } {\n return { ...opts, signal };\n}\n\nexport interface PacoteRetryOptions {\n attempts?: number;\n perAttemptTimeoutMs?: number;\n maxTotalMs?: number;\n}\n\n/**\n * Run a pacote operation with bounded retry, a per-attempt abort, and a total\n * wall-clock budget. `fn` receives the per-attempt `AbortSignal` to forward as\n * `opts.signal`. Throws after attempts/budget are spent, or immediately on a\n * permanent error.\n */\nexport async function withPacoteRetry<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n label: string,\n options: PacoteRetryOptions = {},\n): Promise<T> {\n const attempts = options.attempts ?? PACOTE_RETRY_ATTEMPTS;\n const perAttemptTimeoutMs =\n options.perAttemptTimeoutMs ?? PACOTE_PER_ATTEMPT_TIMEOUT_MS;\n const maxTotalMs = options.maxTotalMs ?? PACOTE_MAX_TOTAL_MS;\n\n const start = Date.now();\n let lastError: unknown;\n let made = 0;\n\n for (let attempt = 0; attempt < attempts; attempt++) {\n // Clamp each attempt to the remaining budget so the total wall-clock is\n // genuinely bounded. Stop if too little budget remains for a real attempt.\n const remaining = maxTotalMs - (Date.now() - start);\n if (remaining <= MIN_ATTEMPT_BUDGET_MS) break;\n const attemptTimeoutMs = Math.min(perAttemptTimeoutMs, remaining);\n\n made = attempt + 1;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), attemptTimeoutMs);\n try {\n return await fn(controller.signal);\n } catch (error) {\n lastError = error;\n // Permanent failures never benefit from a retry.\n if (isPermanentError(error)) throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n\n const isLastAttempt = attempt === attempts - 1;\n const budgetSpent = Date.now() - start >= maxTotalMs;\n if (isLastAttempt || budgetSpent) break;\n\n const sleepMs = Math.min(\n backoffForAttempt(attempt),\n maxTotalMs - (Date.now() - start),\n );\n if (sleepMs <= 0) break;\n await delay(sleepMs);\n }\n\n throw new Error(\n `Failed ${label} after ${made} attempts: ${describeError(lastError)}`,\n );\n}\n\n/**\n * `pacote.extract` with resilient retry. Retrying into the same dir is safe:\n * pacote empties `dest` before each extract, so no redundant pre-clean is\n * needed. The `cache` opt (when present) is preserved across attempts.\n */\nexport function extractWithResilience(\n spec: string,\n dest: string,\n opts: pacote.Options,\n _logger: Logger.Instance,\n retryOptions?: PacoteRetryOptions,\n): Promise<pacote.FetchResult> {\n return withPacoteRetry(\n (signal) => pacote.extract(spec, dest, withSignal(opts, signal)),\n `download ${spec}`,\n retryOptions,\n );\n}\n\n/** `pacote.manifest` with resilient retry. */\nexport function manifestWithResilience(\n spec: string,\n opts: pacote.Options,\n _logger: Logger.Instance,\n retryOptions?: PacoteRetryOptions,\n): Promise<pacote.AbbreviatedManifest & pacote.ManifestResult> {\n return withPacoteRetry(\n (signal) => pacote.manifest(spec, withSignal(opts, signal)),\n `fetch manifest ${spec}`,\n retryOptions,\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 // Every spec that can reach pacote must be a registry fetch. Direct pins\n // and override values are checked up front, all at once, before any\n // network call; transitive specs are checked as they are dequeued.\n assertRegistrySpecs([\n ...packages\n .filter((pkg) => !pkg.path)\n .map((pkg) => ({ name: pkg.name, spec: pkg.version, from: 'flow.json' })),\n // An override for a directly-local package is ignored (warned above),\n // so it is never fetched and not validated either.\n ...Object.entries(overrides)\n .filter(([name]) => !directLocalNames.has(name))\n .map(([name, spec]) => ({\n name,\n spec,\n from: 'config.bundle.overrides',\n })),\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\n // A transitive spec for a name the flow supplies from disk is dropped\n // before it is recorded: the local copy wins resolution, so the spec is\n // never fetched and cannot reach pacote around the check below.\n if (\n !item.localPath &&\n item.source !== 'direct' &&\n directLocalNames.has(item.name)\n ) {\n continue;\n }\n\n // An OPTIONAL dependency with a non-registry spec is skipped (never\n // recorded, never fetched), as npm would skip an optional dependency it\n // cannot install; every other non-registry transitive spec fails closed.\n if (!item.localPath && item.source !== 'direct') {\n if (item.optional && !isRegistrySpec(item.name, item.spec, true)) {\n logger.warn(\n `Skipping optional dependency ${item.name}@${item.spec} (from ${item.from}): only npm registry specs are installed`,\n );\n continue;\n }\n assertTransitiveRegistrySpec(item);\n }\n\n // Record this spec for EVERY queue item — the same name@spec can arrive\n // from multiple consumers (e.g., common AND pubsub both declare arrify@^2.0.0),\n // and the resolver needs to know all of them to nest correctly under each.\n // De-dup only exact (name@spec, from) tuples defensively.\n if (!allSpecs.has(item.name)) allSpecs.set(item.name, []);\n const existing = allSpecs.get(item.name)!;\n if (!existing.some((s) => s.spec === item.spec && s.from === item.from)) {\n existing.push({\n spec: item.spec,\n source: item.source,\n from: item.from,\n optional: item.optional,\n localPath: item.localPath,\n });\n }\n\n // Walk transitive deps only once per name@spec (prevents cycles).\n const visitKey = `${item.name}@${item.spec}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\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 manifestWithResilience(\n `${item.name}@${item.spec}`,\n npmConfig,\n logger,\n );\n } catch (error) {\n // A persistent manifest miss silently under-resolves the dependency\n // graph (the consumer's transitive deps are never queued). Escalate to\n // warn so the gap is visible, then continue resolving the rest.\n logger.warn(\n `Failed to fetch manifest for ${item.name}@${item.spec} after retries; its dependencies may be unresolved: ${error instanceof Error ? error.message : String(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 async function resolveVersionConflicts(\n allSpecs: Map<string, VersionSpec[]>,\n logger: Logger.Instance,\n npmConfig: pacote.Options = {},\n): Promise<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 function nestLoser(spec: VersionSpec, alreadyNested: Set<string>): void {\n if (spec.localPath) return;\n if (alreadyNested.has(spec.spec)) return;\n // Skip non-semver loser specs (git URLs, file:, tags) — pacote can resolve them but\n // we cannot statically verify satisfaction. Log and let pacote handle it.\n if (\n semver.valid(spec.spec) === null &&\n semver.validRange(spec.spec) === null\n ) {\n logger.debug(\n `Skipping non-semver loser spec for ${name}: ${spec.spec} from ${spec.from}`,\n );\n return;\n }\n // Gather all consumers sharing this exact spec string (mirror line 414-417 pattern)\n const consumers = activeSpecs\n .filter((s) => s.spec === spec.spec)\n .map((s) => s.from);\n nested.push({ name, version: spec.spec, consumers });\n alreadyNested.add(spec.spec);\n }\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 // Resolve chosenVersion to a concrete version we can validate against.\n // If chosen is already exact, use it directly. If it's a range/tag, ask pacote\n // what concrete version it would actually install.\n let concreteVersion: string;\n if (semver.valid(chosenVersion)) {\n concreteVersion = chosenVersion;\n } else {\n try {\n const manifest = await manifestWithResilience(\n `${name}@${chosenVersion}`,\n npmConfig,\n logger,\n );\n concreteVersion = manifest.version;\n } catch (err) {\n if (process.env.BUNDLER_STRICT_RANGES === '0') {\n logger.warn(\n `Could not resolve ${name}@${chosenVersion} for strict validation: ${err instanceof Error ? err.message : String(err)}. Skipping range validation (BUNDLER_STRICT_RANGES=0).`,\n );\n topLevel.set(name, { name, version: chosenVersion });\n continue;\n }\n throw new Error(\n `Failed to resolve ${name}@${chosenVersion} for range conflict validation. ` +\n `Set BUNDLER_STRICT_RANGES=0 to bypass with a warning. ` +\n `Original error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // Validate every spec against the concrete version. Non-satisfying specs get nested.\n for (const spec of specs) {\n if (spec.localPath) continue;\n if (spec.spec === chosenVersion) continue; // identical strings can't conflict\n\n const satisfied = semver.valid(spec.spec)\n ? spec.spec === concreteVersion\n : semver.validRange(spec.spec)\n ? semver.satisfies(concreteVersion, spec.spec, {\n includePrerelease: true,\n })\n : true; // non-semver (git, file:, tag) — let pacote handle, don't nest blindly\n\n if (satisfied) continue;\n\n if (spec.source === 'peerDependency') {\n logger.warn(\n `${name}@${concreteVersion} does not satisfy peer constraint ${spec.spec} (from ${spec.from})`,\n );\n } else {\n nestLoser(spec, alreadyNested);\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 = await resolveVersionConflicts(allSpecs, logger, npmConfig);\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 readCacheDir(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 // Retrying into the same dir is safe: pacote empties `dest` before each\n // extract, so no redundant pre-clean is needed here.\n await extractWithResilience(\n packageSpec,\n packageDir,\n { ...npmConfig, cache: cacheDir },\n logger,\n );\n\n if (userSpecifiedPackages.has(name)) {\n logger.debug(`Downloading ${packageSpec}`);\n }\n\n // Cache for future use\n if (useCache) {\n await writeCacheDir(packageDir, cachedPath, logger, {\n label: packageSpec,\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 manifestWithResilience(\n resolvedSpec,\n npmConfig,\n logger,\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 extractWithResilience(\n resolvedSpec,\n nestedDir,\n { ...npmConfig, cache: cacheDir },\n logger,\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 // Entries without the completion marker (cut short, or written before the\n // marker existed) are misses, so a truncated entry heals on the next build.\n return isCacheDirComplete(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 * 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';\nimport { canonicalJson } from './content-digest.js';\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 return canonicalJson(JSON.parse(content));\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","/**\n * Atomic cache writes.\n *\n * A cache entry is written to a `.tmp-<rand>` sibling first and renamed into\n * place only when complete, so a write cut short (a full disk, a crash) never\n * leaves a valid-looking entry behind. Directory entries carry a completion\n * marker written LAST; an entry without it (written before this module, or\n * poisoned) is a miss and is replaced by the next write.\n */\n\nimport crypto from 'crypto';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Logger } from '@walkeros/core';\nimport { getErrorMessage } from './utils.js';\n\n/** Marker file inside a complete cache directory entry. */\nexport const CACHE_COMPLETE_MARKER = '.walkeros-complete';\n\nconst TMP_INFIX = '.tmp-';\nconst BASE36 = '0123456789abcdefghijklmnopqrstuvwxyz';\nconst TMP_NAME = /\\.tmp-[0-9a-z]{8}$/;\n\n/** Copies a directory tree; `fs.copy` in production, injectable for tests. */\nexport type CopyDir = (src: string, dest: string) => Promise<void>;\n\nexport interface WriteCacheDirOptions {\n /** Names the entry in the warning, e.g. `name@version`. */\n label?: string;\n copy?: CopyDir;\n}\n\nfunction tempSibling(dest: string): string {\n const rand = Array.from(\n crypto.randomBytes(8),\n (byte) => BASE36[byte % BASE36.length],\n ).join('');\n return `${dest}${TMP_INFIX}${rand}`;\n}\n\nfunction errorCode(error: unknown): string | undefined {\n // Not `instanceof Error`: fs errors can come from another realm.\n if (typeof error === 'object' && error !== null && 'code' in error) {\n const code = error.code;\n return typeof code === 'string' ? code : undefined;\n }\n return undefined;\n}\n\nfunction isOccupied(error: unknown): boolean {\n const code = errorCode(error);\n return code === 'EEXIST' || code === 'ENOTEMPTY';\n}\n\n/** True for a `.tmp-*` name this module writes before a rename. */\nexport function isCacheTempName(name: string): boolean {\n return TMP_NAME.test(name);\n}\n\n/** True when `dir` holds a completed cache entry (its marker exists). */\nexport async function isCacheDirComplete(dir: string): Promise<boolean> {\n return fs.pathExists(path.join(dir, CACHE_COMPLETE_MARKER));\n}\n\n/** Copy a cache entry out of the cache, without its completion marker. */\nexport async function readCacheDir(src: string, dest: string): Promise<void> {\n const marker = path.join(src, CACHE_COMPLETE_MARKER);\n await fs.copy(src, dest, { filter: (file) => file !== marker });\n}\n\n/**\n * Remove `.tmp-*` leftovers in `dir` older than `maxAgeMs`. Fresh ones may\n * belong to a write in flight and are kept. Never throws.\n */\nexport async function sweepStaleCacheTemps(\n dir: string,\n maxAgeMs = 3_600_000,\n): Promise<void> {\n let entries: string[];\n try {\n entries = await fs.readdir(dir);\n } catch {\n return;\n }\n const cutoff = Date.now() - maxAgeMs;\n await Promise.all(\n entries.filter(isCacheTempName).map(async (entry) => {\n const entryPath = path.join(dir, entry);\n try {\n const stats = await fs.stat(entryPath);\n if (stats.mtimeMs < cutoff) await fs.remove(entryPath);\n } catch {\n // Removed concurrently, or unreadable: the next sweep retries.\n }\n }),\n );\n}\n\n/**\n * Move `tmp` into place at an occupied `dest` whose entry is NOT complete.\n * The old entry is moved aside atomically first, so a complete entry that a\n * concurrent writer renamed in meanwhile is put back instead of deleted.\n */\nasync function replaceIncomplete(tmp: string, dest: string): Promise<void> {\n const aside = tempSibling(dest);\n let moved = false;\n try {\n await fs.rename(dest, aside);\n moved = true;\n } catch (error) {\n if (errorCode(error) !== 'ENOENT') throw error;\n }\n const restore = moved && (await isCacheDirComplete(aside));\n const winner = restore ? aside : tmp;\n const loser = restore ? tmp : aside;\n try {\n await fs.rename(winner, dest);\n } catch (error) {\n // A concurrent writer finished first: its entry stands, ours is a copy.\n if (!isOccupied(error) || !(await isCacheDirComplete(dest))) {\n if (!restore && moved) await fs.remove(aside);\n throw error;\n }\n await fs.remove(winner);\n }\n await fs.remove(loser);\n}\n\n/**\n * Copy `src` into the cache at `dest` atomically. Never throws: the build\n * already has its own copy, so a failed cache write only warns.\n */\nexport async function writeCacheDir(\n src: string,\n dest: string,\n logger: Logger.Instance,\n options: WriteCacheDirOptions = {},\n): Promise<void> {\n const copy: CopyDir = options.copy ?? ((from, to) => fs.copy(from, to));\n const dir = path.dirname(dest);\n const tmp = tempSibling(dest);\n try {\n await fs.ensureDir(dir);\n await sweepStaleCacheTemps(dir);\n await copy(src, tmp);\n await fs.writeFile(path.join(tmp, CACHE_COMPLETE_MARKER), '');\n try {\n await fs.rename(tmp, dest);\n } catch (error) {\n if (!isOccupied(error)) throw error;\n if (await isCacheDirComplete(dest)) {\n await fs.remove(tmp);\n return;\n }\n await replaceIncomplete(tmp, dest);\n }\n } catch (error) {\n await fs.remove(tmp).catch(() => {});\n const label = options.label ?? path.basename(dest);\n logger.warn(\n `Package cache write failed for ${label}: ${getErrorMessage(error)}. The build continues without caching it.`,\n );\n }\n}\n\n/**\n * Write a single cache file atomically: a temp sibling, then a rename, so a\n * reader sees the old file, the new file, or none, never a partial one.\n */\nexport async function writeCacheFile(\n dest: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(dest);\n const tmp = tempSibling(dest);\n await fs.ensureDir(dir);\n await sweepStaleCacheTemps(dir);\n try {\n await fs.writeFile(tmp, content, 'utf-8');\n await fs.rename(tmp, dest);\n } catch (error) {\n await fs.remove(tmp).catch(() => {});\n throw error;\n }\n}\n","/**\n * Spec-type gate for every package spec the bundler hands to pacote.\n *\n * pacote picks a fetcher from the spec TYPE, and two of those fetchers run\n * code: the git fetcher prepares a clone with a full `npm install`, and the\n * directory fetcher (behind `file:`) runs the package's `prepare` script. So\n * the only specs allowed to reach pacote are registry fetches: a `version`,\n * `range` or `tag`. Everything else (`git`, `github:`, `file:`, `link:`,\n * directories, tarball URLs, `npm:` aliases) is refused before any network\n * call.\n *\n * Local packages are not specs: `config.bundle.packages[x].path` and step\n * packages beginning with `.` or `/` are copied from disk by the CLI and never\n * reach pacote, so they are not gated here.\n *\n * Transitive dependencies are gated too, because an override or a direct pin\n * can select a version whose own dependencies carry a git spec. A transitive\n * `npm:` alias is allowed when its target is itself a registry spec: real\n * published packages use them, and pacote resolves them from the registry.\n */\n\nimport npa from 'npm-package-arg';\n\n/** Spec types that fetch from the npm registry, the only ones allowed. */\nconst REGISTRY_SPEC_TYPES: ReadonlySet<string> = new Set([\n 'version',\n 'range',\n 'tag',\n]);\n\nexport interface SpecCheck {\n name: string;\n spec: string;\n /** Where the spec came from, for the error message (e.g. `flow.json`). */\n from: string;\n}\n\n/**\n * True when `name@spec` is a registry fetch for exactly `name`.\n * `allowAlias` admits an `npm:` alias whose target is a registry spec.\n */\nexport function isRegistrySpec(\n name: string,\n spec: string,\n allowAlias = false,\n): boolean {\n try {\n const parsed = npa.resolve(name, spec);\n if (REGISTRY_SPEC_TYPES.has(parsed.type)) return parsed.name === name;\n if (allowAlias && parsed.type === 'alias') {\n return REGISTRY_SPEC_TYPES.has(parsed.subSpec.type);\n }\n return false;\n } catch {\n // npm-package-arg throws on invalid names, tags and URL protocols.\n return false;\n }\n}\n\n/** A package spec that is not a registry version, range or tag. */\nexport class UnsupportedPackageSpecError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UnsupportedPackageSpecError';\n }\n}\n\nfunction formatSpec(check: SpecCheck): string {\n return `${check.name}@${check.spec} (from ${check.from})`;\n}\n\n/**\n * Throw one error naming every spec a flow declares that is not a registry\n * version, range or tag. Used for direct packages and override values.\n */\nexport function assertRegistrySpecs(checks: ReadonlyArray<SpecCheck>): void {\n const bad = checks.filter((c) => !isRegistrySpec(c.name, c.spec));\n if (bad.length === 0) return;\n throw new UnsupportedPackageSpecError(\n `Unsupported package spec: ${bad.map(formatSpec).join(', ')}. ` +\n `Only npm registry versions, ranges and tags can be bundled. ` +\n `For a package on disk use config.bundle.packages.<name>.path.`,\n );\n}\n\n/** Throw when a transitive dependency spec is not a registry fetch. */\nexport function assertTransitiveRegistrySpec(check: SpecCheck): void {\n if (isRegistrySpec(check.name, check.spec, true)) return;\n throw new UnsupportedPackageSpecError(\n `Unsupported dependency spec: ${formatSpec(check)}. ` +\n `The bundler only installs dependencies from the npm registry; ` +\n `git, file, directory and URL dependencies are refused because ` +\n `fetching them can run install scripts.`,\n );\n}\n","import esbuild from 'esbuild';\nimport { 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 declared package the\n * bundle imports 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 is the declared `bundle.packages` the bundle imports\n * (`collectImportedPackages`). A declared package nothing imports is not an\n * error: a dependency used only for its types, or a leftover entry, never\n * reaches the bundle. Such packages are returned (unless the trace reached\n * them through another package) so the caller can warn. The check is\n * shallow on purpose: we only verify the package's `package.json` reached\n * the trace, not every file inside. If the manifest is there, nft followed\n * the imports and copied what it found; if a deeper file is missing the\n * user adds it via `flow.<name>.config.bundle.traceInclude`.\n */\nexport interface AssertDepsOptions {\n fileList: string[];\n declaredPackages: string[];\n importedPackages: ReadonlySet<string>;\n}\n\n/**\n * Throws when an imported declared package is missing from the trace.\n * Returns the declared packages that are neither imported nor traced.\n */\nexport function assertDepsTraced(opts: AssertDepsOptions): string[] {\n const isTraced = (dep: string): boolean => {\n const manifest = `node_modules/${dep}/package.json`;\n return opts.fileList.some((f) => f.endsWith(manifest));\n };\n const missing = opts.declaredPackages.filter(\n (dep) => opts.importedPackages.has(dep) && !isTraced(dep),\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 return opts.declaredPackages.filter(\n (dep) => !opts.importedPackages.has(dep) && !isTraced(dep),\n );\n}\n\n/**\n * Package names of every bare import (static, dynamic, or require) in a\n * built bundle, read from esbuild's metafile with all packages external.\n * Subpaths collapse to their package (`@scope/pkg/dev` is `@scope/pkg`).\n */\nexport async function collectImportedPackages(\n file: string,\n): Promise<Set<string>> {\n let result: esbuild.BuildResult<{ metafile: true; write: false }>;\n try {\n result = await esbuild.build({\n entryPoints: [file],\n bundle: true,\n write: false,\n metafile: true,\n packages: 'external',\n platform: 'node',\n format: 'esm',\n logLevel: 'silent',\n });\n } finally {\n await esbuild.stop();\n }\n\n const imported = new Set<string>();\n for (const input of Object.values(result.metafile.inputs)) {\n for (const entry of input.imports) {\n if (entry.external) imported.add(packageNameOf(entry.path));\n }\n }\n return imported;\n}\n\nfunction packageNameOf(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@')\n ? segments.slice(0, 2).join('/')\n : segments[0];\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","import fs from 'fs-extra';\nimport * as path from 'path';\nimport semver from 'semver';\nimport type { Logger } from '@walkeros/core';\n\ninterface PackageJson {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n}\n\nexport interface DepViolation {\n consumerName: string;\n consumerVersion: string;\n depName: string;\n declaredRange: string;\n installedVersion: string;\n installedDir: string;\n}\n\n/**\n * Walks every installed package under `<root>/node_modules/**` and reports each\n * case where a declared dependency resolves (via Node-style nearest-ancestor\n * lookup) to a version that does NOT satisfy the declared range.\n *\n * Defense-in-depth observability for the bundler's resolver. Returns the list\n * of violations and emits a `logger.warn` for each. Does NOT throw: many\n * mismatches are benign npm transitives that nft will prune from the shipped\n * bundle. If a runtime error like \"X is not a function\" surfaces despite the\n * resolver fix, look at these warnings to find the culprit, then add an entry\n * to `config.bundle.overrides` in the flow file.\n */\nexport async function assertConsumerDepsSatisfied(\n root: string,\n logger: Logger.Instance,\n): Promise<DepViolation[]> {\n const consumers = await collectInstalledPackages(\n path.join(root, 'node_modules'),\n );\n const violations: DepViolation[] = [];\n\n for (const consumer of consumers) {\n const pkg = consumer.pkg;\n if (!pkg.dependencies) continue;\n for (const [depName, declaredRange] of Object.entries(pkg.dependencies)) {\n const installed = await resolveSiblingOrAncestor(\n consumer.dir,\n depName,\n root,\n );\n if (!installed) {\n logger.debug(\n `assertConsumerDepsSatisfied: ${pkg.name}@${pkg.version} declares ${depName}@${declaredRange} but it's not installed`,\n );\n continue;\n }\n // git/file:/tag: can't statically verify\n if (\n semver.validRange(declaredRange) === null &&\n semver.valid(declaredRange) === null\n ) {\n logger.debug(\n `assertConsumerDepsSatisfied: skipping non-semver declared range ${depName}@${declaredRange} from ${pkg.name}`,\n );\n continue;\n }\n const satisfied = semver.valid(declaredRange)\n ? declaredRange === installed.version\n : semver.satisfies(installed.version, declaredRange, {\n includePrerelease: true,\n });\n if (!satisfied) {\n const violation: DepViolation = {\n consumerName: pkg.name ?? '<unknown>',\n consumerVersion: pkg.version ?? '<unknown>',\n depName,\n declaredRange,\n installedVersion: installed.version,\n installedDir: installed.dir,\n };\n violations.push(violation);\n logger.warn(\n `Bundler dep mismatch: ${violation.consumerName}@${violation.consumerVersion} declares ${depName}@${declaredRange} but resolved to ${installed.version} at ${installed.dir}. If this surfaces at runtime, add an entry to config.bundle.overrides in the flow file.`,\n );\n }\n }\n }\n\n return violations;\n}\n\ninterface InstalledPackage {\n dir: string;\n pkg: PackageJson;\n}\n\nasync function collectInstalledPackages(\n nodeModulesDir: string,\n): Promise<InstalledPackage[]> {\n const result: InstalledPackage[] = [];\n if (!(await fs.pathExists(nodeModulesDir))) return result;\n\n async function walk(dir: string) {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const full = path.join(dir, entry.name);\n // Scoped package: recurse into @scope dir, treat children as packages\n if (entry.name.startsWith('@')) {\n const scopedEntries = await fs.readdir(full, { withFileTypes: true });\n for (const scoped of scopedEntries) {\n if (!scoped.isDirectory()) continue;\n await collectOne(path.join(full, scoped.name));\n }\n continue;\n }\n await collectOne(full);\n }\n }\n\n async function collectOne(pkgDir: string) {\n const pkgJsonPath = path.join(pkgDir, 'package.json');\n if (!(await fs.pathExists(pkgJsonPath))) return;\n const pkg = (await fs.readJson(pkgJsonPath)) as PackageJson;\n result.push({ dir: pkgDir, pkg });\n // Recurse into nested node_modules\n const nestedNm = path.join(pkgDir, 'node_modules');\n if (await fs.pathExists(nestedNm)) await walk(nestedNm);\n }\n\n await walk(nodeModulesDir);\n return result;\n}\n\n/**\n * Node-style resolution: search `<consumerDir>/node_modules/<depName>`, then walk\n * up to each ancestor's `node_modules/<depName>` until we find one or hit `root`.\n */\nasync function resolveSiblingOrAncestor(\n consumerDir: string,\n depName: string,\n root: string,\n): Promise<{ dir: string; version: string } | null> {\n let current = consumerDir;\n while (true) {\n const candidate = path.join(current, 'node_modules', depName);\n const pkgJson = path.join(candidate, 'package.json');\n if (await fs.pathExists(pkgJson)) {\n const pkg = (await fs.readJson(pkgJson)) as PackageJson;\n if (pkg.version) return { dir: candidate, version: pkg.version };\n }\n const parent = path.dirname(current);\n if (parent === current || !current.startsWith(root)) return null;\n current = parent;\n }\n}\n","import type { BuildFlag, Flow } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\n\n/**\n * Build-time feature flags for browser bundles (see @walkeros/core\n * build-flags). The CLI defines every flag, true or false, so no guard\n * survives into a bundle and a feature the flow does not use folds out.\n * Only browser bundles get them: the `cdn` stage 2 and the browser wrap.\n */\n\n/** The optional runtime features a flow uses. */\nexport interface FlowNeeds {\n observe: boolean;\n stores: boolean;\n state: boolean;\n}\n\n/** Whether a step declares `state`. A config the CLI cannot read counts. */\nfunction carriesState(step: { state?: unknown; config?: unknown }): boolean {\n if (step.state !== undefined) return true;\n if (step.config === undefined) return false;\n return !isObject(step.config) || step.config.state !== undefined;\n}\n\n/** Read the optional runtime features off a flow's config. */\nexport function flowNeeds(flow: Flow): FlowNeeds {\n const steps = [\n ...Object.values(flow.sources ?? {}),\n ...Object.values(flow.transformers ?? {}),\n ...Object.values(flow.destinations ?? {}),\n ];\n return {\n observe:\n flow.config?.observe !== undefined ||\n flow.collector?.observe !== undefined,\n stores: Object.keys(flow.stores ?? {}).length > 0,\n state: steps.some(carriesState),\n };\n}\n\n/**\n * The esbuild `define` map for a browser bundle. Validation is always off:\n * the CLI validates the flow at build time. Without needs (a skeleton from an\n * older CLI) every flag is on, which is the full behaviour.\n */\nexport function buildFlagDefines(\n needs: FlowNeeds | undefined,\n): Record<BuildFlag, string> {\n if (!needs) {\n return {\n __WALKEROS_OBSERVE__: 'true',\n __WALKEROS_STORES__: 'true',\n __WALKEROS_STATE__: 'true',\n __WALKEROS_VALIDATE__: 'true',\n };\n }\n return {\n __WALKEROS_OBSERVE__: String(needs.observe),\n __WALKEROS_STORES__: String(needs.stores),\n __WALKEROS_STATE__: String(needs.state),\n __WALKEROS_VALIDATE__: 'false',\n };\n}\n\n/**\n * A browser skeleton ends with its flow's needs, so the publish-time wrap can\n * define the flags without the flow. The wrap reads it as text, the way it\n * reads the `__devExports` registry.\n */\nconst NEEDS_MARKER = 'walkeros:needs';\n\nexport function needsMarker(needs: FlowNeeds): string {\n return `/* ${NEEDS_MARKER} ${JSON.stringify(needs)} */`;\n}\n\n/** The needs a skeleton carries; undefined when an older CLI wrote it. */\nexport function readNeedsMarker(skeleton: string): FlowNeeds | undefined {\n const match = new RegExp(`/\\\\* ${NEEDS_MARKER} (\\\\{[^}]*\\\\}) \\\\*/\\\\s*$`).exec(\n skeleton,\n );\n if (!match) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(match[1]);\n } catch {\n return undefined;\n }\n if (!isObject(parsed)) return undefined;\n const { observe, stores, state } = parsed;\n if (\n typeof observe !== 'boolean' ||\n typeof stores !== 'boolean' ||\n typeof state !== 'boolean'\n )\n return undefined;\n return { observe, stores, state };\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 { writeCacheFile } from './atomic-cache.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 /** CLI version: stage-1 codegen changes with it. */\n toolchain: 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 toolchain: inputs.toolchain,\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 writeCacheFile(cachePath, buildOutput);\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 writeCacheFile(cachePath, codeOutput);\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 writeCacheFile(cachePath, compiledCode);\n }\n\n return cachePath;\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","/**\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 /**\n * If true, the skeleton carries the lazy `/dev` registry\n * (`'<pkg>': () => import('<pkg>/dev')`) so simulate/push can await schemas\n * on demand. Every skeleton target sets this true: the registry is an\n * unreferenced thunk, so the deploy wrap DCEs the whole /dev graph to zero\n * bytes. Only the finished IIFE (`cdn`) sets this false, since it has no\n * registry and needs none.\n */\n withDev: boolean;\n /**\n * Gates whether the browser build externalizes each `<pkg>/dev` subpath.\n *\n * Deploy skeletons (`cdn-skeleton`, `runner`) set this true: `<pkg>/dev` is\n * externalized so the lazy registry stays a literal `import('<pkg>/dev')` and\n * the deploy wrap DCEs the whole /dev graph to zero bytes.\n *\n * In-process targets (`simulate`, `push`) set this false: `<pkg>/dev` is NOT\n * externalized, so esbuild inlines the /dev graph into the single ESM. The\n * lazy thunk then resolves an already-bundled module, which is what lets the\n * lean simulate-server (cli + core only, no sibling node_modules) resolve\n * schemas host-free. Node platform is unaffected by this flag: it always keeps\n * step packages external, and that bare external prefix-covers `<pkg>/dev`.\n */\n externalizeDev: 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 externalizeDev: false,\n platform: 'browser',\n injectEnv: true,\n }),\n // skipWrapper emits the introspectable skeleton (not a finished bundle),\n // consumed by simulate/preview/deploy; node keeps step packages external for\n // on-disk resolution (see the skeleton branch in bundler.ts). Every skeleton\n // carries the lazy /dev registry (withDev:true); it is an unreferenced thunk\n // the deploy wrap DCEs, so a skeleton with the registry is safe to deploy.\n // The browser skeleton additionally externalizes each `<pkg>/dev` so the\n // registry stays a literal `import()` rather than inlining the /dev graph.\n 'cdn-skeleton': Object.freeze({\n skipWrapper: true,\n withDev: true,\n externalizeDev: true,\n platform: 'browser',\n injectEnv: false,\n }),\n runner: Object.freeze({\n skipWrapper: true,\n withDev: true,\n externalizeDev: true,\n platform: 'node',\n injectEnv: false,\n }),\n simulate: Object.freeze({\n skipWrapper: true,\n withDev: true,\n externalizeDev: false,\n platform: 'node',\n injectEnv: false,\n }),\n push: Object.freeze({\n skipWrapper: true,\n withDev: true,\n externalizeDev: false,\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 (names only — per-package byte sizes are not measured)\n if (stats.packages.length > 0) {\n logger.info(`\\nPackages:`);\n stats.packages.forEach((pkg) => {\n logger.info(` • ${pkg.name}`);\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 })),\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { createIngest, getPlatform, stepId } from '@walkeros/core';\nimport {\n enrichEvent,\n transformerInit,\n runCollectorNext,\n runTransformerChain,\n wrapEnv,\n} from '@walkeros/collector';\nimport {\n createCLILogger,\n createCLILoggerConfig,\n} from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n detectInput,\n writeResult,\n type Platform,\n} from '../../core/index.js';\n\nimport type {\n Collector,\n Flow,\n FlowState,\n Ingest,\n Logger,\n Simulation,\n Source,\n WalkerOS,\n} from '@walkeros/core';\nimport { tmpRunDir } from '../../core/tmp-names.js';\nimport { scrubJson, scrubSecrets } from '../../core/redact-line.js';\nimport { toPrintable } from '../../core/to-printable.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 { buildSimulationResult } from './simulation-result.js';\nimport { prepareFlow } from './prepare.js';\nimport { schemas } from '@walkeros/core/dev';\nimport { runPushCommandWithSecrets } from './run.js';\nimport { collectKnownSecrets } from '../../core/known-secrets.js';\nimport { legacyExportRefusal, selectDevExamples } from './dev-examples.js';\nimport { resolveExportName } from '../../core/resolve-export-name.js';\n\n/**\n * Narrow runtime check used by the CLI output formatter to read fields off\n * an opaque `elbResult`. Avoids spreading `as Record<string, unknown>`\n * everywhere a few fields are pulled.\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\n/** A flow config (`Flow.Json`): an object with a `flows` object. */\nexport function isFlowJson(value: unknown): value is Flow.Json {\n return isRecord(value) && isRecord(value.flows);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * The trigger instance a source's `createTrigger` resolves to. `trigger`\n * fires a (type, options) trigger; the returned function takes the captured\n * content. `flow.collector.command` lets the simulator request a shutdown.\n * The bundle carries no compile-time types, so the simulator pins only the\n * members it actually reads and keeps the rest opaque.\n */\ninterface TriggerInstance {\n trigger: (\n type?: string,\n options?: unknown,\n ) => (content?: unknown) => Promise<unknown>;\n flow?: {\n collector?: {\n command?: (command: string) => Promise<unknown>;\n };\n };\n}\n\n/**\n * Signature of a source package's `createTrigger`, narrowed off the awaited\n * `/dev` module. The simulator only needs it to be callable and resolve to a\n * `TriggerInstance`; the bundle carries no compile-time types so the\n * parameters stay opaque.\n */\ntype CreateTrigger = (...args: unknown[]) => Promise<TriggerInstance>;\n\n/**\n * Type predicate narrowing an opaque value to a callable. Used instead of a\n * cast so `getCreateTrigger` can return a precisely typed function without\n * the banned `Function` type or an `as` assertion.\n */\nfunction isCallable(value: unknown): value is CreateTrigger {\n return typeof value === 'function';\n}\n\n/**\n * Narrow the awaited `/dev` module of a source package down to the\n * `createTrigger` of the step's export (see `selectDevExamples`), validating\n * each hop with `in`/`typeof` instead of a cast. Returns `undefined` if any\n * hop is missing or the wrong shape.\n */\nfunction getCreateTrigger(\n devModule: unknown,\n exportName: string | undefined,\n): CreateTrigger | undefined {\n const examples = selectDevExamples(devModule, exportName);\n if (!examples || !('createTrigger' in examples)) return undefined;\n const createTrigger = examples.createTrigger;\n return isCallable(createTrigger) ? createTrigger : undefined;\n}\n\n/**\n * Shape of a destination package's simulation `/dev` env, narrowed off the\n * awaited `/dev` module. `push` is the env object handed to the destination;\n * `simulation` lists `call:<fn>` markers the wrapper should track.\n */\ninterface DevEnv {\n push?: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Narrow the awaited `/dev` module of a package down to the `examples.env` of\n * the step's export (see `selectDevExamples`), validating each hop with\n * `in`/`typeof` instead of a cast. Returns `undefined` if any hop is missing\n * or the wrong shape.\n */\nfunction getDevEnv(\n devModule: unknown,\n exportName: string | undefined,\n): DevEnv | undefined {\n const examples = selectDevExamples(devModule, exportName);\n if (!examples || !('env' in examples)) return undefined;\n const env = examples.env;\n if (!isRecord(env)) return undefined;\n const result: DevEnv = {};\n if ('push' in env && isRecord(env.push)) result.push = env.push;\n if ('simulation' in env && isStringArray(env.simulation))\n result.simulation = env.simulation;\n return result;\n}\n\n/**\n * Injects each flow store's dev-examples mock env (`examples.env.push` of\n * the store's export, resolved like steps) before `startFlow`, so a store\n * that reaches the network at start (Sheets existence check, token\n * exchange) runs against its mock in every simulation. The store definition\n * object is mutated in place: `$store.<id>` env references resolve by\n * identity. A store whose package ships no mock env (fs, memory: local\n * only) runs as configured; its id is returned for a debug line.\n */\nexport async function applyStoreMockEnvs(\n flowConfig: { stores?: unknown },\n flowSettings: Flow,\n devExports: Record<string, () => Promise<unknown>> | undefined,\n): Promise<string[]> {\n const unmocked: string[] = [];\n const stores = flowConfig.stores;\n if (!isRecord(stores)) return unmocked;\n\n for (const [storeId, storeDef] of Object.entries(stores)) {\n const packageName = flowSettings.stores?.[storeId]?.package;\n const loadDev = packageName ? devExports?.[packageName] : undefined;\n const devModule =\n typeof loadDev === 'function' ? await loadDev() : undefined;\n const { exportName } = resolveExportName(flowSettings, 'store', storeId);\n const push = getDevEnv(devModule, exportName)?.push;\n\n if (!push || !isRecord(storeDef)) {\n unmocked.push(storeId);\n continue;\n }\n\n // `context.env` (the def's top-level `env`) is read first by the store\n // packages, so the mock replaces it and always wins over a configured\n // env. Assigned by reference: a mock's getters stay live.\n storeDef.env = push;\n }\n\n return unmocked;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(isString);\n}\n\n/** How the running flow logs: `json` routes its logs to stderr. */\ninterface FlowLogOptions {\n json?: boolean;\n silent?: boolean;\n verbose?: boolean;\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 raw?: unknown;\n knownSecrets?: readonly string[];\n } = {},\n): Promise<PushResult> {\n // Known once the config is read; the logger reads the list per line.\n let known: readonly string[] = options.knownSecrets ?? [];\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets: () => known,\n });\n const startTime = Date.now();\n let tempDir: string | undefined;\n\n try {\n // Detect input type. A `raw` config was already read by the caller: it\n // is a config, and this run reads the input no more.\n logger.debug('Detecting input type');\n const detected =\n options.raw !== undefined\n ? { type: 'config' as const }\n : 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 // The config as read once: the one `raw`, else the detected content.\n const raw: unknown =\n options.raw !== undefined\n ? options.raw\n : 'content' in detected\n ? JSON.parse(detected.content)\n : undefined;\n const knownSecrets =\n options.knownSecrets ??\n (isFlowJson(raw) ? collectKnownSecrets(raw) : []);\n known = knownSecrets;\n result = await executeConfigPush(\n {\n config: inputPath,\n flow: options.flow,\n json: options.json,\n silent: options.silent,\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 { raw, knownSecrets },\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 options,\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, knownSecrets } = await runPushCommandWithSecrets(options);\n const output = renderPushOutput(result, {\n json: options.json,\n knownSecrets,\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 * The `walkeros push` output (`--json` or text). Simulate output carries the\n * recorded vendor calls, whose arguments can hold credentials. It egresses\n * like a log line: serialize, then scrub, masking the values of the secrets\n * the flow references (`knownSecrets`) whatever their shape. A number that\n * prints a known secret is masked before serializing, so `--json` stays JSON.\n */\nexport function renderPushOutput(\n result: PushResult,\n options: { json?: boolean; knownSecrets?: readonly string[] } = {},\n): string {\n const knownSecrets = options.knownSecrets ?? [];\n return options.json\n ? scrubJson(result, { known: knownSecrets, space: 2 })\n : scrubSecrets(formatPushResult(result, { knownSecrets }), {\n known: knownSecrets,\n });\n}\n\nconst MAX_CALL_ARGS_LENGTH = 300;\n\n/** Compact JSON of one printable value; `undefined` has no JSON form. */\nfunction compactJson(value: unknown): string {\n return JSON.stringify(toPrintable(value)) ?? 'undefined';\n}\n\n/**\n * One call's arguments as compact JSON, cut at 300 chars. Scrubbed before the\n * cut so a secret straddling the cut cannot lose the context that marks it.\n */\nfunction formatCallArgs(\n args: unknown[],\n knownSecrets: readonly string[],\n): string {\n const text = scrubSecrets(args.map(compactJson).join(','), {\n known: knownSecrets,\n });\n return text.length > MAX_CALL_ARGS_LENGTH\n ? `${text.slice(0, MAX_CALL_ARGS_LENGTH - 3)}...`\n : text;\n}\n\n/** `granted functional, marketing` style list of the granted keys. */\nfunction grantedKeys(consent: WalkerOS.Consent | undefined): string {\n const keys = Object.entries(consent ?? {})\n .filter(([, granted]) => granted)\n .map(([key]) => key);\n return keys.length > 0 ? keys.join(', ') : 'none';\n}\n\n/** One line saying why a simulated destination sent nothing. */\nfunction formatSkipped(skipped: Simulation.Skipped): string {\n if (skipped.reason === 'pending') {\n const waits = skipped.require?.length ? skipped.require.join(', ') : '';\n return ` pending: waits for ${waits || 'its require'} (require)`;\n }\n return ` skipped: consent (requires ${grantedKeys(skipped.required)}; granted ${grantedKeys(skipped.granted)})`;\n}\n\nfunction formatSimulation(\n simulation: Simulation.Result,\n knownSecrets: readonly string[],\n): string[] {\n const lines = [` ${simulation.step}.${simulation.name}`];\n if (simulation.error) {\n lines.push(` error: ${simulation.error.message}`);\n return lines;\n }\n if (simulation.step === 'destination') {\n // No key with calls: the destination has no rule for the event and\n // pushed it as is. No key and no calls: it was skipped before mapping.\n const unmapped =\n simulation.calls.length > 0 ? 'none' : 'none (skipped before mapping)';\n lines.push(` mapping: ${simulation.mappingKey ?? unmapped}`);\n if (simulation.skipped) lines.push(formatSkipped(simulation.skipped));\n for (const call of simulation.calls)\n lines.push(\n ` call ${call.fn}(${formatCallArgs(call.args, knownSecrets)})`,\n );\n if (simulation.calls.length === 0) lines.push(' no calls');\n return lines;\n }\n for (const call of simulation.calls)\n lines.push(\n ` call ${call.fn}(${formatCallArgs(call.args, knownSecrets)})`,\n );\n for (const event of simulation.events)\n lines.push(` event ${formatCallArgs([event], knownSecrets)}`);\n if (simulation.events.length === 0) lines.push(' no events');\n return lines;\n}\n\n/**\n * Text output of `walkeros push`: the outcome, the push result or one block\n * per simulated step (its mapping, why nothing was sent, recorded calls), the\n * error, the duration. Call arguments are scrubbed here (before their cut),\n * masking `knownSecrets`; `pushCommand` scrubs the whole text at egress.\n */\nexport function formatPushResult(\n result: PushResult,\n options: { knownSecrets?: readonly string[] } = {},\n): string {\n const knownSecrets = options.knownSecrets ?? [];\n const lines: string[] = [];\n // Reflect the actual outcome. `success: true` only when no destination\n // recorded a failure during init/push/destroy (see executeDestinationPush).\n lines.push(`success: ${result.success}`);\n if (result.success) {\n const elbResult = isRecord(result.elbResult) ? result.elbResult : undefined;\n if (elbResult) {\n if (typeof elbResult.id === 'string')\n lines.push(` Event ID: ${elbResult.id}`);\n if (typeof elbResult.entity === 'string')\n lines.push(` Entity: ${elbResult.entity}`);\n if (typeof elbResult.action === 'string')\n lines.push(` Action: ${elbResult.action}`);\n }\n }\n for (const simulation of result.simulations ?? [])\n lines.push(...formatSimulation(simulation, knownSecrets));\n if (!result.success && result.error) lines.push(` Error: ${result.error}`);\n lines.push(` Duration: ${result.duration}ms`);\n return lines.join('\\n');\n}\n\n/**\n * High-level push function for programmatic usage.\n *\n * WARNING: This makes real API calls to real endpoints.\n * Events will be sent to configured destinations (analytics, CRM, etc.).\n *\n * @param configOrPath - Path to flow configuration file or pre-built bundle\n * @param event - Event object to push\n * @param options - Push options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.json - Format output as JSON (default: false)\n * @returns Push result with success status, elb result, and duration\n *\n * @example\n * ```typescript\n * const result = await push('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n * ```\n */\nexport async function push(\n configOrPath: string | unknown,\n event: unknown,\n options: PushOptions & {\n flow?: string;\n platform?: Platform;\n mock?: string[];\n snapshot?: string;\n /**\n * The config at `configOrPath`, already read by the caller: used as is,\n * the path is not read again (it still anchors relative paths).\n */\n raw?: unknown;\n /**\n * Values masked in the flow's logs. Defaults to the values of the\n * secrets the config references (see `collectKnownSecrets`).\n */\n knownSecrets?: readonly 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 raw: options.raw,\n knownSecrets: options.knownSecrets,\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 loaded: { raw: unknown; knownSecrets: readonly string[] },\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 raw: loaded.raw,\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 = await tmpRunDir('push');\n setTempDir(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 options,\n loaded.knownSecrets,\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 flowLogs: FlowLogOptions = {},\n): Promise<PushResult> {\n // Write bundle to temp file\n const tempDir = await tmpRunDir('push');\n setTempDir(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 flowLogs,\n );\n}\n\n/**\n * Execute non-simulated destination push (full pipeline).\n * Uses withFlowContext for environment setup and cleanup.\n *\n * Server platform deliberately disables timer interception and the drain\n * pump. Real `walkeros push` against destinations that use gRPC SDKs\n * (Pub/Sub, BigQuery, Kafka, AWS SDK v3, etc.) needs native Node timers:\n * those clients drive batch flush via `setTimeout` and keepalive via\n * `setInterval`, and intercepted timers break the gRPC client's state\n * machine, causing `topic.publishMessage()` to never resolve. Web platform\n * keeps interception + pump for backwards compatibility with destinations\n * whose init awaits a long captured timer (e.g. amplitude engagement\n * plugin) inside JSDOM. Simulate routes have their own call sites and\n * keep interception for deterministic snapshots.\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 flowLogs: FlowLogOptions = {},\n knownSecrets?: readonly string[],\n): Promise<PushResult> {\n const startTime = Date.now();\n const networkCalls: NetworkCall[] = [];\n const isServer = platform === 'server';\n\n return withFlowContext(\n {\n esmPath,\n platform,\n logger,\n snapshotCode,\n timeout,\n // Network polyfills are JSDOM-only; on server real push we want real\n // network so omit the capture array.\n ...(isServer ? {} : { networkCalls }),\n // Server real push: native Node primitives, no interception.\n // Web real push: keep interception + pump (see fn-level docstring).\n ...(isServer\n ? {}\n : {\n asyncDrain: { timeout: 5000 },\n drainPump: true,\n }),\n },\n async (module) => {\n const config = module.wireConfig(module.__configData ?? undefined);\n applyOverrides(config, overrides || {});\n routeFlowLogs(config, flowLogs, knownSecrets);\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 // Any-fail policy: if any wired destination's init/push/destroy\n // logged a failure, surface it on the PushResult. The collector\n // tallies failures at `status.destinations[id].failed` (incremented\n // in collector/src/destination.ts both for init throws and for push\n // throws), and increments `status.failed` per occurrence.\n const failedIds = collectFailedDestinations(collector);\n const success = failedIds.length === 0;\n const error = success\n ? undefined\n : buildFailureSummary(failedIds, collector);\n\n return {\n success,\n ...(error !== undefined ? { error } : {}),\n elbResult: elbResult as PushResult['elbResult'],\n ...(networkCalls.length > 0 ? { networkCalls } : {}),\n duration: Date.now() - startTime,\n };\n },\n );\n}\n\n/**\n * Minimal view of the collector status surface we read here. We only need\n * the per-destination failure counter the collector already tracks; the\n * full Collector.Instance type is not exported through the dynamically\n * imported bundle, so we narrow it locally without `any`.\n */\ninterface CollectorStatusView {\n status?: {\n destinations?: Record<string, { failed?: number; count?: number }>;\n };\n destinations?: Record<string, { type?: string }>;\n}\n\n/**\n * Read the failed-destination ids from the collector after shutdown.\n * Returns ids whose `status.destinations[id].failed` is > 0.\n */\nfunction collectFailedDestinations(collector: unknown): string[] {\n if (collector === null || typeof collector !== 'object') return [];\n const view = collector as CollectorStatusView;\n const destStatus = view.status?.destinations;\n if (!destStatus) return [];\n const failed: string[] = [];\n for (const [id, s] of Object.entries(destStatus)) {\n if (s && typeof s.failed === 'number' && s.failed > 0) failed.push(id);\n }\n return failed;\n}\n\n/**\n * Build a single-line, public-safe failure summary. We intentionally do\n * NOT include inner error messages or stack traces here: a server\n * endpoint that returns `PushResult` to a client must not leak\n * destination-internal errors. Detailed error context already flows\n * through the destination's scoped logger.\n */\nfunction buildFailureSummary(failedIds: string[], collector: unknown): string {\n const view = (\n collector !== null && typeof collector === 'object' ? collector : {}\n ) as CollectorStatusView;\n const dests = view.destinations ?? {};\n const labels = failedIds.map((id) => {\n const type = dests[id]?.type;\n return type ? `${id} (${type})` : id;\n });\n const noun = failedIds.length === 1 ? 'destination' : 'destinations';\n return `Push failed for ${noun}: ${labels.join(', ')}`;\n}\n\n/**\n * Routes the running flow's own logs (collector, steps) through the CLI\n * handler. In `--json` mode stdout carries only the result, so they go to\n * stderr like the CLI's. A simulation and a real push of a flow config always\n * route them, passing the values of the secrets the flow references\n * (`knownSecrets`) so every line is masked; a prebuilt bundle without\n * `--json` keeps the flow's own logger. The flow's configured level still\n * gates what reaches the handler.\n */\nfunction routeFlowLogs(\n flowConfig: { logger?: Logger.Config },\n options: FlowLogOptions,\n knownSecrets?: readonly string[],\n): void {\n if (!options.json && knownSecrets === undefined) return;\n const { handler } = createCLILoggerConfig({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\n });\n flowConfig.logger = { ...flowConfig.logger, handler };\n}\n\n/**\n * Shared data-injection seam for all simulate functions.\n */\nexport interface SimulateDataOptions {\n /**\n * Wire-config data payload to execute instead of the bundle's baked\n * `__configData`. Shape: the split-config data payload the bundler\n * emits (section, step id, data-layer props), as built by\n * `buildDataPayload`.\n *\n * The payload REPLACES the baked data, there is no deep-merge: build\n * the full payload from the full config. Injection granularity follows\n * the skeleton's `__data` references, which are emitted per TOP-LEVEL\n * step prop. Changed values for any nested key under an existing\n * top-level data prop (e.g. a new entity-action rule inside an existing\n * `mapping`) take effect without a rebundle. An entirely NEW top-level\n * data prop on a step has no `__data` reference in the skeleton, so it\n * is IGNORED by injection and requires a rebundle.\n */\n data?: Record<string, unknown>;\n}\n\nexport interface SimulateSourceOptions extends SimulateDataOptions {\n /** Log to stderr so stdout carries only the result (`push --json`). */\n json?: boolean;\n sourceId: string;\n bundlePath?: string;\n flow?: string;\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n /**\n * Web sources only: the absolute URL of the simulated page. Defaults to the\n * input trigger's `options.url` when it is a string, else\n * `http://localhost`.\n */\n pageUrl?: string;\n /**\n * The collector's starting consent, handed to `startFlow` as its state\n * (e.g. the consent a gated source such as the session source waits for).\n * Never recorded as a call: only the source's own commands are.\n */\n consent?: WalkerOS.Consent;\n}\n\nexport const PAGE_URL_SCOPE_ERROR =\n '--page-url sets the page of a simulated web source; for request context use --ingest.';\n\nconst DEFAULT_PAGE_URL = 'http://localhost';\n\n/**\n * The page a simulated web source runs on: an explicit `pageUrl`, else the\n * trigger's `options.url` when it is a string, else `http://localhost`.\n */\nfunction resolvePageUrl(input: unknown, pageUrl: string | undefined): string {\n const url = pageUrl ?? triggerUrl(input) ?? DEFAULT_PAGE_URL;\n let parsed: URL | undefined;\n try {\n parsed = new URL(url);\n } catch {\n parsed = undefined;\n }\n // http(s) only: an opaque origin (file:, about:, data:) has no storage.\n if (parsed?.protocol !== 'http:' && parsed?.protocol !== 'https:')\n throw new Error(\n `--page-url must be an absolute http(s) URL, e.g. https://www.example.com/ (got \"${url}\")`,\n );\n return parsed.href;\n}\n\nfunction triggerUrl(input: unknown): string | undefined {\n if (!isRecord(input) || !isRecord(input.trigger)) return undefined;\n const { options } = input.trigger;\n return isRecord(options) && isString(options.url) ? options.url : undefined;\n}\n\n/** A source definition's `code`, narrowed off the untyped wired config. */\nfunction isSourceInit(value: unknown): value is Source.Init {\n return typeof value === 'function';\n}\n\n/** Commands a source uses to wire itself up, not effects it emits. */\nconst WIRING_COMMANDS = new Set(['on', 'hook', 'destination']);\n\n/**\n * Wraps a source's `code` so the walker commands the source itself issues are\n * recorded in its call shape (`elb`, first argument verbatim): every\n * `env.command(name, data)` and every `env.elb('walker <name>', data)`, except\n * the wiring commands. The env is patched in place before `code` runs, so the\n * collector's own env object (and every scope derived from it) stays the one\n * the source sees. Commands the collector issues itself (`startFlow`'s starting\n * state, the simulator's shutdown) never pass through the source's env.\n */\nfunction recordSourceCommands(\n code: Source.Init,\n calls: Simulation.Call[],\n): Source.Init {\n const record = (first: unknown, data: unknown, name: string): void => {\n if (WIRING_COMMANDS.has(name)) return;\n calls.push({ fn: 'elb', args: [first, data], ts: Date.now() });\n };\n return (context) => {\n const { env } = context;\n env.command = new Proxy(env.command, {\n apply(target, thisArg, args: unknown[]) {\n const [name, data] = args;\n if (typeof name === 'string') record(name, data, name);\n return Reflect.apply(target, thisArg, args);\n },\n });\n env.elb = new Proxy(env.elb, {\n apply(target, thisArg, args: unknown[]) {\n const [first, data] = args;\n // The elb protocol: a `walker ` string is a command (see createElb).\n if (typeof first === 'string' && first.startsWith('walker '))\n record(first, data, first.slice('walker '.length));\n return Reflect.apply(target, thisArg, args);\n },\n });\n return code(context);\n };\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<Simulation.Result> {\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 json: options.json,\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 json: options.json,\n };\n\n const prepared = await prepareFlow(prepareInput);\n // Values of the secrets the flow references: masked in every log line.\n const knownSecrets = collectKnownSecrets(config);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\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 if (options.pageUrl !== undefined && prepared.platform !== 'web')\n throw new Error(PAGE_URL_SCOPE_ERROR);\n const pageUrl =\n prepared.platform === 'web'\n ? resolvePageUrl(input, options.pageUrl)\n : undefined;\n\n return await withFlowContext<Simulation.Result>(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n offline: true,\n pageUrl,\n },\n async (module) => {\n // Look up createTrigger from the lazy __devExports registry: await the\n // thunk to pull the /dev module in, then narrow without a cast.\n const loadDev = module.__devExports?.[sourceConfig!.package!];\n const devModule =\n typeof loadDev === 'function' ? await loadDev() : undefined;\n const { exportName } = resolveExportName(\n prepared.flowSettings,\n 'source',\n options.sourceId,\n );\n const legacyRefusal = legacyExportRefusal(\n devModule,\n module.__packageExports,\n sourceConfig!.package!,\n exportName,\n );\n if (legacyRefusal) throw new Error(legacyRefusal);\n const createTrigger = getCreateTrigger(devModule, exportName);\n if (!createTrigger) {\n throw new Error(\n `Source package \"${sourceConfig!.package}\" has no createTrigger in /dev export` +\n (exportName ? ` for export ${exportName}` : ''),\n );\n }\n\n const flowConfig = module.wireConfig(\n options.data ?? module.__configData ?? undefined,\n );\n applyOverrides(flowConfig, prepared.overrides);\n routeFlowLogs(flowConfig, options, knownSecrets);\n const unmockedStores = await applyStoreMockEnvs(\n flowConfig,\n prepared.flowSettings,\n module.__devExports,\n );\n if (unmockedStores.length > 0)\n logger.debug(\n `Stores without a mock env run as configured: ${unmockedStores.join(', ')}`,\n );\n\n // Only the simulated source starts: another source (the browser\n // source's page view, a CMP) would add events of its own.\n const wiredSources: unknown = flowConfig.sources;\n const wiredSource = isRecord(wiredSources)\n ? wiredSources[options.sourceId]\n : undefined;\n // A copy, so what this run writes to it (env, config) stays here.\n const source: Record<string, unknown> | undefined = isRecord(\n wiredSource,\n )\n ? {\n ...wiredSource,\n ...(isRecord(wiredSource.config)\n ? { config: { ...wiredSource.config } }\n : {}),\n }\n : undefined;\n flowConfig.sources = source ? { [options.sourceId]: source } : {};\n // No destination starts: the captured events stop at the collector.\n if (flowConfig.destinations) flowConfig.destinations = {};\n\n // The walker commands the source issues are its effects: recorded\n // from its own env, on this run's copy of the definition.\n const commandCalls: Simulation.Call[] = [];\n if (source && isSourceInit(source.code))\n source.code = recordSourceCommands(source.code, commandCalls);\n\n // A source whose package declares simulation calls runs on its mock\n // env (e.g. a queue client), and those calls are recorded like a\n // destination's. Other sources keep the simulated world (the JSDOM\n // page for web sources).\n let trackedCalls: Simulation.Call[] = [];\n const devEnv = getDevEnv(devModule, exportName);\n if (source && devEnv?.push && devEnv.simulation?.length) {\n const { wrappedEnv, calls } = wrapEnv({\n ...devEnv.push,\n simulation: devEnv.simulation,\n });\n source.env = {\n ...(isRecord(source.env) ? source.env : {}),\n ...wrappedEnv,\n };\n trackedCalls = calls;\n }\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<{\n event: WalkerOS.DeepPartialEvent;\n timestamp: number;\n }> = [];\n\n flowConfig.hooks = {\n ...((flowConfig.hooks as Record<string, unknown>) || {}),\n prePush: (\n { fn }: { fn: Function },\n event: WalkerOS.DeepPartialEvent,\n ) => {\n captured.push({ event, timestamp: Date.now() });\n return { ok: true }; // Stop propagation — don't call fn\n },\n };\n\n if (options.consent) flowConfig.consent = options.consent;\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 buildSimulationResult({\n step: 'source',\n name: options.sourceId,\n startTime,\n captured,\n // One timeline: the source's commands and its mock-env calls.\n usage: {\n [options.sourceId]: [...commandCalls, ...trackedCalls].sort(\n (a, b) => a.ts - b.ts,\n ),\n },\n });\n },\n (error) =>\n buildSimulationResult({\n step: 'source',\n name: options.sourceId,\n startTime,\n error,\n }),\n );\n } catch (error) {\n return buildSimulationResult({\n step: 'source',\n name: options.sourceId,\n startTime,\n error,\n });\n } finally {\n await prepared.cleanup();\n }\n}\n\n/**\n * Runs a transformer the way the runtime does: through the one chain runner\n * (`runTransformerChain`), starting at the transformer. Its `before` chain\n * (via `runTransformerBefore` inside the runner), its push and its route all\n * run, resolved hop by hop with `{ ingest, event }`. Returns every finished\n * copy; empty when the event was dropped or stopped.\n */\nexport async function runTransformerSimulation(\n collector: Collector.Instance,\n transformerId: string,\n event: WalkerOS.DeepPartialEvent,\n ingest: Ingest,\n): Promise<WalkerOS.DeepPartialEvent[]> {\n const result = await runTransformerChain(\n collector,\n collector.transformers,\n transformerId,\n event,\n ingest,\n undefined,\n `transformer.${transformerId}`,\n );\n return result.copies.map((copy) => copy.event);\n}\n\n/**\n * The ingest a simulated step starts from: the caller's keys, deep-cloned so\n * no nested object is shared between runs, under a fresh runtime `_meta`\n * (a caller-supplied `_meta` never wins).\n */\nfunction simulateIngest(\n stepName: string,\n ingest: Omit<Ingest, '_meta'> | undefined,\n): Ingest {\n return {\n ...(ingest ? structuredClone(ingest) : {}),\n _meta: createIngest(stepName)._meta,\n };\n}\n\nexport interface SimulateTransformerOptions extends SimulateDataOptions {\n /** Log to stderr so stdout carries only the result (`push --json`). */\n json?: boolean;\n transformerId: string;\n bundlePath?: string;\n flow?: string;\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n /**\n * Pipeline context the transformer reads via `ctx.ingest` (e.g. a decoder\n * reads `ingest.url`). Merged onto a fresh ingest so `_meta` is always\n * present; provide only the keys the step reads.\n */\n ingest?: Omit<Ingest, '_meta'>;\n /** The collector's starting consent, handed to `startFlow` as its state. */\n consent?: WalkerOS.Consent;\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 from the target transformer on, exactly as the runtime does\n * (`runTransformerSimulation`).\n *\n * Captured array: one entry per finished copy. When the event was dropped\n * or stopped, a single `null` entry.\n */\nexport async function simulateTransformer(\n configOrPath: string | Flow.Json,\n event: WalkerOS.DeepPartialEvent,\n options: SimulateTransformerOptions,\n): Promise<Simulation.Result> {\n const startTime = Date.now();\n\n // Validate event with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return buildSimulationResult({\n step: 'transformer',\n name: options.transformerId,\n startTime,\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 json: options.json,\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 json: options.json,\n };\n\n const prepared = await prepareFlow(prepareInput);\n // Values of the secrets the flow references: masked in every log line.\n const knownSecrets = collectKnownSecrets(config);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\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<Simulation.Result>(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n offline: true,\n },\n async (module) => {\n const flowConfig = module.wireConfig(\n options.data ?? module.__configData ?? undefined,\n );\n applyOverrides(flowConfig, prepared.overrides);\n routeFlowLogs(flowConfig, options, knownSecrets);\n const unmockedStores = await applyStoreMockEnvs(\n flowConfig,\n prepared.flowSettings,\n module.__devExports,\n );\n if (unmockedStores.length > 0)\n logger.debug(\n `Stores without a mock env run as configured: ${unmockedStores.join(', ')}`,\n );\n\n // Don't initialize sources or destinations during transformer simulation.\n if (flowConfig.sources) flowConfig.sources = {};\n if (flowConfig.destinations) flowConfig.destinations = {};\n if (options.consent) flowConfig.consent = options.consent;\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 = simulateIngest(options.transformerId, options.ingest);\n // Output events only: each entry is a transformer output, or `null`\n // when the event was dropped. `buildSimulationResult` drops null\n // entries so a drop yields `events: []` and a passthrough yields\n // `events: [<event>]`.\n const captured: Array<{\n event: WalkerOS.DeepPartialEvent | null;\n timestamp: number;\n }> = [];\n\n logger.info(`Simulating transformer: ${options.transformerId}`);\n\n // The runtime path: the one chain runner, starting at the\n // transformer (its before chain, its push, its route).\n const outputs = await runTransformerSimulation(\n collector,\n options.transformerId,\n inputEvent,\n ingest,\n );\n if (outputs.length === 0) {\n captured.push({ event: null, timestamp: Date.now() });\n }\n for (const output of outputs) {\n captured.push({ event: output, timestamp: Date.now() });\n }\n\n await collector.command('shutdown');\n\n return buildSimulationResult({\n step: 'transformer',\n name: options.transformerId,\n startTime,\n captured,\n });\n },\n (error) =>\n buildSimulationResult({\n step: 'transformer',\n name: options.transformerId,\n startTime,\n error,\n }),\n );\n } catch (error) {\n return buildSimulationResult({\n step: 'transformer',\n name: options.transformerId,\n startTime,\n error,\n });\n } finally {\n await prepared.cleanup();\n }\n}\n\n/**\n * Runs the collector step the way the runtime does: the runtime's own\n * enrichment (`enrichEvent`), then the collector's own chain\n * (`collector.next`) through `runCollectorNext`, the function\n * `pushToDestinations` calls. Returns every finished copy (one without a\n * fork, one per surviving fork); empty when the chain dropped the event.\n */\nexport async function runCollectorSimulation(\n collector: Collector.Instance,\n event: WalkerOS.DeepPartialEvent,\n ingest: Ingest = createIngest('collector'),\n): Promise<WalkerOS.Event[]> {\n const enriched = enrichEvent(collector, event);\n const result = await runCollectorNext(collector, enriched, { ingest });\n return result.copies.map((copy) => copy.event);\n}\n\nexport interface SimulateCollectorOptions extends SimulateDataOptions {\n /** Log to stderr so stdout carries only the result (`push --json`). */\n json?: boolean;\n collectorName: string;\n bundlePath?: string;\n flow?: string;\n /** `collector.next.TRANSFORMER=VALUE` mocks for the collector's chain. */\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n state?: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n timing?: number; // sets collector.timing, the base from which prepareEvent computes the relative event.timing\n };\n /**\n * Pipeline context the collector's chain (`collector.next`) reads via\n * `ctx.ingest`. Merged onto a fresh ingest so `_meta` is always the\n * runtime's.\n */\n ingest?: Omit<Ingest, '_meta'>;\n}\n\n/**\n * Self-contained collector simulation.\n *\n * Takes a post-next `DeepPartialEvent` and an optional collector-state\n * snapshot, then returns what the runtime hands to the destination fan-out:\n * the enriched event after the collector's own chain (`collector.next`), one\n * entry per finished copy, or a single `null` entry when the chain dropped\n * the event. Runs `runCollectorSimulation`; it does not reimplement the\n * enrichment or the chain.\n */\nexport async function simulateCollector(\n configOrPath: string | Flow.Json,\n event: WalkerOS.DeepPartialEvent,\n options: SimulateCollectorOptions,\n): Promise<Simulation.Result> {\n const startTime = Date.now();\n\n // Validate event with Zod\n const parsed = schemas.PartialEventSchema.safeParse(event);\n if (!parsed.success) {\n return buildSimulationResult({\n step: 'collector',\n name: options.collectorName,\n startTime,\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: ['collector.' + options.collectorName],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n }\n : {\n mode: 'build' as const,\n config,\n flow: options.flow,\n simulate: ['collector.' + options.collectorName],\n mock: options.mock,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n };\n\n const prepared = await prepareFlow(prepareInput);\n // Values of the secrets the flow references: masked in every log line.\n const knownSecrets = collectKnownSecrets(config);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\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<Simulation.Result>(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n offline: true,\n },\n async (module) => {\n const flowConfig = module.wireConfig(\n options.data ?? module.__configData ?? undefined,\n );\n applyOverrides(flowConfig, prepared.overrides);\n routeFlowLogs(flowConfig, options, knownSecrets);\n const unmockedStores = await applyStoreMockEnvs(\n flowConfig,\n prepared.flowSettings,\n module.__devExports,\n );\n if (unmockedStores.length > 0)\n logger.debug(\n `Stores without a mock env run as configured: ${unmockedStores.join(', ')}`,\n );\n\n // Don't initialize sources or destinations during collector 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\n // Seed collector state from the snapshot. These are plain mutable\n // instance props; pure enrichment needs no `run()`.\n if (options.state) {\n if (options.state.consent !== undefined)\n collector.consent = options.state.consent;\n if (options.state.user !== undefined)\n collector.user = options.state.user;\n if (options.state.globals !== undefined)\n collector.globals = options.state.globals;\n if (options.state.timing !== undefined)\n collector.timing = options.state.timing;\n }\n\n const outputs = await runCollectorSimulation(\n collector,\n event,\n simulateIngest('collector', options.ingest),\n );\n const captured: Array<{\n event: WalkerOS.DeepPartialEvent | null;\n timestamp: number;\n }> =\n outputs.length > 0\n ? outputs.map((output) => ({\n event: output,\n timestamp: Date.now(),\n }))\n : [{ event: null, timestamp: Date.now() }];\n\n await collector.command('shutdown');\n\n return buildSimulationResult({\n step: 'collector',\n name: options.collectorName,\n startTime,\n captured,\n });\n },\n (error) =>\n buildSimulationResult({\n step: 'collector',\n name: options.collectorName,\n startTime,\n error,\n }),\n );\n } catch (error) {\n return buildSimulationResult({\n step: 'collector',\n name: options.collectorName,\n startTime,\n error,\n });\n } finally {\n await prepared.cleanup();\n }\n}\n\nexport interface SimulateDestinationOptions extends SimulateDataOptions {\n /** Log to stderr so stdout carries only the result (`push --json`). */\n json?: boolean;\n destinationId: string;\n bundlePath?: string;\n flow?: string;\n mock?: string[];\n silent?: boolean;\n verbose?: boolean;\n snapshot?: string;\n /**\n * Pipeline context the destination's `before` chain and push read via\n * `ctx.ingest` (e.g. `userAgent` for a conversion API). Merged onto a\n * fresh ingest so `_meta` is always the runtime's.\n */\n ingest?: Omit<Ingest, '_meta'>;\n /**\n * The collector's starting consent: handed to `startFlow` as its initial\n * state, which applies it pre-run as a consent command that only the target\n * (the one registered destination) hears. A `require: [\"consent\"]`\n * destination starts, the consent gate sees it, and a Consent Mode target\n * records its consent update. The event's own consent still applies.\n */\n consent?: WalkerOS.Consent;\n /**\n * Run `collector.command(command, event)` instead of pushing the event: a\n * step example with `command` (e.g. `consent`), whose `in` is the command's\n * data. With `consent`, the starting state applies first, then the command.\n */\n command?: Flow.StepCommand;\n}\n\n/** A consent record: an object of booleans. */\nfunction isConsentRecord(value: unknown): value is WalkerOS.Consent {\n return (\n isRecord(value) &&\n Object.values(value).every((granted) => typeof granted === 'boolean')\n );\n}\n\n/** The `require` entries of a pending destination definition. */\nfunction pendingRequire(definition: unknown): string[] {\n if (!isRecord(definition) || !isRecord(definition.config)) return [];\n const { require } = definition.config;\n return isStringArray(require) ? require : [];\n}\n\n/**\n * Self-contained destination simulation.\n *\n * Takes a DeepPartialEvent, validates it with Zod, loads the flow config,\n * bundles it, then starts the flow with ONLY the target destination (no\n * other destination initializes against its real env) and `consent` as the\n * collector's starting state. It pushes the event through the full pipeline\n * (consent checks, event mapping, createEvent enrichment, before chains), or\n * runs `command` with the event as its data. When nothing was sent, the\n * result's `skipped` says why, from the collector's own records.\n */\nexport async function simulateDestination(\n configOrPath: string | Flow.Json,\n event: WalkerOS.DeepPartialEvent | Record<string, unknown>,\n options: SimulateDestinationOptions,\n): Promise<Simulation.Result> {\n const startTime = Date.now();\n\n // Validate event with Zod. A command's data is not an event.\n const parsed = options.command\n ? undefined\n : schemas.PartialEventSchema.safeParse(event);\n if (parsed && !parsed.success) {\n return buildSimulationResult({\n step: 'destination',\n name: options.destinationId,\n startTime,\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 json: options.json,\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 json: options.json,\n };\n\n const prepared = await prepareFlow(prepareInput);\n // Values of the secrets the flow references: masked in every log line.\n const knownSecrets = collectKnownSecrets(config);\n\n try {\n const logger = createCLILogger({\n silent: options.silent,\n verbose: options.verbose,\n stderr: options.json,\n knownSecrets,\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<Simulation.Result>(\n {\n esmPath: prepared.bundlePath,\n platform: prepared.platform,\n logger,\n snapshotCode,\n networkCalls,\n offline: true,\n },\n async (module) => {\n const flowConfig = module.wireConfig(\n options.data ?? module.__configData ?? undefined,\n );\n\n // Only the target starts: no source, and no other destination, whose\n // init would run against its real env (a vendor script, an SDK\n // client). A missing target fails here, naming the flow's\n // destinations. The target's config is a copy, so what this run\n // writes to it (env, require, overrides) stays in this run.\n const wiredDestinations: unknown = flowConfig.destinations;\n const wiredTarget = isRecord(wiredDestinations)\n ? wiredDestinations[options.destinationId]\n : undefined;\n if (!isRecord(wiredTarget)) {\n const available = isRecord(wiredDestinations)\n ? Object.keys(wiredDestinations).join(', ')\n : '';\n throw new Error(\n `Destination \"${options.destinationId}\" not found in collector. ` +\n `Available: ${available || 'none'}`,\n );\n }\n const target: Record<string, unknown> = {\n ...wiredTarget,\n config: isRecord(wiredTarget.config) ? { ...wiredTarget.config } : {},\n };\n flowConfig.destinations = { [options.destinationId]: target };\n if (flowConfig.sources) flowConfig.sources = {};\n // The starting consent is initial collector state: startFlow applies\n // it pre-run as a consent command, heard only by the target.\n if (options.consent) flowConfig.consent = options.consent;\n\n applyOverrides(flowConfig, prepared.overrides);\n routeFlowLogs(flowConfig, options, knownSecrets);\n const unmockedStores = await applyStoreMockEnvs(\n flowConfig,\n prepared.flowSettings,\n module.__devExports,\n );\n if (unmockedStores.length > 0)\n logger.debug(\n `Stores without a mock env run as configured: ${unmockedStores.join(', ')}`,\n );\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 // Await the lazy __devExports thunk, then narrow without a cast.\n const loadDev = module.__devExports?.[destPkg.package];\n const devModule =\n typeof loadDev === 'function' ? await loadDev() : undefined;\n const { exportName } = resolveExportName(\n prepared.flowSettings,\n 'destination',\n options.destinationId,\n );\n const legacyRefusal = legacyExportRefusal(\n devModule,\n module.__packageExports,\n destPkg.package,\n exportName,\n );\n if (legacyRefusal) throw new Error(legacyRefusal);\n const devEnv = getDevEnv(devModule, exportName);\n\n // Without a mock env the destination would run against its real\n // vendor client. Refuse before startFlow so init never runs.\n if (!devEnv?.push) {\n throw new Error(\n `No mock env for ${destPkg.package} export ${exportName ?? 'default'}: simulate would call the real vendor. Add examples.env.push to the package's dev examples.`,\n );\n }\n\n const destConfig = target.config;\n if (isRecord(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 (isRecord(destConfig)) destConfig.env = wrappedEnv;\n trackedCalls = calls;\n }\n }\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 // Capture the matched mapping rule key from the runtime's own\n // FlowState emissions: the destination push site emits per-event\n // records carrying the mappingKey that processEventMapping computed.\n // Observing the wired execution keeps a single rule-matching\n // authority and automatically reflects injected data payloads.\n let mappingKey: string | undefined;\n const targetStepId = stepId('destination', options.destinationId);\n // The in, out, and error phases can all carry the key, so capture on\n // presence rather than pinning a phase: a throwing destination still\n // reports which rule matched.\n // A failed init or push of the target is recorded as its error\n // phase; the result carries it so the simulation reports failure.\n let stepError: string | undefined;\n // The consent gate's own record of a skipped event: what the\n // destination requires and the collector consent at that hop.\n let consentSkip:\n | { required?: WalkerOS.Consent; consent?: WalkerOS.Consent }\n | undefined;\n let delivered = false;\n const captureMappingKey = (state: FlowState): void => {\n if (state.stepId !== targetStepId) return;\n if (state.mappingKey) mappingKey = state.mappingKey;\n if (state.phase === 'error' && state.error && stepError === undefined)\n stepError = state.error.message;\n if (state.phase === 'out') delivered = true;\n if (state.phase === 'skip' && state.skipReason === 'consent') {\n const required = state.meta?.required;\n consentSkip = {\n ...(isConsentRecord(required) ? { required } : {}),\n ...(state.consent ? { consent: state.consent } : {}),\n };\n }\n };\n // Guarded: a prebuilt bundle may carry a collector without an\n // observer channel; degrade to an undefined key instead of throwing.\n if (collector.observers instanceof Set) {\n collector.observers.add(captureMappingKey);\n }\n\n if (options.command) {\n // A command example: its calls (e.g. gtag consent update) are the\n // output, recorded as they happen.\n await collector.command(options.command, event);\n } else {\n // Full pipeline: consent, mapping, enrichment, before chains.\n await collector.push(event, {\n include: [options.destinationId],\n ingest: simulateIngest(options.destinationId, options.ingest),\n });\n }\n\n // Why nothing was sent: still waiting for its require, or skipped\n // at the consent gate (queued with `queue: true`).\n const pending = collector.pending.destinations[options.destinationId];\n let skipped: Simulation.Skipped | undefined;\n if (pending) {\n skipped = { reason: 'pending', require: pendingRequire(pending) };\n } else if (consentSkip && !delivered) {\n const eventConsent =\n 'consent' in event && isConsentRecord(event.consent)\n ? event.consent\n : {};\n skipped = {\n reason: 'consent',\n ...(consentSkip.required ? { required: consentSkip.required } : {}),\n granted: { ...consentSkip.consent, ...eventConsent },\n };\n }\n\n await collector.command('shutdown');\n\n return buildSimulationResult({\n step: 'destination',\n name: options.destinationId,\n startTime,\n usage: trackedCalls.length\n ? { [options.destinationId]: trackedCalls }\n : undefined,\n mappingKey,\n skipped,\n ...(stepError !== undefined ? { error: stepError } : {}),\n });\n },\n (error) =>\n buildSimulationResult({\n step: 'destination',\n name: options.destinationId,\n startTime,\n error,\n }),\n );\n } catch (error) {\n return buildSimulationResult({\n step: 'destination',\n name: options.destinationId,\n startTime,\n error,\n });\n } finally {\n await prepared.cleanup();\n }\n}\n\n// Export types\nexport type { PushCommandOptions, PushResult };\n","/**\n * The shared secret redactor lives in `@walkeros/core/node` so the CLI logger,\n * the runtime logger and the runtime heartbeat share one set of patterns.\n */\nexport { scrubJson, scrubSecrets, redactLine } from '@walkeros/core/node';\n","/**\n * The simulate output formatter lives in `@walkeros/core/node` so the CLI\n * `push` output and the MCP `flow_simulate` result print values the same way.\n */\nexport { toPrintable } from '@walkeros/core/node';\n","import type { Flow } from '@walkeros/core';\nimport { parseComponentRef } from '../../core/parse-component-ref.js';\n\nconst STEP_KINDS = [\n 'source',\n 'destination',\n 'transformer',\n 'collector',\n] 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 * - `--mock destination.NAME.before.T=VALUE` mocks transformer T on that chain\n * - `--mock collector.next.T=VALUE` mocks transformer T in `collector.next`\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 === 'collector') {\n // Collector enrichment carries no per-step overrides.\n continue;\n } else 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 === 'collector' && !parsed.chainType) {\n throw new Error(\n `Use --mock collector.next.TRANSFORMER=VALUE to mock a step of the collector's chain`,\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, or\n // collector.next.bot for the collector's own chain.\n const chainPath =\n parsed.type === 'collector'\n ? `collector.${parsed.chainType}`\n : `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' | 'collector';\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 * and the collector's chain: `collector.next.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 // The collector's own chain: collector.next.bot\n if (prefix === 'collector' && rest.length > 0) {\n if (name !== 'next' || rest.length !== 1 || !rest[0]) {\n throw new Error(\n `Invalid step format: \"${step}\". Expected \"collector.next.TRANSFORMER\"`,\n );\n }\n return {\n type: prefix,\n name,\n chainType: 'next',\n transformerId: rest[0],\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 {\n JSDOM,\n VirtualConsole,\n requestInterceptor,\n type ResourcesOptions,\n} 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 and XHR are stubbed, recording 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 /** Web only: the URL of the simulated page. Defaults to `http://localhost`. */\n pageUrl?: string;\n /**\n * Web only, for simulate runs: the page answers every resource request (a\n * vendor loader's `<script src>`, an iframe, a stylesheet) locally instead\n * of fetching it. A real push loads resources as a browser would.\n */\n offline?: boolean;\n}\n\n/**\n * JSDOM window members a web step reaches as bare globals (a CMP trigger's\n * `new CustomEvent`, a session source's `localStorage`, an `instanceof\n * Element` check). Exposed for the run, so events are created in the page's\n * own realm and its nodes pass type checks as in a browser, and restored after.\n * Vendor SDKs read some at import, before any step runs: mixpanel-browser\n * probes `new XMLHttpRequest()`, posthog-js reads `location` and adopts\n * `self`. `XMLHttpRequest` is the recording one of `applyNetworkPolyfills`.\n */\nconst DOM_GLOBALS = [\n 'CustomEvent',\n 'Event',\n 'localStorage',\n 'sessionStorage',\n 'Node',\n 'Element',\n 'HTMLElement',\n 'Document',\n 'ShadowRoot',\n 'XMLHttpRequest',\n 'location',\n 'self',\n] as const;\n\n/**\n * Defines each DOM global from the JSDOM window and returns a restore that\n * puts every previous property descriptor back (deleting the ones that were\n * absent). Descriptors, not values: reading Node's own `localStorage` getter\n * would run it.\n */\nexport function exposeDomGlobals(domWindow: object): () => void {\n const saved = DOM_GLOBALS.map(\n (name) =>\n [name, Object.getOwnPropertyDescriptor(globalThis, name)] as const,\n );\n // Read every value before defining any: a getter that throws (JSDOM's\n // storage on an opaque origin) leaves the globals untouched.\n const values = DOM_GLOBALS.map(\n (name) => [name, Reflect.get(domWindow, name)] as const,\n );\n for (const [name, value] of values) {\n Object.defineProperty(globalThis, name, {\n value,\n configurable: true,\n writable: true,\n });\n }\n return () => {\n for (const [name, descriptor] of saved) {\n if (descriptor) Object.defineProperty(globalThis, name, descriptor);\n else Reflect.deleteProperty(globalThis, name);\n }\n };\n}\n\n/**\n * Loosely typed module shape from a dynamically imported ESM bundle.\n * The bundle has no compile-time types, so we use permissive signatures\n * and let the callbacks do runtime validation (e.g., \"collector missing push\").\n */\nexport interface FlowModule {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wireConfig: (data?: unknown) => any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n startFlow: (config: unknown) => Promise<any>;\n __configData?: unknown;\n /**\n * Registry of lazy /dev loaders, one per package that exposes a `./dev`\n * export. Each entry is a thunk that dynamically imports the dev module on\n * demand, so the deploy wrap can DCE the unreferenced /dev graph to zero\n * bytes. Read sites must call and await the thunk, then narrow the result.\n */\n __devExports?: Record<string, () => Promise<unknown>>;\n /**\n * Export names each package declares in `walkerOS.exports`, read at build\n * time from the copy that was bundled. Absent in bundles built before it.\n */\n __packageExports?: Record<string, string[]>;\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 */\n/**\n * Default error mapper used by real-push call sites: produces a `PushResult`\n * error envelope. Simulate call sites override this with a mapper that returns\n * a `Simulation.Result` instead.\n */\nfunction defaultPushError(error: unknown, startTime: number): PushResult {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n}\n\n// Real-push call sites: default `PushResult`, no error mapper needed.\nexport function withFlowContext(\n options: FlowContextOptions,\n fn: (module: FlowModule) => Promise<PushResult>,\n): Promise<PushResult>;\n// Simulate call sites: arbitrary result type with an explicit error mapper.\nexport function withFlowContext<T>(\n options: FlowContextOptions,\n fn: (module: FlowModule) => Promise<T>,\n onError: (error: unknown, startTime: number) => T,\n): Promise<T>;\nexport async function withFlowContext<T>(\n options: FlowContextOptions,\n fn: (module: FlowModule) => Promise<T | PushResult>,\n onError?: (error: unknown, startTime: number) => T,\n): Promise<T | PushResult> {\n const {\n esmPath,\n platform,\n logger,\n snapshotCode,\n timeout,\n networkCalls,\n asyncDrain,\n drainPump,\n pageUrl,\n offline,\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 let restoreDomGlobals: (() => void) | 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: pageUrl ?? 'http://localhost',\n runScripts: 'dangerously',\n resources: offline ? offlineResources() : '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 // Inside the try, so a failure here still restores window, document\n // and navigator in the finally.\n if (dom) restoreDomGlobals = exposeDomGlobals(dom.window);\n\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 //\n // A node skeleton keeps `@walkeros/*` step packages as EXTERNAL bare\n // imports. Node resolves those bare specifiers by walking `node_modules`\n // up from the IMPORTING FILE's directory (`esmPath`), not from cwd, and\n // the `?t=` cache-buster does not affect resolution. So externals load\n // from a `node_modules/` co-located next to `esmPath`. Callers that point\n // `esmPath` at a prebuilt skeleton MUST place the traced sibling\n // `node_modules/` in the same directory.\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 __packageExports: module.__packageExports,\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: T | 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 (onError ?? defaultPushError)(error, startTime);\n } finally {\n if (timerControl) timerControl.restore();\n if (savedFetch !== undefined) {\n cleanupNetworkPolyfills(savedFetch);\n }\n if (restoreDomGlobals) restoreDomGlobals();\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, sendBeacon and XMLHttpRequest polyfills on the JSDOM\n * window. All 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 // JSDOM's own XMLHttpRequest sends for real, a synchronous one from a\n // worker process. Like fetch and sendBeacon above, the stand-in records\n // instead, on a real web push too: the page's requests are reported, never\n // sent. The stand-in is not the full interface, so it is defined rather\n // than assigned.\n Object.defineProperty(dom.window, 'XMLHttpRequest', {\n value: createRecordingXhr(dom, networkCalls),\n configurable: true,\n writable: true,\n });\n}\n\ntype XhrHandler = ((event: Event) => void) | null;\n\n/**\n * An XMLHttpRequest whose `send` records the call and completes it with an\n * empty 200, like the fetch polyfill. It never opens a connection. `abort`\n * after `send` ends the request with abort instead, as the spec's does.\n */\nfunction createRecordingXhr(dom: JSDOM, networkCalls: NetworkCall[]) {\n const PageEvent = dom.window.Event;\n return class XMLHttpRequest extends dom.window.EventTarget {\n static readonly UNSENT = 0;\n static readonly OPENED = 1;\n static readonly HEADERS_RECEIVED = 2;\n static readonly LOADING = 3;\n static readonly DONE = 4;\n readonly UNSENT = 0;\n readonly OPENED = 1;\n readonly HEADERS_RECEIVED = 2;\n readonly LOADING = 3;\n readonly DONE = 4;\n readyState = 0;\n status = 0;\n statusText = '';\n responseType = '';\n response = '';\n responseText = '';\n responseURL = '';\n timeout = 0;\n withCredentials = false;\n onreadystatechange: XhrHandler = null;\n onload: XhrHandler = null;\n onabort: XhrHandler = null;\n onloadend: XhrHandler = null;\n #method = 'GET';\n #url = '';\n #async = true;\n #headers: Record<string, string> = {};\n #pending = false;\n\n open(method: string, url: string | URL, async = true): void {\n this.#method = method.toUpperCase();\n this.#url = String(url);\n this.#async = async;\n this.#headers = {};\n this.#pending = false;\n this.readyState = 1;\n }\n\n setRequestHeader(name: string, value: string): void {\n this.#headers[name] = value;\n }\n\n getResponseHeader(): string | null {\n return null;\n }\n\n getAllResponseHeaders(): string {\n return '';\n }\n\n overrideMimeType(): void {}\n\n abort(): void {\n const pending = this.#pending;\n this.#pending = false;\n if (!pending && this.readyState !== 4) return;\n // Ends as a network error, then back to UNSENT: with events only while\n // the request is pending, silently once it is done.\n this.status = 0;\n this.statusText = '';\n if (pending) this.#finish('abort', this.onabort);\n this.readyState = 0;\n }\n\n send(body?: unknown): void {\n networkCalls.push({\n type: 'xhr',\n url: this.#url,\n method: this.#method,\n body: body !== undefined && body !== null ? String(body) : null,\n headers: { ...this.#headers },\n timestamp: Date.now(),\n });\n this.#pending = true;\n if (this.#async) queueMicrotask(() => this.#complete());\n else this.#complete();\n }\n\n #complete(): void {\n if (!this.#pending) return;\n this.#pending = false;\n this.status = 200;\n this.statusText = 'OK';\n this.responseURL = this.#url;\n this.#finish('load', this.onload);\n }\n\n #finish(outcome: 'load' | 'abort', onOutcome: XhrHandler): void {\n this.readyState = 4;\n const handlers: Array<[string, XhrHandler]> = [\n ['readystatechange', this.onreadystatechange],\n [outcome, onOutcome],\n ['loadend', this.onloadend],\n ];\n for (const [type, handler] of handlers) {\n const event = new PageEvent(type);\n this.dispatchEvent(event);\n handler?.call(this, event);\n }\n }\n };\n}\n\n/**\n * Resource loading of a simulated page: every request (a vendor loader's\n * script, an iframe, a stylesheet) is answered with an empty 200 before any\n * dispatcher runs, so none leaves the process.\n */\nfunction offlineResources(): ResourcesOptions {\n return {\n interceptors: [requestInterceptor(() => new Response('', { status: 200 }))],\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 type { Simulation, WalkerOS } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/utils.js';\n\n/**\n * Captured event entry produced by the simulate functions. The event may be\n * `null`/`undefined` when a transformer drops the event; those entries are\n * filtered out of the final `events` array.\n */\ninterface CapturedEntry {\n event: WalkerOS.DeepPartialEvent | null | undefined;\n timestamp: number;\n}\n\n/** Tracked env call recorded during destination simulation. */\ninterface TrackedCall {\n fn: string;\n args: unknown[];\n ts: number;\n}\n\nexport interface BuildSimulationResultArgs {\n step: Simulation.Result['step'];\n name: string;\n startTime: number;\n captured?: CapturedEntry[];\n usage?: Record<string, TrackedCall[]>;\n /** Entity-action key of the matched mapping rule (destination simulations). */\n mappingKey?: string;\n /** Why a destination sent nothing (destination simulations). */\n skipped?: Simulation.Skipped;\n error?: unknown;\n}\n\n/** Type guard that narrows a captured entry to a non-null event. */\nfunction hasEvent(\n entry: CapturedEntry,\n): entry is { event: WalkerOS.DeepPartialEvent; timestamp: number } {\n return entry.event != null;\n}\n\n/** Normalize an unknown error into an `Error` instance. */\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(getErrorMessage(error));\n}\n\n/**\n * Assemble a core `Simulation.Result` from the raw outputs of the CLI simulate\n * functions. Pure: maps captured entries to output events (dropping dropped\n * events), flattens per-destination tracked calls into a single `calls` array,\n * and computes the elapsed duration.\n */\nexport function buildSimulationResult(\n args: BuildSimulationResultArgs,\n): Simulation.Result {\n const { step, name, startTime, captured, usage, mappingKey, skipped, error } =\n args;\n\n const events: WalkerOS.DeepPartialEvent[] = (captured ?? [])\n .filter(hasEvent)\n .map((entry) => entry.event);\n\n const calls: Simulation.Call[] = usage\n ? Object.values(usage)\n .flat()\n .map((call) => ({ fn: call.fn, args: call.args, ts: call.ts }))\n : [];\n\n return {\n step,\n name,\n events,\n calls,\n duration: Date.now() - startTime,\n ...(mappingKey !== undefined ? { mappingKey } : {}),\n ...(skipped !== undefined ? { skipped } : {}),\n ...(error !== undefined ? { error: toError(error) } : {}),\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 { collectKnownSecrets } from '../../core/known-secrets.js';\nimport { tmpRunDir } from '../../core/tmp-names.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 /** Log to stderr so stdout carries only the result. */\n json?: 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 /** Log to stderr so stdout carries only the result. */\n json?: 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 stderr: input.json,\n knownSecrets: collectKnownSecrets(input.config),\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 = await tmpRunDir('push');\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 { REF_SECRET } from '@walkeros/core';\nimport type { Flow } from '@walkeros/core';\n\n/**\n * The values of every `$secret.NAME` the flow references, read from `env`.\n * Names that are unset or empty there are ignored. Hand the result to\n * `scrubSecrets(line, { known })` or the logger's `knownSecrets` so a secret\n * value is masked whatever its shape.\n */\nexport function collectKnownSecrets(\n flow: Flow.Json,\n env: NodeJS.ProcessEnv = process.env,\n): string[] {\n const names = new Set<string>();\n collectSecretNames(flow, names);\n const values = new Set<string>();\n for (const name of names) {\n const value = env[name];\n if (value) values.add(value);\n }\n return [...values];\n}\n\nfunction collectSecretNames(value: unknown, names: Set<string>): void {\n if (typeof value === 'string') {\n const match = value.match(REF_SECRET);\n if (match) names.add(match[1]);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) collectSecretNames(item, names);\n return;\n }\n if (value && typeof value === 'object') {\n for (const item of Object.values(value)) collectSecretNames(item, names);\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 | {\n kind: 'source' | 'destination' | 'transformer' | 'collector';\n ids: string[];\n };\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 (\n (type === 'source' || type === 'transformer' || type === 'collector') &&\n ids.length > 1\n ) {\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 kind: 'none' | 'source' | 'destination' | 'transformer' | 'collector';\n ids: string[];\n}\n\n/**\n * Adapter between `planSimulate` and the dispatcher in `index.ts`.\n * Carries forward `planSimulate`'s `kind` discriminator unchanged, kept\n * 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 { kind: plan.kind, ids: plan.ids };\n}\n","import {\n PAGE_URL_SCOPE_ERROR,\n isFlowJson,\n push,\n simulateCollector,\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, loadJsonConfig } from '../../config/index.js';\nimport { collectKnownSecrets } from '../../core/known-secrets.js';\nimport { isObject } from '@walkeros/core';\nimport type { Flow, Ingest, Simulation, WalkerOS } from '@walkeros/core';\nimport type { PushCommandOptions, PushResult } from './types.js';\n\n/**\n * Adapt a step `Simulation.Result` into the CLI's `PushResult` envelope. The\n * `walkeros push --simulate` command path formats and exits on a `PushResult`;\n * the programmatic simulate functions return the unified `Simulation.Result`.\n * This boundary keeps the command behavior identical while the functions\n * expose the richer shape to library consumers.\n */\nfunction simulationToPushResult(result: Simulation.Result): PushResult {\n return {\n success: !result.error,\n duration: result.duration,\n ...(result.error ? { error: result.error.message } : {}),\n simulations: [result],\n };\n}\n\nconst INGEST_SCOPE_ERROR =\n '--ingest applies to transformer, collector and destination simulation only';\n\nconst CONSENT_SCOPE_ERROR =\n \"--consent sets the collector's starting consent for a simulation; a real push uses the flow's own consent.\";\n\nconst CONSENT_SHAPE_ERROR = '--consent must be a JSON object of booleans';\n\nconst COMMAND_SCOPE_ERROR = '--command applies to destination simulation only.';\n\nfunction isConsent(value: unknown): value is WalkerOS.Consent {\n return (\n isObject(value) &&\n Object.values(value).every((granted) => typeof granted === 'boolean')\n );\n}\n\n/**\n * Resolve the collector's starting consent: the raw `--consent` source (JSON\n * string, file path or URL) wins over a programmatic `consent`.\n */\nasync function resolveConsent(\n options: PushCommandOptions,\n): Promise<WalkerOS.Consent | undefined> {\n if (options.consentSource === undefined) return options.consent;\n const loaded: unknown = await loadJsonFromSource(options.consentSource, {\n name: 'consent',\n });\n if (!isConsent(loaded)) throw new Error(CONSENT_SHAPE_ERROR);\n return loaded;\n}\n\n/**\n * The config a run reads, loaded ONCE: a flow config is handed on as the\n * object (simulate) or as `raw` (real push), so a URL is fetched once and the\n * secrets masked are those of the flow that runs. Anything else (a prebuilt\n * bundle, an unreadable path) keeps the path for the step to read and\n * report.\n */\nasync function loadFlowJson(config: string): Promise<Flow.Json | undefined> {\n try {\n const loaded: unknown = await loadJsonConfig(config);\n return isFlowJson(loaded) ? loaded : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve the pipeline context a simulated step reads: the raw `--ingest`\n * source (JSON string, file path or URL) wins over a programmatic `ingest`.\n */\nasync function resolveIngest(\n options: PushCommandOptions,\n): Promise<Omit<Ingest, '_meta'> | undefined> {\n if (options.ingestSource === undefined) return options.ingest;\n const loaded: unknown = await loadJsonFromSource(options.ingestSource, {\n name: 'ingest',\n });\n if (!isObject(loaded)) throw new Error('--ingest must be a JSON object');\n return loaded;\n}\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 return (await runPushCommandWithSecrets(options)).result;\n}\n\n/**\n * `runPushCommand`, plus the values of the secrets the flow config references\n * (see `collectKnownSecrets`), so `pushCommand` can mask them in its output.\n */\nexport async function runPushCommandWithSecrets(\n options: PushCommandOptions,\n): Promise<{ result: PushResult; knownSecrets: string[] }> {\n const loaded: { knownSecrets: string[] } = { knownSecrets: [] };\n const result = await runPush(options, loaded);\n return { result, knownSecrets: loaded.knownSecrets };\n}\n\nasync function runPush(\n options: PushCommandOptions,\n loaded: { knownSecrets: string[] },\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 configPath: string;\n if (isStdinPiped() && !options.config) {\n configPath = await readStdinToTempFile('push');\n } else {\n configPath = options.config || 'bundle.config.json';\n }\n const flowJson = await loadFlowJson(configPath);\n const config: string | Flow.Json = flowJson ?? configPath;\n const knownSecrets = flowJson ? collectKnownSecrets(flowJson) : [];\n loaded.knownSecrets = knownSecrets;\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. Resolve --ingest. Only a simulated transformer, collector or\n // destination has a pipeline context to seed.\n const ingest = await resolveIngest(options);\n if (ingest && (plan.kind === 'none' || plan.kind === 'source'))\n throw new Error(INGEST_SCOPE_ERROR);\n\n // 5. Scope checks of the other simulate flags, then --consent: the\n // collector's starting state of a simulation (for a source, the state its\n // trigger's flow starts from). A real push runs the flow's own consent.\n if (options.command !== undefined && plan.kind !== 'destination')\n throw new Error(COMMAND_SCOPE_ERROR);\n if (options.pageUrl !== undefined && plan.kind !== 'source')\n throw new Error(PAGE_URL_SCOPE_ERROR);\n const consent = await resolveConsent(options);\n if (consent && plan.kind === 'none') throw new Error(CONSENT_SCOPE_ERROR);\n\n // 6. Route to the correct typed function based on the plan.\n let result: PushResult;\n switch (plan.kind) {\n case 'none':\n result = await push(configPath, resolvedEvent, {\n raw: flowJson,\n knownSecrets,\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 = simulationToPushResult(\n await simulateSource(config, resolvedEvent, {\n sourceId: plan.ids[0],\n flow: options.flow,\n pageUrl: options.pageUrl,\n consent,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n snapshot: options.snapshot,\n }),\n );\n break;\n\n case 'transformer':\n result = simulationToPushResult(\n await simulateTransformer(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n transformerId: plan.ids[0],\n flow: options.flow,\n mock: options.mock,\n ingest,\n consent,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n snapshot: options.snapshot,\n },\n ),\n );\n break;\n\n case 'collector':\n result = simulationToPushResult(\n await simulateCollector(\n config,\n resolvedEvent as WalkerOS.DeepPartialEvent,\n {\n collectorName: plan.ids[0],\n flow: options.flow,\n mock: options.mock,\n ingest,\n state: consent ? { consent } : undefined,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n snapshot: options.snapshot,\n },\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 ingest,\n consent,\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` that keeps every per-destination result. Stops on the\n * first failure and returns a structured error referencing the failed id.\n */\nasync function runDestinationSimulationLoop(\n config: string | Flow.Json,\n event: WalkerOS.DeepPartialEvent,\n destinationIds: string[],\n options: PushCommandOptions,\n ingest: Omit<Ingest, '_meta'> | undefined,\n consent: WalkerOS.Consent | undefined,\n): Promise<PushResult> {\n const startTime = Date.now();\n const simulations: Simulation.Result[] = [];\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 ingest,\n consent,\n command: options.command,\n silent: options.silent,\n verbose: options.verbose,\n json: options.json,\n snapshot: options.snapshot,\n });\n simulations.push(r);\n if (r.error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: `simulate destination.${destinationId}: ${r.error.message}`,\n simulations,\n };\n }\n }\n\n return {\n success: true,\n duration: Date.now() - startTime,\n simulations,\n };\n}\n","function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\n/**\n * Selects the dev examples of one export from a package's awaited `/dev`\n * module.\n *\n * A package with several exports (`walkerOS.exports` in its package.json)\n * ships `exportExamples`, a map from export name to that export's examples,\n * the default export included. A package with one export ships only\n * `examples`.\n *\n * - Map present, export named: `exportExamples[exportName]`. A name missing\n * from the map resolves to `undefined`, never to another export's examples.\n * - Map present, no export name (the step uses the default export):\n * `examples`, which by convention holds the default export's examples.\n * - No map: `examples`.\n *\n * `exportName` comes from `resolveExportName` (step `import`, else\n * `bundle.packages[pkg].imports[0]`, else default).\n */\nexport function selectDevExamples(\n devModule: unknown,\n exportName: string | undefined,\n): Record<string, unknown> | undefined {\n if (!isRecord(devModule)) return undefined;\n\n const map = devModule.exportExamples;\n if (isRecord(map) && exportName !== undefined) {\n const selected = map[exportName];\n return isRecord(selected) ? selected : undefined;\n }\n\n const examples = devModule.examples;\n return isRecord(examples) ? examples : undefined;\n}\n\n/**\n * A package version from before export-keyed examples ships only\n * `examples` (the default export's), even when it declares several\n * exports. For a step naming an export, those examples may belong to\n * another export, so simulate must refuse instead of running that export's\n * mock (or none) against the real vendor. Returns the refusal message, or\n * `undefined` when the examples can be trusted.\n *\n * `packageExports` is the bundle's `__packageExports` (declared exports per\n * package, read at build time from the bundled copy). A bundle without it\n * (built before it existed) cannot tell single- from multi-export packages,\n * so a step naming an export without a map is refused.\n */\nexport function legacyExportRefusal(\n devModule: unknown,\n packageExports: Record<string, string[]> | undefined,\n packageName: string,\n exportName: string | undefined,\n): string | undefined {\n if (exportName === undefined) return undefined;\n if (isRecord(devModule) && isRecord(devModule.exportExamples))\n return undefined;\n if (packageExports) {\n const declared = packageExports[packageName];\n if (!declared || declared.length <= 1) return undefined;\n }\n return `No mock env for ${packageName} export ${exportName}: this package version predates export-keyed examples; use a version with exportExamples or a local path.`;\n}\n","/**\n * Shared resolver for the export name to import from a flow component's\n * package.\n *\n * Both `walkeros bundle` and `walkeros setup` need to know which named export\n * (or default) to pull off a package referenced by a flow component. The\n * precedence chain is:\n *\n * 1. `flow.<kind>.<id>.import` if set (named export selector at the step).\n * 2. `flow.config.bundle.packages[<package>].imports[0]` if set.\n * 3. Otherwise undefined; the caller falls back to the package's `default`\n * export.\n *\n * This lives in `cli/src/core/` so both `commands/bundle/*` and\n * `commands/setup/*` import the same function. Duplicating the chain is how\n * setup ended up out of sync with bundle (Bug F: `setup destination.pubsub`\n * routed through BigQuery's setup because it ignored the `code` field and\n * always grabbed `mod.default`).\n */\n\nimport type { Flow, StepType } from '@walkeros/core';\n\nexport type ComponentKind = StepType;\n\nexport type ResolveSource = 'import' | 'imports' | 'default';\n\nexport interface ResolvedExportName {\n /**\n * The named export to pull off the imported module, or `undefined` to\n * indicate the caller should use the package's `default` export.\n */\n exportName: string | undefined;\n /** Which precedence step produced the result (useful for diagnostics). */\n source: ResolveSource;\n}\n\ninterface FlowStepView {\n package?: string;\n import?: string;\n}\n\nfunction getStep(\n flow: Flow,\n kind: ComponentKind,\n id: string,\n): FlowStepView | undefined {\n switch (kind) {\n case 'source':\n return flow.sources?.[id];\n case 'transformer':\n return flow.transformers?.[id];\n case 'destination':\n return flow.destinations?.[id];\n case 'store':\n return flow.stores?.[id];\n }\n}\n\nfunction getBundlePackages(\n flow: Flow,\n): Record<string, Flow.BundlePackage> | undefined {\n return flow.config?.bundle?.packages;\n}\n\n/**\n * Read the first entry of `bundle.packages[<package>].imports` if it is a\n * non-empty string. Returns `undefined` otherwise.\n */\nfunction readFirstImport(\n packages: Record<string, Flow.BundlePackage> | undefined,\n packageName: string | undefined,\n): string | undefined {\n if (!packages || !packageName) return undefined;\n const pkg = packages[packageName];\n if (!pkg || !pkg.imports || pkg.imports.length === 0) return undefined;\n const first = pkg.imports[0];\n return typeof first === 'string' && first.length > 0 ? first : undefined;\n}\n\n/**\n * Resolve the export name to import for a flow component's package.\n *\n * See module docs for the precedence chain. Inline code (`code` is an object)\n * doesn't enter this resolver at all — setup rejects inline code at a higher\n * layer.\n */\nexport function resolveExportName(\n flow: Flow,\n kind: ComponentKind,\n id: string,\n): ResolvedExportName {\n const step = getStep(flow, kind, id);\n if (!step) return { exportName: undefined, source: 'default' };\n\n const packageName = step.package;\n const importName = step.import;\n\n // 1. Explicit `import` field on the step wins.\n if (typeof importName === 'string' && importName.length > 0) {\n return { exportName: importName, source: 'import' };\n }\n\n // 2. Fallback to bundle.packages[pkg].imports[0].\n const firstImport = readFirstImport(getBundlePackages(flow), packageName);\n if (firstImport) {\n return { exportName: firstImport, source: 'imports' };\n }\n\n // 3. Default export.\n return { exportName: undefined, source: 'default' };\n}\n","// walkerOS/packages/cli/src/commands/validate/index.ts\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { isObject } from '@walkeros/core';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport {\n getErrorMessage,\n isStdinPiped,\n readStdin,\n writeResult,\n} from '../../core/index.js';\nimport { loadJsonConfig } from '../../config/index.js';\nimport {\n validateContract,\n validateEvent,\n validateMapping,\n} from './validators/index.js';\nimport { validateEntry } from './validators/entry.js';\nimport { isFlowJson } from './scope.js';\nimport { validateFlowWithPackages } from './validators/flow.js';\nimport type { ValidateOptions } from '../../schemas/validate.js';\nimport {\n USAGE_CODES,\n type ValidateCheck,\n type ValidateCommandOptions,\n type ValidateResult,\n type ValidationError,\n type ValidationType,\n} from './types.js';\n\n/**\n * Options that do not apply to the validation type: `--path` and `--flow`\n * address flow files only, `--offline` removes the package settings check\n * of a whole-file flow run. Never ignored silently (OPTION_NOT_APPLICABLE).\n */\nfunction inapplicableOptions(\n type: ValidationType,\n options: ValidateOptions,\n): ValidationError[] {\n const errors: ValidationError[] = [];\n if (options.offline === true && (type !== 'flow' || options.path)) {\n errors.push({\n path: 'options.offline',\n message:\n type === 'flow'\n ? '--offline removes the package settings check, which is all --path checks; drop one of them'\n : `--offline applies to a whole flow file and does not apply to -t ${type}`,\n code: 'OPTION_NOT_APPLICABLE',\n });\n }\n if (type === 'flow') return errors;\n if (options.path !== undefined) {\n errors.push({\n path: 'options.path',\n message: `--path addresses an entry in a flow file and does not apply to -t ${type}`,\n code: 'OPTION_NOT_APPLICABLE',\n });\n }\n if (options.flow !== undefined) {\n errors.push({\n path: 'options.flow',\n message: `--flow names a flow in a flow file and does not apply to -t ${type}`,\n code: 'OPTION_NOT_APPLICABLE',\n });\n }\n return errors;\n}\n\n/**\n * `-t contract` on a flow file validates its `contract` section, exactly as\n * on the section alone (M-dispatch).\n */\nfunction validateContractInput(input: unknown): ValidateResult {\n if (!isFlowJson(input)) return validateContract(input);\n const contract = isObject(input) ? input.contract : undefined;\n if (contract === undefined) {\n return {\n valid: false,\n type: 'contract',\n errors: [\n {\n path: 'contract',\n message: 'The flow file has no contract section to validate',\n code: 'NO_CONTRACT_SECTION',\n },\n ],\n warnings: [],\n details: {},\n };\n }\n return validateContract(contract);\n}\n\n/**\n * The directory a local `path` package resolves against: the input file's,\n * when the input is a file on disk. Otherwise none, and no disk reads.\n */\nfunction configDirOf(input: unknown): string | undefined {\n if (typeof input !== 'string') return undefined;\n const candidate = path.resolve(input);\n return fs.existsSync(candidate) && fs.statSync(candidate).isFile()\n ? path.dirname(candidate)\n : undefined;\n}\n\n/** Whole-document validations state their one check as their scope. */\nfunction withDocumentScope(\n result: ValidateResult,\n check: ValidateCheck,\n): ValidateResult {\n return {\n ...result,\n details: {\n ...result.details,\n scope: result.details.scope ?? { flows: [], checks: [check] },\n skipped: result.details.skipped ?? [],\n },\n };\n}\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: ValidateOptions = {},\n): Promise<ValidateResult> {\n // Resolve string inputs (file paths, URLs, JSON strings) to parsed objects.\n // A path that cannot be read or parsed is an input error, never a document.\n let resolved = input;\n if (typeof input === 'string') {\n if (input.trim() === '') throw new Error(`${type} is required`);\n resolved = await loadJsonConfig(input);\n }\n\n const misuse = inapplicableOptions(type, options);\n if (misuse.length > 0) {\n return {\n valid: false,\n type,\n errors: misuse,\n warnings: [],\n details: { scope: { flows: [], checks: [] }, skipped: [] },\n };\n }\n\n const result = await validateByType(type, input, resolved, options);\n return options.strict === true ? escalateStrict(result) : result;\n}\n\n/**\n * `strict` turns warnings and skipped checks into failures (C4), in every\n * entry point (C9): the result is invalid, with the findings unchanged.\n */\nfunction escalateStrict(result: ValidateResult): ValidateResult {\n const skipped = result.details.skipped ?? [];\n if (result.warnings.length === 0 && skipped.length === 0) return result;\n return { ...result, valid: false };\n}\n\nasync function validateByType(\n type: ValidationType,\n input: unknown,\n resolved: unknown,\n options: ValidateOptions,\n): Promise<ValidateResult> {\n switch (type) {\n case 'contract':\n return withDocumentScope(validateContractInput(resolved), 'contract');\n case 'event':\n return withDocumentScope(validateEvent(resolved), 'event');\n case 'flow':\n if (options.path !== undefined) {\n return validateEntry(options.path, resolved, {\n flow: options.flow,\n configDir: options.configDir ?? configDirOf(input),\n });\n }\n return validateFlowWithPackages(resolved, {\n flow: options.flow,\n strict: options.strict,\n offline: options.offline,\n configDir: options.configDir ?? configDirOf(input),\n });\n case 'mapping':\n return withDocumentScope(validateMapping(resolved), 'mapping');\n default:\n throw new Error(`Unknown validation type: ${type}`);\n }\n}\n\n/** One line naming what the run covered (C6). */\nfunction formatScope(result: ValidateResult): string | undefined {\n const scope = result.details.scope;\n if (!scope) return undefined;\n const parts: string[] = [];\n if (scope.flows.length > 0) parts.push(`flows ${scope.flows.join(', ')}`);\n if (scope.entry) {\n const { section, key, flows, searchedFlows } = scope.entry;\n const name = section ? `${section}.${key}` : key;\n parts.push(\n `entry ${name} in ${flows.join(', ') || 'no flow'} (searched ${searchedFlows.join(', ') || 'none'})`,\n );\n }\n parts.push(`${scope.checks.length} check(s): ${scope.checks.join(', ')}`);\n if (scope.offline) parts.push('offline: package settings not checked');\n return `Scope: ${parts.join('; ')}`;\n}\n\n/**\n * Format validation result for CLI output.\n */\nfunction formatResult(\n result: ValidateResult,\n options: { json?: boolean; verbose?: boolean; exitCode: number },\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 const scopeLine = formatScope(result);\n if (scopeLine) {\n lines.push(scopeLine);\n lines.push('');\n }\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 // Skips are listed whatever the verbosity (C5)\n const skipped = result.details.skipped ?? [];\n for (const skip of skipped) {\n lines.push(\n chalk.gray(` - skipped ${skip.check} at ${skip.path}: ${skip.reason}`),\n );\n }\n\n // The verdict line follows the exit code: a run that fails under\n // --strict (exit 2) never reads as passed.\n if (options.exitCode === 2) {\n lines.push(\n chalk.red(\n ` ✗ Failed under --strict: ${result.warnings.length} warning(s) and ${skipped.length} skipped check(s) count as failures`,\n ),\n );\n } else if (result.valid && skipped.length === 0) {\n lines.push(chalk.green(` ✓ All checks passed`));\n } else if (result.valid) {\n lines.push(\n chalk.green(\n ` ✓ No errors in checked scope; ${skipped.length} check(s) skipped`,\n ),\n );\n }\n\n lines.push('');\n lines.push(\n `Summary: ${result.errors.length} error(s), ${result.warnings.length} warning(s), ${skipped.length} skipped`,\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 let exitCode: number;\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 strict: options.strict,\n offline: options.offline,\n });\n\n exitCode = exitCodeOf(result, options.strict === true);\n\n // Format and write result; --silent suppresses stdout, never a file\n if (!options.silent || options.output) {\n const formatted = formatResult(result, {\n json: options.json,\n verbose: options.verbose,\n exitCode,\n });\n await writeResult(formatted + '\\n', { output: options.output });\n }\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: { scope: { flows: [], checks: [] }, skipped: [] },\n },\n null,\n 2,\n );\n await writeResult(errorOutput + '\\n', { output: options.output });\n } else {\n logger.error(`Error: ${errorMessage}`);\n }\n\n exitCode = 3;\n }\n process.exit(exitCode);\n}\n\n/**\n * Exit code (C7): 3 could not run, 1 errors, 2 warnings or skips under\n * --strict, 0 valid.\n */\nfunction exitCodeOf(result: ValidateResult, strict: boolean): number {\n if (\n result.errors.some((e) =>\n USAGE_CODES.some((usageCode) => usageCode === e.code),\n )\n )\n return 3;\n if (result.errors.length > 0) return 1;\n const skipped = result.details.skipped ?? [];\n if (strict && (result.warnings.length > 0 || skipped.length > 0)) return 2;\n return result.valid ? 0 : 1;\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 { CONTRACT_RULE_KEYS, isObject } from '@walkeros/core';\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst KNOWN_KEYS = new Set<string>(CONTRACT_RULE_KEYS);\n\n/** Event parts once offered as contract sections; nothing enforces them. */\nconst SECTION_KEYS = ['globals', 'context', 'custom', 'user', 'consent'];\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 for $-prefixed root keys (flat app shape)\n for (const name of contractNames) {\n if (name.startsWith('$')) {\n errors.push({\n path: name,\n message:\n `\"${name}\" is not a named contract entry. This looks like the flat ` +\n 'shape; use named ContractRule entries, lift $tagging to the rule ' +\n 'field \"tagging\", and nest entity-action schemas under \"events\".',\n code: 'FLAT_CONTRACT_SHAPE',\n });\n }\n }\n\n // Check each named contract entry\n for (const [name, entry] of Object.entries(contracts)) {\n // Skip $-prefixed names (already reported above)\n if (name.startsWith('$')) {\n continue;\n }\n\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 const keys = Object.keys(obj);\n const unknownKeys = keys.filter((k) => !KNOWN_KEYS.has(k));\n const hasKnownKey = keys.some((k) => KNOWN_KEYS.has(k));\n const objectValuedUnknown = unknownKeys.filter(\n (k) => isObject(obj[k]) && !SECTION_KEYS.includes(k),\n );\n\n // Check for flat entity-action maps (object-valued keys without known keys)\n if (!hasKnownKey && objectValuedUnknown.length > 0) {\n errors.push({\n path: name,\n message:\n `Contract \"${name}\" looks like a flat entity-action map. Nest ` +\n 'entity-action schemas under an \"events\" key of a named ContractRule.',\n code: 'FLAT_CONTRACT_SHAPE',\n });\n continue;\n }\n\n // Unknown keys are errors: the contract schema is closed, and the\n // validate transformer would never apply them.\n for (const key of unknownKeys) {\n errors.push({\n path: `${name}.${key}`,\n message: SECTION_KEYS.includes(key)\n ? `Contract section \"${key}\" is not enforced: the validate transformer reads only \"events\" and \"schema\". Put the rule into \"schema\" (a JSON Schema for the whole event), for example \"schema\": { \"properties\": { \"${key}\": { ... } } }.`\n : `Unknown contract key \"${key}\" is not supported. Known keys: ${[...KNOWN_KEYS].join(', ')}.`,\n code: 'UNKNOWN_CONTRACT_KEY',\n });\n }\n\n // Validate tagging\n if (obj.tagging !== undefined && typeof obj.tagging !== 'number') {\n errors.push({\n path: `${name}.tagging`,\n message: 'tagging must be a number',\n code: 'INVALID_TAGGING',\n });\n }\n\n // Validate schema\n if (obj.schema !== undefined && !isObject(obj.schema)) {\n errors.push({\n path: `${name}.schema`,\n message: 'schema must be a JSON Schema object',\n code: 'INVALID_SCHEMA',\n });\n }\n\n // Validate extend\n if (obj.extend !== undefined) {\n if (typeof obj.extend !== 'string') {\n errors.push({\n path: `${name}.extend`,\n message: 'extend must be a string',\n code: 'INVALID_EXTENDS',\n });\n } else if (!contractNames.includes(obj.extend)) {\n errors.push({\n path: `${name}.extend`,\n message: `extend references non-existent contract \"${obj.extend}\"`,\n value: obj.extend,\n code: 'INVALID_EXTENDS',\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 extend: one error per cycle, at its first member.\n const reportedCycles = new Set<string>();\n for (const name of contractNames) {\n const chain: string[] = [];\n let current = name;\n while (current) {\n const start = chain.indexOf(current);\n if (start !== -1) {\n const cycle = chain.slice(start);\n const key = [...cycle].sort().join('\\u0000');\n if (!reportedCycles.has(key)) {\n reportedCycles.add(key);\n errors.push({\n path: `${cycle[0]}.extend`,\n message: `Circular extend chain: ${[...cycle, current].join(' → ')}`,\n code: 'CIRCULAR_EXTENDS',\n });\n }\n break;\n }\n chain.push(current);\n const entry = contracts[current];\n current =\n isObject(entry) && typeof entry.extend === 'string' ? entry.extend : '';\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, Transformer, WalkerOS } from '@walkeros/core';\nimport {\n checkWindowCollector,\n ENV_MARKER_PREFIX,\n getByPath,\n getRouteGraph,\n isObject,\n REF_CONTRACT,\n resolveContracts,\n SECRET_MARKER_PREFIX,\n validateStepEntry,\n} from '@walkeros/core';\nimport {\n checkStepKeys,\n schemas,\n validateFlowStructure,\n} from '@walkeros/core/dev';\nimport {\n validateEventAgainstContract,\n type ContractSource,\n} from '@walkeros/transformer-validate';\nimport {\n describeScope,\n ENTRY_SECTIONS,\n flowOfPath,\n isFlowJson,\n resolveScope,\n type ResolvedScope,\n} from '../scope.js';\nimport type {\n ValidateCheck,\n ValidateDeferred,\n ValidateDetails,\n ValidateResult,\n ValidateSkip,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\nimport { validateContract } from './contract.js';\nimport { resolveFlow, type FlowResolution } from './resolve.js';\nimport {\n checkStepSettings,\n createSettingsContext,\n type CheckedPackage,\n type SettingsOutcome,\n} from './settings.js';\n\nconst { validateFlowConfig } = schemas;\n\ninterface FlowValidateOptions {\n flow?: string;\n /** When true, contract violations are reported as errors instead of warnings. */\n strict?: boolean;\n}\n\ninterface FlowPackageOptions extends FlowValidateOptions {\n /** Skip the package settings check (no network); named in the scope. */\n offline?: boolean;\n /** Directory local `path` packages resolve against (the input file's). */\n configDir?: string;\n}\n\n/** Removed packages: reported as a warning for one minor (D3), then errors. */\nconst DEPRECATED_PACKAGES: Record<string, string> = {\n '@walkeros/store-memory':\n 'has been removed. Use the built-in cache by omitting cache.store, or remove the store declaration if it was only used as a cache target.',\n};\n\n/** Step sections and their kind, for the closed key check of every step. */\nconst STEP_KINDS = [\n ['sources', 'Source'],\n ['transformers', 'Transformer'],\n ['destinations', 'Destination'],\n ['stores', 'Store'],\n] as const;\n\n/** Everything the synchronous checks produced, for the package pass. */\ninterface FlowRun {\n result: ValidateResult;\n scope: ResolvedScope;\n typed?: Flow.Json;\n resolved: Map<string, Flow>;\n checks: ValidateCheck[];\n skipped: ValidateSkip[];\n gate: (name: string) => string | undefined;\n}\n\n/**\n * Validate a flow file without the network: schema and references, the\n * root contract, the bundler's structural preflight, routes, examples and\n * resolution of every flow in scope. `validate()` adds the package settings\n * check on top (see {@link validateFlowWithPackages}).\n */\nexport function validateFlow(\n input: unknown,\n options: FlowValidateOptions = {},\n): ValidateResult {\n return runFlowChecks(input, options).result;\n}\n\n/**\n * The whole-file run of `validate()`: {@link validateFlow} plus every step\n * with a `package` in scope checked against its package settings schema at\n * the pinned version. An unknown settings key is an error where the package\n * closes its schema (`additionalProperties: false`), as every closed schema\n * is; other findings are warnings for one minor (D3). A schema that cannot\n * be loaded is a skip; `offline` removes the check and says so.\n */\nexport async function validateFlowWithPackages(\n input: unknown,\n options: FlowPackageOptions = {},\n): Promise<ValidateResult> {\n const run = runFlowChecks(input, options);\n const { result, scope } = run;\n if (options.offline) {\n const described = describeScope(scope, run.checks);\n described.offline = true;\n result.details.scope = described;\n return result;\n }\n\n run.checks.push('flow:package-settings');\n const context = createSettingsContext(options.configDir);\n const deferred: ValidateDeferred[] = [];\n const packages: CheckedPackage[] = [];\n // Checks run in parallel; outcomes are applied in step order afterwards,\n // so the result does not depend on which schema arrives first.\n const pending: Array<Promise<SettingsOutcome>> = [];\n for (const name of scope.flows) {\n const flow = run.resolved.get(name);\n const rawFlow = run.typed?.flows[name];\n const reason = run.gate(name);\n if (!flow || !rawFlow || reason) {\n run.skipped.push({\n path: `flows.${name}`,\n check: 'flow:package-settings',\n reason: reason ?? `flows.${name} did not resolve`,\n code: 'GATED_BY_ERRORS',\n });\n continue;\n }\n for (const section of ENTRY_SECTIONS) {\n const steps = isObject(rawFlow[section]) ? rawFlow[section] : {};\n for (const [key, entry] of Object.entries(steps)) {\n if (!isObject(entry) || entry.package === undefined) continue;\n const target = { flow: name, section, key, entry };\n pending.push(\n checkStepSettings(target, flow, 'flow:package-settings', context),\n );\n }\n }\n }\n for (const outcome of await Promise.all(pending)) {\n for (const finding of outcome.findings) {\n if (finding.keyword === 'additionalProperties')\n result.errors.push(finding);\n else result.warnings.push(finding);\n }\n run.skipped.push(...outcome.skipped);\n deferred.push(...outcome.deferred);\n if (outcome.checked) packages.push(outcome.checked);\n }\n\n result.details.scope = describeScope(scope, run.checks);\n result.details.deferred = [...(result.details.deferred ?? []), ...deferred];\n if (packages.length > 0) result.details.packages = packages;\n result.valid = result.errors.length === 0;\n return result;\n}\n\nfunction runFlowChecks(input: unknown, options: FlowValidateOptions): FlowRun {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const skipped: ValidateSkip[] = [];\n const checks: ValidateCheck[] = ['file:schema', 'flow:schema'];\n const details: ValidateDetails = {};\n const resolved = new Map<string, Flow>();\n // `valid` is set once every error-producing check has run; the package\n // pass only adds warnings and skips.\n const result: ValidateResult = {\n valid: false,\n type: 'flow',\n errors,\n warnings,\n details,\n };\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 const scope = resolveScope(input, { flow: options.flow });\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 {\n result,\n scope,\n resolved,\n checks,\n skipped,\n gate: () => 'the input cannot be serialized',\n };\n }\n\n // 2. Scope: every per-flow check below runs on scope.flows only.\n errors.push(...scope.errors);\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 const allFlows = scope.allFlows;\n const inScope = (path: string): boolean => {\n const flow = flowOfPath(path, allFlows);\n return flow === undefined || scope.flows.includes(flow);\n };\n\n // 3. The root contract, validated as `-t contract` validates it, with\n // paths under `contract.`. A file-level check: it runs whatever --flow.\n let contractErrors = 0;\n if ('contract' in config) {\n checks.push('file:contract');\n const contract = validateContract(config.contract);\n contractErrors = contract.errors.length;\n for (const error of contract.errors)\n errors.push({ ...error, path: `contract.${error.path}` });\n for (const warning of contract.warnings)\n warnings.push({ ...warning, path: `contract.${warning.path}` });\n }\n\n // 4. Run core validation (Zod schema + reference checking). File-level\n // findings always count; per-flow findings only for flows in scope.\n // Core's own contract-resolution error at `contract` is the same\n // finding the contract check above already reported in detail.\n const coreResult = validateFlowConfig(json);\n for (const issue of coreResult.errors) {\n const path = issue.path || 'root';\n if (!inScope(path)) continue;\n if (\n (path === 'contract' || path.startsWith('contract.')) &&\n contractErrors > 0\n )\n continue;\n errors.push({\n path,\n message: issue.message,\n code: issue.code ?? 'SCHEMA_VALIDATION',\n });\n }\n for (const issue of coreResult.warnings) {\n const path = issue.path || 'root';\n if (!inScope(path)) continue;\n warnings.push({ path, message: issue.message, code: 'CONFIG_WARNING' });\n }\n\n // 5. CLI-specific: check for empty flows\n if (flows && allFlows.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. Step entries, closed (single source of truth in @walkeros/core):\n // a transformer entry's shape, and an unknown key on a destination or\n // store entry or in any step's `config`, which the runtime would\n // ignore (UNKNOWN_KEY errors). Removed packages warn\n // (DEPRECATED_PACKAGE) for one minor (D3).\n checks.push('flow:steps');\n for (const flowName of scope.flows) {\n const flowValue = flows?.[flowName];\n if (!isObject(flowValue)) continue;\n const transformersValue = flowValue.transformers;\n if (isObject(transformersValue)) {\n for (const [name, transformerValue] of Object.entries(\n transformersValue,\n )) {\n if (!isObject(transformerValue)) continue;\n const result = validateStepEntry(transformerValue, 'Transformer');\n if (!result.ok) {\n errors.push({\n path: `flows.${flowName}.transformers.${name}`,\n message: result.reason || 'Invalid transformer entry.',\n code: result.code,\n });\n }\n }\n }\n for (const [section, kind] of STEP_KINDS) {\n const steps = flowValue[section];\n if (!isObject(steps)) continue;\n for (const [name, step] of Object.entries(steps)) {\n if (!isObject(step)) continue;\n const at = `flows.${flowName}.${section}.${name}`;\n errors.push(...checkStepKeys(step, kind, at));\n const pkg = step.package;\n if (typeof pkg === 'string' && pkg in DEPRECATED_PACKAGES) {\n warnings.push({\n path: at,\n message: `${kind} \"${name}\" uses ${pkg}, which ${DEPRECATED_PACKAGES[pkg]}`,\n code: 'DEPRECATED_PACKAGE',\n });\n }\n }\n }\n checkWebLoggerFormat(flowName, flowValue, errors);\n }\n\n // 7. Extract flow details\n if (flows) {\n details.flowNames = allFlows;\n details.flowCount = allFlows.length;\n }\n\n // 8. CLI-specific: warn about packages without version (per-flow config.bundle.packages)\n checks.push('flow:package-versions');\n let totalPackageCount = 0;\n for (const flowName of scope.flows) {\n const flowValue = flows?.[flowName];\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 code: 'PACKAGE_VERSION_MISSING',\n });\n }\n }\n totalPackageCount += Object.keys(packages).length;\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 checks run per flow on shapes core has already validated: a\n // flow with its own errors, or a file with file-level errors (its\n // shape, its contract), skips them, and every skip is listed.\n const typed = isFlowJson(input) ? input : undefined;\n const gate = (name: string): string | undefined => {\n if (\n !typed ||\n errors.some((e) => flowOfPath(e.path, allFlows) === undefined)\n )\n return 'file-level errors: the file shape or its contract is not valid';\n if (errors.some((e) => flowOfPath(e.path, allFlows) === name))\n return `earlier errors in flows.${name}`;\n return undefined;\n };\n const perFlow = (\n stageChecks: ValidateCheck[],\n run: (name: string, flow: Flow, file: Flow.Json) => void,\n ): void => {\n checks.push(...stageChecks);\n for (const name of scope.flows) {\n const reason = gate(name);\n const flow = typed?.flows[name];\n if (reason || !typed || !flow) {\n for (const check of stageChecks) {\n skipped.push({\n path: `flows.${name}`,\n check,\n reason: reason ?? `flows.${name} is not a flow object`,\n code: 'GATED_BY_ERRORS',\n });\n }\n continue;\n }\n run(name, flow, typed);\n }\n };\n\n // 10a. The bundler's own structural preflight (identifier names, package\n // xor code, per-flow $store targets, closed keys, mapping fields that\n // do nothing at their position, mapping values, whole-value\n // references), so a valid result implies the bundle preflight passes.\n // A flow with earlier errors skips it, so nothing is reported twice.\n perFlow(['flow:structure'], (name, flow, file) => {\n const structure = validateFlowStructure({\n ...file,\n flows: { [name]: flow },\n });\n errors.push(...structure.errors);\n warnings.push(...structure.warnings);\n });\n\n // 10b. Route checks on every chain field, read through core's\n // getRouteGraph. Unknown targets are errors; shapes the schema\n // accepts but the author probably did not intend are warnings.\n perFlow(['flow:routes'], (name, flow) => {\n lintFlowRoutes(name, flow, errors, warnings);\n });\n\n // Each flow is resolved once, as the bundler resolves it: the validate\n // step check below reads its settings from there, 10d reports failures.\n const resolutions = new Map<string, FlowResolution>();\n const resolutionOf = (name: string, file: Flow.Json): FlowResolution => {\n let resolution = resolutions.get(name);\n if (!resolution) {\n resolution = resolveFlow(file, name);\n resolutions.set(name, resolution);\n }\n return resolution;\n };\n\n // 10c. Cross-step example compatibility, validate step examples against\n // their contract, and flat dot-separated mapping keys.\n let totalConnections: number | undefined;\n perFlow(\n ['flow:examples', 'flow:contract-examples', 'flow:mapping-keys'],\n (name, flow, file) => {\n const connections = buildConnectionGraph(flow);\n for (const conn of connections) {\n checkCompatibility(name, conn, errors, warnings);\n }\n totalConnections = (totalConnections ?? 0) + connections.length;\n\n // Contracts bind only where a transformer-validate step links them,\n // with exactly that step's settings, as at runtime. The config-level\n // contract block binds nothing by itself.\n const resolution = resolutionOf(name, file);\n for (const [stepName, transformer] of Object.entries(\n flow.transformers || {},\n )) {\n if (!isValidateStep(transformer)) continue;\n const resolvedConfig = resolution.ok\n ? resolution.flow.transformers?.[stepName]?.config\n : undefined;\n checkValidateStepExamples(\n `flows.${name}.transformers.${stepName}`,\n transformer,\n file.contract,\n errors,\n warnings,\n options.strict === true,\n skipped,\n isObject(resolvedConfig) && isObject(resolvedConfig.settings)\n ? resolvedConfig.settings\n : undefined,\n );\n }\n\n for (const [destName, dest] of Object.entries(flow.destinations || {})) {\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: `flows.${name}.destinations.${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 code: 'MAPPING_DOT_KEY',\n });\n }\n }\n }\n },\n );\n if (totalConnections !== undefined) {\n details.connectionsChecked = totalConnections;\n }\n\n // 10d. Resolve every flow as the bundler does. Every resolver failure\n // (unknown $var, unresolvable $flow, unknown contract, cycles) is an\n // error, since the bundle of that flow fails the same way. Values\n // known only at runtime ($env without default, $secret) stay deferred.\n // The collector global is checked on its resolved value; an `$env`\n // value is known only at build time and stays deferred.\n const deferred: ValidateDeferred[] = [];\n perFlow(['flow:resolve'], (name, flow, file) => {\n const resolution = resolutionOf(name, file);\n if (!resolution.ok) {\n errors.push(resolution.error);\n return;\n }\n resolved.set(name, resolution.flow);\n checkResolvedWindowCollector(name, flow, resolution.flow, errors, deferred);\n });\n\n details.scope = describeScope(scope, checks);\n details.skipped = skipped;\n details.deferred = deferred;\n result.valid = errors.length === 0;\n\n return {\n result,\n scope,\n typed,\n resolved,\n checks,\n skipped,\n gate,\n };\n}\n\n/**\n * A `$var` / `$env` collector global, checked on its resolved value as the\n * build checks it. A literal is already checked by the schema; a value that\n * needs the build env is deferred to the build.\n */\nfunction checkResolvedWindowCollector(\n name: string,\n raw: Flow,\n flow: Flow,\n errors: ValidationError[],\n deferred: ValidateDeferred[],\n): void {\n const written = raw.config?.settings?.windowCollector;\n const value = flow.config?.settings?.windowCollector;\n if (\n flow.config?.platform !== 'web' ||\n typeof written !== 'string' ||\n !/\\$(?:var|env)\\./.test(written)\n )\n return;\n const path = `flows.${name}.config.settings.windowCollector`;\n if (typeof value === 'string' && value.includes(ENV_MARKER_PREFIX)) {\n deferred.push({ path, reference: written });\n return;\n }\n const check = checkWindowCollector(value);\n if (check.ok) return;\n errors.push({\n path,\n message: `${JSON.stringify(written)} resolved to ${JSON.stringify(value)}, which ${check.reason}`,\n code: 'SCHEMA_VALIDATION',\n });\n}\n\n/**\n * `logger.format` chooses text or JSON lines for a server flow's output; a\n * web flow logs to the browser console, where it has no effect. Checked on\n * the collector's logger and on every step's `config.logger`.\n */\nfunction checkWebLoggerFormat(\n flowName: string,\n flow: Record<string, unknown>,\n errors: ValidationError[],\n): void {\n if (!isObject(flow.config) || flow.config.platform !== 'web') return;\n const at = `flows.${flowName}`;\n const loggers: Array<[string, unknown]> = [];\n if (isObject(flow.collector))\n loggers.push([`${at}.collector.logger`, flow.collector.logger]);\n for (const [section] of STEP_KINDS) {\n const steps = flow[section];\n if (!isObject(steps)) continue;\n for (const [name, step] of Object.entries(steps)) {\n if (isObject(step) && isObject(step.config))\n loggers.push([\n `${at}.${section}.${name}.config.logger`,\n step.config.logger,\n ]);\n }\n }\n for (const [path, logger] of loggers) {\n if (!isObject(logger) || logger.format === undefined) continue;\n errors.push({\n path: `${path}.format`,\n message:\n 'logger.format applies to server flows only: a web flow logs to the browser console, which has no output format. Remove it.',\n code: 'WEB_LOGGER_FORMAT',\n });\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\n/**\n * Every transformer id a route can reach, read through core's\n * `getRouteGraph` (the one enumerator over the compiled route form). An\n * over-approximation by design: static validation has no event, so every\n * branch counts.\n */\nfunction routeTargets(spec: Transformer.Route | undefined): string[] {\n if (spec === undefined) return [];\n const targets = new Set<string>();\n for (const node of getRouteGraph(spec)) {\n for (const target of node.targets) targets.add(target);\n }\n return [...targets];\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 = routeTargets(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 = routeTargets(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 = routeTargets(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 flowName: string,\n conn: StepConnection,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n const fromOuts = Object.entries(conn.from.examples)\n .filter(([, ex]) => hasComparableOut(ex.out))\n .map(([name, ex]) => ({ name, value: ex.out }));\n\n // A command example's `in` is a walker command payload, never a pushed event\n const toIns = Object.entries(conn.to.examples)\n .filter(([, ex]) => ex.in !== undefined && !ex.command)\n .map(([name, ex]) => ({ name, value: ex.in }));\n\n const path = `flows.${flowName}.${conn.from.type}s.${conn.from.name} → ${conn.to.type}s.${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 code: 'EXAMPLES_INCOMPLETE',\n });\n return;\n }\n\n const hasMatch = fromOuts.some((out) =>\n outEvents(out.value).some((event) =>\n toIns.some((inp) => isStructurallyCompatible(event, inp.value)),\n ),\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\n/** An effect tuple of a StepOut: a string head, then the call arguments. */\ntype StepOutEffect = [string, ...unknown[]];\n\n/**\n * A StepOut is an array whose every entry is an array with a string head\n * (`[]` included): `[['elb', event]]`, `[['return', { event }]]`, ...\n */\nfunction isStepOut(value: unknown): value is StepOutEffect[] {\n return (\n Array.isArray(value) &&\n value.every((entry) => Array.isArray(entry) && typeof entry[0] === 'string')\n );\n}\n\n/**\n * Events a `return` effect passes on: `{ event }` yields the event, a bare\n * object is the event itself, an array is a fan-out read item by item by the\n * same rule. `false` and other values pass nothing on.\n */\nfunction returnedEvents(value: unknown): unknown[] {\n if (isObject(value)) return [isObject(value.event) ? value.event : value];\n if (Array.isArray(value)) return value.flatMap(returnedEvents);\n return [];\n}\n\n/**\n * The events an example `out` hands to the next step. A StepOut yields the\n * object argument of each `elb` effect and the events of each `return`\n * effect; every other head (`message.ack`, `response`, vendor calls) yields\n * nothing. A non-StepOut value is the output itself (back compat), when it\n * is a non-empty array, string or object.\n */\nfunction outEvents(out: unknown): unknown[] {\n if (isStepOut(out)) {\n return out.flatMap(([head, first]) => {\n if (head === 'elb') return isObject(first) ? [first] : [];\n if (head === 'return') return returnedEvents(first);\n return [];\n });\n }\n if (Array.isArray(out) || typeof out === 'string')\n return out.length > 0 ? [out] : [];\n return isObject(out) && Object.keys(out).length > 0 ? [out] : [];\n}\n\nfunction hasComparableOut(out: unknown): boolean {\n return outEvents(out).length > 0;\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\n/**\n * Checks every chain field of a flow (source `before`/`next`, transformer\n * `before`/`next`, destination `before`/`next`, `collector.next`):\n *\n * - error: a route target that is not a transformer of the flow. At runtime\n * an unknown id is skipped with a warning, so a misspelled step (for\n * example a redaction branch) would otherwise fail open.\n * - warning: entries after an unconditional `stop` never run.\n * - warning: `many: []` selects nothing; `many: [\"x\"]` is just `next`.\n * - warning: an array made only of route configs is first-match.\n */\nfunction lintFlowRoutes(\n flowName: string,\n flow: Flow,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n const known = new Set(Object.keys(flow.transformers || {}));\n const check = (\n spec: Transformer.Route | undefined,\n position: string,\n ): void => {\n if (spec !== undefined) lintRoute(spec, position, known, errors, warnings);\n };\n const at = `flows.${flowName}`;\n\n for (const [name, source] of Object.entries(flow.sources || {})) {\n check(source.before, `${at}.sources.${name}.before`);\n check(source.next, `${at}.sources.${name}.next`);\n }\n for (const [name, transformer] of Object.entries(flow.transformers || {})) {\n check(transformer.before, `${at}.transformers.${name}.before`);\n check(transformer.next, `${at}.transformers.${name}.next`);\n }\n check(flow.collector?.next, `${at}.collector.next`);\n for (const [name, dest] of Object.entries(flow.destinations || {})) {\n check(dest.before, `${at}.destinations.${name}.before`);\n check(dest.next, `${at}.destinations.${name}.next`);\n }\n}\n\ntype RoutePath = (string | number)[];\n\n/** The raw value at `path` inside a route (a plain lookup, no grammar). */\nfunction routeAt(spec: Transformer.Route, path: RoutePath): unknown {\n let current: unknown = spec;\n for (const key of path) {\n if (typeof key === 'number')\n current = Array.isArray(current) ? current[key] : undefined;\n else current = isObject(current) ? current[key] : undefined;\n }\n return current;\n}\n\n/**\n * Lints one route through `getRouteGraph`. Every branch node, and every\n * enclosing decision it lists in `via`, is looked at once by its path.\n */\nfunction lintRoute(\n spec: Transformer.Route,\n position: string,\n known: Set<string>,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n): void {\n const where = (path: RoutePath) =>\n path.length > 0 ? `${position}.${path.join('.')}` : position;\n const reported = new Set<string>();\n const once = (key: string): boolean => {\n if (reported.has(key)) return false;\n reported.add(key);\n return true;\n };\n\n for (const node of getRouteGraph(spec)) {\n for (const target of node.targets) {\n if (known.has(target) || !once(`unknown:${target}`)) continue;\n errors.push({\n path: position,\n message: `Unknown transformer \"${target}\" in route at ${position}`,\n code: 'UNKNOWN_ROUTE_TARGET',\n });\n }\n\n // Entries after an unconditional stop never run (a `many` entry's stop\n // ends only its own copy, so it does not shadow its siblings).\n const last = node.path[node.path.length - 1];\n if (node.stop && !node.match && node.kind !== 'many') {\n const self = routeAt(spec, node.path);\n const list = routeAt(spec, node.path.slice(0, -1));\n if (\n isObject(self) &&\n self.stop === true &&\n typeof last === 'number' &&\n Array.isArray(list) &&\n last < list.length - 1 &&\n once(`stop:${where(node.path)}`)\n ) {\n const at = where(node.path);\n warnings.push({\n path: at,\n message: `dead code after stop at ${at}: entries after an unconditional stop never run`,\n code: 'ROUTE_DEAD_CODE',\n suggestion:\n 'Remove the entries after the stop, or give the stop a match.',\n });\n }\n }\n\n if (\n node.kind === 'many' &&\n last === 'many' &&\n node.targets.length === 0 &&\n once(`empty:${where(node.path)}`)\n ) {\n const at = where(node.path.slice(0, -1));\n warnings.push({\n path: at,\n message: `empty many at ${at}: selects no branch, so it has no effect`,\n code: 'ROUTE_EMPTY_MANY',\n suggestion: 'Add two or more branch targets to many, or remove it.',\n });\n }\n\n for (const decision of [...(node.via ?? []), node]) {\n const index = decision.path[decision.path.length - 1];\n if (typeof index !== 'number') continue;\n const listPath = decision.path.slice(0, -1);\n const list = routeAt(spec, listPath);\n if (!Array.isArray(list)) continue;\n const at = where(listPath);\n\n if (\n decision.kind === 'many' &&\n list.length === 1 &&\n once(`single:${at}`)\n ) {\n const only = list[0];\n const hint =\n typeof only === 'string'\n ? `use 'next: \"${only}\"' for clarity`\n : `use 'next' for clarity`;\n warnings.push({\n path: at,\n message: `single-entry many at ${at}: ${hint}`,\n code: 'ROUTE_SINGLE_MANY',\n suggestion: 'Replace many with next when only one branch exists.',\n });\n }\n\n // A pure route-config array is compiled as an implicit `one`.\n const explicitOne = listPath[listPath.length - 1] === 'one';\n if (\n decision.kind === 'one' &&\n !explicitOne &&\n list.length > 1 &&\n once(`first-match:${at}`)\n ) {\n warnings.push({\n path: at,\n message: `first-match array at ${at}: an array made only of route configs is an implicit one, the first matching entry wins`,\n code: 'ROUTE_FIRST_MATCH',\n suggestion:\n 'Write { \"one\": [...] } explicitly, or add the step ids as a sequence to run every entry in order.',\n });\n }\n }\n }\n}\n\n/**\n * Whether a value holds a `$env` or `$secret` value: resolved to the\n * resolver's deferred marker, or still written as the reference.\n */\nfunction hasRuntimeValue(value: unknown): boolean {\n if (typeof value === 'string')\n return (\n value.includes(ENV_MARKER_PREFIX) ||\n value.startsWith(SECRET_MARKER_PREFIX) ||\n /\\$(?:env|secret)\\./.test(value)\n );\n if (Array.isArray(value)) return value.some(hasRuntimeValue);\n return isObject(value) && Object.values(value).some(hasRuntimeValue);\n}\n\nconst VALIDATE_PACKAGE = '@walkeros/transformer-validate';\n\n/** A transformer step that runs `@walkeros/transformer-validate`. */\nexport function isValidateStep(step: Flow.Transformer): boolean {\n return step.package === VALIDATE_PACKAGE;\n}\n\ntype StepContracts =\n | { ok: true; sources: ContractSource[] }\n | { ok: false; index?: number; message: string };\n\n/**\n * The contract sources a validate step runs with, as at runtime: a whole\n * `$contract.<name>(.<path>)` string resolves against the config-level\n * contract definitions, an inline schema is used as given. An entry that\n * does not resolve says which one and why; the step is then not judged.\n */\nfunction resolveStepContracts(\n entries: unknown[],\n contract: Flow.Contract | undefined,\n): StepContracts {\n let resolved: Record<string, Flow.ContractRule> = {};\n if (contract) {\n try {\n resolved = resolveContracts(contract);\n } catch (error) {\n return {\n ok: false,\n message: `the root contract does not resolve (${error instanceof Error ? error.message : String(error)})`,\n };\n }\n }\n\n const sources: ContractSource[] = [];\n for (const [index, entry] of entries.entries()) {\n if (isObject(entry)) {\n sources.push(entry);\n continue;\n }\n const match = typeof entry === 'string' ? entry.match(REF_CONTRACT) : null;\n if (!match)\n return {\n ok: false,\n index,\n message: 'an entry must be a $contract reference or a JSON Schema',\n };\n if (!(match[1] in resolved))\n return {\n ok: false,\n index,\n message: `contract \"${match[1]}\" is not defined in the root contract (defined: ${Object.keys(resolved).join(', ') || 'none'})`,\n };\n const rule: unknown = match[2]\n ? getByPath(resolved[match[1]], match[2])\n : resolved[match[1]];\n if (!isObject(rule))\n return {\n ok: false,\n index,\n message: `${match[0]} does not point at a contract rule object`,\n };\n sources.push(rule);\n }\n return { ok: true, sources };\n}\n\n/**\n * Check a validate step's own examples against its own contract and\n * settings: the verdict the step reaches on `in` must agree with what `out`\n * shows. A valid event goes on (its `output.isValid` flag, when shown, is\n * true); an invalid one is dropped in `strict` mode and otherwise goes on\n * with the flag false. A disagreement is CONTRACT_VIOLATION (error when\n * {@link strict}, else warning). Deterministic: the verdict comes from the\n * shared {@link validateEventAgainstContract} runtime authority.\n * `stepPath` is the step's result path, `flows.<flow>.transformers.<name>`.\n * A contract entry that does not resolve is an error (UNRESOLVED_CONTRACT),\n * examples or not; a contract setting that is not a list is a skip.\n * `resolvedSettings` are the step's settings as the resolver produced them\n * (`$var` and `$contract` resolved, as the runtime sees them); without them\n * the settings as written are read.\n */\nexport function checkValidateStepExamples(\n stepPath: string,\n step: Flow.Transformer,\n contract: Flow.Contract | undefined,\n errors: ValidationError[],\n warnings: ValidationWarning[],\n strict: boolean,\n skipped?: ValidateSkip[],\n resolvedSettings?: Record<string, unknown>,\n): void {\n const settings =\n resolvedSettings ??\n (isObject(step.config) && isObject(step.config.settings)\n ? step.config.settings\n : {});\n const contractPath = `${stepPath}.config.settings.contract`;\n // A contract that is set but not a list cannot be judged statically.\n if (settings.contract !== undefined && !Array.isArray(settings.contract)) {\n if (step.examples)\n skipped?.push({\n path: stepPath,\n check: 'flow:contract-examples',\n reason:\n 'config.settings.contract is not a list, so the step cannot be judged statically',\n code: 'CONTRACT_NOT_STATIC',\n });\n return;\n }\n const resolution: StepContracts = Array.isArray(settings.contract)\n ? resolveStepContracts(settings.contract, contract)\n : { ok: true, sources: [] };\n if (!resolution.ok) {\n errors.push({\n path:\n resolution.index === undefined\n ? contractPath\n : `${contractPath}.${resolution.index}`,\n message: `The validate step's contract does not resolve: ${resolution.message}`,\n code: 'UNRESOLVED_CONTRACT',\n });\n return;\n }\n if (!step.examples) return;\n const contracts = resolution.sources;\n // A `$env` or `$secret` value in the contract is known only when the\n // bundle builds or runs; judged on its literal text, JSON Schema would\n // ignore it. The check is deferred, and the skip says so.\n if (contracts.some(hasRuntimeValue)) {\n skipped?.push({\n path: stepPath,\n check: 'flow:contract-examples',\n reason:\n 'the contract uses a $env or $secret value, known only when the bundle builds or runs, so the examples cannot be judged statically',\n code: 'CONTRACT_NOT_STATIC',\n });\n return;\n }\n\n const mode = settings.mode === 'strict' ? 'strict' : 'pass';\n const format = settings.format === true;\n const output = isObject(settings.output) ? settings.output : {};\n const isValidPath =\n typeof output.isValid === 'string' ? output.isValid : 'source.valid';\n\n for (const [exName, example] of Object.entries(step.examples)) {\n if (example.command || !isObject(example.in)) continue;\n if (example.out === undefined) continue;\n\n const event: WalkerOS.DeepPartialEvent = example.in;\n const verdict = validateEventAgainstContract(event, undefined, {\n contracts,\n format,\n });\n const passed = outEvents(example.out);\n const dropped =\n isStepOut(example.out) &&\n example.out.some(([head, first]) => head === 'return' && first === false);\n\n let agrees: boolean;\n if (mode === 'strict' && !verdict.isValid) {\n agrees = dropped && passed.length === 0;\n } else {\n agrees =\n passed.length > 0 &&\n passed.every((out) => {\n if (!isValidPath) return true;\n const flag = getByPath(out, isValidPath);\n return verdict.isValid ? flag !== false : flag === false;\n });\n }\n if (agrees) continue;\n\n const reason = verdict.isValid\n ? 'the event satisfies the contract'\n : `the event breaks the contract (${verdict.errors\n .map((e) => `${e.path || '/'}: ${e.message}`)\n .join('; ')})`;\n const expected =\n mode === 'strict' && !verdict.isValid\n ? 'drops it ([\"return\", false])'\n : `passes it on${isValidPath ? ` with ${isValidPath} ${verdict.isValid}` : ''}`;\n const path = `${stepPath}.examples.${exName}.out`;\n const message = `Example out disagrees with the validate step: ${reason}, so with mode \"${mode}\" the step ${expected}.`;\n\n if (strict) {\n errors.push({ path, message, code: 'CONTRACT_VIOLATION' });\n } else {\n warnings.push({\n path,\n message,\n suggestion:\n 'Make the example out show what the validate step does with its settings.',\n code: 'CONTRACT_VIOLATION',\n });\n }\n }\n}\n","// walkerOS/packages/cli/src/commands/validate/scope.ts\n\nimport type { Flow } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\nimport type { ValidateCheck, ValidateScope, ValidationError } from './types.js';\n\n/**\n * A parsed Flow.Json shape (a `version` and a `flows` object), so the\n * validators can hand it to core's resolver and preflight without casts.\n */\nexport function isFlowJson(value: unknown): value is Flow.Json {\n return isObject(value) && 'version' in value && isObject(value.flows);\n}\n\n/** Step sections a `--path` can address. */\nexport const ENTRY_SECTIONS = [\n 'sources',\n 'destinations',\n 'transformers',\n 'stores',\n] as const;\n\nexport type EntrySection = (typeof ENTRY_SECTIONS)[number];\n\nfunction isEntrySection(value: string): value is EntrySection {\n return ENTRY_SECTIONS.some((section) => section === value);\n}\n\nexport interface ScopeOptions {\n flow?: string;\n path?: string;\n}\n\nexport interface ScopeEntry {\n flow: string;\n section: EntrySection;\n key: string;\n entry: Record<string, unknown>;\n}\n\nexport interface ResolvedScope {\n /** Every flow in the file, in file order. */\n allFlows: string[];\n /** Flows every per-flow check runs on. */\n flows: string[];\n /** Entries a `--path` addressed, one per flow that has it. */\n entries: ScopeEntry[];\n /** Flows searched for the `--path` entry (empty without a path). */\n searchedFlows: string[];\n /** The entry a `--path` names, when one was given and parsed. */\n target?: { section?: EntrySection; key: string };\n /** FLOW_NOT_FOUND, ENTRY_NOT_FOUND, AMBIGUOUS_ENTRY, UNSUPPORTED_SECTION, INVALID_PATH. */\n errors: ValidationError[];\n}\n\n/**\n * The one place validate picks flows and entries. `flow` narrows to that\n * flow; without it every flow is in scope. `path` (`section.key` or `key`)\n * addresses the entry in every flow in scope that has it.\n */\nexport function resolveScope(\n config: unknown,\n options: ScopeOptions = {},\n): ResolvedScope {\n const flowsValue = isObject(config) ? config.flows : undefined;\n const flowMap = isObject(flowsValue) ? flowsValue : {};\n const allFlows = Object.keys(flowMap);\n\n let flows = allFlows;\n if (options.flow !== undefined) {\n if (!allFlows.includes(options.flow)) {\n return {\n allFlows,\n flows: [],\n entries: [],\n searchedFlows: [],\n errors: [\n {\n path: 'flows',\n message: `Flow \"${options.flow}\" not found. Available: ${allFlows.join(', ') || 'none'}`,\n code: 'FLOW_NOT_FOUND',\n },\n ],\n };\n }\n flows = [options.flow];\n }\n\n const path = options.path;\n if (path === undefined) {\n return { allFlows, flows, entries: [], searchedFlows: [], errors: [] };\n }\n\n const parts = path.split('.');\n let sections: readonly EntrySection[] = ENTRY_SECTIONS;\n let section: EntrySection | undefined;\n let key: string;\n if (parts.length === 2 && parts[0] !== '' && parts[1] !== '') {\n if (!isEntrySection(parts[0])) {\n return {\n allFlows,\n flows,\n entries: [],\n searchedFlows: [],\n errors: [\n {\n path,\n message: `Section \"${parts[0]}\" cannot be addressed by --path. Use one of: ${ENTRY_SECTIONS.join(', ')}`,\n code: 'UNSUPPORTED_SECTION',\n },\n ],\n };\n }\n section = parts[0];\n sections = [section];\n key = parts[1];\n } else if (parts.length === 1 && parts[0] !== '') {\n key = parts[0];\n } else {\n return {\n allFlows,\n flows,\n entries: [],\n searchedFlows: [],\n errors: [\n {\n path,\n message: `Invalid path \"${path}\". Use \"section.key\" or just \"key\"`,\n code: 'INVALID_PATH',\n },\n ],\n };\n }\n\n const entries: ScopeEntry[] = [];\n for (const flow of flows) {\n const flowValue = flowMap[flow];\n if (!isObject(flowValue)) continue;\n for (const candidate of sections) {\n const sectionValue = flowValue[candidate];\n if (!isObject(sectionValue)) continue;\n const entry = sectionValue[key];\n if (isObject(entry))\n entries.push({ flow, section: candidate, key, entry });\n }\n }\n\n const matched = [...new Set(entries.map((entry) => entry.section))];\n if (matched.length > 1) {\n return {\n allFlows,\n flows,\n entries: [],\n searchedFlows: flows,\n target: { key },\n errors: [\n {\n path,\n message: `Ambiguous key \"${key}\" found in multiple sections: ${matched.join(', ')}. Use dot-notation (e.g., ${matched[0]}.${key})`,\n code: 'AMBIGUOUS_ENTRY',\n },\n ],\n };\n }\n\n const target = { section: section ?? matched[0], key };\n if (entries.length === 0) {\n return {\n allFlows,\n flows,\n entries,\n searchedFlows: flows,\n target,\n errors: [\n {\n path,\n message: `Entry \"${key}\" not found in ${section ?? 'any section'} of flow(s): ${flows.join(', ') || 'none'}`,\n code: 'ENTRY_NOT_FOUND',\n },\n ],\n };\n }\n\n return {\n allFlows,\n flows,\n entries,\n searchedFlows: flows,\n target,\n errors: [],\n };\n}\n\n/** The flow a result path belongs to, or undefined for a file-level path. */\nexport function flowOfPath(\n path: string,\n flowNames: readonly string[],\n): string | undefined {\n return flowNames.find(\n (name) => path === `flows.${name}` || path.startsWith(`flows.${name}.`),\n );\n}\n\n/** `details.scope` for a resolved scope and the checks the run included. */\nexport function describeScope(\n resolved: ResolvedScope,\n checks: ValidateCheck[],\n): ValidateScope {\n const scope: ValidateScope = { flows: resolved.flows, checks };\n if (resolved.target) {\n const { section, key } = resolved.target;\n scope.entry = {\n ...(section ? { section } : {}),\n key,\n flows: [...new Set(resolved.entries.map((entry) => entry.flow))],\n searchedFlows: resolved.searchedFlows,\n };\n }\n return scope;\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/resolve.ts\n\nimport type { Flow } from '@walkeros/core';\nimport {\n FlowCycleError,\n FlowReferenceError,\n getFlowSettings,\n getErrorMessage,\n} from '@walkeros/core';\nimport type { ValidateCode, ValidationError } from '../types.js';\n\nexport type FlowResolution =\n | { ok: true; flow: Flow }\n | { ok: false; error: ValidationError };\n\n/**\n * Resolve one flow exactly as the bundler does (`getFlowSettings` with\n * deferred `$env`/`$secret`, and `$flow` refs as strict as the bundle). A\n * resolver failure is an error at `flows.<name>`: the bundle of this flow\n * fails the same way.\n */\nexport function resolveFlow(file: Flow.Json, name: string): FlowResolution {\n try {\n const flow = getFlowSettings(file, name, { deferred: true });\n return { ok: true, flow };\n } catch (error) {\n return {\n ok: false,\n error: {\n path: `flows.${name}`,\n message: getErrorMessage(error),\n code: resolutionCode(error),\n },\n };\n }\n}\n\n/** The code of a resolver failure, read from its type. */\nfunction resolutionCode(error: unknown): ValidateCode {\n if (error instanceof FlowReferenceError) return error.code;\n if (error instanceof FlowCycleError) return error.code;\n return 'UNRESOLVED_REFERENCE';\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/settings.ts\n\nimport Ajv, { type ErrorObject, type ValidateFunction } from 'ajv';\nimport type { Flow } from '@walkeros/core';\nimport {\n createLogger,\n ENV_MARKER_PREFIX,\n getErrorMessage,\n isObject,\n REF_CODE_PREFIX,\n REF_STORE,\n SECRET_MARKER_PREFIX,\n} from '@walkeros/core';\nimport {\n resolveExportName,\n type ComponentKind,\n} from '../../../core/resolve-export-name.js';\nimport {\n resolveStepPackage,\n type ResolvedStepPackage,\n} from '../../../core/step-packages.js';\nimport { readStepPackageInfo } from '../../../core/package-info.js';\nimport type { EntrySection } from '../scope.js';\nimport type {\n ValidateCheck,\n ValidateDeferred,\n ValidateSkip,\n ValidationError,\n} 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\n// Resolving a step's package logs only a warning (a bundle pin over a\n// disagreeing inline version); the version checked is in details.packages.\nconst LOGGER = createLogger();\n\n/** One step whose settings are checked against its package schema. */\nexport interface SettingsTarget {\n flow: string;\n section: EntrySection;\n key: string;\n /** The step as written in the file (package, bundle pins). */\n entry: Record<string, unknown>;\n}\n\nexport interface SettingsContext {\n /** Directory a local `path` package resolves against; unset: no disk reads. */\n configDir?: string;\n /** Schemas fetched in this run, by package source. */\n cache: Map<string, Promise<PackageSchema>>;\n /** Settings validators compiled in this run, by package source and export. */\n compiled: Map<string, CompiledSettings | undefined>;\n}\n\nexport interface CheckedPackage {\n path: string;\n package: string;\n version?: string;\n}\n\nexport interface SettingsOutcome {\n findings: ValidationError[];\n skipped: ValidateSkip[];\n deferred: ValidateDeferred[];\n checked?: CheckedPackage;\n}\n\nexport interface PackageSchema {\n version?: string;\n /** The default export's settings schema. */\n settings: unknown;\n /** Schemas per export, keyed by export name (multi-export packages). */\n exportSchemas?: Record<string, unknown>;\n /** Export names the package declares. */\n exports?: string[];\n}\n\nexport type SettingsSelection =\n | { ok: true; settings: unknown }\n | { ok: false; reason: string };\n\n/** A settings schema compiled once per package source, export and run. */\ntype CompiledSettings =\n | { ok: true; validate: ValidateFunction }\n | { ok: false; message: string };\n\nexport function createSettingsContext(configDir?: string): SettingsContext {\n return { configDir, cache: new Map(), compiled: new Map() };\n}\n\n/**\n * The settings schema for the export a step imports, by the same rule\n * simulate uses for dev examples: no export named takes `settings`; a\n * per-export map takes that export's entry and never another export's; a\n * package declaring at most one export takes `settings` for its only step\n * export; a multi-export package without a map, or a package that does not\n * publish its exports, cannot be checked.\n */\nexport function selectSettingsSchema(\n pkg: PackageSchema,\n packageLabel: string,\n exportName: string | undefined,\n): SettingsSelection {\n if (exportName === undefined) return { ok: true, settings: pkg.settings };\n if (pkg.exportSchemas) {\n const entry = Object.prototype.hasOwnProperty.call(\n pkg.exportSchemas,\n exportName,\n )\n ? pkg.exportSchemas[exportName]\n : undefined;\n if (!isObject(entry))\n return {\n ok: false,\n reason: `${packageLabel} has no export \"${exportName}\"`,\n };\n return { ok: true, settings: entry.settings };\n }\n if (pkg.exports && pkg.exports.length < 2)\n return { ok: true, settings: pkg.settings };\n return {\n ok: false,\n reason: `${packageLabel} predates per-export settings schemas; the step imports \"${exportName}\"`,\n };\n}\n\nconst SECTION_KIND: Record<EntrySection, ComponentKind> = {\n sources: 'source',\n transformers: 'transformer',\n destinations: 'destination',\n stores: 'store',\n};\n\n/** Segments of an Ajv instance path (a JSON pointer). */\nfunction pointerSegments(pointer: string): string[] {\n if (pointer === '') return [];\n return pointer\n .split('/')\n .slice(1)\n .map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'));\n}\n\nfunction valueAt(root: unknown, segments: string[]): unknown {\n let current = root;\n for (const segment of segments) {\n if (Array.isArray(current)) current = current[Number(segment)];\n else if (isObject(current)) current = current[segment];\n else return undefined;\n }\n return current;\n}\n\n// The bundler's deferred-$env marker grammar (see bundle/bundler.ts): a\n// default runs until whitespace, a quote or the next marker.\nconst MARKER = ENV_MARKER_PREFIX.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\nconst ENV_MARKER = new RegExp(\n `${MARKER}([a-zA-Z_][a-zA-Z0-9_]*)(?::((?:(?!${MARKER})[^\\\\s\"'])*))?`,\n 'g',\n);\n\ninterface PreparedSettings {\n value: unknown;\n /** Instance paths known only at runtime, with the reference as written. */\n deferred: Array<{ segments: string[]; reference: string }>;\n}\n\n/**\n * The placeholder rule, applied to settings already resolved by\n * `getFlowSettings(..., { deferred: true })`: `$var` and `$flow` values are\n * already resolved (an unresolvable one fails the flow first); `$env.NAME:default`\n * is checked as its default; `$env.NAME` without default, `$secret`, `$store`\n * and `$code` are known only at runtime and deferred.\n */\nfunction prepareSettings(settings: unknown): PreparedSettings {\n const deferred: PreparedSettings['deferred'] = [];\n const walk = (value: unknown, segments: string[]): unknown => {\n if (Array.isArray(value))\n return value.map((item, index) => walk(item, [...segments, `${index}`]));\n if (isObject(value))\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n walk(item, [...segments, key]),\n ]),\n );\n if (typeof value !== 'string') return value;\n\n if (value.startsWith(SECRET_MARKER_PREFIX)) {\n deferred.push({\n segments,\n reference: `$secret.${value.slice(SECRET_MARKER_PREFIX.length)}`,\n });\n return value;\n }\n if (value.includes(ENV_MARKER_PREFIX)) {\n let runtimeOnly = false;\n const withDefaults = value.replace(\n ENV_MARKER,\n (_match, _name: string, fallback: string | undefined) => {\n if (fallback === undefined) runtimeOnly = true;\n return fallback ?? '';\n },\n );\n if (!runtimeOnly) return withDefaults;\n deferred.push({\n segments,\n reference: value.replace(\n ENV_MARKER,\n (_match, name: string, fallback: string | undefined) =>\n fallback === undefined\n ? `$env.${name}`\n : `$env.${name}:${fallback}`,\n ),\n });\n return value;\n }\n if (REF_STORE.test(value) || value.startsWith(REF_CODE_PREFIX)) {\n deferred.push({ segments, reference: value });\n }\n return value;\n };\n return { value: walk(settings, []), deferred };\n}\n\nfunction isUnder(segments: string[], prefix: string[]): boolean {\n return prefix.every((segment, index) => segments[index] === segment);\n}\n\nasync function loadSchema(\n resolved: ResolvedStepPackage,\n context: SettingsContext,\n): Promise<PackageSchema> {\n const info = await readStepPackageInfo(resolved, {\n configDir: context.configDir,\n client: CLIENT_HEADER,\n });\n return {\n version: info.version,\n settings: info.schemas.settings,\n ...(info.exportSchemas ? { exportSchemas: info.exportSchemas } : {}),\n ...(info.exports ? { exports: Object.keys(info.exports) } : {}),\n };\n}\n\n/**\n * Compile a package's settings schema. A schema Ajv cannot compile (an\n * unknown keyword, a bad `$ref`) cannot be checked against, so it is a\n * failed compile the caller reports as a skip, never a crash of the run.\n */\nfunction compileSettings(settings: unknown): CompiledSettings | undefined {\n if (!isObject(settings)) return undefined;\n // Formats such as `uri` and `email` are not bundled with Ajv; ignore them\n // instead of failing to compile. Every structural keyword is still checked.\n const ajv = new Ajv({ allErrors: true, validateFormats: false });\n try {\n return { ok: true, validate: ajv.compile(settings) };\n } catch (error) {\n return { ok: false, message: getErrorMessage(error) };\n }\n}\n\nfunction sourceKey({ packageName, spec }: ResolvedStepPackage): string {\n return spec.path !== undefined\n ? `path:${spec.path}`\n : `${packageName}@${spec.version ?? 'latest'}`;\n}\n\nfunction cachedSchema(\n resolved: ResolvedStepPackage,\n context: SettingsContext,\n): Promise<PackageSchema> {\n const key = sourceKey(resolved);\n let pending = context.cache.get(key);\n if (!pending) {\n pending = loadSchema(resolved, context);\n context.cache.set(key, pending);\n }\n return pending;\n}\n\nfunction cachedCompile(\n resolved: ResolvedStepPackage,\n exportName: string | undefined,\n settings: unknown,\n context: SettingsContext,\n): CompiledSettings | undefined {\n const key = `${sourceKey(resolved)}#${exportName ?? ''}`;\n if (context.compiled.has(key)) return context.compiled.get(key);\n const compiled = compileSettings(settings);\n context.compiled.set(key, compiled);\n return compiled;\n}\n\n/**\n * Check one step's resolved `config.settings` against its package's\n * settings schema, at the version the bundle would install. Findings are\n * returned for the caller to report as errors or warnings; a check that\n * cannot run is a skip; values known only at runtime are deferred.\n */\nexport async function checkStepSettings(\n target: SettingsTarget,\n resolvedFlow: Flow,\n check: ValidateCheck,\n context: SettingsContext,\n): Promise<SettingsOutcome> {\n const at = `flows.${target.flow}.${target.section}.${target.key}`;\n const outcome: SettingsOutcome = { findings: [], skipped: [], deferred: [] };\n const spec =\n typeof target.entry.package === 'string' ? target.entry.package : '';\n if (!spec) {\n outcome.skipped.push({\n path: at,\n check,\n reason: 'No package field, so there is no settings schema to fetch',\n code: 'NO_PACKAGE',\n });\n return outcome;\n }\n\n // The package source the bundle would install for this step.\n let resolved: ResolvedStepPackage;\n try {\n resolved = resolveStepPackage(\n resolvedFlow,\n SECTION_KIND[target.section],\n target.key,\n LOGGER,\n );\n } catch (error) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Schema for ${spec} could not be loaded: ${getErrorMessage(error)}`,\n code: 'SCHEMA_UNAVAILABLE',\n });\n return outcome;\n }\n const { label } = resolved;\n const pinned =\n resolved.spec.path === undefined ? resolved.spec.version : undefined;\n\n let schema: PackageSchema;\n try {\n schema = await cachedSchema(resolved, context);\n } catch (error) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Schema for ${label}${pinned ? `@${pinned}` : ''} could not be loaded: ${getErrorMessage(error)}`,\n code: 'SCHEMA_UNAVAILABLE',\n });\n return outcome;\n }\n outcome.checked = {\n path: at,\n package: label,\n ...(schema.version ? { version: schema.version } : {}),\n };\n\n // The export the step imports, resolved as the bundler resolves it.\n const { exportName } = resolveExportName(\n resolved.normalizedFlow,\n SECTION_KIND[target.section],\n target.key,\n );\n const version = schema.version ?? pinned;\n const selection = selectSettingsSchema(\n schema,\n version ? `${label}@${version}` : label,\n exportName,\n );\n if (!selection.ok) {\n outcome.skipped.push({\n path: at,\n check,\n reason: selection.reason,\n code: 'NO_SETTINGS_SCHEMA',\n });\n return outcome;\n }\n\n const compiled = cachedCompile(\n resolved,\n exportName,\n selection.settings,\n context,\n );\n if (!compiled) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Package ${label} has no settings schema`,\n code: 'NO_SETTINGS_SCHEMA',\n });\n return outcome;\n }\n if (!compiled.ok) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `The settings schema of ${label} cannot be compiled: ${compiled.message}`,\n code: 'SCHEMA_UNAVAILABLE',\n });\n return outcome;\n }\n const validate = compiled.validate;\n\n const step = stepOf(resolvedFlow, target.section, target.key);\n const config = isObject(step?.config) ? step.config : {};\n const prepared = prepareSettings(config.settings ?? {});\n const base = `${at}.config.settings`;\n for (const { segments, reference } of prepared.deferred) {\n outcome.deferred.push({\n path: [base, ...segments].join('.'),\n reference,\n });\n }\n\n if (validate(prepared.value)) return outcome;\n\n for (const e of validate.errors || []) {\n const segments = pointerSegments(e.instancePath);\n if (prepared.deferred.some((d) => isUnder(segments, d.segments))) continue;\n const finding: ValidationError = {\n path: [base, ...segments].join('.'),\n message: describeAjvError(e),\n code: 'ENTRY_SCHEMA',\n keyword: e.keyword,\n };\n if (segments.length > 0) finding.value = valueAt(prepared.value, segments);\n outcome.findings.push(finding);\n }\n return outcome;\n}\n\n/** Ajv's message, naming the offending key where Ajv only reports it in params. */\nfunction describeAjvError(error: ErrorObject): string {\n const message = error.message || 'Unknown error';\n const extra: unknown = error.params.additionalProperty;\n return error.keyword === 'additionalProperties' && typeof extra === 'string'\n ? `${message}: \"${extra}\"`\n : message;\n}\n\nfunction stepOf(\n flow: Flow,\n section: EntrySection,\n key: string,\n): Flow.Step | undefined {\n switch (section) {\n case 'sources':\n return flow.sources?.[key];\n case 'destinations':\n return flow.destinations?.[key];\n case 'transformers':\n return flow.transformers?.[key];\n case 'stores':\n return flow.stores?.[key];\n }\n}\n","/**\n * The walkerOS metadata of a step's package, read from the source\n * resolveStepPackage picked: a local path from its walkerOS.json on disk,\n * any other package from the CDN at the pinned version. Every tool that has\n * a flow reads a step's package here, so all of them read the same source\n * the bundle installs.\n *\n * Node built-ins only: this module is reachable from the `dev` and\n * `validate` entries, which a server process loads without the bundler or\n * the package manager.\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { WalkerOSPackage } from '@walkeros/core';\nimport { fetchPackage, isObject, parseWalkerOSJson } from '@walkeros/core';\nimport type { ResolvedStepPackage } from './step-packages.js';\n\n/** A package's walkerOS.json content, plus the version read (absent for a local package whose package.json names none). */\nexport type StepPackageInfo = Omit<\n WalkerOSPackage,\n 'packageName' | 'version' | 'description'\n> & {\n version?: string;\n};\n\nfunction readJson(file: string): unknown {\n return JSON.parse(fs.readFileSync(file, 'utf-8'));\n}\n\n/**\n * Read the walkerOS metadata of a resolved step package. A local path\n * resolves against `configDir`; without one nothing is read from disk and\n * the read fails. `client` names the calling tool in the CDN request.\n */\nexport async function readStepPackageInfo(\n resolved: Pick<ResolvedStepPackage, 'packageName' | 'spec'>,\n options: { configDir?: string; client: string },\n): Promise<StepPackageInfo> {\n const { packageName, spec } = resolved;\n if (spec.path === undefined)\n return fetchPackage(packageName, {\n ...(spec.version ? { version: spec.version } : {}),\n client: options.client,\n });\n\n if (options.configDir === undefined)\n throw new Error(\n 'it is a local path package and the input is not a file, so there is no directory to read it from',\n );\n const root = path.isAbsolute(spec.path)\n ? spec.path\n : path.resolve(options.configDir, spec.path);\n const file = [\n path.join(root, 'dist', 'walkerOS.json'),\n path.join(root, 'walkerOS.json'),\n ].find((candidate) => fs.existsSync(candidate));\n if (!file) throw new Error(`no walkerOS.json under ${root}`);\n const meta = readJson(file);\n if (!isObject(meta)) throw new Error(`${file} is not a JSON object`);\n const pkgFile = path.join(root, 'package.json');\n const pkg = fs.existsSync(pkgFile) ? readJson(pkgFile) : undefined;\n const version =\n isObject(pkg) && typeof pkg.version === 'string' ? pkg.version : undefined;\n return { ...parseWalkerOSJson(meta), ...(version ? { version } : {}) };\n}\n","// walkerOS/packages/cli/src/commands/validate/validators/mapping.ts\n\nimport { isObject } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport type {\n ValidateDetails,\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst { RuleSchema } = schemas.MappingSchemas;\n\nfunction isRule(value: unknown): boolean {\n return isObject(value) && RuleSchema.safeParse(value).success;\n}\n\n/**\n * The nested runtime shape: an entity key whose value maps actions to a rule\n * or a list of rules (`{ page: { view: { name: 'page_view' } } }`).\n */\nfunction isNestedActions(\n key: string,\n value: unknown,\n): value is Record<string, unknown> {\n if (key.includes(' ') || !isObject(value)) return false;\n const rules = Object.values(value);\n return (\n rules.length > 0 &&\n rules.every((rule) =>\n Array.isArray(rule)\n ? rule.length > 0 && rule.every(isRule)\n : isRule(rule),\n )\n );\n}\n\nexport function validateMapping(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: ValidateDetails = {};\n\n // Must be an object\n if (!isObject(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;\n const nestedPatterns: string[] = [];\n const flatPatterns: string[] = [];\n for (const [key, value] of Object.entries(mapping)) {\n if (isNestedActions(key, value)) {\n for (const action of Object.keys(value))\n nestedPatterns.push(`${key} ${action}`);\n } else {\n flatPatterns.push(key);\n }\n }\n const patterns = [...nestedPatterns, ...flatPatterns];\n details.eventPatterns = patterns;\n details.patternCount = patterns.length;\n\n // Validate each flat \"entity action\" pattern (legacy flat shape)\n flatPatterns.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 !== flatPatterns.length - 1) {\n warnings.push({\n path: '*',\n code: 'CATCH_ALL_NOT_LAST',\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 { describeScope, isFlowJson, resolveScope } from '../scope.js';\nimport type {\n ValidateDeferred,\n ValidateResult,\n ValidateSkip,\n ValidationError,\n} from '../types.js';\nimport { resolveFlow, type FlowResolution } from './resolve.js';\nimport {\n checkStepSettings,\n createSettingsContext,\n type CheckedPackage,\n} from './settings.js';\n\n/**\n * Validate an entry (source, destination, transformer or store) addressed by\n * `path` (`section.key` or `key`) against its package's published JSON\n * Schema, in every flow that has it, or only in `options.flow`. Settings are\n * checked as the flow resolves them (the placeholder rule); a flow that does\n * not resolve is an error and its entry check a skip.\n */\nexport async function validateEntry(\n path: string,\n flowConfig: unknown,\n options: { flow?: string; configDir?: string } = {},\n): Promise<ValidateResult> {\n const resolved = resolveScope(flowConfig, { flow: options.flow, path });\n const errors: ValidationError[] = [...resolved.errors];\n const skipped: ValidateSkip[] = [];\n const deferred: ValidateDeferred[] = [];\n const packages: CheckedPackage[] = [];\n const context = createSettingsContext(options.configDir);\n const file = isFlowJson(flowConfig) ? flowConfig : undefined;\n const resolutions = new Map<string, FlowResolution>();\n\n for (const target of resolved.entries) {\n const at = `flows.${target.flow}.${target.section}.${target.key}`;\n let resolution = resolutions.get(target.flow);\n if (!resolution && file) {\n resolution = resolveFlow(file, target.flow);\n resolutions.set(target.flow, resolution);\n if (!resolution.ok) errors.push(resolution.error);\n }\n if (!resolution?.ok) {\n skipped.push({\n path: at,\n check: 'entry:settings',\n reason: `flows.${target.flow} does not resolve, so its settings cannot be checked`,\n code: 'GATED_BY_ERRORS',\n });\n continue;\n }\n const outcome = await checkStepSettings(\n target,\n resolution.flow,\n 'entry:settings',\n context,\n );\n errors.push(...outcome.findings);\n skipped.push(...outcome.skipped);\n deferred.push(...outcome.deferred);\n if (outcome.checked) packages.push(outcome.checked);\n }\n\n return {\n valid: errors.length === 0,\n type: 'entry',\n errors,\n warnings: [],\n details: {\n scope: describeScope(resolved, ['entry:settings']),\n skipped,\n deferred,\n ...(packages.length > 0 ? { packages } : {}),\n },\n };\n}\n","// walkerOS/packages/cli/src/commands/validate/types.ts\n\nimport type {\n ValidateResult as CoreValidateResult,\n ValidationError as CoreValidationError,\n ValidationType,\n ValidationWarning as CoreValidationWarning,\n} from '@walkeros/core/dev';\n\n// Base result types are declared in @walkeros/core/dev beside\n// validateFlowStructure, so consumers can type its return without the CLI.\n// The CLI narrows them: every code comes from VALIDATE_CODES, and the\n// details carry the scope, skips and deferred values of the run.\nexport type { ValidateResultType, ValidationType } from '@walkeros/core/dev';\n\n/**\n * Every code an error, warning or skip of `validate` can carry. Agents and\n * tests branch on these, never on message text.\n */\nexport const VALIDATE_CODES = [\n // Input and options\n 'INPUT_ERROR',\n 'SERIALIZATION_ERROR',\n 'OPTION_NOT_APPLICABLE',\n // Scope (--flow, --path)\n 'FLOW_NOT_FOUND',\n 'ENTRY_NOT_FOUND',\n 'AMBIGUOUS_ENTRY',\n 'UNSUPPORTED_SECTION',\n 'INVALID_PATH',\n // Flow file\n 'SCHEMA_VALIDATION',\n 'CONFIG_WARNING',\n 'EMPTY_FLOWS',\n 'UNKNOWN_KEY',\n 'CONFLICT',\n 'MISSING_PACKAGE',\n 'OBSOLETE_CODE_STRING',\n 'INVALID_IMPORT',\n 'INVALID_CODE_SHAPE',\n 'PACKAGE_VERSION_MISSING',\n 'DEPRECATED_PACKAGE',\n 'UNKNOWN_ROUTE_TARGET',\n 'ROUTE_DEAD_CODE',\n 'ROUTE_EMPTY_MANY',\n 'ROUTE_SINGLE_MANY',\n 'ROUTE_FIRST_MATCH',\n 'INCOMPATIBLE_EXAMPLES',\n 'EXAMPLES_INCOMPLETE',\n 'CONTRACT_VIOLATION',\n 'MAPPING_DOT_KEY',\n 'FLOW_REF_WARNING',\n 'WEB_LOGGER_FORMAT',\n 'FLOW_CYCLE',\n 'VAR_CYCLE',\n // Structure (the bundler's own preflight, validateFlowStructure)\n 'INVALID_COMPONENT_NAME',\n 'INVALID_REFERENCE',\n 'STORE_REFERENCE_NOT_FOUND',\n 'STATE_STORE_UNKNOWN',\n 'STATE_STORE_FILE',\n 'MAPPING_NO_OP',\n 'MAPPING_VALUE_NO_OPERATOR',\n 'MAPPING_VALUE_PRODUCERS',\n 'BATCH_WITHOUT_PUSH_BATCH',\n 'MALFORMED_REFERENCE',\n // Resolution (getFlowSettings, as the bundler resolves the flow)\n 'UNRESOLVED_REFERENCE',\n 'MISSING_ENV',\n 'WEB_SECRET_REF',\n 'UNRESOLVED_CONTRACT',\n // Entry settings against the package schema\n 'ENTRY_SCHEMA',\n // Contract\n 'NO_CONTRACT_SECTION',\n 'INVALID_CONTRACT',\n 'FLAT_CONTRACT_SHAPE',\n 'INVALID_CONTRACT_ENTRY',\n 'UNKNOWN_CONTRACT_KEY',\n 'INVALID_TAGGING',\n 'INVALID_SCHEMA',\n 'INVALID_EXTENDS',\n 'INVALID_EVENTS',\n 'CIRCULAR_EXTENDS',\n 'INVALID_ENTITY_KEY',\n 'INVALID_ENTITY',\n 'INVALID_ACTION_KEY',\n 'INVALID_SCHEMA_ENTRY',\n // Event\n 'NOT_AN_OBJECT',\n 'MISSING_EVENT_NAME',\n 'EMPTY_EVENT_NAME',\n 'INVALID_EVENT_NAME',\n // Mapping\n 'INVALID_MAPPING_TYPE',\n 'INVALID_EVENT_PATTERN',\n 'INVALID_RULE_TYPE',\n 'CATCH_ALL_NOT_LAST',\n // Skips (details.skipped[].code)\n 'GATED_BY_ERRORS',\n 'CONTRACT_NOT_STATIC',\n 'NO_PACKAGE',\n 'NO_SETTINGS_SCHEMA',\n 'SCHEMA_UNAVAILABLE',\n] as const;\n\nexport type ValidateCode = (typeof VALIDATE_CODES)[number];\n\n/** Codes that mean validate could not run as asked (CLI exit 3). */\nexport const USAGE_CODES: readonly ValidateCode[] = ['OPTION_NOT_APPLICABLE'];\n\n/**\n * Named checks a run includes (`details.scope.checks`). `file:` checks run\n * on the whole file whatever `--flow` says; `flow:` checks run per flow in\n * scope; `entry:` checks run per entry `--path` addressed.\n */\nexport type ValidateCheck =\n | 'file:schema'\n | 'file:contract'\n | 'flow:schema'\n | 'flow:steps'\n | 'flow:structure'\n | 'flow:package-versions'\n | 'flow:routes'\n | 'flow:examples'\n | 'flow:contract-examples'\n | 'flow:mapping-keys'\n | 'flow:resolve'\n | 'flow:package-settings'\n | 'entry:settings'\n | 'contract'\n | 'event'\n | 'mapping';\n\nexport interface ValidateScopeEntry {\n /** Section of the addressed entry, when the path or the match names one. */\n section?: string;\n key: string;\n /** Flows that have the entry and were checked. */\n flows: string[];\n /** Flows searched for the entry. */\n searchedFlows: string[];\n}\n\n/** What a run covered (C6). */\nexport interface ValidateScope {\n flows: string[];\n entry?: ValidateScopeEntry;\n checks: ValidateCheck[];\n /** Set when `offline` removed the package settings check from `checks`. */\n offline?: true;\n}\n\n/** A check the scope includes that did not run (C5). */\nexport interface ValidateSkip {\n path: string;\n check: ValidateCheck;\n reason: string;\n code: ValidateCode;\n}\n\n/** A value known only at runtime, not schema-checked (info, not a skip). */\nexport interface ValidateDeferred {\n path: string;\n reference: string;\n}\n\nexport interface ValidateDetails {\n scope?: ValidateScope;\n skipped?: ValidateSkip[];\n deferred?: ValidateDeferred[];\n [key: string]: unknown;\n}\n\n// `code` stays core's `string` for consumers; validate emits only\n// ValidateCode values.\nexport interface ValidationError extends CoreValidationError {\n /** The JSON Schema keyword of an ENTRY_SCHEMA error. */\n keyword?: string;\n}\n\nexport interface ValidationWarning extends CoreValidationWarning {\n keyword?: string;\n}\n\nexport interface ValidateResult extends CoreValidateResult {\n errors: ValidationError[];\n warnings: ValidationWarning[];\n details: ValidateDetails;\n}\n\nexport interface ValidateCommandOptions {\n type: ValidationType;\n input?: string;\n output?: string;\n flow?: string; // Flow name for multi-flow configs\n path?: string; // Entry path for dot-notation validation (e.g., \"destinations.snowplow\")\n json?: boolean;\n verbose?: boolean;\n strict?: boolean;\n /** Skip every package settings check (no network); named in the scope. */\n offline?: boolean;\n silent?: boolean;\n}\n","import { z } from 'zod';\nimport { handleCliError } from '../../core/api-error.js';\nimport { appErrorMessage, appFetch } from '../../core/app-fetch.js';\nimport { APP_PATHS } from '../../core/app-paths.js';\nimport { resolveAccessToken } from '../../core/auth.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\nimport { NOT_SIGNED_IN } from '../api/index.js';\n\n// === Programmatic API ===\n\n/** The parsed JSON body, or null when the body is not JSON. */\nasync function readJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return null;\n }\n}\n\n/** Who the current credential belongs to, as the app answers it. */\nexport async function whoami(): Promise<unknown> {\n const token = resolveAccessToken();\n if (!token) throw new Error(NOT_SIGNED_IN);\n const response = await appFetch(APP_PATHS.whoami, { token });\n const body = await readJson(response);\n if (!response.ok)\n throw new Error(appErrorMessage(body) ?? `HTTP ${response.status}`);\n return body;\n}\n\n// === CLI Command Handler ===\n\nconst IdentitySchema = z.object({\n email: z.string().optional(),\n userId: z.string().optional(),\n});\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 identity = IdentitySchema.safeParse(result);\n if (!identity.success) {\n logger.info(JSON.stringify(result));\n return;\n }\n const data = identity.data;\n if (data.email) logger.info(data.email);\n if (data.userId) logger.info(`User: ${data.userId}`);\n }\n } catch (error) {\n handleCliError(error);\n }\n}\n","export interface ApiErrorDetail {\n path: string;\n message: string;\n}\n\nexport interface ApiErrorOptions {\n code?: string;\n details?: ApiErrorDetail[];\n // HTTP status of the failed response, when known.\n status?: number;\n // True when the failure is worth retrying (e.g. 429 / 503 with Retry-After).\n retryable?: boolean;\n // Seconds to wait before retrying, parsed from the Retry-After header.\n retryAfterSeconds?: number;\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\n// Exit code for a retryable failure (e.g. rate limited). Distinct from the\n// generic failure (1) and upgrade-required (2) so CI can branch on it.\n// Mirrors the BSD sysexits.h EX_TEMPFAIL convention.\nexport const EXIT_RETRYABLE = 75;\n\nexport class ApiError extends Error {\n code?: string;\n details?: ApiErrorDetail[];\n status?: number;\n retryable?: boolean;\n retryAfterSeconds?: number;\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.status = options?.status;\n this.retryable = options?.retryable;\n this.retryAfterSeconds = options?.retryAfterSeconds;\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 * Emit a stable, parseable machine-readable error line so CI can branch on\n * the failure without string-matching prose. Format:\n *\n * error: code=<CODE> retryable=<bool>[ retryAfter=<seconds>] message=<text>\n *\n * `code` is `UNKNOWN` for non-ApiError failures. The line always starts with\n * `error: code=` and the human-readable message comes last.\n */\nfunction machineReadableErrorLine(err: unknown): string {\n const code = err instanceof ApiError ? (err.code ?? 'UNKNOWN') : 'UNKNOWN';\n const retryable = err instanceof ApiError ? err.retryable === true : false;\n const retryAfter =\n err instanceof ApiError && err.retryAfterSeconds !== undefined\n ? ` retryAfter=${err.retryAfterSeconds}`\n : '';\n const message = err instanceof Error ? err.message : String(err);\n return `error: code=${code} retryable=${retryable}${retryAfter} message=${message}`;\n}\n\n/**\n * Pretty-print an error and exit. Always prints a machine-readable code line\n * first (see `machineReadableErrorLine`). Recognises `ApiError` with\n * `code === 'CLIENT_OUTDATED'` as a dedicated upgrade-required path\n * (exit code 2) and prints the upgrade and docs links. Retryable failures\n * (e.g. rate limited) exit with `EXIT_RETRYABLE` (75). Everything else\n * exits 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 console.error(machineReadableErrorLine(err));\n\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\n if (err instanceof ApiError && err.retryable) {\n const hint =\n err.retryAfterSeconds !== undefined\n ? ` Retry after ${err.retryAfterSeconds}s.`\n : ' This is temporary, retry shortly.';\n console.error(`${err.message}${hint}`);\n process.exit(EXIT_RETRYABLE);\n }\n\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n /* eslint-enable no-console */\n}\n","import { z } from 'zod';\nimport { resolveAppUrl } from '../lib/config-file.js';\nimport { requireSecureUrl } from '../lib/secure-url.js';\nimport { clientContextHeaders } from './client-context.js';\n\nexport interface AppFetchInit {\n method?: string;\n /** The app, default `resolveAppUrl()`; trailing slashes are trimmed. */\n baseUrl?: string;\n /** Sent as `Authorization: Bearer <token>` unless the caller set Authorization. */\n token?: string | null;\n headers?: Readonly<Record<string, string>>;\n body?: string;\n signal?: AbortSignal;\n redirect?: RequestRedirect;\n fetch?: typeof fetch;\n}\n\nconst AppErrorSchema = z.object({\n error: z.object({ message: z.string().min(1) }),\n});\n\n/** The message of the app's error envelope `{ error: { message } }`, or undefined. */\nexport function appErrorMessage(body: unknown): string | undefined {\n const parsed = AppErrorSchema.safeParse(body);\n return parsed.success ? parsed.data.error.message : undefined;\n}\n\n/**\n * Call the walkerOS app. Every request carries the client-context headers\n * (`User-Agent`, `X-WalkerOS-Client`, `X-WalkerOS-Client-Version`); caller\n * headers win over them; a request carrying Authorization goes only to a\n * secure URL (`requireSecureUrl`). `path` starts with `/` and may carry a query.\n */\nexport async function appFetch(\n path: string,\n init: AppFetchInit = {},\n): Promise<Response> {\n const url = `${(init.baseUrl ?? resolveAppUrl()).replace(/\\/+$/, '')}${path}`;\n const headers = new Headers(clientContextHeaders());\n for (const [name, value] of Object.entries(init.headers ?? {}))\n headers.set(name, value);\n if (init.token && !headers.has('Authorization'))\n headers.set('Authorization', `Bearer ${init.token}`);\n if (headers.has('Authorization')) requireSecureUrl(url);\n const request: RequestInit = { headers };\n if (init.method && init.method !== 'GET') request.method = init.method;\n if (init.body !== undefined) request.body = init.body;\n if (init.signal) request.signal = init.signal;\n if (init.redirect) request.redirect = init.redirect;\n return (init.fetch ?? fetch)(url, request);\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n chmodSync,\n renameSync,\n} from 'fs';\nimport { randomBytes } from 'crypto';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\n/**\n * The CLI's own settings. It holds no credential: the CLI authenticates with\n * WALKEROS_TOKEN only, and sign-in fields an older CLI left in the file are\n * never read.\n */\nexport interface WalkerOSConfig {\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 * Replace the config file wholesale, atomically and with 0600 permissions.\n *\n * A reader that catches the file mid-write would see truncated JSON and treat\n * the file as missing, so the content is written to a temp file and renamed,\n * which is atomic within a directory.\n *\n * The temp path is unique per write. Nothing locks the file, so two writers\n * (two `telemetry` commands, say) can be in here at once: on one shared name\n * they would write over each other's temp file and rename it twice, and the\n * slower one would fail outright when the faster renamed the file out from\n * under its `chmod`.\n */\nfunction replaceConfigFile(config: WalkerOSConfig): void {\n const dir = getConfigDir();\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n\n const configPath = getConfigPath();\n const tempPath = `${configPath}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`;\n try {\n writeFileSync(tempPath, JSON.stringify(config, null, 2), { mode: 0o600 });\n // `writeFileSync`'s mode is masked by the process umask, so it alone does\n // not guarantee 0600 on the file the rename puts in place.\n chmodSync(tempPath, 0o600);\n renameSync(tempPath, configPath);\n } catch (error) {\n // A unique name is never reused, so a temp left behind by a failure would\n // sit in the config directory forever.\n try {\n unlinkSync(tempPath);\n } catch {\n // Never created, or already renamed into place.\n }\n throw error;\n }\n}\n\n/**\n * Merge `config` into the stored config and write the result.\n *\n * Merging rather than replacing, because the file holds fields owned by\n * unrelated commands: a writer that knows only about telemetry would otherwise\n * drop `appUrl`, `defaultProjectId` and `anonymousFeedback`.\n *\n * A key passed explicitly as `undefined` is removed from the written file.\n */\nexport function writeConfig(config: WalkerOSConfig): void {\n replaceConfigFile({ ...(readConfig() ?? {}), ...config });\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 writeConfig(partial);\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","/**\n * Whether a host is the local machine.\n *\n * Loopback traffic never reaches a network segment, so there is nobody in the\n * path to read a token off it. RFC 8252 section 8.3 and OAuth 2.1 both carve\n * out exactly this case, and `http://localhost:3000` is the documented\n * walkerOS development flow.\n */\nfunction isLoopback(hostname: string): boolean {\n // `URL` lowercases the hostname and keeps the brackets on an IPv6 literal.\n return (\n hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '[::1]'\n );\n}\n\n/**\n * Refuse a URL that would carry a walkerOS credential in the clear.\n *\n * Every bearer the CLI holds (session, refresh, deploy) is sent to whatever\n * host the app URL names, and that string is user-settable: `WALKEROS_APP_URL`,\n * the config file, and `--url` all feed it. Over plain http to a remote host,\n * anything on the path reads the token.\n *\n * Applied where a credential is ATTACHED, never inside `resolveAppUrl`. That\n * resolver is the tempting single funnel, but it also feeds the paths that\n * merely REPORT the target: telemetry resolves it under a top-level await\n * with no `try`, and diagnostics and the health probe exist to NAME a bad\n * app URL. A resolver that throws poisons the error reporting.\n *\n * Returns the URL, so a caller can pass its value straight through. A string\n * that is not a URL at all is returned untouched: it fails at the request\n * itself, and inferring a scheme for it would only hide that.\n */\nexport function requireSecureUrl(url: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return url;\n }\n\n if (parsed.protocol !== 'http:' || isLoopback(parsed.hostname)) return url;\n\n throw new Error(\n `Refusing to send walkerOS credentials over plain http to ${url}. ` +\n 'Use https, or localhost / 127.0.0.1 / [::1] for local development.',\n );\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 does not, so its\n * requests carry no client headers.\n * The `WALKEROS_CLIENT_TYPE` env var overrides the resolved type (env wins\n * 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.\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","/**\n * The app operations the CLI itself calls: identity, health, telemetry and\n * the public API document. The app keeps every one in its public API set, so\n * its change rule protects them. The only file in the CLI that names an app\n * path; `walkeros api` takes its path from the person.\n */\nexport const APP_PATHS = {\n whoami: '/api/auth/whoami',\n health: '/api/health',\n telemetry: '/api/telemetry',\n openapi: '/api/openapi.json',\n} as const;\n","import { once } from 'node:events';\nimport { readFile } from 'node:fs/promises';\nimport type { Command, CommanderError } from 'commander';\nimport { z } from 'zod';\nimport { appErrorMessage, appFetch } from '../../core/app-fetch.js';\nimport { APP_PATHS } from '../../core/app-paths.js';\nimport { resolveAccessToken } from '../../core/auth.js';\nimport { fetchFailureReason } from '../../core/fetch-failure.js';\nimport { readStdin } from '../../core/stdin.js';\nimport { resolveAppUrl } from '../../lib/config-file.js';\nimport { requireSecureUrl } from '../../lib/secure-url.js';\n\n/**\n * `walkeros api <METHOD> <path>`: one authenticated request to the walkerOS\n * app, its answer copied to stdout as it arrives. The CLI knows no operation\n * of the app beyond its own fixed ones; the person names the path.\n */\n\nexport const EXIT = {\n ok: 0,\n http: 1,\n usage: 2,\n auth: 3,\n unreachable: 4,\n} as const;\nexport type ApiExit = (typeof EXIT)[keyof typeof EXIT];\n\nexport interface ApiCommandIO {\n stdout: NodeJS.WritableStream;\n stderr: NodeJS.WritableStream;\n stdin: NodeJS.ReadableStream;\n}\n\nexport interface ApiRequestOptions {\n method: string;\n /** Starts with `/`; query parameters ride in it. */\n path: string;\n /** `'<json>'`, `'@file.json'` or `'-'` (stdin). */\n data?: string;\n /** Each `'Name: value'`; repeatable. */\n header: string[];\n /** Fills `{projectId}`; falls back to WALKEROS_PROJECT_ID. */\n project?: string;\n yes?: boolean;\n}\n\n/** Shown when there is no credential to send. */\nexport const NOT_SIGNED_IN =\n 'no token: set WALKEROS_TOKEN to a token from Account > Automation tokens in the walkerOS app';\n\nconst METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);\n/** Error bodies are read back for the stderr line; a bigger one is not parsed. */\nconst ERROR_BODY_LIMIT = 64 * 1024;\n\nclass UsageError extends Error {}\n\nfunction defaultIO(): ApiCommandIO {\n return {\n stdout: process.stdout,\n stderr: process.stderr,\n stdin: process.stdin,\n };\n}\n\nfunction line(out: NodeJS.WritableStream, text: string): void {\n out.write(`walkeros api: ${text}\\n`);\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction parseJson(text: string): unknown {\n try {\n const value: unknown = JSON.parse(text);\n return value;\n } catch {\n return undefined;\n }\n}\n\n/** The origin of a URL for a message, or the URL itself when it is not one. */\nfunction originOf(url: string): string {\n try {\n return new URL(url).origin;\n } catch {\n return url;\n }\n}\n\nfunction fillPath(path: string, project: string | undefined): string {\n if (!path.startsWith('/'))\n throw new UsageError(`the path must start with /: ${path}`);\n let filled = path;\n if (filled.includes('{projectId}')) {\n if (!project)\n throw new UsageError(\n '{projectId} needs --project or WALKEROS_PROJECT_ID',\n );\n filled = filled.split('{projectId}').join(encodeURIComponent(project));\n }\n const left = /\\{[^}]+\\}/.exec(filled);\n if (left) throw new UsageError(`fill ${left[0]} in the path`);\n return filled;\n}\n\nfunction parseHeaders(values: readonly string[]): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const value of values) {\n const colon = value.indexOf(':');\n if (colon <= 0) throw new UsageError(`a header is 'Name: value': ${value}`);\n const name = value.slice(0, colon).trim();\n if (name.toLowerCase() === 'authorization')\n throw new UsageError(\n 'set the token with WALKEROS_TOKEN, not with an Authorization header',\n );\n headers[name] = value.slice(colon + 1).trim();\n }\n return headers;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n const lower = name.toLowerCase();\n return Object.keys(headers).some((key) => key.toLowerCase() === lower);\n}\n\n/** The body as given: the argument, a file's content, or stdin. */\nasync function readData(\n data: string,\n stdin: NodeJS.ReadableStream,\n): Promise<string> {\n if (data === '-') {\n try {\n return await readStdin(stdin);\n } catch (error) {\n throw new UsageError(`--data -: ${messageOf(error)}`);\n }\n }\n if (data.startsWith('@')) {\n const file = data.slice(1);\n try {\n return await readFile(file, 'utf-8');\n } catch (error) {\n throw new UsageError(\n `cannot read the --data file ${file}: ${messageOf(error)}`,\n );\n }\n }\n return data;\n}\n\ninterface PreparedRequest {\n method: string;\n path: string;\n headers: Record<string, string>;\n body?: string;\n}\n\n/** Every usage check, in order, before anything is resolved or sent. */\nasync function prepare(\n options: ApiRequestOptions,\n stdin: NodeJS.ReadableStream,\n): Promise<PreparedRequest> {\n const method = options.method.toUpperCase();\n if (!METHODS.has(method))\n throw new UsageError(\n `unknown method ${options.method}: use GET, POST, PUT, PATCH or DELETE`,\n );\n if (method === 'DELETE' && !options.yes)\n throw new UsageError('DELETE needs --yes');\n if (method === 'GET' && options.data !== undefined)\n throw new UsageError('GET takes no --data');\n const path = fillPath(\n options.path,\n options.project || process.env.WALKEROS_PROJECT_ID,\n );\n const headers = parseHeaders(options.header);\n if (options.data === undefined) return { method, path, headers };\n const body = await readData(options.data, stdin);\n if (!hasHeader(headers, 'Content-Type'))\n headers['Content-Type'] = 'application/json';\n return { method, path, headers, body };\n}\n\n/** Copy the answer to stdout as it arrives; keep an error body for the stderr line. */\nasync function relay(response: Response, io: ApiCommandIO): Promise<ApiExit> {\n const kept: Uint8Array[] = [];\n let keptBytes = 0;\n try {\n const reader = response.body?.getReader();\n for (;;) {\n if (!reader) break;\n const { done, value } = await reader.read();\n if (done) break;\n if (!io.stdout.write(value)) await once(io.stdout, 'drain');\n if (!response.ok && keptBytes < ERROR_BODY_LIMIT) {\n kept.push(value);\n keptBytes += value.byteLength;\n }\n }\n } catch (error) {\n line(\n io.stderr,\n `the connection broke while reading the answer: ${fetchFailureReason(error)}`,\n );\n return EXIT.unreachable;\n }\n if (response.ok) return EXIT.ok;\n const message = appErrorMessage(\n parseJson(Buffer.concat(kept).toString('utf-8')),\n );\n line(\n io.stderr,\n `HTTP ${response.status} ${response.statusText}`.trimEnd() +\n (message ? `: ${message}` : ''),\n );\n return response.status === 401 ? EXIT.auth : EXIT.http;\n}\n\n/**\n * Send one request to the app and print its answer. Exit 0 for 2xx, 1 for any\n * other status, 2 for a usage error (nothing sent), 3 without a credential or\n * on 401, 4 when the app cannot be reached or the answer breaks off.\n */\nexport async function runApi(\n options: ApiRequestOptions,\n io: ApiCommandIO = defaultIO(),\n): Promise<ApiExit> {\n let request: PreparedRequest;\n try {\n request = await prepare(options, io.stdin);\n } catch (error) {\n if (!(error instanceof UsageError)) throw error;\n line(io.stderr, error.message);\n return EXIT.usage;\n }\n\n const token = resolveAccessToken();\n if (!token) {\n line(io.stderr, NOT_SIGNED_IN);\n return EXIT.auth;\n }\n\n const appUrl = resolveAppUrl();\n try {\n requireSecureUrl(`${appUrl.replace(/\\/+$/, '')}${request.path}`);\n } catch (error) {\n line(io.stderr, messageOf(error));\n return EXIT.usage;\n }\n\n let response: Response;\n try {\n response = await appFetch(request.path, {\n method: request.method,\n baseUrl: appUrl,\n token,\n headers: request.headers,\n body: request.body,\n });\n } catch (error) {\n line(\n io.stderr,\n `could not reach ${originOf(appUrl)}: ${fetchFailureReason(error)}`,\n );\n return EXIT.unreachable;\n }\n return relay(response, io);\n}\n\nexport interface ApiOperation {\n /** Upper case. */\n method: string;\n path: string;\n summary?: string;\n description?: string;\n parameters?: unknown[];\n requestBody?: unknown;\n responses?: Record<string, unknown>;\n}\n\nexport interface ApiListOptions {\n filter?: string;\n json?: boolean;\n}\n\nconst OPERATION_METHODS = [\n 'get',\n 'put',\n 'post',\n 'delete',\n 'patch',\n 'head',\n 'options',\n] as const;\n\nconst DocumentSchema = z.object({\n paths: z.record(z.string(), z.record(z.string(), z.unknown())),\n components: z\n .record(z.string(), z.record(z.string(), z.unknown()))\n .optional(),\n});\n\nconst OperationSchema = z.object({\n summary: z.string().optional(),\n description: z.string().optional(),\n parameters: z.array(z.unknown()).optional(),\n requestBody: z.unknown().optional(),\n responses: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst COMPONENT_REF = /^#\\/components\\/([^/]+)\\/([^/]+)$/;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Every operation of an OpenAPI document, sorted by path, then method. */\nexport function listOperations(document: unknown): ApiOperation[] {\n const parsed = DocumentSchema.safeParse(document);\n if (!parsed.success) return [];\n const operations: ApiOperation[] = [];\n for (const [path, item] of Object.entries(parsed.data.paths)) {\n for (const method of OPERATION_METHODS) {\n if (!(method in item)) continue;\n const operation = OperationSchema.safeParse(item[method]);\n if (!operation.success) continue;\n operations.push({\n method: method.toUpperCase(),\n path,\n ...operation.data,\n });\n }\n }\n const order = (a: string, b: string): number => (a < b ? -1 : a > b ? 1 : 0);\n return operations.sort(\n (a, b) => order(a.path, b.path) || order(a.method, b.method),\n );\n}\n\n/** Operations whose `METHOD /path summary` contains the filter, case-insensitive. */\nexport function filterOperations(\n operations: ApiOperation[],\n filter?: string,\n): ApiOperation[] {\n if (!filter) return operations;\n const needle = filter.toLowerCase();\n return operations.filter((operation) =>\n `${operation.method} ${operation.path} ${operation.summary ?? ''}`\n .toLowerCase()\n .includes(needle),\n );\n}\n\n/** The components the operations reference (`#/components/<kind>/<name>`), followed transitively. */\nexport function referencedComponents(\n document: unknown,\n operations: ApiOperation[],\n): Record<string, Record<string, unknown>> {\n const parsed = DocumentSchema.safeParse(document);\n const available = (parsed.success && parsed.data.components) || {};\n const found: Record<string, Record<string, unknown>> = {};\n const visited = new Set<string>();\n const queue: unknown[] = [...operations];\n for (let index = 0; index < queue.length; index += 1) {\n const value = queue[index];\n if (Array.isArray(value)) {\n queue.push(...value);\n continue;\n }\n if (!isRecord(value)) continue;\n for (const [key, child] of Object.entries(value)) {\n if (key !== '$ref' || typeof child !== 'string') {\n queue.push(child);\n continue;\n }\n const match = COMPONENT_REF.exec(child);\n if (!match || visited.has(child)) continue;\n visited.add(child);\n const [, kind, name] = match;\n const component = available[kind]?.[name];\n if (component === undefined) continue;\n found[kind] = { ...found[kind], [name]: component };\n queue.push(component);\n }\n }\n return found;\n}\n\nfunction formatOperation(operation: ApiOperation): string {\n const summary = operation.summary ? ` ${operation.summary}` : '';\n return `${operation.method.padEnd(6)} ${operation.path}${summary}`;\n}\n\n/**\n * List the operations of the app's live public API document. Exit 0 (also\n * when nothing matches), 1 for a non-2xx answer or a body that is not an\n * OpenAPI document, 4 when the app cannot be reached.\n */\nexport async function runApiList(\n options: ApiListOptions,\n io: Pick<ApiCommandIO, 'stdout' | 'stderr'> = defaultIO(),\n): Promise<ApiExit> {\n const appUrl = resolveAppUrl();\n let text: string;\n try {\n const response = await appFetch(APP_PATHS.openapi, { baseUrl: appUrl });\n if (!response.ok) {\n line(\n io.stderr,\n `HTTP ${response.status} ${response.statusText}`.trimEnd() +\n ` for ${APP_PATHS.openapi}`,\n );\n return EXIT.http;\n }\n text = await response.text();\n } catch (error) {\n line(\n io.stderr,\n `could not reach ${originOf(appUrl)}: ${fetchFailureReason(error)}`,\n );\n return EXIT.unreachable;\n }\n\n const document = parseJson(text);\n if (!DocumentSchema.safeParse(document).success) {\n line(io.stderr, 'the answer is not an OpenAPI document (no paths)');\n return EXIT.http;\n }\n\n const operations = filterOperations(listOperations(document), options.filter);\n if (operations.length === 0) {\n line(io.stderr, `no operation matches \"${options.filter ?? ''}\"`);\n return EXIT.ok;\n }\n\n io.stdout.write(\n options.json\n ? JSON.stringify(\n {\n operations,\n components: referencedComponents(document, operations),\n },\n null,\n 2,\n ) + '\\n'\n : operations\n .map((operation) => formatOperation(operation) + '\\n')\n .join(''),\n );\n return EXIT.ok;\n}\n\nconst OptionsSchema = z.object({\n data: z.string().optional(),\n header: z.array(z.string()).default([]),\n project: z.string().optional(),\n yes: z.boolean().optional(),\n});\n\nconst collect = (value: string, previous: string[]): string[] => [\n ...previous,\n value,\n];\n\nexport function registerApiCommand(\n program: Command,\n exit: (code: number) => never = (code) => process.exit(code),\n): void {\n const usageExit = (error: CommanderError): never =>\n exit(error.exitCode === 0 ? 0 : EXIT.usage);\n const api = program\n .command('api')\n .description(\n 'Send an authenticated request to the walkerOS app API and print the answer as it arrives',\n )\n .argument('<method>', 'GET, POST, PUT, PATCH or DELETE')\n .argument(\n '<path>',\n 'the API path with its query, for example /api/projects/{projectId}/flows',\n )\n .option(\n '-d, --data <body>',\n 'request body: JSON, @file.json, or - for stdin',\n )\n .option(\n '-H, --header <header>',\n \"extra header 'Name: value' (repeatable)\",\n collect,\n [],\n )\n .option(\n '-p, --project <id>',\n 'fills {projectId} (default: WALKEROS_PROJECT_ID)',\n )\n .option('-y, --yes', 'confirm a DELETE')\n .exitOverride(usageExit)\n .action(async (method: string, path: string, raw: unknown) => {\n const options = OptionsSchema.parse(raw);\n process.exitCode = await runApi({ method, path, ...options });\n });\n\n api\n .command('ls [filter]')\n .description(\n 'List the public API operations from the live OpenAPI document of the app',\n )\n .option('--json', 'print each operation with its parameters and schemas')\n .exitOverride(usageExit)\n .action(async (filter: string | undefined, raw: unknown) => {\n const { json } = z.object({ json: z.boolean().optional() }).parse(raw);\n process.exitCode = await runApiList({ filter, json });\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","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","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 { validateCommand } from './commands/validate/index.js';\nexport { whoamiCommand } from './commands/auth/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 { buildDataPayload } from './commands/bundle/bundler.js';\nexport {\n classifyStepProperties,\n containsCodeMarkers,\n} from './commands/bundle/config-classifier.js';\nexport { validateFlowStructure } from '@walkeros/core/dev';\nexport { wrapSkeleton } from './commands/bundle/wrap.js';\nexport {\n runBuildManifest,\n resolveManifestSource,\n BUILD_MANIFEST_ENV,\n} from './commands/bundle/manifest.js';\nexport type { RunBuildManifestResult } from './commands/bundle/manifest.js';\nexport {\n BUILD_MANIFEST_VERSION,\n BUILD_ERROR_CODES,\n BuildManifestSchema,\n BuildArtifactSchema,\n BuildBundleArtifactSchema,\n BuildWrapArtifactSchema,\n BuildWrapOptionsSchema,\n BuildResultSchema,\n} from './schemas/build-manifest.js';\nexport type {\n BuildManifest,\n BuildArtifact,\n BuildWrapOptions,\n BuildResult,\n BuildErrorCode,\n} from './schemas/build-manifest.js';\nexport type { WrapSkeletonOptions } from './commands/bundle/wrap.js';\nexport {\n push,\n simulateSource,\n simulateTransformer,\n simulateDestination,\n simulateCollector,\n formatPushResult,\n} from './commands/push/index.js';\nexport type {\n SimulateDataOptions,\n SimulateSourceOptions,\n SimulateTransformerOptions,\n SimulateDestinationOptions,\n SimulateCollectorOptions,\n} from './commands/push/index.js';\nexport { validate } from './commands/validate/index.js';\nexport { resolveAccessToken } from './core/auth.js';\nexport { ApiError } 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 { appFetch, appErrorMessage } from './core/app-fetch.js';\nexport type { AppFetchInit } from './core/app-fetch.js';\nexport { APP_PATHS } from './core/app-paths.js';\nexport { whoami } from './commands/auth/index.js';\nexport { readConfig, writeConfig, resolveAppUrl } from './lib/config-file.js';\nexport { VERSION } from './version.js';\nexport type { WalkerOSConfig } from './lib/config-file.js';\n\n// === Utilities ===\n// Export utilities for programmatic usage\nexport { loadConfig, loadJsonConfig } from './config/utils.js';\nexport { collectKnownSecrets } from './core/known-secrets.js';\nexport { resolveExportName } from './core/resolve-export-name.js';\nexport { selectDevExamples } from './commands/push/dev-examples.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 { PushResult } from './commands/push/types.js';\nexport type { PrepareInput, PreparedFlow } from './commands/push/prepare.js';\nexport type { GlobalOptions } from './types/global.js';\nexport type {\n ValidateResult,\n ValidationType,\n ValidationError,\n ValidationWarning,\n ValidateCode,\n ValidateCheck,\n ValidateScope,\n ValidateSkip,\n ValidateDeferred,\n} from './commands/validate/types.js';\nexport { VALIDATE_CODES } from './commands/validate/types.js';\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 { fileURLToPath } from 'url';\nimport fs from 'fs-extra';\nimport * as esbuild from 'esbuild';\nimport {\n cliPackagesPlugin,\n generateWrapEntry,\n generateWrapEntryServer,\n getNodeExternals,\n} from './bundler.js';\nimport type { MoinTarget, ObserveWeb } from '@walkeros/core';\nimport { tmpRunDir } from '../../core/tmp-names.js';\nimport { buildFlagDefines, readNeedsMarker } from './build-flags.js';\nimport type { WrapEntryPreview } 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 /**\n * Browser-only: preview activation wiring. Only host (deploy) wraps set\n * this; the preview-artifact wrap always omits it, per the anti-recursion\n * invariant in `generateWrapEntry`.\n */\n preview?: WrapEntryPreview;\n\n /**\n * Browser-only: preview-ARTIFACT grant injection. The preview-artifact wrap\n * sets this to the server-bound destination keys that should receive the\n * `X-Walkeros-Preview` header read from `localStorage['elbPreviewSession']` at boot.\n * Mutually exclusive with `preview` (a host activates, an artifact injects);\n * passing both throws.\n */\n previewGrantTargets?: string[];\n\n /**\n * Browser-only: STATIC observe connect config baked onto the startFlow\n * config. PUBLIC values only (`url` + `binding`, plus optional\n * `flowId`/`level`/`sample` scoping); the runtime connect module reads the\n * per-session credential out-of-band at boot via the `elbObserve` slot.\n * This is the preview-artifact observation wiring: it bakes no ingest\n * token into the emitted bytes.\n */\n observe?: ObserveWeb;\n\n /**\n * Browser-only: the Tag Mode loader target, internal deploy data the stage\n * app passes like the preview keyring. Absent, the loader trusts the\n * production app.\n */\n moin?: MoinTarget;\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\n/**\n * Extracts the `<pkg>/dev` specifiers from a skeleton's lazy `__devExports`\n * registry by reading its literal `import('<pkg>/dev')` thunks. The registry is\n * the authoritative `/dev` list (it is codegen'd from the same `computeDevPackages`\n * set), so deriving the externals from the skeleton text cannot drift from it.\n * A skeleton with no registry (e.g. a `cdn`-shaped build) yields `[]`.\n */\nexport function extractDevExternals(skeletonText: string): string[] {\n const pattern = /import\\(\\s*['\"]([^'\"]+\\/dev)['\"]\\s*\\)/g;\n const found = new Set<string>();\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(skeletonText)) !== null) {\n found.add(match[1]);\n }\n return Array.from(found);\n}\n\n/**\n * Returns the candidate `node_modules` dirs esbuild should consult for\n * the wrap step's stage 2 entry. We start at this module's own location\n * and walk upward, since the wrap step always runs from inside the CLI\n * package: either via `node_modules/@walkeros/cli/dist/...` or directly\n * from the workspace source tree during tests.\n */\nfunction getNodeResolutionPaths(): string[] {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates: string[] = [];\n let dir = here;\n // Walk up at most 8 levels looking for node_modules dirs.\n for (let i = 0; i < 8; i++) {\n const candidate = path.join(dir, 'node_modules');\n candidates.push(candidate);\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return candidates;\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 // A host bundle activates a preview; a preview artifact injects its grant.\n // Refuse the combination at the app-facing boundary (generateWrapEntry\n // enforces the same invariant) so a caller wiring both surfaces a clear error\n // here rather than a codegen-time throw.\n if (options.preview && options.previewGrantTargets) {\n throw new Error(\n 'wrapSkeleton: `preview` (host activator) and `previewGrantTargets` ' +\n '(preview-artifact injection) are mutually exclusive. Pass at most one.',\n );\n }\n\n // previewOrigin is non-optional on WrapEntryPreview: an empty string is\n // still a config error (it bakes a broken `https:///preview/<art>.js` URL\n // into the bundle), so it must fail the same charset check as a malformed\n // hostname rather than short-circuit past it via falsy-string skip.\n // The typeof gate matters despite the `string` type: an untyped JS/JSON\n // caller can pass undefined, and RegExp.test coerces it to the string\n // \"undefined\", which MATCHES the hostname charset and would bake\n // `https://undefined/preview/…` into the bundle.\n if (\n options.preview &&\n (typeof options.preview.previewOrigin !== 'string' ||\n !/^[a-z0-9.-]+$/.test(options.preview.previewOrigin))\n ) {\n throw new Error(\n `Invalid previewOrigin \"${options.preview.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 // The skeleton's lazy `__devExports` registry carries literal\n // `import('<pkg>/dev')` thunks. The browser wrap inlines step packages, so\n // without externalizing `<pkg>/dev` esbuild would resolve those literals while\n // building the graph: it errors in a lean install where `<pkg>/dev` is absent,\n // or inlines the /dev graph (a deploy-purity violation) where it resolves.\n // Externalizing them makes the wrap skip resolution and lets DCE drop the\n // unreferenced registry. A `cdn`-shaped skeleton has no registry, so this is [].\n const skeletonText = await fs.readFile(absoluteSkeletonPath, 'utf-8');\n const devExternals = extractDevExternals(skeletonText);\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.preview ? { preview: options.preview } : {}),\n ...(options.previewGrantTargets\n ? { previewGrantTargets: options.previewGrantTargets }\n : {}),\n platform,\n ...(options.observe ? { observe: options.observe } : {}),\n ...(options.moin ? { moin: options.moin } : {}),\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 tmpRunDir('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 // Resolve `@walkeros/web-core` (the Tag Mode loader and the preview\n // activator) from the CLI package's own dependency tree and the\n // workspace root. Without this, esbuild looks under the temp entryDir\n // which has no node_modules. The wrap step always runs from inside the\n // CLI process; both the CLI's local node_modules and the workspace root\n // are safe anchors.\n nodePaths: getNodeResolutionPaths(),\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 // Emit the final browser artifact as an IIFE. The deployed bundle is\n // served as a classic <script> at global scope, so an ESM body would leak\n // its minified top-level declarations (e.g. `ga`) onto `window` and\n // collide with globals like Google Analytics. The IIFE wraps everything\n // in a private closure; the intentional `window.elb`/`window.walkerOS`\n // assignments live inside the entry's own async IIFE and reference\n // `window` explicitly, so they still run. The entry has zero exports, so\n // no `globalName` is needed.\n esbuildOptions.format = 'iife';\n // The entry's web-core imports (the Tag Mode loader, the preview\n // activator) come from the CLI's own web-core, never from a copy above\n // the temp dir.\n esbuildOptions.plugins = [cliPackagesPlugin()];\n // Build flags from the needs the skeleton carries. Only a baked observe\n // config adds to them: the recorder runs only for a collector that has\n // one. A skeleton without needs (an older CLI) keeps every flag on.\n const needs = readNeedsMarker(skeletonText);\n esbuildOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n ...buildFlagDefines(\n needs && {\n ...needs,\n observe: needs.observe || options.observe !== undefined,\n },\n ),\n };\n // Externalize `<pkg>/dev` so the wrap skips resolving the lazy registry's\n // literals and DCE drops the unreferenced registry (see above). The node\n // branch needs no equivalent: it inlines step packages and tree-shakes the\n // unreferenced registry away without re-inlining the /dev graph (verified).\n esbuildOptions.external = devExternals;\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","/**\n * `walkeros bundle --manifest <source>`: build from a manifest.\n *\n * Fetches a manifest (see `schemas/build-manifest.ts`), refuses it unless its\n * `toolchain` is this CLI's exact version, builds each artifact in order,\n * PUTs every output to its own URL, and finally PUTs a structured result to\n * `resultPutUrl`. Web `$env` resolves against `manifest.buildEnv` plus the\n * flow's `config.bundle.env`, never against this process's environment.\n *\n * Messages are written for the orchestrator to show a user, so they never\n * carry a URL query string (presigned credentials live there).\n */\n\nimport crypto from 'crypto';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { FlowReferenceError } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { UnsupportedPackageSpecError } from '../../core/package-spec.js';\nimport { loadBundleConfig, type LoadConfigResult } from '../../config/index.js';\nimport { tmpRunDir } from '../../core/tmp-names.js';\nimport { VERSION } from '../../version.js';\nimport {\n BuildManifestSchema,\n type BuildArtifact,\n type BuildErrorCode,\n type BuildManifest,\n type BuildResult,\n} from '../../schemas/build-manifest.js';\nimport { bundle } from './index.js';\nimport { includeApplies } from './bundler.js';\nimport { wrapSkeleton } from './wrap.js';\nimport { fetchWithRetry, type FetchRetryOptions } from './fetch-retry.js';\n\n/** Env var a bare `--manifest` reads its source from. */\nexport const BUILD_MANIFEST_ENV = 'BUILD_MANIFEST_URL';\n\nclass BuildError extends Error {\n constructor(\n readonly code: BuildErrorCode,\n message: string,\n ) {\n super(message);\n this.name = 'BuildError';\n }\n}\n\nconst STEP_SECTIONS = [\n 'sources',\n 'destinations',\n 'transformers',\n 'stores',\n] as const;\n\n/**\n * A manifest build refuses every config-chosen filesystem path: local step\n * packages (`.` or `/` prefixed), `bundle.packages.<name>.path`,\n * `bundle.traceInclude` and, for a server build, `include`. On a laptop\n * those read the user's own disk; in a build job they would read the job's\n * filesystem into the artifact. Checked\n * on the RESOLVED flow, so a `$var` cannot smuggle a path past it. The\n * message names locations only, never the path values.\n */\nfunction assertNoLocalPaths(loaded: LoadConfigResult): void {\n const locations: string[] = [];\n for (const [name, pkg] of Object.entries(loaded.buildOptions.packages)) {\n if (pkg.path !== undefined) {\n locations.push(`config.bundle.packages.${name}.path`);\n }\n }\n if (loaded.buildOptions.traceInclude?.length) {\n locations.push('config.bundle.traceInclude');\n }\n // The default `./shared` probe resolves inside the empty work dir, so a\n // non-empty list here always came from the config's own `include`. A web\n // build never reads it, so it is refused only where it applies.\n if (\n loaded.buildOptions.include?.length &&\n includeApplies(loaded.buildOptions)\n ) {\n locations.push('include');\n }\n for (const section of STEP_SECTIONS) {\n for (const [id, step] of Object.entries(\n loaded.flowSettings[section] ?? {},\n )) {\n const pkg = step.package;\n if (\n typeof pkg === 'string' &&\n (pkg.startsWith('.') || pkg.startsWith('/'))\n ) {\n locations.push(`${section}.${id}.package`);\n }\n }\n }\n if (locations.length > 0) {\n throw new BuildError(\n 'LOCAL_PATH_NOT_ALLOWED',\n `Local filesystem paths are not allowed in a manifest build: ${locations.join(', ')}`,\n );\n }\n}\n\n/** Map an error thrown while loading or building to a result code. */\nfunction classify(error: unknown, phase: 'config' | 'build'): BuildErrorCode {\n if (error instanceof BuildError) return error.code;\n if (error instanceof FlowReferenceError) {\n return error.code === 'MISSING_ENV'\n ? 'MISSING_BUILD_ENV'\n : 'WEB_SECRET_REF';\n }\n if (error instanceof UnsupportedPackageSpecError) {\n return 'UNSUPPORTED_PACKAGE_SPEC';\n }\n return phase === 'config' ? 'INVALID_CONFIG' : 'BUILD_FAILED';\n}\n\nfunction isHttpUrl(source: string): boolean {\n return source.startsWith('http://') || source.startsWith('https://');\n}\n\n/** Retry hooks for the build's network calls; see `fetchWithRetry`. */\nexport type BuildRetryOptions = Pick<FetchRetryOptions, 'warn' | 'sleep'>;\n\nasync function readManifestSource(\n source: string,\n retry: BuildRetryOptions,\n): Promise<unknown> {\n let text: string;\n if (isHttpUrl(source)) {\n const response = await fetchWithRetry(\n source,\n {},\n { ...retry, label: 'Manifest download', timeoutMs: 30_000 },\n );\n text = await response.text();\n } else {\n text = await fs.readFile(source, 'utf-8');\n }\n return JSON.parse(text);\n}\n\n/** Default Content-Type for an output, from its name. */\nfunction contentTypeFor(outputName: string): string {\n const lower = outputName.toLowerCase();\n if (lower.endsWith('.tar.gz') || lower.endsWith('.tgz')) {\n return 'application/gzip';\n }\n return 'application/javascript';\n}\n\nasync function put(\n url: string,\n body: BodyInit,\n contentType: string,\n headers: Record<string, string>,\n retry: BuildRetryOptions,\n): Promise<void> {\n // Header values are never logged: a presign may sign secrets into them.\n // A failure is reported as UPLOAD_FAILED, never as a build failure.\n try {\n await fetchWithRetry(\n url,\n {\n method: 'PUT',\n body,\n headers: { ...headers, 'Content-Type': contentType },\n },\n { ...retry, label: 'Upload', timeoutMs: 60_000 },\n );\n } catch (error) {\n throw new BuildError('UPLOAD_FAILED', getErrorMessage(error));\n }\n}\n\nasync function download(\n url: string,\n dest: string,\n retry: BuildRetryOptions,\n): Promise<void> {\n let response: Response;\n try {\n response = await fetchWithRetry(\n url,\n {},\n { ...retry, label: 'Skeleton download', timeoutMs: 60_000 },\n );\n } catch (error) {\n throw new BuildError('BUILD_FAILED', getErrorMessage(error));\n }\n await fs.writeFile(dest, Buffer.from(await response.arrayBuffer()));\n}\n\nasync function buildArtifact(\n manifest: BuildManifest,\n configPath: string,\n artifact: BuildArtifact,\n workDir: string,\n index: number,\n outputs: Map<string, string>,\n retry: BuildRetryOptions,\n): Promise<string> {\n const output = path.join(workDir, 'out', artifact.outputName);\n await fs.ensureDir(path.dirname(output));\n\n if (artifact.target === 'wrap') {\n let skeletonPath: string;\n if ('url' in artifact.skeleton) {\n skeletonPath = path.join(workDir, `skeleton-${index}.mjs`);\n await download(artifact.skeleton.url, skeletonPath, retry);\n } else {\n // Schema guarantees an earlier bundle artifact with this name.\n const built = outputs.get(artifact.skeleton.artifact);\n if (!built) {\n throw new BuildError(\n 'INVALID_MANIFEST',\n `No built artifact named \"${artifact.skeleton.artifact}\"`,\n );\n }\n skeletonPath = built;\n }\n await wrapSkeleton({\n skeletonPath,\n platform: artifact.platform,\n outputPath: output,\n ...artifact.options,\n });\n return output;\n }\n\n const scratch = path.join(workDir, `cli-${index}`);\n await fs.ensureDir(scratch);\n // A config FILE inside the empty work dir, so includes and relative paths\n // resolve there and never against whatever directory the CLI runs in.\n await bundle(configPath, {\n ...(manifest.flowName ? { flowName: manifest.flowName } : {}),\n target: artifact.target,\n silent: true,\n // Each build starts clean: the build cache would hold inlined values.\n cache: false,\n // The base env is the manifest's, NEVER this process's own.\n buildEnv: manifest.buildEnv ?? {},\n buildOverrides: { output, tempDir: scratch },\n });\n return output;\n}\n\nexport interface RunBuildManifestResult {\n result: BuildResult;\n /** False when the result could not be PUT (or the manifest was unreadable). */\n reported: boolean;\n}\n\n/**\n * Run a manifest build end to end. Never throws: every failure becomes a\n * result, and `reported` says whether that result reached `resultPutUrl`.\n * Each download and upload retries transient failures; `retry.warn` hears\n * about every retry.\n */\nexport async function runBuildManifest(\n source: string,\n retry: BuildRetryOptions = {},\n): Promise<RunBuildManifestResult> {\n const report = (url: string, result: BuildResult) =>\n reportResult(url, result, retry);\n const result: BuildResult = { ok: false, toolchain: VERSION, artifacts: [] };\n const fail = (code: BuildErrorCode, message: string, outputName?: string) => {\n result.error = outputName\n ? { code, message, outputName }\n : { code, message };\n };\n\n let raw: unknown;\n try {\n raw = await readManifestSource(source, retry);\n } catch (error) {\n fail('INVALID_MANIFEST', getErrorMessage(error));\n return { result, reported: false };\n }\n\n const parsed = BuildManifestSchema.safeParse(raw);\n if (!parsed.success) {\n fail(\n 'INVALID_MANIFEST',\n parsed.error.issues\n .map((issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`)\n .join('; '),\n );\n // Report to the result URL when it is at least readable.\n const resultPutUrl = BuildManifestSchema.shape.resultPutUrl.safeParse(\n typeof raw === 'object' && raw !== null && 'resultPutUrl' in raw\n ? raw.resultPutUrl\n : undefined,\n );\n if (!resultPutUrl.success) return { result, reported: false };\n return { result, reported: await report(resultPutUrl.data, result) };\n }\n const manifest = parsed.data;\n\n if (manifest.toolchain !== VERSION) {\n fail(\n 'TOOLCHAIN_MISMATCH',\n `Manifest expects @walkeros/cli ${manifest.toolchain}, this is ${VERSION}`,\n );\n return { result, reported: await report(manifest.resultPutUrl, result) };\n }\n\n const workDir = await tmpRunDir('build');\n try {\n // Load once up front so a config error is reported as one, before any\n // package is fetched.\n const configPath = path.join(workDir, 'flow.json');\n if (manifest.flowConfig) {\n try {\n await fs.writeJson(configPath, manifest.flowConfig);\n const loaded = loadBundleConfig(manifest.flowConfig, {\n configPath,\n flowName: manifest.flowName,\n buildEnv: manifest.buildEnv ?? {},\n });\n assertNoLocalPaths(loaded);\n } catch (error) {\n fail(classify(error, 'config'), getErrorMessage(error));\n return {\n result,\n reported: await report(manifest.resultPutUrl, result),\n };\n }\n }\n\n const outputs = new Map<string, string>();\n for (const [index, artifact] of manifest.artifacts.entries()) {\n try {\n const output = await buildArtifact(\n manifest,\n configPath,\n artifact,\n workDir,\n index,\n outputs,\n retry,\n );\n outputs.set(artifact.outputName, output);\n const content = await fs.readFile(output);\n await put(\n artifact.putUrl,\n content,\n artifact.contentType ?? contentTypeFor(artifact.outputName),\n artifact.headers ?? {},\n retry,\n );\n result.artifacts.push({\n target: artifact.target,\n outputName: artifact.outputName,\n bytes: content.length,\n sha256: crypto.createHash('sha256').update(content).digest('hex'),\n });\n } catch (error) {\n fail(\n classify(error, 'build'),\n getErrorMessage(error),\n artifact.outputName,\n );\n return {\n result,\n reported: await report(manifest.resultPutUrl, result),\n };\n }\n }\n\n result.ok = true;\n return { result, reported: await report(manifest.resultPutUrl, result) };\n } finally {\n await fs.remove(workDir).catch(() => {});\n }\n}\n\nasync function reportResult(\n url: string,\n result: BuildResult,\n retry: BuildRetryOptions,\n): Promise<boolean> {\n try {\n await put(url, JSON.stringify(result), 'application/json', {}, retry);\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface BundleManifestCommandOptions {\n /** Manifest URL or file path; `true` (bare flag) reads BUILD_MANIFEST_URL. */\n manifest: string | true;\n json?: boolean;\n verbose?: boolean;\n silent?: boolean;\n}\n\nconst MANIFEST_FLAGS: ReadonlySet<string> = new Set([\n 'manifest',\n 'json',\n 'verbose',\n 'silent',\n]);\n\n/**\n * Inputs `--manifest` would silently ignore, as flag names. The manifest\n * carries the whole build, so any of them is a usage error. `cache` is\n * commander's `--no-cache` default (true) and only counts when switched off.\n */\nexport function manifestFlagConflicts(\n file: string | undefined,\n options: Record<string, unknown>,\n): string[] {\n const conflicts = file ? ['a config file'] : [];\n for (const [key, value] of Object.entries(options)) {\n if (MANIFEST_FLAGS.has(key) || value === undefined) continue;\n if (key === 'cache' && value === true) continue;\n conflicts.push(key === 'cache' ? '--no-cache' : `--${key}`);\n }\n return conflicts;\n}\n\n/** Resolve the `--manifest` value, falling back to the env for a bare flag. */\nexport function resolveManifestSource(\n manifest: string | true,\n env: Record<string, string | undefined> = process.env,\n): string {\n if (manifest !== true) return manifest;\n const fromEnv = env[BUILD_MANIFEST_ENV];\n if (!fromEnv) {\n throw new Error(\n `--manifest needs a URL or path, or ${BUILD_MANIFEST_ENV} in the environment`,\n );\n }\n return fromEnv;\n}\n\nexport async function bundleManifestCommand(\n options: BundleManifestCommandOptions,\n): Promise<void> {\n const logger = createCLILogger({ ...options, stderr: true });\n let source: string;\n try {\n source = resolveManifestSource(options.manifest);\n } catch (error) {\n logger.error(`Error: ${getErrorMessage(error)}`);\n process.exit(1);\n }\n\n const { result, reported } = await runBuildManifest(source, {\n warn: (message) => logger.warn(message),\n });\n\n if (options.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n } else if (result.ok) {\n for (const artifact of result.artifacts) {\n logger.info(\n `Built ${artifact.outputName} (${artifact.target}, ${artifact.bytes} bytes)`,\n );\n }\n } else if (result.error) {\n logger.error(`Error [${result.error.code}]: ${result.error.message}`);\n }\n if (!reported) logger.error('Result could not be reported');\n\n process.exit(result.ok && reported ? 0 : 1);\n}\n","/**\n * Build Manifest Schemas\n *\n * The contract of `walkeros bundle --manifest`: a build orchestrator writes a\n * manifest, the CLI builds every requested artifact, PUTs each output to its\n * own URL, then PUTs a structured result to `resultPutUrl`. Any orchestrator\n * can drive it (a CI job, a hosted build job, a self-hoster's script); nothing\n * in it is specific to one.\n *\n * Evolution rule: unknown TOP-LEVEL keys are tolerated and ignored, so an\n * orchestrator can add a field for its own bookkeeping without a CLI release.\n * A field the CLI must ACT on needs a CLI release, and `toolchain` makes the\n * CLI refuse a manifest written for a different version rather than silently\n * ignoring what it does not understand. Artifact entries and wrap options are\n * strict for the same reason: an ignored option there would change the bytes.\n *\n * Build env: web `$env.NAME` resolves against `buildEnv` with the flow's\n * `config.bundle.env` on top (declared wins), never against the CLI process's\n * own environment. `config.bundle.env` values are taken as literals: a\n * reference inside one (`\"$env.X\"`) is not resolved at build time and must\n * not be relied on. A `$flow.<sibling>` reference resolves against the ENTRY\n * flow's declared env, never the sibling's own `config.bundle.env`, so a\n * value the sibling declares for itself is `MISSING_BUILD_ENV` here.\n *\n * Local paths: a manifest build refuses every config-chosen filesystem input\n * (local step packages, `bundle.packages.<name>.path`, `bundle.traceInclude`,\n * `include`) with `LOCAL_PATH_NOT_ALLOWED`, before anything is fetched.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport type { BundleTarget } from '../commands/bundle/targets.js';\nimport type { WrapSkeletonOptions } from '../commands/bundle/wrap.js';\n\n/** Current manifest format version. */\nexport const BUILD_MANIFEST_VERSION = 1;\n\nconst HttpUrlSchema = z.url({ protocol: /^https?$/ });\n\n/**\n * A bare file name: the output is written inside the build's own temp dir, so\n * path separators and leading dots are refused.\n */\nconst OutputNameSchema = z\n .string()\n .regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/, 'Must be a bare file name')\n .describe('Output file name; its extension picks the format (.tar.gz packs)');\n\nconst BUNDLE_TARGET_NAMES = [\n 'cdn',\n 'cdn-skeleton',\n 'runner',\n 'simulate',\n 'push',\n] as const satisfies ReadonlyArray<BundleTarget>;\n\n// Compile-time completeness: a new BundleTarget fails here until listed.\ntype MissingTarget = Exclude<\n BundleTarget,\n (typeof BUNDLE_TARGET_NAMES)[number]\n>;\nconst bundleTargetsComplete: [MissingTarget] extends [never] ? true : never =\n true;\nvoid bundleTargetsComplete;\n\n/** Header names the CLI sets itself and an artifact may not override. */\nconst RESERVED_HEADERS: ReadonlySet<string> = new Set([\n 'content-type',\n 'content-length',\n 'host',\n]);\n\nconst OutputFields = {\n outputName: OutputNameSchema,\n putUrl: HttpUrlSchema.describe('Presigned PUT for exactly this output'),\n contentType: z\n .string()\n .min(1)\n .optional()\n .describe('Content-Type sent with the PUT (must match a signed header)'),\n headers: z\n .record(z.string().min(1), z.string())\n .refine(\n (headers) =>\n Object.keys(headers).every(\n (name) => !RESERVED_HEADERS.has(name.toLowerCase()),\n ),\n 'Content-Type, Content-Length and Host are set by the CLI',\n )\n .optional()\n .describe(\n 'Extra headers sent with the PUT (for headers a presign signs); never logged',\n ),\n};\n\nexport const BuildBundleArtifactSchema = z\n .object({\n target: z.enum(BUNDLE_TARGET_NAMES).describe('Named bundle target'),\n ...OutputFields,\n })\n .strict();\n\nexport const BuildWrapOptionsSchema = z\n .object({\n windowCollector: z.string().min(1).optional(),\n windowElb: z.string().min(1).optional(),\n preview: z\n .object({\n enabled: z.boolean(),\n keyring: z.array(\n z.object({ kid: z.string(), spki: z.string() }).strict(),\n ),\n iss: z.string(),\n pb: z.string().optional(),\n acceptForeign: z.boolean().optional(),\n demoAllowlist: z.array(z.string()).optional(),\n previewOrigin: z.string(),\n })\n .strict()\n .optional(),\n previewGrantTargets: z.array(z.string()).optional(),\n observe: z\n .object({\n url: z.string(),\n binding: z.string(),\n flowId: z.string().optional(),\n level: z.enum(['off', 'standard', 'trace']).optional(),\n sample: z.number().min(0).max(1).optional(),\n })\n .strict()\n .optional(),\n moin: z\n .object({ app: z.string(), base: z.string() })\n .strict()\n .optional()\n .describe('Tag Mode loader target; absent, the production app'),\n minify: z.boolean().optional(),\n minifyOptions: z\n .object({\n identifiers: z.boolean().optional(),\n syntax: z.boolean().optional(),\n whitespace: z.boolean().optional(),\n keepNames: z.boolean().optional(),\n legalComments: z\n .enum(['none', 'inline', 'eof', 'linked', 'external'])\n .optional(),\n })\n .strict()\n .optional(),\n target: z.string().min(1).optional().describe('esbuild target'),\n })\n .strict()\n .describe('Options forwarded to wrapSkeleton');\n\nexport const BuildWrapArtifactSchema = z\n .object({\n target: z.literal('wrap'),\n platform: z.enum(['browser', 'node']),\n skeleton: z\n .union([\n z.object({ url: HttpUrlSchema }).strict(),\n z.object({ artifact: OutputNameSchema }).strict(),\n ])\n .describe(\n 'The skeleton to wrap: a GET URL, or the outputName of an earlier bundle artifact in this manifest',\n ),\n options: BuildWrapOptionsSchema.optional(),\n ...OutputFields,\n })\n .strict();\n\nexport const BuildArtifactSchema = z.union([\n BuildBundleArtifactSchema,\n BuildWrapArtifactSchema,\n]);\n\nexport const BuildManifestSchema = z\n .object({\n version: z.literal(BUILD_MANIFEST_VERSION),\n toolchain: z\n .string()\n .min(1)\n .describe('Exact @walkeros/cli version; any other version refuses'),\n flowConfig: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Flow.Json to bundle; required when any bundle artifact is'),\n flowName: z.string().min(1).optional(),\n buildEnv: z\n .record(z.string(), z.string())\n .optional()\n .describe(\n \"Base env for web $env, beneath config.bundle.env. Never the CLI process's own env\",\n ),\n artifacts: z.array(BuildArtifactSchema).min(1),\n resultPutUrl: HttpUrlSchema.describe('Presigned PUT for the result JSON'),\n })\n .loose()\n .superRefine((manifest, ctx) => {\n const seen = new Set<string>();\n const bundled = new Set<string>();\n manifest.artifacts.forEach((artifact, index) => {\n if (seen.has(artifact.outputName)) {\n ctx.addIssue({\n code: 'custom',\n path: ['artifacts', index, 'outputName'],\n message: `Duplicate outputName \"${artifact.outputName}\"`,\n });\n }\n seen.add(artifact.outputName);\n if (artifact.target !== 'wrap') {\n bundled.add(artifact.outputName);\n if (!manifest.flowConfig) {\n ctx.addIssue({\n code: 'custom',\n path: ['flowConfig'],\n message: 'flowConfig is required for bundle artifacts',\n });\n }\n } else if (\n 'artifact' in artifact.skeleton &&\n !bundled.has(artifact.skeleton.artifact)\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['artifacts', index, 'skeleton', 'artifact'],\n message: `No earlier bundle artifact named \"${artifact.skeleton.artifact}\"`,\n });\n }\n });\n })\n .meta({ id: 'BuildManifest', title: 'walkeros bundle --manifest input' });\n\nexport type BuildManifest = z.infer<typeof BuildManifestSchema>;\nexport type BuildArtifact = z.infer<typeof BuildArtifactSchema>;\nexport type BuildWrapOptions = z.infer<typeof BuildWrapOptionsSchema>;\n\n// Compile-time, both directions: parsed wrap options must be accepted by\n// wrapSkeleton, and every wrapSkeleton option except the three the command\n// supplies itself must be reachable through the manifest.\nconst wrapOptionsFit = (\n options: BuildWrapOptions,\n): Partial<WrapSkeletonOptions> => options;\nvoid wrapOptionsFit;\ntype UnreachableWrapOption = Exclude<\n keyof WrapSkeletonOptions,\n keyof BuildWrapOptions | 'skeletonPath' | 'platform' | 'outputPath'\n>;\nconst wrapOptionsComplete: [UnreachableWrapOption] extends [never]\n ? true\n : never = true;\nvoid wrapOptionsComplete;\n\n/**\n * Error codes a result can carry. User-config codes first, then build and\n * infrastructure codes.\n */\nexport const BUILD_ERROR_CODES = [\n 'INVALID_MANIFEST',\n 'TOOLCHAIN_MISMATCH',\n 'INVALID_CONFIG',\n 'MISSING_BUILD_ENV',\n 'WEB_SECRET_REF',\n 'UNSUPPORTED_PACKAGE_SPEC',\n 'LOCAL_PATH_NOT_ALLOWED',\n 'BUILD_FAILED',\n 'UPLOAD_FAILED',\n] as const;\n\nexport type BuildErrorCode = (typeof BUILD_ERROR_CODES)[number];\n\nexport const BuildResultSchema = z\n .object({\n ok: z.boolean(),\n toolchain: z.string().describe('The CLI version that ran the build'),\n artifacts: z\n .array(\n z.object({\n target: z.string(),\n outputName: z.string(),\n bytes: z.number().int().nonnegative(),\n sha256: z.string(),\n }),\n )\n .describe('Outputs PUT successfully, in manifest order'),\n error: z\n .object({\n code: z.enum(BUILD_ERROR_CODES),\n message: z.string(),\n outputName: z\n .string()\n .optional()\n .describe('The artifact being built when the error occurred'),\n })\n .optional(),\n })\n .meta({ id: 'BuildResult', title: 'walkeros bundle --manifest result' });\n\nexport type BuildResult = z.infer<typeof BuildResultSchema>;\n","/**\n * One retry policy for every network call of a manifest build: the manifest\n * download, a skeleton download and each PUT. A transient failure (the fetch\n * rejects, times out, or answers 5xx or 429) is retried; any other status\n * fails at once, since an expired or wrong presign never heals.\n *\n * Messages never carry the URL, its query or a header value: presigned\n * credentials live there.\n */\n\n/** Waits before attempt 2 and 3. Their count sets the attempt limit. */\nconst BACKOFF_MS = [1000, 3000] as const;\n\nexport interface FetchRetryOptions {\n /** Names the call in warnings and errors, e.g. `Manifest download`. */\n label: string;\n /** Per-attempt timeout; each attempt gets a fresh signal. */\n timeoutMs: number;\n /** Called once per retry with a ready-to-print line. */\n warn?: (message: string) => void;\n /** Injectable for tests. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nfunction defaultSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isTransientStatus(status: number): boolean {\n return status >= 500 || status === 429;\n}\n\nfunction causeDetail(error: object): string | undefined {\n if (!('cause' in error)) return undefined;\n const cause = error.cause;\n if (typeof cause !== 'object' || cause === null) return undefined;\n if ('code' in cause && typeof cause.code === 'string') return cause.code;\n // A plain `Error` name says nothing (undici's `bad port`, for one).\n if (\n 'name' in cause &&\n typeof cause.name === 'string' &&\n cause.name !== 'Error'\n ) {\n return cause.name;\n }\n return undefined;\n}\n\n/**\n * A short, safe reason for a failed fetch: `fetch failed (ECONNRESET)`,\n * `timed out after 30s` or `HTTP 503`. Read from the error's name, its\n * `cause.code` or `cause.name`, or the response status. Never from an error\n * message, which may repeat the URL.\n */\nexport function describeFetchError(\n failure: unknown,\n timeoutMs?: number,\n): string {\n if (failure instanceof Response) return `HTTP ${failure.status}`;\n // Structural, not `instanceof Error`: a DOMException or an undici error may\n // come from another realm.\n if (typeof failure !== 'object' || failure === null) return 'fetch failed';\n if ('name' in failure && failure.name === 'TimeoutError') {\n return timeoutMs === undefined\n ? 'timed out'\n : `timed out after ${timeoutMs / 1000}s`;\n }\n const detail = causeDetail(failure);\n if (detail) return `fetch failed (${detail})`;\n return 'fetch failed';\n}\n\n/**\n * `fetch` with the build retry policy. Resolves with an ok response, or\n * throws an Error whose message names the label, the attempt count and the\n * reason, e.g. `Manifest download failed after 3 attempts: HTTP 503`.\n */\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n options: FetchRetryOptions,\n): Promise<Response> {\n const { label, timeoutMs, warn, sleep = defaultSleep } = options;\n const maxAttempts = BACKOFF_MS.length + 1;\n\n for (let attempt = 1; ; attempt++) {\n let failure: unknown;\n try {\n const response = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (response.ok) return response;\n failure = response;\n } catch (error) {\n failure = error;\n }\n\n const reason = describeFetchError(failure, timeoutMs);\n if (failure instanceof Response && !isTransientStatus(failure.status)) {\n throw new Error(`${label} failed: ${reason}`);\n }\n\n const delay = BACKOFF_MS[attempt - 1];\n if (delay === undefined) {\n throw new Error(\n `${label} failed after ${maxAttempts} attempts: ${reason}`,\n );\n }\n warn?.(\n `${label} attempt ${attempt}/${maxAttempts} failed: ${reason}, retrying in ${delay / 1000}s`,\n );\n await sleep(delay);\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';\nimport { APP_PATHS } from '../core/app-paths.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 // The emitter is its own flow. Its version is not stamped on source.version;\n // it rides source.release under the emitter's surface key (cli/mcp), stamped\n // by the collector from config.collector.{name,release} below.\n const baseSource: WalkerOS.Source = {\n ...opts.source,\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 // Flow identity: the emitter surface (cli/mcp) keys source.release, its\n // package version is the release. createEvent stamps\n // source.release = { [type]: packageVersion } from these.\n name: opts.source.type,\n release: opts.packageVersion,\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 // The debug path bypasses the collector, so replicate the\n // source.release stamp createEvent applies on the live path.\n source: {\n ...partialEvent.source,\n release: { [opts.source.type]: opts.packageVersion },\n },\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 telemetry goes to the\n * same app as every other CLI request. Order: env (`WALKEROS_APP_URL`) > user\n * config (`~/.config/walkeros/config.json:appUrl`) > the default app URL\n * (`https://app.walkeros.io`).\n */\nexport function resolveTelemetryEndpoint(): string | undefined {\n const appUrl = resolveAppUrl();\n if (!appUrl) return undefined;\n return `${appUrl.replace(/\\/+$/, '')}${APP_PATHS.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 an explicit\n * `walkeros telemetry enable` or `disable`). If the user never creates a\n * config for any other reason, the notice keeps appearing. That is acceptable: the notice\n * is a one-line 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","fs","path","fs","path","path","fs","path","path","fs","stat","fs","fs","fs","path","fs","path","path","fs","fs","path","schemas","path","path","fs","path","fs","isRecord","stat","path","bundle","path","fs","bundle","esbuild","path","fileURLToPath","fs","getPlatform","packageNameToVariable","SECRET_MARKER_PREFIX","isObject","path","fs","semver","input","path","fs","fs","path","path","resolve","fs","deps","peerDeps","peerMeta","nestLoser","alreadyNested","semver","path","fs","fs","path","semver","isObject","getHashServer","fs","path","getHashServer","getHashServer","path","fs","fs","path","dirname","join","path","fs","getHashServer","stats","sizeKB","esbuild","fileURLToPath","build","packageNameToVariable","isObject","getPlatform","release","stepId","SECRET_MARKER_PREFIX","resolveTarget","fs","path","fs","configDigest","resolveTarget","path","fs","getPlatform","path","delay","resolve","path","startFlow","path","fs","getPlatform","getPlatform","path","fs","schemas","isObject","isRecord","isRecord","push","fs","schemas","getPlatform","path","context","require","fs","path","chalk","isObject","isObject","validateEvent","checkWindowCollector","ENV_MARKER_PREFIX","isObject","SECRET_MARKER_PREFIX","schemas","validateFlowStructure","isObject","isFlowJson","path","getFlowSettings","getErrorMessage","resolveFlow","ENV_MARKER_PREFIX","getErrorMessage","isObject","SECRET_MARKER_PREFIX","fs","path","isObject","isObject","ENV_MARKER_PREFIX","SECRET_MARKER_PREFIX","context","getErrorMessage","validate","validateFlowConfig","schemas","STEP_KINDS","context","isObject","path","validateFlowConfig","result","STEP_KINDS","bundle","isFlowJson","validateFlowStructure","resolveFlow","ENV_MARKER_PREFIX","checkWindowCollector","once","SECRET_MARKER_PREFIX","isObject","schemas","path","context","isFlowJson","resolveFlow","isFlowJson","isObject","validateEvent","chalk","z","readFileSync","join","path","readFile","z","z","z","readJson","z","validateFlowStructure","path","fileURLToPath","fs","esbuild","fileURLToPath","fs","crypto","path","fs","FlowReferenceError","z","z","z","resolve","delay","FlowReferenceError","fs","path","result","crypto","os"]}
|