@walkeros/cli 4.8.1-next-1791586788897 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["<define:__CLIENT_OPERATION_DIGESTS__>","../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/lib/config-file.ts","../src/core/api-error.ts","../src/lib/secure-url.ts","../src/lib/config-lock.ts","../src/core/oauth-client.ts","../src/core/client-context.ts","../src/core/openapi-subset.ts","../src/core/api-request.ts","../src/core/auth.ts","../src/core/http.ts","../src/core/utils.ts","../src/core/local-packages.ts","../src/core/input-detector.ts","../src/core/stdin.ts","../src/core/sse.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/commands/validate/validators/mapping.ts","../src/commands/validate/validators/entry.ts","../src/commands/validate/types.ts","../src/commands/login/index.ts","../src/commands/logout/index.ts","../src/core/api-client.ts","../src/commands/auth/index.ts","../src/commands/projects/index.ts","../src/commands/flows/index.ts","../src/commands/deploy/index.ts","../src/commands/deployments/index.ts","../src/commands/feedback/index.ts","../src/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/core/contract.ts","../src/commands/previews/index.ts","../src/commands/journeys/index.ts","../src/commands/observe/index.ts","../src/commands/hub/index.ts","../src/commands/frames/index.ts","../src/commands/secrets/index.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":["[{\"op\":\"GET /api/auth/whoami\",\"usedBy\":[\"mcp auth\",\"walkeros auth login\",\"walkeros auth whoami\"],\"digest\":\"f8287550f3ac65aa5b290875220f06dd3f48d607ed489b9f0a8f704d3f8f5cfd\"},{\"op\":\"POST /api/feedback\",\"usedBy\":[\"mcp feedback\",\"walkeros feedback\"],\"digest\":\"7417108c6ea8d60904b715dfedc1d8b9b597834f7d427df6b9226b36e5eef963\"},{\"op\":\"GET /api/health\",\"usedBy\":[\"mcp diagnostics\",\"walkeros diagnostics\"],\"digest\":\"2b3c0883edf4048aca77f4222247929b9045db33d06729502cb5021929d04156\"},{\"op\":\"POST /api/oauth/device_authorization\",\"usedBy\":[\"mcp auth\",\"walkeros auth login\"],\"digest\":\"a3e744775b93e7f50ea4021f8a027e656bb90e6f2358c65a35e4c45e16ac3fdd\"},{\"op\":\"POST /api/oauth/revoke\",\"usedBy\":[\"mcp auth\",\"walkeros auth logout\"],\"digest\":\"dbc453faaaa748d1129473ccda7b26a4e3267d67c25a8a9fc1da0068837fe154\"},{\"op\":\"POST /api/oauth/token\",\"usedBy\":[\"@walkeros/cli resolveAccessToken\",\"mcp auth\",\"walkeros auth login\"],\"digest\":\"16f5a3146c0a3fff703122a5ff25446bad07a6c37069a9e9a6db6925daa036a0\"},{\"op\":\"GET /api/openapi.json\",\"usedBy\":[\"mcp diagnostics\",\"mcp resource walkeros://reference/openapi\",\"walkeros diagnostics\"],\"digest\":\"dbf34e575af8f757d9a0f967c4565968d1a2d64b57a717fc65c8f81692099f0a\"},{\"op\":\"GET /api/packages\",\"usedBy\":[\"mcp package_search\",\"mcp resource walkeros://reference/packages\",\"mcp resource walkeros://schema/{packageName}\"],\"digest\":\"d9c713eea791e8bae3c606bcd1f0209db2c7050a39b18e96f7d913b7d0752e19\"},{\"op\":\"GET /api/projects\",\"usedBy\":[\"mcp flow_manage\",\"mcp project_manage\",\"walkeros projects list\"],\"digest\":\"1e65fca4cb31ccfc10b9835595ac4ee1f69bd6da14127bcc31d62616dfba7281\"},{\"op\":\"POST /api/projects\",\"usedBy\":[\"mcp project_manage\",\"walkeros projects create\"],\"digest\":\"3ab6d76c78d4433f0e0ab85a0a23753c7065bc232bfb30b7cee616a3aef8bec5\"},{\"op\":\"DELETE /api/projects/{projectId}\",\"usedBy\":[\"mcp project_manage\",\"walkeros projects delete\"],\"digest\":\"9f725b18812327c57cfbf8d8ed0139353c60ed2eb34024618e1760c2765889ca\"},{\"op\":\"GET /api/projects/{projectId}\",\"usedBy\":[\"mcp project_manage\",\"walkeros projects get\"],\"digest\":\"535d11026c7b7ff3b59512c0f68ddeb4e73104d4adab143351c7f9fa1ece6e78\"},{\"op\":\"PATCH /api/projects/{projectId}\",\"usedBy\":[\"mcp project_manage\",\"walkeros projects update\"],\"digest\":\"d15d7756dae06372328b43891a89dc839e6eb8587896d19999ff49ec8aa1d19b\"},{\"op\":\"GET /api/projects/{projectId}/deployments\",\"usedBy\":[\"mcp deploy_manage\",\"walkeros deploy list\"],\"digest\":\"2b3cc07e4cf1f739f7321b5bf157b91ac300205286a48c4f29dd11269d00f2c0\"},{\"op\":\"POST /api/projects/{projectId}/deployments\",\"usedBy\":[\"walkeros deploy create\"],\"digest\":\"e8d625c9ac6a172cfe446737b823a75f4c04a110afb05b46add07a3608738b89\"},{\"op\":\"DELETE /api/projects/{projectId}/deployments/{deploymentId}\",\"usedBy\":[\"mcp deploy_manage\",\"walkeros deploy delete\"],\"digest\":\"891be10f22668ff6ce13ae0e7b7d0d28dce5d19c98ad60555431cc7c2c6af252\"},{\"op\":\"GET /api/projects/{projectId}/deployments/{deploymentId}\",\"usedBy\":[\"mcp deploy_manage\",\"walkeros deploy status\"],\"digest\":\"f378e78d11125110059b6ae761293ebc3c17e35ccf0a1f6f08323c05bed5debd\"},{\"op\":\"GET /api/projects/{projectId}/deployments/{deploymentId}/stream\",\"usedBy\":[\"mcp deploy_manage\",\"walkeros deploy start\"],\"digest\":\"cf27b0c148cfeb3b772f150a9de0359540643b3eeaff8dc373cb865557e24a82\"},{\"op\":\"GET /api/projects/{projectId}/flows\",\"usedBy\":[\"mcp flow_manage\",\"walkeros flows list\"],\"digest\":\"52a5dd721bbb7c3f65e428a6b134e8b3110e9b570d341a570050eacec92b46a3\"},{\"op\":\"POST /api/projects/{projectId}/flows\",\"usedBy\":[\"mcp flow_manage\",\"walkeros flows create\"],\"digest\":\"bcae723b986165cab63933eda1814a9da984cdfada8fe1a0c9cc01d4554d8372\"},{\"op\":\"DELETE /api/projects/{projectId}/flows/{flowId}\",\"usedBy\":[\"mcp flow_manage\",\"walkeros flows delete\"],\"digest\":\"73347bdfb7616281c04f48d90acee1f9ab8b539b87228d23a57963cd95e1553f\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}\",\"usedBy\":[\"mcp deploy_manage\",\"mcp flow_bundle\",\"mcp flow_load\",\"mcp flow_manage\",\"mcp flow_simulate\",\"mcp observe_session\",\"walkeros deploy create\",\"walkeros deploy start\",\"walkeros flows get\",\"walkeros observe start\",\"walkeros previews create\"],\"digest\":\"80dc0806697e06bd8837ee6885e5893e33af6bc1da9ff4f536300efcc93aec23\"},{\"op\":\"PATCH /api/projects/{projectId}/flows/{flowId}\",\"usedBy\":[\"mcp flow_manage\",\"walkeros flows update\"],\"digest\":\"d68ed0cf7ca7d65e2d00d5901c37cc98f62e91bb95012e3b458b94ff30014947\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/deploy\",\"usedBy\":[\"@walkeros/cli getDeployment\"],\"digest\":\"8d9229fc0d884a75b1faf06877494e4dd5fa8c77affc7a7bb58d559fbd0c8646\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/deploy\",\"usedBy\":[\"mcp deploy_manage\",\"walkeros deploy start\"],\"digest\":\"ea6922423f14dde427cf37f13f07e3f5f783358ff23fd7464925da068838068e\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/duplicate\",\"usedBy\":[\"mcp flow_manage\",\"walkeros flows duplicate\"],\"digest\":\"b9111138d427419eea46ed590a301373a4c641b19d90ab1566891f5aaaadc231\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/frames\",\"usedBy\":[\"mcp frame_manage\"],\"digest\":\"b8027522be3c0cf725ce3b02b7029102846b4a6a7ada10c0d8edac31f59c2a0a\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/frames/{frameId}\",\"usedBy\":[\"mcp frame_manage\"],\"digest\":\"5439af00498b5bc23363b11dbe362ea058ff0b9ef04b00c4a96be03208787cfd\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/journeys\",\"usedBy\":[\"mcp flow_manage\",\"mcp observe_journeys\",\"mcp observe_session\"],\"digest\":\"78377e4a5b4b1e4dce9f94813bd3484e78b9520e57c712f963ef98c42516b01c\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/observe-sessions\",\"usedBy\":[\"mcp observe_session\",\"walkeros observe start\"],\"digest\":\"5620b4826736b3aff1c80412d9861d5286304957df59d241e9adff6d101bb032\"},{\"op\":\"DELETE /api/projects/{projectId}/flows/{flowId}/observe-sessions/{sessionId}\",\"usedBy\":[\"mcp observe_session\"],\"digest\":\"9bdc90811f98a22030ee33bb24e2f270b64733b81e3e4dd3d16cd00620dafb44\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/observe-sessions/{sessionId}\",\"usedBy\":[\"mcp observe_session\",\"walkeros observe start\"],\"digest\":\"ab5e8a2b908391c701c9e0b73813f1eb3bfa5b2a82e82b7009b2559467352491\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/observe-sessions/{sessionId}/heartbeat\",\"usedBy\":[\"walkeros observe start\"],\"digest\":\"2b0b74a466c643aac87226c8154a530ce55deb5409a4fb65a4ef9b8aa182cbc7\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/previews\",\"usedBy\":[\"mcp flow_manage\",\"walkeros previews list\"],\"digest\":\"ef72ef8b90676c59c626763f120d6a81910b29e4384f0ac8174f7e12420007c2\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/previews\",\"usedBy\":[\"mcp flow_manage\",\"walkeros previews create\"],\"digest\":\"7239dc554d11983386108825087aa45eb4d0bd38eae87dbac376e68e724c6a8f\"},{\"op\":\"DELETE /api/projects/{projectId}/flows/{flowId}/previews/{previewId}\",\"usedBy\":[\"mcp flow_manage\",\"walkeros previews delete\"],\"digest\":\"de9be2358920517321c4e2c59c9ce59f174be0382596037ce36f987233689e51\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/previews/{previewId}\",\"usedBy\":[\"mcp flow_manage\",\"walkeros previews get\"],\"digest\":\"4dbaa7000600aa12d45388511192dabdcd910fad9acedd802fdc68efea4e7bc7\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/previews/{previewId}/grant\",\"usedBy\":[\"mcp flow_manage\",\"walkeros previews create\"],\"digest\":\"4cf5c7ea9363935bd978f858e4bb058c6dd64bb2763cefac9ce07da248605e7f\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/releases\",\"usedBy\":[\"mcp hub_manage\"],\"digest\":\"c6ac90c93e07429b53c506292ceda03bfb8873686db76e422f5eed4638f4bee7\"},{\"op\":\"PUT /api/projects/{projectId}/flows/{flowId}/releases/annotations\",\"usedBy\":[\"mcp hub_manage\"],\"digest\":\"084f638f024a578ab2f401839f10f9554e6d2100ba7d67f1ab2be560616bd044\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/releases/step-history\",\"usedBy\":[\"mcp hub_manage\"],\"digest\":\"a0d051814f7e8cc39e00592c16bc92a1afae0b58cd71b9b98ab6c85da4dd04e4\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/releases/{versionId}\",\"usedBy\":[\"mcp hub_manage\"],\"digest\":\"d429b1564ca64148c5844e799c5dafc5d864fcf94df62f51174c3825db6a3463\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/secrets\",\"usedBy\":[\"mcp secret_manage\"],\"digest\":\"19629983472c4e46b6c97fc8700b35549f38725fd4d7a5f59ddacd6a7bcfc8f2\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/secrets\",\"usedBy\":[\"mcp secret_manage\"],\"digest\":\"b9407ce8584d147f84acf2562f1eb7c63c35e7ed93bd275d8c3c2ba3c4a1a8e3\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/secrets/values\",\"usedBy\":[\"runner\"],\"digest\":\"0c02c86b0576047e8d986c2829212fef4e7eea5791250188619244bfbcdfb4aa\"},{\"op\":\"DELETE /api/projects/{projectId}/flows/{flowId}/secrets/{secretId}\",\"usedBy\":[\"mcp secret_manage\"],\"digest\":\"b744bcdb73b204d9aa4e4d3f846552a4154601df27c4fe18045bdb8a09624b84\"},{\"op\":\"PUT /api/projects/{projectId}/flows/{flowId}/secrets/{secretId}\",\"usedBy\":[\"mcp secret_manage\"],\"digest\":\"5b94004e066746ee7a83b90477db9d2a343361705c2e158df85d74e47085a46a\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/settings/{settingsId}/deploy\",\"usedBy\":[\"@walkeros/cli getDeployment\"],\"digest\":\"0ad85a2494f22e9863362a7137d721d970b87ff60fdb41727a76cb4f590c83bc\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/settings/{settingsId}/deploy\",\"usedBy\":[\"mcp deploy_manage\",\"walkeros deploy start\"],\"digest\":\"b6506c543c7e755592b5a6671016c4bae3b3e41cd76c28852297413e1a412e46\"},{\"op\":\"GET /api/projects/{projectId}/flows/{flowId}/threads\",\"usedBy\":[\"mcp hub_manage\"],\"digest\":\"ae0b8185fa74ba12d99eedacedb53e5801d7485cdf7b1c382334371454f8c323\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/threads\",\"usedBy\":[\"mcp hub_manage\"],\"digest\":\"0ee52914274f52641a08b4c2d9da774c971d214929b43abee85d5e657b209144\"},{\"op\":\"POST /api/projects/{projectId}/flows/{flowId}/threads/{threadId}/messages\",\"usedBy\":[\"mcp hub_manage\"],\"digest\":\"28d8e964962b03c016c909111be0ce570df9bf43f89f0ab1c74b6dd65503eec1\"},{\"op\":\"GET /api/projects/{projectId}/knowledge\",\"usedBy\":[\"mcp hub_manage\"],\"digest\":\"f48913a2c4cd0678953d574afddec70885c55a6fa1f9ac089ab3a6d7643d3d91\"},{\"op\":\"POST /api/projects/{projectId}/runners/heartbeat\",\"usedBy\":[\"runner\"],\"digest\":\"96546fffffb32b66db7c5238daa2ba8f549d976f5ffcab2befa639e2eb1df0e1\"},{\"op\":\"POST /api/telemetry\",\"usedBy\":[\"@walkeros/cli telemetry\"],\"digest\":\"d119e16315ff9df09160d8b36ebc78dec089cb2a726f4a8fd77ff5b693999667\"}]","/**\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 { mergeAuthHeaders } from '../core/http.js';\nimport { resolveAccessToken } from '../core/auth.js';\nimport { resolveAppUrl } from '../lib/config-file.js';\nimport { requireSecureUrl } from '../lib/secure-url.js';\n\n/**\n * Check if a string is a valid URL\n *\n * @param str - String to check\n * @returns True if string is a valid HTTP/HTTPS URL\n */\nexport function isUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Whether a URL points at the configured walkerOS app.\n *\n * Compares origins rather than prefixes: a host such as\n * `https://app.walkeros.io.example.com` starts with the app URL but belongs to\n * somebody else, and the port is part of who a host is.\n */\nfunction isAppOrigin(url: string): boolean {\n try {\n return new URL(url).origin === new URL(resolveAppUrl()).origin;\n } catch {\n return false;\n }\n}\n\n/**\n * Fetch content from a URL as a string.\n * Shared helper for all URL-loading paths.\n *\n * The session bearer goes to the walkerOS app and nowhere else. A config input\n * is any URL the person names, so attaching auth to all of them would hand\n * their walkerOS session to whichever host they were pointed at.\n *\n * @param url - HTTP/HTTPS URL to fetch\n * @returns Response body as a string\n * @throws Error if fetch fails or response is not OK\n */\nexport async function fetchContentString(url: string): Promise<string> {\n const token = isAppOrigin(url) ? await resolveAccessToken() : null;\n // Only when a bearer is going along: an unauthenticated config download is\n // the person naming any URL they like, and http is theirs to choose.\n if (token) requireSecureUrl(url);\n const response = await fetch(url, {\n headers: mergeAuthHeaders(token),\n });\n if (!response.ok) {\n throw new Error(\n `Failed to fetch ${url}: ${response.status} ${response.statusText}`,\n );\n }\n return response.text();\n}\n\n/**\n * Substitute environment variables in a string.\n *\n * @param value - String with ${VAR} placeholders\n * @returns String with environment variables substituted\n * @throws Error if environment variable is not found\n *\n * @example\n * ```typescript\n * substituteEnvVariables('${HOME}/config') // \"/Users/name/config\"\n * ```\n */\nexport function substituteEnvVariables(value: string): string {\n return value.replace(/\\${([^}]+)}/g, (_, envVar) => {\n const envValue = process.env[envVar];\n if (!envValue) {\n throw new Error(`Environment variable ${envVar} not found`);\n }\n return envValue;\n });\n}\n\n/**\n * Resolve raw string content from a URL, file path, or inline string.\n *\n * Detection priority:\n * 1. URL (http://, https://) — download content\n * 2. Existing file path — read file content\n * 3. Inline string — return as-is\n *\n * @param input - URL, file path, or inline string\n * @returns Raw string content and the resolved absolute path (if file-based)\n * @throws Error if file not found or download fails\n */\nasync function resolveContent(input: string): Promise<string> {\n const trimmed = input.trim();\n\n // 1. Check if input is a URL\n if (isUrl(trimmed)) {\n return fetchContentString(trimmed);\n }\n\n // 2. Check if file path exists\n const absolutePath = path.resolve(trimmed);\n if (await fs.pathExists(absolutePath)) {\n return fs.readFile(absolutePath, 'utf-8');\n }\n\n // 3. Inline content — return as-is\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return trimmed;\n }\n\n // 4. Nothing matched — file not found\n throw new Error(`Configuration file not found: ${absolutePath}`);\n}\n\n/**\n * Load configuration from a file path, URL, or inline string.\n *\n * Supports two modes:\n * - `json: true` (default) — resolves content and parses as JSON\n * - `json: false` — resolves content and returns raw string\n *\n * Detection priority:\n * 1. URL (http://, https://) — download content\n * 2. Existing file path — read file content\n * 3. Inline string (starting with { or [) — use directly\n *\n * @param input - Path to file, HTTP/HTTPS URL, or inline string\n * @param options - Optional settings\n * @param options.json - Parse as JSON (default: true)\n * @returns Parsed object (json: true) or raw string (json: false)\n * @throws Error if file not found, download fails, or invalid JSON\n *\n * @example\n * ```typescript\n * // JSON mode (default) — same as loadJsonConfig\n * const config = await loadConfig('./config.json')\n * const config = await loadConfig('https://example.com/config.json')\n * const config = await loadConfig('{\"version\":3,\"flows\":{}}')\n *\n * // Raw string mode — returns file/URL content as string\n * const code = await loadConfig('./bundle.js', { json: false })\n * ```\n */\nexport async function loadConfig<T = unknown>(\n input: string,\n options?: { json?: boolean },\n): Promise<T | string> {\n const json = options?.json !== false; // default true\n\n if (!json) {\n return resolveContent(input);\n }\n\n // JSON mode — resolve content then parse\n const trimmed = input.trim();\n\n try {\n const content = await resolveContent(trimmed);\n\n // Parse the resolved content as JSON\n return JSON.parse(content) as T;\n } catch (error) {\n // Distinguish between JSON parse errors and resolution errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Re-throw resolution errors (file not found, fetch failed) as-is\n if (\n errorMessage.includes('not found') ||\n errorMessage.includes('Failed to fetch')\n ) {\n throw error;\n }\n\n // JSON-looking inline content with parse errors\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n throw new Error(\n `Input appears to be JSON but contains errors: ${errorMessage}`,\n );\n }\n\n // File or URL with invalid JSON content\n throw new Error(`Invalid JSON in config file: ${input}. ${errorMessage}`);\n }\n}\n\n/**\n * Load and parse JSON configuration from a file path, URL, or inline JSON string.\n *\n * Thin wrapper around `loadConfig` with `json: true` (default).\n *\n * Detection priority:\n * 1. URL (http://, https://) — download and parse\n * 2. Existing file path — read and parse\n * 3. Inline JSON string (starting with { or [) — parse directly\n *\n * @param configPath - Path to JSON file, HTTP/HTTPS URL, or inline JSON string\n * @returns Parsed configuration object\n * @throws Error if file not found, download fails, or invalid JSON\n *\n * @example\n * ```typescript\n * // Local file\n * const config = await loadJsonConfig('./config.json')\n *\n * // Remote URL\n * const config = await loadJsonConfig('https://example.com/config.json')\n *\n * // Inline JSON\n * const config = await loadJsonConfig('{\"version\":3,\"flows\":{}}')\n * ```\n */\nexport async function loadJsonConfig<T>(configPath: string): Promise<T> {\n return loadConfig<T>(configPath, { json: true }) as Promise<T>;\n}\n\n/**\n * Load JSON from inline string, file path, or URL.\n *\n * Supports three input formats:\n * 1. Inline JSON string - parsed directly\n * 2. Local file path - read and parsed\n * 3. HTTP/HTTPS URL - downloaded and parsed\n *\n * Detection priority:\n * 1. URL (http://, https://) → download and parse\n * 2. Existing file path → read and parse\n * 3. Valid JSON string → parse directly\n * 4. Simple string → treat as {name: string} for backward compatibility\n *\n * @param source - JSON string, file path, or URL\n * @param options - Optional configuration\n * @param options.name - Parameter name for error messages (e.g., \"event\", \"config\")\n * @param options.required - Throw error if source is empty (default: false)\n * @param options.fallback - Default value if source is empty\n * @returns Parsed JSON object\n * @throws Error if source is required but empty, or if loading/parsing fails\n *\n * @example\n * ```typescript\n * // Inline JSON\n * await loadJsonFromSource('{\"name\":\"order complete\",\"data\":{}}')\n *\n * // File path\n * await loadJsonFromSource('./examples/event.json')\n *\n * // URL\n * await loadJsonFromSource('https://example.com/event.json')\n *\n * // With options\n * await loadJsonFromSource(input, {\n * name: 'event',\n * required: true,\n * fallback: { name: 'default' }\n * })\n * ```\n */\nexport async function loadJsonFromSource<T = unknown>(\n source: string | undefined,\n options?: {\n name?: string;\n required?: boolean;\n fallback?: T;\n },\n): Promise<T> {\n const paramName = options?.name || 'input';\n\n // 1. Handle empty/undefined input (pre-check)\n if (!source || source.trim() === '') {\n if (options?.required) throw new Error(`${paramName} is required`);\n if (options?.fallback !== undefined) return options.fallback;\n return {} as T;\n }\n\n // 2. Try the strict loader (handles URL, file, inline JSON)\n try {\n return await loadJsonConfig<T>(source);\n } catch (error) {\n const trimmed = source.trim();\n\n // 3. Not JSON-looking? Treat as event name (backward compat)\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return { name: trimmed } as T;\n }\n\n // 4. JSON-looking but invalid -- re-throw with context\n throw new Error(\n `Failed to parse ${paramName}. ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n existsSync,\n chmodSync,\n renameSync,\n} from 'fs';\nimport { randomBytes } from 'crypto';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { notAuthenticatedError } from '../core/api-error.js';\n\nexport interface WalkerOSConfig {\n /**\n * Static bearer written by the pre-OAuth CLI. Honored until it expires, and\n * the first use in a process prints a one-line notice naming\n * `walkeros auth login`, which replaces it with a refreshable session.\n */\n token?: string;\n /** Short-lived bearer from the device authorization grant. */\n accessToken?: string;\n /** ISO 8601 instant at which `accessToken` stops being accepted. */\n accessTokenExpiresAt?: string;\n /** Single-use credential that buys a new `accessToken`. */\n refreshToken?: string;\n email?: string;\n appUrl?: string;\n anonymousFeedback?: boolean;\n defaultProjectId?: string;\n /**\n * UUID v4, generated and persisted only when the user explicitly opts in\n * to telemetry (`walkeros telemetry enable`). Absent in the default state.\n */\n installationId?: string;\n /**\n * Explicit consent toggle for telemetry. Tri-state:\n * - `undefined`: no decision yet, default (nothing is collected).\n * - `true`: user opted in via `walkeros telemetry enable`.\n * - `false`: user opted out via `walkeros telemetry disable`.\n */\n telemetryEnabled?: boolean;\n}\n\n/**\n * Get the config directory path, respecting XDG_CONFIG_HOME\n */\nexport function getConfigDir(): string {\n const xdgConfig = process.env.XDG_CONFIG_HOME;\n const base = xdgConfig || join(homedir(), '.config');\n return join(base, 'walkeros');\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(): string {\n return join(getConfigDir(), 'config.json');\n}\n\n/**\n * Read the stored config, or null if not found\n */\nexport function readConfig(): WalkerOSConfig | null {\n const configPath = getConfigPath();\n try {\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content) as WalkerOSConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * 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 person as logged out, so the content is written to a temp file and\n * renamed, which is atomic within a directory.\n *\n * The temp path is unique per write. Only the token refresh holds the config\n * lock, so two ordinary writers (a login and a `telemetry enable`, say) can be\n * in here at once: on one shared name they would write over each other's temp\n * file and rename it twice, and the slower one would fail outright when the\n * faster renamed the file out from 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 tokens would otherwise\n * drop `defaultProjectId`, `installationId`, `telemetryEnabled` and\n * `anonymousFeedback` every time somebody logs in.\n *\n * A key passed explicitly as `undefined` is removed from the written file,\n * which is how login drops the legacy static token it replaces.\n */\nexport function writeConfig(config: WalkerOSConfig): void {\n replaceConfigFile({ ...(readConfig() ?? {}), ...config });\n}\n\n/**\n * Remove every credential field, keeping the rest of the config.\n *\n * Used when the stored session is known to be dead, so the next command can\n * say \"run `walkeros auth login`\" instead of failing against the API.\n */\nexport function clearAuthFields(): void {\n const config = readConfig();\n if (!config) return;\n const {\n token: _token,\n accessToken: _accessToken,\n accessTokenExpiresAt: _accessTokenExpiresAt,\n refreshToken: _refreshToken,\n email: _email,\n ...rest\n } = config;\n replaceConfigFile(rest);\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 * Delete the config file (logout)\n */\nexport function deleteConfig(): boolean {\n const configPath = getConfigPath();\n if (existsSync(configPath)) {\n unlinkSync(configPath);\n return true;\n }\n return false;\n}\n\n/**\n * Set the anonymous feedback preference in the config.\n * Does nothing when no config exists (avoids creating a skeleton config).\n */\nexport function setFeedbackPreference(anonymous: boolean): void {\n const config = readConfig();\n if (!config) return;\n writeConfig({ ...config, anonymousFeedback: anonymous });\n}\n\n/**\n * Get the anonymous feedback preference from the config.\n * Returns undefined when not set or no config exists.\n */\nexport function getFeedbackPreference(): boolean | undefined {\n const config = readConfig();\n return config?.anonymousFeedback;\n}\n\n/**\n * Whether a config holds a login: a legacy static `token` or an OAuth\n * `accessToken`. The one rule for a stored credential, shared by\n * `credentialSource()` and `setDefaultProject()`.\n */\nexport function hasStoredCredential(config: WalkerOSConfig | null): boolean {\n return Boolean(config?.token || config?.accessToken);\n}\n\n/**\n * Set the default project ID in the config.\n *\n * Needs a credential: `WALKEROS_TOKEN`, or a stored login. An env-only setup\n * gets a config file that holds just the default. Refuses while\n * `WALKEROS_PROJECT_ID` names another project, because the variable takes\n * precedence (see `resolveProjectId`) and the write would change nothing.\n */\nexport function setDefaultProject(projectId: string): void {\n if (!process.env.WALKEROS_TOKEN && !hasStoredCredential(readConfig()))\n throw notAuthenticatedError();\n const envProjectId = process.env.WALKEROS_PROJECT_ID;\n if (envProjectId && envProjectId !== projectId)\n throw new Error(\n `WALKEROS_PROJECT_ID is set to ${envProjectId} and takes precedence over the default project, so ${projectId} would not be used. ` +\n 'Pass projectId on each call, or unset WALKEROS_PROJECT_ID to change the default.',\n );\n writeConfig({ defaultProjectId: projectId });\n}\n\n/**\n * Get the default project ID from the config, or null if not set.\n */\nexport function getDefaultProject(): string | null {\n const config = readConfig();\n return config?.defaultProjectId ?? null;\n}\n\n/**\n * The project a call without a `projectId` works on: `WALKEROS_PROJECT_ID`,\n * then the config's default, or null when neither names one. The one\n * resolution `requireProjectId()` and the local MCP door share.\n */\nexport function resolveProjectId(): string | null {\n return process.env.WALKEROS_PROJECT_ID || getDefaultProject();\n}\n\n/**\n * Remove the default project ID from the config.\n * Does nothing when no config exists. Used to drop a stale default after the\n * project it pointed at has been deleted.\n */\nexport function clearDefaultProject(): void {\n const config = readConfig();\n if (!config) return;\n const { defaultProjectId: _removed, ...rest } = config;\n replaceConfigFile(rest);\n}\n\n/**\n * Resolve the API token using priority order:\n * 1. WALKEROS_TOKEN env var\n * 2. Config file (~/.config/walkeros/config.json)\n * 3. null (not authenticated)\n */\nexport function resolveToken(): {\n token: string;\n source: 'env' | 'config';\n} | null {\n const envToken = process.env.WALKEROS_TOKEN;\n if (envToken) return { token: envToken, source: 'env' };\n\n const config = readConfig();\n if (config?.token) return { token: config.token, source: 'config' };\n\n return null;\n}\n\n/**\n * Resolve the deploy token for container/heartbeat auth.\n * Only checks WALKEROS_DEPLOY_TOKEN env var (never stored in config file).\n */\nexport function resolveDeployToken(): string | null {\n return process.env.WALKEROS_DEPLOY_TOKEN ?? null;\n}\n\n/**\n * Resolve the app URL.\n * WALKEROS_APP_URL env var > config file > default.\n */\nexport function resolveAppUrl(): string {\n const envUrl = process.env.WALKEROS_APP_URL;\n if (envUrl) return envUrl;\n\n const config = readConfig();\n if (config?.appUrl) return config.appUrl;\n\n return 'https://app.walkeros.io';\n}\n","export 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 * The refusal for a request that needs a login when none is stored. It carries\n * `UNAUTHORIZED`, the code the app answers an unauthenticated request with, so\n * a caller handles both the same way.\n */\nexport function notAuthenticatedError(): ApiError {\n return new ApiError('Not authenticated. Run `walkeros auth login` first.', {\n code: 'UNAUTHORIZED',\n });\n}\n\n/**\n * Build ApiError options from an openapi-style error body.\n * The error shape is: { error: { code, message, details: { errors: [] } } }\n * Returns `null` when the body has no recognizable `error` object.\n */\nfunction extractApiErrorOptions(\n error: unknown,\n fallbackMessage: string,\n): { message: string; options: ApiErrorOptions } | null {\n if (\n !error ||\n typeof error !== 'object' ||\n !('error' in error) ||\n typeof (error as Record<string, unknown>).error !== 'object'\n ) {\n return null;\n }\n const inner = (error as { error: Record<string, unknown> }).error;\n const message = (inner.message as string) || fallbackMessage;\n const code = inner.code as string | undefined;\n const details = (inner.details as Record<string, unknown>)?.errors as\n | ApiErrorDetail[]\n | undefined;\n const options: ApiErrorOptions = { code, details };\n if (code === 'CLIENT_OUTDATED') {\n options.minVersion = inner.minVersion as string | undefined;\n options.clientVersion = inner.clientVersion as string | undefined;\n options.client = inner.client as string | undefined;\n options.upgrade = inner.upgrade as string | undefined;\n options.docs = inner.docs as string | undefined;\n }\n return { message, options };\n}\n\n/**\n * Extract structured error from an openapi-fetch error response and throw.\n *\n * For `code === 'CLIENT_OUTDATED'` (HTTP 426), also extracts the upgrade\n * metadata: `minVersion`, `clientVersion`, `client`, `upgrade`, `docs`.\n */\nexport function throwApiError(error: unknown, fallbackMessage: string): never {\n const extracted = extractApiErrorOptions(error, fallbackMessage);\n if (extracted) throw new ApiError(extracted.message, extracted.options);\n throw new ApiError(fallbackMessage);\n}\n\n/**\n * Parse a `Retry-After` header value into seconds. Accepts both the\n * delta-seconds form (`\"30\"`) and the HTTP-date form. Returns `undefined`\n * when the value is absent or unparseable.\n */\nexport function parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (/^\\d+$/.test(trimmed)) return parseInt(trimmed, 10);\n const when = Date.parse(trimmed);\n if (Number.isNaN(when)) return undefined;\n return Math.max(0, Math.round((when - Date.now()) / 1000));\n}\n\n/**\n * Like `throwApiError`, but classifies retryability from the HTTP response.\n * A 429 is always retryable; a 503 is retryable when it carries a\n * `Retry-After` hint. The parsed wait (seconds) is attached for `--wait`\n * callers to honor and for the machine-readable error line.\n */\nexport function throwApiResponseError(\n response: Pick<Response, 'status' | 'headers'>,\n body: unknown,\n fallbackMessage: string,\n): never {\n const status = response.status;\n const retryAfterSeconds = parseRetryAfter(\n response.headers.get('retry-after'),\n );\n const retryable =\n status === 429 || (status === 503 && retryAfterSeconds !== undefined);\n\n const extracted = extractApiErrorOptions(body, fallbackMessage);\n const message = extracted?.message ?? fallbackMessage;\n const options: ApiErrorOptions = {\n ...(extracted?.options ?? {}),\n status,\n retryable,\n retryAfterSeconds,\n };\n throw new ApiError(message, options);\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","/**\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","import { closeSync, mkdirSync, openSync, statSync, unlinkSync } from 'fs';\nimport { getConfigDir, getConfigPath } from './config-file.js';\n\n/**\n * A lock older than this is treated as abandoned. It bounds the damage a\n * process killed mid-refresh can do: without it, one crash leaves every later\n * command waiting for a holder that will never return.\n */\nconst STALE_MS = 15_000;\n\n/** Gap between acquire attempts. */\nconst RETRY_MS = 100;\n\n/** How long to keep trying before giving up on a lock somebody else holds. */\nconst TIMEOUT_MS = 10_000;\n\n/** Path of the lock guarding the config file. */\nexport function getConfigLockPath(): string {\n return `${getConfigPath()}.lock`;\n}\n\nfunction hasCode(value: unknown): value is { code: unknown } {\n return typeof value === 'object' && value !== null && 'code' in value;\n}\n\n/**\n * Matched on the `code` property rather than on `instanceof Error`, which is\n * unreliable across realm boundaries (a test runner's module sandbox is one).\n */\nfunction isAlreadyLocked(error: unknown): boolean {\n return hasCode(error) && error.code === 'EEXIST';\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Remove the lock when its holder has clearly gone away. Returns whether the\n * lock was removed, so the caller can retry immediately rather than sleeping.\n */\nfunction breakIfStale(lockPath: string): boolean {\n try {\n const age = Date.now() - statSync(lockPath).mtimeMs;\n if (age < STALE_MS) return false;\n unlinkSync(lockPath);\n return true;\n } catch {\n // Gone between the stat and the unlink, or never there: either way the\n // next acquire attempt is the answer.\n return false;\n }\n}\n\n/**\n * Run `fn` while holding an exclusive lock on the config file.\n *\n * Several walkerOS processes can share one config (a shell, an editor's MCP\n * server, a watch loop). Without a lock, two of them noticing an expired\n * access token at the same moment would both spend the single-use refresh\n * token, and the loser's rotation would invalidate the winner's session.\n *\n * The lock is a file created with `O_EXCL`, which is atomic on every platform\n * the CLI runs on and needs no daemon.\n */\nexport async function withConfigLock<T>(fn: () => Promise<T>): Promise<T> {\n const lockPath = getConfigLockPath();\n mkdirSync(getConfigDir(), { recursive: true, mode: 0o700 });\n\n const deadline = Date.now() + TIMEOUT_MS;\n\n for (;;) {\n let handle: number;\n try {\n handle = openSync(lockPath, 'wx', 0o600);\n } catch (error) {\n if (!isAlreadyLocked(error)) throw error;\n if (breakIfStale(lockPath)) continue;\n if (Date.now() >= deadline) {\n throw new Error(\n `Timed out waiting for the walkerOS config lock at ${lockPath}. ` +\n 'Remove the file if no other walkeros process is running.',\n );\n }\n await delay(RETRY_MS);\n continue;\n }\n\n closeSync(handle);\n try {\n return await fn();\n } finally {\n try {\n unlinkSync(lockPath);\n } catch {\n // Another process broke the lock as stale while we held it. Nothing to\n // release, and failing here would mask the callback's own result.\n }\n }\n }\n}\n","import { z } from 'zod';\nimport { requireSecureUrl } from '../lib/secure-url.js';\nimport { apiRequest } from './api-request.js';\nimport type { ApiTransport } from './api-request.js';\n\n/**\n * OAuth 2.1 client for the walkerOS authorization server.\n *\n * Pure HTTP with `fetch` injected: nothing here reads the config file or the\n * environment, so the flows can be exercised without a machine state.\n */\n\n/** Public client id seeded for the CLI. It has no secret. */\nexport const CLI_CLIENT_ID = 'walkeros-cli';\n\n/**\n * `offline_access` is what buys the refresh token; without it every command\n * would send the person back to the browser once the access token expired.\n */\nexport const CLI_SCOPE = 'read write offline_access';\n\nconst DEVICE_CODE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code';\n\n/**\n * Ceiling on a refresh request. It is deliberately below the 15 s after which\n * `withConfigLock` treats a lock as abandoned: a refresh runs while holding\n * that lock, so a request allowed to hang longer would have its own lock\n * broken out from under it and race the process that took it next.\n */\nconst REFRESH_TIMEOUT_MS = 10_000;\n\n/**\n * Ceiling on a revocation. Nothing waits on its answer, so this only bounds\n * how long a logout stands still before clearing the machine.\n */\nconst REVOKE_TIMEOUT_MS = 5_000;\n\n/**\n * Ceiling on the request that opens a device authorization. Nothing has been\n * issued yet, so this only bounds how long `walkeros auth login` stands still\n * before it can show a code, but a server that accepts the connection and then\n * says nothing would otherwise hold it for the HTTP client's own default.\n */\nconst DEVICE_AUTHORIZATION_TIMEOUT_MS = 10_000;\n\nconst DeviceAuthorizationSchema = z.object({\n device_code: z.string().min(1),\n user_code: z.string().min(1),\n verification_uri: z.string().min(1),\n verification_uri_complete: z.string().min(1).optional(),\n expires_in: z.number().int().nonnegative(),\n interval: z.number().int().nonnegative(),\n});\n\nconst TokenSchema = z.object({\n access_token: z.string().min(1),\n expires_in: z.number().int().nonnegative(),\n refresh_token: z.string().min(1).optional(),\n});\n\nconst ErrorSchema = z.object({\n error: z.string().min(1),\n error_description: z.string().optional(),\n});\n\nexport interface DeviceAuthorization {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n interval: number;\n}\n\nexport interface TokenSet {\n accessToken: string;\n accessTokenExpiresAt: string;\n refreshToken: string | null;\n}\n\nexport type DevicePoll =\n | { status: 'ok'; tokens: TokenSet }\n | { status: 'pending' }\n | { status: 'slow_down' }\n | { status: 'denied' }\n | { status: 'expired' }\n | { status: 'error'; error: string };\n\n/** Parse a response body as JSON, or null when it is not JSON at all. */\nasync function readJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return null;\n }\n}\n\n/**\n * The RFC 6749 section 5.2 error code carried by a failed response, or null\n * when the body is not an OAuth error (a proxy's HTML, say).\n */\nfunction errorCode(body: unknown): string | null {\n const parsed = ErrorSchema.safeParse(body);\n return parsed.success ? parsed.data.error : null;\n}\n\nfunction describe(response: Response, body: unknown): string {\n const parsed = ErrorSchema.safeParse(body);\n if (parsed.success) {\n return parsed.data.error_description\n ? `${parsed.data.error}: ${parsed.data.error_description}`\n : parsed.data.error;\n }\n return `HTTP ${response.status}`;\n}\n\n/**\n * Every request in this module either carries a credential or mints one, so\n * the two rules that protect one are applied here rather than per call:\n * plain http is refused off the local machine, and a redirect is an error\n * rather than a hop, because following one would hand the token (or the code\n * that buys it) to whichever host the answer named.\n */\nfunction credentialTransport(\n appUrl: string,\n fetchFn: typeof fetch,\n signal?: AbortSignal,\n): ApiTransport {\n return {\n auth: 'none',\n baseUrl: requireSecureUrl(appUrl),\n fetch: fetchFn,\n headers: { Accept: 'application/json' },\n redirect: 'error',\n ...(signal ? { signal } : {}),\n };\n}\n\nfunction toTokenSet(body: unknown): TokenSet {\n const parsed = TokenSchema.safeParse(body);\n if (!parsed.success) throw new Error('Malformed token response');\n\n return {\n accessToken: parsed.data.access_token,\n accessTokenExpiresAt: new Date(\n Date.now() + parsed.data.expires_in * 1000,\n ).toISOString(),\n refreshToken: parsed.data.refresh_token ?? null,\n };\n}\n\n/**\n * RFC 8628 section 3.1. Ask for a device code and the URL to send the person\n * to. Unauthenticated: the code is worth nothing until somebody approves it.\n */\nexport async function startDeviceAuthorization(\n appUrl: string,\n fetchFn: typeof fetch = globalThis.fetch,\n): Promise<DeviceAuthorization> {\n const response = await apiRequest('POST /api/oauth/device_authorization', {\n ...credentialTransport(\n appUrl,\n fetchFn,\n AbortSignal.timeout(DEVICE_AUTHORIZATION_TIMEOUT_MS),\n ),\n form: {\n client_id: CLI_CLIENT_ID,\n scope: CLI_SCOPE,\n // RFC 8707. The token comes back bound to the API, so a leaked CLI token\n // cannot be replayed against the MCP resource.\n resource: `${appUrl}/api`,\n },\n });\n\n const body = await readJson(response);\n if (!response.ok) throw new Error(describe(response, body));\n\n const parsed = DeviceAuthorizationSchema.safeParse(body);\n if (!parsed.success)\n throw new Error('Malformed device authorization response');\n\n return {\n deviceCode: parsed.data.device_code,\n userCode: parsed.data.user_code,\n verificationUri: parsed.data.verification_uri,\n verificationUriComplete:\n parsed.data.verification_uri_complete ?? parsed.data.verification_uri,\n expiresIn: parsed.data.expires_in,\n interval: parsed.data.interval,\n };\n}\n\n/**\n * One poll of RFC 8628 section 3.4. Every outcome is a returned status rather\n * than a throw, because four of them are ordinary steps of a flow that is\n * still running.\n *\n * `signal` is how a caller keeps its own deadline: without one, a server that\n * accepts the connection and then says nothing holds this call for the HTTP\n * client's default, which is minutes.\n */\nexport async function pollDeviceToken(\n appUrl: string,\n deviceCode: string,\n fetchFn: typeof fetch = globalThis.fetch,\n signal?: AbortSignal,\n): Promise<DevicePoll> {\n let response: Response;\n try {\n response = await apiRequest('POST /api/oauth/token', {\n ...credentialTransport(appUrl, fetchFn, signal),\n form: {\n grant_type: DEVICE_CODE_GRANT,\n device_code: deviceCode,\n client_id: CLI_CLIENT_ID,\n },\n });\n } catch (error) {\n // Only an abort of the caller's own signal is an outcome rather than a\n // fault: the authorization is untouched, so it is still pending and the\n // caller's loop decides whether there is room for another attempt. Any\n // other transport failure is a real error and stays one.\n if (signal?.aborted) return { status: 'pending' };\n throw error;\n }\n\n const body = await readJson(response);\n\n if (response.ok) {\n try {\n return { status: 'ok', tokens: toTokenSet(body) };\n } catch (error) {\n return {\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n switch (errorCode(body)) {\n case 'authorization_pending':\n return { status: 'pending' };\n case 'slow_down':\n return { status: 'slow_down' };\n case 'access_denied':\n return { status: 'denied' };\n case 'expired_token':\n return { status: 'expired' };\n default:\n return { status: 'error', error: describe(response, body) };\n }\n}\n\n/**\n * Spend a refresh token for a new pair.\n *\n * `null` means the server rejected the token itself and only a fresh login\n * can recover. Every other failure throws, so a transient fault stays\n * distinguishable from a dead session and never costs the person their login.\n */\nexport async function refreshTokens(\n appUrl: string,\n refreshToken: string,\n fetchFn: typeof fetch = globalThis.fetch,\n): Promise<TokenSet | null> {\n const response = await apiRequest('POST /api/oauth/token', {\n ...credentialTransport(\n appUrl,\n fetchFn,\n AbortSignal.timeout(REFRESH_TIMEOUT_MS),\n ),\n form: {\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: CLI_CLIENT_ID,\n },\n });\n\n const body = await readJson(response);\n\n if (!response.ok) {\n if (errorCode(body) === 'invalid_grant') return null;\n throw new Error(describe(response, body));\n }\n\n return toTokenSet(body);\n}\n\n/**\n * RFC 7009. Best effort by design: logout must clear the local config whether\n * or not the server could be reached, and the server answers a revocation it\n * cannot act on with 200 anyway.\n */\nexport async function revokeRefreshToken(\n appUrl: string,\n refreshToken: string,\n fetchFn: typeof fetch = globalThis.fetch,\n): Promise<void> {\n try {\n await apiRequest('POST /api/oauth/revoke', {\n ...credentialTransport(\n appUrl,\n fetchFn,\n AbortSignal.timeout(REVOKE_TIMEOUT_MS),\n ),\n form: {\n token: refreshToken,\n token_type_hint: 'refresh_token',\n client_id: CLI_CLIENT_ID,\n },\n });\n } catch {\n // Offline, or the server is down. The local credential is still cleared.\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","import { createHash } from 'node:crypto';\n\n/**\n * The client subset of the app's OpenAPI document: the operations a walkerOS\n * client calls (listed in `openapi/client-operations.json`), the components\n * they reference, and nothing that only documents them.\n *\n * Imports only `node:crypto` and uses erasable TypeScript only, so plain\n * `node` runs this file without a build (`scripts/generate-client-spec.mjs`\n * and the release checks import it directly).\n */\n\ntype JsonObject = { [key: string]: unknown };\n\nconst HTTP_METHODS: ReadonlySet<string> = new Set([\n 'get',\n 'put',\n 'post',\n 'delete',\n 'options',\n 'head',\n 'patch',\n 'trace',\n]);\n\n/**\n * Keywords that only document. Stripped wherever they are keywords; `tags`\n * groups operations for documentation and never reaches the wire.\n */\nconst DOC_KEYWORDS: ReadonlySet<string> = new Set([\n 'description',\n 'summary',\n 'title',\n 'example',\n 'examples',\n 'externalDocs',\n 'tags',\n]);\n\n/** Keywords whose value is data, never a document node: kept verbatim. */\nconst VERBATIM_KEYWORDS: ReadonlySet<string> = new Set([\n 'enum',\n 'const',\n 'default',\n 'required',\n 'security',\n 'mapping',\n 'scopes',\n]);\n\n/**\n * Keywords whose value maps NAMES to nodes: a property, a status code, a\n * media type, a component. The names are never keywords, so a property named\n * `description` survives.\n */\nconst NAME_MAPS: ReadonlySet<string> = new Set([\n 'properties',\n 'patternProperties',\n 'dependentSchemas',\n '$defs',\n 'definitions',\n 'paths',\n 'webhooks',\n 'schemas',\n 'responses',\n 'parameters',\n 'requestBodies',\n 'headers',\n 'securitySchemes',\n 'links',\n 'callbacks',\n 'pathItems',\n 'content',\n 'encoding',\n 'variables',\n]);\n\n/** Top-level keys a client subset does not carry. */\nconst DROPPED_TOP_LEVEL: ReadonlySet<string> = new Set([\n 'tags',\n 'webhooks',\n 'externalDocs',\n]);\n\nconst NOTHING_KEPT: ReadonlySet<string> = new Set();\n\nfunction isRecord(value: unknown): value is JsonObject {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isVerbatim(key: string): boolean {\n return VERBATIM_KEYWORDS.has(key) || key.startsWith('x-');\n}\n\n/**\n * Recursively order object keys so equal documents serialize byte-identically\n * regardless of key order. Arrays keep their order. Identical to the app's\n * `canonicalize` (app/src/lib/api/contract-version.ts).\n */\nexport function canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (isRecord(value)) {\n const result: JsonObject = {};\n for (const key of Object.keys(value).sort()) {\n result[key] = canonicalize(value[key]);\n }\n return result;\n }\n return value;\n}\n\n/** `\"<METHOD> <path>\"` split into the lowercase method key and the path. */\nexport function parseOperation(op: string): { method: string; path: string } {\n const space = op.indexOf(' ');\n const method = space > 0 ? op.slice(0, space).toLowerCase() : '';\n const path = op.slice(space + 1);\n if (!HTTP_METHODS.has(method) || !path.startsWith('/')) {\n throw new Error(`invalid operation: ${op}`);\n }\n return { method, path };\n}\n\n/** One entry of `client-operations.json`. */\nexport interface ManifestEntry {\n /** `\"<METHOD> <path template>\"`. */\n op: string;\n /** The commands, tools and exports that call it. */\n usedBy: string[];\n}\n\nfunction isStringList(value: unknown): value is string[] {\n return (\n Array.isArray(value) && value.every((item) => typeof item === 'string')\n );\n}\n\n/**\n * The entries of a parsed `client-operations.json`: a list of\n * `{ op, usedBy }`. Throws on any other shape.\n */\nexport function manifestEntries(manifest: unknown): ManifestEntry[] {\n if (!Array.isArray(manifest)) {\n throw new Error('client operations manifest is not a list');\n }\n return manifest.map((entry) => {\n if (\n !isRecord(entry) ||\n typeof entry.op !== 'string' ||\n !isStringList(entry.usedBy)\n ) {\n throw new Error(\n `client operations manifest entry is not { op, usedBy }: ${JSON.stringify(entry)}`,\n );\n }\n parseOperation(entry.op);\n return { op: entry.op, usedBy: entry.usedBy };\n });\n}\n\n/** The `op` of every entry of a parsed `client-operations.json`. */\nexport function manifestOperations(manifest: unknown): string[] {\n return manifestEntries(manifest).map((entry) => entry.op);\n}\n\n/** Every `\"<METHOD> <path>\"` a document declares, in document order. */\nexport function documentOperations(doc: unknown): string[] {\n const paths = isRecord(doc) && isRecord(doc.paths) ? doc.paths : {};\n const operations: string[] = [];\n for (const [path, item] of Object.entries(paths)) {\n if (!isRecord(item)) continue;\n for (const key of Object.keys(item)) {\n if (HTTP_METHODS.has(key))\n operations.push(`${key.toUpperCase()} ${path}`);\n }\n }\n return operations;\n}\n\nfunction hasOperation(doc: unknown, op: string): boolean {\n const { method, path } = parseOperation(op);\n if (!isRecord(doc) || !isRecord(doc.paths)) return false;\n const item = doc.paths[path];\n return isRecord(item) && isRecord(item[method]);\n}\n\nfunction stripNode(node: unknown): unknown {\n if (Array.isArray(node)) return node.map(stripNode);\n if (!isRecord(node)) return node;\n return stripObject(node, NOTHING_KEPT);\n}\n\nfunction stripObject(node: JsonObject, kept: ReadonlySet<string>): JsonObject {\n const out: JsonObject = {};\n for (const [key, value] of Object.entries(node)) {\n if (kept.has(key) || isVerbatim(key)) out[key] = value;\n else if (DOC_KEYWORDS.has(key)) continue;\n else if (NAME_MAPS.has(key) && isRecord(value)) {\n out[key] = stripNameMap(value, key === 'responses');\n } else out[key] = stripNode(value);\n }\n return out;\n}\n\nfunction stripNameMap(map: JsonObject, responses: boolean): JsonObject {\n const out: JsonObject = {};\n for (const [name, node] of Object.entries(map)) {\n out[name] = responses ? stripResponse(node) : stripNode(node);\n }\n return out;\n}\n\n/** OpenAPI requires a Response object's `description`; it stays, emptied. */\nfunction stripResponse(node: unknown): unknown {\n if (!isRecord(node) || typeof node.$ref === 'string') return stripNode(node);\n return { description: '', ...stripObject(node, NOTHING_KEPT) };\n}\n\n/** The whole document with doc keywords stripped; `info` keeps its title. */\nfunction stripDocument(doc: JsonObject): JsonObject {\n const out: JsonObject = {};\n for (const [key, value] of Object.entries(doc)) {\n if (DROPPED_TOP_LEVEL.has(key)) continue;\n if (key === 'info' && isRecord(value)) {\n out.info = stripObject(value, new Set(['title', 'version']));\n } else if (isVerbatim(key)) out[key] = value;\n else if (NAME_MAPS.has(key) && isRecord(value)) {\n out[key] = stripNameMap(value, false);\n } else out[key] = stripNode(value);\n }\n return out;\n}\n\n/**\n * Every `$ref` and discriminator mapping target under a node. Walked by\n * structure like the stripping: the keys of a name map are names, never\n * keywords, so a property named `default` or `mapping` is a schema.\n */\nfunction collectRefs(node: unknown, refs: Set<string>): void {\n if (Array.isArray(node)) {\n for (const item of node) collectRefs(item, refs);\n return;\n }\n if (!isRecord(node)) return;\n for (const [key, value] of Object.entries(node)) {\n if (key === '$ref' && typeof value === 'string') refs.add(value);\n else if (NAME_MAPS.has(key) && isRecord(value)) {\n for (const named of Object.values(value)) collectRefs(named, refs);\n } else if (key === 'discriminator' && isRecord(value)) {\n const mapping = isRecord(value.mapping) ? value.mapping : {};\n for (const target of Object.values(mapping)) {\n if (typeof target === 'string') refs.add(target);\n }\n } else if (!isVerbatim(key)) collectRefs(value, refs);\n }\n}\n\n/** `#/components/<section>/<name>` as its section and name. */\nfunction componentOf(ref: string): { section: string; name: string } {\n const parts = ref.startsWith('#/')\n ? ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n : [];\n if (parts.length < 3 || parts[0] !== 'components') {\n throw new Error(`unsupported $ref: ${ref}`);\n }\n return { section: parts[1], name: parts[2] };\n}\n\nfunction pruneComponents(\n components: JsonObject,\n roots: unknown[],\n): JsonObject | undefined {\n const referenced = new Map<string, Set<string>>();\n const pending: string[] = [];\n const queue = (node: unknown): void => {\n const refs = new Set<string>();\n collectRefs(node, refs);\n pending.push(...refs);\n };\n for (const root of roots) queue(root);\n if (isRecord(components.securitySchemes)) queue(components.securitySchemes);\n\n for (let ref = pending.pop(); ref !== undefined; ref = pending.pop()) {\n const { section, name } = componentOf(ref);\n const names = referenced.get(section) ?? new Set<string>();\n if (names.has(name)) continue;\n const entries = components[section];\n if (!isRecord(entries) || !(name in entries)) {\n throw new Error(`$ref target not in input: ${ref}`);\n }\n names.add(name);\n referenced.set(section, names);\n queue(entries[name]);\n }\n\n const out: JsonObject = {};\n for (const [section, entries] of Object.entries(components)) {\n if (!isRecord(entries)) continue;\n if (section === 'securitySchemes') {\n out[section] = entries;\n continue;\n }\n const names = referenced.get(section);\n if (!names) continue;\n const kept: JsonObject = {};\n for (const [name, node] of Object.entries(entries)) {\n if (names.has(name)) kept[name] = node;\n }\n out[section] = kept;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/**\n * The client subset of an OpenAPI document: exactly `ops` (each with its\n * path-level parameters), the components they reach through `$ref`, and the\n * security schemes, with every documentation keyword stripped. A Response\n * object keeps `description: ''`; `info` keeps `title` and `version`. The\n * top-level `tags`, `webhooks` and `externalDocs` are dropped.\n *\n * Throws `manifest operation not in input: <op>` for an operation the\n * document lacks. Pruning a pruned document changes nothing.\n */\nexport function pruneToOperations(\n doc: unknown,\n ops: readonly string[],\n): JsonObject {\n if (!isRecord(doc) || !isRecord(doc.paths)) {\n throw new Error('input is not an OpenAPI document with paths');\n }\n for (const op of ops) {\n if (!hasOperation(doc, op)) {\n throw new Error(`manifest operation not in input: ${op}`);\n }\n }\n\n const listed = new Set(\n ops.map((op) => {\n const { method, path } = parseOperation(op);\n return `${method} ${path}`;\n }),\n );\n const stripped = stripDocument(doc);\n const allPaths = isRecord(stripped.paths) ? stripped.paths : {};\n\n const paths: JsonObject = {};\n for (const [path, item] of Object.entries(allPaths)) {\n if (!isRecord(item)) continue;\n const kept: JsonObject = {};\n let operations = 0;\n for (const [key, value] of Object.entries(item)) {\n if (!HTTP_METHODS.has(key)) kept[key] = value;\n else if (listed.has(`${key} ${path}`)) {\n kept[key] = value;\n operations += 1;\n }\n }\n if (operations > 0) paths[path] = kept;\n }\n\n const out: JsonObject = {};\n const roots: unknown[] = [];\n for (const [key, value] of Object.entries(stripped)) {\n if (key === 'components') continue;\n out[key] = key === 'paths' ? paths : value;\n roots.push(out[key]);\n }\n if (isRecord(stripped.components)) {\n const components = pruneComponents(stripped.components, roots);\n if (components) out.components = components;\n }\n return out;\n}\n\n/** The component a `$ref` names, inside a pruned document. */\nfunction resolveRef(doc: JsonObject, ref: string): unknown {\n const { section, name } = componentOf(ref);\n const components = isRecord(doc.components) ? doc.components : {};\n const entries = components[section];\n return isRecord(entries) ? entries[name] : undefined;\n}\n\n/**\n * A node with every `$ref` replaced by its target, except a cycle's. Walked\n * by structure like {@link collectRefs}: the keys of a name map are names.\n */\nfunction inlineRefs(\n node: unknown,\n doc: JsonObject,\n stack: readonly string[],\n): unknown {\n if (Array.isArray(node)) {\n return node.map((item) => inlineRefs(item, doc, stack));\n }\n if (!isRecord(node)) return node;\n const out: JsonObject = {};\n for (const [key, value] of Object.entries(node)) {\n if (key === '$ref' && typeof value === 'string' && !stack.includes(value)) {\n out[key] = inlineRefs(resolveRef(doc, value), doc, [...stack, value]);\n } else if (key === '$ref') out[key] = value;\n else if (NAME_MAPS.has(key) && isRecord(value)) {\n const named: JsonObject = {};\n for (const [name, child] of Object.entries(value)) {\n named[name] = inlineRefs(child, doc, stack);\n }\n out[key] = named;\n } else if (isVerbatim(key)) out[key] = value;\n else out[key] = inlineRefs(value, doc, stack);\n }\n return out;\n}\n\n/**\n * A wire digest per operation: the sha256 hex of the canonical operation\n * subtree (its path-level parameters and the operation) of the client subset,\n * with every `$ref` inlined. A `$ref` already on the current inlining path\n * stays a `$ref`. Canonicalized like {@link canonicalize}, so documentation\n * changes leave a digest equal and a wire change in a referenced schema\n * changes the digest of exactly the operations that reach it.\n *\n * Operations the document lacks are absent from the result.\n */\nexport function operationDigests(\n doc: unknown,\n ops: readonly string[],\n): Record<string, string> {\n const present = ops.filter((op) => hasOperation(doc, op));\n const pruned = pruneToOperations(doc, present);\n const paths = isRecord(pruned.paths) ? pruned.paths : {};\n const digests: Record<string, string> = {};\n for (const op of present) {\n const { method, path } = parseOperation(op);\n const item = paths[path];\n if (!isRecord(item)) continue;\n const subtree = inlineRefs(\n { pathParameters: item.parameters ?? [], operation: item[method] },\n pruned,\n [],\n );\n digests[op] = createHash('sha256')\n .update(JSON.stringify(canonicalize(subtree)))\n .digest('hex');\n }\n return digests;\n}\n\n/** A contract label's floor: its version without the build metadata. */\ninterface Floor {\n core: [number, number, number];\n prerelease: string[];\n}\n\nfunction parseFloor(label: string): Floor {\n const match =\n /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/.exec(\n label,\n );\n if (!match) throw new Error(`invalid contract label: ${label}`);\n return {\n core: [Number(match[1]), Number(match[2]), Number(match[3])],\n prerelease: match[4] ? match[4].split('.') : [],\n };\n}\n\n/** Semver precedence of two floors: negative when `a` is the lower one. */\nfunction compareFloors(a: Floor, b: Floor): number {\n for (let i = 0; i < 3; i += 1) {\n if (a.core[i] !== b.core[i]) return a.core[i] - b.core[i];\n }\n // A release ranks above any prerelease of the same version.\n if (a.prerelease.length === 0 || b.prerelease.length === 0) {\n return b.prerelease.length - a.prerelease.length;\n }\n const length = Math.min(a.prerelease.length, b.prerelease.length);\n for (let i = 0; i < length; i += 1) {\n const x = a.prerelease[i];\n const y = b.prerelease[i];\n if (x === y) continue;\n const xNumeric = /^\\d+$/.test(x);\n const yNumeric = /^\\d+$/.test(y);\n if (xNumeric && yNumeric) return Number(x) - Number(y);\n if (xNumeric !== yNumeric) return xNumeric ? -1 : 1;\n return x < y ? -1 : 1;\n }\n return a.prerelease.length - b.prerelease.length;\n}\n\n/**\n * Whether the contract label's floor dropped from `base` to `head`. A label\n * is `<floor>+<hash8>`, and the floor orders labels the way semver does,\n * ignoring the build metadata. A base without build metadata is a\n * release-line label that names no floor, so nothing is ordered against it.\n * Throws `invalid contract label: <label>` for a label that is not a version.\n */\nexport function labelFloorRegressed(base: string, head: string): boolean {\n if (!base.includes('+')) return false;\n return compareFloors(parseFloor(head), parseFloor(base)) < 0;\n}\n\nfunction labelOf(doc: unknown): string | undefined {\n return isRecord(doc) &&\n isRecord(doc.info) &&\n typeof doc.info.version === 'string'\n ? doc.info.version\n : undefined;\n}\n\nfunction withoutLabel(doc: JsonObject): JsonObject {\n if (!isRecord(doc.info)) return doc;\n const { version: _version, ...info } = doc.info;\n return { ...doc, info };\n}\n\n/** Whether two labels name the same floor; a label without one names none. */\nfunction sameFloor(previous: string, next: string): boolean {\n if (previous === next) return true;\n if (!previous.includes('+') || !next.includes('+')) return false;\n return compareFloors(parseFloor(previous), parseFloor(next)) === 0;\n}\n\n/**\n * Whether a freshly pruned client subset leaves the previous one as it is:\n * equal apart from `info.version`, with labels of the same floor. An app\n * change no client operation sees then keeps the committed subset, and its\n * label stays the app label of the last client-visible change.\n */\nexport function subsetUnchanged(previous: unknown, next: unknown): boolean {\n if (!isRecord(previous) || !isRecord(next)) return false;\n const previousLabel = labelOf(previous);\n const nextLabel = labelOf(next);\n if (previousLabel === undefined || nextLabel === undefined) return false;\n if (!sameFloor(previousLabel, nextLabel)) return false;\n return (\n JSON.stringify(canonicalize(withoutLabel(previous))) ===\n JSON.stringify(canonicalize(withoutLabel(next)))\n );\n}\n","import type { paths } from '../types/api.gen.js';\nimport { resolveAppUrl, resolveDeployToken } from '../lib/config-file.js';\nimport { requireSecureUrl } from '../lib/secure-url.js';\nimport { resolveAccessToken } from './auth.js';\nimport { clientContextHeaders } from './client-context.js';\nimport { apiFetch, deployFetch, publicFetch } from './http.js';\nimport { parseOperation } from './openapi-subset.js';\n\ntype Method =\n | 'get'\n | 'put'\n | 'post'\n | 'delete'\n | 'options'\n | 'head'\n | 'patch'\n | 'trace';\n\n/**\n * Every app operation a walkerOS client calls, as `\"<METHOD> <path>\"`. Derived\n * from the client subset of the contract (`openapi/client-operations.json`),\n * so an operation missing from that manifest is not a key here.\n */\nexport type OperationKey = {\n [P in keyof paths & string]: {\n [M in Method]: undefined extends paths[P][M]\n ? never\n : `${Uppercase<M>} ${P}`;\n }[Method];\n}[keyof paths & string];\n\ntype OperationOf<K extends OperationKey> = K extends `${infer M} ${infer P}`\n ? P extends keyof paths\n ? NonNullable<paths[P][Lowercase<M> & keyof paths[P]]>\n : never\n : never;\n\ntype ParametersOf<K extends OperationKey> =\n OperationOf<K> extends { parameters: infer X } ? X : never;\n\ntype PathParams<K extends OperationKey> =\n ParametersOf<K> extends { path: infer X } ? X : never;\n\ntype QueryParams<K extends OperationKey> =\n ParametersOf<K> extends { query?: infer X } ? Exclude<X, undefined> : never;\n\ntype RequestBodyOf<K extends OperationKey> =\n OperationOf<K> extends { requestBody?: infer B }\n ? Exclude<B, undefined>\n : never;\n\ntype ContentOf<K extends OperationKey, Type extends string> = [\n RequestBodyOf<K>,\n] extends [never]\n ? never\n : RequestBodyOf<K> extends { content: infer C }\n ? Type extends keyof C\n ? C[Type]\n : never\n : never;\n\ntype BodyRequired<K extends OperationKey> =\n OperationOf<K> extends { requestBody: unknown } ? true : false;\n\ntype PathInit<K extends OperationKey> = [PathParams<K>] extends [never]\n ? { path?: undefined }\n : { path: PathParams<K> };\n\ntype QueryInit<K extends OperationKey> = [QueryParams<K>] extends [never]\n ? { query?: undefined }\n : object extends QueryParams<K>\n ? { query?: QueryParams<K> }\n : { query: QueryParams<K> };\n\ntype JsonInit<K extends OperationKey> = [\n ContentOf<K, 'application/json'>,\n] extends [never]\n ? { body?: undefined }\n : BodyRequired<K> extends true\n ? { body: ContentOf<K, 'application/json'> }\n : { body?: ContentOf<K, 'application/json'> };\n\ntype FormInit<K extends OperationKey> = [\n ContentOf<K, 'application/x-www-form-urlencoded'>,\n] extends [never]\n ? { form?: undefined }\n : { form: ContentOf<K, 'application/x-www-form-urlencoded'> };\n\n/**\n * Which credential a request carries:\n * - `'user'`: the access token (`WALKEROS_TOKEN`, then the stored session),\n * only over a secure URL; without one the request goes out unauthenticated.\n * - `'deploy'`: the deploy token, then the access token; without either the\n * request is refused.\n * - `'none'`: no credential.\n * - `{ token }`: exactly this bearer, only over a secure URL.\n */\nexport type ApiAuth = 'user' | 'deploy' | 'none' | { token: string };\n\n/** How a request travels, independent of the operation. */\nexport interface ApiTransport {\n /** Default `'user'`. */\n auth?: ApiAuth;\n /** The app to call, without a trailing slash. Default `resolveAppUrl()`. */\n baseUrl?: string;\n /** Default the global `fetch`. */\n fetch?: typeof fetch;\n headers?: Readonly<Record<string, string>>;\n signal?: AbortSignal;\n redirect?: RequestRedirect;\n}\n\n/**\n * The request for one operation: its path parameters, query and body, each\n * typed from the contract, plus the transport.\n */\nexport type ApiRequestInit<K extends OperationKey> = ApiTransport &\n PathInit<K> &\n QueryInit<K> &\n JsonInit<K> &\n FormInit<K>;\n\ntype InitArgs<K extends OperationKey> =\n object extends ApiRequestInit<K>\n ? [init?: ApiRequestInit<K>]\n : [init: ApiRequestInit<K>];\n\ntype ResponsesOf<K extends OperationKey> =\n OperationOf<K> extends { responses: infer R } ? R : never;\n\n/** The parsed JSON body of an operation's response with status `S`. */\nexport type ResponseJson<\n K extends OperationKey,\n S extends keyof ResponsesOf<K>,\n> = ResponsesOf<K>[S] extends { content: { 'application/json': infer J } }\n ? J\n : never;\n\n/** The untyped request shape every typed {@link ApiRequestInit} fits. */\ninterface RequestShape extends ApiTransport {\n path?: Readonly<Record<string, string | number>>;\n query?: Readonly<Record<string, unknown>>;\n body?: unknown;\n form?: Readonly<Record<string, unknown>>;\n}\n\nconst DEPLOY_TOKEN_MISSING =\n 'No authentication token available. Set WALKEROS_DEPLOY_TOKEN or run walkeros auth login.';\n\n/**\n * The operation's path with each path parameter encoded once, plus the\n * serialized query. Query entries keep their order; `undefined` and `null`\n * values are left out, an array value repeats its key.\n */\nfunction operationTarget(\n op: string,\n path: RequestShape['path'],\n query: RequestShape['query'],\n): string {\n const template = parseOperation(op).path;\n const filled = template.replace(/\\{([^}]+)\\}/g, (_match, name: string) => {\n const value = path?.[name];\n if (value === undefined) {\n throw new Error(`${op}: path parameter ${name} is missing`);\n }\n return encodeURIComponent(String(value));\n });\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value === undefined || value === null) continue;\n for (const item of Array.isArray(value) ? value : [value]) {\n search.append(key, String(item));\n }\n }\n const serialized = search.toString();\n return serialized ? `${filled}?${serialized}` : filled;\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/** Later layers win; a name replaces the same name in any letter case. */\nfunction mergeHeaders(\n ...layers: ReadonlyArray<Readonly<Record<string, string>>>\n): Record<string, string> {\n const merged: Record<string, string> = {};\n for (const layer of layers) {\n for (const [name, value] of Object.entries(layer)) {\n const lower = name.toLowerCase();\n for (const existing of Object.keys(merged)) {\n if (existing.toLowerCase() === lower) delete merged[existing];\n }\n merged[name] = value;\n }\n }\n return merged;\n}\n\nfunction formBody(form: Readonly<Record<string, unknown>>): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(form)) {\n if (value !== undefined && value !== null)\n params.append(key, String(value));\n }\n return params.toString();\n}\n\n/** Method, caller headers and serialized body, without any credential. */\nfunction requestParts(\n op: string,\n init: RequestShape,\n): { method: string; headers: Record<string, string>; body?: string } {\n const method = parseOperation(op).method.toUpperCase();\n const headers: Record<string, string> = { ...init.headers };\n if (init.form !== undefined) {\n if (!hasHeader(headers, 'Content-Type')) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded';\n }\n return { method, headers, body: formBody(init.form) };\n }\n if (init.body !== undefined) {\n if (!hasHeader(headers, 'Content-Type')) {\n headers['Content-Type'] = 'application/json';\n }\n return { method, headers, body: JSON.stringify(init.body) };\n }\n return { method, headers };\n}\n\n/**\n * Only what the request sets: a GET carries no `method`, a request without\n * headers no `headers`.\n */\nfunction requestInit(\n parts: ReturnType<typeof requestParts>,\n init: RequestShape,\n headers: Record<string, string>,\n): RequestInit {\n const request: RequestInit = {};\n if (parts.method !== 'GET') request.method = parts.method;\n if (Object.keys(headers).length > 0) request.headers = headers;\n if (parts.body !== undefined) request.body = parts.body;\n if (init.signal) request.signal = init.signal;\n if (init.redirect) request.redirect = init.redirect;\n return request;\n}\n\nasync function credential(auth: ApiAuth): Promise<string | null> {\n if (auth === 'none') return null;\n if (auth === 'user') return resolveAccessToken();\n if (auth === 'deploy') {\n const token = resolveDeployToken() ?? (await resolveAccessToken());\n if (!token) throw new Error(DEPLOY_TOKEN_MISSING);\n return token;\n }\n return auth.token;\n}\n\n/**\n * Call one app operation. `op` names it as `\"<METHOD> <path>\"`; `path`,\n * `query` and `body` (or `form`) are typed from that operation, and the\n * result is the raw `Response`, whose parsed body {@link ResponseJson} types.\n *\n * Every request carries the client-context headers. Without `baseUrl` and\n * `fetch`, a `'user'`, `'deploy'` or `'none'` request goes through\n * `apiFetch`, `deployFetch` or `publicFetch`.\n */\nexport function apiRequest<K extends OperationKey>(\n op: K,\n ...init: InitArgs<K>\n): Promise<Response>;\nexport async function apiRequest(\n op: OperationKey,\n init: RequestShape = {},\n): Promise<Response> {\n const target = operationTarget(op, init.path, init.query);\n const parts = requestParts(op, init);\n const auth = init.auth ?? 'user';\n\n if (\n init.baseUrl === undefined &&\n init.fetch === undefined &&\n typeof auth === 'string'\n ) {\n const request = requestInit(parts, init, parts.headers);\n const send =\n auth === 'user'\n ? apiFetch\n : auth === 'deploy'\n ? deployFetch\n : publicFetch;\n return Object.keys(request).length > 0\n ? send(target, request)\n : send(target);\n }\n\n const url = `${init.baseUrl ?? resolveAppUrl()}${target}`;\n const token = await credential(auth);\n if (token) requireSecureUrl(url);\n const headers = mergeHeaders(\n clientContextHeaders(),\n parts.headers,\n token ? { Authorization: `Bearer ${token}` } : {},\n );\n const send = init.fetch ?? fetch;\n return send(url, requestInit(parts, init, headers));\n}\n\n/**\n * The absolute URL of one operation, for a caller that hands the URL to its\n * own transport (the telemetry destination).\n */\nexport function operationUrl<K extends OperationKey>(\n op: K,\n init: { baseUrl: string } & PathInit<K> & QueryInit<K>,\n): string;\nexport function operationUrl(\n op: OperationKey,\n init: Pick<RequestShape, 'path' | 'query'> & { baseUrl: string },\n): string {\n return `${init.baseUrl}${operationTarget(op, init.path, init.query)}`;\n}\n","import {\n readConfig,\n writeConfig,\n clearAuthFields,\n resolveAppUrl,\n resolveProjectId,\n hasStoredCredential,\n type WalkerOSConfig,\n} from '../lib/config-file.js';\nimport { withConfigLock } from '../lib/config-lock.js';\nimport { refreshTokens } from './oauth-client.js';\n\n/**\n * Refresh this far ahead of the stated expiry. It absorbs clock skew between\n * the machine and the server plus the flight time of the request the token is\n * about to be spent on, so a token is never handed out with seconds to live.\n */\nconst REFRESH_SKEW_MS = 60_000;\n\nlet legacyNoticeShown = false;\n\n/** Test-only: reset the once-per-process guard on the legacy token notice. */\nexport function resetLegacyTokenNotice(): void {\n legacyNoticeShown = false;\n}\n\n/**\n * Announce the legacy static token once, on first use.\n *\n * Once per process, not once per call: a single command can resolve a token\n * many times, and a notice printed on each would be noise the person learns\n * to scroll past. It is printed at all because a migrated token can carry a\n * year of expiry, so nothing else would ever prompt the switch.\n */\nfunction noticeLegacyToken(): void {\n if (legacyNoticeShown) return;\n legacyNoticeShown = true;\n process.stderr.write(\n 'walkerOS: using a static token from your config. ' +\n 'Run `walkeros auth login` to switch to a session that refreshes automatically.\\n',\n );\n}\n\n/** Whether the stored access token has enough life left to be worth using. */\nfunction isFresh(config: WalkerOSConfig, nowMs: number): boolean {\n if (!config.accessToken || !config.accessTokenExpiresAt) return false;\n const expiresAt = Date.parse(config.accessTokenExpiresAt);\n if (Number.isNaN(expiresAt)) return false;\n return expiresAt - nowMs > REFRESH_SKEW_MS;\n}\n\n/**\n * Resolve a bearer for an API call, refreshing the stored session when needed.\n *\n * Priority: `WALKEROS_TOKEN`, then a legacy static token, then the OAuth\n * session. Returns null when nothing can be resolved, which callers render as\n * \"run `walkeros auth login`\".\n *\n * Throws when a refresh was needed but could not be carried out, which is a\n * different problem from having no session and must not be reported as one.\n */\nexport async function resolveAccessToken(opts?: {\n fetch?: typeof fetch;\n now?: () => number;\n}): Promise<string | null> {\n const envToken = process.env.WALKEROS_TOKEN;\n if (envToken) return envToken;\n\n const now = opts?.now ?? Date.now;\n const config = readConfig();\n if (!config) return null;\n\n if (config.token) {\n noticeLegacyToken();\n return config.token;\n }\n\n if (!config.refreshToken) {\n return isFresh(config, now()) ? (config.accessToken ?? null) : null;\n }\n\n if (isFresh(config, now())) return config.accessToken ?? null;\n\n return withConfigLock(async () => {\n // Re-read under the lock. Another walkerOS process may have refreshed\n // while we queued, and spending our copy of a single-use refresh token\n // would invalidate the session it just established.\n const current = readConfig();\n if (!current?.refreshToken) return current?.accessToken ?? null;\n if (isFresh(current, now())) return current.accessToken ?? null;\n\n let rotated;\n try {\n rotated = await refreshTokens(\n resolveAppUrl(),\n current.refreshToken,\n opts?.fetch,\n );\n } catch (error) {\n // Transient: the server was unreachable or faulted. The refresh token\n // may well still be good, so it stays on disk and the next command\n // tries again rather than forcing a browser round trip.\n //\n // Raised rather than returned as null, because null is how this function\n // says \"there is no session\", which sends callers down the wrong path:\n // they tell the person to run `walkeros auth login` and send the request\n // unauthenticated, when the session is fine and only the network was not.\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Could not reach ${resolveAppUrl()} to refresh your session: ${reason}. ` +\n 'Your saved session was kept, so try again once the connection is back.',\n );\n }\n\n if (rotated === null) {\n // The server rejected the refresh token itself. Nothing local can\n // recover it, so drop the dead session.\n clearAuthFields();\n return null;\n }\n\n writeConfig({\n accessToken: rotated.accessToken,\n accessTokenExpiresAt: rotated.accessTokenExpiresAt,\n // A server that rotates no new refresh token leaves the current one in\n // force; overwriting it with null would end the session on the next call.\n refreshToken: rotated.refreshToken ?? current.refreshToken,\n });\n\n return rotated.accessToken;\n });\n}\n\n/**\n * Authorization header for the resolved credential, or an empty object when\n * there is none. Async because resolving may have to refresh the session.\n */\nexport async function getAuthHeaders(): Promise<Record<string, string>> {\n const token = await resolveAccessToken();\n if (!token) return {};\n return { Authorization: `Bearer ${token}` };\n}\n\n/**\n * Where a credential would come from, without resolving or refreshing it.\n * For commands that want to send someone to `walkeros auth login` before spending\n * a network round trip.\n */\nexport function credentialSource(): 'env' | 'config' | null {\n if (process.env.WALKEROS_TOKEN) return 'env';\n if (hasStoredCredential(readConfig())) return 'config';\n return null;\n}\n\nexport function requireProjectId(): string {\n const projectId = resolveProjectId();\n if (!projectId)\n throw new Error(\n 'No project selected. Set WALKEROS_PROJECT_ID or configure a default project.',\n );\n return projectId;\n}\n","import { resolveAppUrl, resolveDeployToken } from '../lib/config-file.js';\nimport { requireSecureUrl } from '../lib/secure-url.js';\nimport { resolveAccessToken } from './auth.js';\nimport { clientContextHeaders } from './client-context.js';\n\n/**\n * Normalize headers from any RequestInit format to a plain object.\n */\nfunction normalizeHeaders(headers?: HeadersInit): Record<string, string> {\n if (!headers) return {};\n if (headers instanceof Headers) return Object.fromEntries(headers.entries());\n if (Array.isArray(headers)) return Object.fromEntries(headers);\n return headers as Record<string, string>;\n}\n\n/**\n * Merge a bearer token into a headers object.\n * Shared by apiFetch, deployFetch, and runtime callers that manage their own tokens.\n */\nexport function mergeAuthHeaders(\n token: string | null | undefined,\n headers?: HeadersInit,\n): Record<string, string> {\n const normalized = normalizeHeaders(headers);\n if (token) normalized.Authorization = `Bearer ${token}`;\n return normalized;\n}\n\n/**\n * Build the final outbound header set by merging client-context headers\n * (User-Agent, X-WalkerOS-Client, X-WalkerOS-Client-Version) with auth.\n * Caller-provided headers win over client-context defaults.\n */\nfunction buildHeaders(\n token: string | null | undefined,\n headers?: HeadersInit,\n): Record<string, string> {\n return {\n ...clientContextHeaders(),\n ...mergeAuthHeaders(token, headers),\n };\n}\n\n/**\n * Authenticated fetch — resolves base URL + adds auth token.\n * Use for all API calls that require WALKEROS_TOKEN.\n *\n * The transport is checked only once a credential is actually going out.\n * `resolveAppUrl` keeps answering with whatever is configured, which is what\n * the paths that merely REPORT the target (diagnostics, health, telemetry)\n * need from it.\n */\nexport async function apiFetch(\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const baseUrl = resolveAppUrl();\n const token = await resolveAccessToken();\n if (token) requireSecureUrl(baseUrl);\n return fetch(`${baseUrl}${path}`, {\n ...init,\n headers: buildHeaders(token, init?.headers),\n });\n}\n\n/**\n * Unauthenticated fetch — resolves base URL, no auth.\n * Use for public endpoints (login device flow, feedback).\n */\nexport async function publicFetch(\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const baseUrl = resolveAppUrl();\n return fetch(`${baseUrl}${path}`, {\n ...init,\n headers: {\n ...clientContextHeaders(),\n ...normalizeHeaders(init?.headers),\n },\n });\n}\n\n/**\n * Deploy-authenticated fetch — uses deploy token with fallback to user token.\n * Use for runtime operations (heartbeat, config polling, secrets).\n */\nexport async function deployFetch(\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const baseUrl = resolveAppUrl();\n const token = resolveDeployToken() ?? (await resolveAccessToken());\n if (!token)\n throw new Error(\n 'No authentication token available. Set WALKEROS_DEPLOY_TOKEN or run walkeros auth login.',\n );\n requireSecureUrl(baseUrl);\n return fetch(`${baseUrl}${path}`, {\n ...init,\n headers: buildHeaders(token, init?.headers),\n });\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(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const content = Buffer.concat(chunks).toString('utf-8');\n if (!content.trim()) {\n throw new Error('No input received on stdin');\n }\n return content;\n}\n\n/**\n * Read stdin content and write to a labeled temp file.\n * Returns the temp file path for downstream functions that expect file paths.\n */\nexport async function readStdinToTempFile(label: string): Promise<string> {\n const content = await readStdin();\n const tmpPath = getTmpPath(undefined, `stdin-${label}.json`);\n await fs.ensureDir(path.dirname(tmpPath));\n await fs.writeFile(tmpPath, content, 'utf-8');\n return tmpPath;\n}\n","export interface SSEEvent {\n type: string;\n data: string;\n}\n\nexport interface SSEParseResult {\n parsed: SSEEvent[];\n remainder: string;\n}\n\nexport function parseSSEEvents(buffer: string): SSEParseResult {\n const events: SSEEvent[] = [];\n const blocks = buffer.split('\\n\\n');\n const remainder = blocks.pop() || '';\n\n for (const block of blocks) {\n if (!block.trim()) continue;\n\n let eventType = 'message'; // SSE default per spec\n const dataLines: string[] = [];\n\n for (const line of block.split('\\n')) {\n if (line.startsWith('event:')) {\n eventType = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice(5).trimStart());\n }\n // Ignore: comments (:), id:, retry:\n }\n\n if (dataLines.length > 0) {\n events.push({ type: eventType, data: dataLines.join('\\n') });\n }\n }\n\n return { parsed: events, remainder };\n}\n","import { schemas } from '@walkeros/core/dev';\n\nconst { PartialEventSchema } = schemas;\n\nexport type ValidationLevel = 'strict' | 'standard' | 'minimal';\n\nexport type EventValidationCode =\n | 'NOT_AN_OBJECT'\n | 'MISSING_EVENT_NAME'\n | 'EMPTY_EVENT_NAME'\n | 'INVALID_EVENT_NAME'\n | 'SCHEMA_VALIDATION';\n\nexport interface EventValidationError {\n path: string;\n message: string;\n value?: unknown;\n code: EventValidationCode;\n}\n\nexport interface EventValidationWarning {\n path: string;\n message: string;\n suggestion?: string;\n}\n\nexport interface EventValidationDetails {\n entity?: string | null;\n action?: string | null;\n hasConsent?: boolean;\n hasData?: boolean;\n hasContext?: boolean;\n}\n\nexport interface EventValidationResult {\n valid: boolean;\n errors: EventValidationError[];\n warnings: EventValidationWarning[];\n details: EventValidationDetails;\n}\n\nexport function validateEvent(\n input: unknown,\n level: ValidationLevel = 'strict',\n): EventValidationResult {\n const errors: EventValidationError[] = [];\n const warnings: EventValidationWarning[] = [];\n const details: EventValidationDetails = {};\n\n // All levels: must be an object\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n errors.push({\n path: 'root',\n message: 'Event must be an object',\n code: 'NOT_AN_OBJECT',\n });\n return { valid: false, errors, warnings, details };\n }\n\n const event = input as Record<string, unknown>;\n\n // All levels: name field checks\n if (!('name' in event) || event.name === undefined) {\n errors.push({\n path: 'name',\n message: 'Event must have a name field',\n code: 'MISSING_EVENT_NAME',\n });\n } else if (typeof event.name !== 'string' || event.name.trim() === '') {\n errors.push({\n path: 'name',\n message: 'Event name cannot be empty',\n value: event.name,\n code: 'EMPTY_EVENT_NAME',\n });\n } else {\n // Entity-action format check (strict + standard only)\n const name = event.name;\n if (!name.includes(' ')) {\n if (level === 'strict') {\n errors.push({\n path: 'name',\n message:\n 'Event name must be \"entity action\" format with space (e.g., \"page view\")',\n value: name,\n code: 'INVALID_EVENT_NAME',\n });\n details.entity = null;\n details.action = null;\n } else if (level === 'standard') {\n warnings.push({\n path: 'name',\n message: `Event name \"${name}\" should follow \"ENTITY ACTION\" format (e.g., \"page view\")`,\n });\n details.entity = null;\n details.action = null;\n }\n // minimal: skip entirely\n } else {\n const parts = name.trim().split(/\\s+/);\n const action = parts.pop()!;\n const entity = parts.join(' ');\n details.entity = entity;\n details.action = action;\n }\n }\n\n // Minimal stops here\n if (level === 'minimal') {\n return { valid: errors.length === 0, errors, warnings, details };\n }\n\n // Standard + Strict: Zod schema validation\n const zodResult = PartialEventSchema.safeParse(input);\n if (!zodResult.success) {\n for (const issue of zodResult.error.issues) {\n const issuePath = issue.path.join('.');\n if (issuePath === 'name') continue; // handled above with better messages\n errors.push({\n path: issuePath || 'root',\n message: issue.message,\n code: 'SCHEMA_VALIDATION',\n });\n }\n }\n\n // Strict only: consent warning + details\n if (level === 'strict') {\n if (!event.consent) {\n warnings.push({\n path: 'consent',\n message: 'No consent object provided',\n suggestion:\n 'Consider adding a consent object for GDPR/privacy compliance',\n });\n }\n details.hasConsent = !!event.consent;\n details.hasData = !!event.data;\n details.hasContext = !!event.context;\n }\n\n return { valid: errors.length === 0, errors, warnings, details };\n}\n","/**\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 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 * 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 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 packageNameToVariable,\n getStepRuntimeProps,\n ENV_MARKER_PREFIX,\n SECRET_MARKER_PREFIX,\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.\n * InlineCode has { push: string, type?: string, init?: string }\n */\nfunction isInlineCode(code: unknown): code is Flow.Code {\n return (\n code !== null &&\n typeof code === 'object' &&\n !Array.isArray(code) &&\n 'push' in code\n );\n}\n\n/**\n * 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). Handles $code: prefix for push/init functions.\n *\n * @param inline - InlineCode object with push, optional init, optional type\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 pushFn = inline.push.replace('$code:', '');\n const initFn = inline.init ? inline.init.replace('$code:', '') : undefined;\n const typeLine = inline.type ? `type: '${inline.type}',` : '';\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 ${initFn ? `init: ${initFn},` : ''}\n push: ${pushFn}\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 ${initFn ? `init: ${initFn},` : ''}\n push: ${pushFn}\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 // Bake provenance before the L1 check and codegen, so the release sits\n // in both the cache key and the artifact.\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 core, never\n // from the flow's core in TEMP_DIR, which may predate it.\n stage2Options.plugins = [cliCorePlugin()];\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_CORE = 'walkeros-cli-core';\n\n/**\n * Resolves every `@walkeros/core` import of a generated entry (the Tag Mode\n * loader, the preview activator) from this module's own location: the core\n * this CLI was installed with. Resolving from the entry's temp dir would walk\n * up through every `node_modules` above it, where another core (a flow's\n * pinned one, or a stray install in a shared temp root) can shadow it.\n */\nexport function cliCorePlugin(): esbuild.Plugin {\n const resolveDir = path.dirname(fileURLToPath(import.meta.url));\n return {\n name: CLI_CORE,\n setup(build) {\n build.onResolve({ filter: /^@walkeros\\/core$/ }, async (args) => {\n if (args.pluginData === CLI_CORE) return undefined;\n const resolved = await build.resolve(args.path, {\n kind: args.kind,\n resolveDir,\n pluginData: CLI_CORE,\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 * 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 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 * Generate a stage 2 entry file for server bundles.\n * Imports startFlow and wireConfig from the stage 1 .mjs file,\n * embeds the data payload, and exports a factory function.\n */\nexport function generateServerEntry(\n stage1Path: string,\n dataPayload: string,\n): string {\n const stage1Specifier = toFileImportSpecifier(stage1Path);\n return `import { startFlow, wireConfig } from '${stage1Specifier}';\n\nconst __configData = ${dataPayload};\n\nexport default async function(context = {}) {\n const config = wireConfig(__configData);\n\n if (context.logger) config.logger = context.logger;\n\n if (context.sourceSettings && config.sources) {\n for (const src of Object.values(config.sources)) {\n if (src.config?.settings) {\n src.config.settings = { ...src.config.settings, ...context.sourceSettings };\n }\n }\n }\n\n const result = await startFlow(config);\n\n // 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/**\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. The runtime\n * connect module inside startFlow does the credential/slot work at boot\n * (the per-session secret arrives out-of-band via the `elbObserve`\n * companion); no emitted byte here is ever secret.\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)};`;\n}\n\n/** Imports the Tag Mode loader into a browser entry. */\nconst MOIN_IMPORT = \"import { moin } from '@walkeros/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 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}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 core and lets it decide whether a preview bundle\n * boots in place of this flow. The bundle carries only PUBLIC values: a keyring,\n * 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/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 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}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 if (context.logger) config.logger = context.logger;\n\n if (context.sourceSettings && config.sources) {\n for (const src of Object.values(config.sources)) {\n if (src.config?.settings) {\n src.config.settings = { ...src.config.settings, ...context.sourceSettings };\n }\n }\n }\n\n const result = await startFlow(config);\n\n // 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 and setup.\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 both\n * commands/bundle/* and commands/setup/* run 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';\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/**\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 const isLocalPath = pkg.startsWith('.') || pkg.startsWith('/');\n\n if (isLocalPath) {\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","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 } from '@walkeros/core';\n\nexport type ComponentKind = 'source' | 'transformer' | 'destination' | 'store';\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 { isObject } from '@walkeros/core';\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst SECTION_KEYS = ['globals', 'context', 'custom', 'user', 'consent'];\nconst KNOWN_KEYS = new Set([\n 'extend',\n 'tagging',\n 'description',\n 'events',\n 'schema',\n ...SECTION_KEYS,\n]);\n\nexport function validateContract(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n errors.push({\n path: 'root',\n message: 'Contract must be an object of named contract entries',\n code: 'INVALID_CONTRACT',\n });\n return { valid: false, type: 'contract', errors, warnings, details };\n }\n\n const contracts = input as Record<string, unknown>;\n const contractNames = Object.keys(contracts);\n details.contractCount = contractNames.length;\n\n // Check 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((k) => isObject(obj[k]));\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 // Warn on unknown keys\n for (const key of unknownKeys) {\n warnings.push({\n path: `${name}.${key}`,\n message: `Unknown contract key \"${key}\" is ignored`,\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 sections\n for (const key of SECTION_KEYS) {\n if (key in obj) {\n if (typeof obj[key] !== 'object' || obj[key] === null) {\n errors.push({\n path: `${name}.${key}`,\n message: `Section \"${key}\" must be a JSON Schema object`,\n value: obj[key],\n code: 'INVALID_SECTION',\n });\n }\n }\n }\n\n // Validate events\n if (obj.events !== undefined) {\n if (typeof obj.events !== 'object' || obj.events === null) {\n errors.push({\n path: `${name}.events`,\n message: 'events must be an object',\n code: 'INVALID_EVENTS',\n });\n } else {\n validateEntityActions(\n obj.events as Record<string, unknown>,\n `${name}.events`,\n errors,\n );\n }\n }\n }\n\n // Check for circular 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 validateStepEntry,\n} from '@walkeros/core';\nimport { schemas, validateFlowStructure } 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 without their own closed-schema check (transformers have one). */\nconst OPEN_STEP_KINDS = [\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. Findings are warnings for one minor (D3); a schema\n * that cannot 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(\n target,\n flow,\n rawFlow,\n 'flow:package-settings',\n context,\n ),\n );\n }\n }\n }\n for (const outcome of await Promise.all(pending)) {\n result.warnings.push(...outcome.findings);\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 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 (path === 'contract' && contractErrors > 0) continue;\n errors.push({ path, message: issue.message, code: 'SCHEMA_VALIDATION' });\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. Transformers are closed (errors, single source of\n // truth in @walkeros/core); an unknown key on a destination or store is\n // dropped by the resolver, so it warns (UNKNOWN_KEY) for one minor.\n // Removed packages warn (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 OPEN_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 for (const key of unknownStepKeys(step, kind)) {\n warnings.push({\n path: `${at}.${key}`,\n message: `Unknown key \"${key}\" on ${kind} is ignored by the runtime`,\n suggestion: 'Remove the key, or move it to where it belongs.',\n code: 'UNKNOWN_KEY',\n });\n }\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 }\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), so a valid result implies the\n // bundle preflight passes. Its warnings (a transformer mapping that\n // does nothing) stay warnings: the runtime keeps the step.\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 * Top-level keys of a destination or store that the runtime does not know,\n * read through core's closed step-entry check (one source of truth).\n */\nfunction unknownStepKeys(\n step: Record<string, unknown>,\n kind: 'Destination' | 'Store',\n): string[] {\n const unknown: string[] = [];\n const rest: Record<string, unknown> = { ...step };\n for (;;) {\n const verdict = validateStepEntry(rest, kind);\n if (verdict.code !== 'UNKNOWN_KEY' || verdict.key === undefined) break;\n unknown.push(verdict.key);\n Reflect.deleteProperty(rest, verdict.key);\n }\n return unknown;\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\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\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 * as fs from 'fs';\nimport * as path from 'path';\nimport Ajv, { type ErrorObject, type ValidateFunction } from 'ajv';\nimport type { Flow } from '@walkeros/core';\nimport {\n ENV_MARKER_PREFIX,\n fetchPackage,\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 { parsePackageSpec } from '../../../core/step-packages.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/** 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\ninterface PackageSource {\n name: string;\n version?: string;\n localPath?: string;\n}\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\nfunction bundlePin(\n rawFlow: unknown,\n name: string,\n): { version?: string; path?: string } {\n const config = isObject(rawFlow) ? rawFlow.config : undefined;\n const bundle = isObject(config) ? config.bundle : undefined;\n const packages = isObject(bundle) ? bundle.packages : undefined;\n const pin = isObject(packages) ? packages[name] : undefined;\n if (!isObject(pin)) return {};\n return {\n ...(typeof pin.version === 'string' ? { version: pin.version } : {}),\n ...(typeof pin.path === 'string' ? { path: pin.path } : {}),\n };\n}\n\n/**\n * Where a step's package comes from, as the bundler picks it: a local\n * `path` (inline `./` or `/` spec, or a bundle pin), else the bundle pin's\n * version, else the inline `@version`, else latest.\n */\nfunction packageSource(spec: string, rawFlow: unknown): PackageSource {\n if (spec.startsWith('.') || spec.startsWith('/'))\n return { name: spec, localPath: spec };\n const { name, version } = parsePackageSpec(spec);\n const pin = bundlePin(rawFlow, name);\n if (pin.path) return { name, localPath: pin.path };\n const pinned = pin.version ?? version;\n return pinned ? { name, version: pinned } : { name };\n}\n\nfunction readJson(file: string): unknown {\n return JSON.parse(fs.readFileSync(file, 'utf-8'));\n}\n\n/** Schemas of a local package, read from its `walkerOS.json` on disk. */\nfunction readLocalSchema(\n source: PackageSource,\n configDir: string,\n): PackageSchema {\n const localPath = source.localPath ?? '';\n const root = path.isAbsolute(localPath)\n ? localPath\n : path.resolve(configDir, localPath);\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 const pkgFile = path.join(root, 'package.json');\n const pkg = fs.existsSync(pkgFile) ? readJson(pkgFile) : undefined;\n const schemas = isObject(meta) ? meta.schemas : undefined;\n const exportSchemas = isObject(meta) ? meta.exportSchemas : undefined;\n const declared =\n isObject(meta) && isObject(meta.$meta) ? meta.$meta.exports : undefined;\n const version =\n isObject(pkg) && typeof pkg.version === 'string' ? pkg.version : undefined;\n return {\n ...(version ? { version } : {}),\n settings: isObject(schemas) ? schemas.settings : undefined,\n ...(isObject(exportSchemas) ? { exportSchemas } : {}),\n ...(isObject(declared) ? { exports: Object.keys(declared) } : {}),\n };\n}\n\nasync function loadSchema(\n source: PackageSource,\n context: SettingsContext,\n): Promise<PackageSchema> {\n if (source.localPath !== undefined) {\n const configDir = context.configDir;\n if (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 return readLocalSchema(source, configDir);\n }\n const info = await fetchPackage(source.name, {\n ...(source.version ? { version: source.version } : {}),\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(source: PackageSource): string {\n return source.localPath\n ? `path:${source.localPath}`\n : `${source.name}@${source.version ?? 'latest'}`;\n}\n\nfunction cachedSchema(\n source: PackageSource,\n context: SettingsContext,\n): Promise<PackageSchema> {\n const key = sourceKey(source);\n let pending = context.cache.get(key);\n if (!pending) {\n pending = loadSchema(source, context);\n context.cache.set(key, pending);\n }\n return pending;\n}\n\nfunction cachedCompile(\n source: PackageSource,\n exportName: string | undefined,\n settings: unknown,\n context: SettingsContext,\n): CompiledSettings | undefined {\n const key = `${sourceKey(source)}#${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 rawFlow: unknown,\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 const source = packageSource(spec, rawFlow);\n let schema: PackageSchema;\n try {\n schema = await cachedSchema(source, context);\n } catch (error) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Schema for ${source.name}${source.version ? `@${source.version}` : ''} could not be loaded: ${getErrorMessage(error)}`,\n code: 'SCHEMA_UNAVAILABLE',\n });\n return outcome;\n }\n outcome.checked = {\n path: at,\n package: source.name,\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 resolvedFlow,\n SECTION_KIND[target.section],\n target.key,\n );\n const version = schema.version ?? source.version;\n const selection = selectSettingsSchema(\n schema,\n version ? `${source.name}@${version}` : source.name,\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 source,\n exportName,\n selection.settings,\n context,\n );\n if (!compiled) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Package ${source.name} 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 ${source.name} 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","// 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 file?.flows[target.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 '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 'TRANSFORMER_MAPPING_NO_OP',\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_SECTION',\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 { createCLILogger } from '../../core/cli-logger.js';\nimport {\n startDeviceAuthorization,\n pollDeviceToken,\n type TokenSet,\n} from '../../core/oauth-client.js';\nimport {\n readConfig,\n writeConfig,\n resolveAppUrl,\n getConfigPath,\n} from '../../lib/config-file.js';\nimport { requireSecureUrl } from '../../lib/secure-url.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n/**\n * `walkeros auth login` on the RFC 8628 device authorization grant.\n *\n * The CLI never sees a password and never runs a local callback server: it\n * shows a code, the person approves it in a browser they already trust, and\n * the CLI polls until the approval lands.\n */\n\n/** Grace added to the server's stated lifetime before we stop polling. */\nconst POLL_TIMEOUT_BUFFER_MS = 5000;\n\n/** Interval to use when the caller states none. */\nconst DEFAULT_POLL_INTERVAL_MS = 5000;\n\n/**\n * Floor on an interval that came from a SERVER.\n *\n * RFC 8628 lets a server state any minimum gap between polls, including none,\n * but `WALKEROS_APP_URL` is user-settable, so that number arrives from\n * whichever host the person is pointed at. A stated zero would otherwise set\n * this loop's pace to \"as fast as the network allows\" for the whole life of\n * the device code. A remote value may slow the loop down, never off its leash.\n */\nconst MIN_SERVER_POLL_INTERVAL_MS = 1000;\n\n/**\n * Window to poll for when the caller states none. Sized to the lifetime a\n * device code is typically issued with, so a resume that was given no window\n * cannot outlive the code it is polling for.\n */\nconst DEFAULT_POLL_TIMEOUT_MS = 900_000;\n\n/** RFC 8628 section 3.5: each `slow_down` adds five seconds. */\nconst SLOW_DOWN_STEP_MS = 5000;\n\n/**\n * Ceiling on the identity lookup. It runs AFTER the session is on disk, so a\n * server that accepts the connection and then says nothing would otherwise\n * hold `walkeros auth login` open long past its last useful work.\n */\nconst WHOAMI_TIMEOUT_MS = 10_000;\n\nconst TIMED_OUT = 'Authorization timed out. Please try again.';\n\n/**\n * The identity endpoint's response. Validated because a malformed body must\n * not put a non-string into the config where the email belongs.\n */\nconst WhoamiSchema = z.object({ email: z.string().min(1) });\n\nexport interface LoginCommandOptions extends GlobalOptions {\n url?: string;\n json?: boolean;\n}\n\nexport interface LoginResult {\n success: boolean;\n email?: string;\n configPath?: string;\n error?: string;\n}\n\nexport interface LoginOptions {\n url?: string;\n /** Override browser opener for testing */\n openUrl?: (url: string) => Promise<void>;\n /** Override fetch for testing */\n fetch?: typeof globalThis.fetch;\n /** Max poll attempts before giving up (for testing) */\n maxPollAttempts?: number;\n /** Poll interval, replacing the server's stated one (for testing) */\n pollIntervalMs?: number;\n}\n\n/**\n * The outcome of finishing a device authorization.\n *\n * It carries no token material. `completeDeviceLogin` stores the session\n * itself, so the credential file keeps exactly one writer and a caller can\n * neither persist nor leak what came back.\n *\n * `pending` and `slow_down` both mean the window closed with the approval\n * still outstanding: the device code is untouched, so the same code can be\n * handed back in. `slow_down` is that same situation with the server asking\n * for a wider gap before the next attempt.\n */\nexport type DeviceLoginResult =\n | { status: 'ok' }\n | { status: 'pending' }\n | { status: 'slow_down' }\n | { status: 'denied' }\n | { status: 'expired' }\n | { status: 'error'; error: string };\n\nexport interface CompleteDeviceLoginOptions {\n /** App to poll. Defaults to the resolved app URL. */\n url?: string;\n /** Stop polling after this long. */\n timeoutMs?: number;\n /** Wait between polls, before any `slow_down` widens it. */\n intervalMs?: number;\n /** Override fetch for testing */\n fetch?: typeof globalThis.fetch;\n /** Max poll attempts before giving up (for testing) */\n maxPollAttempts?: number;\n}\n\nasync function openInBrowser(url: string): Promise<void> {\n const { default: open } = await import('open');\n await open(url);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function loginCommand(\n options: LoginCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n\n try {\n const result = await login({ url: options.url });\n\n if (options.json) {\n logger.json(result);\n } else if (result.success) {\n if (result.email) logger.info(`Logged in as ${result.email}`);\n else logger.info('Logged in.');\n logger.info(`Session stored in ${result.configPath}`);\n } else if (result.error) {\n logger.error(result.error);\n }\n\n process.exit(result.success ? 0 : 1);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n logger.json({ success: false, error: message });\n } else {\n logger.error(message);\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Ask the API who the freshly issued token belongs to.\n *\n * Non-fatal: the session is already stored and usable, and an address is only\n * there so the CLI can name the account it logged into.\n */\nasync function fetchEmail(\n appUrl: string,\n accessToken: string,\n fetchFn: typeof globalThis.fetch,\n): Promise<string | undefined> {\n try {\n const response = await apiRequest('GET /api/auth/whoami', {\n auth: { token: accessToken },\n baseUrl: appUrl,\n fetch: fetchFn,\n signal: AbortSignal.timeout(WHOAMI_TIMEOUT_MS),\n });\n if (!response.ok) return undefined;\n const parsed = WhoamiSchema.safeParse(await response.json());\n return parsed.success ? parsed.data.email : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Store the session a device authorization yielded, and name its account. */\nasync function persistSession(\n appUrl: string,\n tokens: TokenSet,\n fetchFn: typeof globalThis.fetch,\n): Promise<void> {\n // Every credential key is written explicitly, including the ones that may\n // be absent: `writeConfig` merges, so a key left out would keep the\n // PREVIOUS session's value and quietly outlive the login that replaced it.\n writeConfig({\n accessToken: tokens.accessToken,\n accessTokenExpiresAt: tokens.accessTokenExpiresAt,\n refreshToken: tokens.refreshToken ?? undefined,\n appUrl,\n // Drop the static token this session replaces, so the deprecated path\n // cannot outlive the login that retired it.\n token: undefined,\n });\n\n // Unconditional: a stale address is worse than none, since `walkeros\n // feedback` sends it as the reporter's identity.\n const email = await fetchEmail(appUrl, tokens.accessToken, fetchFn);\n writeConfig({ email });\n}\n\n/**\n * Poll a device authorization to its end and store the session it yields.\n *\n * Split out from `login` so a caller holding only a device code can finish an\n * authorization that is already under way. `login` cannot serve that: it\n * starts a fresh authorization on every call, which would strand the code the\n * person is looking at.\n */\nexport async function completeDeviceLogin(\n deviceCode: string,\n options: CompleteDeviceLoginOptions = {},\n): Promise<DeviceLoginResult> {\n const fetchFn = options.fetch ?? globalThis.fetch;\n const appUrl = requireSecureUrl(options.url || resolveAppUrl());\n const deadline = Date.now() + (options.timeoutMs ?? DEFAULT_POLL_TIMEOUT_MS);\n\n let intervalMs = options.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n let attempts = 0;\n let waiting: 'pending' | 'slow_down' = 'pending';\n\n // Waiting out the interval is part of an attempt, so there is only room for\n // another poll while a whole interval still fits inside the window.\n while (Date.now() + intervalMs <= deadline) {\n if (\n options.maxPollAttempts !== undefined &&\n attempts >= options.maxPollAttempts\n )\n break;\n attempts += 1;\n\n await delay(intervalMs);\n\n // The window bounds the request too, not just how many are started: a\n // stalled response would otherwise run past the deadline on the HTTP\n // client's own clock.\n const signal = AbortSignal.timeout(Math.max(1, deadline - Date.now()));\n const poll = await pollDeviceToken(appUrl, deviceCode, fetchFn, signal);\n\n if (poll.status === 'pending') {\n waiting = 'pending';\n // An aborted request means the window is spent, even when its timer\n // fired a moment before Date.now() reached the deadline.\n if (signal.aborted) break;\n continue;\n }\n if (poll.status === 'slow_down') {\n waiting = 'slow_down';\n intervalMs += SLOW_DOWN_STEP_MS;\n continue;\n }\n if (poll.status !== 'ok') return poll;\n\n await persistSession(appUrl, poll.tokens, fetchFn);\n return { status: 'ok' };\n }\n\n return { status: waiting };\n}\n\nexport async function login(options: LoginOptions = {}): Promise<LoginResult> {\n const fetchFn = options.fetch ?? globalThis.fetch;\n const appUrl = requireSecureUrl(options.url || resolveAppUrl());\n\n let authorization;\n try {\n authorization = await startDeviceAuthorization(appUrl, fetchFn);\n } catch {\n return { success: false, error: 'Failed to request device code' };\n }\n\n const target = authorization.verificationUriComplete;\n\n const prompt = (message: string) => process.stderr.write(message + '\\n');\n prompt(`\\n! Your one-time code: ${authorization.userCode}`);\n prompt(` Authorize here: ${target}\\n`);\n\n const opener = options.openUrl ?? openInBrowser;\n try {\n await opener(target);\n prompt(' Opening browser...');\n } catch {\n prompt(' Could not open browser. Visit the URL manually.');\n }\n\n prompt(' Waiting for authorization... (press Ctrl+C to cancel)\\n');\n\n const outcome = await completeDeviceLogin(authorization.deviceCode, {\n url: appUrl,\n fetch: fetchFn,\n timeoutMs: authorization.expiresIn * 1000 + POLL_TIMEOUT_BUFFER_MS,\n // Clamped here, at the one place a server's number enters the loop. The\n // helper takes its caller's interval as stated, which is what keeps a\n // stated 0 from becoming a poll flood without making the helper's own\n // option untestably slow.\n intervalMs:\n options.pollIntervalMs ??\n Math.max(MIN_SERVER_POLL_INTERVAL_MS, authorization.interval * 1000),\n ...(options.maxPollAttempts !== undefined\n ? { maxPollAttempts: options.maxPollAttempts }\n : {}),\n });\n\n switch (outcome.status) {\n case 'ok': {\n // Read back rather than returned: `completeDeviceLogin` owns the config\n // file, so what is on disk is the only account this session belongs to.\n const email = readConfig()?.email;\n return {\n success: true,\n ...(email ? { email } : {}),\n configPath: getConfigPath(),\n };\n }\n case 'denied':\n return { success: false, error: 'Authorization was denied.' };\n case 'error':\n return { success: false, error: outcome.error };\n default:\n return { success: false, error: TIMED_OUT };\n }\n}\n","import { createCLILogger } from '../../core/cli-logger.js';\nimport { revokeRefreshToken } from '../../core/oauth-client.js';\nimport {\n deleteConfig,\n getConfigPath,\n readConfig,\n resolveAppUrl,\n type WalkerOSConfig,\n} from '../../lib/config-file.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\nexport interface LogoutCommandOptions extends GlobalOptions {\n json?: boolean;\n}\n\nexport async function logoutCommand(\n options: LogoutCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n\n const { deleted, superseded } = await logout();\n const configPath = getConfigPath();\n\n if (options.json) {\n logger.json({ success: true, deleted, superseded });\n } else if (superseded) {\n logger.info(\n 'A newer session was stored while logging out, and was kept. ' +\n 'Run `walkeros auth logout` again to remove it.',\n );\n } else if (deleted) {\n logger.info(`Logged out. Session removed from ${configPath}`);\n } else {\n logger.info('No stored credentials found.');\n }\n\n process.exit(0);\n}\n\nexport interface LogoutResult {\n deleted: boolean;\n /** A different session reached the config while the revocation was in flight. */\n superseded: boolean;\n}\n\n/** Whether two reads of the config carry the same session. */\nfunction sameSession(\n before: WalkerOSConfig | null,\n after: WalkerOSConfig,\n): boolean {\n return (\n before?.accessToken === after.accessToken &&\n before?.refreshToken === after.refreshToken &&\n before?.token === after.token\n );\n}\n\n/**\n * Revoke the stored refresh token, then drop the local config.\n *\n * Revocation first, because deleting the file alone would leave a credential\n * alive on the server that nothing can ever reach to retire. It is best\n * effort: a logout on a plane still has to clear the machine.\n */\nexport async function logout(): Promise<LogoutResult> {\n const before = readConfig();\n\n if (before?.refreshToken) {\n await revokeRefreshToken(resolveAppUrl(), before.refreshToken);\n }\n\n // Re-read: revocation is a network round trip, and a login that finished\n // inside it stored a session this logout never saw. Deleting the file would\n // take that session with it, so the newer credential wins.\n //\n // It narrows the window rather than closing it. Only the token refresh takes\n // the config lock, and holding it across the revocation would be a protocol\n // change, not a check.\n const after = readConfig();\n if (after && !sameSession(before, after))\n return { deleted: false, superseded: true };\n\n return { deleted: deleteConfig(), superseded: false };\n}\n","import createClient from 'openapi-fetch';\nimport type { paths } from '../types/api.gen.js';\nimport { notAuthenticatedError } from './api-error.js';\nimport { resolveAccessToken } from './auth.js';\nimport { resolveAppUrl } from '../lib/config-file.js';\nimport { requireSecureUrl } from '../lib/secure-url.js';\nimport { clientContextHeaders } from './client-context.js';\n\nexport function createApiClient() {\n // Note: openapi-fetch fixes headers at createClient time. The CLI entry\n // point (and MCP boot path) call setClientContext before any API client is\n // constructed, so the client-context headers captured here are stable.\n const client = createClient<paths>({\n baseUrl: resolveAppUrl(),\n headers: {\n 'Content-Type': 'application/json',\n ...clientContextHeaders(),\n },\n });\n\n client.use({\n // Authorization is attached per request, not at construction: the stdio\n // MCP server builds one client and keeps it for hours, so a token captured\n // here would go stale and never pick up a refresh.\n async onRequest({ request }) {\n const token = await resolveAccessToken();\n if (!token) throw notAuthenticatedError();\n // Checked against the outgoing URL rather than the base one, so a path\n // that resolved somewhere else still cannot take the bearer with it.\n requireSecureUrl(request.url);\n request.headers.set('Authorization', `Bearer ${token}`);\n return request;\n },\n });\n\n return client;\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { handleCliError } from '../../core/api-error.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport async function whoami() {\n const client = createApiClient();\n const { data, error } = await client.GET('/api/auth/whoami');\n if (error) throw new Error(error.error?.message || 'Not authenticated');\n return data;\n}\n\n// === CLI Command Handler ===\n\nexport interface WhoamiCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n}\n\nexport async function whoamiCommand(\n options: WhoamiCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n try {\n const result = await whoami();\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n } else {\n const data = result as Record<string, unknown>;\n if (data.email) logger.info(`${data.email}`);\n if (data.userId) logger.info(`User: ${data.userId}`);\n if (data.projectId) logger.info(`Project: ${data.projectId}`);\n }\n } catch (error) {\n handleCliError(error);\n }\n}\n","import { createApiClient } from '../../core/api-client.js';\nimport { handleCliError, throwApiError } from '../../core/api-error.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { writeResult } from '../../core/output.js';\nimport {\n getDefaultProject,\n clearDefaultProject,\n} from '../../lib/config-file.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\nexport interface ListProjectsOptions {\n cursor?: string;\n limit?: number;\n}\n\nexport async function listProjects(options: ListProjectsOptions = {}) {\n const client = createApiClient();\n const { data, error } = await client.GET('/api/projects', {\n params: { query: { cursor: options.cursor, limit: options.limit } },\n });\n if (error) throwApiError(error, 'Failed to list projects');\n return data;\n}\n\nexport async function getProject(options: { projectId?: string } = {}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.GET('/api/projects/{projectId}', {\n params: { path: { projectId: id } },\n });\n if (error) throwApiError(error, 'Failed to get project');\n return data;\n}\n\nexport async function createProject(options: { name: string }) {\n const client = createApiClient();\n const { data, error } = await client.POST('/api/projects', {\n body: { name: options.name },\n });\n if (error) throwApiError(error, 'Failed to create project');\n return data;\n}\n\nexport async function updateProject(options: {\n projectId?: string;\n name: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.PATCH('/api/projects/{projectId}', {\n params: { path: { projectId: id } },\n body: { name: options.name },\n });\n if (error) throwApiError(error, 'Failed to update project');\n return data;\n}\n\nexport async function deleteProject(options: { projectId?: string } = {}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.DELETE('/api/projects/{projectId}', {\n params: { path: { projectId: id } },\n });\n if (error) throwApiError(error, 'Failed to delete project');\n // Drop a now-stale default. Compare against the resolved `id`, not\n // `options.projectId`, so deleting the default with no explicit id (resolved\n // via requireProjectId()) still clears it.\n if (getDefaultProject() === id) clearDefaultProject();\n return data ?? { success: true };\n}\n\n// === CLI Command Handlers ===\n\ninterface ProjectsCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n project?: string;\n name?: string;\n cursor?: string;\n limit?: number;\n}\n\nasync function handleResult(\n fn: () => Promise<unknown>,\n options: ProjectsCommandOptions,\n): Promise<void> {\n try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n handleCliError(error);\n }\n}\n\nexport async function listProjectsCommand(\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => listProjects({ cursor: options.cursor, limit: options.limit }),\n options,\n );\n}\n\nexport async function getProjectCommand(\n projectId: string | undefined,\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getProject({ projectId: projectId ?? options.project }),\n options,\n );\n}\n\nexport async function createProjectCommand(\n name: string,\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(() => createProject({ name }), options);\n}\n\nexport async function updateProjectCommand(\n projectId: string | undefined,\n options: ProjectsCommandOptions,\n): Promise<void> {\n const name = options.name;\n if (!name) {\n throw new Error('Missing required option: --name <name>');\n }\n await handleResult(\n () =>\n updateProject({\n projectId: projectId ?? options.project,\n name,\n }),\n options,\n );\n}\n\nexport async function deleteProjectCommand(\n projectId: string | undefined,\n options: ProjectsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteProject({ projectId: projectId ?? options.project }),\n options,\n );\n}\n","import { loadJsonConfig } from '../../config/index.js';\nimport { createApiClient } from '../../core/api-client.js';\nimport { handleCliError, throwApiError } from '../../core/api-error.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { writeResult } from '../../core/output.js';\nimport { isStdinPiped, readStdin } from '../../core/stdin.js';\nimport type { paths } from '../../types/api.gen.js';\nimport type { GlobalOptions } from '../../types/global.js';\nimport { listProjects } from '../projects/index.js';\n\n// === Types extracted from API spec ===\n\ntype FlowSummary =\n paths['/api/projects/{projectId}/flows']['get']['responses']['200']['content']['application/json']['flows'][number];\n\ntype Project =\n paths['/api/projects']['get']['responses']['200']['content']['application/json']['projects'][number];\n\nexport interface ProjectFlows {\n project: { id: Project['id']; name: Project['name'] };\n flows: FlowSummary[];\n}\n\n// === Programmatic API ===\n\nexport interface ListFlowsOptions {\n projectId?: string;\n sort?: 'name' | 'updated_at' | 'created_at';\n order?: 'asc' | 'desc';\n includeDeleted?: boolean;\n cursor?: string;\n limit?: number;\n}\n\nexport async function listFlows(options: ListFlowsOptions = {}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.GET('/api/projects/{projectId}/flows', {\n params: {\n path: { projectId: id },\n query: {\n sort: options.sort,\n order: options.order,\n include_deleted: options.includeDeleted ? 'true' : undefined,\n cursor: options.cursor,\n limit: options.limit,\n },\n },\n });\n if (error) throwApiError(error, 'Failed to list flows');\n return data;\n}\n\nexport async function listAllFlows(\n options?: Omit<ListFlowsOptions, 'projectId'>,\n): Promise<ProjectFlows[]> {\n const { projects } = await listProjects();\n const results: ProjectFlows[] = [];\n\n for (const project of projects) {\n const data = await listFlows({ ...options, projectId: project.id });\n results.push({\n project: { id: project.id, name: project.name },\n flows: data.flows,\n });\n }\n\n return results;\n}\n\nexport async function getFlow(options: {\n flowId: string;\n projectId?: string;\n fields?: string[];\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.GET(\n '/api/projects/{projectId}/flows/{flowId}',\n {\n params: {\n path: { projectId: id, flowId: options.flowId },\n query: options.fields ? { fields: options.fields.join(',') } : {},\n },\n },\n );\n if (error) throwApiError(error, 'Failed to get flow');\n return data;\n}\n\nexport async function createFlow(options: {\n name: string;\n content: Record<string, unknown>;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.POST('/api/projects/{projectId}/flows', {\n params: { path: { projectId: id } },\n // Config is user-provided JSON; server validates the full schema\n body: { name: options.name, config: options.content } as never,\n });\n if (error) throwApiError(error, 'Failed to create flow');\n return data;\n}\n\nexport async function updateFlow(options: {\n flowId: string;\n name?: string;\n content?: Record<string, unknown>;\n projectId?: string;\n mergePatch?: boolean;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const body: Record<string, unknown> = {};\n if (options.name !== undefined) body.name = options.name;\n if (options.content !== undefined) body.config = options.content;\n const { data, error } = await client.PATCH(\n '/api/projects/{projectId}/flows/{flowId}',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n // Dynamically constructed body; server validates the full schema\n body: body as never,\n ...(options.mergePatch && {\n headers: { 'Content-Type': 'application/merge-patch+json' },\n }),\n },\n );\n if (error) throwApiError(error, 'Failed to update flow');\n return data;\n}\n\nexport async function deleteFlow(options: {\n flowId: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.DELETE(\n '/api/projects/{projectId}/flows/{flowId}',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n },\n );\n if (error) throwApiError(error, 'Failed to delete flow');\n return data ?? { success: true };\n}\n\nexport async function duplicateFlow(options: {\n flowId: string;\n name?: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n const client = createApiClient();\n const { data, error } = await client.POST(\n '/api/projects/{projectId}/flows/{flowId}/duplicate',\n {\n params: { path: { projectId: id, flowId: options.flowId } },\n body: { name: options.name },\n },\n );\n if (error) throwApiError(error, 'Failed to duplicate flow');\n return data;\n}\n\n// === CLI Command Handlers ===\n\ninterface FlowsCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n project?: string;\n}\n\nasync function handleResult(\n fn: () => Promise<unknown>,\n options: FlowsCommandOptions,\n): Promise<void> {\n try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n handleCliError(error);\n }\n}\n\nexport async function listFlowsCommand(\n options: FlowsCommandOptions & {\n sort?: string;\n order?: string;\n includeDeleted?: boolean;\n cursor?: string;\n limit?: number;\n },\n): Promise<void> {\n await handleResult(\n () =>\n listFlows({\n projectId: options.project,\n sort: options.sort as ListFlowsOptions['sort'],\n order: options.order as ListFlowsOptions['order'],\n includeDeleted: options.includeDeleted,\n cursor: options.cursor,\n limit: options.limit,\n }),\n options,\n );\n}\n\nexport async function getFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function createFlowCommand(\n name: string,\n options: FlowsCommandOptions & { content?: string },\n): Promise<void> {\n await handleResult(async () => {\n const content = options.content\n ? await loadFlowContent(options.content)\n : JSON.parse(await readFlowStdin());\n return createFlow({ name, content, projectId: options.project });\n }, options);\n}\n\nexport async function updateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string; content?: string },\n): Promise<void> {\n await handleResult(\n async () =>\n updateFlow({\n flowId,\n name: options.name,\n content: options.content\n ? await loadFlowContent(options.content)\n : undefined,\n projectId: options.project,\n }),\n options,\n );\n}\n\nexport async function deleteFlowCommand(\n flowId: string,\n options: FlowsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteFlow({ flowId, projectId: options.project }),\n options,\n );\n}\n\nexport async function duplicateFlowCommand(\n flowId: string,\n options: FlowsCommandOptions & { name?: string },\n): Promise<void> {\n await handleResult(\n () =>\n duplicateFlow({ flowId, name: options.name, projectId: options.project }),\n options,\n );\n}\n\n/** `--content` takes inline JSON, a file path or a URL. */\nfunction loadFlowContent(input: string): Promise<Record<string, unknown>> {\n return loadJsonConfig<Record<string, unknown>>(input);\n}\n\nasync function readFlowStdin(): Promise<string> {\n if (!isStdinPiped()) {\n throw new Error('Content required: use --content or pipe via stdin');\n }\n return readStdin();\n}\n","import { randomUUID } from 'node:crypto';\nimport { createApiClient } from '../../core/api-client.js';\nimport { requireProjectId } from '../../core/auth.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport type { ResponseJson } from '../../core/api-request.js';\nimport {\n ApiError,\n handleCliError,\n throwApiError,\n throwApiResponseError,\n} from '../../core/api-error.js';\nimport { parseSSEEvents } from '../../core/sse.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport type { GlobalOptions } from '../../types/global.js';\nimport { getFlow } from '../flows/index.js';\n\n/** Response body of POST .../settings/{settingsId}/deploy. */\ntype DeploySettingsResponse = ResponseJson<\n 'POST /api/projects/{projectId}/flows/{flowId}/settings/{settingsId}/deploy',\n 201\n>;\n\n// === Helpers ===\n\nasync function resolveSettingsId(options: {\n flowId: string;\n projectId: string;\n flowName: string;\n}): Promise<string> {\n const flow = await getFlow({\n flowId: options.flowId,\n projectId: options.projectId,\n });\n const settings = (flow as { settings?: Array<{ id: string; name: string }> })\n .settings;\n if (!settings?.length) {\n throw new Error('Flow has no settings.');\n }\n const match = settings.find((c) => c.name === options.flowName);\n if (!match) {\n throw new Error(\n `Flow \"${options.flowName}\" not found. Available: ${settings.map((c) => c.name).join(', ')}`,\n );\n }\n return match.id;\n}\n\nasync function getAvailableFlowNames(options: {\n flowId: string;\n projectId: string;\n}): Promise<string[]> {\n const flow = await getFlow({\n flowId: options.flowId,\n projectId: options.projectId,\n });\n const settings = (flow as { settings?: Array<{ name: string }> }).settings;\n return settings?.map((c) => c.name) ?? [];\n}\n\n/**\n * Default client-side wait budget for a streamed deploy, in milliseconds.\n *\n * The server's deploy budget is 10 minutes; this default exceeds it so a\n * slow-but-healthy long deploy is never aborted client-side and misread as a\n * failure in CI. `--wait <seconds>` (the `timeout` option) overrides it.\n */\nexport const DEFAULT_DEPLOY_WAIT_MS = 12 * 60 * 1000;\n\n// === SSE Streaming ===\n\ninterface DeploymentResult {\n status: string;\n substatus?: string | null;\n type?: string;\n containerUrl?: string | null;\n publicUrl?: string | null;\n errorMessage?: string | null;\n [key: string]: unknown;\n}\n\nexport async function streamDeploymentStatus(\n projectId: string,\n deploymentId: string,\n options: {\n timeout?: number;\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n },\n): Promise<DeploymentResult> {\n const timeoutMs = options.timeout ?? DEFAULT_DEPLOY_WAIT_MS;\n\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/deployments/{deploymentId}/stream',\n {\n path: { projectId, deploymentId },\n headers: { Accept: 'text/event-stream' },\n signal: options.signal ?? AbortSignal.timeout(timeoutMs),\n },\n );\n\n if (!response.ok) throw new Error(`Stream failed: ${response.status}`);\n if (!response.body) throw new Error('No response body');\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let result: DeploymentResult | null = null;\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const { parsed, remainder } = parseSSEEvents(buffer);\n buffer = remainder;\n\n for (const event of parsed) {\n if (event.type === 'status') {\n const data = JSON.parse(event.data);\n result = data;\n options.onStatus?.(data.status, data.substatus ?? null);\n }\n if (event.type === 'done') {\n return result!;\n }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n\n if (!result) throw new Error('Stream ended without terminal status');\n return result;\n}\n\n// === Programmatic API ===\n\nexport interface DeployOptions {\n flowId: string;\n projectId?: string;\n wait?: boolean;\n flowName?: string;\n timeout?: number; // ms, default DEFAULT_DEPLOY_WAIT_MS (12 minutes)\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n}\n\nexport async function deploy(options: DeployOptions) {\n const projectId = options.projectId ?? requireProjectId();\n const client = createApiClient();\n\n if (options.flowName) {\n const settingsId = await resolveSettingsId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n return deploySettings({\n ...options,\n projectId,\n settingsId,\n timeout: options.timeout,\n signal: options.signal,\n onStatus: options.onStatus,\n });\n }\n\n // Legacy path. A fresh Idempotency-Key per invocation means a retry after a\n // failed attempt is a new deploy, not a silent replay of `already_created`.\n const { data, error } = await client.POST(\n '/api/projects/{projectId}/flows/{flowId}/deploy',\n {\n params: { path: { projectId, flowId: options.flowId } },\n headers: { 'Idempotency-Key': randomUUID() },\n },\n );\n\n if (error) {\n try {\n throwApiError(error, 'Failed to start deployment');\n } catch (e) {\n if (e instanceof ApiError && e.code === 'AMBIGUOUS_CONFIG') {\n const names = await getAvailableFlowNames({\n flowId: options.flowId,\n projectId,\n });\n throw new ApiError(\n `This flow has multiple settings. Use --flow <name> to specify one.\\nAvailable: ${names.join(', ')}`,\n { code: 'AMBIGUOUS_CONFIG' },\n );\n }\n throw e;\n }\n }\n\n if (!options.wait) return data;\n\n // Stream deployment status via SSE\n const result = await streamDeploymentStatus(projectId, data.deploymentId, {\n timeout: options.timeout,\n signal: options.signal,\n onStatus: options.onStatus,\n });\n\n return { ...data, ...result };\n}\n\n// Uses `apiRequest`, which answers the raw `Response`, rather than the typed\n// `client.POST()`: the bounded Retry-After retry below inspects\n// `response.status` and the `Retry-After` header, and the `--wait` path then\n// streams `text/event-stream`. openapi-fetch's `{ data, error }` client hides\n// the raw `Response`, so it cannot drive either path.\nasync function deploySettings(options: {\n flowId: string;\n projectId: string;\n settingsId: string;\n wait?: boolean;\n timeout?: number;\n signal?: AbortSignal;\n onStatus?: (status: string, substatus: string | null) => void;\n}) {\n const { flowId, projectId, settingsId } = options;\n\n // 1. Trigger per-settings deploy. A fresh Idempotency-Key per invocation\n // means a retry after a failed attempt is a new deploy, not a silent replay\n // of `already_created`.\n const triggerDeploy = () =>\n apiRequest(\n 'POST /api/projects/{projectId}/flows/{flowId}/settings/{settingsId}/deploy',\n {\n path: { projectId, flowId, settingsId },\n headers: { 'Idempotency-Key': randomUUID() },\n },\n );\n\n let response = await triggerDeploy();\n\n // For `--wait`, honor a single bounded Retry-After on a rate-limited trigger\n // before giving up, so a brief deploy-rate ceiling does not fail an\n // otherwise healthy automated deploy.\n if (!response.ok && options.wait) {\n let retryBody: unknown = {};\n try {\n retryBody = await response.clone().json();\n } catch {\n retryBody = {};\n }\n try {\n throwApiResponseError(\n response,\n retryBody,\n `Deploy failed (${response.status})`,\n );\n } catch (e) {\n if (e instanceof ApiError && e.retryable) {\n const waitSeconds = Math.min(e.retryAfterSeconds ?? 5, 60);\n options.onStatus?.('rate_limited', `retrying in ${waitSeconds}s`);\n await new Promise((resolve) => setTimeout(resolve, waitSeconds * 1000));\n response = await triggerDeploy();\n } else {\n throw e;\n }\n }\n }\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiResponseError(response, body, `Deploy failed (${response.status})`);\n }\n\n const data: DeploySettingsResponse = await response.json();\n if (!options.wait) return data;\n\n // 2. Stream deployment status via SSE\n const result = await streamDeploymentStatus(projectId, data.deploymentId, {\n timeout: options.timeout,\n signal: options.signal,\n onStatus: options.onStatus,\n });\n\n return { ...data, ...result };\n}\n\nexport async function getDeployment(options: {\n flowId: string;\n projectId?: string;\n flowName?: string;\n}) {\n const projectId = options.projectId ?? requireProjectId();\n\n if (options.flowName) {\n const settingsId = await resolveSettingsId({\n flowId: options.flowId,\n projectId,\n flowName: options.flowName,\n });\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/settings/{settingsId}/deploy',\n { path: { projectId, flowId: options.flowId, settingsId } },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiResponseError(response, body, 'Failed to get deployment');\n }\n return response.json();\n }\n\n const client = createApiClient();\n\n const { data, error } = await client.GET(\n '/api/projects/{projectId}/flows/{flowId}/deploy',\n { params: { path: { projectId, flowId: options.flowId } } },\n );\n if (error) throwApiError(error, 'Failed to get deployment');\n return data;\n}\n\n// === CLI Commands ===\n\ninterface DeployCommandOptions extends GlobalOptions {\n project?: string;\n flow?: string;\n wait?: boolean;\n timeout?: string;\n output?: string;\n json?: boolean;\n}\n\n// Progress labels keyed on the statuses the deploy stream ACTUALLY emits. The\n// server status enum is idle | deploying | published | active | stopped |\n// failed; the bundle phase is reported as `deploying`/`building`, not a\n// separate `bundling` status. Keys are `status` or `status:substatus`.\nconst statusLabels: Record<string, string> = {\n 'deploying:building': 'Building bundle...',\n 'deploying:publishing': 'Publishing to web...',\n 'deploying:provisioning': 'Provisioning container...',\n 'deploying:starting': 'Starting container...',\n deploying: 'Deploying...',\n active: 'Container is live',\n published: 'Published',\n stopped: 'Stopped',\n failed: 'Deployment failed',\n};\n\n/**\n * Map a streamed `(status, substatus)` to a human progress line, falling back\n * to the bare status label, then to a safe `Status: <raw>` line for an unknown\n * status so an unexpected value still renders something instead of nothing.\n */\nexport function renderStatusLabel(\n status: string,\n substatus: string | null,\n): string {\n const key = substatus ? `${status}:${substatus}` : status;\n return statusLabels[key] || statusLabels[status] || `Status: ${status}`;\n}\n\nexport async function deployCommand(\n flowId: string,\n options: DeployCommandOptions,\n) {\n const log = createCLILogger(options);\n\n const timeoutMs = options.timeout\n ? parseInt(options.timeout, 10) * 1000\n : undefined;\n\n try {\n const result = await deploy({\n flowId,\n projectId: options.project,\n flowName: options.flow,\n wait: options.wait !== false,\n timeout: timeoutMs,\n onStatus: options.json\n ? undefined\n : (status, substatus) => {\n log.info(renderStatusLabel(status, substatus));\n },\n });\n\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n return;\n }\n\n const r = result as Record<string, unknown>;\n\n if (r.status === 'published') {\n log.info(`Published: ${r.publicUrl}`);\n } else if (r.status === 'active') {\n log.info(`Active: ${r.containerUrl}`);\n } else if (r.status === 'failed') {\n log.error(`Failed: ${r.errorMessage || 'Unknown error'}`);\n process.exit(1);\n } else if (r.status === 'deploying') {\n // Non-wait path: the deploy-trigger response reports `deploying` (the\n // server status enum has no `bundling`; the build phase is a substatus).\n log.info(`Deployment started: ${r.deploymentId} (${r.type})`);\n } else {\n log.info(`Status: ${r.status}`);\n }\n } catch (err) {\n handleCliError(err);\n }\n}\n\nexport async function getDeploymentCommand(\n flowId: string,\n options: DeployCommandOptions,\n) {\n const log = createCLILogger(options);\n\n try {\n const result = await getDeployment({\n flowId,\n projectId: options.project,\n flowName: options.flow,\n });\n\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n return;\n }\n\n if (!result) {\n log.info('No deployment found');\n return;\n }\n\n const r = result as Record<string, unknown>;\n log.info(`Deployment: ${r.id}`);\n log.info(`Type: ${r.type}`);\n log.info(`Status: ${r.status}`);\n if (r.containerUrl) log.info(`Endpoint: ${r.containerUrl}`);\n if (r.publicUrl) log.info(`URL: ${r.publicUrl}`);\n if (r.errorMessage) log.error(`Error: ${r.errorMessage}`);\n } catch (err) {\n handleCliError(err);\n }\n}\n","import { getPlatform, isObject } from '@walkeros/core';\nimport { requireProjectId } from '../../core/auth.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport type { ApiRequestInit, ResponseJson } from '../../core/api-request.js';\nimport { handleCliError, throwApiError } from '../../core/api-error.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\nimport { writeResult } from '../../core/output.js';\nimport { resolveAppUrl } from '../../lib/config-file.js';\nimport { VERSION } from '../../version.js';\nimport { loadFlowConfig } from '../../config/loader.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n// === Programmatic API ===\n\ntype ListDeploymentsQuery = NonNullable<\n ApiRequestInit<'GET /api/projects/{projectId}/deployments'>['query']\n>;\n\n/** A deployment status, as the contract's list filter declares it. */\nexport type DeploymentStatus = NonNullable<ListDeploymentsQuery['status']>;\n\n/** A deployment type, as the contract's list filter declares it. */\nexport type DeploymentType = NonNullable<ListDeploymentsQuery['type']>;\n\n/** Every deployment status. The compiler holds it equal to the contract's. */\nexport const DEPLOYMENT_STATUSES = {\n idle: true,\n deploying: true,\n published: true,\n active: true,\n stopped: true,\n failed: true,\n} satisfies Record<DeploymentStatus, true>;\n\n/** Every deployment type. The compiler holds it equal to the contract's. */\nexport const DEPLOYMENT_TYPES = {\n web: true,\n server: true,\n} satisfies Record<DeploymentType, true>;\n\nfunction isMember<T extends string>(\n members: Readonly<Record<T, true>>,\n value: string,\n): value is T {\n return Object.hasOwn(members, value);\n}\n\nexport function isDeploymentStatus(value: string): value is DeploymentStatus {\n return isMember(DEPLOYMENT_STATUSES, value);\n}\n\nexport interface ListDeploymentsOptions {\n projectId?: string;\n type?: DeploymentType;\n status?: DeploymentStatus;\n flowId?: string;\n cursor?: string;\n limit?: number;\n}\n\nexport async function listDeployments(options: ListDeploymentsOptions = {}) {\n const id = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/deployments',\n {\n path: { projectId: id },\n query: {\n type: options.type,\n status: options.status,\n flowId: options.flowId || undefined,\n cursor: options.cursor || undefined,\n limit: options.limit,\n },\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to list deployments');\n }\n return response.json();\n}\n\n/**\n * Summary of an active deployment returned by listDeployments, used when\n * disambiguating which deployment to operate on for a given flow.\n */\nexport interface DeploymentSummaryForFlow {\n slug: string;\n type: string;\n status: string;\n updatedAt: string;\n}\n\n/**\n * Error thrown by deleteDeploymentByFlowId and other flow-scoped helpers when\n * the flow has multiple active (non-deleted) deployments and the caller did\n * not disambiguate with an explicit slug.\n *\n * Callers (e.g. the MCP layer) can translate this into a structured error.\n * The CLI package does not depend on MCP helpers.\n */\nexport class DeploymentAmbiguityError extends Error {\n readonly code = 'MULTIPLE_DEPLOYMENTS';\n readonly details: DeploymentSummaryForFlow[];\n constructor(message: string, details: DeploymentSummaryForFlow[]) {\n super(message);\n this.name = 'DeploymentAmbiguityError';\n this.details = details;\n }\n}\n\n/**\n * Delete a deployment identified by flowId, optionally disambiguated by slug\n * when the flow has more than one active deployment. Throws\n * DeploymentAmbiguityError when the flow has >= 2 active deployments and no\n * slug is provided. Throws a plain Error when the flow has no matches or when\n * a provided slug does not belong to the flow.\n */\nexport async function deleteDeploymentByFlowId(options: {\n projectId?: string;\n flowId: string;\n slug?: string;\n}): Promise<unknown> {\n const { flowId, slug } = options;\n const projectId = options.projectId ?? requireProjectId();\n\n const listResp = (await listDeployments({ projectId, flowId })) as {\n deployments?: DeploymentSummaryForFlow[];\n };\n const matches = listResp.deployments ?? [];\n\n if (matches.length === 0) {\n throw new Error(`No deployments found for flow ${flowId}`);\n }\n\n if (slug !== undefined) {\n const hit = matches.find((m) => m.slug === slug);\n if (!hit) {\n throw new Error(`No deployment with slug ${slug} in flow ${flowId}`);\n }\n return deleteDeployment({ slug: hit.slug, projectId });\n }\n\n if (matches.length > 1) {\n throw new DeploymentAmbiguityError(\n `Flow ${flowId} has ${matches.length} active deployments; pass slug to disambiguate`,\n matches.map((m) => ({\n slug: m.slug,\n type: m.type,\n status: m.status,\n updatedAt: m.updatedAt,\n })),\n );\n }\n return deleteDeployment({ slug: matches[0].slug, projectId });\n}\n\nexport async function getDeploymentBySlug(options: {\n slug: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/deployments/{deploymentId}',\n { path: { projectId: id, deploymentId: options.slug } },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to get deployment');\n }\n return response.json();\n}\n\nexport async function createDeployment(options: {\n type: 'web' | 'server';\n label?: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n\n const response = await apiRequest(\n 'POST /api/projects/{projectId}/deployments',\n {\n path: { projectId: id },\n body: { type: options.type, label: options.label },\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to create deployment');\n }\n return response.json();\n}\n\nexport async function deleteDeployment(options: {\n slug: string;\n projectId?: string;\n}) {\n const id = options.projectId ?? requireProjectId();\n\n const response = await apiRequest(\n 'DELETE /api/projects/{projectId}/deployments/{deploymentId}',\n { path: { projectId: id, deploymentId: options.slug } },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to delete deployment');\n }\n const data = await response.json().catch(() => null);\n return data ?? { success: true };\n}\n\n// === CLI Command Handlers ===\n\ninterface DeploymentsCommandOptions extends GlobalOptions {\n json?: boolean;\n output?: string;\n project?: string;\n type?: string;\n status?: string;\n label?: string;\n cursor?: string;\n limit?: number;\n}\n\n/** A flag's value narrowed to its members; any other value is an error. */\nfunction flagValue<T extends string>(\n flag: string,\n value: string | undefined,\n members: Readonly<Record<T, true>>,\n): T | undefined {\n if (value === undefined) return undefined;\n if (isMember(members, value)) return value;\n throw new Error(`${flag} must be one of: ${Object.keys(members).join(', ')}`);\n}\n\nasync function handleResult(\n fn: () => Promise<unknown>,\n options: DeploymentsCommandOptions,\n): Promise<void> {\n try {\n const result = await fn();\n await writeResult(JSON.stringify(result, null, 2), options);\n } catch (error) {\n handleCliError(error);\n }\n}\n\nexport async function listDeploymentsCommand(\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () =>\n listDeployments({\n projectId: options.project,\n type: flagValue('--type', options.type, DEPLOYMENT_TYPES),\n status: flagValue('--status', options.status, DEPLOYMENT_STATUSES),\n cursor: options.cursor,\n limit: options.limit,\n }),\n options,\n );\n}\n\nexport async function getDeploymentBySlugCommand(\n slug: string,\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => getDeploymentBySlug({ slug, projectId: options.project }),\n options,\n );\n}\n\nexport async function createDeploymentCommand(\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () =>\n createDeployment({\n type: options.type as 'web' | 'server',\n label: options.label,\n projectId: options.project,\n }),\n options,\n );\n}\n\nexport async function deleteDeploymentCommand(\n slug: string,\n options: DeploymentsCommandOptions,\n): Promise<void> {\n await handleResult(\n () => deleteDeployment({ slug, projectId: options.project }),\n options,\n );\n}\n\nexport async function createDeployCommand(\n config: string | undefined,\n options: DeploymentsCommandOptions & { flow?: string },\n): Promise<void> {\n const log = createCLILogger(options);\n\n try {\n let type: 'web' | 'server';\n\n if (!config) {\n log.error(\n 'Config required. Provide a flow config file or remote flow ID (cfg_xxx).',\n );\n process.exit(1);\n }\n\n // Detect: local file path vs remote flow ID\n const isRemoteFlow = config.startsWith('cfg_');\n\n if (isRemoteFlow) {\n // Fetch flow from API to determine type\n const id = options.project ?? requireProjectId();\n const resp = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}',\n { path: { projectId: id, flowId: config } },\n );\n if (!resp.ok) {\n const body = await resp.json().catch(() => ({}));\n throwApiError(body, `Failed to fetch flow ${config}`);\n }\n const flow: ResponseJson<\n 'GET /api/projects/{projectId}/flows/{flowId}',\n 200\n > = await resp.json();\n if (!flow.config) throw new Error('Flow has no config');\n\n const flows = flow.config.flows;\n if (!flows) throw new Error('Invalid flow config: missing flows');\n const flowName = options.flow ?? Object.keys(flows)[0];\n if (!flowName) throw new Error('No flows found in config');\n const flowSettings = flows[flowName];\n if (!isObject(flowSettings)) throw new Error('Invalid flow config');\n\n // A v4 flow declares its platform at flows.<name>.config.platform.\n const platform = isObject(flowSettings.config)\n ? flowSettings.config.platform\n : undefined;\n if (platform !== 'web' && platform !== 'server')\n throw new Error(\n `Flow \"${flowName}\" must have config.platform set to \"web\" or \"server\"`,\n );\n type = platform;\n } else {\n // Local file: use config loader + core getPlatform\n const result = await loadFlowConfig(config, {\n flowName: options.flow,\n });\n type = getPlatform(result.flowSettings);\n }\n\n // Create deployment via API\n const deployment = await createDeployment({\n type,\n label: options.label,\n projectId: options.project,\n });\n\n const result = deployment as Record<string, unknown>;\n\n if (options.json) {\n await writeResult(JSON.stringify(result, null, 2), options);\n return;\n }\n\n // Human-readable output. The create-deployment response does not include a\n // deploy token: tokens are minted separately (admin-only) and never stored\n // in plaintext, so we point the user at creating one rather than printing a\n // missing field.\n log.info(`Deployment created: ${result.id}`);\n log.info(` Slug: ${result.slug}`);\n log.info(` Type: ${result.type}`);\n\n if (type === 'server') {\n for (const line of selfHostServerHint({\n config: isRemoteFlow ? 'flow.json' : config,\n flowId: isRemoteFlow ? config : undefined,\n projectId: options.project ?? requireProjectId(),\n deploymentId: String(result.id),\n appUrl: resolveAppUrl(),\n version: VERSION,\n }))\n log.info(line);\n }\n } catch (err) {\n handleCliError(err);\n }\n}\n\n/**\n * The self-host instructions for a server deployment: build `dist/` with the\n * CLI, then run it in the `walkeros/flow` image (or with `runneros`) pinned to\n * this CLI's version. Mirrors the app's self-hosted command: the whole `dist/`\n * directory mounted at `/app/flow`, the token passed through from the shell,\n * and the project, flow and deployment ids the heartbeat needs.\n * Keep in step with the app's CI-executed source of this shape,\n * `components/src/flow/deploy/self-host-command.ts` (a copy, not an import:\n * public packages never depend on the app).\n */\nexport function selfHostServerHint(input: {\n config: string;\n /** Known for a remote flow; a local config prints a placeholder. */\n flowId?: string;\n projectId: string;\n deploymentId: string;\n appUrl: string;\n version: string;\n}): string[] {\n const env: Array<[string, string]> = [\n ['WALKEROS_PROJECT_ID', input.projectId],\n ['WALKEROS_FLOW_ID', input.flowId ?? '<your-flow-id>'],\n ['WALKEROS_DEPLOYMENT_ID', input.deploymentId],\n ['WALKEROS_APP_URL', input.appUrl],\n ];\n return [\n '',\n 'Create a deploy token for this flow in the app',\n '(Settings, Self-hosted deploy token) and export it as',\n 'WALKEROS_DEPLOY_TOKEN. Then build and run it with Docker:',\n ` walkeros bundle ${input.config} -o dist/`,\n ' docker run --rm -p 8080:8080 \\\\',\n ' -v \"$PWD/dist:/app/flow:ro\" \\\\',\n ' -e WALKEROS_DEPLOY_TOKEN \\\\',\n ...env.map(([name, value]) => ` -e ${name}=\"${value}\" \\\\`),\n ` walkeros/flow:${input.version}`,\n '',\n 'Or run the built flow with Node, with the same variables exported:',\n ` npx --yes --package=@walkeros/runner@${input.version} runneros start dist/flow.mjs`,\n ];\n}\n","import { createInterface } from 'readline';\nimport { readConfig, writeConfig } from '../../lib/config-file.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport { handleCliError } from '../../core/api-error.js';\nimport { createCLILogger } from '../../core/cli-logger.js';\n\n// === Programmatic API ===\n\nexport interface FeedbackOptions {\n anonymous?: boolean;\n version?: string;\n}\n\nexport async function feedback(\n text: string,\n options?: FeedbackOptions,\n): Promise<void> {\n const config = readConfig();\n\n const anonymous = options?.anonymous ?? config?.anonymousFeedback ?? true;\n\n const payload: {\n text: string;\n userId?: string;\n projectId?: string;\n version?: string;\n } = { text };\n\n if (options?.version) {\n payload.version = options.version;\n }\n\n if (!anonymous && config?.email) {\n payload.userId = config.email;\n const projectId = process.env.WALKEROS_PROJECT_ID;\n if (projectId) {\n payload.projectId = projectId;\n }\n }\n\n const response = await apiRequest('POST /api/feedback', {\n auth: 'none',\n body: payload,\n });\n\n if (!response.ok) {\n throw new Error(\n `Feedback submission failed: ${response.status} ${response.statusText}`,\n );\n }\n}\n\n// === CLI Command Handler ===\n\nexport async function feedbackCommand(text: string): Promise<void> {\n const logger = createCLILogger({});\n try {\n const config = readConfig();\n let anonymous: boolean;\n\n if (config?.anonymousFeedback === undefined) {\n // First time: prompt user for consent\n const answer = await promptUser(\n 'Include your user and project info with feedback? (y/N) ',\n );\n const anonymousFeedback = !answer.toLowerCase().startsWith('y');\n\n // Persist the choice\n if (config) {\n writeConfig({ ...config, anonymousFeedback });\n } else {\n writeConfig({\n token: '',\n email: '',\n appUrl: '',\n anonymousFeedback,\n });\n }\n anonymous = anonymousFeedback;\n } else {\n anonymous = config.anonymousFeedback;\n }\n\n await feedback(text, { anonymous });\n logger.info('Feedback sent. Thanks!');\n } catch (error) {\n handleCliError(error);\n }\n}\n\nfunction promptUser(question: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n","import { 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 {\n loginCommand,\n login,\n completeDeviceLogin,\n} from './commands/login/index.js';\nexport type {\n LoginOptions,\n LoginResult,\n CompleteDeviceLoginOptions,\n DeviceLoginResult,\n} from './commands/login/index.js';\nexport { logoutCommand, logout } from './commands/logout/index.js';\nexport { whoamiCommand } from './commands/auth/index.js';\nexport {\n listProjectsCommand,\n getProjectCommand,\n createProjectCommand,\n updateProjectCommand,\n deleteProjectCommand,\n} from './commands/projects/index.js';\nexport {\n listFlowsCommand,\n getFlowCommand,\n createFlowCommand,\n updateFlowCommand,\n deleteFlowCommand,\n duplicateFlowCommand,\n} from './commands/flows/index.js';\nexport {\n deployCommand,\n getDeploymentCommand,\n} from './commands/deploy/index.js';\nexport {\n createDeployCommand,\n listDeploymentsCommand,\n getDeploymentBySlugCommand,\n createDeploymentCommand,\n deleteDeploymentCommand,\n} from './commands/deployments/index.js';\nexport { feedbackCommand } from './commands/feedback/index.js';\nexport {\n telemetryStatusCommand,\n telemetryEnableCommand,\n telemetryDisableCommand,\n} from './commands/telemetry/index.js';\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle } from './commands/bundle/index.js';\nexport { 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 {\n resolveAccessToken,\n getAuthHeaders,\n credentialSource,\n requireProjectId,\n} from './core/auth.js';\nexport { startDeviceAuthorization } from './core/oauth-client.js';\nexport type { DeviceAuthorization } from './core/oauth-client.js';\nexport {\n apiFetch,\n publicFetch,\n deployFetch,\n mergeAuthHeaders,\n} from './core/http.js';\nexport { createApiClient } from './core/api-client.js';\nexport { apiRequest, operationUrl } from './core/api-request.js';\nexport type {\n ApiAuth,\n ApiRequestInit,\n ApiTransport,\n OperationKey,\n ResponseJson,\n} from './core/api-request.js';\nexport {\n fetchHealth,\n fetchOpenApi,\n compareContract,\n formatContract,\n canonicalContractHash,\n bakedContractVersion,\n bakedContractHash,\n bakedClientOperations,\n} from './core/contract.js';\nexport type {\n HealthResult,\n OpenApiResult,\n ClientOperation,\n ContractVerdict,\n ContractClient,\n MissingOperation,\n ContractComparison,\n CompareContractInput,\n} from './core/contract.js';\nexport { ApiError, throwApiError } from './core/api-error.js';\nexport type { ApiErrorDetail } from './core/api-error.js';\nexport {\n setClientContext,\n getClientContext,\n resetClientContext,\n clientContextHeaders,\n} from './core/client-context.js';\nexport type { ClientType, ClientContext } from './core/client-context.js';\nexport {\n listProjects,\n getProject,\n createProject,\n updateProject,\n deleteProject,\n} from './commands/projects/index.js';\nexport type { ListProjectsOptions } from './commands/projects/index.js';\nexport { whoami } from './commands/auth/index.js';\nexport { feedback } from './commands/feedback/index.js';\nexport {\n listFlows,\n listAllFlows,\n getFlow,\n createFlow,\n updateFlow,\n deleteFlow,\n duplicateFlow,\n} from './commands/flows/index.js';\nexport { deploy, getDeployment } from './commands/deploy/index.js';\nexport {\n listDeployments,\n getDeploymentBySlug,\n createDeployment,\n deleteDeployment,\n deleteDeploymentByFlowId,\n DeploymentAmbiguityError,\n DEPLOYMENT_STATUSES,\n DEPLOYMENT_TYPES,\n isDeploymentStatus,\n} from './commands/deployments/index.js';\nexport type {\n DeploymentSummaryForFlow,\n DeploymentStatus,\n DeploymentType,\n} from './commands/deployments/index.js';\nexport {\n listPreviews,\n getPreview,\n createPreview,\n deletePreview,\n regrantPreview,\n} from './commands/previews/index.js';\nexport type {\n ListPreviewsOptions,\n GetPreviewOptions,\n CreatePreviewOptions,\n DeletePreviewOptions,\n RegrantPreviewOptions,\n} from './commands/previews/index.js';\nexport { listJourneys } from './commands/journeys/index.js';\nexport type { ListJourneysOptions } from './commands/journeys/index.js';\nexport {\n startObserveSession,\n getObserveSession,\n endObserveSession,\n} from './commands/observe/index.js';\nexport type {\n StartObserveSessionOptions,\n GetObserveSessionOptions,\n EndObserveSessionOptions,\n} from './commands/observe/index.js';\nexport {\n listReleases,\n getRelease,\n listStepHistory,\n setReleaseRationale,\n listThreads,\n createThread,\n addThreadMessage,\n listKnowledge,\n} from './commands/hub/index.js';\nexport type {\n ListReleasesOptions,\n GetReleaseOptions,\n ReleaseRef,\n ReleaseIndexResponse,\n ReleaseRationaleSummary,\n ReleaseDiffResponse,\n ReleaseDetailResponse,\n ListStepHistoryOptions,\n SetReleaseRationaleOptions,\n ListThreadsOptions,\n CreateThreadOptions,\n AddThreadMessageOptions,\n ListKnowledgeOptions,\n ThreadAnchorType,\n ThreadStatus,\n} from './commands/hub/index.js';\nexport {\n listFrames,\n listPageFrames,\n getFrame,\n} from './commands/frames/index.js';\nexport type {\n ListFramesOptions,\n ListPageFramesOptions,\n GetFrameOptions,\n} from './commands/frames/index.js';\nexport {\n listSecrets,\n createSecret,\n updateSecret,\n deleteSecret,\n} from './commands/secrets/index.js';\nexport type {\n ListSecretsOptions,\n CreateSecretOptions,\n UpdateSecretOptions,\n DeleteSecretOptions,\n} from './commands/secrets/index.js';\nexport type { FeedbackOptions } from './commands/feedback/index.js';\nexport {\n readConfig,\n writeConfig,\n clearAuthFields,\n deleteConfig,\n resolveToken,\n resolveAppUrl,\n setDefaultProject,\n getDefaultProject,\n resolveProjectId,\n setFeedbackPreference,\n getFeedbackPreference,\n} from './lib/config-file.js';\nexport { VERSION } from './version.js';\nexport type { WalkerOSConfig } from './lib/config-file.js';\nexport type { ListFlowsOptions, ProjectFlows } from './commands/flows/index.js';\nexport type { DeployOptions } from './commands/deploy/index.js';\nexport type { ListDeploymentsOptions } from './commands/deployments/index.js';\nexport { parseSSEEvents } from './core/sse.js';\nexport type { SSEEvent, SSEParseResult } from './core/sse.js';\n\n// === Utilities ===\n// Export utilities for programmatic usage\nexport { loadConfig, loadJsonConfig } from './config/utils.js';\nexport { 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 cliCorePlugin,\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/core` (used by the preview activator) from the CLI\n // package's own dependency tree and the workspace root. Without this,\n // esbuild looks under the temp entryDir which has no node_modules.\n // The wrap step always runs from inside the CLI process; both the\n // CLI's local node_modules and the workspace root 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 core imports (the Tag Mode loader, the preview\n // activator) come from the CLI's own core, never from a core above the\n // temp dir.\n esbuildOptions.plugins = [cliCorePlugin()];\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","import { createHash } from 'node:crypto';\nimport semver from 'semver';\nimport { resolveAppUrl } from '../lib/config-file.js';\nimport { VERSION } from '../version.js';\nimport { apiRequest, operationUrl } from './api-request.js';\nimport { getClientContext, type ClientContext } from './client-context.js';\nimport { canonicalize, operationDigests } from './openapi-subset.js';\n\n/**\n * One app operation this client calls: `\"<METHOD> <path>\"`, the commands and\n * tools that call it (from `openapi/client-operations.json`) and the wire\n * digest of its shape in the client's `openapi/spec.json`.\n */\nexport interface ClientOperation {\n op: string;\n usedBy: string[];\n digest: string;\n}\n\n// Build-time defines, injected by tsup (see tsup.config.ts). In source/test\n// (un-bundled) contexts these are absent, so the runtime falls back to a\n// placeholder via `typeof` guards in the exported constants below.\ndeclare const __CONTRACT_VERSION__: string;\ndeclare const __CONTRACT_HASH__: string;\ndeclare const __CLIENT_OPERATION_DIGESTS__: readonly ClientOperation[];\n\nconst PLACEHOLDER = '0.0.0-unbundled';\n\n/**\n * The contract label this client was built against (`<floor>+<hash8>`),\n * baked from the bundled `openapi/spec.json` `info.version` at build time.\n */\nexport const bakedContractVersion: string =\n typeof __CONTRACT_VERSION__ === 'string' ? __CONTRACT_VERSION__ : PLACEHOLDER;\n\n/**\n * Canonical content hash of the bundled client subset (`openapi/spec.json`),\n * baked at build time with {@link canonicalContractHash}.\n */\nexport const bakedContractHash: string =\n typeof __CONTRACT_HASH__ === 'string' ? __CONTRACT_HASH__ : '';\n\n/**\n * Every app operation this client calls, with its usedBy and the wire digest\n * of the bundled `openapi/spec.json`, baked at build time.\n */\nexport const bakedClientOperations: readonly ClientOperation[] =\n typeof __CLIENT_OPERATION_DIGESTS__ === 'object'\n ? __CLIENT_OPERATION_DIGESTS__\n : [];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Strip `info.version` so a version-only bump does not change the content hash.\n * Mirrors the app's `stripInfoVersion`.\n */\nfunction stripInfoVersion(doc: unknown): unknown {\n if (!isRecord(doc) || !isRecord(doc.info)) {\n return doc;\n }\n const restInfo: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(doc.info)) {\n if (key !== 'version') restInfo[key] = value;\n }\n return { ...doc, info: restInfo };\n}\n\n/**\n * Deterministic sha256 hex of an OpenAPI document's content.\n *\n * Parity contract: identical to the app's `computeContractHash`\n * (app/src/lib/api/contract-version.ts): sha256 of\n * `JSON.stringify(canonicalize(stripInfoVersion(doc)))`, so the same document\n * hashes the same on both sides.\n */\nexport function canonicalContractHash(doc: unknown): string {\n const canonical = canonicalize(stripInfoVersion(doc));\n return createHash('sha256').update(JSON.stringify(canonical)).digest('hex');\n}\n\nexport interface HealthResult {\n reachable: boolean;\n status?: string;\n appVersion?: string;\n contractVersion?: string;\n contractHash?: string;\n /** The lowest client version the server accepts. */\n minSupportedClient?: string;\n /** The HTTP status, when the app answered with a non-2xx one. */\n httpStatus?: number;\n /** Why the probe failed, when it did not reach the app. */\n error?: string;\n}\n\nconst HEALTH_TIMEOUT_MS = 5000;\nconst OPENAPI_TIMEOUT_MS = 10000;\n\nfunction trimTrailingSlashes(url: string): string {\n return url.replace(/\\/+$/, '');\n}\n\n/**\n * Why a request did not reach the app: `timeout after <ms> ms`, or the\n * network error with its code, such as `fetch failed (ECONNREFUSED)`.\n */\nfunction failureReason(error: unknown, timeoutMs: number): string {\n // Read by shape, not `instanceof`: an abort's DOMException can come from\n // another realm.\n if (!isRecord(error)) return String(error);\n if (error.name === 'TimeoutError') return `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\n/**\n * Tokenless reachability + contract probe of the app's PUBLIC health route\n * (`GET /api/health`). Sends no credential (never `createApiClient`, whose\n * every request rejects without one) and defensively parses the JSON body.\n * Resolves `{ reachable: false, error }` only on a real network/timeout\n * failure; a non-2xx status still counts as reachable.\n *\n * `baseUrl` names the app to probe, without a trailing slash. Omitted, it\n * falls back to `resolveAppUrl()`, the local machine's chain\n * (`WALKEROS_APP_URL`, then the CLI config file, then the built-in default),\n * which is what every `walkeros` binary invocation wants. A caller that is\n * NOT the local CLI has to pass its own: an in-process host has no CLI config\n * to read, so the fallback would silently probe a different backend than the\n * one that caller talks to.\n */\nexport async function fetchHealth(baseUrl?: string): Promise<HealthResult> {\n try {\n const res = await apiRequest('GET /api/health', {\n auth: 'none',\n signal: AbortSignal.timeout(HEALTH_TIMEOUT_MS),\n ...(baseUrl === undefined ? {} : { baseUrl }),\n });\n const body: unknown = await res.json().catch(() => undefined);\n const result: HealthResult = { reachable: true };\n if (!res.ok) result.httpStatus = res.status;\n if (isRecord(body)) {\n if (typeof body.status === 'string') result.status = body.status;\n if (typeof body.appVersion === 'string')\n result.appVersion = body.appVersion;\n if (typeof body.contractVersion === 'string')\n result.contractVersion = body.contractVersion;\n if (typeof body.contractHash === 'string')\n result.contractHash = body.contractHash;\n if (typeof body.minSupportedClient === 'string')\n result.minSupportedClient = body.minSupportedClient;\n }\n return result;\n } catch (error) {\n return {\n reachable: false,\n error: failureReason(error, HEALTH_TIMEOUT_MS),\n };\n }\n}\n\n/** The live OpenAPI document of an app, or why it could not be read. */\nexport type OpenApiResult =\n | { ok: true; url: string; document: { [key: string]: unknown } }\n | { ok: false; url: string; error: string };\n\n/**\n * The app's PUBLIC OpenAPI document (`GET /api/openapi.json`), without a\n * credential. `error` is `HTTP <status>`, `response is not JSON`, `no paths`,\n * a timeout or the network error. `baseUrl` defaults like\n * {@link fetchHealth}.\n */\nexport async function fetchOpenApi(baseUrl?: string): Promise<OpenApiResult> {\n const base = baseUrl ?? trimTrailingSlashes(resolveAppUrl());\n const url = operationUrl('GET /api/openapi.json', { baseUrl: base });\n let res: Response;\n try {\n res = await apiRequest('GET /api/openapi.json', {\n auth: 'none',\n baseUrl: base,\n signal: AbortSignal.timeout(OPENAPI_TIMEOUT_MS),\n });\n } catch (error) {\n return { ok: false, url, error: failureReason(error, OPENAPI_TIMEOUT_MS) };\n }\n if (!res.ok) return { ok: false, url, error: `HTTP ${res.status}` };\n const document: unknown = await res.json().catch(() => undefined);\n if (!isRecord(document)) {\n return { ok: false, url, error: 'response is not JSON' };\n }\n if (!isRecord(document.paths)) return { ok: false, url, error: 'no paths' };\n return { ok: true, url, document };\n}\n\n/**\n * The verdict on this client against the live app, per operation:\n * - `in-sync`: every client operation has the client's wire shape.\n * - `changed`: some client operations differ from the server's and the\n * server's label names a floor (`<floor>+<hash8>`) not below the client's.\n * When the server's floor is higher, the server is the newer deploy:\n * upgrade the client. With the same floor a hash has no order, so the\n * server may be a newer or an older deploy.\n * - `server-older`: the server lacks client operations, or changed some and\n * its label names a lower floor or none (a label without build metadata\n * predates floors).\n * - `client-outdated`: the server's `minSupportedClient` is above this\n * client's version.\n * - `unknown`: the health route or the OpenAPI document could not be read, or\n * the client has no operations to compare.\n * - `in-process`: a door served inside the app it reports; never computed by\n * {@link compareContract}.\n */\nexport type ContractVerdict =\n | 'in-sync'\n | 'changed'\n | 'server-older'\n | 'client-outdated'\n | 'unknown'\n | 'in-process';\n\n/** The client a verdict is about. */\nexport interface ContractClient {\n /** `@walkeros/cli`, `@walkeros/mcp` or `@walkeros/runner`. */\n package: string;\n version: string;\n /** The contract label the client was built against. */\n contract: string;\n}\n\n/** A client operation the server does not offer, with its callers. */\nexport interface MissingOperation {\n op: string;\n usedBy: string[];\n}\n\nexport interface ContractComparison {\n verdict: ContractVerdict;\n /** The app compared against, without a trailing slash. */\n appUrl: string;\n client: ContractClient;\n /** The server's contract label, when it names one. */\n server?: string;\n /** The lowest client version the server accepts, when it names one. */\n minSupportedClient?: string;\n /** How many client operations were compared. */\n operations?: number;\n missing?: MissingOperation[];\n /** Client operations whose wire shape differs from the client's. */\n changed?: string[];\n /** `client-outdated`: the package and the lowest version the server accepts. */\n requires?: { package: string; version: string };\n /** `unknown`: what could not be read. */\n reason?: string;\n}\n\nexport interface CompareContractInput {\n /**\n * The app to compare against, without a trailing slash. Omitted, the local\n * machine's app URL; see {@link fetchHealth}.\n */\n baseUrl?: string;\n /** The client asking. Default: the process client context, else this CLI. */\n client?: ClientContext;\n /** The client's contract label. Default {@link bakedContractVersion}. */\n bakedVersion?: string;\n /** The client's operations. Default {@link bakedClientOperations}. */\n operations?: readonly ClientOperation[];\n}\n\nfunction isBelow(version: string, floor: string): boolean {\n return (\n semver.valid(version) !== null &&\n semver.valid(floor) !== null &&\n semver.lt(version, floor)\n );\n}\n\n/**\n * Whether a server label orders below the client's. Only a `<floor>+<hash8>`\n * label names a floor; a label without build metadata, or none at all, comes\n * from a server older than floors, so it counts as below.\n */\nfunction serverFloorBelow(server: string | undefined, client: string): boolean {\n if (server === undefined || !server.includes('+')) return true;\n if (semver.valid(server) === null) return true;\n return isBelow(server, client);\n}\n\nfunction documentLabel(document: {\n [key: string]: unknown;\n}): string | undefined {\n const info = document.info;\n return isRecord(info) && typeof info.version === 'string'\n ? info.version\n : undefined;\n}\n\n/**\n * Compare this client with the live app, operation by operation. First match\n * wins:\n * 1. the health route fails: `unknown`;\n * 2. health names a `minSupportedClient` above the client's version:\n * `client-outdated`;\n * 3. the client has no operations, or the OpenAPI document fails or has no\n * paths: `unknown`;\n * 4. the live document, pruned to the client's operations, gives `missing`\n * (operations it lacks) and `changed` (digests that differ);\n * 5. `missing` not empty: `server-older`;\n * 6. `changed` not empty: `server-older` when the server label names a floor\n * below the client's or no floor at all, else `changed`;\n * 7. `in-sync`. Operations no client calls and the stripped documentation\n * keywords never count.\n *\n * Sends no credential. Never throws.\n */\nexport async function compareContract(\n input: CompareContractInput = {},\n): Promise<ContractComparison> {\n const appUrl = trimTrailingSlashes(input.baseUrl ?? resolveAppUrl());\n const context = input.client ??\n getClientContext() ?? { type: 'cli', version: VERSION };\n const client: ContractClient = {\n package: `@walkeros/${context.type}`,\n version: context.version,\n contract: input.bakedVersion ?? bakedContractVersion,\n };\n const operations = input.operations ?? bakedClientOperations;\n\n const health = await fetchHealth(appUrl);\n if (!health.reachable) {\n const url = operationUrl('GET /api/health', { baseUrl: appUrl });\n return {\n verdict: 'unknown',\n appUrl,\n client,\n reason: `GET ${url}: ${health.error ?? 'no response'}`,\n };\n }\n const known: ContractComparison = {\n verdict: 'unknown',\n appUrl,\n client,\n ...(health.contractVersion !== undefined && {\n server: health.contractVersion,\n }),\n ...(health.minSupportedClient !== undefined && {\n minSupportedClient: health.minSupportedClient,\n }),\n };\n if (\n health.minSupportedClient !== undefined &&\n isBelow(client.version, health.minSupportedClient)\n ) {\n return {\n ...known,\n verdict: 'client-outdated',\n requires: { package: client.package, version: health.minSupportedClient },\n };\n }\n\n if (operations.length === 0) {\n return { ...known, reason: 'no baked client operations' };\n }\n\n const live = await fetchOpenApi(appUrl);\n if (!live.ok) {\n return { ...known, reason: `GET ${live.url}: ${live.error}` };\n }\n let liveDigests: Record<string, string>;\n try {\n liveDigests = operationDigests(\n live.document,\n operations.map(({ op }) => op),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ...known, reason: `GET ${live.url}: ${message}` };\n }\n\n const missing: MissingOperation[] = operations\n .filter(({ op }) => !Object.hasOwn(liveDigests, op))\n .map(({ op, usedBy }) => ({ op, usedBy }));\n const changed = operations\n .filter(({ op, digest }) => {\n return Object.hasOwn(liveDigests, op) && liveDigests[op] !== digest;\n })\n .map(({ op }) => op);\n const server = known.server ?? documentLabel(live.document);\n const compared: ContractComparison = {\n ...known,\n ...(server !== undefined && { server }),\n operations: operations.length,\n missing,\n changed,\n };\n\n if (missing.length > 0) return { ...compared, verdict: 'server-older' };\n if (changed.length > 0) {\n const older = serverFloorBelow(server, client.contract);\n return { ...compared, verdict: older ? 'server-older' : 'changed' };\n }\n return { ...compared, verdict: 'in-sync' };\n}\n\n/** `op (caller, caller)` for each missing operation. */\nfunction missingList(missing: readonly MissingOperation[]): string {\n return missing\n .map(({ op, usedBy }) =>\n usedBy.length > 0 ? `${op} (${usedBy.join(', ')})` : op,\n )\n .join(', ');\n}\n\n/**\n * One line stating a {@link ContractComparison}, for a terminal or a log:\n * `contract: <verdict> (<facts>)`, plus what differs.\n */\nexport function formatContract(c: ContractComparison): string {\n const server = c.server ?? 'without a label';\n const labels = `server ${server}, client ${c.client.contract}`;\n const missing = c.missing ?? [];\n const changed = c.changed ?? [];\n switch (c.verdict) {\n case 'in-sync':\n return `contract: in-sync (${labels}, ${c.operations ?? 0} operations)`;\n case 'changed':\n return `contract: changed (${labels}); changed: ${changed.join(', ')}`;\n case 'server-older': {\n const parts = [`contract: server-older (${labels})`];\n if (missing.length > 0) {\n parts.push(`not offered (${missing.length}): ${missingList(missing)}`);\n }\n if (changed.length > 0) parts.push(`changed: ${changed.length}`);\n return parts.join('; ');\n }\n case 'client-outdated': {\n const pkg = c.requires?.package ?? c.client.package;\n const floor = c.requires?.version ?? c.minSupportedClient;\n const requires =\n floor === undefined ? '' : ` requires ${pkg} >= ${floor}`;\n return `contract: client-outdated (${c.appUrl}${requires}; this is ${c.client.version})`;\n }\n case 'unknown':\n return `contract: unknown (${c.reason ?? 'no reason given'})`;\n case 'in-process':\n return `contract: in-process (server ${server})`;\n }\n}\n","import { requireProjectId } from '../../core/auth.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport type { ApiRequestInit, ResponseJson } from '../../core/api-request.js';\nimport { throwApiError } from '../../core/api-error.js';\nimport { getFlow } from '../flows/index.js';\n\ntype PreviewResponse = ResponseJson<\n 'GET /api/projects/{projectId}/flows/{flowId}/previews/{previewId}',\n 200\n>;\ntype CreatePreviewBody =\n ApiRequestInit<'POST /api/projects/{projectId}/flows/{flowId}/previews'>['body'];\ntype MintGrantResponse = ResponseJson<\n 'POST /api/projects/{projectId}/flows/{flowId}/previews/{previewId}/grant',\n 200\n>;\n\n// === Programmatic API ===\n\nexport interface ListPreviewsOptions {\n projectId?: string;\n flowId: string;\n}\n\nexport async function listPreviews(\n options: ListPreviewsOptions,\n): Promise<\n ResponseJson<'GET /api/projects/{projectId}/flows/{flowId}/previews', 200>\n> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/previews',\n { path: { projectId: pid, flowId: options.flowId } },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to list previews');\n }\n return response.json();\n}\n\nexport interface GetPreviewOptions {\n projectId?: string;\n flowId: string;\n previewId: string;\n}\n\nexport async function getPreview(\n options: GetPreviewOptions,\n): Promise<PreviewResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/previews/{previewId}',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n previewId: options.previewId,\n },\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to get preview');\n }\n return response.json();\n}\n\nexport interface CreatePreviewOptions {\n projectId?: string;\n flowId: string;\n flowName?: string;\n flowSettingsId?: string;\n /** What the preview should run: the flow's draft (default) or a deployed\n * version's stored config. Anchored to the generated API contract so a new\n * request field becomes a type error here rather than silent drift. */\n source?: NonNullable<CreatePreviewBody>['source'];\n /** Target site URL. When present, the CLI asks the server to re-mint an\n * origin-bound activation grant for this URL's origin. Grants are\n * app-signed and origin-bound, so a client cannot forge a working activation\n * URL for an arbitrary origin by string-appending a token — only the server\n * can mint one. The returned preview's `activationUrl` is the grant URL for\n * this origin. */\n url?: string;\n}\n\nexport async function createPreview(\n options: CreatePreviewOptions,\n): Promise<PreviewResponse> {\n const pid = options.projectId ?? requireProjectId();\n\n // Derive (and validate) the target origin up front so an invalid --url fails\n // before we create a server-side preview, which would otherwise waste a quota\n // slot and force manual cleanup.\n let origin: string | undefined;\n if (options.url !== undefined) {\n try {\n origin = new URL(options.url).origin;\n } catch {\n throw new Error(`Invalid --url value: ${options.url}`);\n }\n }\n\n let settingsId = options.flowSettingsId;\n if (!settingsId) {\n if (!options.flowName) {\n throw new Error('Either flowName or flowSettingsId is required');\n }\n // Resolve flow settings name → id (same pattern deploy uses)\n const flow = await getFlow({ projectId: pid, flowId: options.flowId });\n const settings = (\n flow as { settings?: Array<{ id: string; name: string }> }\n ).settings;\n const match = settings?.find((s) => s.name === options.flowName);\n if (!match) {\n throw new Error(\n `Flow settings named \"${options.flowName}\" not found on flow ${options.flowId}`,\n );\n }\n settingsId = match.id;\n }\n\n const response = await apiRequest(\n 'POST /api/projects/{projectId}/flows/{flowId}/previews',\n {\n path: { projectId: pid, flowId: options.flowId },\n body: {\n flowSettingsId: settingsId,\n ...(options.source ? { source: options.source } : {}),\n },\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to create preview');\n }\n const created: ResponseJson<\n 'POST /api/projects/{projectId}/flows/{flowId}/previews',\n 201\n > = await response.json();\n\n // No target URL: the create response already carries a valid grant-based\n // activationUrl for the flow's default/configured origin. Return it as-is.\n if (origin === undefined) return created;\n\n // Target URL given: re-mint an origin-bound grant for that origin. The\n // server signs the grant; the CLI cannot produce a valid one client-side.\n const grantResponse = await apiRequest(\n 'POST /api/projects/{projectId}/flows/{flowId}/previews/{previewId}/grant',\n {\n path: { projectId: pid, flowId: options.flowId, previewId: created.id },\n body: { origins: [origin] },\n },\n );\n if (!grantResponse.ok) {\n const body = await grantResponse.json().catch(() => ({}));\n // The preview already exists at this point. A failed mint must name it,\n // or the caller has no handle to delete the orphan or retry the mint.\n try {\n throwApiError(body, 'Failed to mint preview activation grant');\n } catch (error) {\n if (error instanceof Error) {\n error.message += ` (preview ${created.id} was created but has no working activation URL; delete it or mint a grant with regrantPreview)`;\n }\n throw error;\n }\n }\n const grant: MintGrantResponse = await grantResponse.json();\n return { ...created, activationUrl: grant.activationUrl };\n}\n\nexport interface RegrantPreviewOptions {\n projectId?: string;\n flowId: string;\n previewId: string;\n /** Bare `https://host[:port]` origins the grant may activate on; the\n * returned `activationUrl` targets the first. */\n origins: string[];\n /** Observe session id — binds the minted grant to that session so\n * forwarded events reach its container. Opaque to the CLI. */\n sessionId?: string;\n}\n\n/**\n * Mint a fresh, origin-bound activation grant for an existing preview.\n * Grants are app-signed and origin-bound, so a client cannot forge a working\n * activation URL by string-appending a token — only the server can mint one.\n */\nexport async function regrantPreview(\n options: RegrantPreviewOptions,\n): Promise<MintGrantResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'POST /api/projects/{projectId}/flows/{flowId}/previews/{previewId}/grant',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n previewId: options.previewId,\n },\n body: {\n origins: options.origins,\n ...(options.sessionId ? { sessionId: options.sessionId } : {}),\n },\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to mint preview activation grant');\n }\n return response.json();\n}\n\nexport interface DeletePreviewOptions {\n projectId?: string;\n flowId: string;\n previewId: string;\n}\n\nexport async function deletePreview(options: DeletePreviewOptions) {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'DELETE /api/projects/{projectId}/flows/{flowId}/previews/{previewId}',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n previewId: options.previewId,\n },\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to delete preview');\n }\n // App returns 204 No Content on success; older surfaces may return JSON.\n // Always resolve to a record so every consumer (MCP, CLI command) gets a\n // serializable confirmation instead of a bare null.\n const confirmation = { deleted: true, previewId: options.previewId };\n if (response.status === 204) return confirmation;\n return (await response.json().catch(() => null)) ?? confirmation;\n}\n","import { requireProjectId } from '../../core/auth.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport { throwApiError } from '../../core/api-error.js';\n\n// === Programmatic API ===\n\nexport interface ListJourneysOptions {\n projectId?: string;\n flowId: string;\n /** Return only journeys for one trace, when given. */\n traceId?: string;\n /** Max journeys to return (most recent kept). */\n limit?: number;\n}\n\n/**\n * Read a flow's active Observe session journeys from the app. The flow's session\n * is resolved app-side (`observe_sessions.flow_id` is UNIQUE), so the caller\n * passes `flowId`, not a session id; a flow with no active session returns an\n * envelope with `sessionId: null` and empty journeys rather than an error.\n */\nexport async function listJourneys(options: ListJourneysOptions) {\n const id = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/journeys',\n {\n path: { projectId: id, flowId: options.flowId },\n query: { traceId: options.traceId || undefined, limit: options.limit },\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to read flow journeys');\n }\n return response.json();\n}\n","import { requireProjectId } from '../../core/auth.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport type { ResponseJson } from '../../core/api-request.js';\nimport { handleCliError, throwApiResponseError } from '../../core/api-error.js';\nimport { writeResult } from '../../core/output.js';\nimport { credentialSource } from '../../core/auth.js';\nimport type { GlobalOptions } from '../../types/global.js';\nimport type { components } from '../../types/api.gen.js';\nimport { getFlow } from '../flows/index.js';\n\ntype ObserveSessionResponse = ResponseJson<\n 'GET /api/projects/{projectId}/flows/{flowId}/observe-sessions/{sessionId}',\n 200\n>;\ntype CreateObserveSessionRequest =\n components['schemas']['CreateObserveSessionRequest'];\ntype ObserveLevel = components['schemas']['ObserveLevel'];\n\nconst OBSERVE_LEVELS: readonly ObserveLevel[] = ['off', 'standard', 'trace'];\n\nfunction isObserveLevel(value: string): value is ObserveLevel {\n return (OBSERVE_LEVELS as readonly string[]).includes(value);\n}\n\n// === Programmatic API ===\n\nexport interface StartObserveSessionOptions {\n projectId?: string;\n flowId: string;\n /** Flow settings name; the mint contract requires it. */\n settingsName: string;\n /** Replace an existing active session for the flow (`--replace`). */\n replace?: boolean;\n /** Observation detail level for the session. */\n level?: ObserveLevel;\n /** Origins the session's web activation grant may activate on. */\n origins?: string[];\n}\n\n/**\n * Mint an observe session via the app's authenticated boundary. Thin client:\n * the app validates topology, inserts the row, and provisions detached; the\n * mint response comes back immediately (usually `arming`, with the web and\n * server parts still null - GET assembles them once the session settles).\n */\nexport async function startObserveSession(\n options: StartObserveSessionOptions,\n): Promise<ObserveSessionResponse> {\n const pid = options.projectId ?? requireProjectId();\n const body: CreateObserveSessionRequest = {\n settingsName: options.settingsName,\n ...(options.replace ? { replace: true } : {}),\n ...(options.level !== undefined ? { level: options.level } : {}),\n // An empty list carries no origin the grant could bind to, so it is\n // omitted rather than sent as a bare [] the app would have to interpret.\n ...(options.origins?.length ? { origins: options.origins } : {}),\n };\n const response = await apiRequest(\n 'POST /api/projects/{projectId}/flows/{flowId}/observe-sessions',\n { path: { projectId: pid, flowId: options.flowId }, body },\n );\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({}));\n throwApiResponseError(\n response,\n errorBody,\n 'Failed to start observe session',\n );\n }\n return response.json();\n}\n\nexport interface GetObserveSessionOptions {\n projectId?: string;\n flowId: string;\n sessionId: string;\n}\n\nexport async function getObserveSession(\n options: GetObserveSessionOptions,\n): Promise<ObserveSessionResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/observe-sessions/{sessionId}',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n sessionId: options.sessionId,\n },\n },\n );\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({}));\n throwApiResponseError(response, errorBody, 'Failed to get observe session');\n }\n return response.json();\n}\n\nexport interface EndObserveSessionOptions {\n projectId?: string;\n flowId: string;\n sessionId: string;\n}\n\n/**\n * End a session through the app's authenticated boundary: the app tears down\n * the container, revokes credentials, deletes the web preview, and drops the\n * row. Ends the WHOLE session including every attached arm. Idempotent\n * app-side, and the 204 carries no body, so this resolves with nothing; a\n * session scoped to another flow or project is a 404, never a cross-tenant end.\n */\nexport async function endObserveSession(\n options: EndObserveSessionOptions,\n): Promise<void> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'DELETE /api/projects/{projectId}/flows/{flowId}/observe-sessions/{sessionId}',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n sessionId: options.sessionId,\n },\n },\n );\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({}));\n throwApiResponseError(response, errorBody, 'Failed to end observe session');\n }\n}\n\n/**\n * POST the session heartbeat, swallowing every failure. The heartbeat extends\n * the janitor's idle grace while the CLI user is actively setting up - it\n * never gates anything, so an unreachable app or a 5xx must not surface into\n * the poll loop. Session liveness never depends on this process.\n */\nexport async function heartbeatObserveSession(options: {\n projectId?: string;\n flowId: string;\n sessionId: string;\n}): Promise<void> {\n const pid = options.projectId ?? requireProjectId();\n try {\n await apiRequest(\n 'POST /api/projects/{projectId}/flows/{flowId}/observe-sessions/{sessionId}/heartbeat',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n sessionId: options.sessionId,\n },\n },\n );\n } catch {\n // Best-effort by design; the next tick tries again.\n }\n}\n\n/**\n * Poll GET until the session leaves `arming` (or the deadline passes). Always\n * runs at least one GET: the mint response never carries the web/server parts,\n * the app assembles them on GET once provisioning settles. Each tick also\n * heartbeats the session so the janitor's idle reaper cannot claim it while\n * the user is actively waiting; the heartbeat extends grace, never gates\n * (failures are swallowed). Session liveness is server-managed - abandoning\n * this poll never ends the session.\n */\nexport async function waitForObserveSessionSettled(options: {\n projectId?: string;\n flowId: string;\n sessionId: string;\n timeoutMs: number;\n pollIntervalMs: number;\n}): Promise<ObserveSessionResponse> {\n const deadline = Date.now() + options.timeoutMs;\n for (;;) {\n await heartbeatObserveSession(options);\n const session = await getObserveSession(options);\n const remainingMs = deadline - Date.now();\n if (session.status !== 'arming' || remainingMs <= 0) return session;\n // Cap the sleep to the remaining budget so the deadline is honored\n // precisely instead of overshooting by up to a full poll interval.\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(options.pollIntervalMs, remainingMs)),\n );\n }\n}\n\n// === Rendering ===\n\nexport interface FormatObserveSessionResult {\n /** Machine-readable stdout payload: the live server endpoint, when armed. */\n stdoutLast: string | null;\n stderr: string;\n}\n\n/**\n * Render a session from the fields the API contract carries. The web\n * activation URL is app-minted (grants are app-signed and origin-bound) and\n * already rides the `elbObserve` credential companion, so the CLI echoes it\n * verbatim and never builds one client-side. The server part is read from\n * `server.endpoint`/`server.env` (the transitional top-level `serverEndpoint`\n * mirror is not consumed).\n */\nexport function formatObserveSession(\n session: ObserveSessionResponse,\n): FormatObserveSessionResult {\n const arming = session.status === 'arming';\n const lines = [`Observe session ${session.id} (${session.status})`];\n if (session.errorMessage) lines.push(` Error: ${session.errorMessage}`);\n lines.push('');\n\n if (session.web) {\n lines.push(' Web');\n lines.push(` Bundle URL: ${session.web.bundleUrl}`);\n lines.push(` Credential: ${session.web.credential}`);\n if (session.web.activationUrl) {\n // App-minted, origin-bound; carries the elbObserve companion so the\n // observed tab picks up the session credential from the link itself.\n lines.push(` Activate: ${session.web.activationUrl}`);\n } else if (session.web.previewEnabled) {\n lines.push(\n ` Activate: no activation link minted yet${arming ? ' (still arming)' : ''}; open the Observe window in the app to mint one`,\n );\n } else {\n lines.push(\n ' Activate: not available: the deployed web bundle cannot verify activation grants (redeploy the web flow first)',\n );\n }\n } else {\n lines.push(` Web: no web part${arming ? ' yet (still arming)' : ''}`);\n }\n lines.push('');\n\n if (session.server) {\n lines.push(' Server');\n if (session.serverFlowName) {\n lines.push(` Flow: ${session.serverFlowName}`);\n }\n lines.push(\n session.server.endpoint\n ? ` Endpoint: ${session.server.endpoint}`\n : ` Endpoint: not live${arming ? ' yet (still arming)' : ''}`,\n );\n // The env trio is the session's own identity: export it into a server\n // runtime to feed this exact session.\n lines.push(' Env:');\n lines.push(\n ` WALKEROS_OBSERVER_URL=${session.server.env.WALKEROS_OBSERVER_URL}`,\n );\n lines.push(\n ` WALKEROS_DEPLOYMENT_ID=${session.server.env.WALKEROS_DEPLOYMENT_ID}`,\n );\n lines.push(\n ` WALKEROS_INGEST_TOKEN=${session.server.env.WALKEROS_INGEST_TOKEN}`,\n );\n } else {\n lines.push(\n ` Server: no server part${arming ? ' yet (still arming)' : ''}`,\n );\n }\n lines.push('');\n lines.push(` Expires: ${session.expiresAt}`);\n lines.push(` Records: ${session.recordsReceived}`);\n lines.push('');\n lines.push(\n ' The session lives server-side; closing this terminal does not end it.',\n );\n lines.push(\n ' Sessions idle out server-side when no tab or traffic keeps them alive.',\n );\n\n return {\n stdoutLast: session.server?.endpoint ?? null,\n stderr: lines.join('\\n'),\n };\n}\n\n// === CLI Command ===\n\nexport interface ObserveStartCommandOptions extends GlobalOptions {\n project?: string;\n /** Flow settings name; auto-resolved when the flow has exactly one. */\n flow?: string;\n /** Observation detail level: off, standard, or trace. */\n level?: string;\n /** Maps onto the contract's `replace` field. */\n replace?: boolean;\n /** Wait for the session to settle (default true; `--no-wait` disables). */\n wait?: boolean;\n /** Seconds to wait for the session to settle (default 300). */\n timeout?: string;\n json?: boolean;\n /** Test seam: poll cadence while waiting (default 3000ms). */\n pollIntervalMs?: number;\n}\n\nconst DEFAULT_WAIT_SECONDS = 300;\nconst DEFAULT_POLL_INTERVAL_MS = 3000;\n\n/**\n * The login/signup funnel for terminal-native users: a start with NO\n * resolvable credentials at all is a CTA naming the next command, never a\n * hard error wall (exit stays 0, no network call). A request that fails 401\n * despite a token (stale/invalid credentials, the CI case) is NOT this\n * funnel: it goes through `handleCliError` so scripts fail loudly instead of\n * reading success-with-empty-stdout.\n */\nfunction printLoginCta(): void {\n process.stderr.write(\n [\n 'Not logged in.',\n '',\n 'Starting an observe session needs a walkerOS account.',\n ' 1. Run: walkeros auth login (opens the browser; creates your account if you do not have one)',\n ' 2. Re-run: walkeros observe start <flowId>',\n '',\n ].join('\\n') + '\\n',\n );\n}\n\n/** Resolve the settings name when the flow has exactly one settings entry. */\nasync function resolveSingleSettingsName(options: {\n projectId: string;\n flowId: string;\n}): Promise<string> {\n const flow = await getFlow(options);\n const settings = flow.settings ?? [];\n const only = settings[0];\n if (!only) throw new Error('Flow has no settings.');\n if (settings.length > 1) {\n throw new Error(\n `This flow has multiple settings. Use --flow <name> to specify one.\\nAvailable: ${settings.map((entry) => entry.name).join(', ')}`,\n );\n }\n return only.name;\n}\n\nexport async function observeStartCommand(\n flowId: string,\n options: ObserveStartCommandOptions,\n): Promise<void> {\n try {\n // No credentials at all: funnel straight to login, no network round trip.\n if (credentialSource() === null) {\n printLoginCta();\n return;\n }\n\n // Validate flags BEFORE any network call: a session should not be minted\n // for an invalid flag (the previews validate-before-create precedent).\n let level: ObserveLevel | undefined;\n if (options.level !== undefined) {\n if (!isObserveLevel(options.level)) {\n throw new Error(\n `Invalid --level value: ${options.level} (expected ${OBSERVE_LEVELS.join(', ')})`,\n );\n }\n level = options.level;\n }\n\n // An invalid deadline would make the poll loop never expire. Full-string\n // numeric parse, not parseInt: `5m` must error loudly, not silently\n // truncate to 5 seconds.\n let timeoutSeconds = DEFAULT_WAIT_SECONDS;\n if (options.timeout !== undefined) {\n const rawTimeout = options.timeout.trim();\n timeoutSeconds = rawTimeout === '' ? Number.NaN : Number(rawTimeout);\n if (!Number.isFinite(timeoutSeconds) || timeoutSeconds < 0) {\n throw new Error(\n `Invalid --timeout value: ${options.timeout} (expected a non-negative number of seconds)`,\n );\n }\n }\n\n const projectId = options.project ?? requireProjectId();\n const settingsName =\n options.flow ?? (await resolveSingleSettingsName({ projectId, flowId }));\n\n let session = await startObserveSession({\n projectId,\n flowId,\n settingsName,\n ...(options.replace === true ? { replace: true } : {}),\n ...(level !== undefined ? { level } : {}),\n });\n\n // Always at least one GET when waiting: even a session born live gets its\n // web/server parts assembled by GET, never by the mint response.\n let timedOut = false;\n if (options.wait !== false) {\n session = await waitForObserveSessionSettled({\n projectId,\n flowId,\n sessionId: session.id,\n timeoutMs: timeoutSeconds * 1000,\n pollIntervalMs: options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,\n });\n // The poll loop only hands back an `arming` session when the deadline\n // passed. `--no-wait` rendering an arming mint stays a clean exit (the\n // user opted out of waiting); an expired wait must not read as success.\n timedOut = session.status === 'arming';\n }\n\n if (options.json) {\n await writeResult(JSON.stringify(session, null, 2), {});\n } else {\n const { stdoutLast, stderr } = formatObserveSession(session);\n process.stderr.write(stderr + '\\n');\n if (stdoutLast) process.stdout.write(stdoutLast + '\\n');\n }\n\n // exitCode over process.exit: the rendered output above still flushes and\n // the process ends non-zero for CI to branch on.\n if (timedOut) {\n process.stderr.write(\n `Timed out after ${timeoutSeconds}s: the session is still arming. It keeps arming server-side; check it in the app or re-run walkeros observe start.\\n`,\n );\n process.exitCode = 1;\n }\n if (session.status === 'failed') process.exitCode = 1;\n } catch (error) {\n handleCliError(error);\n }\n}\n","import { requireProjectId } from '../../core/auth.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport type { ApiRequestInit, ResponseJson } from '../../core/api-request.js';\nimport { throwApiResponseError } from '../../core/api-error.js';\nimport type { components } from '../../types/api.gen.js';\n\ntype VersionAnnotation = ResponseJson<\n 'PUT /api/projects/{projectId}/flows/{flowId}/releases/annotations',\n 200\n>;\ntype StepHistoryResponse = ResponseJson<\n 'GET /api/projects/{projectId}/flows/{flowId}/releases/step-history',\n 200\n>;\ntype ListHubThreadsResponse = ResponseJson<\n 'GET /api/projects/{projectId}/flows/{flowId}/threads',\n 200\n>;\ntype HubThreadResponse = ResponseJson<\n 'POST /api/projects/{projectId}/flows/{flowId}/threads',\n 201\n>;\ntype ListKnowledgeResponse = ResponseJson<\n 'GET /api/projects/{projectId}/knowledge',\n 200\n>;\n\n// === Release wire shapes, aliased onto the generated components ===\n\n/** The rationale summary a release index row carries when asked for one. */\nexport type ReleaseRationaleSummary =\n components['schemas']['ReleaseRationaleSummary'];\n\n/** The release index. Each row carries `rationale` when one was asked for. */\nexport type ReleaseIndexResponse = ResponseJson<\n 'GET /api/projects/{projectId}/flows/{flowId}/releases',\n 200\n>;\n\n/** The diff a release carries against its spine predecessor. */\nexport type ReleaseDiffResponse = components['schemas']['ReleaseDiff'];\n\n/** One release in full: rationale plus the diff the server computed. */\nexport type ReleaseDetailResponse = ResponseJson<\n 'GET /api/projects/{projectId}/flows/{flowId}/releases/{versionId}',\n 200\n>;\n\n// === Programmatic API ===\n\nasync function readJson<T>(response: Response, fallback: string): Promise<T> {\n if (!response.ok) {\n const body: unknown = await response.json().catch(() => ({}));\n throwApiResponseError(response, body, fallback);\n }\n return response.json();\n}\n\nexport interface ListReleasesOptions {\n projectId?: string;\n flowId: string;\n limit?: number;\n offset?: number;\n}\n\n/** The release index WITH its rationale summary. Requires the hub feature. */\nexport async function listReleases(\n options: ListReleasesOptions,\n): Promise<ReleaseIndexResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/releases',\n {\n path: { projectId: pid, flowId: options.flowId },\n query: {\n rationale: 'true',\n limit: options.limit,\n offset: options.offset,\n },\n },\n );\n return readJson(response, 'Failed to list releases');\n}\n\n/** How a release is addressed: by spine id, or by spine number. */\nexport type ReleaseRef = { versionId: string } | { versionNumber: number };\n\nexport interface GetReleaseOptions {\n projectId?: string;\n flowId: string;\n ref: ReleaseRef;\n}\n\n/**\n * One release in full: rationale plus the diff the SERVER computed against the\n * spine predecessor. The path segment is the id or the number; the app decides\n * which it was.\n */\nexport async function getRelease(\n options: GetReleaseOptions,\n): Promise<ReleaseDetailResponse> {\n const pid = options.projectId ?? requireProjectId();\n const segment =\n 'versionId' in options.ref\n ? options.ref.versionId\n : String(options.ref.versionNumber);\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/releases/{versionId}',\n { path: { projectId: pid, flowId: options.flowId, versionId: segment } },\n );\n return readJson(response, 'Failed to read release');\n}\n\nexport interface ListStepHistoryOptions {\n projectId?: string;\n flowId: string;\n step: string;\n flow?: string;\n limit?: number;\n}\n\nexport async function listStepHistory(\n options: ListStepHistoryOptions,\n): Promise<StepHistoryResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/releases/step-history',\n {\n path: { projectId: pid, flowId: options.flowId },\n query: { step: options.step, flow: options.flow, limit: options.limit },\n },\n );\n return readJson(response, 'Failed to read step history');\n}\n\nexport interface SetReleaseRationaleOptions {\n projectId?: string;\n flowId: string;\n versionId: string;\n /**\n * The rationale to store. `null` CLEARS the one already there: `humanText`\n * is the only field a client may write, and null is how the route says\n * \"remove it\". Without it there would be no way back from a rationale\n * written by mistake.\n */\n text: string | null;\n}\n\nexport async function setReleaseRationale(\n options: SetReleaseRationaleOptions,\n): Promise<VersionAnnotation> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'PUT /api/projects/{projectId}/flows/{flowId}/releases/annotations',\n {\n path: { projectId: pid, flowId: options.flowId },\n body: { versionId: options.versionId, humanText: options.text },\n },\n );\n return readJson(response, 'Failed to write release rationale');\n}\n\ntype ListThreadsQuery = NonNullable<\n ApiRequestInit<'GET /api/projects/{projectId}/flows/{flowId}/threads'>['query']\n>;\n/** What a thread anchors to, as the contract declares it. */\nexport type ThreadAnchorType = NonNullable<ListThreadsQuery['anchorType']>;\n/** A thread's status, as the contract declares it. */\nexport type ThreadStatus = NonNullable<ListThreadsQuery['status']>;\n\nexport interface ListThreadsOptions {\n projectId?: string;\n flowId: string;\n anchorType?: ThreadAnchorType;\n anchorKey?: string;\n status?: ThreadStatus;\n includeMessages: boolean;\n limit?: number;\n}\n\nexport async function listThreads(\n options: ListThreadsOptions,\n): Promise<ListHubThreadsResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/threads',\n {\n path: { projectId: pid, flowId: options.flowId },\n query: {\n anchorType: options.anchorType,\n anchorKey: options.anchorKey,\n status: options.status,\n includeMessages: options.includeMessages ? 'true' : 'false',\n limit: options.limit,\n },\n },\n );\n return readJson(response, 'Failed to list threads');\n}\n\nexport interface CreateThreadOptions {\n projectId?: string;\n flowId: string;\n anchorType: ThreadAnchorType;\n anchorKey: string;\n anchorLabel?: string;\n text: string;\n}\n\nexport async function createThread(\n options: CreateThreadOptions,\n): Promise<HubThreadResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'POST /api/projects/{projectId}/flows/{flowId}/threads',\n {\n path: { projectId: pid, flowId: options.flowId },\n body: {\n anchorType: options.anchorType,\n anchorKey: options.anchorKey,\n ...(options.anchorLabel !== undefined\n ? { anchorLabel: options.anchorLabel }\n : {}),\n text: options.text,\n },\n },\n );\n return readJson(response, 'Failed to open thread');\n}\n\nexport interface AddThreadMessageOptions {\n projectId?: string;\n flowId: string;\n threadId: string;\n text: string;\n}\n\nexport async function addThreadMessage(\n options: AddThreadMessageOptions,\n): Promise<HubThreadResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'POST /api/projects/{projectId}/flows/{flowId}/threads/{threadId}/messages',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n threadId: options.threadId,\n },\n body: { text: options.text },\n },\n );\n return readJson(response, 'Failed to add message');\n}\n\nexport interface ListKnowledgeOptions {\n projectId?: string;\n pageKey?: string;\n frameId?: string;\n markId?: string;\n includeMessages: boolean;\n limit?: number;\n}\n\nexport async function listKnowledge(\n options: ListKnowledgeOptions,\n): Promise<ListKnowledgeResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest('GET /api/projects/{projectId}/knowledge', {\n path: { projectId: pid },\n query: {\n pageKey: options.pageKey,\n frameId: options.frameId,\n markId: options.markId,\n includeMessages: options.includeMessages ? 'true' : 'false',\n limit: options.limit,\n },\n });\n return readJson(response, 'Failed to read knowledge');\n}\n","import { requireProjectId } from '../../core/auth.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport type { ResponseJson } from '../../core/api-request.js';\nimport { throwApiResponseError } from '../../core/api-error.js';\nimport type { components } from '../../types/api.gen.js';\n\ntype FrameResponse = ResponseJson<\n 'GET /api/projects/{projectId}/flows/{flowId}/frames/{frameId}',\n 200\n>;\n// The list operation answers one of two shapes, chosen by `pageKey`.\ntype FrameListResponse = components['schemas']['FrameListResponse'];\ntype FrameLeanListResponse = components['schemas']['FrameLeanListResponse'];\n\nasync function readJson<T>(response: Response, fallback: string): Promise<T> {\n if (!response.ok) {\n const body: unknown = await response.json().catch(() => ({}));\n throwApiResponseError(response, body, fallback);\n }\n return response.json();\n}\n\n// Frames belong to a flow: every read names the flow they live in.\n\nexport interface ListFramesOptions {\n projectId?: string;\n flowId: string;\n}\n\n/** Every live frame of the flow, without marks. Requires the frames feature. */\nexport async function listFrames(\n options: ListFramesOptions,\n): Promise<FrameLeanListResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/frames',\n { path: { projectId: pid, flowId: options.flowId } },\n );\n return readJson(response, 'Failed to list frames');\n}\n\nexport interface ListPageFramesOptions {\n projectId?: string;\n flowId: string;\n pageKey: string;\n}\n\n/** The frames of the flow on one page at any depth, with their marks. */\nexport async function listPageFrames(\n options: ListPageFramesOptions,\n): Promise<FrameListResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/frames',\n {\n path: { projectId: pid, flowId: options.flowId },\n query: { pageKey: options.pageKey },\n },\n );\n return readJson(response, 'Failed to list page frames');\n}\n\nexport interface GetFrameOptions {\n projectId?: string;\n flowId: string;\n frameId: string;\n}\n\nexport async function getFrame(\n options: GetFrameOptions,\n): Promise<FrameResponse> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/frames/{frameId}',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n frameId: options.frameId,\n },\n },\n );\n return readJson(response, 'Failed to read frame');\n}\n","import { requireProjectId } from '../../core/auth.js';\nimport { apiRequest } from '../../core/api-request.js';\nimport type { ResponseJson } from '../../core/api-request.js';\nimport { throwApiError } from '../../core/api-error.js';\n\n// === Programmatic API ===\n\nexport interface ListSecretsOptions {\n projectId?: string;\n flowId: string;\n}\n\nexport async function listSecrets(\n options: ListSecretsOptions,\n): Promise<\n ResponseJson<'GET /api/projects/{projectId}/flows/{flowId}/secrets', 200>\n> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'GET /api/projects/{projectId}/flows/{flowId}/secrets',\n { path: { projectId: pid, flowId: options.flowId } },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to list secrets');\n }\n return response.json();\n}\n\nexport interface CreateSecretOptions {\n projectId?: string;\n flowId: string;\n name: string;\n value: string;\n}\n\nexport async function createSecret(\n options: CreateSecretOptions,\n): Promise<\n ResponseJson<'POST /api/projects/{projectId}/flows/{flowId}/secrets', 201>\n> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'POST /api/projects/{projectId}/flows/{flowId}/secrets',\n {\n path: { projectId: pid, flowId: options.flowId },\n body: { name: options.name, value: options.value },\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to create secret');\n }\n return response.json();\n}\n\nexport interface UpdateSecretOptions {\n projectId?: string;\n flowId: string;\n secretId: string;\n value: string;\n}\n\nexport async function updateSecret(\n options: UpdateSecretOptions,\n): Promise<\n ResponseJson<\n 'PUT /api/projects/{projectId}/flows/{flowId}/secrets/{secretId}',\n 200\n >\n> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'PUT /api/projects/{projectId}/flows/{flowId}/secrets/{secretId}',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n secretId: options.secretId,\n },\n body: { value: options.value },\n },\n );\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to update secret');\n }\n return response.json();\n}\n\nexport interface DeleteSecretOptions {\n projectId?: string;\n flowId: string;\n secretId: string;\n}\n\nexport async function deleteSecret(\n options: DeleteSecretOptions,\n): Promise<{ success: true }> {\n const pid = options.projectId ?? requireProjectId();\n const response = await apiRequest(\n 'DELETE /api/projects/{projectId}/flows/{flowId}/secrets/{secretId}',\n {\n path: {\n projectId: pid,\n flowId: options.flowId,\n secretId: options.secretId,\n },\n },\n );\n // App returns 204 No Content (and 204 even when the secret is missing).\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throwApiError(body, 'Failed to delete secret');\n }\n return { success: true };\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 { operationUrl } from '../core/api-request.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 a single\n * `walkeros auth login` (which writes `appUrl` to the user config) wires\n * telemetry alongside auth. Order: env (`WALKEROS_APP_URL`) > user config\n * (`~/.config/walkeros/config.json:appUrl`) > undefined (telemetry no-ops).\n *\n * Hard-cut: `TELEMETRY_ENDPOINT` is no longer recognized.\n */\nexport function resolveTelemetryEndpoint(): string | undefined {\n const appUrl = resolveAppUrl();\n if (!appUrl) return undefined;\n return operationUrl('POST /api/telemetry', {\n baseUrl: appUrl.replace(/\\/$/, ''),\n });\n}\n\nasync function withTimeout<T>(p: Promise<T>, ms: number): Promise<T> {\n return Promise.race<T>([\n p,\n new Promise<T>((_, reject) => {\n const t = setTimeout(() => reject(new Error('telemetry timeout')), ms);\n t.unref();\n }),\n ]);\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Environment } from './environment.js';\n\nexport interface InitConfigInput {\n installationId: string;\n session?: string;\n environment: Environment;\n endpoint: string;\n}\n\n/**\n * Telemetry destination reference using the flow-style package shorthand.\n *\n * @remarks\n * Intentionally narrower than `Destination.Init<T>` from `@walkeros/core`.\n * The telemetry emitter is responsible for resolving the `package` reference\n * into the actual destination `code` before handing the config to\n * `startFlow()`. Keeping the shorthand in the builder keeps this file free\n * of a runtime dependency on `@walkeros/server-destination-api`.\n */\nexport interface TelemetryDestinationReference {\n package: string;\n config: {\n url: string;\n };\n}\n\n/**\n * Telemetry-specific init config shape.\n *\n * @remarks\n * Mirrors the subset of `Collector.InitConfig` the telemetry emitter uses\n * (`consent`, `user`, `destinations`). The `destinations` entries use the\n * package-shorthand form rather than `Destination.InitDestinations` so this\n * module stays free of the server-destination-api dependency. The emitter\n * will translate the shorthand into a real `Destination.Init` before calling\n * `startFlow()`.\n */\nexport interface TelemetryInitConfig {\n consent: WalkerOS.Consent;\n user: WalkerOS.User;\n destinations: {\n api: TelemetryDestinationReference;\n };\n}\n\n/**\n * Build the init config used by the telemetry emitter. The collector merges\n * `user` and `consent` into every emitted event, so per-send code only needs\n * to pass `name`, `data`, `timing`, and `source`.\n *\n * `WalkerOS.User` extends `WalkerOS.Properties`, so carrying a custom `node`\n * field (e.g. `\"v22.0.0\"`) is structurally valid - `string` is a `Property`.\n */\nexport function buildInitConfig(input: InitConfigInput): TelemetryInitConfig {\n const user: WalkerOS.User = {\n device: input.installationId,\n os: input.environment.os,\n osVersion: input.environment.osVersion,\n language: input.environment.language,\n timezone: input.environment.timezone,\n node: input.environment.node,\n };\n if (input.session) user.session = input.session;\n\n return {\n consent: { telemetry: true },\n user,\n destinations: {\n api: {\n package: '@walkeros/server-destination-api',\n config: { url: input.endpoint },\n },\n },\n };\n}\n","import * as os from 'os';\n\nexport interface Environment {\n os: string;\n osVersion: string;\n node: string;\n language: string;\n timezone: string;\n}\n\nexport function getEnvironment(): Environment {\n const locale = Intl.DateTimeFormat().resolvedOptions();\n return {\n os: process.platform,\n osVersion: os.release(),\n node: process.version,\n language: locale.locale,\n timezone: locale.timeZone,\n };\n}\n","import { readConfig } from '../lib/config-file.js';\n\nfunction envFlag(name: string): boolean {\n const v = process.env[name];\n return v === '1' || v === 'true';\n}\n\n/**\n * Is telemetry actively enabled for this process?\n *\n * Returns `true` only when the user has given explicit consent via\n * `walkeros telemetry enable` (recorded as `telemetryEnabled: true` in the\n * config file). Every other state (no config, config without the field, or\n * `telemetryEnabled: false`) returns `false`.\n *\n * `DO_NOT_TRACK` and `WALKEROS_TELEMETRY_DISABLED` are honored as forced-off\n * overrides for backward compatibility and for users who want a belt-and-\n * braces guarantee even after opting in.\n */\nexport function isTelemetryEnabled(): boolean {\n if (envFlag('DO_NOT_TRACK')) return false;\n if (envFlag('WALKEROS_TELEMETRY_DISABLED')) return false;\n return readConfig()?.telemetryEnabled === true;\n}\n\n/** Whether telemetry debug logging is enabled via `WALKEROS_TELEMETRY_DEBUG`. */\nexport function isDebugMode(): boolean {\n return envFlag('WALKEROS_TELEMETRY_DEBUG');\n}\n","import { readConfig } from '../lib/config-file.js';\n\n/**\n * One-time informational notice inviting the user to opt in to anonymous\n * telemetry. Non-blocking. Writes nothing to disk. Suppressed on subsequent\n * runs by the presence of a config file (created by login, project\n * defaults, feedback preferences, or an explicit `walkeros telemetry\n * enable`). If the user never creates a config for any other reason, the\n * notice keeps appearing. That is acceptable: the notice is a one-line\n * informational message, not a prompt.\n */\nexport function maybePrintFirstRunNotice(): void {\n if (readConfig()) return;\n const msg =\n '\\n' +\n 'walkerOS can collect anonymous usage telemetry to help us improve the tools.\\n' +\n \"It's off by default. Nothing is sent until you run `walkeros telemetry enable`.\\n\" +\n 'What we would send: https://github.com/elbwalker/walkerOS/blob/main/packages/cli/src/telemetry/flow.json\\n\\n';\n process.stderr.write(msg);\n}\n","import ciInfo from 'ci-info';\n\nexport interface CiInfo {\n ci: boolean;\n ci_name?: string;\n}\n\ninterface CiInput {\n isCI: boolean;\n name?: string | null;\n}\n\n/**\n * CI environment detection. Accepts an injected input for testability;\n * production callers pass no argument and `ci-info` is read directly.\n */\nexport function getCiInfo(input?: CiInput): CiInfo {\n const isCI = input?.isCI ?? ciInfo.isCI;\n // Use property presence (not nullishness) so callers can pass `name: null`\n // explicitly to mean \"vendor unknown\" without falling through to ciInfo.name.\n const name = input && 'name' in input ? input.name : (ciInfo.name ?? null);\n if (!isCI) return { ci: false };\n return name ? { ci: true, ci_name: name } : { ci: true };\n}\n"],"mappings":"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","names":["path","fs","path","fs","path","mkdirSync","unlinkSync","resolve","unlinkSync","mkdirSync","path","path","path","send","path","path","fs","path","path","fs","stat","fs","fs","fs","path","fs","path","path","fs","fs","path","schemas","path","path","fs","createHash","path","fs","isRecord","stat","path","bundle","path","fs","bundle","esbuild","path","fileURLToPath","fs","packageNameToVariable","SECRET_MARKER_PREFIX","isObject","path","fs","semver","input","path","fs","errorCode","fs","path","path","delay","resolve","fs","deps","peerDeps","peerMeta","nestLoser","alreadyNested","semver","path","fs","fs","path","semver","isObject","getHashServer","fs","path","getHashServer","getHashServer","path","fs","fs","path","readFileSync","dirname","join","path","fs","getHashServer","stats","sizeKB","esbuild","fileURLToPath","build","packageNameToVariable","isObject","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","schemas","isObject","isFlowJson","path","getFlowSettings","getErrorMessage","resolveFlow","fs","path","ENV_MARKER_PREFIX","getErrorMessage","isObject","SECRET_MARKER_PREFIX","isObject","ENV_MARKER_PREFIX","SECRET_MARKER_PREFIX","bundle","readJson","schemas","context","getErrorMessage","validate","validateFlowConfig","schemas","context","isObject","path","validateFlowConfig","result","bundle","isFlowJson","resolveFlow","ENV_MARKER_PREFIX","checkWindowCollector","isObject","schemas","path","context","isFlowJson","resolveFlow","isFlowJson","isObject","validateEvent","chalk","z","z","delay","resolve","handleResult","resolve","getPlatform","isObject","handleResult","isObject","result","getPlatform","resolve","randomUUID","randomUUID","validateFlowStructure","path","fileURLToPath","fs","esbuild","fileURLToPath","fs","crypto","path","fs","FlowReferenceError","z","z","z","resolve","delay","FlowReferenceError","fs","path","result","crypto","createHash","semver","isRecord","createHash","semver","context","readJson","readJson","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/lib/config-file.ts","../src/lib/config-lock.ts","../src/core/oauth-client.ts","../src/lib/secure-url.ts","../src/core/app-fetch.ts","../src/core/client-context.ts","../src/core/app-paths.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/commands/validate/validators/mapping.ts","../src/commands/validate/validators/entry.ts","../src/commands/validate/types.ts","../src/commands/login/index.ts","../src/commands/logout/index.ts","../src/commands/auth/index.ts","../src/core/api-error.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","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n unlinkSync,\n existsSync,\n chmodSync,\n renameSync,\n} from 'fs';\nimport { randomBytes } from 'crypto';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport interface WalkerOSConfig {\n /**\n * Static bearer written by the pre-OAuth CLI. Honored until it expires, and\n * the first use in a process prints a one-line notice naming\n * `walkeros auth login`, which replaces it with a refreshable session.\n */\n token?: string;\n /** Short-lived bearer from the device authorization grant. */\n accessToken?: string;\n /** ISO 8601 instant at which `accessToken` stops being accepted. */\n accessTokenExpiresAt?: string;\n /** Single-use credential that buys a new `accessToken`. */\n refreshToken?: string;\n email?: string;\n appUrl?: string;\n anonymousFeedback?: boolean;\n defaultProjectId?: string;\n /**\n * UUID v4, generated and persisted only when the user explicitly opts in\n * to telemetry (`walkeros telemetry enable`). Absent in the default state.\n */\n installationId?: string;\n /**\n * Explicit consent toggle for telemetry. Tri-state:\n * - `undefined`: no decision yet, default (nothing is collected).\n * - `true`: user opted in via `walkeros telemetry enable`.\n * - `false`: user opted out via `walkeros telemetry disable`.\n */\n telemetryEnabled?: boolean;\n}\n\n/**\n * Get the config directory path, respecting XDG_CONFIG_HOME\n */\nexport function getConfigDir(): string {\n const xdgConfig = process.env.XDG_CONFIG_HOME;\n const base = xdgConfig || join(homedir(), '.config');\n return join(base, 'walkeros');\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(): string {\n return join(getConfigDir(), 'config.json');\n}\n\n/**\n * Read the stored config, or null if not found\n */\nexport function readConfig(): WalkerOSConfig | null {\n const configPath = getConfigPath();\n try {\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content) as WalkerOSConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * 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 person as logged out, so the content is written to a temp file and\n * renamed, which is atomic within a directory.\n *\n * The temp path is unique per write. Only the token refresh holds the config\n * lock, so two ordinary writers (a login and a `telemetry enable`, say) can be\n * in here at once: on one shared name they would write over each other's temp\n * file and rename it twice, and the slower one would fail outright when the\n * faster renamed the file out from 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 tokens would otherwise\n * drop `defaultProjectId`, `installationId`, `telemetryEnabled` and\n * `anonymousFeedback` every time somebody logs in.\n *\n * A key passed explicitly as `undefined` is removed from the written file,\n * which is how login drops the legacy static token it replaces.\n */\nexport function writeConfig(config: WalkerOSConfig): void {\n replaceConfigFile({ ...(readConfig() ?? {}), ...config });\n}\n\n/**\n * Remove every credential field, keeping the rest of the config.\n *\n * Used when the stored session is known to be dead, so the next command can\n * say \"run `walkeros auth login`\" instead of failing against the API.\n */\nexport function clearAuthFields(): void {\n const config = readConfig();\n if (!config) return;\n const {\n token: _token,\n accessToken: _accessToken,\n accessTokenExpiresAt: _accessTokenExpiresAt,\n refreshToken: _refreshToken,\n email: _email,\n ...rest\n } = config;\n replaceConfigFile(rest);\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 * Delete the config file (logout)\n */\nexport function deleteConfig(): boolean {\n const configPath = getConfigPath();\n if (existsSync(configPath)) {\n unlinkSync(configPath);\n return true;\n }\n return false;\n}\n\n/**\n * Whether a config holds a login: a legacy static `token` or an OAuth\n * `accessToken`. The one rule for a stored credential, used by\n * `credentialSource()`.\n */\nexport function hasStoredCredential(config: WalkerOSConfig | null): boolean {\n return Boolean(config?.token || config?.accessToken);\n}\n\n/**\n * Resolve the API token using priority order:\n * 1. WALKEROS_TOKEN env var\n * 2. Config file (~/.config/walkeros/config.json)\n * 3. null (not authenticated)\n */\nexport function resolveToken(): {\n token: string;\n source: 'env' | 'config';\n} | null {\n const envToken = process.env.WALKEROS_TOKEN;\n if (envToken) return { token: envToken, source: 'env' };\n\n const config = readConfig();\n if (config?.token) return { token: config.token, source: 'config' };\n\n return null;\n}\n\n/**\n * Resolve the app URL.\n * WALKEROS_APP_URL env var > config file > default.\n */\nexport function resolveAppUrl(): string {\n const envUrl = process.env.WALKEROS_APP_URL;\n if (envUrl) return envUrl;\n\n const config = readConfig();\n if (config?.appUrl) return config.appUrl;\n\n return 'https://app.walkeros.io';\n}\n","import { closeSync, mkdirSync, openSync, statSync, unlinkSync } from 'fs';\nimport { getConfigDir, getConfigPath } from './config-file.js';\n\n/**\n * A lock older than this is treated as abandoned. It bounds the damage a\n * process killed mid-refresh can do: without it, one crash leaves every later\n * command waiting for a holder that will never return.\n */\nconst STALE_MS = 15_000;\n\n/** Gap between acquire attempts. */\nconst RETRY_MS = 100;\n\n/** How long to keep trying before giving up on a lock somebody else holds. */\nconst TIMEOUT_MS = 10_000;\n\n/** Path of the lock guarding the config file. */\nexport function getConfigLockPath(): string {\n return `${getConfigPath()}.lock`;\n}\n\nfunction hasCode(value: unknown): value is { code: unknown } {\n return typeof value === 'object' && value !== null && 'code' in value;\n}\n\n/**\n * Matched on the `code` property rather than on `instanceof Error`, which is\n * unreliable across realm boundaries (a test runner's module sandbox is one).\n */\nfunction isAlreadyLocked(error: unknown): boolean {\n return hasCode(error) && error.code === 'EEXIST';\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Remove the lock when its holder has clearly gone away. Returns whether the\n * lock was removed, so the caller can retry immediately rather than sleeping.\n */\nfunction breakIfStale(lockPath: string): boolean {\n try {\n const age = Date.now() - statSync(lockPath).mtimeMs;\n if (age < STALE_MS) return false;\n unlinkSync(lockPath);\n return true;\n } catch {\n // Gone between the stat and the unlink, or never there: either way the\n // next acquire attempt is the answer.\n return false;\n }\n}\n\n/**\n * Run `fn` while holding an exclusive lock on the config file.\n *\n * Several walkerOS processes can share one config (a shell, an editor's MCP\n * server, a watch loop). Without a lock, two of them noticing an expired\n * access token at the same moment would both spend the single-use refresh\n * token, and the loser's rotation would invalidate the winner's session.\n *\n * The lock is a file created with `O_EXCL`, which is atomic on every platform\n * the CLI runs on and needs no daemon.\n */\nexport async function withConfigLock<T>(fn: () => Promise<T>): Promise<T> {\n const lockPath = getConfigLockPath();\n mkdirSync(getConfigDir(), { recursive: true, mode: 0o700 });\n\n const deadline = Date.now() + TIMEOUT_MS;\n\n for (;;) {\n let handle: number;\n try {\n handle = openSync(lockPath, 'wx', 0o600);\n } catch (error) {\n if (!isAlreadyLocked(error)) throw error;\n if (breakIfStale(lockPath)) continue;\n if (Date.now() >= deadline) {\n throw new Error(\n `Timed out waiting for the walkerOS config lock at ${lockPath}. ` +\n 'Remove the file if no other walkeros process is running.',\n );\n }\n await delay(RETRY_MS);\n continue;\n }\n\n closeSync(handle);\n try {\n return await fn();\n } finally {\n try {\n unlinkSync(lockPath);\n } catch {\n // Another process broke the lock as stale while we held it. Nothing to\n // release, and failing here would mask the callback's own result.\n }\n }\n }\n}\n","import { z } from 'zod';\nimport { requireSecureUrl } from '../lib/secure-url.js';\nimport { appErrorMessage, appFetch } from './app-fetch.js';\nimport { APP_PATHS } from './app-paths.js';\n\n/**\n * OAuth 2.1 client for the walkerOS authorization server.\n *\n * Pure HTTP with `fetch` injected: nothing here reads the config file or the\n * environment, so the flows can be exercised without a machine state.\n */\n\n/** Public client id seeded for the CLI. It has no secret. */\nexport const CLI_CLIENT_ID = 'walkeros-cli';\n\n/**\n * `offline_access` is what buys the refresh token; without it every command\n * would send the person back to the browser once the access token expired.\n */\nexport const CLI_SCOPE = 'read write offline_access';\n\nconst DEVICE_CODE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code';\n\n/**\n * Ceiling on a refresh request. It is deliberately below the 15 s after which\n * `withConfigLock` treats a lock as abandoned: a refresh runs while holding\n * that lock, so a request allowed to hang longer would have its own lock\n * broken out from under it and race the process that took it next.\n */\nconst REFRESH_TIMEOUT_MS = 10_000;\n\n/**\n * Ceiling on a revocation. Nothing waits on its answer, so this only bounds\n * how long a logout stands still before clearing the machine.\n */\nconst REVOKE_TIMEOUT_MS = 5_000;\n\n/**\n * Ceiling on the request that opens a device authorization. Nothing has been\n * issued yet, so this only bounds how long `walkeros auth login` stands still\n * before it can show a code, but a server that accepts the connection and then\n * says nothing would otherwise hold it for the HTTP client's own default.\n */\nconst DEVICE_AUTHORIZATION_TIMEOUT_MS = 10_000;\n\nconst DeviceAuthorizationSchema = z.object({\n device_code: z.string().min(1),\n user_code: z.string().min(1),\n verification_uri: z.string().min(1),\n verification_uri_complete: z.string().min(1).optional(),\n expires_in: z.number().int().nonnegative(),\n interval: z.number().int().nonnegative(),\n});\n\nconst TokenSchema = z.object({\n access_token: z.string().min(1),\n expires_in: z.number().int().nonnegative(),\n refresh_token: z.string().min(1).optional(),\n});\n\nconst ErrorSchema = z.object({\n error: z.string().min(1),\n error_description: z.string().optional(),\n});\n\nexport interface DeviceAuthorization {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n interval: number;\n}\n\nexport interface TokenSet {\n accessToken: string;\n accessTokenExpiresAt: string;\n refreshToken: string | null;\n}\n\nexport type DevicePoll =\n | { status: 'ok'; tokens: TokenSet }\n | { status: 'pending' }\n | { status: 'slow_down' }\n | { status: 'denied' }\n | { status: 'expired' }\n | { status: 'error'; error: string };\n\n/** Parse a response body as JSON, or null when it is not JSON at all. */\nasync function readJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return null;\n }\n}\n\n/**\n * The RFC 6749 section 5.2 error code carried by a failed response, or null\n * when the body is not an OAuth error (a proxy's HTML, say).\n */\nfunction errorCode(body: unknown): string | null {\n const parsed = ErrorSchema.safeParse(body);\n return parsed.success ? parsed.data.error : null;\n}\n\n/**\n * The OAuth error first, then the app's own error envelope (a version floor\n * answers with one), then the bare status.\n */\nfunction describe(response: Response, body: unknown): string {\n const parsed = ErrorSchema.safeParse(body);\n if (parsed.success) {\n return parsed.data.error_description\n ? `${parsed.data.error}: ${parsed.data.error_description}`\n : parsed.data.error;\n }\n return appErrorMessage(body) ?? `HTTP ${response.status}`;\n}\n\n/**\n * Every request in this module either carries a credential or mints one, so\n * the two rules that protect one are applied here rather than per call:\n * plain http is refused off the local machine, and a redirect is an error\n * rather than a hop, because following one would hand the token (or the code\n * that buys it) to whichever host the answer named.\n */\nfunction postForm(\n appUrl: string,\n path: string,\n form: Record<string, string>,\n fetchFn: typeof fetch,\n signal?: AbortSignal,\n): Promise<Response> {\n return appFetch(path, {\n method: 'POST',\n baseUrl: requireSecureUrl(appUrl),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams(form).toString(),\n redirect: 'error',\n fetch: fetchFn,\n signal,\n });\n}\n\nfunction toTokenSet(body: unknown): TokenSet {\n const parsed = TokenSchema.safeParse(body);\n if (!parsed.success) throw new Error('Malformed token response');\n\n return {\n accessToken: parsed.data.access_token,\n accessTokenExpiresAt: new Date(\n Date.now() + parsed.data.expires_in * 1000,\n ).toISOString(),\n refreshToken: parsed.data.refresh_token ?? null,\n };\n}\n\n/**\n * RFC 8628 section 3.1. Ask for a device code and the URL to send the person\n * to. Unauthenticated: the code is worth nothing until somebody approves it.\n */\nexport async function startDeviceAuthorization(\n appUrl: string,\n fetchFn: typeof fetch = globalThis.fetch,\n): Promise<DeviceAuthorization> {\n const response = await postForm(\n appUrl,\n APP_PATHS.deviceAuthorization,\n {\n client_id: CLI_CLIENT_ID,\n scope: CLI_SCOPE,\n // RFC 8707. The token comes back bound to the API, so a leaked CLI token\n // cannot be replayed against the MCP resource.\n resource: `${appUrl}/api`,\n },\n fetchFn,\n AbortSignal.timeout(DEVICE_AUTHORIZATION_TIMEOUT_MS),\n );\n\n const body = await readJson(response);\n if (!response.ok) throw new Error(describe(response, body));\n\n const parsed = DeviceAuthorizationSchema.safeParse(body);\n if (!parsed.success)\n throw new Error('Malformed device authorization response');\n\n return {\n deviceCode: parsed.data.device_code,\n userCode: parsed.data.user_code,\n verificationUri: parsed.data.verification_uri,\n verificationUriComplete:\n parsed.data.verification_uri_complete ?? parsed.data.verification_uri,\n expiresIn: parsed.data.expires_in,\n interval: parsed.data.interval,\n };\n}\n\n/**\n * One poll of RFC 8628 section 3.4. Every outcome is a returned status rather\n * than a throw, because four of them are ordinary steps of a flow that is\n * still running.\n *\n * `signal` is how a caller keeps its own deadline: without one, a server that\n * accepts the connection and then says nothing holds this call for the HTTP\n * client's default, which is minutes.\n */\nexport async function pollDeviceToken(\n appUrl: string,\n deviceCode: string,\n fetchFn: typeof fetch = globalThis.fetch,\n signal?: AbortSignal,\n): Promise<DevicePoll> {\n let response: Response;\n try {\n response = await postForm(\n appUrl,\n APP_PATHS.token,\n {\n grant_type: DEVICE_CODE_GRANT,\n device_code: deviceCode,\n client_id: CLI_CLIENT_ID,\n },\n fetchFn,\n signal,\n );\n } catch (error) {\n // Only an abort of the caller's own signal is an outcome rather than a\n // fault: the authorization is untouched, so it is still pending and the\n // caller's loop decides whether there is room for another attempt. Any\n // other transport failure is a real error and stays one.\n if (signal?.aborted) return { status: 'pending' };\n throw error;\n }\n\n const body = await readJson(response);\n\n if (response.ok) {\n try {\n return { status: 'ok', tokens: toTokenSet(body) };\n } catch (error) {\n return {\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n switch (errorCode(body)) {\n case 'authorization_pending':\n return { status: 'pending' };\n case 'slow_down':\n return { status: 'slow_down' };\n case 'access_denied':\n return { status: 'denied' };\n case 'expired_token':\n return { status: 'expired' };\n default:\n return { status: 'error', error: describe(response, body) };\n }\n}\n\n/**\n * Spend a refresh token for a new pair.\n *\n * `null` means the server rejected the token itself and only a fresh login\n * can recover. Every other failure throws, so a transient fault stays\n * distinguishable from a dead session and never costs the person their login.\n */\nexport async function refreshTokens(\n appUrl: string,\n refreshToken: string,\n fetchFn: typeof fetch = globalThis.fetch,\n): Promise<TokenSet | null> {\n const response = await postForm(\n appUrl,\n APP_PATHS.token,\n {\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: CLI_CLIENT_ID,\n },\n fetchFn,\n AbortSignal.timeout(REFRESH_TIMEOUT_MS),\n );\n\n const body = await readJson(response);\n\n if (!response.ok) {\n if (errorCode(body) === 'invalid_grant') return null;\n throw new Error(describe(response, body));\n }\n\n return toTokenSet(body);\n}\n\n/**\n * RFC 7009. Best effort by design: logout must clear the local config whether\n * or not the server could be reached, and the server answers a revocation it\n * cannot act on with 200 anyway.\n */\nexport async function revokeRefreshToken(\n appUrl: string,\n refreshToken: string,\n fetchFn: typeof fetch = globalThis.fetch,\n): Promise<void> {\n try {\n await postForm(\n appUrl,\n APP_PATHS.revoke,\n {\n token: refreshToken,\n token_type_hint: 'refresh_token',\n client_id: CLI_CLIENT_ID,\n },\n fetchFn,\n AbortSignal.timeout(REVOKE_TIMEOUT_MS),\n );\n } catch {\n // Offline, or the server is down. The local credential is still cleared.\n }\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","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","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: the OAuth device flow, identity,\n * health, telemetry and the public API document. The app keeps every one in\n * its public API set, so its change rule protects them. The only file in the\n * CLI that names an app path; `walkeros api` takes its path from the person.\n */\nexport const APP_PATHS = {\n deviceAuthorization: '/api/oauth/device_authorization',\n token: '/api/oauth/token',\n revoke: '/api/oauth/revoke',\n whoami: '/api/auth/whoami',\n health: '/api/health',\n telemetry: '/api/telemetry',\n openapi: '/api/openapi.json',\n} as const;\n","import {\n readConfig,\n writeConfig,\n clearAuthFields,\n resolveAppUrl,\n hasStoredCredential,\n type WalkerOSConfig,\n} from '../lib/config-file.js';\nimport { withConfigLock } from '../lib/config-lock.js';\nimport { refreshTokens } from './oauth-client.js';\n\n/**\n * Refresh this far ahead of the stated expiry. It absorbs clock skew between\n * the machine and the server plus the flight time of the request the token is\n * about to be spent on, so a token is never handed out with seconds to live.\n */\nconst REFRESH_SKEW_MS = 60_000;\n\nlet legacyNoticeShown = false;\n\n/** Test-only: reset the once-per-process guard on the legacy token notice. */\nexport function resetLegacyTokenNotice(): void {\n legacyNoticeShown = false;\n}\n\n/**\n * Announce the legacy static token once, on first use.\n *\n * Once per process, not once per call: a single command can resolve a token\n * many times, and a notice printed on each would be noise the person learns\n * to scroll past. It is printed at all because a migrated token can carry a\n * year of expiry, so nothing else would ever prompt the switch.\n */\nfunction noticeLegacyToken(): void {\n if (legacyNoticeShown) return;\n legacyNoticeShown = true;\n process.stderr.write(\n 'walkerOS: using a static token from your config. ' +\n 'Run `walkeros auth login` to switch to a session that refreshes automatically.\\n',\n );\n}\n\n/** Whether the stored access token has enough life left to be worth using. */\nfunction isFresh(config: WalkerOSConfig, nowMs: number): boolean {\n if (!config.accessToken || !config.accessTokenExpiresAt) return false;\n const expiresAt = Date.parse(config.accessTokenExpiresAt);\n if (Number.isNaN(expiresAt)) return false;\n return expiresAt - nowMs > REFRESH_SKEW_MS;\n}\n\n/**\n * Resolve a bearer for an API call, refreshing the stored session when needed.\n *\n * Priority: `WALKEROS_TOKEN`, then a legacy static token, then the OAuth\n * session. Returns null when nothing can be resolved, which callers render as\n * \"run `walkeros auth login`\".\n *\n * Throws when a refresh was needed but could not be carried out, which is a\n * different problem from having no session and must not be reported as one.\n */\nexport async function resolveAccessToken(opts?: {\n fetch?: typeof fetch;\n now?: () => number;\n}): Promise<string | null> {\n const envToken = process.env.WALKEROS_TOKEN;\n if (envToken) return envToken;\n\n const now = opts?.now ?? Date.now;\n const config = readConfig();\n if (!config) return null;\n\n if (config.token) {\n noticeLegacyToken();\n return config.token;\n }\n\n if (!config.refreshToken) {\n return isFresh(config, now()) ? (config.accessToken ?? null) : null;\n }\n\n if (isFresh(config, now())) return config.accessToken ?? null;\n\n return withConfigLock(async () => {\n // Re-read under the lock. Another walkerOS process may have refreshed\n // while we queued, and spending our copy of a single-use refresh token\n // would invalidate the session it just established.\n const current = readConfig();\n if (!current?.refreshToken) return current?.accessToken ?? null;\n if (isFresh(current, now())) return current.accessToken ?? null;\n\n let rotated;\n try {\n rotated = await refreshTokens(\n resolveAppUrl(),\n current.refreshToken,\n opts?.fetch,\n );\n } catch (error) {\n // Transient: the server was unreachable or faulted. The refresh token\n // may well still be good, so it stays on disk and the next command\n // tries again rather than forcing a browser round trip.\n //\n // Raised rather than returned as null, because null is how this function\n // says \"there is no session\", which sends callers down the wrong path:\n // they tell the person to run `walkeros auth login` and send the request\n // unauthenticated, when the session is fine and only the network was not.\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Could not reach ${resolveAppUrl()} to refresh your session: ${reason}. ` +\n 'Your saved session was kept, so try again once the connection is back.',\n );\n }\n\n if (rotated === null) {\n // The server rejected the refresh token itself. Nothing local can\n // recover it, so drop the dead session.\n clearAuthFields();\n return null;\n }\n\n writeConfig({\n accessToken: rotated.accessToken,\n accessTokenExpiresAt: rotated.accessTokenExpiresAt,\n // A server that rotates no new refresh token leaves the current one in\n // force; overwriting it with null would end the session on the next call.\n refreshToken: rotated.refreshToken ?? current.refreshToken,\n });\n\n return rotated.accessToken;\n });\n}\n\n/**\n * Authorization header for the resolved credential, or an empty object when\n * there is none. Async because resolving may have to refresh the session.\n */\nexport async function getAuthHeaders(): Promise<Record<string, string>> {\n const token = await resolveAccessToken();\n if (!token) return {};\n return { Authorization: `Bearer ${token}` };\n}\n\n/**\n * Where a credential would come from, without resolving or refreshing it.\n * For commands that want to send someone to `walkeros auth login` before spending\n * a network round trip.\n */\nexport function credentialSource(): 'env' | 'config' | null {\n if (process.env.WALKEROS_TOKEN) return 'env';\n if (hasStoredCredential(readConfig())) return 'config';\n return 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 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 * 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 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 packageNameToVariable,\n getStepRuntimeProps,\n ENV_MARKER_PREFIX,\n SECRET_MARKER_PREFIX,\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.\n * InlineCode has { push: string, type?: string, init?: string }\n */\nfunction isInlineCode(code: unknown): code is Flow.Code {\n return (\n code !== null &&\n typeof code === 'object' &&\n !Array.isArray(code) &&\n 'push' in code\n );\n}\n\n/**\n * 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). Handles $code: prefix for push/init functions.\n *\n * @param inline - InlineCode object with push, optional init, optional type\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 pushFn = inline.push.replace('$code:', '');\n const initFn = inline.init ? inline.init.replace('$code:', '') : undefined;\n const typeLine = inline.type ? `type: '${inline.type}',` : '';\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 ${initFn ? `init: ${initFn},` : ''}\n push: ${pushFn}\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 ${initFn ? `init: ${initFn},` : ''}\n push: ${pushFn}\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 // Bake provenance before the L1 check and codegen, so the release sits\n // in both the cache key and the artifact.\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 core, never\n // from the flow's core in TEMP_DIR, which may predate it.\n stage2Options.plugins = [cliCorePlugin()];\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_CORE = 'walkeros-cli-core';\n\n/**\n * Resolves every `@walkeros/core` import of a generated entry (the Tag Mode\n * loader, the preview activator) from this module's own location: the core\n * this CLI was installed with. Resolving from the entry's temp dir would walk\n * up through every `node_modules` above it, where another core (a flow's\n * pinned one, or a stray install in a shared temp root) can shadow it.\n */\nexport function cliCorePlugin(): esbuild.Plugin {\n const resolveDir = path.dirname(fileURLToPath(import.meta.url));\n return {\n name: CLI_CORE,\n setup(build) {\n build.onResolve({ filter: /^@walkeros\\/core$/ }, async (args) => {\n if (args.pluginData === CLI_CORE) return undefined;\n const resolved = await build.resolve(args.path, {\n kind: args.kind,\n resolveDir,\n pluginData: CLI_CORE,\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 * 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 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 * Generate a stage 2 entry file for server bundles.\n * Imports startFlow and wireConfig from the stage 1 .mjs file,\n * embeds the data payload, and exports a factory function.\n */\nexport function generateServerEntry(\n stage1Path: string,\n dataPayload: string,\n): string {\n const stage1Specifier = toFileImportSpecifier(stage1Path);\n return `import { startFlow, wireConfig } from '${stage1Specifier}';\n\nconst __configData = ${dataPayload};\n\nexport default async function(context = {}) {\n const config = wireConfig(__configData);\n\n if (context.logger) config.logger = context.logger;\n\n if (context.sourceSettings && config.sources) {\n for (const src of Object.values(config.sources)) {\n if (src.config?.settings) {\n src.config.settings = { ...src.config.settings, ...context.sourceSettings };\n }\n }\n }\n\n const result = await startFlow(config);\n\n // 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/**\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. The runtime\n * connect module inside startFlow does the credential/slot work at boot\n * (the per-session secret arrives out-of-band via the `elbObserve`\n * companion); no emitted byte here is ever secret.\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)};`;\n}\n\n/** Imports the Tag Mode loader into a browser entry. */\nconst MOIN_IMPORT = \"import { moin } from '@walkeros/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 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}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 core and lets it decide whether a preview bundle\n * boots in place of this flow. The bundle carries only PUBLIC values: a keyring,\n * 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/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 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}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 if (context.logger) config.logger = context.logger;\n\n if (context.sourceSettings && config.sources) {\n for (const src of Object.values(config.sources)) {\n if (src.config?.settings) {\n src.config.settings = { ...src.config.settings, ...context.sourceSettings };\n }\n }\n }\n\n const result = await startFlow(config);\n\n // 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 and setup.\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 both\n * commands/bundle/* and commands/setup/* run 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';\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/**\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 const isLocalPath = pkg.startsWith('.') || pkg.startsWith('/');\n\n if (isLocalPath) {\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","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 } from '@walkeros/core';\n\nexport type ComponentKind = 'source' | 'transformer' | 'destination' | 'store';\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 { isObject } from '@walkeros/core';\nimport type {\n ValidateResult,\n ValidationError,\n ValidationWarning,\n} from '../types.js';\n\nconst SECTION_KEYS = ['globals', 'context', 'custom', 'user', 'consent'];\nconst KNOWN_KEYS = new Set([\n 'extend',\n 'tagging',\n 'description',\n 'events',\n 'schema',\n ...SECTION_KEYS,\n]);\n\nexport function validateContract(input: unknown): ValidateResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const details: Record<string, unknown> = {};\n\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n errors.push({\n path: 'root',\n message: 'Contract must be an object of named contract entries',\n code: 'INVALID_CONTRACT',\n });\n return { valid: false, type: 'contract', errors, warnings, details };\n }\n\n const contracts = input as Record<string, unknown>;\n const contractNames = Object.keys(contracts);\n details.contractCount = contractNames.length;\n\n // Check 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((k) => isObject(obj[k]));\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 // Warn on unknown keys\n for (const key of unknownKeys) {\n warnings.push({\n path: `${name}.${key}`,\n message: `Unknown contract key \"${key}\" is ignored`,\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 sections\n for (const key of SECTION_KEYS) {\n if (key in obj) {\n if (typeof obj[key] !== 'object' || obj[key] === null) {\n errors.push({\n path: `${name}.${key}`,\n message: `Section \"${key}\" must be a JSON Schema object`,\n value: obj[key],\n code: 'INVALID_SECTION',\n });\n }\n }\n }\n\n // Validate events\n if (obj.events !== undefined) {\n if (typeof obj.events !== 'object' || obj.events === null) {\n errors.push({\n path: `${name}.events`,\n message: 'events must be an object',\n code: 'INVALID_EVENTS',\n });\n } else {\n validateEntityActions(\n obj.events as Record<string, unknown>,\n `${name}.events`,\n errors,\n );\n }\n }\n }\n\n // Check for circular 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 validateStepEntry,\n} from '@walkeros/core';\nimport { schemas, validateFlowStructure } 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 without their own closed-schema check (transformers have one). */\nconst OPEN_STEP_KINDS = [\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. Findings are warnings for one minor (D3); a schema\n * that cannot 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(\n target,\n flow,\n rawFlow,\n 'flow:package-settings',\n context,\n ),\n );\n }\n }\n }\n for (const outcome of await Promise.all(pending)) {\n result.warnings.push(...outcome.findings);\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 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 (path === 'contract' && contractErrors > 0) continue;\n errors.push({ path, message: issue.message, code: 'SCHEMA_VALIDATION' });\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. Transformers are closed (errors, single source of\n // truth in @walkeros/core); an unknown key on a destination or store is\n // dropped by the resolver, so it warns (UNKNOWN_KEY) for one minor.\n // Removed packages warn (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 OPEN_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 for (const key of unknownStepKeys(step, kind)) {\n warnings.push({\n path: `${at}.${key}`,\n message: `Unknown key \"${key}\" on ${kind} is ignored by the runtime`,\n suggestion: 'Remove the key, or move it to where it belongs.',\n code: 'UNKNOWN_KEY',\n });\n }\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 }\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), so a valid result implies the\n // bundle preflight passes. Its warnings (a transformer mapping that\n // does nothing) stay warnings: the runtime keeps the step.\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 * Top-level keys of a destination or store that the runtime does not know,\n * read through core's closed step-entry check (one source of truth).\n */\nfunction unknownStepKeys(\n step: Record<string, unknown>,\n kind: 'Destination' | 'Store',\n): string[] {\n const unknown: string[] = [];\n const rest: Record<string, unknown> = { ...step };\n for (;;) {\n const verdict = validateStepEntry(rest, kind);\n if (verdict.code !== 'UNKNOWN_KEY' || verdict.key === undefined) break;\n unknown.push(verdict.key);\n Reflect.deleteProperty(rest, verdict.key);\n }\n return unknown;\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\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\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 * as fs from 'fs';\nimport * as path from 'path';\nimport Ajv, { type ErrorObject, type ValidateFunction } from 'ajv';\nimport type { Flow } from '@walkeros/core';\nimport {\n ENV_MARKER_PREFIX,\n fetchPackage,\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 { parsePackageSpec } from '../../../core/step-packages.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/** 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\ninterface PackageSource {\n name: string;\n version?: string;\n localPath?: string;\n}\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\nfunction bundlePin(\n rawFlow: unknown,\n name: string,\n): { version?: string; path?: string } {\n const config = isObject(rawFlow) ? rawFlow.config : undefined;\n const bundle = isObject(config) ? config.bundle : undefined;\n const packages = isObject(bundle) ? bundle.packages : undefined;\n const pin = isObject(packages) ? packages[name] : undefined;\n if (!isObject(pin)) return {};\n return {\n ...(typeof pin.version === 'string' ? { version: pin.version } : {}),\n ...(typeof pin.path === 'string' ? { path: pin.path } : {}),\n };\n}\n\n/**\n * Where a step's package comes from, as the bundler picks it: a local\n * `path` (inline `./` or `/` spec, or a bundle pin), else the bundle pin's\n * version, else the inline `@version`, else latest.\n */\nfunction packageSource(spec: string, rawFlow: unknown): PackageSource {\n if (spec.startsWith('.') || spec.startsWith('/'))\n return { name: spec, localPath: spec };\n const { name, version } = parsePackageSpec(spec);\n const pin = bundlePin(rawFlow, name);\n if (pin.path) return { name, localPath: pin.path };\n const pinned = pin.version ?? version;\n return pinned ? { name, version: pinned } : { name };\n}\n\nfunction readJson(file: string): unknown {\n return JSON.parse(fs.readFileSync(file, 'utf-8'));\n}\n\n/** Schemas of a local package, read from its `walkerOS.json` on disk. */\nfunction readLocalSchema(\n source: PackageSource,\n configDir: string,\n): PackageSchema {\n const localPath = source.localPath ?? '';\n const root = path.isAbsolute(localPath)\n ? localPath\n : path.resolve(configDir, localPath);\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 const pkgFile = path.join(root, 'package.json');\n const pkg = fs.existsSync(pkgFile) ? readJson(pkgFile) : undefined;\n const schemas = isObject(meta) ? meta.schemas : undefined;\n const exportSchemas = isObject(meta) ? meta.exportSchemas : undefined;\n const declared =\n isObject(meta) && isObject(meta.$meta) ? meta.$meta.exports : undefined;\n const version =\n isObject(pkg) && typeof pkg.version === 'string' ? pkg.version : undefined;\n return {\n ...(version ? { version } : {}),\n settings: isObject(schemas) ? schemas.settings : undefined,\n ...(isObject(exportSchemas) ? { exportSchemas } : {}),\n ...(isObject(declared) ? { exports: Object.keys(declared) } : {}),\n };\n}\n\nasync function loadSchema(\n source: PackageSource,\n context: SettingsContext,\n): Promise<PackageSchema> {\n if (source.localPath !== undefined) {\n const configDir = context.configDir;\n if (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 return readLocalSchema(source, configDir);\n }\n const info = await fetchPackage(source.name, {\n ...(source.version ? { version: source.version } : {}),\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(source: PackageSource): string {\n return source.localPath\n ? `path:${source.localPath}`\n : `${source.name}@${source.version ?? 'latest'}`;\n}\n\nfunction cachedSchema(\n source: PackageSource,\n context: SettingsContext,\n): Promise<PackageSchema> {\n const key = sourceKey(source);\n let pending = context.cache.get(key);\n if (!pending) {\n pending = loadSchema(source, context);\n context.cache.set(key, pending);\n }\n return pending;\n}\n\nfunction cachedCompile(\n source: PackageSource,\n exportName: string | undefined,\n settings: unknown,\n context: SettingsContext,\n): CompiledSettings | undefined {\n const key = `${sourceKey(source)}#${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 rawFlow: unknown,\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 const source = packageSource(spec, rawFlow);\n let schema: PackageSchema;\n try {\n schema = await cachedSchema(source, context);\n } catch (error) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Schema for ${source.name}${source.version ? `@${source.version}` : ''} could not be loaded: ${getErrorMessage(error)}`,\n code: 'SCHEMA_UNAVAILABLE',\n });\n return outcome;\n }\n outcome.checked = {\n path: at,\n package: source.name,\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 resolvedFlow,\n SECTION_KIND[target.section],\n target.key,\n );\n const version = schema.version ?? source.version;\n const selection = selectSettingsSchema(\n schema,\n version ? `${source.name}@${version}` : source.name,\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 source,\n exportName,\n selection.settings,\n context,\n );\n if (!compiled) {\n outcome.skipped.push({\n path: at,\n check,\n reason: `Package ${source.name} 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 ${source.name} 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","// 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 file?.flows[target.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 '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 'TRANSFORMER_MAPPING_NO_OP',\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_SECTION',\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 { createCLILogger } from '../../core/cli-logger.js';\nimport {\n startDeviceAuthorization,\n pollDeviceToken,\n type TokenSet,\n} from '../../core/oauth-client.js';\nimport {\n readConfig,\n writeConfig,\n resolveAppUrl,\n getConfigPath,\n} from '../../lib/config-file.js';\nimport { requireSecureUrl } from '../../lib/secure-url.js';\nimport { appFetch } from '../../core/app-fetch.js';\nimport { APP_PATHS } from '../../core/app-paths.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\n/**\n * `walkeros auth login` on the RFC 8628 device authorization grant.\n *\n * The CLI never sees a password and never runs a local callback server: it\n * shows a code, the person approves it in a browser they already trust, and\n * the CLI polls until the approval lands.\n */\n\n/** Grace added to the server's stated lifetime before we stop polling. */\nconst POLL_TIMEOUT_BUFFER_MS = 5000;\n\n/** Interval to use when the caller states none. */\nconst DEFAULT_POLL_INTERVAL_MS = 5000;\n\n/**\n * Floor on an interval that came from a SERVER.\n *\n * RFC 8628 lets a server state any minimum gap between polls, including none,\n * but `WALKEROS_APP_URL` is user-settable, so that number arrives from\n * whichever host the person is pointed at. A stated zero would otherwise set\n * this loop's pace to \"as fast as the network allows\" for the whole life of\n * the device code. A remote value may slow the loop down, never off its leash.\n */\nconst MIN_SERVER_POLL_INTERVAL_MS = 1000;\n\n/**\n * Window to poll for when the caller states none. Sized to the lifetime a\n * device code is typically issued with, so a resume that was given no window\n * cannot outlive the code it is polling for.\n */\nconst DEFAULT_POLL_TIMEOUT_MS = 900_000;\n\n/** RFC 8628 section 3.5: each `slow_down` adds five seconds. */\nconst SLOW_DOWN_STEP_MS = 5000;\n\n/**\n * Ceiling on the identity lookup. It runs AFTER the session is on disk, so a\n * server that accepts the connection and then says nothing would otherwise\n * hold `walkeros auth login` open long past its last useful work.\n */\nconst WHOAMI_TIMEOUT_MS = 10_000;\n\nconst TIMED_OUT = 'Authorization timed out. Please try again.';\n\n/**\n * The identity endpoint's response. Validated because a malformed body must\n * not put a non-string into the config where the email belongs.\n */\nconst WhoamiSchema = z.object({ email: z.string().min(1) });\n\nexport interface LoginCommandOptions extends GlobalOptions {\n url?: string;\n json?: boolean;\n}\n\nexport interface LoginResult {\n success: boolean;\n email?: string;\n configPath?: string;\n error?: string;\n}\n\nexport interface LoginOptions {\n url?: string;\n /** Override browser opener for testing */\n openUrl?: (url: string) => Promise<void>;\n /** Override fetch for testing */\n fetch?: typeof globalThis.fetch;\n /** Max poll attempts before giving up (for testing) */\n maxPollAttempts?: number;\n /** Poll interval, replacing the server's stated one (for testing) */\n pollIntervalMs?: number;\n}\n\n/**\n * The outcome of finishing a device authorization.\n *\n * It carries no token material. `completeDeviceLogin` stores the session\n * itself, so the credential file keeps exactly one writer and a caller can\n * neither persist nor leak what came back.\n *\n * `pending` and `slow_down` both mean the window closed with the approval\n * still outstanding: the device code is untouched, so the same code can be\n * handed back in. `slow_down` is that same situation with the server asking\n * for a wider gap before the next attempt.\n */\nexport type DeviceLoginResult =\n | { status: 'ok' }\n | { status: 'pending' }\n | { status: 'slow_down' }\n | { status: 'denied' }\n | { status: 'expired' }\n | { status: 'error'; error: string };\n\nexport interface CompleteDeviceLoginOptions {\n /** App to poll. Defaults to the resolved app URL. */\n url?: string;\n /** Stop polling after this long. */\n timeoutMs?: number;\n /** Wait between polls, before any `slow_down` widens it. */\n intervalMs?: number;\n /** Override fetch for testing */\n fetch?: typeof globalThis.fetch;\n /** Max poll attempts before giving up (for testing) */\n maxPollAttempts?: number;\n}\n\nasync function openInBrowser(url: string): Promise<void> {\n const { default: open } = await import('open');\n await open(url);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function loginCommand(\n options: LoginCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n\n try {\n const result = await login({ url: options.url });\n\n if (options.json) {\n logger.json(result);\n } else if (result.success) {\n if (result.email) logger.info(`Logged in as ${result.email}`);\n else logger.info('Logged in.');\n logger.info(`Session stored in ${result.configPath}`);\n } else if (result.error) {\n logger.error(result.error);\n }\n\n process.exit(result.success ? 0 : 1);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n logger.json({ success: false, error: message });\n } else {\n logger.error(message);\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Ask the API who the freshly issued token belongs to.\n *\n * Non-fatal: the session is already stored and usable, and an address is only\n * there so the CLI can name the account it logged into.\n */\nasync function fetchEmail(\n appUrl: string,\n accessToken: string,\n fetchFn: typeof globalThis.fetch,\n): Promise<string | undefined> {\n try {\n const response = await appFetch(APP_PATHS.whoami, {\n baseUrl: appUrl,\n token: accessToken,\n fetch: fetchFn,\n signal: AbortSignal.timeout(WHOAMI_TIMEOUT_MS),\n });\n if (!response.ok) return undefined;\n const parsed = WhoamiSchema.safeParse(await response.json());\n return parsed.success ? parsed.data.email : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Store the session a device authorization yielded, and name its account. */\nasync function persistSession(\n appUrl: string,\n tokens: TokenSet,\n fetchFn: typeof globalThis.fetch,\n): Promise<void> {\n // Every credential key is written explicitly, including the ones that may\n // be absent: `writeConfig` merges, so a key left out would keep the\n // PREVIOUS session's value and quietly outlive the login that replaced it.\n writeConfig({\n accessToken: tokens.accessToken,\n accessTokenExpiresAt: tokens.accessTokenExpiresAt,\n refreshToken: tokens.refreshToken ?? undefined,\n appUrl,\n // Drop the static token this session replaces, so the deprecated path\n // cannot outlive the login that retired it.\n token: undefined,\n });\n\n // Unconditional: a stale address is worse than none, since it names the\n // account this session belongs to.\n const email = await fetchEmail(appUrl, tokens.accessToken, fetchFn);\n writeConfig({ email });\n}\n\n/**\n * Poll a device authorization to its end and store the session it yields.\n *\n * Split out from `login` so a caller holding only a device code can finish an\n * authorization that is already under way. `login` cannot serve that: it\n * starts a fresh authorization on every call, which would strand the code the\n * person is looking at.\n */\nexport async function completeDeviceLogin(\n deviceCode: string,\n options: CompleteDeviceLoginOptions = {},\n): Promise<DeviceLoginResult> {\n const fetchFn = options.fetch ?? globalThis.fetch;\n const appUrl = requireSecureUrl(options.url || resolveAppUrl());\n const deadline = Date.now() + (options.timeoutMs ?? DEFAULT_POLL_TIMEOUT_MS);\n\n let intervalMs = options.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n let attempts = 0;\n let waiting: 'pending' | 'slow_down' = 'pending';\n\n // Waiting out the interval is part of an attempt, so there is only room for\n // another poll while a whole interval still fits inside the window.\n while (Date.now() + intervalMs <= deadline) {\n if (\n options.maxPollAttempts !== undefined &&\n attempts >= options.maxPollAttempts\n )\n break;\n attempts += 1;\n\n await delay(intervalMs);\n\n // The window bounds the request too, not just how many are started: a\n // stalled response would otherwise run past the deadline on the HTTP\n // client's own clock.\n const signal = AbortSignal.timeout(Math.max(1, deadline - Date.now()));\n const poll = await pollDeviceToken(appUrl, deviceCode, fetchFn, signal);\n\n if (poll.status === 'pending') {\n waiting = 'pending';\n // An aborted request means the window is spent, even when its timer\n // fired a moment before Date.now() reached the deadline.\n if (signal.aborted) break;\n continue;\n }\n if (poll.status === 'slow_down') {\n waiting = 'slow_down';\n intervalMs += SLOW_DOWN_STEP_MS;\n continue;\n }\n if (poll.status !== 'ok') return poll;\n\n await persistSession(appUrl, poll.tokens, fetchFn);\n return { status: 'ok' };\n }\n\n return { status: waiting };\n}\n\nexport async function login(options: LoginOptions = {}): Promise<LoginResult> {\n const fetchFn = options.fetch ?? globalThis.fetch;\n const appUrl = requireSecureUrl(options.url || resolveAppUrl());\n\n let authorization;\n try {\n authorization = await startDeviceAuthorization(appUrl, fetchFn);\n } catch {\n return { success: false, error: 'Failed to request device code' };\n }\n\n const target = authorization.verificationUriComplete;\n\n const prompt = (message: string) => process.stderr.write(message + '\\n');\n prompt(`\\n! Your one-time code: ${authorization.userCode}`);\n prompt(` Authorize here: ${target}\\n`);\n\n const opener = options.openUrl ?? openInBrowser;\n try {\n await opener(target);\n prompt(' Opening browser...');\n } catch {\n prompt(' Could not open browser. Visit the URL manually.');\n }\n\n prompt(' Waiting for authorization... (press Ctrl+C to cancel)\\n');\n\n const outcome = await completeDeviceLogin(authorization.deviceCode, {\n url: appUrl,\n fetch: fetchFn,\n timeoutMs: authorization.expiresIn * 1000 + POLL_TIMEOUT_BUFFER_MS,\n // Clamped here, at the one place a server's number enters the loop. The\n // helper takes its caller's interval as stated, which is what keeps a\n // stated 0 from becoming a poll flood without making the helper's own\n // option untestably slow.\n intervalMs:\n options.pollIntervalMs ??\n Math.max(MIN_SERVER_POLL_INTERVAL_MS, authorization.interval * 1000),\n ...(options.maxPollAttempts !== undefined\n ? { maxPollAttempts: options.maxPollAttempts }\n : {}),\n });\n\n switch (outcome.status) {\n case 'ok': {\n // Read back rather than returned: `completeDeviceLogin` owns the config\n // file, so what is on disk is the only account this session belongs to.\n const email = readConfig()?.email;\n return {\n success: true,\n ...(email ? { email } : {}),\n configPath: getConfigPath(),\n };\n }\n case 'denied':\n return { success: false, error: 'Authorization was denied.' };\n case 'error':\n return { success: false, error: outcome.error };\n default:\n return { success: false, error: TIMED_OUT };\n }\n}\n","import { createCLILogger } from '../../core/cli-logger.js';\nimport { revokeRefreshToken } from '../../core/oauth-client.js';\nimport {\n deleteConfig,\n getConfigPath,\n readConfig,\n resolveAppUrl,\n type WalkerOSConfig,\n} from '../../lib/config-file.js';\nimport type { GlobalOptions } from '../../types/global.js';\n\nexport interface LogoutCommandOptions extends GlobalOptions {\n json?: boolean;\n}\n\nexport async function logoutCommand(\n options: LogoutCommandOptions,\n): Promise<void> {\n const logger = createCLILogger(options);\n\n const { deleted, superseded } = await logout();\n const configPath = getConfigPath();\n\n if (options.json) {\n logger.json({ success: true, deleted, superseded });\n } else if (superseded) {\n logger.info(\n 'A newer session was stored while logging out, and was kept. ' +\n 'Run `walkeros auth logout` again to remove it.',\n );\n } else if (deleted) {\n logger.info(`Logged out. Session removed from ${configPath}`);\n } else {\n logger.info('No stored credentials found.');\n }\n\n process.exit(0);\n}\n\nexport interface LogoutResult {\n deleted: boolean;\n /** A different session reached the config while the revocation was in flight. */\n superseded: boolean;\n}\n\n/** Whether two reads of the config carry the same session. */\nfunction sameSession(\n before: WalkerOSConfig | null,\n after: WalkerOSConfig,\n): boolean {\n return (\n before?.accessToken === after.accessToken &&\n before?.refreshToken === after.refreshToken &&\n before?.token === after.token\n );\n}\n\n/**\n * Revoke the stored refresh token, then drop the local config.\n *\n * Revocation first, because deleting the file alone would leave a credential\n * alive on the server that nothing can ever reach to retire. It is best\n * effort: a logout on a plane still has to clear the machine.\n */\nexport async function logout(): Promise<LogoutResult> {\n const before = readConfig();\n\n if (before?.refreshToken) {\n await revokeRefreshToken(resolveAppUrl(), before.refreshToken);\n }\n\n // Re-read: revocation is a network round trip, and a login that finished\n // inside it stored a session this logout never saw. Deleting the file would\n // take that session with it, so the newer credential wins.\n //\n // It narrows the window rather than closing it. Only the token refresh takes\n // the config lock, and holding it across the revocation would be a protocol\n // change, not a check.\n const after = readConfig();\n if (after && !sameSession(before, after))\n return { deleted: false, superseded: true };\n\n return { deleted: deleteConfig(), superseded: false };\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 {\n EXIT,\n NOT_SIGNED_IN,\n type ApiCommandIO,\n type ApiExit,\n} 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 = await resolveAccessToken();\n if (!token)\n throw new Error('Not authenticated. Run `walkeros auth login` first.');\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/**\n * Print the current access token and a newline on stdout, so any HTTP client\n * can call the app (`gh auth token` pattern). Exit 3 without a credential, 4\n * when a refresh cannot reach the app.\n */\nexport async function authTokenCommand(\n io: Pick<ApiCommandIO, 'stdout' | 'stderr'> = {\n stdout: process.stdout,\n stderr: process.stderr,\n },\n): Promise<ApiExit> {\n let token: string | null;\n try {\n token = await resolveAccessToken();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n io.stderr.write(`walkeros auth token: ${message}\\n`);\n return EXIT.unreachable;\n }\n if (!token) {\n io.stderr.write(`walkeros auth token: ${NOT_SIGNED_IN}\\n`);\n return EXIT.auth;\n }\n io.stdout.write(`${token}\\n`);\n return EXIT.ok;\n}\n\n// === CLI Command Handler ===\n\nconst IdentitySchema = z.object({\n email: z.string().optional(),\n userId: z.string().optional(),\n projectId: z.string().nullish(),\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 if (data.projectId) logger.info(`Project: ${data.projectId}`);\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 { 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 'not signed in: run walkeros auth login, or set WALKEROS_TOKEN';\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 headers[value.slice(0, colon).trim()] = 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 let token: string | null;\n try {\n token = await resolveAccessToken();\n } catch (error) {\n line(io.stderr, messageOf(error));\n return EXIT.unreachable;\n }\n if (!token && !hasHeader(request.headers, 'Authorization')) {\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 {\n loginCommand,\n login,\n completeDeviceLogin,\n} from './commands/login/index.js';\nexport type {\n LoginOptions,\n LoginResult,\n CompleteDeviceLoginOptions,\n DeviceLoginResult,\n} from './commands/login/index.js';\nexport { logoutCommand, logout } from './commands/logout/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 {\n resolveAccessToken,\n getAuthHeaders,\n credentialSource,\n} from './core/auth.js';\nexport { startDeviceAuthorization } from './core/oauth-client.js';\nexport type { DeviceAuthorization } from './core/oauth-client.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 {\n readConfig,\n writeConfig,\n clearAuthFields,\n deleteConfig,\n resolveToken,\n resolveAppUrl,\n} 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 cliCorePlugin,\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/core` (used by the preview activator) from the CLI\n // package's own dependency tree and the workspace root. Without this,\n // esbuild looks under the temp entryDir which has no node_modules.\n // The wrap step always runs from inside the CLI process; both the\n // CLI's local node_modules and the workspace root 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 core imports (the Tag Mode loader, the preview\n // activator) come from the CLI's own core, never from a core above the\n // temp dir.\n esbuildOptions.plugins = [cliCorePlugin()];\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 a single\n * `walkeros auth login` (which writes `appUrl` to the user config) wires\n * telemetry alongside auth. Order: env (`WALKEROS_APP_URL`) > user config\n * (`~/.config/walkeros/config.json:appUrl`) > undefined (telemetry no-ops).\n *\n * Hard-cut: `TELEMETRY_ENDPOINT` is no longer recognized.\n */\nexport function resolveTelemetryEndpoint(): string | undefined {\n const appUrl = resolveAppUrl();\n if (!appUrl) return undefined;\n return `${appUrl.replace(/\\/+$/, '')}${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 login or an explicit\n * `walkeros telemetry enable`). If the user never creates a config for any\n * 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","mkdirSync","unlinkSync","resolve","unlinkSync","mkdirSync","z","path","z","path","path","fs","fs","path","schemas","path","path","fs","path","fs","isRecord","stat","path","bundle","path","fs","bundle","esbuild","path","fileURLToPath","fs","packageNameToVariable","SECRET_MARKER_PREFIX","isObject","path","fs","semver","input","path","fs","errorCode","fs","path","path","delay","resolve","fs","deps","peerDeps","peerMeta","nestLoser","alreadyNested","semver","path","fs","fs","path","semver","isObject","getHashServer","fs","path","getHashServer","getHashServer","path","fs","fs","path","readFileSync","dirname","join","path","fs","getHashServer","stats","sizeKB","esbuild","fileURLToPath","build","packageNameToVariable","isObject","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","schemas","isObject","isFlowJson","path","getFlowSettings","getErrorMessage","resolveFlow","fs","path","ENV_MARKER_PREFIX","getErrorMessage","isObject","SECRET_MARKER_PREFIX","isObject","ENV_MARKER_PREFIX","SECRET_MARKER_PREFIX","bundle","readJson","schemas","context","getErrorMessage","validate","validateFlowConfig","schemas","context","isObject","path","validateFlowConfig","result","bundle","isFlowJson","resolveFlow","ENV_MARKER_PREFIX","checkWindowCollector","once","isObject","schemas","path","context","isFlowJson","resolveFlow","isFlowJson","isObject","validateEvent","chalk","z","z","delay","resolve","z","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"]}