@walkeros/cli 0.5.0 → 0.5.1-next.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.
Files changed (84) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/__tests__/core/asset-resolver.test.d.ts +2 -0
  3. package/dist/__tests__/core/asset-resolver.test.d.ts.map +1 -0
  4. package/dist/__tests__/core/asset-resolver.test.js +14 -0
  5. package/dist/__tests__/core/asset-resolver.test.js.map +1 -0
  6. package/dist/commands/run/execution.js +1 -1
  7. package/dist/commands/run/execution.js.map +1 -1
  8. package/dist/core/asset-resolver.d.ts.map +1 -1
  9. package/dist/core/asset-resolver.js +5 -0
  10. package/dist/core/asset-resolver.js.map +1 -1
  11. package/dist/index.js +5 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/walker.js +1 -1
  14. package/package.json +14 -14
  15. package/dist/examples/.npm-cache/content-v2/sha512/0d/2d/7581c288670eaf8538ddd9df145b78756ce3be0791c6e0b9cd33429b3bae894525b9bda287a3cedffbcdd2c7b3107bafc03f2b0367eea489eee1cc042abb +0 -1
  16. package/dist/examples/.npm-cache/content-v2/sha512/12/20/bc4f5acca143809f7e07da1fdafb38137d93243de4d5b403e6e10b92d0d3a6e51eab24fe9dbc9d3ed1cd72e8f7a406085e99c422bb2c7d1166cf9f1f564e +0 -0
  17. package/dist/examples/.npm-cache/content-v2/sha512/22/ee/fb2695b01871c1d36946bdcfb49f1b520a57200d0a0b221b1e7d5f047ab38a8b2ab0e5f0e25a00acde1f3f2f9d24430a18f1092d438bc1a9e9891cc45f75 +0 -0
  18. package/dist/examples/.npm-cache/content-v2/sha512/24/89/da1ce6a61bca6de7e132f241a675c01c83738bf6b78af25b5cce01d3030361332b3fe938571e2b721f1555da9ddf930fdcf8c02f0471556071590e68cc09 +0 -0
  19. package/dist/examples/.npm-cache/content-v2/sha512/47/fd/c6be997da99228c3e279b95d4a46d6913947078a178f54ac71795a159f3513b1483232f4c2d0a1f403178bf9f96bb19615de32a9e2133e949880c6bc15e2 +0 -0
  20. package/dist/examples/.npm-cache/content-v2/sha512/4b/1c/c1cb7f8b32102071a89fef97158daa32080ebaedfbbd596880d2213d84e305abc76d2a95a412ded55c1c3d487adcb1ceff87fc2c85d7e2856ebd9d3f16f3 +0 -0
  21. package/dist/examples/.npm-cache/content-v2/sha512/6e/53/ff864769671f44f39d8a3bf904cd646535b745cc4824a8bb3189193b474678049f43b5178ba15cad7f0289046105e70f1565afc84e907120b35a466690fd +0 -1
  22. package/dist/examples/.npm-cache/content-v2/sha512/70/4c/4c8837d446965c5551b4ea527e95fa011744fb727581d82cf35bb5599ea0b57d18baa490f7af93ef9a16e8e45e5c0802737da20575f4056a4a5c9a3cd288 +0 -0
  23. package/dist/examples/.npm-cache/content-v2/sha512/96/ad/05de3bbb12d7de8ea353f962bdaea7d2eb44f707f2973462a6635daf537c67b46cca7764fed7d464fe62152c3f783a07aba1ceb35e09ad446bff05a4b466 +0 -1
  24. package/dist/examples/.npm-cache/content-v2/sha512/b5/20/52dde94e6cef7170f6089c64a4843e57be18be450d956f4e455905aed047ae6a368451c93035e6ac3ee59576b600f03f815afba0836b3a16e10a9aaca4ba +0 -1
  25. package/dist/examples/.npm-cache/content-v2/sha512/c7/a9/d166a1c39f97df312c59261319ba1cf9aac178bda0a0cb697d5ddd78bd8dd38ef1bf40017bcc8633c2049896c2d70696d9bff9280851f270792ff38bb3a0 +0 -1
  26. package/dist/examples/.npm-cache/content-v2/sha512/e0/d0/8c14083b633e6adbd3c6a93da5fc0f6bbd456c5512ef276920bedd8d85d551052adff992de977aff326616a211aaa2d6ddcc801149e9b7f914f566359b6a +0 -1
  27. package/dist/examples/.npm-cache/content-v2/sha512/e7/c5/06ad3fd79ac4f1031fe0b16ea5e54e232ca397bbcd7592c679021cbfb027276099f8c848f3f7a7691f0102ad53aa64f9141e61d729b037a678bd60440d17 +0 -1
  28. package/dist/examples/.npm-cache/content-v2/sha512/f3/28/d5d32329604ed7d471a4949105daa2cc98858cf24f45b0b97c41d0eb0d5a9fe7bf1f69c792161cc6693e4fc1b52e886ac41875ebfb8fe47fafe417ca3e6e +0 -0
  29. package/dist/examples/.npm-cache/index-v5/04/5a/2b5d7a7c407d85d746baa0f5c9388a333e35a717a8a0a81943daa6cb1364 +0 -3
  30. package/dist/examples/.npm-cache/index-v5/12/9a/eba560cbace295d8ee04cf283015377bd77b379e70968fb6bc407c7fc410 +0 -15
  31. package/dist/examples/.npm-cache/index-v5/2f/a2/7b047564b0ee21ac835ec609e89153dd6549be554d098584d5bfd19fe043 +0 -15
  32. package/dist/examples/.npm-cache/index-v5/32/8e/322d58dd8d1e000be248ada51385bf96288e56039de9feec1a4c6a467653 +0 -3
  33. package/dist/examples/.npm-cache/index-v5/57/93/d1d7cd1402e3e26468db03f2870822bb2c9018a506cdfb3b405f38cd3e1c +0 -3
  34. package/dist/examples/.npm-cache/index-v5/5d/f8/0a1f4fa7149e4ff33e09eb6aea41ac8d1730c868a5d3ace91f762698acff +0 -3
  35. package/dist/examples/.npm-cache/index-v5/69/a4/a92c72d838259b051cdf8e0acfb2bc680b6d4cfc642314a7836c3f7b2c50 +0 -15
  36. package/dist/examples/.npm-cache/index-v5/71/31/6da3423bb203f3de5eb16c942431073f89be2cfcb40058ec91dcb5ce0abc +0 -15
  37. package/dist/examples/.npm-cache/index-v5/7b/94/72b6bffa050d9ef52a558dd220663695bc606f756be0dfa196ef4f3913ba +0 -3
  38. package/dist/examples/.npm-cache/index-v5/85/9e/99e97fdd562517e56285337db91d1a8f2f416b8d631cf4d7d754fa671299 +0 -15
  39. package/dist/examples/.npm-cache/index-v5/92/4c/9416ada81a9b3c679539fd1ab53f8de3d41ff268f35eba7a194389a85b06 +0 -3
  40. package/dist/examples/.npm-cache/index-v5/c1/5a/13df76b218deed8a6ef12961116af5183db98c53fad1b922fd9edc075247 +0 -3
  41. package/dist/examples/.npm-cache/index-v5/cb/11/253c55410a8ab7c4a9ea9d6e1bf8ef1450a581da64c478074dfd82c8bff6 +0 -3
  42. package/dist/examples/.npm-cache/index-v5/d5/ae/b57fad3a62b5ba2dbdf24b042a9e7b70820f3db00e5a630f02e1fea020dc +0 -3
  43. package/dist/examples/.npm-cache/index-v5/d6/32/2f620f83c7d14451de98de8298c2408e05a16cc0829bd16c891ac19d7a67 +0 -3
  44. package/dist/examples/.npm-cache/index-v5/dd/b5/01dc7a3cd8b6a03a69aee9af500d51ae19cb0aa12631a4aafd152148b8e5 +0 -15
  45. package/dist/examples/.npm-cache/index-v5/e0/cf/6b862c15d74630d3871cd813d305210ab741311deb10baf8813014e0bc30 +0 -3
  46. package/dist/examples/.npm-cache/index-v5/e2/be/e880ccd35950a814d3c1dded34d3938ac61b15a195321dc51357f801aad4 +0 -15
  47. package/dist/examples/.npm-cache/index-v5/e5/1f/f4affe0b392cd03288f23cc03abcb274ff11a2c8f8965299de681914abb2 +0 -3
  48. package/dist/examples/.npm-cache/index-v5/f3/5b/9ebe450958ff0d7cc44ab0a00080cb8a3ff1389744b5eab5f97b68a6a6af +0 -3
  49. package/dist/examples/.npm-cache/index-v5/fb/c1/0de405e902866d53e7c30cf36a97dc2578838622b261816f44dc377c9a80 +0 -3
  50. package/examples/.npm-cache/content-v2/sha512/0d/2d/7581c288670eaf8538ddd9df145b78756ce3be0791c6e0b9cd33429b3bae894525b9bda287a3cedffbcdd2c7b3107bafc03f2b0367eea489eee1cc042abb +0 -1
  51. package/examples/.npm-cache/content-v2/sha512/12/20/bc4f5acca143809f7e07da1fdafb38137d93243de4d5b403e6e10b92d0d3a6e51eab24fe9dbc9d3ed1cd72e8f7a406085e99c422bb2c7d1166cf9f1f564e +0 -0
  52. package/examples/.npm-cache/content-v2/sha512/22/ee/fb2695b01871c1d36946bdcfb49f1b520a57200d0a0b221b1e7d5f047ab38a8b2ab0e5f0e25a00acde1f3f2f9d24430a18f1092d438bc1a9e9891cc45f75 +0 -0
  53. package/examples/.npm-cache/content-v2/sha512/24/89/da1ce6a61bca6de7e132f241a675c01c83738bf6b78af25b5cce01d3030361332b3fe938571e2b721f1555da9ddf930fdcf8c02f0471556071590e68cc09 +0 -0
  54. package/examples/.npm-cache/content-v2/sha512/47/fd/c6be997da99228c3e279b95d4a46d6913947078a178f54ac71795a159f3513b1483232f4c2d0a1f403178bf9f96bb19615de32a9e2133e949880c6bc15e2 +0 -0
  55. package/examples/.npm-cache/content-v2/sha512/4b/1c/c1cb7f8b32102071a89fef97158daa32080ebaedfbbd596880d2213d84e305abc76d2a95a412ded55c1c3d487adcb1ceff87fc2c85d7e2856ebd9d3f16f3 +0 -0
  56. package/examples/.npm-cache/content-v2/sha512/6e/53/ff864769671f44f39d8a3bf904cd646535b745cc4824a8bb3189193b474678049f43b5178ba15cad7f0289046105e70f1565afc84e907120b35a466690fd +0 -1
  57. package/examples/.npm-cache/content-v2/sha512/70/4c/4c8837d446965c5551b4ea527e95fa011744fb727581d82cf35bb5599ea0b57d18baa490f7af93ef9a16e8e45e5c0802737da20575f4056a4a5c9a3cd288 +0 -0
  58. package/examples/.npm-cache/content-v2/sha512/96/ad/05de3bbb12d7de8ea353f962bdaea7d2eb44f707f2973462a6635daf537c67b46cca7764fed7d464fe62152c3f783a07aba1ceb35e09ad446bff05a4b466 +0 -1
  59. package/examples/.npm-cache/content-v2/sha512/b5/20/52dde94e6cef7170f6089c64a4843e57be18be450d956f4e455905aed047ae6a368451c93035e6ac3ee59576b600f03f815afba0836b3a16e10a9aaca4ba +0 -1
  60. package/examples/.npm-cache/content-v2/sha512/c7/a9/d166a1c39f97df312c59261319ba1cf9aac178bda0a0cb697d5ddd78bd8dd38ef1bf40017bcc8633c2049896c2d70696d9bff9280851f270792ff38bb3a0 +0 -1
  61. package/examples/.npm-cache/content-v2/sha512/e0/d0/8c14083b633e6adbd3c6a93da5fc0f6bbd456c5512ef276920bedd8d85d551052adff992de977aff326616a211aaa2d6ddcc801149e9b7f914f566359b6a +0 -1
  62. package/examples/.npm-cache/content-v2/sha512/e7/c5/06ad3fd79ac4f1031fe0b16ea5e54e232ca397bbcd7592c679021cbfb027276099f8c848f3f7a7691f0102ad53aa64f9141e61d729b037a678bd60440d17 +0 -1
  63. package/examples/.npm-cache/content-v2/sha512/f3/28/d5d32329604ed7d471a4949105daa2cc98858cf24f45b0b97c41d0eb0d5a9fe7bf1f69c792161cc6693e4fc1b52e886ac41875ebfb8fe47fafe417ca3e6e +0 -0
  64. package/examples/.npm-cache/index-v5/04/5a/2b5d7a7c407d85d746baa0f5c9388a333e35a717a8a0a81943daa6cb1364 +0 -3
  65. package/examples/.npm-cache/index-v5/12/9a/eba560cbace295d8ee04cf283015377bd77b379e70968fb6bc407c7fc410 +0 -15
  66. package/examples/.npm-cache/index-v5/2f/a2/7b047564b0ee21ac835ec609e89153dd6549be554d098584d5bfd19fe043 +0 -15
  67. package/examples/.npm-cache/index-v5/32/8e/322d58dd8d1e000be248ada51385bf96288e56039de9feec1a4c6a467653 +0 -3
  68. package/examples/.npm-cache/index-v5/57/93/d1d7cd1402e3e26468db03f2870822bb2c9018a506cdfb3b405f38cd3e1c +0 -3
  69. package/examples/.npm-cache/index-v5/5d/f8/0a1f4fa7149e4ff33e09eb6aea41ac8d1730c868a5d3ace91f762698acff +0 -3
  70. package/examples/.npm-cache/index-v5/69/a4/a92c72d838259b051cdf8e0acfb2bc680b6d4cfc642314a7836c3f7b2c50 +0 -15
  71. package/examples/.npm-cache/index-v5/71/31/6da3423bb203f3de5eb16c942431073f89be2cfcb40058ec91dcb5ce0abc +0 -15
  72. package/examples/.npm-cache/index-v5/7b/94/72b6bffa050d9ef52a558dd220663695bc606f756be0dfa196ef4f3913ba +0 -3
  73. package/examples/.npm-cache/index-v5/85/9e/99e97fdd562517e56285337db91d1a8f2f416b8d631cf4d7d754fa671299 +0 -15
  74. package/examples/.npm-cache/index-v5/92/4c/9416ada81a9b3c679539fd1ab53f8de3d41ff268f35eba7a194389a85b06 +0 -3
  75. package/examples/.npm-cache/index-v5/c1/5a/13df76b218deed8a6ef12961116af5183db98c53fad1b922fd9edc075247 +0 -3
  76. package/examples/.npm-cache/index-v5/cb/11/253c55410a8ab7c4a9ea9d6e1bf8ef1450a581da64c478074dfd82c8bff6 +0 -3
  77. package/examples/.npm-cache/index-v5/d5/ae/b57fad3a62b5ba2dbdf24b042a9e7b70820f3db00e5a630f02e1fea020dc +0 -3
  78. package/examples/.npm-cache/index-v5/d6/32/2f620f83c7d14451de98de8298c2408e05a16cc0829bd16c891ac19d7a67 +0 -3
  79. package/examples/.npm-cache/index-v5/dd/b5/01dc7a3cd8b6a03a69aee9af500d51ae19cb0aa12631a4aafd152148b8e5 +0 -15
  80. package/examples/.npm-cache/index-v5/e0/cf/6b862c15d74630d3871cd813d305210ab741311deb10baf8813014e0bc30 +0 -3
  81. package/examples/.npm-cache/index-v5/e2/be/e880ccd35950a814d3c1dded34d3938ac61b15a195321dc51357f801aad4 +0 -15
  82. package/examples/.npm-cache/index-v5/e5/1f/f4affe0b392cd03288f23cc03abcb274ff11a2c8f8965299de681914abb2 +0 -3
  83. package/examples/.npm-cache/index-v5/f3/5b/9ebe450958ff0d7cc44ab0a00080cb8a3ff1389744b5eab5f97b68a6a6af +0 -3
  84. package/examples/.npm-cache/index-v5/fb/c1/0de405e902866d53e7c30cf36a97dc2578838622b261816f44dc377c9a80 +0 -3
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/bundle/index.ts","../src/core/logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/docker.ts","../src/config/utils.ts","../src/core/execution.ts","../src/core/temp-manager.ts","../src/core/asset-resolver.ts","../src/core/utils.ts","../src/core/local-packages.ts","../src/config/validators.ts","../src/config/build-defaults.ts","../src/config/loader.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/package-manager.ts","../src/core/cache-utils.ts","../src/core/build-cache.ts","../src/commands/bundle/stats.ts","../src/commands/simulate/simulator.ts","../src/commands/simulate/tracker.ts","../src/commands/simulate/jsdom-executor.ts","../src/commands/simulate/node-executor.ts","../src/commands/simulate/env-loader.ts","../src/commands/simulate/index.ts","../src/commands/push/index.ts","../src/commands/run/index.ts","../src/commands/run/validators.ts","../src/schemas/primitives.ts","../src/schemas/run.ts","../src/commands/run/utils.ts","../src/commands/run/execution.ts","../src/commands/cache.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { VERSION as DOCKER_VERSION } from '@walkeros/docker';\nimport { bundleCommand } from './commands/bundle/index.js';\nimport { simulateCommand } from './commands/simulate/index.js';\nimport { pushCommand } from './commands/push/index.js';\nimport { runCommand } from './commands/run/index.js';\nimport { registerCacheCommand } from './commands/cache.js';\n\n// Get package version dynamically\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../package.json'), 'utf-8'),\n);\nconst VERSION = packageJson.version;\n\n// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand, simulateCommand, pushCommand, runCommand };\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle } from './commands/bundle/index.js';\nexport { simulate } from './commands/simulate/index.js';\nexport { run } from './commands/run/index.js';\n\n// === Types ===\n// Export types for programmatic usage\n// Config structure uses Flow.Setup and Flow.Config from @walkeros/core\nexport type {\n Flow,\n CLIBuildOptions,\n BuildOptions,\n MinifyOptions,\n} from './types/bundle.js';\nexport type { BundleStats } from './commands/bundle/bundler.js';\nexport type { SimulationResult } from './commands/simulate/types.js';\nexport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './commands/run/index.js';\nexport type { GlobalOptions } from './types/global.js';\n\nconst program = new Command();\n\nprogram\n .name('walkeros')\n .description('walkerOS CLI - Bundle and deploy walkerOS components')\n .version(VERSION);\n\n// Display startup banner before any command runs\nprogram.hook('preAction', (thisCommand, actionCommand) => {\n const options = actionCommand.opts();\n // Skip banner for --silent, --json, or --help flags\n if (!options.silent && !options.json) {\n console.log(`🚀 walkerOS CLI v${VERSION}`);\n console.log(`🐳 Using Docker runtime: walkeros/docker:${DOCKER_VERSION}`);\n }\n});\n\n// Bundle command\nprogram\n .command('bundle [file]')\n .description('Bundle NPM packages with custom code')\n .option('-f, --flow <name>', 'flow to build (for multi-flow configs)')\n .option('--all', 'build all flows (for multi-flow configs)')\n .option('-s, --stats', 'show bundle statistics')\n .option('--json', 'output statistics in JSON format (implies --stats)')\n .option('--no-cache', 'disable package caching and download fresh packages')\n .option('-v, --verbose', 'verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await bundleCommand({\n config: file || 'bundle.config.json',\n flow: options.flow,\n all: options.all,\n stats: options.stats,\n json: options.json,\n cache: options.cache,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Simulate command\nprogram\n .command('simulate [file]')\n .description('Simulate event processing and capture API calls')\n .option(\n '-e, --event <source>',\n 'Event to simulate (JSON string, file path, or URL)',\n )\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await simulateCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Push command\nprogram\n .command('push [file]')\n .description('Push an event through the flow with real API execution')\n .requiredOption(\n '-e, --event <source>',\n 'Event to push (JSON string, file path, or URL)',\n )\n .option('--flow <name>', 'Flow name (for multi-flow configs)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('-s, --silent', 'Suppress output')\n .option('--local', 'Execute in local Node.js instead of Docker')\n .action(async (file, options) => {\n await pushCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n flow: options.flow,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n local: options.local,\n });\n });\n\n// Run command with subcommands\nconst runCmd = program\n .command('run')\n .description('Run walkerOS flows in collect or serve mode');\n\n// Run collect subcommand\nrunCmd\n .command('collect [file]')\n .description(\n 'Run collector mode (event collection endpoint). Defaults to server-collect.mjs if no file specified.',\n )\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('collect', {\n config: file || 'server-collect.mjs',\n port: options.port,\n host: options.host,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Run serve subcommand\nrunCmd\n .command('serve [file]')\n .description(\n 'Run serve mode (single-file server for browser bundles). Defaults to baked-in web-serve.js if no file specified.',\n )\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--name <filename>', 'Filename in URL (default: walker.js)')\n .option('--path <directory>', 'URL directory path (e.g., libs/v1)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('serve', {\n config: file || 'web-serve.js',\n port: options.port,\n host: options.host,\n serveName: options.name,\n servePath: options.path,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Cache command\nregisterCacheCommand(program);\n\n// Run the CLI\n// Note: This file is marked as a bin script in package.json,\n// so it's always executed directly (never imported as a library)\nprogram.parse();\n","/**\n * Bundle Command\n *\n * Supports both single-flow and multi-flow builds.\n */\n\nimport path from 'path';\nimport {\n createCommandLogger,\n createLogger,\n createTimer,\n createSuccessOutput,\n createErrorOutput,\n executeCommand,\n getErrorMessage,\n buildCommonDockerArgs,\n resolveAsset,\n} from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n loadAllFlows,\n type LoadConfigResult,\n} from '../../config/index.js';\nimport type { GlobalOptions } from '../../types/index.js';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { bundleCore } from './bundler.js';\nimport { displayStats, createStatsSummary } from './stats.js';\n\nexport interface BundleCommandOptions extends GlobalOptions {\n config: string;\n flow?: string;\n all?: boolean;\n stats?: boolean;\n json?: boolean;\n cache?: boolean;\n}\n\nexport async function bundleCommand(\n options: BundleCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCommandLogger(options);\n\n // Build Docker args - start with common flags\n const dockerArgs = buildCommonDockerArgs(options);\n // Add bundle-specific flags\n if (options.flow) dockerArgs.push('--flow', options.flow);\n if (options.all) dockerArgs.push('--all');\n if (options.stats) dockerArgs.push('--stats');\n if (options.cache === false) dockerArgs.push('--no-cache');\n\n await executeCommand(\n async () => {\n try {\n // Validate flag combination\n if (options.flow && options.all) {\n throw new Error('Cannot use both --flow and --all flags together');\n }\n\n // Step 1: Read configuration file\n logger.info('📦 Reading configuration...');\n // Resolve bare names to examples directory, keep paths/URLs as-is\n const configPath = resolveAsset(options.config, 'config');\n const rawConfig = await loadJsonConfig(configPath);\n\n // Step 2: Load configuration(s) based on flags\n const configsToBundle: LoadConfigResult[] = options.all\n ? loadAllFlows(rawConfig, { configPath, logger })\n : [\n loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flow,\n logger,\n }),\n ];\n\n // Step 3: Bundle each configuration\n const results: Array<{\n flowName: string;\n success: boolean;\n stats?: unknown;\n error?: string;\n }> = [];\n\n for (const {\n flowConfig,\n buildOptions,\n flowName,\n isMultiFlow,\n } of configsToBundle) {\n try {\n // Override cache setting from CLI if provided\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // Log flow being built (for multi-flow setups)\n if (isMultiFlow || options.all) {\n logger.info(`\\n🔧 Building flow: ${flowName}`);\n } else {\n logger.info('🔧 Starting bundle process...');\n }\n\n // Run bundler\n const shouldCollectStats = options.stats || options.json;\n const stats = await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n shouldCollectStats,\n );\n\n results.push({\n flowName,\n success: true,\n stats,\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 } catch (error) {\n const errorMessage = getErrorMessage(error);\n results.push({\n flowName,\n success: false,\n error: errorMessage,\n });\n\n if (!options.all) {\n throw error; // Re-throw for single flow builds\n }\n }\n }\n\n // Step 4: Report results\n const duration = timer.end() / 1000;\n const successCount = results.filter((r) => r.success).length;\n const failureCount = results.filter((r) => !r.success).length;\n\n if (options.json) {\n // JSON output for CI/CD\n const outputLogger = createLogger({ silent: false, json: false });\n const output =\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 outputLogger.log('white', JSON.stringify(output, null, 2));\n } else {\n if (options.all) {\n logger.info(`\\n📊 Build Summary:`);\n logger.info(` Total: ${results.length}`);\n logger.success(` ✅ Success: ${successCount}`);\n if (failureCount > 0) {\n logger.error(` ❌ Failed: ${failureCount}`);\n }\n }\n\n if (failureCount === 0) {\n logger.success(\n `\\n✅ Bundle created successfully in ${timer.format()}`,\n );\n } else {\n throw new Error(`${failureCount} flow(s) failed to build`);\n }\n }\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n // JSON error output for CI/CD\n const outputLogger = createLogger({ silent: false, json: false });\n const output = createErrorOutput(errorMessage, duration);\n outputLogger.log('white', JSON.stringify(output, null, 2));\n } else {\n logger.error('❌ Bundle failed:');\n logger.error(errorMessage);\n }\n process.exit(1);\n }\n },\n 'bundle',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * High-level bundle function for programmatic usage.\n *\n * Handles configuration loading, parsing, and logger creation internally.\n *\n * @param configOrPath - Bundle configuration (Flow.Setup) or path to config file\n * @param options - Bundle options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.stats - Collect and return bundle statistics (default: false)\n * @param options.cache - Enable package caching (default: true)\n * @param options.flowName - Flow to use (required for multi-flow configs)\n * @returns Bundle statistics if stats option is true, otherwise void\n *\n * @example\n * ```typescript\n * // With Flow.Setup config object\n * await bundle({\n * version: 1,\n * flows: {\n * default: {\n * web: {},\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * destinations: { api: { code: 'destinationApi' } },\n * }\n * }\n * });\n *\n * // With config file\n * await bundle('./walker.config.json', { stats: true });\n * ```\n */\nexport async function bundle(\n configOrPath: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n stats?: boolean;\n cache?: boolean;\n flowName?: string;\n buildOverrides?: Partial<BuildOptions>;\n } = {},\n): Promise<import('./bundler').BundleStats | void> {\n // 1. Load config if path provided\n let rawConfig: unknown;\n // Use current working directory as base when config is passed as object\n let configPath = path.resolve(process.cwd(), 'walkeros.config.json');\n if (typeof configOrPath === 'string') {\n // Resolve bare names to examples directory, keep paths as-is\n configPath = resolveAsset(configOrPath, 'config');\n rawConfig = await loadJsonConfig(configPath);\n } else {\n rawConfig = configOrPath;\n }\n\n // 2. Load and resolve config using Flow.Setup format\n const { flowConfig, buildOptions } = loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flowName,\n buildOverrides: options.buildOverrides,\n });\n\n // 3. Handle cache option\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // 4. Create logger internally\n const logger = createCommandLogger(options);\n\n // 5. Call core bundler\n return await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n options.stats ?? false,\n );\n}\n","/* eslint-disable no-console */\nimport chalk from 'chalk';\nimport type { GlobalOptions } from '../types/global.js';\n\nexport interface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n}\n\nexport interface Logger {\n log: (color: string, ...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void; // Alias for warning\n error: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n gray: (...args: unknown[]) => void;\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { verbose = false, silent = false, json = false } = options;\n\n const shouldLog = !silent && !json;\n const shouldDebug = verbose && !silent && !json;\n\n return {\n log: (color: string, ...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n // Map color names to chalk functions\n const colorMap: Record<string, (text: string) => string> = {\n red: chalk.red,\n green: chalk.green,\n blue: chalk.blue,\n yellow: chalk.yellow,\n gray: chalk.gray,\n grey: chalk.gray,\n cyan: chalk.cyan,\n magenta: chalk.magenta,\n white: chalk.white,\n black: chalk.black,\n };\n const colorFn = colorMap[color];\n const coloredMessage = colorFn ? colorFn(message) : message;\n console.log(coloredMessage);\n }\n },\n\n info: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.blue(message));\n }\n },\n\n success: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.green(message));\n }\n },\n\n warning: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.yellow(message));\n }\n },\n\n warn: (...args: unknown[]) => {\n // Alias for warning\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.yellow(message));\n }\n },\n\n error: (...args: unknown[]) => {\n if (!json) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.error(chalk.red(message));\n }\n },\n\n debug: (...args: unknown[]) => {\n if (shouldDebug) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.gray(message));\n }\n },\n\n gray: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.gray(message));\n }\n },\n };\n}\n\n/**\n * Create logger from command options\n * Factory function that standardizes logger creation across commands\n *\n * @param options - Command options containing verbose, silent, and json flags\n * @returns Configured logger instance\n */\nexport function createCommandLogger(\n options: GlobalOptions & { json?: boolean },\n): Logger {\n return createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n}\n","/**\n * Timer utilities for measuring execution time\n */\n\nexport interface Timer {\n start: () => void;\n end: () => number;\n getElapsed: () => number;\n format: () => string;\n}\n\n/**\n * Create a high-precision timer\n */\nexport function createTimer(): Timer {\n let startTime = 0;\n let endTime = 0;\n\n return {\n start() {\n startTime = Date.now();\n endTime = 0;\n },\n\n end() {\n endTime = Date.now();\n return endTime - startTime;\n },\n\n getElapsed() {\n const currentTime = endTime || Date.now();\n return currentTime - startTime;\n },\n\n format() {\n const elapsed = this.getElapsed();\n return (elapsed / 1000).toFixed(2) + 's';\n },\n };\n}\n","/**\n * Output formatting utilities for CLI commands\n */\n\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 * Docker Execution Utilities\n *\n * Handles Docker container execution for CLI commands.\n */\n\nimport { spawn } from 'child_process';\nimport path from 'path';\nimport { VERSION as DOCKER_VERSION } from '@walkeros/docker';\nimport { isUrl } from '../config/utils.js';\nimport type { GlobalOptions } from '../types/global.js';\n\n// Version injected at build time via tsup define\ndeclare const __VERSION__: string;\nconst CLI_VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0';\n\n/**\n * Docker image for CLI/build tools (bundle, simulate)\n * Uses explicit version by default, can be overridden with env var\n */\nexport const CLI_DOCKER_IMAGE =\n process.env.WALKEROS_CLI_DOCKER_IMAGE || `walkeros/cli:${CLI_VERSION}`;\n\n/**\n * Docker image for production runtime (run command)\n * Uses explicit version by default, can be overridden with env var\n */\nexport const RUNTIME_DOCKER_IMAGE =\n process.env.WALKEROS_RUNTIME_DOCKER_IMAGE ||\n `walkeros/docker:${DOCKER_VERSION}`;\n\n/**\n * @deprecated Use CLI_DOCKER_IMAGE or RUNTIME_DOCKER_IMAGE instead\n */\nexport const DOCKER_IMAGE = CLI_DOCKER_IMAGE;\n\n/**\n * Build common Docker arguments from CLI options\n *\n * Extracts common flags (config, json, verbose, silent) that are shared\n * across bundle and simulate commands. Command-specific flags should be\n * added after calling this function.\n *\n * @param options - CLI options containing common flags\n * @returns Array of command-line arguments starting with config path\n */\nexport function buildCommonDockerArgs(options: {\n config: string;\n json?: boolean;\n verbose?: boolean;\n silent?: boolean;\n}): string[] {\n const args = [options.config];\n\n // Common flags\n if (options.json) args.push('--json');\n if (options.verbose) args.push('--verbose');\n if (options.silent) args.push('--silent');\n\n return args;\n}\n\n/**\n * Build Docker command for executing CLI commands\n *\n * @param command - CLI command (bundle, simulate, run)\n * @param args - Command arguments\n * @param options - Global options\n * @param configFile - Optional config file path to mount in Docker\n * @returns Docker command array\n */\nexport function buildDockerCommand(\n command: string,\n args: string[],\n options: GlobalOptions = {},\n configFile?: string,\n): string[] {\n const cwd = process.cwd();\n\n const cmd = ['docker', 'run', '--rm'];\n\n // Mount config file if provided (only for local files, not URLs)\n if (configFile && !isUrl(configFile)) {\n const configPath = path.resolve(cwd, configFile);\n\n // Mount config file at /config/flow.json (read-only, separate from workspace)\n cmd.push('-v', `${configPath}:/config/flow.json:ro`);\n\n // Update args to use container path - replace first occurrence of config file path\n args = args.map((arg) => (arg === configFile ? '/config/flow.json' : arg));\n }\n // For URLs, pass them through as-is - container will download them\n\n // Mount current directory for output files\n cmd.push('-v', `${cwd}:/workspace`);\n cmd.push('-w', '/workspace');\n\n // Add user mapping on Linux/Mac to prevent permission issues\n if (process.platform !== 'win32') {\n try {\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined && gid !== undefined) {\n cmd.push('--user', `${uid}:${gid}`);\n }\n } catch {\n // Ignore if not available\n }\n }\n\n // Pass through environment variables\n if (options.verbose) {\n cmd.push('-e', 'VERBOSE=true');\n }\n if (options.silent) {\n cmd.push('-e', 'SILENT=true');\n }\n\n // Add the Docker image (CLI tools for bundle/simulate)\n cmd.push(CLI_DOCKER_IMAGE);\n\n // Add the command and arguments\n cmd.push(command, ...args);\n\n return cmd;\n}\n\n/**\n * Execute command in Docker container\n *\n * @param command - CLI command\n * @param args - Command arguments\n * @param options - Global options\n * @param configFile - Optional config file path to mount in Docker\n * @returns Promise that resolves when command completes\n */\nexport async function executeInDocker(\n command: string,\n args: string[],\n options: GlobalOptions = {},\n configFile?: string,\n): Promise<void> {\n // Force --local execution inside container to prevent nested Docker attempts\n // Architecture: Host CLI decides environment (Docker vs local),\n // Container CLI always executes locally (no Docker-in-Docker)\n const containerArgs = [...args, '--local'];\n\n const dockerCmd = buildDockerCommand(\n command,\n containerArgs,\n options,\n configFile,\n );\n\n return new Promise((resolve, reject) => {\n const proc = spawn(dockerCmd[0], dockerCmd.slice(1), {\n stdio: options.silent ? 'ignore' : 'inherit',\n shell: false,\n });\n\n proc.on('error', (error) => {\n reject(new Error(`Docker execution failed: ${error.message}`));\n });\n\n proc.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n // Docker already logged the error via stdio inherit\n // Just exit with same code - no duplicate message\n process.exit(code || 1);\n }\n });\n });\n}\n\n/**\n * Check if Docker is available\n *\n * @returns Promise resolving to true if Docker is available\n */\nexport async function isDockerAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('docker', ['--version'], {\n stdio: 'ignore',\n });\n\n proc.on('error', () => resolve(false));\n proc.on('exit', (code) => resolve(code === 0));\n });\n}\n\n/**\n * Check if Docker image exists locally\n *\n * @param image - Docker image name\n * @returns Promise resolving to true if image exists\n */\nexport async function imageExists(\n image: string = CLI_DOCKER_IMAGE,\n): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('docker', ['image', 'inspect', image], {\n stdio: 'ignore',\n });\n\n proc.on('error', () => resolve(false));\n proc.on('exit', (code) => resolve(code === 0));\n });\n}\n\n/**\n * Build Docker command for run command (production runtime)\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to pre-built .mjs bundle (for collect mode) or custom file (for serve mode)\n * @param options - Runtime options\n * @returns Docker command array\n */\nexport function buildDockerRunCommand(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n serveName?: string;\n servePath?: string;\n } = {},\n): string[] {\n const cwd = process.cwd();\n const cmd = ['docker', 'run', '--rm'];\n\n // Set MODE environment variable\n cmd.push('-e', `MODE=${mode}`);\n\n // Mount entire dist folder for collect mode (includes bundle + shared folders)\n // Must mount to /app/dist (not /app) to preserve container's node_modules\n // This allows relative paths like ./shared/credentials/sa.json to work\n if (mode === 'collect' && flowPath) {\n const absoluteFlowPath = path.resolve(cwd, flowPath);\n const flowDir = path.dirname(absoluteFlowPath);\n const flowFile = path.basename(absoluteFlowPath);\n cmd.push('-v', `${flowDir}:/app/dist:ro`);\n cmd.push('-e', `FLOW=/app/dist/${flowFile}`);\n }\n\n // Mount custom file for serve mode\n if (mode === 'serve' && flowPath) {\n const absoluteFilePath = path.resolve(cwd, flowPath);\n cmd.push('-v', `${absoluteFilePath}:/app/bundle.mjs:ro`);\n cmd.push('-e', 'FILE_PATH=/app/bundle.mjs');\n }\n\n // Port mapping - always map port for serve mode, use default if not specified\n const port = options.port !== undefined ? options.port : 8080;\n cmd.push('-p', `${port}:${port}`);\n cmd.push('-e', `PORT=${port}`);\n\n // Host\n if (options.host) {\n cmd.push('-e', `HOST=${options.host}`);\n }\n\n // Serve name (filename in URL)\n if (options.serveName) {\n cmd.push('-e', `SERVE_NAME=${options.serveName}`);\n }\n\n // Serve path (URL directory path)\n if (options.servePath) {\n cmd.push('-e', `SERVE_PATH=${options.servePath}`);\n }\n\n // Add user mapping on Linux/Mac to prevent permission issues\n if (process.platform !== 'win32') {\n try {\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined && gid !== undefined) {\n cmd.push('--user', `${uid}:${gid}`);\n }\n } catch {\n // Ignore if not available\n }\n }\n\n // Add the runtime Docker image\n cmd.push(RUNTIME_DOCKER_IMAGE);\n\n return cmd;\n}\n\n/**\n * Execute run command in Docker container (production runtime)\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to pre-built .mjs bundle (for collect mode) or custom file (for serve mode)\n * @param options - Runtime and global options\n * @returns Promise that resolves when command completes\n */\nexport async function executeRunInDocker(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n serveName?: string;\n servePath?: string;\n silent?: boolean;\n } = {},\n): Promise<void> {\n const dockerCmd = buildDockerRunCommand(mode, flowPath, options);\n\n return new Promise((resolve, reject) => {\n const proc = spawn(dockerCmd[0], dockerCmd.slice(1), {\n stdio: options.silent ? 'ignore' : 'inherit',\n shell: false,\n });\n\n proc.on('error', (error) => {\n reject(new Error(`Docker execution failed: ${error.message}`));\n });\n\n proc.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n // Docker already logged the error via stdio inherit\n // Just exit with same code - no duplicate message\n process.exit(code || 1);\n }\n });\n });\n}\n","/**\n * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport os from 'os';\nimport { getErrorMessage } from '../core/index.js';\n\n/**\n * Check if a string is a valid URL\n *\n * @param str - String to check\n * @returns True if string is a valid HTTP/HTTPS URL\n */\nexport function isUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Download a file from a URL to a temporary location\n *\n * @param url - HTTP/HTTPS URL to download\n * @returns Path to downloaded temporary file\n * @throws Error if download fails or response is not OK\n *\n * @example\n * ```typescript\n * const tempPath = await downloadFromUrl('https://example.com/config.json')\n * // Returns: \"/tmp/walkeros-download-1647261462000-abc123.json\"\n * ```\n */\nexport async function downloadFromUrl(url: string): Promise<string> {\n if (!isUrl(url)) {\n throw new Error(`Invalid URL: ${url}`);\n }\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to download ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n // Extract filename from URL or generate one\n const urlObj = new URL(url);\n const urlFilename = path.basename(urlObj.pathname);\n const extension = path.extname(urlFilename) || '.json';\n const randomId = Math.random().toString(36).substring(2, 11);\n const filename = `walkeros-download-${Date.now()}-${randomId}${extension}`;\n\n // Write to system temp directory\n const tempPath = path.join(os.tmpdir(), filename);\n await fs.writeFile(tempPath, content, 'utf-8');\n\n return tempPath;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to download from URL: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Substitute environment variables in a string.\n *\n * @param value - String with ${VAR} placeholders\n * @returns String with environment variables substituted\n * @throws Error if environment variable is not found\n *\n * @example\n * ```typescript\n * substituteEnvVariables('${HOME}/config') // \"/Users/name/config\"\n * ```\n */\nexport function substituteEnvVariables(value: string): string {\n return value.replace(/\\${([^}]+)}/g, (_, envVar) => {\n const envValue = process.env[envVar];\n if (!envValue) {\n throw new Error(`Environment variable ${envVar} not found`);\n }\n return envValue;\n });\n}\n\n/**\n * Load and parse JSON configuration file from local path or URL.\n *\n * @param configPath - Path to JSON file or HTTP/HTTPS URL\n * @returns Parsed configuration object and cleanup function\n * @throws Error if file not found, download fails, or invalid JSON\n *\n * @example\n * ```typescript\n * // Local file\n * const config = await loadJsonConfig('./config.json')\n *\n * // Remote URL\n * const config = await loadJsonConfig('https://example.com/config.json')\n * ```\n */\nexport async function loadJsonConfig<T>(configPath: string): Promise<T> {\n let absolutePath: string;\n let isTemporary = false;\n\n // Check if input is a URL\n if (isUrl(configPath)) {\n // Download from URL to temp location\n absolutePath = await downloadFromUrl(configPath);\n isTemporary = true;\n } else {\n // Local file path\n absolutePath = path.resolve(configPath);\n\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(`Configuration file not found: ${absolutePath}`);\n }\n }\n\n try {\n const rawConfig = await fs.readJson(absolutePath);\n return rawConfig as T;\n } catch (error) {\n throw new Error(\n `Invalid JSON in config file: ${configPath}. ${error instanceof Error ? error.message : error}`,\n );\n } finally {\n // Clean up temporary downloaded file\n if (isTemporary) {\n try {\n await fs.remove(absolutePath);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n\n/**\n * Generate a unique temporary directory path.\n *\n * @param tempDir - Base temporary directory (default: \".tmp\")\n * @returns Absolute path to unique temp directory\n *\n * @example\n * ```typescript\n * getTempDir() // \"/workspaces/project/.tmp/cli-1647261462000-abc123\"\n * getTempDir('/tmp') // \"/tmp/cli-1647261462000-abc123\"\n * ```\n */\nexport function getTempDir(tempDir = '.tmp'): string {\n const randomId = Math.random().toString(36).substring(2, 11);\n const basePath = path.isAbsolute(tempDir)\n ? tempDir\n : path.join(process.cwd(), tempDir);\n return path.join(basePath, `cli-${Date.now()}-${randomId}`);\n}\n\n/**\n * Load JSON from inline string, file path, or URL.\n *\n * Supports three input formats:\n * 1. Inline JSON string - parsed directly\n * 2. Local file path - read and parsed\n * 3. HTTP/HTTPS URL - downloaded and parsed\n *\n * Detection priority:\n * 1. URL (http://, https://) → download and parse\n * 2. Existing file path → read and parse\n * 3. Valid JSON string → parse directly\n * 4. Simple string → treat as {name: string} for backward compatibility\n *\n * @param source - JSON string, file path, or URL\n * @param options - Optional configuration\n * @param options.name - Parameter name for error messages (e.g., \"event\", \"config\")\n * @param options.required - Throw error if source is empty (default: false)\n * @param options.fallback - Default value if source is empty\n * @returns Parsed JSON object\n * @throws Error if source is required but empty, or if loading/parsing fails\n *\n * @example\n * ```typescript\n * // Inline JSON\n * await loadJsonFromSource('{\"name\":\"order complete\",\"data\":{}}')\n *\n * // File path\n * await loadJsonFromSource('./examples/event.json')\n *\n * // URL\n * await loadJsonFromSource('https://example.com/event.json')\n *\n * // With options\n * await loadJsonFromSource(input, {\n * name: 'event',\n * required: true,\n * fallback: { name: 'default' }\n * })\n * ```\n */\nexport async function loadJsonFromSource<T = unknown>(\n source: string | undefined,\n options?: {\n name?: string;\n required?: boolean;\n fallback?: T;\n },\n): Promise<T> {\n const paramName = options?.name || 'input';\n\n // Handle empty/undefined input\n if (!source || source.trim() === '') {\n if (options?.required) {\n throw new Error(`${paramName} is required`);\n }\n if (options?.fallback !== undefined) {\n return options.fallback;\n }\n return {} as T;\n }\n\n const trimmedSource = source.trim();\n\n // 1. Check if URL\n if (isUrl(trimmedSource)) {\n try {\n const tempPath = await downloadFromUrl(trimmedSource);\n try {\n const data = await fs.readJson(tempPath);\n return data as T;\n } finally {\n // Clean up temp file\n try {\n await fs.remove(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n }\n } catch (error) {\n throw new Error(\n `Failed to load ${paramName} from URL ${trimmedSource}: ${getErrorMessage(error)}`,\n );\n }\n }\n\n // 2. Check if file path exists\n const resolvedPath = path.resolve(trimmedSource);\n if (await fs.pathExists(resolvedPath)) {\n try {\n const data = await fs.readJson(resolvedPath);\n return data as T;\n } catch (error) {\n throw new Error(\n `Failed to parse ${paramName} from file ${trimmedSource}: ${getErrorMessage(error)}`,\n );\n }\n }\n\n // 3. Try to parse as inline JSON\n try {\n const parsed = JSON.parse(trimmedSource);\n return parsed as T;\n } catch (jsonError) {\n // 4. Fallback: treat as event name string for backward compatibility\n // This allows simple strings like \"page view\" to work\n if (!trimmedSource.startsWith('{') && !trimmedSource.startsWith('[')) {\n return { name: trimmedSource } as T;\n }\n\n // If it looks like JSON but failed to parse, throw helpful error\n throw new Error(\n `Failed to parse ${paramName}. Input appears to be JSON but contains errors: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`,\n );\n }\n}\n","/**\n * Execution Mode Handler\n *\n * Determines whether to execute commands locally or in Docker.\n */\n\nimport type { GlobalOptions } from '../types/global.js';\nimport {\n executeInDocker,\n executeRunInDocker,\n isDockerAvailable,\n} from './docker.js';\nimport type { Logger } from './logger.js';\n\n/**\n * Execution mode\n */\nexport type ExecutionMode = 'local' | 'docker';\n\n/**\n * Get execution mode from options\n *\n * @param options - Global options\n * @returns Execution mode\n */\nexport function getExecutionMode(options: GlobalOptions): ExecutionMode {\n // Force local mode if:\n // 1. --local flag is provided, OR\n // 2. Running inside a Docker container (WALKEROS_CONTAINER env var)\n if (options.local || process.env.WALKEROS_CONTAINER === 'true') {\n return 'local';\n }\n return 'docker';\n}\n\n/**\n * Execute command handler type\n */\nexport type ExecuteHandler = () => Promise<void>;\n\n/**\n * Execute command based on mode\n *\n * @param localHandler - Function to execute locally\n * @param dockerCommand - Docker command name\n * @param dockerArgs - Docker command arguments\n * @param options - Global options\n * @param logger - Logger instance\n * @param configFile - Optional config file path to mount in Docker\n */\nexport async function executeCommand(\n localHandler: ExecuteHandler,\n dockerCommand: string,\n dockerArgs: string[],\n options: GlobalOptions,\n logger?: Logger,\n configFile?: string,\n): Promise<void> {\n const mode = getExecutionMode(options);\n\n // Handle dry-run\n if (options.dryRun) {\n if (mode === 'docker') {\n const cmd = `docker run walkeros/cli:latest ${dockerCommand} ${dockerArgs.join(' ')}`;\n logger?.info(`[DRY-RUN] Would execute: ${cmd}`);\n } else {\n logger?.info(\n `[DRY-RUN] Would execute locally: ${dockerCommand} ${dockerArgs.join(' ')}`,\n );\n }\n return;\n }\n\n // Execute based on mode\n if (mode === 'local') {\n if (logger && !options.silent) {\n logger.info('🖥️ Executing locally...');\n }\n await localHandler();\n } else {\n // Docker mode\n const dockerAvailable = await isDockerAvailable();\n if (!dockerAvailable) {\n throw new Error(\n 'Docker is not available. Please install Docker or use --local flag to execute locally.',\n );\n }\n\n if (logger && !options.silent) {\n logger.info('🐳 Executing in Docker container...');\n }\n await executeInDocker(dockerCommand, dockerArgs, options, configFile);\n }\n}\n","/**\n * Unified Temporary Directory Manager\n *\n * Manages temporary directories for CLI operations using hash-based naming.\n * This provides a single location for all temp files per operation, making\n * cleanup simple and Docker mounting straightforward.\n */\n\nimport { getHashServer } from '@walkeros/server-core';\nimport path from 'path';\nimport fs from 'fs-extra';\n\nexport interface TempDirPaths {\n root: string;\n nodeModules: string;\n cache: string;\n bundle: string;\n entry: string;\n}\n\n/**\n * Manages a unified temporary directory structure for CLI operations\n */\nexport class TempDirManager {\n private hash: string;\n public readonly paths: TempDirPaths;\n\n /**\n * Create a new TempDirManager with hash-based directory naming\n *\n * @param configPath - Path to the config file (used in hash)\n * @param operation - Operation type ('bundle' | 'simulate')\n * @param timestamp - Optional timestamp for uniqueness (defaults to Date.now())\n */\n static async create(\n configPath: string,\n operation: 'bundle' | 'simulate',\n timestamp?: number,\n ): Promise<TempDirManager> {\n const ts = timestamp || Date.now();\n const hash = await getHashServer(`${configPath}:${operation}:${ts}`, 12);\n return new TempDirManager(hash);\n }\n\n constructor(hash: string) {\n this.hash = hash;\n const root = path.join('.tmp', `walkeros-${hash}`);\n\n this.paths = {\n root,\n nodeModules: path.join(root, 'node_modules'),\n cache: path.join(root, 'cache'),\n bundle: path.join(root, 'bundle.js'),\n entry: path.join(root, 'entry.js'),\n };\n }\n\n /**\n * Initialize the temporary directory structure\n */\n async initialize(): Promise<void> {\n await fs.ensureDir(this.paths.root);\n await fs.ensureDir(this.paths.nodeModules);\n await fs.ensureDir(this.paths.cache);\n }\n\n /**\n * Clean up the temporary directory\n */\n async cleanup(): Promise<void> {\n await fs.remove(this.paths.root);\n }\n\n /**\n * Get the hash used for this temp directory\n */\n getHash(): string {\n return this.hash;\n }\n\n /**\n * Get a path within the temp directory\n */\n getPath(...parts: string[]): string {\n return path.join(this.paths.root, ...parts);\n }\n\n /**\n * Check if the temp directory exists\n */\n async exists(): Promise<boolean> {\n return fs.pathExists(this.paths.root);\n }\n}\n","/**\n * Asset Resolver\n *\n * Unified path resolution for package assets (examples) and user assets.\n * Assets are always siblings to the CLI entry point (in dist/ for production).\n */\n\nimport { fileURLToPath } from 'url';\nimport { existsSync } from 'fs';\nimport path from 'path';\n\n/**\n * Cached asset directory to avoid repeated filesystem checks\n */\nlet cachedAssetDir: string | undefined;\n\n/**\n * Get the directory containing CLI assets (examples).\n *\n * In production: assets are in dist/ alongside the bundled CLI\n * In development: assets are at package root\n *\n * @returns Absolute path to assets directory\n */\nexport function getAssetDir(): string {\n if (cachedAssetDir) return cachedAssetDir;\n\n const currentFile = fileURLToPath(import.meta.url);\n let dir = path.dirname(currentFile);\n\n // Walk up until we find a directory with examples/ sibling\n while (dir !== path.dirname(dir)) {\n if (existsSync(path.join(dir, 'examples'))) {\n cachedAssetDir = dir;\n return dir;\n }\n dir = path.dirname(dir);\n }\n\n // Fallback to current file's directory (shouldn't happen if build is correct)\n cachedAssetDir = path.dirname(currentFile);\n return cachedAssetDir;\n}\n\n/**\n * Asset type for resolution strategy\n */\nexport type AssetType = 'config' | 'bundle';\n\n/**\n * Resolve asset path using unified strategy\n *\n * Resolution rules:\n * 1. Bare names (no / or \\) → Package asset (examples)\n * 2. Relative paths (./ or ../) → User asset relative to base directory\n * 3. Absolute paths → Use as-is\n *\n * @param assetPath - Path to resolve\n * @param assetType - Type of asset (determines package subdirectory)\n * @param baseDir - Base directory for relative paths (defaults to cwd)\n * @returns Absolute path to asset\n */\nexport function resolveAsset(\n assetPath: string,\n assetType: AssetType,\n baseDir?: string,\n): string {\n // Bare name → package asset (examples directory)\n if (!assetPath.includes('/') && !assetPath.includes('\\\\')) {\n const assetDir = getAssetDir();\n return path.join(assetDir, 'examples', assetPath);\n }\n\n // Absolute path → use as-is\n if (path.isAbsolute(assetPath)) {\n return assetPath;\n }\n\n // Relative path → resolve from base directory\n return path.resolve(baseDir || process.cwd(), assetPath);\n}\n","/**\n * Utility functions for the CLI package\n */\n\n/**\n * Extract error message from unknown error type\n * @param error - Unknown error object\n * @returns Error message as string\n */\nexport function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Logger } from './logger.js';\n\nexport interface LocalPackageInfo {\n name: string;\n absolutePath: string;\n distPath: string;\n hasDistFolder: boolean;\n}\n\n/**\n * Resolve and validate a local package path\n */\nexport async function resolveLocalPackage(\n packageName: string,\n localPath: string,\n configDir: string,\n logger: Logger,\n): Promise<LocalPackageInfo> {\n // Resolve relative to config file directory\n const absolutePath = path.isAbsolute(localPath)\n ? localPath\n : path.resolve(configDir, localPath);\n\n // Validate path exists\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(\n `Local package path not found: ${localPath} (resolved to ${absolutePath})`,\n );\n }\n\n // Validate package.json exists\n const pkgJsonPath = path.join(absolutePath, 'package.json');\n if (!(await fs.pathExists(pkgJsonPath))) {\n throw new Error(\n `No package.json found at ${absolutePath}. Is this a valid package directory?`,\n );\n }\n\n // Check for dist folder\n const distPath = path.join(absolutePath, 'dist');\n const hasDistFolder = await fs.pathExists(distPath);\n\n if (!hasDistFolder) {\n logger.warn(\n `⚠️ ${packageName}: No dist/ folder found. Using package root.`,\n );\n }\n\n return {\n name: packageName,\n absolutePath,\n distPath: hasDistFolder ? distPath : absolutePath,\n hasDistFolder,\n };\n}\n\n/**\n * Copy local package to target node_modules directory\n *\n * Copies package.json and dist/ folder to preserve the package structure\n * expected by module resolution (package.json exports reference ./dist/...)\n */\nexport async function copyLocalPackage(\n localPkg: LocalPackageInfo,\n targetDir: string,\n logger: Logger,\n): Promise<string> {\n const packageDir = path.join(targetDir, 'node_modules', localPkg.name);\n\n await fs.ensureDir(path.dirname(packageDir));\n\n // Always copy package.json for module resolution\n await fs.copy(\n path.join(localPkg.absolutePath, 'package.json'),\n path.join(packageDir, 'package.json'),\n );\n\n // Copy dist folder AS dist folder (preserving structure for exports like ./dist/index.mjs)\n if (localPkg.hasDistFolder) {\n await fs.copy(localPkg.distPath, path.join(packageDir, 'dist'));\n } else {\n // No dist folder - copy package root contents (excluding node_modules, etc.)\n const entries = await fs.readdir(localPkg.absolutePath);\n for (const entry of entries) {\n if (!['node_modules', '.turbo', '.git'].includes(entry)) {\n await fs.copy(\n path.join(localPkg.absolutePath, entry),\n path.join(packageDir, entry),\n );\n }\n }\n }\n\n logger.info(`📦 Using local: ${localPkg.name} from ${localPkg.absolutePath}`);\n\n return packageDir;\n}\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n * Uses Zod schemas from @walkeros/core for Flow.Setup validation.\n */\n\nimport type { Flow } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\n\nconst { safeParseSetup } = schemas;\n\n/**\n * Type guard: Check if value is a plain object.\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Detect platform from flow config.\n *\n * Platform is determined by the presence of `web` or `server` key.\n */\nexport function detectPlatform(\n flowConfig: Record<string, unknown>,\n): 'web' | 'server' | undefined {\n if ('web' in flowConfig && flowConfig.web !== undefined) {\n return 'web';\n }\n if ('server' in flowConfig && flowConfig.server !== undefined) {\n return 'server';\n }\n return undefined;\n}\n\n/**\n * Type guard: Check if config is a valid Flow.Setup structure.\n *\n * @remarks\n * Uses Zod validation from @walkeros/core.\n * Returns false instead of throwing on invalid input.\n *\n * @example\n * ```typescript\n * if (isFlowSetup(config)) {\n * const flowConfig = getFlowConfig(config, 'production');\n * }\n * ```\n */\nexport function isFlowSetup(data: unknown): data is Flow.Setup {\n const result = safeParseSetup(data);\n return result.success;\n}\n\n/**\n * Validate Flow.Setup and throw descriptive error if invalid.\n *\n * @remarks\n * Uses Zod validation from @walkeros/core.\n * Provides detailed error messages from Zod.\n *\n * @param data - Raw configuration data\n * @returns Validated Flow.Setup\n * @throws Error with descriptive message if validation fails\n */\nexport function validateFlowSetup(data: unknown): Flow.Setup {\n const result = safeParseSetup(data);\n\n if (!result.success) {\n // Format Zod errors for CLI display\n const errors = result.error.issues\n .map((issue) => {\n const path =\n issue.path.length > 0 ? issue.path.map(String).join('.') : 'root';\n return ` - ${path}: ${issue.message}`;\n })\n .join('\\n');\n\n throw new Error(`Invalid configuration:\\n${errors}`);\n }\n\n // Cast to Flow.Setup since Zod's inferred type is compatible but not identical\n return result.data as Flow.Setup;\n}\n\n/**\n * Get available flow names from a Flow.Setup.\n *\n * @param setup - Flow.Setup configuration\n * @returns Array of flow names\n */\nexport function getAvailableFlows(setup: Flow.Setup): string[] {\n return Object.keys(setup.flows);\n}\n","/**\n * Static Build Defaults\n *\n * Platform-specific build defaults for CLI bundling.\n * Build options are CLI concerns, separate from Flow configuration.\n */\n\nimport type { BuildOptions } from '../types/bundle.js';\n\n/**\n * Build defaults for web platform (browser bundles).\n *\n * @remarks\n * These settings produce browser-compatible IIFE bundles.\n */\nexport const WEB_BUILD_DEFAULTS: Omit<BuildOptions, 'output' | 'packages'> = {\n format: 'iife',\n platform: 'browser',\n target: 'es2020',\n minify: true,\n sourcemap: false,\n cache: true,\n tempDir: '.tmp',\n windowCollector: 'collector',\n windowElb: 'elb',\n};\n\n/**\n * Build defaults for server platform (Node.js bundles).\n *\n * @remarks\n * These settings produce Node.js-compatible ESM bundles.\n */\nexport const SERVER_BUILD_DEFAULTS: Omit<BuildOptions, 'output' | 'packages'> =\n {\n format: 'esm',\n platform: 'node',\n target: 'node20',\n minify: true,\n sourcemap: false,\n cache: true,\n tempDir: '.tmp',\n };\n\n/**\n * Default output paths by platform.\n */\nexport const DEFAULT_OUTPUT_PATHS = {\n web: './dist/walker.js',\n server: './dist/bundle.mjs',\n} as const;\n\n/**\n * Get build defaults for a platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @returns Platform-specific build defaults\n *\n * @example\n * ```typescript\n * const defaults = getBuildDefaults('web');\n * // { format: 'iife', platform: 'browser', ... }\n * ```\n */\nexport function getBuildDefaults(\n platform: 'web' | 'server',\n): Omit<BuildOptions, 'output' | 'packages'> {\n return platform === 'web' ? WEB_BUILD_DEFAULTS : SERVER_BUILD_DEFAULTS;\n}\n\n/**\n * Get default output path for a platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @returns Default output file path\n */\nexport function getDefaultOutput(platform: 'web' | 'server'): string {\n return DEFAULT_OUTPUT_PATHS[platform];\n}\n","/**\n * Configuration Loader\n *\n * Loads and parses Flow.Setup configurations using core getFlowConfig().\n * Build options are determined by static platform defaults.\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { getFlowConfig, getPlatform, type Flow } from '@walkeros/core';\nimport type { BuildOptions } from '../types/bundle.js';\nimport {\n validateFlowSetup,\n isFlowSetup,\n getAvailableFlows as getFlowNames,\n} from './validators.js';\nimport { getBuildDefaults, getDefaultOutput } from './build-defaults.js';\n\n/** Default folder for includes if it exists */\nconst DEFAULT_INCLUDE_FOLDER = './shared';\n\n/**\n * Result of configuration loading.\n */\nexport interface LoadConfigResult {\n /** Runtime event processing configuration */\n flowConfig: Flow.Config;\n /** Build-time configuration */\n buildOptions: BuildOptions;\n /** Name of the selected flow */\n flowName: string;\n /** Whether multiple flows are available */\n isMultiFlow: boolean;\n /** All available flow names */\n availableFlows: string[];\n}\n\n/**\n * Options for loading configuration.\n */\nexport interface LoadConfigOptions {\n /** Path to config file */\n configPath: string;\n /** Flow name to load (required for multi-flow, optional for single-flow) */\n flowName?: string;\n /** CLI build overrides (future: --output, --minify, etc.) */\n buildOverrides?: Partial<BuildOptions>;\n /** Logger for warnings */\n logger?: {\n warn: (message: string) => void;\n info: (message: string) => void;\n };\n}\n\n/**\n * Load and parse bundle configuration.\n *\n * @remarks\n * Uses Flow.Setup from @walkeros/core as the only config format.\n * - Validates config structure\n * - Uses core getFlowConfig() for variable/definition resolution\n * - Determines platform from resolved config\n * - Applies static build defaults based on platform\n *\n * @param rawConfig - Raw configuration object from JSON file\n * @param options - Loading options\n * @returns Parsed configuration with flow and build separated\n *\n * @example\n * ```typescript\n * const config = loadBundleConfig(rawConfig, {\n * configPath: './walkeros.config.json',\n * flowName: 'production',\n * });\n * ```\n */\nexport function loadBundleConfig(\n rawConfig: unknown,\n options: LoadConfigOptions,\n): LoadConfigResult {\n // Validate as Flow.Setup\n const setup = validateFlowSetup(rawConfig);\n const availableFlows = getFlowNames(setup);\n\n // Determine which flow to use\n const flowName = resolveFlow(setup, options.flowName, availableFlows);\n\n // Use core getFlowConfig() for resolution (variables, $refs, cascading)\n const flowConfig = getFlowConfig(setup, flowName);\n\n // Detect platform from resolved config\n const platform = getPlatform(flowConfig);\n if (!platform) {\n throw new Error(\n `Invalid configuration: flow \"${flowName}\" must have a \"web\" or \"server\" key.`,\n );\n }\n\n // Get static build defaults based on platform\n const buildDefaults = getBuildDefaults(platform);\n\n // Extract packages from flowConfig (if present)\n const packages = flowConfig.packages || {};\n\n // Resolve output path relative to config directory\n let output = getDefaultOutput(platform);\n if (options.buildOverrides?.output) {\n output = options.buildOverrides.output;\n }\n\n // Get config directory for relative path resolution\n const configDir = path.dirname(options.configPath);\n\n // Make output path absolute relative to config file\n if (!path.isAbsolute(output)) {\n output = path.resolve(configDir, output);\n }\n\n // Get includes from config or use default if ./shared exists\n let includes = setup.include;\n if (!includes) {\n const defaultIncludePath = path.resolve(configDir, DEFAULT_INCLUDE_FOLDER);\n if (fs.pathExistsSync(defaultIncludePath)) {\n includes = [DEFAULT_INCLUDE_FOLDER];\n }\n }\n\n // Merge build options: defaults + CLI overrides\n const buildOptions: BuildOptions = {\n ...buildDefaults,\n packages,\n output,\n include: includes,\n configDir,\n ...options.buildOverrides,\n };\n\n // Log flow selection\n const isMultiFlow = availableFlows.length > 1;\n if (isMultiFlow && options.logger) {\n options.logger.info(\n `📦 Using flow: ${flowName} (${availableFlows.length} total)`,\n );\n }\n\n return {\n flowConfig,\n buildOptions,\n flowName,\n isMultiFlow,\n availableFlows,\n };\n}\n\n/**\n * Resolve which flow to use.\n *\n * @param setup - Flow.Setup configuration\n * @param requestedFlow - Flow name from CLI (optional)\n * @param available - Available flow names\n * @returns Flow name to use\n * @throws Error if flow selection is invalid\n */\nfunction resolveFlow(\n setup: Flow.Setup,\n requestedFlow: string | undefined,\n available: string[],\n): string {\n // If only one flow, use it automatically\n if (available.length === 1) {\n return available[0];\n }\n\n // Multiple flows require explicit selection\n if (!requestedFlow) {\n throw new Error(\n `Multiple flows found. Please specify a flow using --flow flag.\\n` +\n `Available flows: ${available.join(', ')}`,\n );\n }\n\n // Validate the requested flow exists\n if (!available.includes(requestedFlow)) {\n throw new Error(\n `Flow \"${requestedFlow}\" not found in configuration.\\n` +\n `Available flows: ${available.join(', ')}`,\n );\n }\n\n return requestedFlow;\n}\n\n/**\n * Load all flows from a configuration.\n *\n * @remarks\n * Used by the --all flag to build all flows.\n *\n * @param rawConfig - Raw configuration object\n * @param options - Loading options (without flowName)\n * @returns Array of loaded configurations for all flows\n */\nexport function loadAllFlows(\n rawConfig: unknown,\n options: Omit<LoadConfigOptions, 'flowName'>,\n): LoadConfigResult[] {\n // Validate as Flow.Setup\n const setup = validateFlowSetup(rawConfig);\n const flows = getFlowNames(setup);\n\n if (options.logger) {\n options.logger.info(\n `📦 Loading all ${flows.length} flows: ${flows.join(', ')}`,\n );\n }\n\n // Load each flow\n return flows.map((name) =>\n loadBundleConfig(rawConfig, {\n ...options,\n flowName: name,\n }),\n );\n}\n\n/**\n * Get list of available flows from configuration.\n *\n * @param rawConfig - Raw configuration object\n * @returns Array of flow names\n */\nexport function getAvailableFlows(rawConfig: unknown): string[] {\n if (isFlowSetup(rawConfig)) {\n return getFlowNames(rawConfig);\n }\n return [];\n}\n","import esbuild from 'esbuild';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { packageNameToVariable } from '@walkeros/core';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { downloadPackages } from './package-manager.js';\nimport type { Logger } from '../../core/index.js';\nimport { getTempDir } from '../../config/index.js';\nimport {\n isBuildCached,\n getCachedBuild,\n cacheBuild,\n} from '../../core/build-cache.js';\n\nexport interface BundleStats {\n totalSize: number;\n packages: { name: string; size: number }[];\n buildTime: number;\n treeshakingEffective: boolean;\n}\n\n/**\n * Copy included folders to output directory.\n * Used to make credential files and other assets available alongside the bundle.\n */\nasync function copyIncludes(\n includes: string[],\n sourceDir: string,\n outputDir: string,\n logger: Logger,\n): Promise<void> {\n for (const include of includes) {\n const sourcePath = path.resolve(sourceDir, include);\n const folderName = path.basename(include);\n const destPath = path.join(outputDir, folderName);\n\n if (await fs.pathExists(sourcePath)) {\n await fs.copy(sourcePath, destPath);\n logger.debug(`Copied ${include} to output`);\n // TODO: Add logging for copied folders\n } else {\n logger.debug(`Include folder not found: ${include}`);\n // TODO: Add logging for skipped folders (not found)\n }\n }\n}\n\n/**\n * Generate cache key content from flow config and build options.\n * Excludes non-deterministic fields (tempDir, output) from cache key.\n */\nfunction generateCacheKeyContent(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n): string {\n const configForCache = {\n flow: flowConfig,\n build: {\n ...buildOptions,\n // Exclude non-deterministic fields from cache key\n tempDir: undefined,\n output: undefined,\n },\n };\n return JSON.stringify(configForCache);\n}\n\nexport async function bundleCore(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n logger: Logger,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n // Only generate a new temp dir if one isn't explicitly provided\n // This allows simulator to share its temp dir with the bundler\n // Ensure TEMP_DIR is always absolute (esbuild requirement)\n const TEMP_DIR = buildOptions.tempDir\n ? path.isAbsolute(buildOptions.tempDir)\n ? buildOptions.tempDir\n : path.resolve(buildOptions.tempDir)\n : getTempDir();\n\n // Check build cache if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowConfig, buildOptions);\n\n const cached = await isBuildCached(configContent);\n if (cached) {\n const cachedBuild = await getCachedBuild(configContent);\n if (cachedBuild) {\n logger.info('✨ Using cached build');\n\n // Write cached build to output\n const outputPath = path.resolve(buildOptions.output);\n await fs.ensureDir(path.dirname(outputPath));\n await fs.writeFile(outputPath, cachedBuild);\n\n logger.gray(`Output: ${outputPath}`);\n logger.success('✅ Build completed (from cache)');\n\n // Return stats if requested\n if (showStats) {\n const stats = await fs.stat(outputPath);\n // Generate basic package stats from buildOptions\n const packageStats = Object.entries(buildOptions.packages).map(\n ([name, pkg]) => ({\n name: `${name}@${pkg.version || 'latest'}`,\n size: 0, // Size estimation not available for cached builds\n }),\n );\n return {\n totalSize: stats.size,\n packages: packageStats,\n buildTime: Date.now() - bundleStartTime,\n treeshakingEffective: true,\n };\n }\n return;\n }\n }\n }\n\n try {\n // Step 1: Prepare temporary directory\n // Only clean if we created a new temp dir (don't clean shared simulator temp)\n if (!buildOptions.tempDir) {\n await fs.emptyDir(TEMP_DIR);\n }\n logger.debug('Cleaned temporary directory');\n\n // Step 2: Download packages\n logger.info('📥 Downloading packages...');\n // Convert packages object to array format expected by downloadPackages\n const packagesArray = Object.entries(buildOptions.packages).map(\n ([name, packageConfig]) => ({\n name,\n version: packageConfig.version || 'latest',\n path: packageConfig.path, // Pass local path if defined\n }),\n );\n // downloadPackages adds 'node_modules' subdirectory automatically\n const packagePaths = await downloadPackages(\n packagesArray,\n TEMP_DIR,\n logger,\n buildOptions.cache,\n buildOptions.configDir, // For resolving relative local paths\n );\n\n // Fix @walkeros packages to have proper ESM exports\n // This ensures Node resolves to .mjs files instead of .js (CJS)\n for (const [pkgName, pkgPath] of packagePaths.entries()) {\n if (pkgName.startsWith('@walkeros/')) {\n const pkgJsonPath = path.join(pkgPath, 'package.json');\n const pkgJson = await fs.readJSON(pkgJsonPath);\n\n // Add exports field to force ESM resolution\n if (!pkgJson.exports && pkgJson.module) {\n pkgJson.exports = {\n '.': {\n import: pkgJson.module,\n require: pkgJson.main,\n },\n };\n await fs.writeJSON(pkgJsonPath, pkgJson, { spaces: 2 });\n }\n }\n }\n\n // Step 3: Create package.json to enable ESM in temp directory\n // This ensures Node treats all .js files as ESM and resolves @walkeros packages correctly\n const packageJsonPath = path.join(TEMP_DIR, 'package.json');\n await fs.writeFile(\n packageJsonPath,\n JSON.stringify({ type: 'module' }, null, 2),\n );\n\n // Step 4: Create entry point\n logger.info('📝 Creating entry point...');\n const entryContent = await createEntryPoint(\n flowConfig,\n buildOptions,\n packagePaths,\n );\n const entryPath = path.join(TEMP_DIR, 'entry.js');\n await fs.writeFile(entryPath, entryContent);\n\n // Step 4: Bundle with esbuild\n logger.info('⚡ Bundling with esbuild...');\n const outputPath = path.resolve(buildOptions.output);\n\n // Ensure output directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n const esbuildOptions = createEsbuildOptions(\n buildOptions,\n entryPath,\n outputPath,\n TEMP_DIR,\n packagePaths,\n logger,\n );\n\n try {\n await esbuild.build(esbuildOptions);\n } catch (buildError) {\n // Enhanced error handling for build failures\n throw createBuildError(\n buildError as EsbuildError,\n buildOptions.code || '',\n );\n }\n\n logger.gray(`Output: ${outputPath}`);\n\n // Step 5: Cache the build result if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowConfig, buildOptions);\n const buildOutput = await fs.readFile(outputPath, 'utf-8');\n await cacheBuild(configContent, buildOutput);\n logger.debug('Build cached for future use');\n }\n\n // Step 6: Collect stats if requested\n let stats: BundleStats | undefined;\n if (showStats) {\n stats = await collectBundleStats(\n outputPath,\n buildOptions.packages,\n bundleStartTime,\n entryContent,\n );\n }\n\n // Step 7: Copy included folders to output directory\n if (buildOptions.include && buildOptions.include.length > 0) {\n const outputDir = path.dirname(outputPath);\n await copyIncludes(\n buildOptions.include,\n buildOptions.configDir || process.cwd(),\n outputDir,\n logger,\n );\n }\n\n // Step 8: Cleanup\n // Only cleanup if we created our own temp dir (not shared with simulator)\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR);\n logger.debug('Cleaned up temporary files');\n }\n\n return stats;\n } catch (error) {\n // Cleanup on error (only if we created our own temp dir)\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR).catch(() => {});\n }\n throw error;\n }\n}\n\nasync function collectBundleStats(\n outputPath: string,\n packages: BuildOptions['packages'],\n startTime: number,\n entryContent: string,\n): Promise<BundleStats> {\n const stats = await fs.stat(outputPath);\n const totalSize = stats.size;\n const buildTime = Date.now() - startTime;\n\n // Estimate package sizes by analyzing imports in entry content\n const packageStats = Object.entries(packages).map(([name, pkg]) => {\n const importPattern = new RegExp(`from\\\\s+['\"]${name}['\"]`, 'g');\n const namedImportPattern = new RegExp(\n `import\\\\s+\\\\{[^}]*\\\\}\\\\s+from\\\\s+['\"]${name}['\"]`,\n 'g',\n );\n const hasImports =\n importPattern.test(entryContent) || namedImportPattern.test(entryContent);\n\n // Rough estimation: if package is imported, assign proportional size\n const packagesCount = Object.keys(packages).length;\n const estimatedSize = hasImports\n ? Math.floor(totalSize / packagesCount)\n : 0;\n\n return {\n name: `${name}@${pkg.version || 'latest'}`,\n size: estimatedSize,\n };\n });\n\n // Tree-shaking is effective if we use named imports (not wildcard imports)\n const hasWildcardImports = /import\\s+\\*\\s+as\\s+\\w+\\s+from/.test(entryContent);\n const treeshakingEffective = !hasWildcardImports;\n\n return {\n totalSize,\n packages: packageStats,\n buildTime,\n treeshakingEffective,\n };\n}\n\nfunction createEsbuildOptions(\n buildOptions: BuildOptions,\n entryPath: string,\n outputPath: string,\n tempDir: string,\n packagePaths: Map<string, string>,\n logger: Logger,\n): esbuild.BuildOptions {\n // Don't use aliases - they cause esbuild to bundle even external packages\n // Instead, use absWorkingDir to point to temp directory where node_modules is\n const alias: Record<string, string> = {};\n\n const baseOptions: esbuild.BuildOptions = {\n entryPoints: [entryPath],\n bundle: true,\n format: buildOptions.format as esbuild.Format,\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n absWorkingDir: tempDir, // Resolve modules from temp directory\n // alias removed - not needed with absWorkingDir\n mainFields: ['module', 'main'], // Prefer ESM over CJS\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\n sourcemap: buildOptions.sourcemap,\n resolveExtensions: ['.mjs', '.js', '.ts', '.json'], // Prefer .mjs\n\n // Enhanced minification options when minify is enabled\n ...(buildOptions.minify && {\n minifyWhitespace: buildOptions.minifyOptions?.whitespace ?? true,\n minifyIdentifiers: buildOptions.minifyOptions?.identifiers ?? true,\n minifySyntax: buildOptions.minifyOptions?.syntax ?? true,\n legalComments: buildOptions.minifyOptions?.legalComments ?? 'none',\n keepNames: buildOptions.minifyOptions?.keepNames ?? false,\n charset: 'utf8',\n }),\n };\n\n // Platform-specific configurations\n if (buildOptions.platform === 'browser') {\n baseOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n // For browser bundles, let users handle Node.js built-ins as needed\n baseOptions.external = buildOptions.external || [];\n } else if (buildOptions.platform === 'node') {\n // For Node.js bundles, mark Node built-ins as external\n const nodeBuiltins = [\n 'crypto',\n 'fs',\n 'path',\n 'os',\n 'util',\n 'stream',\n 'buffer',\n 'events',\n 'http',\n 'https',\n 'url',\n 'querystring',\n 'zlib',\n ];\n // Mark runtime dependencies as external\n // These packages are installed in the Docker container and should not be bundled\n // - express/cors: Runtime dependencies for server sources\n // Note: zod is bundled inline via @walkeros/core (not marked external)\n // Use wildcard patterns to match both ESM and CJS imports\n const npmPackages = ['express', 'express/*', 'cors', 'cors/*'];\n // All downloaded @walkeros packages will be bundled into the output\n // Only Node.js built-ins and runtime server packages (express/cors) are marked external\n baseOptions.external = buildOptions.external\n ? [...nodeBuiltins, ...npmPackages, ...buildOptions.external]\n : [...nodeBuiltins, ...npmPackages];\n\n // Add createRequire shim for ESM bundles with CJS external dependencies\n // This allows require() calls generated by esbuild to work in ESM context\n if (buildOptions.format === 'esm') {\n baseOptions.banner = {\n js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`,\n };\n }\n }\n\n // Set target if specified\n if (buildOptions.target) {\n baseOptions.target = buildOptions.target;\n } else if (buildOptions.platform === 'node') {\n baseOptions.target = 'node18';\n } else {\n baseOptions.target = 'es2018';\n }\n\n return baseOptions;\n}\n\n/**\n * Detects destination packages from flow configuration.\n * Extracts package names from destinations that have explicit 'package' field.\n */\nfunction detectDestinationPackages(flowConfig: Flow.Config): Set<string> {\n const destinationPackages = new Set<string>();\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string'\n ) {\n destinationPackages.add(destConfig.package);\n }\n // If no package field, skip auto-importing examples for this destination\n }\n }\n\n return destinationPackages;\n}\n\n/**\n * Detects source packages from flow configuration.\n * Extracts package names from sources that have explicit 'package' field.\n */\nfunction detectSourcePackages(flowConfig: Flow.Config): Set<string> {\n const sourcePackages = new Set<string>();\n const sources = (\n flowConfig as unknown as { sources?: Record<string, unknown> }\n ).sources;\n\n if (sources) {\n for (const [sourceKey, sourceConfig] of Object.entries(sources)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'package' in sourceConfig &&\n typeof sourceConfig.package === 'string'\n ) {\n sourcePackages.add(sourceConfig.package);\n }\n }\n }\n\n return sourcePackages;\n}\n\n/**\n * Detects explicit code imports from destinations and sources.\n * Returns a map of package names to sets of export names.\n */\nfunction detectExplicitCodeImports(\n flowConfig: Flow.Config,\n): Map<string, Set<string>> {\n const explicitCodeImports = new Map<string, Set<string>>();\n\n // Check destinations\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string' &&\n 'code' in destConfig &&\n typeof destConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n // Auto-generated code starts with '_' (from packageNameToVariable)\n const isAutoGenerated = destConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(destConfig.package)) {\n explicitCodeImports.set(destConfig.package, new Set());\n }\n explicitCodeImports.get(destConfig.package)!.add(destConfig.code);\n }\n }\n }\n }\n\n // Check sources\n const sources = (\n flowConfig as unknown as { sources?: Record<string, unknown> }\n ).sources;\n\n if (sources) {\n for (const [sourceKey, sourceConfig] of Object.entries(sources)) {\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'package' in sourceConfig &&\n typeof sourceConfig.package === 'string' &&\n 'code' in sourceConfig &&\n typeof sourceConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n // Auto-generated code starts with '_' (from packageNameToVariable)\n const isAutoGenerated = sourceConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(sourceConfig.package)) {\n explicitCodeImports.set(sourceConfig.package, new Set());\n }\n explicitCodeImports.get(sourceConfig.package)!.add(sourceConfig.code);\n }\n }\n }\n }\n\n return explicitCodeImports;\n}\n\ninterface ImportGenerationResult {\n importStatements: string[];\n examplesMappings: string[];\n}\n\n/**\n * Generates import statements and examples mappings from build packages.\n * Handles explicit imports, default imports for destinations/sources, and utility imports.\n */\nfunction generateImportStatements(\n packages: BuildOptions['packages'],\n destinationPackages: Set<string>,\n sourcePackages: Set<string>,\n explicitCodeImports: Map<string, Set<string>>,\n): ImportGenerationResult {\n const importStatements: string[] = [];\n const examplesMappings: string[] = [];\n const usedPackages = new Set([...destinationPackages, ...sourcePackages]);\n\n for (const [packageName, packageConfig] of Object.entries(packages)) {\n const isUsedByDestOrSource = usedPackages.has(packageName);\n const hasExplicitCode = explicitCodeImports.has(packageName);\n\n if (packageConfig.imports && packageConfig.imports.length > 0) {\n // Explicit imports (utilities) - existing logic\n // Remove duplicates within the same package\n const uniqueImports = [...new Set(packageConfig.imports)];\n\n // Handle special \"default as X\" syntax\n const defaultImports: string[] = [];\n const namedImports: string[] = [];\n\n for (const imp of uniqueImports) {\n if (imp.startsWith('default as ')) {\n defaultImports.push(imp.replace('default as ', ''));\n } else {\n namedImports.push(imp);\n }\n }\n\n // Generate import statements\n if (defaultImports.length > 0) {\n for (const defaultImport of defaultImports) {\n importStatements.push(\n `import ${defaultImport} from '${packageName}';`,\n );\n }\n }\n\n if (namedImports.length > 0) {\n const importList = namedImports.join(', ');\n importStatements.push(\n `import { ${importList} } from '${packageName}';`,\n );\n }\n\n // Check if this package imports examples and create mappings\n const examplesImport = uniqueImports.find((imp) =>\n imp.includes('examples as '),\n );\n if (examplesImport) {\n // Extract destination name and examples variable name\n // Format: \"examples as gtagExamples\" -> gtagExamples\n const examplesVarName = examplesImport.split(' as ')[1];\n // Get destination name from package (assumes @walkeros/web-destination-xxx format)\n const destinationMatch = packageName.match(\n /@walkeros\\/web-destination-(.+)$/,\n );\n if (destinationMatch) {\n const destinationName = destinationMatch[1];\n examplesMappings.push(\n ` ${destinationName}: typeof ${examplesVarName} !== 'undefined' ? ${examplesVarName} : undefined`,\n );\n }\n }\n } else if (hasExplicitCode) {\n // Package with explicit code specified in destinations/sources\n // → Generate named imports\n const codes = Array.from(explicitCodeImports.get(packageName)!);\n importStatements.push(\n `import { ${codes.join(', ')} } from '${packageName}';`,\n );\n } else if (isUsedByDestOrSource) {\n // Package used by destination/source but no explicit imports or code\n // → Generate default import\n const varName = packageNameToVariable(packageName);\n importStatements.push(`import ${varName} from '${packageName}';`);\n }\n // If package declared but not used by any dest/source, skip import\n\n // Examples are no longer auto-imported - simulator loads them dynamically\n }\n\n return { importStatements, examplesMappings };\n}\n\n/**\n * Creates the entry point code for the bundle.\n * Generates imports, config object, and platform-specific wrapper programmatically.\n */\nexport async function createEntryPoint(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n packagePaths: Map<string, string>,\n): Promise<string> {\n // Detect packages used by destinations and sources\n const destinationPackages = detectDestinationPackages(flowConfig);\n const sourcePackages = detectSourcePackages(flowConfig);\n const explicitCodeImports = detectExplicitCodeImports(flowConfig);\n\n // Generate import statements\n const { importStatements } = generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n explicitCodeImports,\n );\n\n const importsCode = importStatements.join('\\n');\n const hasFlow = destinationPackages.size > 0 || sourcePackages.size > 0;\n\n // If no sources/destinations, just return user code with imports (no flow wrapper)\n if (!hasFlow) {\n const userCode = buildOptions.code || '';\n return importsCode ? `${importsCode}\\n\\n${userCode}` : userCode;\n }\n\n // Build config object programmatically (DRY - single source of truth)\n const configObject = buildConfigObject(flowConfig, explicitCodeImports);\n\n // Generate platform-specific wrapper\n const wrappedCode = generatePlatformWrapper(\n configObject,\n buildOptions.code || '',\n buildOptions as {\n platform: string;\n windowCollector?: string;\n windowElb?: string;\n },\n );\n\n // Assemble final code\n return importsCode ? `${importsCode}\\n\\n${wrappedCode}` : wrappedCode;\n}\n\ninterface EsbuildError {\n errors?: Array<{\n text: string;\n location?: {\n file: string;\n line: number;\n column: number;\n };\n }>;\n message?: string;\n}\n\nfunction createBuildError(buildError: EsbuildError, code: string): Error {\n if (!buildError.errors || buildError.errors.length === 0) {\n return new Error(`Build failed: ${buildError.message || buildError}`);\n }\n\n const firstError = buildError.errors[0];\n const location = firstError.location;\n\n if (location && location.file && location.file.includes('entry.js')) {\n // Error is in our generated entry point (code)\n const line = location.line;\n const column = location.column;\n const codeLines = code.split('\\n');\n const errorLine = codeLines[line - 1] || '';\n\n return new Error(\n `Code syntax error at line ${line}, column ${column}:\\n` +\n ` ${errorLine}\\n` +\n ` ${' '.repeat(column - 1)}^\\n` +\n `${firstError.text}`,\n );\n }\n\n // Error is in package code or other build issue\n return new Error(\n `Build error: ${firstError.text}\\n` +\n (location\n ? ` at ${location.file}:${location.line}:${location.column}`\n : ''),\n );\n}\n\n/**\n * Build config object string from flow configuration.\n * Respects import strategy decisions from detectExplicitCodeImports.\n */\nexport function buildConfigObject(\n flowConfig: Flow.Config,\n explicitCodeImports: Map<string, Set<string>>,\n): string {\n const flowWithProps = flowConfig as unknown as {\n sources?: Record<\n string,\n { package: string; code?: string; config?: unknown; env?: unknown }\n >;\n destinations?: Record<\n string,\n { package: string; code?: string; config?: unknown; env?: unknown }\n >;\n collector?: unknown;\n };\n\n const sources = flowWithProps.sources || {};\n const destinations = flowWithProps.destinations || {};\n\n // Build sources\n const sourcesEntries = Object.entries(sources).map(([key, source]) => {\n const hasExplicitCode =\n source.code && explicitCodeImports.has(source.package);\n const codeVar = hasExplicitCode\n ? source.code\n : packageNameToVariable(source.package);\n\n const configStr = source.config ? processConfigValue(source.config) : '{}';\n const envStr = source.env\n ? `,\\n env: ${processConfigValue(source.env)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}\\n }`;\n });\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations).map(\n ([key, dest]) => {\n const hasExplicitCode =\n dest.code && explicitCodeImports.has(dest.package);\n const codeVar = hasExplicitCode\n ? dest.code\n : packageNameToVariable(dest.package);\n\n const configStr = dest.config ? processConfigValue(dest.config) : '{}';\n const envStr = dest.env\n ? `,\\n env: ${processConfigValue(dest.env)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}\\n }`;\n },\n );\n\n // Build collector\n const collectorStr = flowWithProps.collector\n ? `,\\n ...${processConfigValue(flowWithProps.collector)}`\n : '';\n\n return `{\n sources: {\n${sourcesEntries.join(',\\n')}\n },\n destinations: {\n${destinationsEntries.join(',\\n')}\n }${collectorStr}\n}`;\n}\n\n/**\n * Process config value for serialization.\n * Uses existing serializer utilities.\n */\nfunction processConfigValue(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\n/**\n * Generate platform-specific wrapper code.\n */\nexport function generatePlatformWrapper(\n configObject: string,\n userCode: string,\n buildOptions: {\n platform: string;\n windowCollector?: string;\n windowElb?: string;\n },\n): string {\n if (buildOptions.platform === 'browser') {\n // Web platform: IIFE with browser globals\n const windowAssignments = [];\n if (buildOptions.windowCollector) {\n windowAssignments.push(\n ` if (typeof window !== 'undefined') window['${buildOptions.windowCollector}'] = collector;`,\n );\n }\n if (buildOptions.windowElb) {\n windowAssignments.push(\n ` if (typeof window !== 'undefined') window['${buildOptions.windowElb}'] = elb;`,\n );\n }\n const assignments =\n windowAssignments.length > 0 ? '\\n' + windowAssignments.join('\\n') : '';\n\n return `(async () => {\n const config = ${configObject};\n\n ${userCode}\n\n const { collector, elb } = await startFlow(config);${assignments}\n})();`;\n } else {\n // Server platform: Export default function\n const codeSection = userCode ? `\\n ${userCode}\\n` : '';\n\n return `export default async function(context = {}) {\n const config = ${configObject};${codeSection}\n return await startFlow(config);\n}`;\n }\n}\n","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport {\n Logger,\n resolveLocalPackage,\n copyLocalPackage,\n} from '../../core/index.js';\nimport { getPackageCacheKey } from '../../core/cache-utils.js';\n\nexport interface Package {\n name: string;\n version: string;\n path?: string; // Local path to package directory\n}\n\n/**\n * Gets the proper node_modules directory path for a package.\n * Creates standard npm structure: node_modules/@scope/package or node_modules/package\n * Supports multiple versions by appending version to non-scoped packages if needed.\n *\n * @example\n * getPackageDirectory('node_modules', '@walkeros/core', '0.2.0')\n * // → 'node_modules/@walkeros/core'\n *\n * getPackageDirectory('node_modules', 'lodash', '4.17.21')\n * // → 'node_modules/lodash'\n */\nfunction getPackageDirectory(\n baseDir: string,\n packageName: string,\n version: string,\n): string {\n // For scoped packages like @walkeros/core, preserve the scope structure\n // This creates: node_modules/@walkeros/core (standard npm structure)\n return path.join(baseDir, 'node_modules', packageName);\n}\n\nasync function getCachedPackagePath(\n pkg: Package,\n tempDir: string,\n): Promise<string> {\n const cacheDir = path.join('.tmp', 'cache', 'packages');\n const cacheKey = await getPackageCacheKey(pkg.name, pkg.version);\n return path.join(cacheDir, cacheKey);\n}\n\nasync function isPackageCached(\n pkg: Package,\n tempDir: string,\n): Promise<boolean> {\n const cachedPath = await getCachedPackagePath(pkg, tempDir);\n return fs.pathExists(cachedPath);\n}\n\nfunction validateNoDuplicatePackages(packages: Package[]): void {\n const packageMap = new Map<string, string[]>();\n\n // Group packages by name and collect their versions\n for (const pkg of packages) {\n if (!packageMap.has(pkg.name)) {\n packageMap.set(pkg.name, []);\n }\n packageMap.get(pkg.name)!.push(pkg.version);\n }\n\n // Check for duplicate packages with different versions\n const conflicts: string[] = [];\n for (const [name, versions] of packageMap.entries()) {\n const uniqueVersions = [...new Set(versions)];\n if (uniqueVersions.length > 1) {\n conflicts.push(`${name}: [${uniqueVersions.join(', ')}]`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(\n `Version conflicts detected:\\n${conflicts.map((c) => ` - ${c}`).join('\\n')}\\n\\n` +\n 'Each package must use the same version across all declarations. ' +\n 'Please update your configuration to use consistent versions.',\n );\n }\n}\n\n/**\n * Recursively resolve and download package dependencies\n */\nasync function resolveDependencies(\n pkg: Package,\n packageDir: string,\n logger: Logger,\n visited: Set<string> = new Set(),\n): Promise<Package[]> {\n const dependencies: Package[] = [];\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (visited.has(pkgKey)) {\n return dependencies;\n }\n visited.add(pkgKey);\n\n try {\n const packageJsonPath = path.join(packageDir, 'package.json');\n if (await fs.pathExists(packageJsonPath)) {\n const packageJson = await fs.readJson(packageJsonPath);\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.peerDependencies,\n };\n\n for (const [name, versionSpec] of Object.entries(deps)) {\n if (typeof versionSpec === 'string') {\n // Use the version spec as-is (pacote will resolve it)\n // This respects the package.json dependency requirements\n dependencies.push({ name, version: versionSpec });\n }\n }\n }\n } catch (error) {\n logger.debug(`Failed to read dependencies for ${pkgKey}: ${error}`);\n }\n\n return dependencies;\n}\n\nexport async function downloadPackages(\n packages: Package[],\n targetDir: string,\n logger: Logger,\n useCache = true,\n configDir?: string, // For resolving relative local paths\n): Promise<Map<string, string>> {\n const packagePaths = new Map<string, string>();\n const downloadQueue: Package[] = [...packages];\n const processed = new Set<string>();\n\n // Track packages that should use local paths (to prevent npm overwriting them)\n const localPackageMap = new Map<string, string>();\n for (const pkg of packages) {\n if (pkg.path) {\n localPackageMap.set(pkg.name, pkg.path);\n }\n }\n\n // Validate no duplicate packages with different versions in initial list\n validateNoDuplicatePackages(packages);\n\n // Ensure target directory exists\n await fs.ensureDir(targetDir);\n\n while (downloadQueue.length > 0) {\n const pkg = downloadQueue.shift()!;\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (processed.has(pkgKey)) {\n continue;\n }\n processed.add(pkgKey);\n\n // If this package was specified with a local path, use it even if discovered as a dependency\n if (!pkg.path && localPackageMap.has(pkg.name)) {\n pkg.path = localPackageMap.get(pkg.name);\n }\n\n // Handle local packages first\n if (pkg.path) {\n const localPkg = await resolveLocalPackage(\n pkg.name,\n pkg.path,\n configDir || process.cwd(),\n logger,\n );\n const installedPath = await copyLocalPackage(localPkg, targetDir, logger);\n packagePaths.set(pkg.name, installedPath);\n\n // Resolve dependencies from local package\n const deps = await resolveDependencies(pkg, installedPath, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n }\n\n const packageSpec = `${pkg.name}@${pkg.version}`;\n // Use proper node_modules structure: node_modules/@scope/package\n const packageDir = getPackageDirectory(targetDir, pkg.name, pkg.version);\n const cachedPath = await getCachedPackagePath(pkg, targetDir);\n\n if (useCache && (await isPackageCached(pkg, targetDir))) {\n logger.debug(`Using cached ${packageSpec}...`);\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n await fs.copy(cachedPath, packageDir);\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies for cached package too\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n } catch (error) {\n logger.debug(\n `Failed to use cache for ${packageSpec}, downloading fresh: ${error}`,\n );\n }\n }\n\n logger.debug(`Downloading ${packageSpec}...`);\n\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n\n // Extract package to proper node_modules structure\n // Use environment variable for cache location (Docker-friendly)\n const cacheDir =\n process.env.NPM_CACHE_DIR || path.join(process.cwd(), '.npm-cache');\n await pacote.extract(packageSpec, packageDir, {\n // Force npm registry download, prevent workspace resolution\n registry: 'https://registry.npmjs.org',\n\n // Force online fetching from registry (don't use cached workspace packages)\n preferOnline: true,\n\n // Cache for performance\n cache: cacheDir,\n\n // Don't resolve relative to workspace context\n where: undefined,\n });\n\n // Cache the downloaded package for future use\n if (useCache) {\n try {\n await fs.ensureDir(path.dirname(cachedPath));\n await fs.copy(packageDir, cachedPath);\n logger.debug(`Cached ${packageSpec} for future use`);\n } catch (cacheError) {\n logger.debug(`Failed to cache ${packageSpec}: ${cacheError}`);\n }\n }\n\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n } catch (error) {\n throw new Error(`Failed to download ${packageSpec}: ${error}`);\n }\n }\n\n return packagePaths;\n}\n","/**\n * Cache utility functions for hash-based cache keys\n *\n * Implements content-based and date-based cache invalidation for:\n * - NPM package cache (mutable versions include daily date)\n * - Build artifact cache (content + date hashing)\n */\n\nimport { getHashServer } from '@walkeros/server-core';\n\nconst HASH_LENGTH = 12;\n\n/**\n * Check if a version specifier is mutable (can change over time)\n */\nexport function isMutableVersion(version: string): boolean {\n return (\n version === 'latest' ||\n version.includes('^') ||\n version.includes('~') ||\n version.includes('*') ||\n version.includes('x')\n );\n}\n\n/**\n * Get today's date in YYYY-MM-DD format\n */\nexport function getTodayDate(): string {\n return new Date().toISOString().split('T')[0];\n}\n\n/**\n * Generate cache key for npm package.\n * Mutable versions include date for daily invalidation.\n * Exact versions are cached indefinitely.\n */\nexport async function getPackageCacheKey(\n packageName: string,\n version: string,\n date?: string,\n): Promise<string> {\n const safeName = packageName.replace(/\\//g, '-').replace(/@/g, '');\n\n if (isMutableVersion(version)) {\n const dateStr = date ?? getTodayDate();\n const input = `${safeName}@${version}:${dateStr}`;\n return getHashServer(input, HASH_LENGTH);\n }\n\n // Exact version - no date component\n const input = `${safeName}@${version}`;\n return getHashServer(input, HASH_LENGTH);\n}\n\n/**\n * Normalize JSON content for consistent hashing.\n * Handles whitespace and property order variations.\n */\nfunction normalizeJson(content: string): string {\n const parsed = JSON.parse(content);\n return JSON.stringify(parsed);\n}\n\n/**\n * Generate cache key for flow.json configuration.\n * Includes date for daily rebuild guarantee.\n */\nexport async function getFlowConfigCacheKey(\n content: string,\n date?: string,\n): Promise<string> {\n const dateStr = date ?? getTodayDate();\n const normalized = normalizeJson(content);\n const input = `${normalized}:${dateStr}`;\n return getHashServer(input, HASH_LENGTH);\n}\n","/**\n * Build artifact cache for flow.json configurations\n *\n * Caches compiled bundles based on configuration content + date.\n * Enables intelligent cache reuse with daily rebuild guarantee.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { getFlowConfigCacheKey } from './cache-utils';\n\nconst BUILD_CACHE_DIR = path.join('.tmp', 'cache', 'builds');\n\n/**\n * Get the cache file path for a flow.json configuration\n */\nexport async function getBuildCachePath(\n configContent: string,\n cacheDir: string = BUILD_CACHE_DIR,\n): Promise<string> {\n const cacheKey = await getFlowConfigCacheKey(configContent);\n return path.join(cacheDir, `${cacheKey}.js`);\n}\n\n/**\n * Check if a cached build exists for the given configuration\n */\nexport async function isBuildCached(\n configContent: string,\n cacheDir: string = BUILD_CACHE_DIR,\n): Promise<boolean> {\n const cachePath = await getBuildCachePath(configContent, cacheDir);\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 cacheDir: string = BUILD_CACHE_DIR,\n): Promise<void> {\n const cachePath = await getBuildCachePath(configContent, cacheDir);\n await fs.ensureDir(path.dirname(cachePath));\n await fs.writeFile(cachePath, buildOutput, 'utf-8');\n}\n\n/**\n * Retrieve a cached build artifact\n */\nexport async function getCachedBuild(\n configContent: string,\n cacheDir: string = BUILD_CACHE_DIR,\n): Promise<string | null> {\n const cachePath = await getBuildCachePath(configContent, cacheDir);\n\n if (await fs.pathExists(cachePath)) {\n return await fs.readFile(cachePath, 'utf-8');\n }\n\n return null;\n}\n","/**\n * Bundle statistics display utilities\n */\nimport { formatBytes } from '../../core/index.js';\nimport type { BundleStats } from './bundler.js';\nimport type { Logger } from '../../core/index.js';\n\n/**\n * Display detailed bundle statistics to console\n */\nexport function displayStats(stats: BundleStats, logger: Logger): void {\n logger.info('\\n📊 Bundle Statistics');\n logger.info('─'.repeat(50));\n\n // Total size\n const sizeKB = formatBytes(stats.totalSize);\n logger.info(`Total Size: ${sizeKB} KB`);\n\n // Build time\n const timeSeconds = (stats.buildTime / 1000).toFixed(2);\n logger.info(`Build Time: ${timeSeconds}s`);\n\n // Tree-shaking effectiveness\n const treeshakingStatus = stats.treeshakingEffective\n ? '✅ Effective'\n : '⚠️ Not optimal (consider using named imports)';\n logger.info(`Tree-shaking: ${treeshakingStatus}`);\n\n // Package breakdown\n if (stats.packages.length > 0) {\n logger.info(`\\nPackage Breakdown:`);\n stats.packages.forEach((pkg) => {\n if (pkg.size > 0) {\n const pkgSizeKB = formatBytes(pkg.size);\n logger.info(` • ${pkg.name}: ${pkgSizeKB} KB`);\n }\n });\n }\n\n logger.info('─'.repeat(50));\n}\n\n/**\n * Create stats summary for JSON output\n */\nexport function createStatsSummary(stats: BundleStats) {\n return {\n totalSize: stats.totalSize,\n totalSizeFormatted: `${formatBytes(stats.totalSize)} KB`,\n buildTime: stats.buildTime,\n buildTimeFormatted: `${(stats.buildTime / 1000).toFixed(2)}s`,\n treeshakingEffective: stats.treeshakingEffective,\n packageCount: stats.packages.length,\n packages: stats.packages.map((pkg) => ({\n name: pkg.name,\n size: pkg.size,\n sizeFormatted: `${formatBytes(pkg.size)} KB`,\n })),\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { getPlatform } from '@walkeros/core';\nimport { createLogger, getErrorMessage } from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n getTempDir,\n isObject,\n type BuildOptions,\n} from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport { CallTracker } from './tracker.js';\nimport { executeInJSDOM } from './jsdom-executor.js';\nimport { executeInNode } from './node-executor.js';\nimport { loadDestinationEnvs } from './env-loader.js';\nimport type { SimulateCommandOptions, SimulationResult } from './types.js';\n\n/**\n * Generate a unique ID for temp files\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Main simulation orchestrator\n */\nexport async function simulateCore(\n configPath: string,\n event: unknown,\n options: Pick<SimulateCommandOptions, 'json' | 'verbose' | 'silent'> = {},\n): Promise<SimulationResult> {\n const logger = createLogger({\n verbose: options.verbose || false,\n silent: options.silent || false,\n json: options.json || false,\n });\n\n try {\n logger.info('🎯 Starting walkerOS simulation...');\n\n // Load and validate configuration\n logger.info('📦 Loading bundle configuration...');\n const fullConfigPath = path.resolve(configPath);\n const rawConfig = await loadJsonConfig(fullConfigPath);\n loadBundleConfig(rawConfig, { configPath: fullConfigPath });\n\n // Execute simulation\n logger.info(`🚀 Executing simulation with event: ${JSON.stringify(event)}`);\n const result = await executeSimulation(event, fullConfigPath);\n\n // Report results\n if (result.success) {\n logger.info(`✅ Simulation completed successfully`);\n } else {\n logger.error(`❌ Simulation failed: ${result.error}`);\n }\n\n return result;\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n logger.error(`💥 Simulation error: ${errorMessage}`);\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Simple result formatting\n */\nexport function formatSimulationResult(\n result: SimulationResult,\n options: Pick<SimulateCommandOptions, 'json'> = {},\n): string {\n if (options.json) {\n const output = {\n result: result.elbResult,\n usage: result.usage,\n duration: result.duration,\n };\n return JSON.stringify(output, null, 2);\n }\n\n if (result.success) {\n return '✅ Simulation completed successfully';\n } else {\n return `❌ Simulation failed: ${result.error}`;\n }\n}\n\n/**\n * Execute simulation using destination-provided mock environments\n */\nexport async function executeSimulation(\n event: unknown,\n configPath: string,\n): Promise<SimulationResult> {\n const startTime = Date.now();\n let bundlePath: string | undefined;\n const tempDir = getTempDir();\n\n try {\n // Validate event format\n if (\n !isObject(event) ||\n !('name' in event) ||\n typeof event.name !== 'string'\n ) {\n throw new Error(\n 'Event must be an object with a \"name\" property of type string',\n );\n }\n\n const typedEvent = event as { name: string; data?: unknown };\n\n // Ensure temp directory exists\n await fs.ensureDir(tempDir);\n\n // 1. Load config\n const rawConfig = await loadJsonConfig(configPath);\n const { flowConfig, buildOptions } = loadBundleConfig(rawConfig, {\n configPath,\n });\n\n // Detect platform from flowConfig\n const platform = getPlatform(flowConfig);\n\n // 2. Create tracker\n const tracker = new CallTracker();\n\n // 3. Create temporary bundle\n const tempOutput = path.join(\n tempDir,\n `simulation-bundle-${generateId()}.${platform === 'web' ? 'js' : 'mjs'}`,\n );\n\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n // Create build options for simulation - platform-aware bundling\n const simulationBuildOptions: BuildOptions = {\n ...buildOptions,\n code: buildOptions.code || '',\n output: tempOutput,\n tempDir,\n ...(platform === 'web'\n ? {\n format: 'iife' as const,\n platform: 'browser' as const,\n windowCollector: 'collector',\n windowElb: 'elb',\n }\n : {\n format: 'esm' as const,\n platform: 'node' as const,\n }),\n };\n\n // 4. Bundle (downloads packages internally)\n await bundleCore(\n flowConfig,\n simulationBuildOptions,\n createLogger({ silent: true }),\n false,\n );\n bundlePath = tempOutput;\n\n // 5. Load env examples dynamically from destination packages\n const envs = await loadDestinationEnvs(destinations || {});\n\n // 6. Execute based on platform\n let result;\n if (platform === 'web') {\n result = await executeInJSDOM(\n tempOutput,\n destinations || {},\n typedEvent,\n tracker,\n envs,\n 10000,\n );\n } else {\n result = await executeInNode(\n tempOutput,\n destinations || {},\n typedEvent,\n tracker,\n envs,\n 30000,\n );\n }\n\n const elbResult = result.elbResult;\n const usage = result.usage;\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n elbResult,\n usage,\n duration,\n logs: [],\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n return {\n success: false,\n error: getErrorMessage(error),\n duration,\n };\n } finally {\n // Cleanup temp directory and all its contents\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {\n // Ignore cleanup errors - temp dirs will be cleaned eventually\n });\n }\n // Note: JSDOM automatically cleans up its own isolated environment\n }\n}\n","/**\n * Call Tracker for Simulation\n *\n * Wraps mock environment functions to track API calls.\n * Used with destination-provided examples/env.ts mocks.\n */\n\nexport interface ApiCall {\n type: 'call';\n path: string;\n args: unknown[];\n timestamp: number;\n}\n\nexport class CallTracker {\n private calls: Map<string, ApiCall[]> = new Map();\n\n /**\n * Wrap a function to track its calls\n */\n wrapFunction(\n name: string,\n fn?: (...args: unknown[]) => unknown,\n ): (...args: unknown[]) => unknown {\n const self = this;\n const targetFn = fn || (() => {});\n\n return new Proxy(targetFn, {\n apply(_target, thisArg, args: unknown[]) {\n self.logCall(name, args);\n return targetFn.apply(thisArg, args);\n },\n });\n }\n\n /**\n * Wrap an environment object, tracking specified paths\n *\n * @param env - Environment object (from destination's examples/env.ts)\n * @param paths - Paths to track (e.g., ['gtag:window.gtag', 'gtag:window.dataLayer.push'])\n */\n wrapEnv<T extends Record<string, unknown>>(env: T, paths: string[]): T {\n const wrapped: Record<string, unknown> = {};\n\n // Deep clone the env object first\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === 'object' && value !== null) {\n wrapped[key] = Array.isArray(value)\n ? [...value]\n : { ...(value as Record<string, unknown>) };\n } else {\n wrapped[key] = value;\n }\n }\n\n // Wrap specified paths\n for (const fullPath of paths) {\n // Parse path: \"gtag:window.gtag\" → destKey=\"gtag\", path=\"window.gtag\"\n const [destKey, ...pathParts] = fullPath.split(':');\n const path = pathParts.join(':');\n\n if (!path) continue;\n\n // Remove \"call:\" prefix if present (from simulation array)\n const cleanPath = path.replace(/^call:/, '');\n const parts = cleanPath.split('.');\n\n let current: Record<string, unknown> = wrapped;\n let source: Record<string, unknown> | undefined = env;\n\n // Navigate to parent object\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n\n if (!current[part]) {\n current[part] = {};\n }\n\n current = current[part] as Record<string, unknown>;\n source =\n source && typeof source[part] === 'object' && source[part] !== null\n ? (source[part] as Record<string, unknown>)\n : undefined;\n }\n\n // Wrap the final property\n const finalKey = parts[parts.length - 1];\n const originalFn = source?.[finalKey];\n\n // Wrap with full path for tracking\n current[finalKey] = this.wrapFunction(\n `${destKey}:${cleanPath}`,\n typeof originalFn === 'function'\n ? (originalFn as (...args: unknown[]) => unknown)\n : undefined,\n );\n }\n\n return wrapped as T;\n }\n\n private logCall(fullPath: string, args: unknown[]): void {\n // Parse \"destKey:api.path\" → destKey and apiPath\n const [destKey, ...pathParts] = fullPath.split(':');\n const apiPath = pathParts.join(':');\n\n if (!this.calls.has(destKey)) {\n this.calls.set(destKey, []);\n }\n\n this.calls.get(destKey)!.push({\n type: 'call',\n path: apiPath,\n args,\n timestamp: Date.now(),\n });\n }\n\n getCalls(): Record<string, ApiCall[]> {\n return Object.fromEntries(this.calls);\n }\n\n reset(): void {\n this.calls.clear();\n }\n}\n","/**\n * JSDOM-based executor for simulating IIFE bundles\n *\n * Executes actual production IIFE bundles in a virtual DOM environment\n * with env-based mocking from destination examples.\n */\n\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport type { Elb } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport type { CallTracker, ApiCall } from './tracker.js';\n\nexport interface ExecutionResult {\n collector: unknown;\n elb: unknown;\n elbResult: Elb.PushResult | undefined;\n usage: Record<string, ApiCall[]>;\n duration: number;\n}\n\ninterface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Build sandbox from destination-provided envs\n *\n * Merges env mocks from each destination's envs, wrapping\n * specified paths with CallTracker for API call tracking.\n */\nfunction buildSandboxFromEnvs(\n envs: Record<string, DestinationEnv>,\n destinations: Record<string, unknown>,\n tracker: CallTracker,\n): { window: Record<string, unknown>; document: Record<string, unknown> } {\n // Base browser APIs (not provided by destinations)\n const baseBrowserMocks = {\n Image: class MockImage {\n src = '';\n onload = (() => {}) as unknown;\n onerror = (() => {}) as unknown;\n },\n fetch: async () => ({ ok: true, json: async () => ({}) }),\n location: { href: 'http://localhost' },\n navigator: { userAgent: 'Mozilla/5.0 (walkerOS Simulation)' },\n };\n\n const sandbox = {\n window: { ...baseBrowserMocks } as Record<string, unknown>,\n document: {} as Record<string, unknown>,\n };\n\n // Add destination-specific env mocks\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n const destEnv = envs[destKey];\n if (!destEnv?.push) continue;\n\n const mockEnv = destEnv.push;\n const trackPaths = destEnv.simulation || [];\n\n // Use existing CallTracker to wrap env\n const trackedEnv = tracker.wrapEnv(\n mockEnv as Record<string, unknown>,\n trackPaths.map((p) => `${destKey}:${p}`),\n );\n\n // Merge window properties\n if (trackedEnv.window && typeof trackedEnv.window === 'object') {\n Object.assign(sandbox.window, trackedEnv.window);\n }\n\n // Merge document properties\n if (trackedEnv.document && typeof trackedEnv.document === 'object') {\n Object.assign(sandbox.document, trackedEnv.document);\n }\n }\n\n return sandbox;\n}\n\n/**\n * Wait for async window property assignment\n *\n * IIFE bundles execute asynchronously and assign to window.\n * This helper polls until the property appears or timeout occurs.\n */\nfunction waitForWindowProperty(\n window: Record<string, unknown>,\n prop: string,\n timeout: number = 5000,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n\n const check = () => {\n if (window[prop] !== undefined) {\n resolve();\n } else if (Date.now() - start > timeout) {\n reject(\n new Error(\n `Timeout waiting for window.${prop}. ` +\n `IIFE may have failed to execute or assign to window.`,\n ),\n );\n } else {\n setImmediate(check);\n }\n };\n\n check();\n });\n}\n\n/**\n * Execute production IIFE bundle in JSDOM with env-based mocking\n *\n * Main orchestration function that:\n * 1. Creates JSDOM virtual DOM\n * 2. Builds sandbox from dynamically loaded envs\n * 3. Executes IIFE in JSDOM\n * 4. Waits for window.collector/elb assignment\n * 5. Runs event through elb\n * 6. Returns tracked API calls\n */\nexport async function executeInJSDOM(\n bundlePath: string,\n destinations: Record<string, unknown>,\n event: { name: string; data?: unknown },\n tracker: CallTracker,\n envs: Record<string, DestinationEnv>,\n timeout: number = 10000,\n): Promise<ExecutionResult> {\n const start = Date.now();\n\n // 1. Create JSDOM virtual DOM with console suppression\n const virtualConsole = new VirtualConsole();\n // Silent mode - don't pipe console output to process stdout/stderr\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously', // Allow script execution\n resources: 'usable',\n virtualConsole,\n });\n\n const { window } = dom;\n\n // 2. Build sandbox from dynamically loaded envs and inject into window\n const sandbox = buildSandboxFromEnvs(envs, destinations, tracker);\n Object.assign(window, sandbox.window);\n Object.assign(window.document, sandbox.document);\n\n // 3. Load and execute bundle code\n const bundleCode = await fs.readFile(bundlePath, 'utf8');\n\n try {\n window.eval(bundleCode);\n } catch (error) {\n throw new Error(`Bundle execution failed: ${getErrorMessage(error)}`);\n }\n\n // 4. Wait for window.collector and window.elb assignments\n try {\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'collector',\n timeout,\n );\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'elb',\n timeout,\n );\n } catch (error) {\n throw new Error(\n `Window property assignment failed: ${getErrorMessage(error)}`,\n );\n }\n\n const { collector, elb } = window as unknown as {\n collector: unknown;\n elb: (name: string, data?: unknown) => Promise<unknown>;\n };\n\n // 5. Run event through elb\n let elbResult: Elb.PushResult | undefined;\n try {\n elbResult = (await elb(event.name, event.data)) as\n | Elb.PushResult\n | undefined;\n } catch (error) {\n throw new Error(`Event execution failed: ${getErrorMessage(error)}`);\n }\n\n // 6. Return results with tracked calls\n return {\n collector,\n elb,\n elbResult,\n usage: tracker.getCalls(),\n duration: Date.now() - start,\n };\n}\n","/**\n * Node.js-based executor for simulating ESM server bundles\n *\n * Executes server bundles via dynamic import with env-based mocking.\n */\n\nimport { pathToFileURL } from 'url';\nimport type { Elb } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport type { CallTracker, ApiCall } from './tracker.js';\n\nexport interface ExecutionResult {\n collector: unknown;\n elb: unknown;\n elbResult: Elb.PushResult | undefined;\n usage: Record<string, ApiCall[]>;\n duration: number;\n}\n\ninterface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Build global mocks from destination-provided envs\n */\nfunction buildGlobalMocksFromEnvs(\n envs: Record<string, DestinationEnv>,\n destinations: Record<string, unknown>,\n tracker: CallTracker,\n): Record<string, unknown> {\n const globalMocks: Record<string, unknown> = {};\n\n for (const [destKey] of Object.entries(destinations)) {\n const destEnv = envs[destKey];\n if (!destEnv?.push) continue;\n\n const mockEnv = destEnv.push;\n const trackPaths = destEnv.simulation || [];\n\n const trackedEnv = tracker.wrapEnv(\n mockEnv as Record<string, unknown>,\n trackPaths.map((p) => `${destKey}:${p}`),\n );\n\n Object.assign(globalMocks, trackedEnv);\n }\n\n return globalMocks;\n}\n\n/**\n * Inject mocks into global scope and return cleanup function\n */\nfunction injectGlobalMocks(mocks: Record<string, unknown>): () => void {\n const originalValues: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(mocks)) {\n originalValues[key] = (globalThis as Record<string, unknown>)[key];\n (globalThis as Record<string, unknown>)[key] = value;\n }\n\n return () => {\n for (const [key, value] of Object.entries(originalValues)) {\n if (value === undefined) {\n delete (globalThis as Record<string, unknown>)[key];\n } else {\n (globalThis as Record<string, unknown>)[key] = value;\n }\n }\n };\n}\n\n/**\n * Execute server ESM bundle in Node.js with env-based mocking\n */\nexport async function executeInNode(\n bundlePath: string,\n destinations: Record<string, unknown>,\n event: { name: string; data?: unknown },\n tracker: CallTracker,\n envs: Record<string, DestinationEnv>,\n timeout: number = 30000,\n): Promise<ExecutionResult> {\n const start = Date.now();\n\n const globalMocks = buildGlobalMocksFromEnvs(envs, destinations, tracker);\n const cleanupMocks = injectGlobalMocks(globalMocks);\n\n try {\n const executeWithTimeout = async (): Promise<ExecutionResult> => {\n // Jest has issues with file:// URLs in dynamic imports, use path directly\n // Outside Jest, use file:// URL with cache-busting to prevent module caching\n const importUrl = process.env.JEST_WORKER_ID\n ? bundlePath\n : `${pathToFileURL(bundlePath).href}?t=${Date.now()}`;\n\n const module = await import(importUrl);\n\n if (!module.default || typeof module.default !== 'function') {\n throw new Error('Bundle does not export default factory function');\n }\n\n const result = await module.default();\n\n if (!result || !result.elb || typeof result.elb !== 'function') {\n throw new Error(\n 'Factory function did not return valid result with elb',\n );\n }\n\n const { collector, elb } = result;\n\n let elbResult: Elb.PushResult | undefined;\n try {\n elbResult = (await elb(event.name, event.data)) as\n | Elb.PushResult\n | undefined;\n } catch (error) {\n throw new Error(`Event execution failed: ${getErrorMessage(error)}`);\n }\n\n return {\n collector,\n elb,\n elbResult,\n usage: tracker.getCalls(),\n duration: Date.now() - start,\n };\n };\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Server simulation timeout after ${timeout}ms`)),\n timeout,\n );\n });\n\n return await Promise.race([executeWithTimeout(), timeoutPromise]);\n } catch (error) {\n throw new Error(`Node execution failed: ${getErrorMessage(error)}`);\n } finally {\n cleanupMocks();\n }\n}\n","interface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\ninterface DestinationConfig {\n package?: string;\n config?: Record<string, unknown>;\n}\n\n/**\n * Dynamically loads env examples from destination packages.\n *\n * Imports from `/dev` subpath (e.g., '@walkeros/web-destination-gtag/dev')\n * and extracts the `env` object which contains:\n * - push: Mock environment with API functions (gtag, fbq, etc.)\n * - simulation: Array of tracking paths for call verification\n *\n * @param destinations - Destination configuration from flow config\n * @returns Map of destination key to env object\n */\nexport async function loadDestinationEnvs(\n destinations: Record<string, unknown>,\n): Promise<Record<string, DestinationEnv>> {\n const envs: Record<string, DestinationEnv> = {};\n\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n const typedConfig = destConfig as DestinationConfig;\n\n // Skip if no package field\n if (!typedConfig.package) {\n continue;\n }\n\n try {\n // Determine import path\n const packageName = typedConfig.package;\n const isDemoPackage = packageName.includes('-demo');\n const importPath = isDemoPackage ? packageName : `${packageName}/dev`;\n\n // Dynamic import\n const module = await import(importPath);\n\n // Extract env from examples\n const examplesModule = module.examples || module.default?.examples;\n const envModule = examplesModule?.env;\n\n if (envModule?.push) {\n envs[destKey] = {\n init: envModule.init,\n push: envModule.push,\n simulation: envModule.simulation || [],\n };\n }\n } catch (error) {\n // Silently skip destinations without env or invalid packages\n // eslint-disable-next-line no-console\n console.warn(\n `Warning: Could not load env for destination \"${destKey}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return envs;\n}\n","import { simulateCore, formatSimulationResult } from './simulator.js';\nimport {\n createCommandLogger,\n createLogger,\n executeCommand,\n getErrorMessage,\n buildCommonDockerArgs,\n} from '../../core/index.js';\nimport { loadJsonFromSource } from '../../config/index.js';\nimport type { SimulateCommandOptions } from './types.js';\n\n/**\n * CLI command handler for simulate command\n */\nexport async function simulateCommand(\n options: SimulateCommandOptions,\n): Promise<void> {\n const logger = createCommandLogger(options);\n\n // Build Docker args - start with common flags\n const dockerArgs = buildCommonDockerArgs(options);\n // Add simulate-specific flag\n if (options.event) dockerArgs.push('--event', options.event);\n\n await executeCommand(\n async () => {\n const startTime = Date.now();\n\n try {\n // Load event from inline JSON, file path, or URL\n const event = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n\n // Execute simulation\n const result = await simulateCore(options.config, event, {\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n });\n\n // Add duration to result\n const resultWithDuration = {\n ...result,\n duration: (Date.now() - startTime) / 1000,\n };\n\n // Output results - create output logger that always logs\n const outputLogger = createLogger({ silent: false, json: false });\n const output = formatSimulationResult(resultWithDuration, {\n json: options.json,\n });\n outputLogger.log('white', output);\n\n // Exit with error code if simulation failed\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n // JSON error output - create output logger that always logs\n const outputLogger = createLogger({ silent: false, json: false });\n const errorOutput = JSON.stringify(\n {\n success: false,\n error: errorMessage,\n duration: (Date.now() - startTime) / 1000,\n },\n null,\n 2,\n );\n outputLogger.log('white', errorOutput);\n } else {\n // Error output - create error logger that always logs\n const errorLogger = createLogger({ silent: false, json: false });\n errorLogger.error(`❌ Simulate command failed: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n },\n 'simulate',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * High-level simulate function for programmatic usage.\n *\n * Handles configuration loading internally and returns structured results.\n *\n * @param configOrPath - Bundle configuration object or path to config file\n * @param event - Event object to simulate\n * @param options - Simulation options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.json - Format output as JSON (default: false)\n * @returns Simulation result with success status, elb result, and usage data\n *\n * @example\n * ```typescript\n * // With config file\n * const result = await simulate('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n *\n * // With config object\n * const result = await simulate(\n * {\n * platform: 'web',\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * code: '...',\n * output: './bundle.js'\n * },\n * { name: 'page view' },\n * { silent: true }\n * );\n * ```\n */\nexport async function simulate(\n configOrPath: string | unknown,\n event: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n json?: boolean;\n } = {},\n): Promise<import('./types').SimulationResult> {\n // simulateCore currently only accepts file paths, so we need to handle that\n // For now, if configOrPath is not a string, throw an error with guidance\n if (typeof configOrPath !== 'string') {\n throw new Error(\n 'simulate() currently only supports config file paths. ' +\n 'Config object support will be added in a future version. ' +\n 'Please provide a path to a configuration file.',\n );\n }\n\n // Call core simulator\n return await simulateCore(configOrPath, event, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n });\n}\n\n// Re-export types and utilities for testing\nexport * from './types.js';\nexport * from './simulator.js';\nexport { executeInNode } from './node-executor.js';\n","import path from 'path';\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport { getPlatform, type Elb } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport {\n createCommandLogger,\n createLogger,\n executeCommand,\n getErrorMessage,\n buildCommonDockerArgs,\n type Logger,\n} from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadJsonFromSource,\n loadBundleConfig,\n} from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport type { PushCommandOptions, PushResult } from './types.js';\n\n/**\n * CLI command handler for push command\n */\nexport async function pushCommand(options: PushCommandOptions): Promise<void> {\n const logger = createCommandLogger(options);\n\n // Build Docker args\n const dockerArgs = buildCommonDockerArgs(options);\n dockerArgs.push('--event', options.event);\n if (options.flow) dockerArgs.push('--flow', options.flow);\n\n await executeCommand(\n async () => {\n const startTime = Date.now();\n\n try {\n // Step 1: Load event\n logger.info('📥 Loading event...');\n const event = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n\n // Validate event format using Zod schema\n const eventResult = schemas.PartialEventSchema.safeParse(event);\n if (!eventResult.success) {\n const errors = eventResult.error.issues\n .map((issue) => `${String(issue.path.join('.'))}: ${issue.message}`)\n .join(', ');\n throw new Error(`Invalid event: ${errors}`);\n }\n\n const parsedEvent = eventResult.data as {\n name?: string;\n data?: Record<string, unknown>;\n };\n if (!parsedEvent.name) {\n throw new Error('Invalid event: Missing required \"name\" property');\n }\n\n // Create typed event object for execution\n const validatedEvent: { name: string; data: Record<string, unknown> } =\n {\n name: parsedEvent.name,\n data: (parsedEvent.data || {}) as Record<string, unknown>,\n };\n\n // Warn about event naming format (walkerOS business logic)\n if (!validatedEvent.name.includes(' ')) {\n logger.warn(\n `Event name \"${validatedEvent.name}\" should follow \"ENTITY ACTION\" format (e.g., \"page view\")`,\n );\n }\n\n // Step 2: Load config\n logger.info('📦 Loading flow configuration...');\n const configPath = path.resolve(options.config);\n const rawConfig = await loadJsonConfig(configPath);\n const { flowConfig, buildOptions, flowName, isMultiFlow } =\n loadBundleConfig(rawConfig, {\n configPath: options.config,\n flowName: options.flow,\n logger,\n });\n\n const platform = getPlatform(flowConfig);\n\n // Step 3: Bundle to temp file in config directory (so Node.js can find node_modules)\n logger.info('🔨 Bundling flow configuration...');\n const configDir = path.dirname(configPath);\n const tempDir = path.join(\n configDir,\n '.tmp',\n `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n await fs.ensureDir(tempDir);\n const tempPath = path.join(\n tempDir,\n `bundle.${platform === 'web' ? 'js' : 'mjs'}`,\n );\n\n const pushBuildOptions = {\n ...buildOptions,\n output: tempPath,\n // Web uses IIFE for browser-like execution, server uses ESM\n format: platform === 'web' ? ('iife' as const) : ('esm' as const),\n platform:\n platform === 'web' ? ('browser' as const) : ('node' as const),\n ...(platform === 'web' && {\n windowCollector: 'collector',\n windowElb: 'elb',\n }),\n };\n\n await bundleCore(flowConfig, pushBuildOptions, logger, false);\n\n logger.debug(`Bundle created: ${tempPath}`);\n\n // Step 4: Execute based on platform\n let result: PushResult;\n\n if (platform === 'web') {\n logger.info('🌐 Executing in web environment (JSDOM)...');\n result = await executeWebPush(tempPath, validatedEvent, logger);\n } else if (platform === 'server') {\n logger.info('🖥️ Executing in server environment (Node.js)...');\n result = await executeServerPush(tempPath, validatedEvent, logger);\n } else {\n throw new Error(`Unsupported platform: ${platform}`);\n }\n\n // Step 5: Output results\n const duration = Date.now() - startTime;\n\n if (options.json) {\n // JSON output\n const outputLogger = createLogger({ silent: false, json: false });\n outputLogger.log(\n 'white',\n JSON.stringify(\n {\n success: result.success,\n event: result.elbResult,\n duration,\n },\n null,\n 2,\n ),\n );\n } else {\n // Standard output\n if (result.success) {\n logger.success('✅ Event pushed successfully');\n if (result.elbResult && typeof result.elbResult === 'object') {\n const pushResult = result.elbResult as unknown as Record<\n string,\n unknown\n >;\n if ('id' in pushResult && pushResult.id) {\n logger.info(` Event ID: ${pushResult.id}`);\n }\n if ('entity' in pushResult && pushResult.entity) {\n logger.info(` Entity: ${pushResult.entity}`);\n }\n if ('action' in pushResult && pushResult.action) {\n logger.info(` Action: ${pushResult.action}`);\n }\n }\n logger.info(` Duration: ${duration}ms`);\n } else {\n logger.error(`❌ Push failed: ${result.error}`);\n process.exit(1);\n }\n }\n\n // Cleanup temp directory\n try {\n await fs.remove(tempDir);\n } catch {\n // Ignore cleanup errors\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const outputLogger = createLogger({ silent: false, json: false });\n outputLogger.log(\n 'white',\n JSON.stringify(\n {\n success: false,\n error: errorMessage,\n duration,\n },\n null,\n 2,\n ),\n );\n } else {\n logger.error(`❌ Push command failed: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n },\n 'push',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * Typed event input for push command\n */\ninterface PushEventInput {\n name: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Execute push for web platform using JSDOM with real APIs\n */\nasync function executeWebPush(\n bundlePath: string,\n event: PushEventInput,\n logger: Logger,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // Create JSDOM with silent console\n const virtualConsole = new VirtualConsole();\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously',\n resources: 'usable',\n virtualConsole,\n });\n\n const { window } = dom;\n\n // JSDOM provides fetch natively, no need to inject node-fetch\n\n // Load and execute bundle\n logger.debug('Loading bundle...');\n const bundleCode = await fs.readFile(bundlePath, 'utf8');\n window.eval(bundleCode);\n\n // Wait for window.elb assignment\n logger.debug('Waiting for elb...');\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'elb',\n 5000,\n );\n\n const windowObj = window as unknown as Record<string, unknown>;\n const elb = windowObj.elb as unknown as (\n name: string,\n data: Record<string, unknown>,\n ) => Promise<Elb.PushResult>;\n\n // Push event\n logger.info(`Pushing event: ${event.name}`);\n const elbResult = await elb(event.name, event.data);\n\n return {\n success: true,\n elbResult,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Execute push for server platform using Node.js\n */\nasync function executeServerPush(\n bundlePath: string,\n event: PushEventInput,\n logger: Logger,\n timeout: number = 60000, // 60 second default timeout\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Server push timeout after ${timeout}ms`)),\n timeout,\n );\n });\n\n // Execute with timeout\n const executePromise = (async () => {\n // Dynamic import of ESM bundle\n logger.debug('Importing bundle...');\n const flowModule = await import(bundlePath);\n\n if (!flowModule.default || typeof flowModule.default !== 'function') {\n throw new Error('Bundle does not export default factory function');\n }\n\n // Call factory function to start flow\n logger.debug('Calling factory function...');\n const result = await flowModule.default();\n\n if (!result || !result.elb || typeof result.elb !== 'function') {\n throw new Error(\n 'Factory function did not return valid result with elb',\n );\n }\n\n const { elb } = result;\n\n // Push event\n logger.info(`Pushing event: ${event.name}`);\n const elbResult = await (\n elb as (\n name: string,\n data: Record<string, unknown>,\n ) => Promise<Elb.PushResult>\n )(event.name, event.data);\n\n return {\n success: true,\n elbResult,\n duration: Date.now() - startTime,\n };\n })();\n\n // Race between execution and timeout\n return await Promise.race([executePromise, timeoutPromise]);\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Wait for window property to be assigned\n */\nfunction waitForWindowProperty(\n window: Record<string, unknown>,\n prop: string,\n timeout: number = 5000,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n\n const check = () => {\n if (window[prop] !== undefined) {\n resolve();\n } else if (Date.now() - start > timeout) {\n reject(\n new Error(\n `Timeout waiting for window.${prop}. IIFE may have failed to execute.`,\n ),\n );\n } else {\n setImmediate(check);\n }\n };\n\n check();\n });\n}\n\n// Export types\nexport type { PushCommandOptions, PushResult };\n","/**\n * Run Command\n *\n * Runs walkerOS flows using @walkeros/docker as a library\n * No Docker daemon required - runs directly in Node.js\n */\n\nimport path from 'path';\nimport {\n createCommandLogger,\n createTimer,\n getExecutionMode,\n getErrorMessage,\n executeRunInDocker,\n isDockerAvailable,\n} from '../../core/index.js';\nimport { validateMode, validateFlowFile, validatePort } from './validators.js';\nimport { prepareBundleForRun, isPreBuiltConfig } from './utils.js';\nimport { executeRunLocal } from './execution.js';\nimport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './types.js';\n\n/**\n * CLI command function for `walkeros run`\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Command options\n */\nexport async function runCommand(\n mode: string,\n options: RunCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCommandLogger(options);\n\n try {\n // Step 1: Validate inputs\n validateMode(mode);\n const configPath = validateFlowFile(options.config);\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Step 2: Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(configPath);\n\n let flowPath: string | null = null;\n\n if (mode === 'collect') {\n if (isPreBuilt) {\n // Use pre-built bundle directly\n flowPath = path.resolve(configPath);\n if (!options.json && !options.silent) {\n logger.info(`📦 Using pre-built flow: ${path.basename(flowPath)}`);\n }\n } else {\n // Bundle JSON config first\n if (!options.json && !options.silent) {\n logger.info('🔨 Building flow bundle...');\n }\n\n flowPath = await prepareBundleForRun(configPath, {\n verbose: options.verbose,\n silent: options.json || options.silent,\n });\n\n if (!options.json && !options.silent) {\n logger.success('✅ Bundle ready');\n }\n }\n }\n\n // Step 3: Execute based on mode\n const executionMode = getExecutionMode(options);\n\n // Handle dry-run\n if (options.dryRun) {\n if (executionMode === 'docker') {\n logger.info(\n `[DRY-RUN] Would execute in Docker: run ${mode} with runtime image`,\n );\n } else {\n logger.info(`[DRY-RUN] Would execute locally: run ${mode}`);\n }\n return;\n }\n\n if (executionMode === 'docker') {\n // Docker mode: Use production runtime image\n const dockerAvailable = await isDockerAvailable();\n if (!dockerAvailable) {\n throw new Error(\n 'Docker is not available. Please install Docker or use --local flag to execute locally.',\n );\n }\n\n if (!options.json && !options.silent) {\n logger.info('🐳 Executing in production runtime container...');\n }\n\n await executeRunInDocker(mode as 'collect' | 'serve', flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n silent: options.silent,\n });\n } else {\n // Local mode: Use library functions\n if (!options.json && !options.silent) {\n const modeLabel = mode === 'collect' ? 'Collector' : 'Server';\n logger.info(`🖥️ Starting ${modeLabel} locally...`);\n }\n\n await executeRunLocal(mode as 'collect' | 'serve', flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n });\n }\n\n // Note: Both Docker and local modes run forever, so we won't reach here unless they fail\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const output = {\n success: false,\n mode,\n error: errorMessage,\n duration,\n };\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(output, null, 2));\n } else {\n logger.error('❌ Run failed:');\n logger.error(errorMessage);\n }\n process.exit(1);\n }\n}\n\n/**\n * Programmatic run function\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Run options\n * @returns Run result\n *\n * @example\n * ```typescript\n * // Run with JSON config (bundles automatically)\n * await run('collect', {\n * config: './flow.json',\n * port: 8080\n * });\n *\n * // Run with pre-built bundle\n * await run('collect', {\n * config: './flow.mjs',\n * port: 8080\n * });\n * ```\n */\nexport async function run(\n mode: RunMode,\n options: RunOptions,\n): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\n // Validate inputs\n validateMode(mode);\n\n let flowFile: string;\n if (typeof options.config === 'string') {\n flowFile = validateFlowFile(options.config);\n } else {\n throw new Error('Programmatic run() requires config file path');\n }\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(flowFile);\n\n let flowPath: string;\n\n if (isPreBuilt) {\n flowPath = path.resolve(flowFile);\n } else {\n // Bundle JSON config\n flowPath = await prepareBundleForRun(flowFile, {\n verbose: options.verbose,\n silent: true,\n });\n }\n\n // Run the flow using Docker package\n await executeRunLocal(mode, flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n });\n\n // Success (though runFlow runs forever, so we typically don't reach here)\n return {\n success: true,\n exitCode: 0,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n// Export types\nexport type { RunMode, RunCommandOptions, RunOptions, RunResult };\n","/**\n * Run Command Validators\n *\n * Validation logic for run command inputs.\n * Uses Zod schemas for type-safe validation.\n */\n\nimport { existsSync } from 'fs';\nimport { resolveAsset } from '../../core/asset-resolver.js';\nimport {\n RunModeSchema,\n PortSchema,\n type RunMode,\n} from '../../schemas/index.js';\n\n/**\n * Validates run mode using Zod schema.\n *\n * @param mode - Mode to validate\n * @throws Error if mode is invalid\n */\nexport function validateMode(mode: string): asserts mode is RunMode {\n const result = RunModeSchema.safeParse(mode);\n if (!result.success) {\n throw new Error(\n `Invalid mode: \"${mode}\"\\n` +\n ` Valid modes: collect, serve\\n` +\n ` Example: walkeros run collect ./flow.json`,\n );\n }\n}\n\n/**\n * Validates flow file exists.\n *\n * @remarks\n * File existence cannot be validated by Zod, so this remains a custom check.\n *\n * @param filePath - Path to flow configuration file (bare name, relative, or absolute)\n * @returns Absolute path to flow file\n * @throws Error if file doesn't exist\n */\nexport function validateFlowFile(filePath: string): string {\n // Use asset resolver to handle bare names, relative paths, and absolute paths\n const absolutePath = resolveAsset(filePath, 'bundle');\n\n if (!existsSync(absolutePath)) {\n throw new Error(\n `Flow file not found: ${filePath}\\n` +\n ` Resolved path: ${absolutePath}\\n` +\n ` Make sure the file exists and the path is correct`,\n );\n }\n\n return absolutePath;\n}\n\n/**\n * Validates port number using Zod schema.\n *\n * @param port - Port number to validate\n * @throws Error if port is invalid\n */\nexport function validatePort(port: number): void {\n const result = PortSchema.safeParse(port);\n if (!result.success) {\n throw new Error(\n `Invalid port: ${port}\\n` +\n ` Port must be an integer between 1 and 65535\\n` +\n ` Example: --port 8080`,\n );\n }\n}\n","/**\n * CLI Primitive Schemas\n *\n * Basic Zod schemas for CLI parameter validation.\n * Follows walkerOS patterns from @walkeros/core.\n */\n\nimport { z } from '@walkeros/core/dev';\n\n/**\n * Run mode schema.\n *\n * @remarks\n * Validates CLI run mode for the `run` command.\n * - `collect`: Run as event collector\n * - `serve`: Run as HTTP server\n */\nexport const RunModeSchema = z\n .enum(['collect', 'serve'])\n .describe('CLI run mode: collect events or serve HTTP');\n\nexport type RunMode = z.infer<typeof RunModeSchema>;\n\n/**\n * Port number schema.\n *\n * @remarks\n * Validates HTTP server port number.\n * Must be integer between 1-65535.\n */\nexport const PortSchema = z\n .number()\n .int('Port must be an integer')\n .min(1, 'Port must be at least 1')\n .max(65535, 'Port must be at most 65535')\n .describe('HTTP server port number');\n\n/**\n * File path schema.\n *\n * @remarks\n * Basic string validation for file paths.\n * File existence is checked separately (Zod can't check filesystem).\n */\nexport const FilePathSchema = z\n .string()\n .min(1, 'File path cannot be empty')\n .describe('Path to configuration file');\n","/**\n * Run Command Schemas\n *\n * Zod schemas for run command options validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { RunModeSchema, PortSchema, FilePathSchema } from './primitives';\n\n/**\n * Run command options schema.\n *\n * @remarks\n * Validates all options for the `walkeros run` command.\n */\nexport const RunOptionsSchema = z.object({\n mode: RunModeSchema,\n flow: FilePathSchema,\n port: PortSchema.default(8080),\n flowName: z.string().optional().describe('Specific flow name to run'),\n});\n\nexport type RunOptions = z.infer<typeof RunOptionsSchema>;\n","/**\n * Run Command Utilities\n *\n * Shared utilities for the run command\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { bundle } from '../bundle/index.js';\n\n/**\n * Prepares a JSON config file for execution by bundling it to a temporary location.\n *\n * Creates bundle in .tmp/ directory relative to config file (not /tmp)\n * so Node.js module resolution finds node_modules.\n *\n * @param configPath - Path to the JSON configuration file\n * @param options - Bundle options\n * @param options.verbose - Enable verbose logging\n * @param options.silent - Suppress output\n * @returns Path to the bundled output file\n */\nexport async function prepareBundleForRun(\n configPath: string,\n options: {\n verbose?: boolean;\n silent?: boolean;\n },\n): Promise<string> {\n // Create temp directory relative to config (ensures node_modules is findable)\n const configDir = path.dirname(path.resolve(configPath));\n const tempDir = path.join(\n configDir,\n '.tmp',\n `run-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n await fs.ensureDir(tempDir);\n\n // Generate output path in temp directory\n const tempPath = path.join(tempDir, 'bundle.mjs');\n\n // Bundle with proper output override\n await bundle(configPath, {\n cache: true,\n verbose: options.verbose,\n silent: options.silent,\n buildOverrides: {\n output: tempPath,\n format: 'esm',\n platform: 'node',\n },\n });\n\n return tempPath;\n}\n\n/**\n * Checks if a config file is pre-built or needs bundling\n *\n * @param configPath - Path to configuration file\n * @returns True if file is pre-built (js/mjs/cjs), false if needs bundling (json)\n */\nexport function isPreBuiltConfig(configPath: string): boolean {\n return (\n configPath.endsWith('.mjs') ||\n configPath.endsWith('.js') ||\n configPath.endsWith('.cjs')\n );\n}\n","import { createLogger, Level } from '@walkeros/core';\nimport type { RuntimeConfig, ServeConfig } from '@walkeros/docker';\nimport { runFlow, runServeMode } from '@walkeros/docker';\n\n// Create logger for local execution - DEBUG level when VERBOSE, otherwise INFO\nconst logLevel = process.env.VERBOSE === 'true' ? Level.DEBUG : Level.INFO;\nconst logger = createLogger({ level: logLevel });\n\n/**\n * Execute run command locally\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to flow bundle (required for collect, optional for serve)\n * @param options - Runtime options\n */\nexport async function executeRunLocal(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n serveName?: string;\n servePath?: string;\n },\n): Promise<void> {\n switch (mode) {\n case 'collect': {\n if (!flowPath) {\n throw new Error('Flow path is required for collect mode');\n }\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config, logger.scope('runner'));\n break;\n }\n\n case 'serve': {\n const config: ServeConfig = {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n filePath: flowPath || undefined,\n };\n await runServeMode(config, logger.scope('serve'));\n break;\n }\n\n default:\n throw new Error(`Unknown mode: ${mode}`);\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { Command } from 'commander';\n\nconst CACHE_DIR = path.join('.tmp', 'cache');\n\nexport function registerCacheCommand(program: Command): void {\n const cache = program.command('cache').description('Manage the CLI cache');\n\n cache\n .command('clear')\n .description('Clear all cached packages and builds')\n .option('--packages', 'Clear only package cache')\n .option('--builds', 'Clear only build cache')\n .action(async (options) => {\n if (options.packages) {\n await fs.remove(path.join(CACHE_DIR, 'packages'));\n console.log('Package cache cleared');\n } else if (options.builds) {\n await fs.remove(path.join(CACHE_DIR, 'builds'));\n console.log('Build cache cleared');\n } else {\n await fs.remove(CACHE_DIR);\n console.log('All caches cleared');\n }\n });\n\n cache\n .command('info')\n .description('Show cache statistics')\n .action(async () => {\n const packagesDir = path.join(CACHE_DIR, 'packages');\n const buildsDir = path.join(CACHE_DIR, 'builds');\n\n const packageCount = await countEntries(packagesDir);\n const buildCount = await countEntries(buildsDir);\n\n console.log(`Cache directory: ${CACHE_DIR}`);\n console.log(`Cached packages: ${packageCount}`);\n console.log(`Cached builds: ${buildCount}`);\n });\n}\n\nasync function countEntries(dir: string): Promise<number> {\n if (!(await fs.pathExists(dir))) return 0;\n const entries = await fs.readdir(dir);\n return entries.length;\n}\n"],"mappings":"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","names":["fileURLToPath","DOCKER_VERSION","path","path","path","path","logger","fs","path","path","fs","logger","path","path","fs","path","fs","path","fs","path","fs","getHashServer","input","path","fs","logger","packageJson","fs","path","path","fs","logger","path","fs","logger","logger","path","path","fs","getPlatform","path","fs","fs","logger","path","fs","getPlatform","logger","path","JSDOM","VirtualConsole","fs","getPlatform","schemas","logger","schemas","path","getPlatform","fs","VirtualConsole","JSDOM","waitForWindowProperty","path","existsSync","z","z","existsSync","path","fs","path","fs","createLogger","logger","path","fs","path","program","fileURLToPath","DOCKER_VERSION"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/bundle/index.ts","../src/core/logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/docker.ts","../src/config/utils.ts","../src/core/execution.ts","../src/core/temp-manager.ts","../src/core/asset-resolver.ts","../src/core/utils.ts","../src/core/local-packages.ts","../src/config/validators.ts","../src/config/build-defaults.ts","../src/config/loader.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/package-manager.ts","../src/core/cache-utils.ts","../src/core/build-cache.ts","../src/commands/bundle/stats.ts","../src/commands/simulate/simulator.ts","../src/commands/simulate/tracker.ts","../src/commands/simulate/jsdom-executor.ts","../src/commands/simulate/node-executor.ts","../src/commands/simulate/env-loader.ts","../src/commands/simulate/index.ts","../src/commands/push/index.ts","../src/commands/run/index.ts","../src/commands/run/validators.ts","../src/schemas/primitives.ts","../src/schemas/run.ts","../src/commands/run/utils.ts","../src/commands/run/execution.ts","../src/commands/cache.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { VERSION as DOCKER_VERSION } from '@walkeros/docker';\nimport { bundleCommand } from './commands/bundle/index.js';\nimport { simulateCommand } from './commands/simulate/index.js';\nimport { pushCommand } from './commands/push/index.js';\nimport { runCommand } from './commands/run/index.js';\nimport { registerCacheCommand } from './commands/cache.js';\n\n// Get package version dynamically\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../package.json'), 'utf-8'),\n);\nconst VERSION = packageJson.version;\n\n// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand, simulateCommand, pushCommand, runCommand };\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle } from './commands/bundle/index.js';\nexport { simulate } from './commands/simulate/index.js';\nexport { run } from './commands/run/index.js';\n\n// === Types ===\n// Export types for programmatic usage\n// Config structure uses Flow.Setup and Flow.Config from @walkeros/core\nexport type {\n Flow,\n CLIBuildOptions,\n BuildOptions,\n MinifyOptions,\n} from './types/bundle.js';\nexport type { BundleStats } from './commands/bundle/bundler.js';\nexport type { SimulationResult } from './commands/simulate/types.js';\nexport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './commands/run/index.js';\nexport type { GlobalOptions } from './types/global.js';\n\nconst program = new Command();\n\nprogram\n .name('walkeros')\n .description('walkerOS CLI - Bundle and deploy walkerOS components')\n .version(VERSION);\n\n// Display startup banner before any command runs\nprogram.hook('preAction', (thisCommand, actionCommand) => {\n const options = actionCommand.opts();\n // Skip banner for --silent, --json, or --help flags\n if (!options.silent && !options.json) {\n console.log(`🚀 walkerOS CLI v${VERSION}`);\n console.log(`🐳 Using Docker runtime: walkeros/docker:${DOCKER_VERSION}`);\n }\n});\n\n// Bundle command\nprogram\n .command('bundle [file]')\n .description('Bundle NPM packages with custom code')\n .option('-f, --flow <name>', 'flow to build (for multi-flow configs)')\n .option('--all', 'build all flows (for multi-flow configs)')\n .option('-s, --stats', 'show bundle statistics')\n .option('--json', 'output statistics in JSON format (implies --stats)')\n .option('--no-cache', 'disable package caching and download fresh packages')\n .option('-v, --verbose', 'verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await bundleCommand({\n config: file || 'bundle.config.json',\n flow: options.flow,\n all: options.all,\n stats: options.stats,\n json: options.json,\n cache: options.cache,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Simulate command\nprogram\n .command('simulate [file]')\n .description('Simulate event processing and capture API calls')\n .option(\n '-e, --event <source>',\n 'Event to simulate (JSON string, file path, or URL)',\n )\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await simulateCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Push command\nprogram\n .command('push [file]')\n .description('Push an event through the flow with real API execution')\n .requiredOption(\n '-e, --event <source>',\n 'Event to push (JSON string, file path, or URL)',\n )\n .option('--flow <name>', 'Flow name (for multi-flow configs)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('-s, --silent', 'Suppress output')\n .option('--local', 'Execute in local Node.js instead of Docker')\n .action(async (file, options) => {\n await pushCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n flow: options.flow,\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n local: options.local,\n });\n });\n\n// Run command with subcommands\nconst runCmd = program\n .command('run')\n .description('Run walkerOS flows in collect or serve mode');\n\n// Run collect subcommand\nrunCmd\n .command('collect [file]')\n .description(\n 'Run collector mode (event collection endpoint). Defaults to server-collect.mjs if no file specified.',\n )\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('collect', {\n config: file || 'server-collect.mjs',\n port: options.port,\n host: options.host,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Run serve subcommand\nrunCmd\n .command('serve [file]')\n .description(\n 'Run serve mode (single-file server for browser bundles). Defaults to baked-in web-serve.js if no file specified.',\n )\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--name <filename>', 'Filename in URL (default: walker.js)')\n .option('--path <directory>', 'URL directory path (e.g., libs/v1)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('serve', {\n config: file || 'web-serve.js',\n port: options.port,\n host: options.host,\n serveName: options.name,\n servePath: options.path,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Cache command\nregisterCacheCommand(program);\n\n// Run the CLI\n// Note: This file is marked as a bin script in package.json,\n// so it's always executed directly (never imported as a library)\nprogram.parse();\n","/**\n * Bundle Command\n *\n * Supports both single-flow and multi-flow builds.\n */\n\nimport path from 'path';\nimport {\n createCommandLogger,\n createLogger,\n createTimer,\n createSuccessOutput,\n createErrorOutput,\n executeCommand,\n getErrorMessage,\n buildCommonDockerArgs,\n resolveAsset,\n} from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n loadAllFlows,\n type LoadConfigResult,\n} from '../../config/index.js';\nimport type { GlobalOptions } from '../../types/index.js';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { bundleCore } from './bundler.js';\nimport { displayStats, createStatsSummary } from './stats.js';\n\nexport interface BundleCommandOptions extends GlobalOptions {\n config: string;\n flow?: string;\n all?: boolean;\n stats?: boolean;\n json?: boolean;\n cache?: boolean;\n}\n\nexport async function bundleCommand(\n options: BundleCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCommandLogger(options);\n\n // Build Docker args - start with common flags\n const dockerArgs = buildCommonDockerArgs(options);\n // Add bundle-specific flags\n if (options.flow) dockerArgs.push('--flow', options.flow);\n if (options.all) dockerArgs.push('--all');\n if (options.stats) dockerArgs.push('--stats');\n if (options.cache === false) dockerArgs.push('--no-cache');\n\n await executeCommand(\n async () => {\n try {\n // Validate flag combination\n if (options.flow && options.all) {\n throw new Error('Cannot use both --flow and --all flags together');\n }\n\n // Step 1: Read configuration file\n logger.info('📦 Reading configuration...');\n // Resolve bare names to examples directory, keep paths/URLs as-is\n const configPath = resolveAsset(options.config, 'config');\n const rawConfig = await loadJsonConfig(configPath);\n\n // Step 2: Load configuration(s) based on flags\n const configsToBundle: LoadConfigResult[] = options.all\n ? loadAllFlows(rawConfig, { configPath, logger })\n : [\n loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flow,\n logger,\n }),\n ];\n\n // Step 3: Bundle each configuration\n const results: Array<{\n flowName: string;\n success: boolean;\n stats?: unknown;\n error?: string;\n }> = [];\n\n for (const {\n flowConfig,\n buildOptions,\n flowName,\n isMultiFlow,\n } of configsToBundle) {\n try {\n // Override cache setting from CLI if provided\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // Log flow being built (for multi-flow setups)\n if (isMultiFlow || options.all) {\n logger.info(`\\n🔧 Building flow: ${flowName}`);\n } else {\n logger.info('🔧 Starting bundle process...');\n }\n\n // Run bundler\n const shouldCollectStats = options.stats || options.json;\n const stats = await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n shouldCollectStats,\n );\n\n results.push({\n flowName,\n success: true,\n stats,\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 } catch (error) {\n const errorMessage = getErrorMessage(error);\n results.push({\n flowName,\n success: false,\n error: errorMessage,\n });\n\n if (!options.all) {\n throw error; // Re-throw for single flow builds\n }\n }\n }\n\n // Step 4: Report results\n const duration = timer.end() / 1000;\n const successCount = results.filter((r) => r.success).length;\n const failureCount = results.filter((r) => !r.success).length;\n\n if (options.json) {\n // JSON output for CI/CD\n const outputLogger = createLogger({ silent: false, json: false });\n const output =\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 outputLogger.log('white', JSON.stringify(output, null, 2));\n } else {\n if (options.all) {\n logger.info(`\\n📊 Build Summary:`);\n logger.info(` Total: ${results.length}`);\n logger.success(` ✅ Success: ${successCount}`);\n if (failureCount > 0) {\n logger.error(` ❌ Failed: ${failureCount}`);\n }\n }\n\n if (failureCount === 0) {\n logger.success(\n `\\n✅ Bundle created successfully in ${timer.format()}`,\n );\n } else {\n throw new Error(`${failureCount} flow(s) failed to build`);\n }\n }\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n // JSON error output for CI/CD\n const outputLogger = createLogger({ silent: false, json: false });\n const output = createErrorOutput(errorMessage, duration);\n outputLogger.log('white', JSON.stringify(output, null, 2));\n } else {\n logger.error('❌ Bundle failed:');\n logger.error(errorMessage);\n }\n process.exit(1);\n }\n },\n 'bundle',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * High-level bundle function for programmatic usage.\n *\n * Handles configuration loading, parsing, and logger creation internally.\n *\n * @param configOrPath - Bundle configuration (Flow.Setup) or path to config file\n * @param options - Bundle options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.stats - Collect and return bundle statistics (default: false)\n * @param options.cache - Enable package caching (default: true)\n * @param options.flowName - Flow to use (required for multi-flow configs)\n * @returns Bundle statistics if stats option is true, otherwise void\n *\n * @example\n * ```typescript\n * // With Flow.Setup config object\n * await bundle({\n * version: 1,\n * flows: {\n * default: {\n * web: {},\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * destinations: { api: { code: 'destinationApi' } },\n * }\n * }\n * });\n *\n * // With config file\n * await bundle('./walker.config.json', { stats: true });\n * ```\n */\nexport async function bundle(\n configOrPath: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n stats?: boolean;\n cache?: boolean;\n flowName?: string;\n buildOverrides?: Partial<BuildOptions>;\n } = {},\n): Promise<import('./bundler').BundleStats | void> {\n // 1. Load config if path provided\n let rawConfig: unknown;\n // Use current working directory as base when config is passed as object\n let configPath = path.resolve(process.cwd(), 'walkeros.config.json');\n if (typeof configOrPath === 'string') {\n // Resolve bare names to examples directory, keep paths as-is\n configPath = resolveAsset(configOrPath, 'config');\n rawConfig = await loadJsonConfig(configPath);\n } else {\n rawConfig = configOrPath;\n }\n\n // 2. Load and resolve config using Flow.Setup format\n const { flowConfig, buildOptions } = loadBundleConfig(rawConfig, {\n configPath,\n flowName: options.flowName,\n buildOverrides: options.buildOverrides,\n });\n\n // 3. Handle cache option\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // 4. Create logger internally\n const logger = createCommandLogger(options);\n\n // 5. Call core bundler\n return await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n options.stats ?? false,\n );\n}\n","/* eslint-disable no-console */\nimport chalk from 'chalk';\nimport type { GlobalOptions } from '../types/global.js';\n\nexport interface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n}\n\nexport interface Logger {\n log: (color: string, ...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void; // Alias for warning\n error: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n gray: (...args: unknown[]) => void;\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { verbose = false, silent = false, json = false } = options;\n\n const shouldLog = !silent && !json;\n const shouldDebug = verbose && !silent && !json;\n\n return {\n log: (color: string, ...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n // Map color names to chalk functions\n const colorMap: Record<string, (text: string) => string> = {\n red: chalk.red,\n green: chalk.green,\n blue: chalk.blue,\n yellow: chalk.yellow,\n gray: chalk.gray,\n grey: chalk.gray,\n cyan: chalk.cyan,\n magenta: chalk.magenta,\n white: chalk.white,\n black: chalk.black,\n };\n const colorFn = colorMap[color];\n const coloredMessage = colorFn ? colorFn(message) : message;\n console.log(coloredMessage);\n }\n },\n\n info: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.blue(message));\n }\n },\n\n success: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.green(message));\n }\n },\n\n warning: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.yellow(message));\n }\n },\n\n warn: (...args: unknown[]) => {\n // Alias for warning\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.yellow(message));\n }\n },\n\n error: (...args: unknown[]) => {\n if (!json) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.error(chalk.red(message));\n }\n },\n\n debug: (...args: unknown[]) => {\n if (shouldDebug) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.gray(message));\n }\n },\n\n gray: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.gray(message));\n }\n },\n };\n}\n\n/**\n * Create logger from command options\n * Factory function that standardizes logger creation across commands\n *\n * @param options - Command options containing verbose, silent, and json flags\n * @returns Configured logger instance\n */\nexport function createCommandLogger(\n options: GlobalOptions & { json?: boolean },\n): Logger {\n return createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n}\n","/**\n * Timer utilities for measuring execution time\n */\n\nexport interface Timer {\n start: () => void;\n end: () => number;\n getElapsed: () => number;\n format: () => string;\n}\n\n/**\n * Create a high-precision timer\n */\nexport function createTimer(): Timer {\n let startTime = 0;\n let endTime = 0;\n\n return {\n start() {\n startTime = Date.now();\n endTime = 0;\n },\n\n end() {\n endTime = Date.now();\n return endTime - startTime;\n },\n\n getElapsed() {\n const currentTime = endTime || Date.now();\n return currentTime - startTime;\n },\n\n format() {\n const elapsed = this.getElapsed();\n return (elapsed / 1000).toFixed(2) + 's';\n },\n };\n}\n","/**\n * Output formatting utilities for CLI commands\n */\n\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 * Docker Execution Utilities\n *\n * Handles Docker container execution for CLI commands.\n */\n\nimport { spawn } from 'child_process';\nimport path from 'path';\nimport { VERSION as DOCKER_VERSION } from '@walkeros/docker';\nimport { isUrl } from '../config/utils.js';\nimport type { GlobalOptions } from '../types/global.js';\n\n// Version injected at build time via tsup define\ndeclare const __VERSION__: string;\nconst CLI_VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0';\n\n/**\n * Docker image for CLI/build tools (bundle, simulate)\n * Uses explicit version by default, can be overridden with env var\n */\nexport const CLI_DOCKER_IMAGE =\n process.env.WALKEROS_CLI_DOCKER_IMAGE || `walkeros/cli:${CLI_VERSION}`;\n\n/**\n * Docker image for production runtime (run command)\n * Uses explicit version by default, can be overridden with env var\n */\nexport const RUNTIME_DOCKER_IMAGE =\n process.env.WALKEROS_RUNTIME_DOCKER_IMAGE ||\n `walkeros/docker:${DOCKER_VERSION}`;\n\n/**\n * @deprecated Use CLI_DOCKER_IMAGE or RUNTIME_DOCKER_IMAGE instead\n */\nexport const DOCKER_IMAGE = CLI_DOCKER_IMAGE;\n\n/**\n * Build common Docker arguments from CLI options\n *\n * Extracts common flags (config, json, verbose, silent) that are shared\n * across bundle and simulate commands. Command-specific flags should be\n * added after calling this function.\n *\n * @param options - CLI options containing common flags\n * @returns Array of command-line arguments starting with config path\n */\nexport function buildCommonDockerArgs(options: {\n config: string;\n json?: boolean;\n verbose?: boolean;\n silent?: boolean;\n}): string[] {\n const args = [options.config];\n\n // Common flags\n if (options.json) args.push('--json');\n if (options.verbose) args.push('--verbose');\n if (options.silent) args.push('--silent');\n\n return args;\n}\n\n/**\n * Build Docker command for executing CLI commands\n *\n * @param command - CLI command (bundle, simulate, run)\n * @param args - Command arguments\n * @param options - Global options\n * @param configFile - Optional config file path to mount in Docker\n * @returns Docker command array\n */\nexport function buildDockerCommand(\n command: string,\n args: string[],\n options: GlobalOptions = {},\n configFile?: string,\n): string[] {\n const cwd = process.cwd();\n\n const cmd = ['docker', 'run', '--rm'];\n\n // Mount config file if provided (only for local files, not URLs)\n if (configFile && !isUrl(configFile)) {\n const configPath = path.resolve(cwd, configFile);\n\n // Mount config file at /config/flow.json (read-only, separate from workspace)\n cmd.push('-v', `${configPath}:/config/flow.json:ro`);\n\n // Update args to use container path - replace first occurrence of config file path\n args = args.map((arg) => (arg === configFile ? '/config/flow.json' : arg));\n }\n // For URLs, pass them through as-is - container will download them\n\n // Mount current directory for output files\n cmd.push('-v', `${cwd}:/workspace`);\n cmd.push('-w', '/workspace');\n\n // Add user mapping on Linux/Mac to prevent permission issues\n if (process.platform !== 'win32') {\n try {\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined && gid !== undefined) {\n cmd.push('--user', `${uid}:${gid}`);\n }\n } catch {\n // Ignore if not available\n }\n }\n\n // Pass through environment variables\n if (options.verbose) {\n cmd.push('-e', 'VERBOSE=true');\n }\n if (options.silent) {\n cmd.push('-e', 'SILENT=true');\n }\n\n // Add the Docker image (CLI tools for bundle/simulate)\n cmd.push(CLI_DOCKER_IMAGE);\n\n // Add the command and arguments\n cmd.push(command, ...args);\n\n return cmd;\n}\n\n/**\n * Execute command in Docker container\n *\n * @param command - CLI command\n * @param args - Command arguments\n * @param options - Global options\n * @param configFile - Optional config file path to mount in Docker\n * @returns Promise that resolves when command completes\n */\nexport async function executeInDocker(\n command: string,\n args: string[],\n options: GlobalOptions = {},\n configFile?: string,\n): Promise<void> {\n // Force --local execution inside container to prevent nested Docker attempts\n // Architecture: Host CLI decides environment (Docker vs local),\n // Container CLI always executes locally (no Docker-in-Docker)\n const containerArgs = [...args, '--local'];\n\n const dockerCmd = buildDockerCommand(\n command,\n containerArgs,\n options,\n configFile,\n );\n\n return new Promise((resolve, reject) => {\n const proc = spawn(dockerCmd[0], dockerCmd.slice(1), {\n stdio: options.silent ? 'ignore' : 'inherit',\n shell: false,\n });\n\n proc.on('error', (error) => {\n reject(new Error(`Docker execution failed: ${error.message}`));\n });\n\n proc.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n // Docker already logged the error via stdio inherit\n // Just exit with same code - no duplicate message\n process.exit(code || 1);\n }\n });\n });\n}\n\n/**\n * Check if Docker is available\n *\n * @returns Promise resolving to true if Docker is available\n */\nexport async function isDockerAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('docker', ['--version'], {\n stdio: 'ignore',\n });\n\n proc.on('error', () => resolve(false));\n proc.on('exit', (code) => resolve(code === 0));\n });\n}\n\n/**\n * Check if Docker image exists locally\n *\n * @param image - Docker image name\n * @returns Promise resolving to true if image exists\n */\nexport async function imageExists(\n image: string = CLI_DOCKER_IMAGE,\n): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('docker', ['image', 'inspect', image], {\n stdio: 'ignore',\n });\n\n proc.on('error', () => resolve(false));\n proc.on('exit', (code) => resolve(code === 0));\n });\n}\n\n/**\n * Build Docker command for run command (production runtime)\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to pre-built .mjs bundle (for collect mode) or custom file (for serve mode)\n * @param options - Runtime options\n * @returns Docker command array\n */\nexport function buildDockerRunCommand(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n serveName?: string;\n servePath?: string;\n } = {},\n): string[] {\n const cwd = process.cwd();\n const cmd = ['docker', 'run', '--rm'];\n\n // Set MODE environment variable\n cmd.push('-e', `MODE=${mode}`);\n\n // Mount entire dist folder for collect mode (includes bundle + shared folders)\n // Must mount to /app/dist (not /app) to preserve container's node_modules\n // This allows relative paths like ./shared/credentials/sa.json to work\n if (mode === 'collect' && flowPath) {\n const absoluteFlowPath = path.resolve(cwd, flowPath);\n const flowDir = path.dirname(absoluteFlowPath);\n const flowFile = path.basename(absoluteFlowPath);\n cmd.push('-v', `${flowDir}:/app/dist:ro`);\n cmd.push('-e', `FLOW=/app/dist/${flowFile}`);\n }\n\n // Mount custom file for serve mode\n if (mode === 'serve' && flowPath) {\n const absoluteFilePath = path.resolve(cwd, flowPath);\n cmd.push('-v', `${absoluteFilePath}:/app/bundle.mjs:ro`);\n cmd.push('-e', 'FILE_PATH=/app/bundle.mjs');\n }\n\n // Port mapping - always map port for serve mode, use default if not specified\n const port = options.port !== undefined ? options.port : 8080;\n cmd.push('-p', `${port}:${port}`);\n cmd.push('-e', `PORT=${port}`);\n\n // Host\n if (options.host) {\n cmd.push('-e', `HOST=${options.host}`);\n }\n\n // Serve name (filename in URL)\n if (options.serveName) {\n cmd.push('-e', `SERVE_NAME=${options.serveName}`);\n }\n\n // Serve path (URL directory path)\n if (options.servePath) {\n cmd.push('-e', `SERVE_PATH=${options.servePath}`);\n }\n\n // Add user mapping on Linux/Mac to prevent permission issues\n if (process.platform !== 'win32') {\n try {\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined && gid !== undefined) {\n cmd.push('--user', `${uid}:${gid}`);\n }\n } catch {\n // Ignore if not available\n }\n }\n\n // Add the runtime Docker image\n cmd.push(RUNTIME_DOCKER_IMAGE);\n\n return cmd;\n}\n\n/**\n * Execute run command in Docker container (production runtime)\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to pre-built .mjs bundle (for collect mode) or custom file (for serve mode)\n * @param options - Runtime and global options\n * @returns Promise that resolves when command completes\n */\nexport async function executeRunInDocker(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n serveName?: string;\n servePath?: string;\n silent?: boolean;\n } = {},\n): Promise<void> {\n const dockerCmd = buildDockerRunCommand(mode, flowPath, options);\n\n return new Promise((resolve, reject) => {\n const proc = spawn(dockerCmd[0], dockerCmd.slice(1), {\n stdio: options.silent ? 'ignore' : 'inherit',\n shell: false,\n });\n\n proc.on('error', (error) => {\n reject(new Error(`Docker execution failed: ${error.message}`));\n });\n\n proc.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n // Docker already logged the error via stdio inherit\n // Just exit with same code - no duplicate message\n process.exit(code || 1);\n }\n });\n });\n}\n","/**\n * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport os from 'os';\nimport { getErrorMessage } from '../core/index.js';\n\n/**\n * Check if a string is a valid URL\n *\n * @param str - String to check\n * @returns True if string is a valid HTTP/HTTPS URL\n */\nexport function isUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Download a file from a URL to a temporary location\n *\n * @param url - HTTP/HTTPS URL to download\n * @returns Path to downloaded temporary file\n * @throws Error if download fails or response is not OK\n *\n * @example\n * ```typescript\n * const tempPath = await downloadFromUrl('https://example.com/config.json')\n * // Returns: \"/tmp/walkeros-download-1647261462000-abc123.json\"\n * ```\n */\nexport async function downloadFromUrl(url: string): Promise<string> {\n if (!isUrl(url)) {\n throw new Error(`Invalid URL: ${url}`);\n }\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to download ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n // Extract filename from URL or generate one\n const urlObj = new URL(url);\n const urlFilename = path.basename(urlObj.pathname);\n const extension = path.extname(urlFilename) || '.json';\n const randomId = Math.random().toString(36).substring(2, 11);\n const filename = `walkeros-download-${Date.now()}-${randomId}${extension}`;\n\n // Write to system temp directory\n const tempPath = path.join(os.tmpdir(), filename);\n await fs.writeFile(tempPath, content, 'utf-8');\n\n return tempPath;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to download from URL: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Substitute environment variables in a string.\n *\n * @param value - String with ${VAR} placeholders\n * @returns String with environment variables substituted\n * @throws Error if environment variable is not found\n *\n * @example\n * ```typescript\n * substituteEnvVariables('${HOME}/config') // \"/Users/name/config\"\n * ```\n */\nexport function substituteEnvVariables(value: string): string {\n return value.replace(/\\${([^}]+)}/g, (_, envVar) => {\n const envValue = process.env[envVar];\n if (!envValue) {\n throw new Error(`Environment variable ${envVar} not found`);\n }\n return envValue;\n });\n}\n\n/**\n * Load and parse JSON configuration file from local path or URL.\n *\n * @param configPath - Path to JSON file or HTTP/HTTPS URL\n * @returns Parsed configuration object and cleanup function\n * @throws Error if file not found, download fails, or invalid JSON\n *\n * @example\n * ```typescript\n * // Local file\n * const config = await loadJsonConfig('./config.json')\n *\n * // Remote URL\n * const config = await loadJsonConfig('https://example.com/config.json')\n * ```\n */\nexport async function loadJsonConfig<T>(configPath: string): Promise<T> {\n let absolutePath: string;\n let isTemporary = false;\n\n // Check if input is a URL\n if (isUrl(configPath)) {\n // Download from URL to temp location\n absolutePath = await downloadFromUrl(configPath);\n isTemporary = true;\n } else {\n // Local file path\n absolutePath = path.resolve(configPath);\n\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(`Configuration file not found: ${absolutePath}`);\n }\n }\n\n try {\n const rawConfig = await fs.readJson(absolutePath);\n return rawConfig as T;\n } catch (error) {\n throw new Error(\n `Invalid JSON in config file: ${configPath}. ${error instanceof Error ? error.message : error}`,\n );\n } finally {\n // Clean up temporary downloaded file\n if (isTemporary) {\n try {\n await fs.remove(absolutePath);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n\n/**\n * Generate a unique temporary directory path.\n *\n * @param tempDir - Base temporary directory (default: \".tmp\")\n * @returns Absolute path to unique temp directory\n *\n * @example\n * ```typescript\n * getTempDir() // \"/workspaces/project/.tmp/cli-1647261462000-abc123\"\n * getTempDir('/tmp') // \"/tmp/cli-1647261462000-abc123\"\n * ```\n */\nexport function getTempDir(tempDir = '.tmp'): string {\n const randomId = Math.random().toString(36).substring(2, 11);\n const basePath = path.isAbsolute(tempDir)\n ? tempDir\n : path.join(process.cwd(), tempDir);\n return path.join(basePath, `cli-${Date.now()}-${randomId}`);\n}\n\n/**\n * Load JSON from inline string, file path, or URL.\n *\n * Supports three input formats:\n * 1. Inline JSON string - parsed directly\n * 2. Local file path - read and parsed\n * 3. HTTP/HTTPS URL - downloaded and parsed\n *\n * Detection priority:\n * 1. URL (http://, https://) → download and parse\n * 2. Existing file path → read and parse\n * 3. Valid JSON string → parse directly\n * 4. Simple string → treat as {name: string} for backward compatibility\n *\n * @param source - JSON string, file path, or URL\n * @param options - Optional configuration\n * @param options.name - Parameter name for error messages (e.g., \"event\", \"config\")\n * @param options.required - Throw error if source is empty (default: false)\n * @param options.fallback - Default value if source is empty\n * @returns Parsed JSON object\n * @throws Error if source is required but empty, or if loading/parsing fails\n *\n * @example\n * ```typescript\n * // Inline JSON\n * await loadJsonFromSource('{\"name\":\"order complete\",\"data\":{}}')\n *\n * // File path\n * await loadJsonFromSource('./examples/event.json')\n *\n * // URL\n * await loadJsonFromSource('https://example.com/event.json')\n *\n * // With options\n * await loadJsonFromSource(input, {\n * name: 'event',\n * required: true,\n * fallback: { name: 'default' }\n * })\n * ```\n */\nexport async function loadJsonFromSource<T = unknown>(\n source: string | undefined,\n options?: {\n name?: string;\n required?: boolean;\n fallback?: T;\n },\n): Promise<T> {\n const paramName = options?.name || 'input';\n\n // Handle empty/undefined input\n if (!source || source.trim() === '') {\n if (options?.required) {\n throw new Error(`${paramName} is required`);\n }\n if (options?.fallback !== undefined) {\n return options.fallback;\n }\n return {} as T;\n }\n\n const trimmedSource = source.trim();\n\n // 1. Check if URL\n if (isUrl(trimmedSource)) {\n try {\n const tempPath = await downloadFromUrl(trimmedSource);\n try {\n const data = await fs.readJson(tempPath);\n return data as T;\n } finally {\n // Clean up temp file\n try {\n await fs.remove(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n }\n } catch (error) {\n throw new Error(\n `Failed to load ${paramName} from URL ${trimmedSource}: ${getErrorMessage(error)}`,\n );\n }\n }\n\n // 2. Check if file path exists\n const resolvedPath = path.resolve(trimmedSource);\n if (await fs.pathExists(resolvedPath)) {\n try {\n const data = await fs.readJson(resolvedPath);\n return data as T;\n } catch (error) {\n throw new Error(\n `Failed to parse ${paramName} from file ${trimmedSource}: ${getErrorMessage(error)}`,\n );\n }\n }\n\n // 3. Try to parse as inline JSON\n try {\n const parsed = JSON.parse(trimmedSource);\n return parsed as T;\n } catch (jsonError) {\n // 4. Fallback: treat as event name string for backward compatibility\n // This allows simple strings like \"page view\" to work\n if (!trimmedSource.startsWith('{') && !trimmedSource.startsWith('[')) {\n return { name: trimmedSource } as T;\n }\n\n // If it looks like JSON but failed to parse, throw helpful error\n throw new Error(\n `Failed to parse ${paramName}. Input appears to be JSON but contains errors: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`,\n );\n }\n}\n","/**\n * Execution Mode Handler\n *\n * Determines whether to execute commands locally or in Docker.\n */\n\nimport type { GlobalOptions } from '../types/global.js';\nimport {\n executeInDocker,\n executeRunInDocker,\n isDockerAvailable,\n} from './docker.js';\nimport type { Logger } from './logger.js';\n\n/**\n * Execution mode\n */\nexport type ExecutionMode = 'local' | 'docker';\n\n/**\n * Get execution mode from options\n *\n * @param options - Global options\n * @returns Execution mode\n */\nexport function getExecutionMode(options: GlobalOptions): ExecutionMode {\n // Force local mode if:\n // 1. --local flag is provided, OR\n // 2. Running inside a Docker container (WALKEROS_CONTAINER env var)\n if (options.local || process.env.WALKEROS_CONTAINER === 'true') {\n return 'local';\n }\n return 'docker';\n}\n\n/**\n * Execute command handler type\n */\nexport type ExecuteHandler = () => Promise<void>;\n\n/**\n * Execute command based on mode\n *\n * @param localHandler - Function to execute locally\n * @param dockerCommand - Docker command name\n * @param dockerArgs - Docker command arguments\n * @param options - Global options\n * @param logger - Logger instance\n * @param configFile - Optional config file path to mount in Docker\n */\nexport async function executeCommand(\n localHandler: ExecuteHandler,\n dockerCommand: string,\n dockerArgs: string[],\n options: GlobalOptions,\n logger?: Logger,\n configFile?: string,\n): Promise<void> {\n const mode = getExecutionMode(options);\n\n // Handle dry-run\n if (options.dryRun) {\n if (mode === 'docker') {\n const cmd = `docker run walkeros/cli:latest ${dockerCommand} ${dockerArgs.join(' ')}`;\n logger?.info(`[DRY-RUN] Would execute: ${cmd}`);\n } else {\n logger?.info(\n `[DRY-RUN] Would execute locally: ${dockerCommand} ${dockerArgs.join(' ')}`,\n );\n }\n return;\n }\n\n // Execute based on mode\n if (mode === 'local') {\n if (logger && !options.silent) {\n logger.info('🖥️ Executing locally...');\n }\n await localHandler();\n } else {\n // Docker mode\n const dockerAvailable = await isDockerAvailable();\n if (!dockerAvailable) {\n throw new Error(\n 'Docker is not available. Please install Docker or use --local flag to execute locally.',\n );\n }\n\n if (logger && !options.silent) {\n logger.info('🐳 Executing in Docker container...');\n }\n await executeInDocker(dockerCommand, dockerArgs, options, configFile);\n }\n}\n","/**\n * Unified Temporary Directory Manager\n *\n * Manages temporary directories for CLI operations using hash-based naming.\n * This provides a single location for all temp files per operation, making\n * cleanup simple and Docker mounting straightforward.\n */\n\nimport { getHashServer } from '@walkeros/server-core';\nimport path from 'path';\nimport fs from 'fs-extra';\n\nexport interface TempDirPaths {\n root: string;\n nodeModules: string;\n cache: string;\n bundle: string;\n entry: string;\n}\n\n/**\n * Manages a unified temporary directory structure for CLI operations\n */\nexport class TempDirManager {\n private hash: string;\n public readonly paths: TempDirPaths;\n\n /**\n * Create a new TempDirManager with hash-based directory naming\n *\n * @param configPath - Path to the config file (used in hash)\n * @param operation - Operation type ('bundle' | 'simulate')\n * @param timestamp - Optional timestamp for uniqueness (defaults to Date.now())\n */\n static async create(\n configPath: string,\n operation: 'bundle' | 'simulate',\n timestamp?: number,\n ): Promise<TempDirManager> {\n const ts = timestamp || Date.now();\n const hash = await getHashServer(`${configPath}:${operation}:${ts}`, 12);\n return new TempDirManager(hash);\n }\n\n constructor(hash: string) {\n this.hash = hash;\n const root = path.join('.tmp', `walkeros-${hash}`);\n\n this.paths = {\n root,\n nodeModules: path.join(root, 'node_modules'),\n cache: path.join(root, 'cache'),\n bundle: path.join(root, 'bundle.js'),\n entry: path.join(root, 'entry.js'),\n };\n }\n\n /**\n * Initialize the temporary directory structure\n */\n async initialize(): Promise<void> {\n await fs.ensureDir(this.paths.root);\n await fs.ensureDir(this.paths.nodeModules);\n await fs.ensureDir(this.paths.cache);\n }\n\n /**\n * Clean up the temporary directory\n */\n async cleanup(): Promise<void> {\n await fs.remove(this.paths.root);\n }\n\n /**\n * Get the hash used for this temp directory\n */\n getHash(): string {\n return this.hash;\n }\n\n /**\n * Get a path within the temp directory\n */\n getPath(...parts: string[]): string {\n return path.join(this.paths.root, ...parts);\n }\n\n /**\n * Check if the temp directory exists\n */\n async exists(): Promise<boolean> {\n return fs.pathExists(this.paths.root);\n }\n}\n","/**\n * Asset Resolver\n *\n * Unified path resolution for package assets (examples) and user assets.\n * Assets are always siblings to the CLI entry point (in dist/ for production).\n */\n\nimport { fileURLToPath } from 'url';\nimport { existsSync } from 'fs';\nimport path from 'path';\nimport { isUrl } from '../config/utils.js';\n\n/**\n * Cached asset directory to avoid repeated filesystem checks\n */\nlet cachedAssetDir: string | undefined;\n\n/**\n * Get the directory containing CLI assets (examples).\n *\n * In production: assets are in dist/ alongside the bundled CLI\n * In development: assets are at package root\n *\n * @returns Absolute path to assets directory\n */\nexport function getAssetDir(): string {\n if (cachedAssetDir) return cachedAssetDir;\n\n const currentFile = fileURLToPath(import.meta.url);\n let dir = path.dirname(currentFile);\n\n // Walk up until we find a directory with examples/ sibling\n while (dir !== path.dirname(dir)) {\n if (existsSync(path.join(dir, 'examples'))) {\n cachedAssetDir = dir;\n return dir;\n }\n dir = path.dirname(dir);\n }\n\n // Fallback to current file's directory (shouldn't happen if build is correct)\n cachedAssetDir = path.dirname(currentFile);\n return cachedAssetDir;\n}\n\n/**\n * Asset type for resolution strategy\n */\nexport type AssetType = 'config' | 'bundle';\n\n/**\n * Resolve asset path using unified strategy\n *\n * Resolution rules:\n * 1. Bare names (no / or \\) → Package asset (examples)\n * 2. Relative paths (./ or ../) → User asset relative to base directory\n * 3. Absolute paths → Use as-is\n *\n * @param assetPath - Path to resolve\n * @param assetType - Type of asset (determines package subdirectory)\n * @param baseDir - Base directory for relative paths (defaults to cwd)\n * @returns Absolute path to asset\n */\nexport function resolveAsset(\n assetPath: string,\n assetType: AssetType,\n baseDir?: string,\n): string {\n // URL → pass through unchanged\n if (isUrl(assetPath)) {\n return assetPath;\n }\n\n // Bare name → package asset (examples directory)\n if (!assetPath.includes('/') && !assetPath.includes('\\\\')) {\n const assetDir = getAssetDir();\n return path.join(assetDir, 'examples', assetPath);\n }\n\n // Absolute path → use as-is\n if (path.isAbsolute(assetPath)) {\n return assetPath;\n }\n\n // Relative path → resolve from base directory\n return path.resolve(baseDir || process.cwd(), assetPath);\n}\n","/**\n * Utility functions for the CLI package\n */\n\n/**\n * Extract error message from unknown error type\n * @param error - Unknown error object\n * @returns Error message as string\n */\nexport function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Logger } from './logger.js';\n\nexport interface LocalPackageInfo {\n name: string;\n absolutePath: string;\n distPath: string;\n hasDistFolder: boolean;\n}\n\n/**\n * Resolve and validate a local package path\n */\nexport async function resolveLocalPackage(\n packageName: string,\n localPath: string,\n configDir: string,\n logger: Logger,\n): Promise<LocalPackageInfo> {\n // Resolve relative to config file directory\n const absolutePath = path.isAbsolute(localPath)\n ? localPath\n : path.resolve(configDir, localPath);\n\n // Validate path exists\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(\n `Local package path not found: ${localPath} (resolved to ${absolutePath})`,\n );\n }\n\n // Validate package.json exists\n const pkgJsonPath = path.join(absolutePath, 'package.json');\n if (!(await fs.pathExists(pkgJsonPath))) {\n throw new Error(\n `No package.json found at ${absolutePath}. Is this a valid package directory?`,\n );\n }\n\n // Check for dist folder\n const distPath = path.join(absolutePath, 'dist');\n const hasDistFolder = await fs.pathExists(distPath);\n\n if (!hasDistFolder) {\n logger.warn(\n `⚠️ ${packageName}: No dist/ folder found. Using package root.`,\n );\n }\n\n return {\n name: packageName,\n absolutePath,\n distPath: hasDistFolder ? distPath : absolutePath,\n hasDistFolder,\n };\n}\n\n/**\n * Copy local package to target node_modules directory\n *\n * Copies package.json and dist/ folder to preserve the package structure\n * expected by module resolution (package.json exports reference ./dist/...)\n */\nexport async function copyLocalPackage(\n localPkg: LocalPackageInfo,\n targetDir: string,\n logger: Logger,\n): Promise<string> {\n const packageDir = path.join(targetDir, 'node_modules', localPkg.name);\n\n await fs.ensureDir(path.dirname(packageDir));\n\n // Always copy package.json for module resolution\n await fs.copy(\n path.join(localPkg.absolutePath, 'package.json'),\n path.join(packageDir, 'package.json'),\n );\n\n // Copy dist folder AS dist folder (preserving structure for exports like ./dist/index.mjs)\n if (localPkg.hasDistFolder) {\n await fs.copy(localPkg.distPath, path.join(packageDir, 'dist'));\n } else {\n // No dist folder - copy package root contents (excluding node_modules, etc.)\n const entries = await fs.readdir(localPkg.absolutePath);\n for (const entry of entries) {\n if (!['node_modules', '.turbo', '.git'].includes(entry)) {\n await fs.copy(\n path.join(localPkg.absolutePath, entry),\n path.join(packageDir, entry),\n );\n }\n }\n }\n\n logger.info(`📦 Using local: ${localPkg.name} from ${localPkg.absolutePath}`);\n\n return packageDir;\n}\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n * Uses Zod schemas from @walkeros/core for Flow.Setup validation.\n */\n\nimport type { Flow } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\n\nconst { safeParseSetup } = schemas;\n\n/**\n * Type guard: Check if value is a plain object.\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Detect platform from flow config.\n *\n * Platform is determined by the presence of `web` or `server` key.\n */\nexport function detectPlatform(\n flowConfig: Record<string, unknown>,\n): 'web' | 'server' | undefined {\n if ('web' in flowConfig && flowConfig.web !== undefined) {\n return 'web';\n }\n if ('server' in flowConfig && flowConfig.server !== undefined) {\n return 'server';\n }\n return undefined;\n}\n\n/**\n * Type guard: Check if config is a valid Flow.Setup structure.\n *\n * @remarks\n * Uses Zod validation from @walkeros/core.\n * Returns false instead of throwing on invalid input.\n *\n * @example\n * ```typescript\n * if (isFlowSetup(config)) {\n * const flowConfig = getFlowConfig(config, 'production');\n * }\n * ```\n */\nexport function isFlowSetup(data: unknown): data is Flow.Setup {\n const result = safeParseSetup(data);\n return result.success;\n}\n\n/**\n * Validate Flow.Setup and throw descriptive error if invalid.\n *\n * @remarks\n * Uses Zod validation from @walkeros/core.\n * Provides detailed error messages from Zod.\n *\n * @param data - Raw configuration data\n * @returns Validated Flow.Setup\n * @throws Error with descriptive message if validation fails\n */\nexport function validateFlowSetup(data: unknown): Flow.Setup {\n const result = safeParseSetup(data);\n\n if (!result.success) {\n // Format Zod errors for CLI display\n const errors = result.error.issues\n .map((issue) => {\n const path =\n issue.path.length > 0 ? issue.path.map(String).join('.') : 'root';\n return ` - ${path}: ${issue.message}`;\n })\n .join('\\n');\n\n throw new Error(`Invalid configuration:\\n${errors}`);\n }\n\n // Cast to Flow.Setup since Zod's inferred type is compatible but not identical\n return result.data as Flow.Setup;\n}\n\n/**\n * Get available flow names from a Flow.Setup.\n *\n * @param setup - Flow.Setup configuration\n * @returns Array of flow names\n */\nexport function getAvailableFlows(setup: Flow.Setup): string[] {\n return Object.keys(setup.flows);\n}\n","/**\n * Static Build Defaults\n *\n * Platform-specific build defaults for CLI bundling.\n * Build options are CLI concerns, separate from Flow configuration.\n */\n\nimport type { BuildOptions } from '../types/bundle.js';\n\n/**\n * Build defaults for web platform (browser bundles).\n *\n * @remarks\n * These settings produce browser-compatible IIFE bundles.\n */\nexport const WEB_BUILD_DEFAULTS: Omit<BuildOptions, 'output' | 'packages'> = {\n format: 'iife',\n platform: 'browser',\n target: 'es2020',\n minify: true,\n sourcemap: false,\n cache: true,\n tempDir: '.tmp',\n windowCollector: 'collector',\n windowElb: 'elb',\n};\n\n/**\n * Build defaults for server platform (Node.js bundles).\n *\n * @remarks\n * These settings produce Node.js-compatible ESM bundles.\n */\nexport const SERVER_BUILD_DEFAULTS: Omit<BuildOptions, 'output' | 'packages'> =\n {\n format: 'esm',\n platform: 'node',\n target: 'node20',\n minify: true,\n sourcemap: false,\n cache: true,\n tempDir: '.tmp',\n };\n\n/**\n * Default output paths by platform.\n */\nexport const DEFAULT_OUTPUT_PATHS = {\n web: './dist/walker.js',\n server: './dist/bundle.mjs',\n} as const;\n\n/**\n * Get build defaults for a platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @returns Platform-specific build defaults\n *\n * @example\n * ```typescript\n * const defaults = getBuildDefaults('web');\n * // { format: 'iife', platform: 'browser', ... }\n * ```\n */\nexport function getBuildDefaults(\n platform: 'web' | 'server',\n): Omit<BuildOptions, 'output' | 'packages'> {\n return platform === 'web' ? WEB_BUILD_DEFAULTS : SERVER_BUILD_DEFAULTS;\n}\n\n/**\n * Get default output path for a platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @returns Default output file path\n */\nexport function getDefaultOutput(platform: 'web' | 'server'): string {\n return DEFAULT_OUTPUT_PATHS[platform];\n}\n","/**\n * Configuration Loader\n *\n * Loads and parses Flow.Setup configurations using core getFlowConfig().\n * Build options are determined by static platform defaults.\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { getFlowConfig, getPlatform, type Flow } from '@walkeros/core';\nimport type { BuildOptions } from '../types/bundle.js';\nimport {\n validateFlowSetup,\n isFlowSetup,\n getAvailableFlows as getFlowNames,\n} from './validators.js';\nimport { getBuildDefaults, getDefaultOutput } from './build-defaults.js';\n\n/** Default folder for includes if it exists */\nconst DEFAULT_INCLUDE_FOLDER = './shared';\n\n/**\n * Result of configuration loading.\n */\nexport interface LoadConfigResult {\n /** Runtime event processing configuration */\n flowConfig: Flow.Config;\n /** Build-time configuration */\n buildOptions: BuildOptions;\n /** Name of the selected flow */\n flowName: string;\n /** Whether multiple flows are available */\n isMultiFlow: boolean;\n /** All available flow names */\n availableFlows: string[];\n}\n\n/**\n * Options for loading configuration.\n */\nexport interface LoadConfigOptions {\n /** Path to config file */\n configPath: string;\n /** Flow name to load (required for multi-flow, optional for single-flow) */\n flowName?: string;\n /** CLI build overrides (future: --output, --minify, etc.) */\n buildOverrides?: Partial<BuildOptions>;\n /** Logger for warnings */\n logger?: {\n warn: (message: string) => void;\n info: (message: string) => void;\n };\n}\n\n/**\n * Load and parse bundle configuration.\n *\n * @remarks\n * Uses Flow.Setup from @walkeros/core as the only config format.\n * - Validates config structure\n * - Uses core getFlowConfig() for variable/definition resolution\n * - Determines platform from resolved config\n * - Applies static build defaults based on platform\n *\n * @param rawConfig - Raw configuration object from JSON file\n * @param options - Loading options\n * @returns Parsed configuration with flow and build separated\n *\n * @example\n * ```typescript\n * const config = loadBundleConfig(rawConfig, {\n * configPath: './walkeros.config.json',\n * flowName: 'production',\n * });\n * ```\n */\nexport function loadBundleConfig(\n rawConfig: unknown,\n options: LoadConfigOptions,\n): LoadConfigResult {\n // Validate as Flow.Setup\n const setup = validateFlowSetup(rawConfig);\n const availableFlows = getFlowNames(setup);\n\n // Determine which flow to use\n const flowName = resolveFlow(setup, options.flowName, availableFlows);\n\n // Use core getFlowConfig() for resolution (variables, $refs, cascading)\n const flowConfig = getFlowConfig(setup, flowName);\n\n // Detect platform from resolved config\n const platform = getPlatform(flowConfig);\n if (!platform) {\n throw new Error(\n `Invalid configuration: flow \"${flowName}\" must have a \"web\" or \"server\" key.`,\n );\n }\n\n // Get static build defaults based on platform\n const buildDefaults = getBuildDefaults(platform);\n\n // Extract packages from flowConfig (if present)\n const packages = flowConfig.packages || {};\n\n // Resolve output path relative to config directory\n let output = getDefaultOutput(platform);\n if (options.buildOverrides?.output) {\n output = options.buildOverrides.output;\n }\n\n // Get config directory for relative path resolution\n const configDir = path.dirname(options.configPath);\n\n // Make output path absolute relative to config file\n if (!path.isAbsolute(output)) {\n output = path.resolve(configDir, output);\n }\n\n // Get includes from config or use default if ./shared exists\n let includes = setup.include;\n if (!includes) {\n const defaultIncludePath = path.resolve(configDir, DEFAULT_INCLUDE_FOLDER);\n if (fs.pathExistsSync(defaultIncludePath)) {\n includes = [DEFAULT_INCLUDE_FOLDER];\n }\n }\n\n // Merge build options: defaults + CLI overrides\n const buildOptions: BuildOptions = {\n ...buildDefaults,\n packages,\n output,\n include: includes,\n configDir,\n ...options.buildOverrides,\n };\n\n // Log flow selection\n const isMultiFlow = availableFlows.length > 1;\n if (isMultiFlow && options.logger) {\n options.logger.info(\n `📦 Using flow: ${flowName} (${availableFlows.length} total)`,\n );\n }\n\n return {\n flowConfig,\n buildOptions,\n flowName,\n isMultiFlow,\n availableFlows,\n };\n}\n\n/**\n * Resolve which flow to use.\n *\n * @param setup - Flow.Setup configuration\n * @param requestedFlow - Flow name from CLI (optional)\n * @param available - Available flow names\n * @returns Flow name to use\n * @throws Error if flow selection is invalid\n */\nfunction resolveFlow(\n setup: Flow.Setup,\n requestedFlow: string | undefined,\n available: string[],\n): string {\n // If only one flow, use it automatically\n if (available.length === 1) {\n return available[0];\n }\n\n // Multiple flows require explicit selection\n if (!requestedFlow) {\n throw new Error(\n `Multiple flows found. Please specify a flow using --flow flag.\\n` +\n `Available flows: ${available.join(', ')}`,\n );\n }\n\n // Validate the requested flow exists\n if (!available.includes(requestedFlow)) {\n throw new Error(\n `Flow \"${requestedFlow}\" not found in configuration.\\n` +\n `Available flows: ${available.join(', ')}`,\n );\n }\n\n return requestedFlow;\n}\n\n/**\n * Load all flows from a configuration.\n *\n * @remarks\n * Used by the --all flag to build all flows.\n *\n * @param rawConfig - Raw configuration object\n * @param options - Loading options (without flowName)\n * @returns Array of loaded configurations for all flows\n */\nexport function loadAllFlows(\n rawConfig: unknown,\n options: Omit<LoadConfigOptions, 'flowName'>,\n): LoadConfigResult[] {\n // Validate as Flow.Setup\n const setup = validateFlowSetup(rawConfig);\n const flows = getFlowNames(setup);\n\n if (options.logger) {\n options.logger.info(\n `📦 Loading all ${flows.length} flows: ${flows.join(', ')}`,\n );\n }\n\n // Load each flow\n return flows.map((name) =>\n loadBundleConfig(rawConfig, {\n ...options,\n flowName: name,\n }),\n );\n}\n\n/**\n * Get list of available flows from configuration.\n *\n * @param rawConfig - Raw configuration object\n * @returns Array of flow names\n */\nexport function getAvailableFlows(rawConfig: unknown): string[] {\n if (isFlowSetup(rawConfig)) {\n return getFlowNames(rawConfig);\n }\n return [];\n}\n","import esbuild from 'esbuild';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { packageNameToVariable } from '@walkeros/core';\nimport type { BuildOptions } from '../../types/bundle.js';\nimport { downloadPackages } from './package-manager.js';\nimport type { Logger } from '../../core/index.js';\nimport { getTempDir } from '../../config/index.js';\nimport {\n isBuildCached,\n getCachedBuild,\n cacheBuild,\n} from '../../core/build-cache.js';\n\nexport interface BundleStats {\n totalSize: number;\n packages: { name: string; size: number }[];\n buildTime: number;\n treeshakingEffective: boolean;\n}\n\n/**\n * Copy included folders to output directory.\n * Used to make credential files and other assets available alongside the bundle.\n */\nasync function copyIncludes(\n includes: string[],\n sourceDir: string,\n outputDir: string,\n logger: Logger,\n): Promise<void> {\n for (const include of includes) {\n const sourcePath = path.resolve(sourceDir, include);\n const folderName = path.basename(include);\n const destPath = path.join(outputDir, folderName);\n\n if (await fs.pathExists(sourcePath)) {\n await fs.copy(sourcePath, destPath);\n logger.debug(`Copied ${include} to output`);\n // TODO: Add logging for copied folders\n } else {\n logger.debug(`Include folder not found: ${include}`);\n // TODO: Add logging for skipped folders (not found)\n }\n }\n}\n\n/**\n * Generate cache key content from flow config and build options.\n * Excludes non-deterministic fields (tempDir, output) from cache key.\n */\nfunction generateCacheKeyContent(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n): string {\n const configForCache = {\n flow: flowConfig,\n build: {\n ...buildOptions,\n // Exclude non-deterministic fields from cache key\n tempDir: undefined,\n output: undefined,\n },\n };\n return JSON.stringify(configForCache);\n}\n\nexport async function bundleCore(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n logger: Logger,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n // Only generate a new temp dir if one isn't explicitly provided\n // This allows simulator to share its temp dir with the bundler\n // Ensure TEMP_DIR is always absolute (esbuild requirement)\n const TEMP_DIR = buildOptions.tempDir\n ? path.isAbsolute(buildOptions.tempDir)\n ? buildOptions.tempDir\n : path.resolve(buildOptions.tempDir)\n : getTempDir();\n\n // Check build cache if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowConfig, buildOptions);\n\n const cached = await isBuildCached(configContent);\n if (cached) {\n const cachedBuild = await getCachedBuild(configContent);\n if (cachedBuild) {\n logger.info('✨ Using cached build');\n\n // Write cached build to output\n const outputPath = path.resolve(buildOptions.output);\n await fs.ensureDir(path.dirname(outputPath));\n await fs.writeFile(outputPath, cachedBuild);\n\n logger.gray(`Output: ${outputPath}`);\n logger.success('✅ Build completed (from cache)');\n\n // Return stats if requested\n if (showStats) {\n const stats = await fs.stat(outputPath);\n // Generate basic package stats from buildOptions\n const packageStats = Object.entries(buildOptions.packages).map(\n ([name, pkg]) => ({\n name: `${name}@${pkg.version || 'latest'}`,\n size: 0, // Size estimation not available for cached builds\n }),\n );\n return {\n totalSize: stats.size,\n packages: packageStats,\n buildTime: Date.now() - bundleStartTime,\n treeshakingEffective: true,\n };\n }\n return;\n }\n }\n }\n\n try {\n // Step 1: Prepare temporary directory\n // Only clean if we created a new temp dir (don't clean shared simulator temp)\n if (!buildOptions.tempDir) {\n await fs.emptyDir(TEMP_DIR);\n }\n logger.debug('Cleaned temporary directory');\n\n // Step 2: Download packages\n logger.info('📥 Downloading packages...');\n // Convert packages object to array format expected by downloadPackages\n const packagesArray = Object.entries(buildOptions.packages).map(\n ([name, packageConfig]) => ({\n name,\n version: packageConfig.version || 'latest',\n path: packageConfig.path, // Pass local path if defined\n }),\n );\n // downloadPackages adds 'node_modules' subdirectory automatically\n const packagePaths = await downloadPackages(\n packagesArray,\n TEMP_DIR,\n logger,\n buildOptions.cache,\n buildOptions.configDir, // For resolving relative local paths\n );\n\n // Fix @walkeros packages to have proper ESM exports\n // This ensures Node resolves to .mjs files instead of .js (CJS)\n for (const [pkgName, pkgPath] of packagePaths.entries()) {\n if (pkgName.startsWith('@walkeros/')) {\n const pkgJsonPath = path.join(pkgPath, 'package.json');\n const pkgJson = await fs.readJSON(pkgJsonPath);\n\n // Add exports field to force ESM resolution\n if (!pkgJson.exports && pkgJson.module) {\n pkgJson.exports = {\n '.': {\n import: pkgJson.module,\n require: pkgJson.main,\n },\n };\n await fs.writeJSON(pkgJsonPath, pkgJson, { spaces: 2 });\n }\n }\n }\n\n // Step 3: Create package.json to enable ESM in temp directory\n // This ensures Node treats all .js files as ESM and resolves @walkeros packages correctly\n const packageJsonPath = path.join(TEMP_DIR, 'package.json');\n await fs.writeFile(\n packageJsonPath,\n JSON.stringify({ type: 'module' }, null, 2),\n );\n\n // Step 4: Create entry point\n logger.info('📝 Creating entry point...');\n const entryContent = await createEntryPoint(\n flowConfig,\n buildOptions,\n packagePaths,\n );\n const entryPath = path.join(TEMP_DIR, 'entry.js');\n await fs.writeFile(entryPath, entryContent);\n\n // Step 4: Bundle with esbuild\n logger.info('⚡ Bundling with esbuild...');\n const outputPath = path.resolve(buildOptions.output);\n\n // Ensure output directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n const esbuildOptions = createEsbuildOptions(\n buildOptions,\n entryPath,\n outputPath,\n TEMP_DIR,\n packagePaths,\n logger,\n );\n\n try {\n await esbuild.build(esbuildOptions);\n } catch (buildError) {\n // Enhanced error handling for build failures\n throw createBuildError(\n buildError as EsbuildError,\n buildOptions.code || '',\n );\n }\n\n logger.gray(`Output: ${outputPath}`);\n\n // Step 5: Cache the build result if caching is enabled\n if (buildOptions.cache !== false) {\n const configContent = generateCacheKeyContent(flowConfig, buildOptions);\n const buildOutput = await fs.readFile(outputPath, 'utf-8');\n await cacheBuild(configContent, buildOutput);\n logger.debug('Build cached for future use');\n }\n\n // Step 6: Collect stats if requested\n let stats: BundleStats | undefined;\n if (showStats) {\n stats = await collectBundleStats(\n outputPath,\n buildOptions.packages,\n bundleStartTime,\n entryContent,\n );\n }\n\n // Step 7: Copy included folders to output directory\n if (buildOptions.include && buildOptions.include.length > 0) {\n const outputDir = path.dirname(outputPath);\n await copyIncludes(\n buildOptions.include,\n buildOptions.configDir || process.cwd(),\n outputDir,\n logger,\n );\n }\n\n // Step 8: Cleanup\n // Only cleanup if we created our own temp dir (not shared with simulator)\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR);\n logger.debug('Cleaned up temporary files');\n }\n\n return stats;\n } catch (error) {\n // Cleanup on error (only if we created our own temp dir)\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR).catch(() => {});\n }\n throw error;\n }\n}\n\nasync function collectBundleStats(\n outputPath: string,\n packages: BuildOptions['packages'],\n startTime: number,\n entryContent: string,\n): Promise<BundleStats> {\n const stats = await fs.stat(outputPath);\n const totalSize = stats.size;\n const buildTime = Date.now() - startTime;\n\n // Estimate package sizes by analyzing imports in entry content\n const packageStats = Object.entries(packages).map(([name, pkg]) => {\n const importPattern = new RegExp(`from\\\\s+['\"]${name}['\"]`, 'g');\n const namedImportPattern = new RegExp(\n `import\\\\s+\\\\{[^}]*\\\\}\\\\s+from\\\\s+['\"]${name}['\"]`,\n 'g',\n );\n const hasImports =\n importPattern.test(entryContent) || namedImportPattern.test(entryContent);\n\n // Rough estimation: if package is imported, assign proportional size\n const packagesCount = Object.keys(packages).length;\n const estimatedSize = hasImports\n ? Math.floor(totalSize / packagesCount)\n : 0;\n\n return {\n name: `${name}@${pkg.version || 'latest'}`,\n size: estimatedSize,\n };\n });\n\n // Tree-shaking is effective if we use named imports (not wildcard imports)\n const hasWildcardImports = /import\\s+\\*\\s+as\\s+\\w+\\s+from/.test(entryContent);\n const treeshakingEffective = !hasWildcardImports;\n\n return {\n totalSize,\n packages: packageStats,\n buildTime,\n treeshakingEffective,\n };\n}\n\nfunction createEsbuildOptions(\n buildOptions: BuildOptions,\n entryPath: string,\n outputPath: string,\n tempDir: string,\n packagePaths: Map<string, string>,\n logger: Logger,\n): esbuild.BuildOptions {\n // Don't use aliases - they cause esbuild to bundle even external packages\n // Instead, use absWorkingDir to point to temp directory where node_modules is\n const alias: Record<string, string> = {};\n\n const baseOptions: esbuild.BuildOptions = {\n entryPoints: [entryPath],\n bundle: true,\n format: buildOptions.format as esbuild.Format,\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n absWorkingDir: tempDir, // Resolve modules from temp directory\n // alias removed - not needed with absWorkingDir\n mainFields: ['module', 'main'], // Prefer ESM over CJS\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\n sourcemap: buildOptions.sourcemap,\n resolveExtensions: ['.mjs', '.js', '.ts', '.json'], // Prefer .mjs\n\n // Enhanced minification options when minify is enabled\n ...(buildOptions.minify && {\n minifyWhitespace: buildOptions.minifyOptions?.whitespace ?? true,\n minifyIdentifiers: buildOptions.minifyOptions?.identifiers ?? true,\n minifySyntax: buildOptions.minifyOptions?.syntax ?? true,\n legalComments: buildOptions.minifyOptions?.legalComments ?? 'none',\n keepNames: buildOptions.minifyOptions?.keepNames ?? false,\n charset: 'utf8',\n }),\n };\n\n // Platform-specific configurations\n if (buildOptions.platform === 'browser') {\n baseOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n // For browser bundles, let users handle Node.js built-ins as needed\n baseOptions.external = buildOptions.external || [];\n } else if (buildOptions.platform === 'node') {\n // For Node.js bundles, mark Node built-ins as external\n const nodeBuiltins = [\n 'crypto',\n 'fs',\n 'path',\n 'os',\n 'util',\n 'stream',\n 'buffer',\n 'events',\n 'http',\n 'https',\n 'url',\n 'querystring',\n 'zlib',\n ];\n // Mark runtime dependencies as external\n // These packages are installed in the Docker container and should not be bundled\n // - express/cors: Runtime dependencies for server sources\n // Note: zod is bundled inline via @walkeros/core (not marked external)\n // Use wildcard patterns to match both ESM and CJS imports\n const npmPackages = ['express', 'express/*', 'cors', 'cors/*'];\n // All downloaded @walkeros packages will be bundled into the output\n // Only Node.js built-ins and runtime server packages (express/cors) are marked external\n baseOptions.external = buildOptions.external\n ? [...nodeBuiltins, ...npmPackages, ...buildOptions.external]\n : [...nodeBuiltins, ...npmPackages];\n\n // Add createRequire shim for ESM bundles with CJS external dependencies\n // This allows require() calls generated by esbuild to work in ESM context\n if (buildOptions.format === 'esm') {\n baseOptions.banner = {\n js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`,\n };\n }\n }\n\n // Set target if specified\n if (buildOptions.target) {\n baseOptions.target = buildOptions.target;\n } else if (buildOptions.platform === 'node') {\n baseOptions.target = 'node18';\n } else {\n baseOptions.target = 'es2018';\n }\n\n return baseOptions;\n}\n\n/**\n * Detects destination packages from flow configuration.\n * Extracts package names from destinations that have explicit 'package' field.\n */\nfunction detectDestinationPackages(flowConfig: Flow.Config): Set<string> {\n const destinationPackages = new Set<string>();\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string'\n ) {\n destinationPackages.add(destConfig.package);\n }\n // If no package field, skip auto-importing examples for this destination\n }\n }\n\n return destinationPackages;\n}\n\n/**\n * Detects source packages from flow configuration.\n * Extracts package names from sources that have explicit 'package' field.\n */\nfunction detectSourcePackages(flowConfig: Flow.Config): Set<string> {\n const sourcePackages = new Set<string>();\n const sources = (\n flowConfig as unknown as { sources?: Record<string, unknown> }\n ).sources;\n\n if (sources) {\n for (const [sourceKey, sourceConfig] of Object.entries(sources)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'package' in sourceConfig &&\n typeof sourceConfig.package === 'string'\n ) {\n sourcePackages.add(sourceConfig.package);\n }\n }\n }\n\n return sourcePackages;\n}\n\n/**\n * Detects explicit code imports from destinations and sources.\n * Returns a map of package names to sets of export names.\n */\nfunction detectExplicitCodeImports(\n flowConfig: Flow.Config,\n): Map<string, Set<string>> {\n const explicitCodeImports = new Map<string, Set<string>>();\n\n // Check destinations\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string' &&\n 'code' in destConfig &&\n typeof destConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n // Auto-generated code starts with '_' (from packageNameToVariable)\n const isAutoGenerated = destConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(destConfig.package)) {\n explicitCodeImports.set(destConfig.package, new Set());\n }\n explicitCodeImports.get(destConfig.package)!.add(destConfig.code);\n }\n }\n }\n }\n\n // Check sources\n const sources = (\n flowConfig as unknown as { sources?: Record<string, unknown> }\n ).sources;\n\n if (sources) {\n for (const [sourceKey, sourceConfig] of Object.entries(sources)) {\n if (\n typeof sourceConfig === 'object' &&\n sourceConfig !== null &&\n 'package' in sourceConfig &&\n typeof sourceConfig.package === 'string' &&\n 'code' in sourceConfig &&\n typeof sourceConfig.code === 'string'\n ) {\n // Only treat as explicit if code doesn't match auto-generated pattern\n // Auto-generated code starts with '_' (from packageNameToVariable)\n const isAutoGenerated = sourceConfig.code.startsWith('_');\n if (!isAutoGenerated) {\n if (!explicitCodeImports.has(sourceConfig.package)) {\n explicitCodeImports.set(sourceConfig.package, new Set());\n }\n explicitCodeImports.get(sourceConfig.package)!.add(sourceConfig.code);\n }\n }\n }\n }\n\n return explicitCodeImports;\n}\n\ninterface ImportGenerationResult {\n importStatements: string[];\n examplesMappings: string[];\n}\n\n/**\n * Generates import statements and examples mappings from build packages.\n * Handles explicit imports, default imports for destinations/sources, and utility imports.\n */\nfunction generateImportStatements(\n packages: BuildOptions['packages'],\n destinationPackages: Set<string>,\n sourcePackages: Set<string>,\n explicitCodeImports: Map<string, Set<string>>,\n): ImportGenerationResult {\n const importStatements: string[] = [];\n const examplesMappings: string[] = [];\n const usedPackages = new Set([...destinationPackages, ...sourcePackages]);\n\n for (const [packageName, packageConfig] of Object.entries(packages)) {\n const isUsedByDestOrSource = usedPackages.has(packageName);\n const hasExplicitCode = explicitCodeImports.has(packageName);\n\n if (packageConfig.imports && packageConfig.imports.length > 0) {\n // Explicit imports (utilities) - existing logic\n // Remove duplicates within the same package\n const uniqueImports = [...new Set(packageConfig.imports)];\n\n // Handle special \"default as X\" syntax\n const defaultImports: string[] = [];\n const namedImports: string[] = [];\n\n for (const imp of uniqueImports) {\n if (imp.startsWith('default as ')) {\n defaultImports.push(imp.replace('default as ', ''));\n } else {\n namedImports.push(imp);\n }\n }\n\n // Generate import statements\n if (defaultImports.length > 0) {\n for (const defaultImport of defaultImports) {\n importStatements.push(\n `import ${defaultImport} from '${packageName}';`,\n );\n }\n }\n\n if (namedImports.length > 0) {\n const importList = namedImports.join(', ');\n importStatements.push(\n `import { ${importList} } from '${packageName}';`,\n );\n }\n\n // Check if this package imports examples and create mappings\n const examplesImport = uniqueImports.find((imp) =>\n imp.includes('examples as '),\n );\n if (examplesImport) {\n // Extract destination name and examples variable name\n // Format: \"examples as gtagExamples\" -> gtagExamples\n const examplesVarName = examplesImport.split(' as ')[1];\n // Get destination name from package (assumes @walkeros/web-destination-xxx format)\n const destinationMatch = packageName.match(\n /@walkeros\\/web-destination-(.+)$/,\n );\n if (destinationMatch) {\n const destinationName = destinationMatch[1];\n examplesMappings.push(\n ` ${destinationName}: typeof ${examplesVarName} !== 'undefined' ? ${examplesVarName} : undefined`,\n );\n }\n }\n } else if (hasExplicitCode) {\n // Package with explicit code specified in destinations/sources\n // → Generate named imports\n const codes = Array.from(explicitCodeImports.get(packageName)!);\n importStatements.push(\n `import { ${codes.join(', ')} } from '${packageName}';`,\n );\n } else if (isUsedByDestOrSource) {\n // Package used by destination/source but no explicit imports or code\n // → Generate default import\n const varName = packageNameToVariable(packageName);\n importStatements.push(`import ${varName} from '${packageName}';`);\n }\n // If package declared but not used by any dest/source, skip import\n\n // Examples are no longer auto-imported - simulator loads them dynamically\n }\n\n return { importStatements, examplesMappings };\n}\n\n/**\n * Creates the entry point code for the bundle.\n * Generates imports, config object, and platform-specific wrapper programmatically.\n */\nexport async function createEntryPoint(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n packagePaths: Map<string, string>,\n): Promise<string> {\n // Detect packages used by destinations and sources\n const destinationPackages = detectDestinationPackages(flowConfig);\n const sourcePackages = detectSourcePackages(flowConfig);\n const explicitCodeImports = detectExplicitCodeImports(flowConfig);\n\n // Generate import statements\n const { importStatements } = generateImportStatements(\n buildOptions.packages,\n destinationPackages,\n sourcePackages,\n explicitCodeImports,\n );\n\n const importsCode = importStatements.join('\\n');\n const hasFlow = destinationPackages.size > 0 || sourcePackages.size > 0;\n\n // If no sources/destinations, just return user code with imports (no flow wrapper)\n if (!hasFlow) {\n const userCode = buildOptions.code || '';\n return importsCode ? `${importsCode}\\n\\n${userCode}` : userCode;\n }\n\n // Build config object programmatically (DRY - single source of truth)\n const configObject = buildConfigObject(flowConfig, explicitCodeImports);\n\n // Generate platform-specific wrapper\n const wrappedCode = generatePlatformWrapper(\n configObject,\n buildOptions.code || '',\n buildOptions as {\n platform: string;\n windowCollector?: string;\n windowElb?: string;\n },\n );\n\n // Assemble final code\n return importsCode ? `${importsCode}\\n\\n${wrappedCode}` : wrappedCode;\n}\n\ninterface EsbuildError {\n errors?: Array<{\n text: string;\n location?: {\n file: string;\n line: number;\n column: number;\n };\n }>;\n message?: string;\n}\n\nfunction createBuildError(buildError: EsbuildError, code: string): Error {\n if (!buildError.errors || buildError.errors.length === 0) {\n return new Error(`Build failed: ${buildError.message || buildError}`);\n }\n\n const firstError = buildError.errors[0];\n const location = firstError.location;\n\n if (location && location.file && location.file.includes('entry.js')) {\n // Error is in our generated entry point (code)\n const line = location.line;\n const column = location.column;\n const codeLines = code.split('\\n');\n const errorLine = codeLines[line - 1] || '';\n\n return new Error(\n `Code syntax error at line ${line}, column ${column}:\\n` +\n ` ${errorLine}\\n` +\n ` ${' '.repeat(column - 1)}^\\n` +\n `${firstError.text}`,\n );\n }\n\n // Error is in package code or other build issue\n return new Error(\n `Build error: ${firstError.text}\\n` +\n (location\n ? ` at ${location.file}:${location.line}:${location.column}`\n : ''),\n );\n}\n\n/**\n * Build config object string from flow configuration.\n * Respects import strategy decisions from detectExplicitCodeImports.\n */\nexport function buildConfigObject(\n flowConfig: Flow.Config,\n explicitCodeImports: Map<string, Set<string>>,\n): string {\n const flowWithProps = flowConfig as unknown as {\n sources?: Record<\n string,\n { package: string; code?: string; config?: unknown; env?: unknown }\n >;\n destinations?: Record<\n string,\n { package: string; code?: string; config?: unknown; env?: unknown }\n >;\n collector?: unknown;\n };\n\n const sources = flowWithProps.sources || {};\n const destinations = flowWithProps.destinations || {};\n\n // Build sources\n const sourcesEntries = Object.entries(sources).map(([key, source]) => {\n const hasExplicitCode =\n source.code && explicitCodeImports.has(source.package);\n const codeVar = hasExplicitCode\n ? source.code\n : packageNameToVariable(source.package);\n\n const configStr = source.config ? processConfigValue(source.config) : '{}';\n const envStr = source.env\n ? `,\\n env: ${processConfigValue(source.env)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}\\n }`;\n });\n\n // Build destinations\n const destinationsEntries = Object.entries(destinations).map(\n ([key, dest]) => {\n const hasExplicitCode =\n dest.code && explicitCodeImports.has(dest.package);\n const codeVar = hasExplicitCode\n ? dest.code\n : packageNameToVariable(dest.package);\n\n const configStr = dest.config ? processConfigValue(dest.config) : '{}';\n const envStr = dest.env\n ? `,\\n env: ${processConfigValue(dest.env)}`\n : '';\n\n return ` ${key}: {\\n code: ${codeVar},\\n config: ${configStr}${envStr}\\n }`;\n },\n );\n\n // Build collector\n const collectorStr = flowWithProps.collector\n ? `,\\n ...${processConfigValue(flowWithProps.collector)}`\n : '';\n\n return `{\n sources: {\n${sourcesEntries.join(',\\n')}\n },\n destinations: {\n${destinationsEntries.join(',\\n')}\n }${collectorStr}\n}`;\n}\n\n/**\n * Process config value for serialization.\n * Uses existing serializer utilities.\n */\nfunction processConfigValue(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\n/**\n * Generate platform-specific wrapper code.\n */\nexport function generatePlatformWrapper(\n configObject: string,\n userCode: string,\n buildOptions: {\n platform: string;\n windowCollector?: string;\n windowElb?: string;\n },\n): string {\n if (buildOptions.platform === 'browser') {\n // Web platform: IIFE with browser globals\n const windowAssignments = [];\n if (buildOptions.windowCollector) {\n windowAssignments.push(\n ` if (typeof window !== 'undefined') window['${buildOptions.windowCollector}'] = collector;`,\n );\n }\n if (buildOptions.windowElb) {\n windowAssignments.push(\n ` if (typeof window !== 'undefined') window['${buildOptions.windowElb}'] = elb;`,\n );\n }\n const assignments =\n windowAssignments.length > 0 ? '\\n' + windowAssignments.join('\\n') : '';\n\n return `(async () => {\n const config = ${configObject};\n\n ${userCode}\n\n const { collector, elb } = await startFlow(config);${assignments}\n})();`;\n } else {\n // Server platform: Export default function\n const codeSection = userCode ? `\\n ${userCode}\\n` : '';\n\n return `export default async function(context = {}) {\n const config = ${configObject};${codeSection}\n return await startFlow(config);\n}`;\n }\n}\n","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport {\n Logger,\n resolveLocalPackage,\n copyLocalPackage,\n} from '../../core/index.js';\nimport { getPackageCacheKey } from '../../core/cache-utils.js';\n\nexport interface Package {\n name: string;\n version: string;\n path?: string; // Local path to package directory\n}\n\n/**\n * Gets the proper node_modules directory path for a package.\n * Creates standard npm structure: node_modules/@scope/package or node_modules/package\n * Supports multiple versions by appending version to non-scoped packages if needed.\n *\n * @example\n * getPackageDirectory('node_modules', '@walkeros/core', '0.2.0')\n * // → 'node_modules/@walkeros/core'\n *\n * getPackageDirectory('node_modules', 'lodash', '4.17.21')\n * // → 'node_modules/lodash'\n */\nfunction getPackageDirectory(\n baseDir: string,\n packageName: string,\n version: string,\n): string {\n // For scoped packages like @walkeros/core, preserve the scope structure\n // This creates: node_modules/@walkeros/core (standard npm structure)\n return path.join(baseDir, 'node_modules', packageName);\n}\n\nasync function getCachedPackagePath(\n pkg: Package,\n tempDir: string,\n): Promise<string> {\n const cacheDir = path.join('.tmp', 'cache', 'packages');\n const cacheKey = await getPackageCacheKey(pkg.name, pkg.version);\n return path.join(cacheDir, cacheKey);\n}\n\nasync function isPackageCached(\n pkg: Package,\n tempDir: string,\n): Promise<boolean> {\n const cachedPath = await getCachedPackagePath(pkg, tempDir);\n return fs.pathExists(cachedPath);\n}\n\nfunction validateNoDuplicatePackages(packages: Package[]): void {\n const packageMap = new Map<string, string[]>();\n\n // Group packages by name and collect their versions\n for (const pkg of packages) {\n if (!packageMap.has(pkg.name)) {\n packageMap.set(pkg.name, []);\n }\n packageMap.get(pkg.name)!.push(pkg.version);\n }\n\n // Check for duplicate packages with different versions\n const conflicts: string[] = [];\n for (const [name, versions] of packageMap.entries()) {\n const uniqueVersions = [...new Set(versions)];\n if (uniqueVersions.length > 1) {\n conflicts.push(`${name}: [${uniqueVersions.join(', ')}]`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(\n `Version conflicts detected:\\n${conflicts.map((c) => ` - ${c}`).join('\\n')}\\n\\n` +\n 'Each package must use the same version across all declarations. ' +\n 'Please update your configuration to use consistent versions.',\n );\n }\n}\n\n/**\n * Recursively resolve and download package dependencies\n */\nasync function resolveDependencies(\n pkg: Package,\n packageDir: string,\n logger: Logger,\n visited: Set<string> = new Set(),\n): Promise<Package[]> {\n const dependencies: Package[] = [];\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (visited.has(pkgKey)) {\n return dependencies;\n }\n visited.add(pkgKey);\n\n try {\n const packageJsonPath = path.join(packageDir, 'package.json');\n if (await fs.pathExists(packageJsonPath)) {\n const packageJson = await fs.readJson(packageJsonPath);\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.peerDependencies,\n };\n\n for (const [name, versionSpec] of Object.entries(deps)) {\n if (typeof versionSpec === 'string') {\n // Use the version spec as-is (pacote will resolve it)\n // This respects the package.json dependency requirements\n dependencies.push({ name, version: versionSpec });\n }\n }\n }\n } catch (error) {\n logger.debug(`Failed to read dependencies for ${pkgKey}: ${error}`);\n }\n\n return dependencies;\n}\n\nexport async function downloadPackages(\n packages: Package[],\n targetDir: string,\n logger: Logger,\n useCache = true,\n configDir?: string, // For resolving relative local paths\n): Promise<Map<string, string>> {\n const packagePaths = new Map<string, string>();\n const downloadQueue: Package[] = [...packages];\n const processed = new Set<string>();\n\n // Track packages that should use local paths (to prevent npm overwriting them)\n const localPackageMap = new Map<string, string>();\n for (const pkg of packages) {\n if (pkg.path) {\n localPackageMap.set(pkg.name, pkg.path);\n }\n }\n\n // Validate no duplicate packages with different versions in initial list\n validateNoDuplicatePackages(packages);\n\n // Ensure target directory exists\n await fs.ensureDir(targetDir);\n\n while (downloadQueue.length > 0) {\n const pkg = downloadQueue.shift()!;\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (processed.has(pkgKey)) {\n continue;\n }\n processed.add(pkgKey);\n\n // If this package was specified with a local path, use it even if discovered as a dependency\n if (!pkg.path && localPackageMap.has(pkg.name)) {\n pkg.path = localPackageMap.get(pkg.name);\n }\n\n // Handle local packages first\n if (pkg.path) {\n const localPkg = await resolveLocalPackage(\n pkg.name,\n pkg.path,\n configDir || process.cwd(),\n logger,\n );\n const installedPath = await copyLocalPackage(localPkg, targetDir, logger);\n packagePaths.set(pkg.name, installedPath);\n\n // Resolve dependencies from local package\n const deps = await resolveDependencies(pkg, installedPath, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n }\n\n const packageSpec = `${pkg.name}@${pkg.version}`;\n // Use proper node_modules structure: node_modules/@scope/package\n const packageDir = getPackageDirectory(targetDir, pkg.name, pkg.version);\n const cachedPath = await getCachedPackagePath(pkg, targetDir);\n\n if (useCache && (await isPackageCached(pkg, targetDir))) {\n logger.debug(`Using cached ${packageSpec}...`);\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n await fs.copy(cachedPath, packageDir);\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies for cached package too\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n } catch (error) {\n logger.debug(\n `Failed to use cache for ${packageSpec}, downloading fresh: ${error}`,\n );\n }\n }\n\n logger.debug(`Downloading ${packageSpec}...`);\n\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n\n // Extract package to proper node_modules structure\n // Use environment variable for cache location (Docker-friendly)\n const cacheDir =\n process.env.NPM_CACHE_DIR || path.join(process.cwd(), '.npm-cache');\n await pacote.extract(packageSpec, packageDir, {\n // Force npm registry download, prevent workspace resolution\n registry: 'https://registry.npmjs.org',\n\n // Force online fetching from registry (don't use cached workspace packages)\n preferOnline: true,\n\n // Cache for performance\n cache: cacheDir,\n\n // Don't resolve relative to workspace context\n where: undefined,\n });\n\n // Cache the downloaded package for future use\n if (useCache) {\n try {\n await fs.ensureDir(path.dirname(cachedPath));\n await fs.copy(packageDir, cachedPath);\n logger.debug(`Cached ${packageSpec} for future use`);\n } catch (cacheError) {\n logger.debug(`Failed to cache ${packageSpec}: ${cacheError}`);\n }\n }\n\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n } catch (error) {\n throw new Error(`Failed to download ${packageSpec}: ${error}`);\n }\n }\n\n return packagePaths;\n}\n","/**\n * Cache utility functions for hash-based cache keys\n *\n * Implements content-based and date-based cache invalidation for:\n * - NPM package cache (mutable versions include daily date)\n * - Build artifact cache (content + date hashing)\n */\n\nimport { getHashServer } from '@walkeros/server-core';\n\nconst HASH_LENGTH = 12;\n\n/**\n * Check if a version specifier is mutable (can change over time)\n */\nexport function isMutableVersion(version: string): boolean {\n return (\n version === 'latest' ||\n version.includes('^') ||\n version.includes('~') ||\n version.includes('*') ||\n version.includes('x')\n );\n}\n\n/**\n * Get today's date in YYYY-MM-DD format\n */\nexport function getTodayDate(): string {\n return new Date().toISOString().split('T')[0];\n}\n\n/**\n * Generate cache key for npm package.\n * Mutable versions include date for daily invalidation.\n * Exact versions are cached indefinitely.\n */\nexport async function getPackageCacheKey(\n packageName: string,\n version: string,\n date?: string,\n): Promise<string> {\n const safeName = packageName.replace(/\\//g, '-').replace(/@/g, '');\n\n if (isMutableVersion(version)) {\n const dateStr = date ?? getTodayDate();\n const input = `${safeName}@${version}:${dateStr}`;\n return getHashServer(input, HASH_LENGTH);\n }\n\n // Exact version - no date component\n const input = `${safeName}@${version}`;\n return getHashServer(input, HASH_LENGTH);\n}\n\n/**\n * Normalize JSON content for consistent hashing.\n * Handles whitespace and property order variations.\n */\nfunction normalizeJson(content: string): string {\n const parsed = JSON.parse(content);\n return JSON.stringify(parsed);\n}\n\n/**\n * Generate cache key for flow.json configuration.\n * Includes date for daily rebuild guarantee.\n */\nexport async function getFlowConfigCacheKey(\n content: string,\n date?: string,\n): Promise<string> {\n const dateStr = date ?? getTodayDate();\n const normalized = normalizeJson(content);\n const input = `${normalized}:${dateStr}`;\n return getHashServer(input, HASH_LENGTH);\n}\n","/**\n * Build artifact cache for flow.json configurations\n *\n * Caches compiled bundles based on configuration content + date.\n * Enables intelligent cache reuse with daily rebuild guarantee.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { getFlowConfigCacheKey } from './cache-utils';\n\nconst BUILD_CACHE_DIR = path.join('.tmp', 'cache', 'builds');\n\n/**\n * Get the cache file path for a flow.json configuration\n */\nexport async function getBuildCachePath(\n configContent: string,\n cacheDir: string = BUILD_CACHE_DIR,\n): Promise<string> {\n const cacheKey = await getFlowConfigCacheKey(configContent);\n return path.join(cacheDir, `${cacheKey}.js`);\n}\n\n/**\n * Check if a cached build exists for the given configuration\n */\nexport async function isBuildCached(\n configContent: string,\n cacheDir: string = BUILD_CACHE_DIR,\n): Promise<boolean> {\n const cachePath = await getBuildCachePath(configContent, cacheDir);\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 cacheDir: string = BUILD_CACHE_DIR,\n): Promise<void> {\n const cachePath = await getBuildCachePath(configContent, cacheDir);\n await fs.ensureDir(path.dirname(cachePath));\n await fs.writeFile(cachePath, buildOutput, 'utf-8');\n}\n\n/**\n * Retrieve a cached build artifact\n */\nexport async function getCachedBuild(\n configContent: string,\n cacheDir: string = BUILD_CACHE_DIR,\n): Promise<string | null> {\n const cachePath = await getBuildCachePath(configContent, cacheDir);\n\n if (await fs.pathExists(cachePath)) {\n return await fs.readFile(cachePath, 'utf-8');\n }\n\n return null;\n}\n","/**\n * Bundle statistics display utilities\n */\nimport { formatBytes } from '../../core/index.js';\nimport type { BundleStats } from './bundler.js';\nimport type { Logger } from '../../core/index.js';\n\n/**\n * Display detailed bundle statistics to console\n */\nexport function displayStats(stats: BundleStats, logger: Logger): void {\n logger.info('\\n📊 Bundle Statistics');\n logger.info('─'.repeat(50));\n\n // Total size\n const sizeKB = formatBytes(stats.totalSize);\n logger.info(`Total Size: ${sizeKB} KB`);\n\n // Build time\n const timeSeconds = (stats.buildTime / 1000).toFixed(2);\n logger.info(`Build Time: ${timeSeconds}s`);\n\n // Tree-shaking effectiveness\n const treeshakingStatus = stats.treeshakingEffective\n ? '✅ Effective'\n : '⚠️ Not optimal (consider using named imports)';\n logger.info(`Tree-shaking: ${treeshakingStatus}`);\n\n // Package breakdown\n if (stats.packages.length > 0) {\n logger.info(`\\nPackage Breakdown:`);\n stats.packages.forEach((pkg) => {\n if (pkg.size > 0) {\n const pkgSizeKB = formatBytes(pkg.size);\n logger.info(` • ${pkg.name}: ${pkgSizeKB} KB`);\n }\n });\n }\n\n logger.info('─'.repeat(50));\n}\n\n/**\n * Create stats summary for JSON output\n */\nexport function createStatsSummary(stats: BundleStats) {\n return {\n totalSize: stats.totalSize,\n totalSizeFormatted: `${formatBytes(stats.totalSize)} KB`,\n buildTime: stats.buildTime,\n buildTimeFormatted: `${(stats.buildTime / 1000).toFixed(2)}s`,\n treeshakingEffective: stats.treeshakingEffective,\n packageCount: stats.packages.length,\n packages: stats.packages.map((pkg) => ({\n name: pkg.name,\n size: pkg.size,\n sizeFormatted: `${formatBytes(pkg.size)} KB`,\n })),\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { getPlatform } from '@walkeros/core';\nimport { createLogger, getErrorMessage } from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n getTempDir,\n isObject,\n type BuildOptions,\n} from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport { CallTracker } from './tracker.js';\nimport { executeInJSDOM } from './jsdom-executor.js';\nimport { executeInNode } from './node-executor.js';\nimport { loadDestinationEnvs } from './env-loader.js';\nimport type { SimulateCommandOptions, SimulationResult } from './types.js';\n\n/**\n * Generate a unique ID for temp files\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Main simulation orchestrator\n */\nexport async function simulateCore(\n configPath: string,\n event: unknown,\n options: Pick<SimulateCommandOptions, 'json' | 'verbose' | 'silent'> = {},\n): Promise<SimulationResult> {\n const logger = createLogger({\n verbose: options.verbose || false,\n silent: options.silent || false,\n json: options.json || false,\n });\n\n try {\n logger.info('🎯 Starting walkerOS simulation...');\n\n // Load and validate configuration\n logger.info('📦 Loading bundle configuration...');\n const fullConfigPath = path.resolve(configPath);\n const rawConfig = await loadJsonConfig(fullConfigPath);\n loadBundleConfig(rawConfig, { configPath: fullConfigPath });\n\n // Execute simulation\n logger.info(`🚀 Executing simulation with event: ${JSON.stringify(event)}`);\n const result = await executeSimulation(event, fullConfigPath);\n\n // Report results\n if (result.success) {\n logger.info(`✅ Simulation completed successfully`);\n } else {\n logger.error(`❌ Simulation failed: ${result.error}`);\n }\n\n return result;\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n logger.error(`💥 Simulation error: ${errorMessage}`);\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Simple result formatting\n */\nexport function formatSimulationResult(\n result: SimulationResult,\n options: Pick<SimulateCommandOptions, 'json'> = {},\n): string {\n if (options.json) {\n const output = {\n result: result.elbResult,\n usage: result.usage,\n duration: result.duration,\n };\n return JSON.stringify(output, null, 2);\n }\n\n if (result.success) {\n return '✅ Simulation completed successfully';\n } else {\n return `❌ Simulation failed: ${result.error}`;\n }\n}\n\n/**\n * Execute simulation using destination-provided mock environments\n */\nexport async function executeSimulation(\n event: unknown,\n configPath: string,\n): Promise<SimulationResult> {\n const startTime = Date.now();\n let bundlePath: string | undefined;\n const tempDir = getTempDir();\n\n try {\n // Validate event format\n if (\n !isObject(event) ||\n !('name' in event) ||\n typeof event.name !== 'string'\n ) {\n throw new Error(\n 'Event must be an object with a \"name\" property of type string',\n );\n }\n\n const typedEvent = event as { name: string; data?: unknown };\n\n // Ensure temp directory exists\n await fs.ensureDir(tempDir);\n\n // 1. Load config\n const rawConfig = await loadJsonConfig(configPath);\n const { flowConfig, buildOptions } = loadBundleConfig(rawConfig, {\n configPath,\n });\n\n // Detect platform from flowConfig\n const platform = getPlatform(flowConfig);\n\n // 2. Create tracker\n const tracker = new CallTracker();\n\n // 3. Create temporary bundle\n const tempOutput = path.join(\n tempDir,\n `simulation-bundle-${generateId()}.${platform === 'web' ? 'js' : 'mjs'}`,\n );\n\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n\n // Create build options for simulation - platform-aware bundling\n const simulationBuildOptions: BuildOptions = {\n ...buildOptions,\n code: buildOptions.code || '',\n output: tempOutput,\n tempDir,\n ...(platform === 'web'\n ? {\n format: 'iife' as const,\n platform: 'browser' as const,\n windowCollector: 'collector',\n windowElb: 'elb',\n }\n : {\n format: 'esm' as const,\n platform: 'node' as const,\n }),\n };\n\n // 4. Bundle (downloads packages internally)\n await bundleCore(\n flowConfig,\n simulationBuildOptions,\n createLogger({ silent: true }),\n false,\n );\n bundlePath = tempOutput;\n\n // 5. Load env examples dynamically from destination packages\n const envs = await loadDestinationEnvs(destinations || {});\n\n // 6. Execute based on platform\n let result;\n if (platform === 'web') {\n result = await executeInJSDOM(\n tempOutput,\n destinations || {},\n typedEvent,\n tracker,\n envs,\n 10000,\n );\n } else {\n result = await executeInNode(\n tempOutput,\n destinations || {},\n typedEvent,\n tracker,\n envs,\n 30000,\n );\n }\n\n const elbResult = result.elbResult;\n const usage = result.usage;\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n elbResult,\n usage,\n duration,\n logs: [],\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n return {\n success: false,\n error: getErrorMessage(error),\n duration,\n };\n } finally {\n // Cleanup temp directory and all its contents\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {\n // Ignore cleanup errors - temp dirs will be cleaned eventually\n });\n }\n // Note: JSDOM automatically cleans up its own isolated environment\n }\n}\n","/**\n * Call Tracker for Simulation\n *\n * Wraps mock environment functions to track API calls.\n * Used with destination-provided examples/env.ts mocks.\n */\n\nexport interface ApiCall {\n type: 'call';\n path: string;\n args: unknown[];\n timestamp: number;\n}\n\nexport class CallTracker {\n private calls: Map<string, ApiCall[]> = new Map();\n\n /**\n * Wrap a function to track its calls\n */\n wrapFunction(\n name: string,\n fn?: (...args: unknown[]) => unknown,\n ): (...args: unknown[]) => unknown {\n const self = this;\n const targetFn = fn || (() => {});\n\n return new Proxy(targetFn, {\n apply(_target, thisArg, args: unknown[]) {\n self.logCall(name, args);\n return targetFn.apply(thisArg, args);\n },\n });\n }\n\n /**\n * Wrap an environment object, tracking specified paths\n *\n * @param env - Environment object (from destination's examples/env.ts)\n * @param paths - Paths to track (e.g., ['gtag:window.gtag', 'gtag:window.dataLayer.push'])\n */\n wrapEnv<T extends Record<string, unknown>>(env: T, paths: string[]): T {\n const wrapped: Record<string, unknown> = {};\n\n // Deep clone the env object first\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === 'object' && value !== null) {\n wrapped[key] = Array.isArray(value)\n ? [...value]\n : { ...(value as Record<string, unknown>) };\n } else {\n wrapped[key] = value;\n }\n }\n\n // Wrap specified paths\n for (const fullPath of paths) {\n // Parse path: \"gtag:window.gtag\" → destKey=\"gtag\", path=\"window.gtag\"\n const [destKey, ...pathParts] = fullPath.split(':');\n const path = pathParts.join(':');\n\n if (!path) continue;\n\n // Remove \"call:\" prefix if present (from simulation array)\n const cleanPath = path.replace(/^call:/, '');\n const parts = cleanPath.split('.');\n\n let current: Record<string, unknown> = wrapped;\n let source: Record<string, unknown> | undefined = env;\n\n // Navigate to parent object\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n\n if (!current[part]) {\n current[part] = {};\n }\n\n current = current[part] as Record<string, unknown>;\n source =\n source && typeof source[part] === 'object' && source[part] !== null\n ? (source[part] as Record<string, unknown>)\n : undefined;\n }\n\n // Wrap the final property\n const finalKey = parts[parts.length - 1];\n const originalFn = source?.[finalKey];\n\n // Wrap with full path for tracking\n current[finalKey] = this.wrapFunction(\n `${destKey}:${cleanPath}`,\n typeof originalFn === 'function'\n ? (originalFn as (...args: unknown[]) => unknown)\n : undefined,\n );\n }\n\n return wrapped as T;\n }\n\n private logCall(fullPath: string, args: unknown[]): void {\n // Parse \"destKey:api.path\" → destKey and apiPath\n const [destKey, ...pathParts] = fullPath.split(':');\n const apiPath = pathParts.join(':');\n\n if (!this.calls.has(destKey)) {\n this.calls.set(destKey, []);\n }\n\n this.calls.get(destKey)!.push({\n type: 'call',\n path: apiPath,\n args,\n timestamp: Date.now(),\n });\n }\n\n getCalls(): Record<string, ApiCall[]> {\n return Object.fromEntries(this.calls);\n }\n\n reset(): void {\n this.calls.clear();\n }\n}\n","/**\n * JSDOM-based executor for simulating IIFE bundles\n *\n * Executes actual production IIFE bundles in a virtual DOM environment\n * with env-based mocking from destination examples.\n */\n\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport type { Elb } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport type { CallTracker, ApiCall } from './tracker.js';\n\nexport interface ExecutionResult {\n collector: unknown;\n elb: unknown;\n elbResult: Elb.PushResult | undefined;\n usage: Record<string, ApiCall[]>;\n duration: number;\n}\n\ninterface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Build sandbox from destination-provided envs\n *\n * Merges env mocks from each destination's envs, wrapping\n * specified paths with CallTracker for API call tracking.\n */\nfunction buildSandboxFromEnvs(\n envs: Record<string, DestinationEnv>,\n destinations: Record<string, unknown>,\n tracker: CallTracker,\n): { window: Record<string, unknown>; document: Record<string, unknown> } {\n // Base browser APIs (not provided by destinations)\n const baseBrowserMocks = {\n Image: class MockImage {\n src = '';\n onload = (() => {}) as unknown;\n onerror = (() => {}) as unknown;\n },\n fetch: async () => ({ ok: true, json: async () => ({}) }),\n location: { href: 'http://localhost' },\n navigator: { userAgent: 'Mozilla/5.0 (walkerOS Simulation)' },\n };\n\n const sandbox = {\n window: { ...baseBrowserMocks } as Record<string, unknown>,\n document: {} as Record<string, unknown>,\n };\n\n // Add destination-specific env mocks\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n const destEnv = envs[destKey];\n if (!destEnv?.push) continue;\n\n const mockEnv = destEnv.push;\n const trackPaths = destEnv.simulation || [];\n\n // Use existing CallTracker to wrap env\n const trackedEnv = tracker.wrapEnv(\n mockEnv as Record<string, unknown>,\n trackPaths.map((p) => `${destKey}:${p}`),\n );\n\n // Merge window properties\n if (trackedEnv.window && typeof trackedEnv.window === 'object') {\n Object.assign(sandbox.window, trackedEnv.window);\n }\n\n // Merge document properties\n if (trackedEnv.document && typeof trackedEnv.document === 'object') {\n Object.assign(sandbox.document, trackedEnv.document);\n }\n }\n\n return sandbox;\n}\n\n/**\n * Wait for async window property assignment\n *\n * IIFE bundles execute asynchronously and assign to window.\n * This helper polls until the property appears or timeout occurs.\n */\nfunction waitForWindowProperty(\n window: Record<string, unknown>,\n prop: string,\n timeout: number = 5000,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n\n const check = () => {\n if (window[prop] !== undefined) {\n resolve();\n } else if (Date.now() - start > timeout) {\n reject(\n new Error(\n `Timeout waiting for window.${prop}. ` +\n `IIFE may have failed to execute or assign to window.`,\n ),\n );\n } else {\n setImmediate(check);\n }\n };\n\n check();\n });\n}\n\n/**\n * Execute production IIFE bundle in JSDOM with env-based mocking\n *\n * Main orchestration function that:\n * 1. Creates JSDOM virtual DOM\n * 2. Builds sandbox from dynamically loaded envs\n * 3. Executes IIFE in JSDOM\n * 4. Waits for window.collector/elb assignment\n * 5. Runs event through elb\n * 6. Returns tracked API calls\n */\nexport async function executeInJSDOM(\n bundlePath: string,\n destinations: Record<string, unknown>,\n event: { name: string; data?: unknown },\n tracker: CallTracker,\n envs: Record<string, DestinationEnv>,\n timeout: number = 10000,\n): Promise<ExecutionResult> {\n const start = Date.now();\n\n // 1. Create JSDOM virtual DOM with console suppression\n const virtualConsole = new VirtualConsole();\n // Silent mode - don't pipe console output to process stdout/stderr\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously', // Allow script execution\n resources: 'usable',\n virtualConsole,\n });\n\n const { window } = dom;\n\n // 2. Build sandbox from dynamically loaded envs and inject into window\n const sandbox = buildSandboxFromEnvs(envs, destinations, tracker);\n Object.assign(window, sandbox.window);\n Object.assign(window.document, sandbox.document);\n\n // 3. Load and execute bundle code\n const bundleCode = await fs.readFile(bundlePath, 'utf8');\n\n try {\n window.eval(bundleCode);\n } catch (error) {\n throw new Error(`Bundle execution failed: ${getErrorMessage(error)}`);\n }\n\n // 4. Wait for window.collector and window.elb assignments\n try {\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'collector',\n timeout,\n );\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'elb',\n timeout,\n );\n } catch (error) {\n throw new Error(\n `Window property assignment failed: ${getErrorMessage(error)}`,\n );\n }\n\n const { collector, elb } = window as unknown as {\n collector: unknown;\n elb: (name: string, data?: unknown) => Promise<unknown>;\n };\n\n // 5. Run event through elb\n let elbResult: Elb.PushResult | undefined;\n try {\n elbResult = (await elb(event.name, event.data)) as\n | Elb.PushResult\n | undefined;\n } catch (error) {\n throw new Error(`Event execution failed: ${getErrorMessage(error)}`);\n }\n\n // 6. Return results with tracked calls\n return {\n collector,\n elb,\n elbResult,\n usage: tracker.getCalls(),\n duration: Date.now() - start,\n };\n}\n","/**\n * Node.js-based executor for simulating ESM server bundles\n *\n * Executes server bundles via dynamic import with env-based mocking.\n */\n\nimport { pathToFileURL } from 'url';\nimport type { Elb } from '@walkeros/core';\nimport { getErrorMessage } from '../../core/index.js';\nimport type { CallTracker, ApiCall } from './tracker.js';\n\nexport interface ExecutionResult {\n collector: unknown;\n elb: unknown;\n elbResult: Elb.PushResult | undefined;\n usage: Record<string, ApiCall[]>;\n duration: number;\n}\n\ninterface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\n/**\n * Build global mocks from destination-provided envs\n */\nfunction buildGlobalMocksFromEnvs(\n envs: Record<string, DestinationEnv>,\n destinations: Record<string, unknown>,\n tracker: CallTracker,\n): Record<string, unknown> {\n const globalMocks: Record<string, unknown> = {};\n\n for (const [destKey] of Object.entries(destinations)) {\n const destEnv = envs[destKey];\n if (!destEnv?.push) continue;\n\n const mockEnv = destEnv.push;\n const trackPaths = destEnv.simulation || [];\n\n const trackedEnv = tracker.wrapEnv(\n mockEnv as Record<string, unknown>,\n trackPaths.map((p) => `${destKey}:${p}`),\n );\n\n Object.assign(globalMocks, trackedEnv);\n }\n\n return globalMocks;\n}\n\n/**\n * Inject mocks into global scope and return cleanup function\n */\nfunction injectGlobalMocks(mocks: Record<string, unknown>): () => void {\n const originalValues: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(mocks)) {\n originalValues[key] = (globalThis as Record<string, unknown>)[key];\n (globalThis as Record<string, unknown>)[key] = value;\n }\n\n return () => {\n for (const [key, value] of Object.entries(originalValues)) {\n if (value === undefined) {\n delete (globalThis as Record<string, unknown>)[key];\n } else {\n (globalThis as Record<string, unknown>)[key] = value;\n }\n }\n };\n}\n\n/**\n * Execute server ESM bundle in Node.js with env-based mocking\n */\nexport async function executeInNode(\n bundlePath: string,\n destinations: Record<string, unknown>,\n event: { name: string; data?: unknown },\n tracker: CallTracker,\n envs: Record<string, DestinationEnv>,\n timeout: number = 30000,\n): Promise<ExecutionResult> {\n const start = Date.now();\n\n const globalMocks = buildGlobalMocksFromEnvs(envs, destinations, tracker);\n const cleanupMocks = injectGlobalMocks(globalMocks);\n\n try {\n const executeWithTimeout = async (): Promise<ExecutionResult> => {\n // Jest has issues with file:// URLs in dynamic imports, use path directly\n // Outside Jest, use file:// URL with cache-busting to prevent module caching\n const importUrl = process.env.JEST_WORKER_ID\n ? bundlePath\n : `${pathToFileURL(bundlePath).href}?t=${Date.now()}`;\n\n const module = await import(importUrl);\n\n if (!module.default || typeof module.default !== 'function') {\n throw new Error('Bundle does not export default factory function');\n }\n\n const result = await module.default();\n\n if (!result || !result.elb || typeof result.elb !== 'function') {\n throw new Error(\n 'Factory function did not return valid result with elb',\n );\n }\n\n const { collector, elb } = result;\n\n let elbResult: Elb.PushResult | undefined;\n try {\n elbResult = (await elb(event.name, event.data)) as\n | Elb.PushResult\n | undefined;\n } catch (error) {\n throw new Error(`Event execution failed: ${getErrorMessage(error)}`);\n }\n\n return {\n collector,\n elb,\n elbResult,\n usage: tracker.getCalls(),\n duration: Date.now() - start,\n };\n };\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Server simulation timeout after ${timeout}ms`)),\n timeout,\n );\n });\n\n return await Promise.race([executeWithTimeout(), timeoutPromise]);\n } catch (error) {\n throw new Error(`Node execution failed: ${getErrorMessage(error)}`);\n } finally {\n cleanupMocks();\n }\n}\n","interface DestinationEnv {\n init?: Record<string, unknown>;\n push: Record<string, unknown>;\n simulation?: string[];\n}\n\ninterface DestinationConfig {\n package?: string;\n config?: Record<string, unknown>;\n}\n\n/**\n * Dynamically loads env examples from destination packages.\n *\n * Imports from `/dev` subpath (e.g., '@walkeros/web-destination-gtag/dev')\n * and extracts the `env` object which contains:\n * - push: Mock environment with API functions (gtag, fbq, etc.)\n * - simulation: Array of tracking paths for call verification\n *\n * @param destinations - Destination configuration from flow config\n * @returns Map of destination key to env object\n */\nexport async function loadDestinationEnvs(\n destinations: Record<string, unknown>,\n): Promise<Record<string, DestinationEnv>> {\n const envs: Record<string, DestinationEnv> = {};\n\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n const typedConfig = destConfig as DestinationConfig;\n\n // Skip if no package field\n if (!typedConfig.package) {\n continue;\n }\n\n try {\n // Determine import path\n const packageName = typedConfig.package;\n const isDemoPackage = packageName.includes('-demo');\n const importPath = isDemoPackage ? packageName : `${packageName}/dev`;\n\n // Dynamic import\n const module = await import(importPath);\n\n // Extract env from examples\n const examplesModule = module.examples || module.default?.examples;\n const envModule = examplesModule?.env;\n\n if (envModule?.push) {\n envs[destKey] = {\n init: envModule.init,\n push: envModule.push,\n simulation: envModule.simulation || [],\n };\n }\n } catch (error) {\n // Silently skip destinations without env or invalid packages\n // eslint-disable-next-line no-console\n console.warn(\n `Warning: Could not load env for destination \"${destKey}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return envs;\n}\n","import { simulateCore, formatSimulationResult } from './simulator.js';\nimport {\n createCommandLogger,\n createLogger,\n executeCommand,\n getErrorMessage,\n buildCommonDockerArgs,\n} from '../../core/index.js';\nimport { loadJsonFromSource } from '../../config/index.js';\nimport type { SimulateCommandOptions } from './types.js';\n\n/**\n * CLI command handler for simulate command\n */\nexport async function simulateCommand(\n options: SimulateCommandOptions,\n): Promise<void> {\n const logger = createCommandLogger(options);\n\n // Build Docker args - start with common flags\n const dockerArgs = buildCommonDockerArgs(options);\n // Add simulate-specific flag\n if (options.event) dockerArgs.push('--event', options.event);\n\n await executeCommand(\n async () => {\n const startTime = Date.now();\n\n try {\n // Load event from inline JSON, file path, or URL\n const event = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n\n // Execute simulation\n const result = await simulateCore(options.config, event, {\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n });\n\n // Add duration to result\n const resultWithDuration = {\n ...result,\n duration: (Date.now() - startTime) / 1000,\n };\n\n // Output results - create output logger that always logs\n const outputLogger = createLogger({ silent: false, json: false });\n const output = formatSimulationResult(resultWithDuration, {\n json: options.json,\n });\n outputLogger.log('white', output);\n\n // Exit with error code if simulation failed\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n // JSON error output - create output logger that always logs\n const outputLogger = createLogger({ silent: false, json: false });\n const errorOutput = JSON.stringify(\n {\n success: false,\n error: errorMessage,\n duration: (Date.now() - startTime) / 1000,\n },\n null,\n 2,\n );\n outputLogger.log('white', errorOutput);\n } else {\n // Error output - create error logger that always logs\n const errorLogger = createLogger({ silent: false, json: false });\n errorLogger.error(`❌ Simulate command failed: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n },\n 'simulate',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * High-level simulate function for programmatic usage.\n *\n * Handles configuration loading internally and returns structured results.\n *\n * @param configOrPath - Bundle configuration object or path to config file\n * @param event - Event object to simulate\n * @param options - Simulation options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.json - Format output as JSON (default: false)\n * @returns Simulation result with success status, elb result, and usage data\n *\n * @example\n * ```typescript\n * // With config file\n * const result = await simulate('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n *\n * // With config object\n * const result = await simulate(\n * {\n * platform: 'web',\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * code: '...',\n * output: './bundle.js'\n * },\n * { name: 'page view' },\n * { silent: true }\n * );\n * ```\n */\nexport async function simulate(\n configOrPath: string | unknown,\n event: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n json?: boolean;\n } = {},\n): Promise<import('./types').SimulationResult> {\n // simulateCore currently only accepts file paths, so we need to handle that\n // For now, if configOrPath is not a string, throw an error with guidance\n if (typeof configOrPath !== 'string') {\n throw new Error(\n 'simulate() currently only supports config file paths. ' +\n 'Config object support will be added in a future version. ' +\n 'Please provide a path to a configuration file.',\n );\n }\n\n // Call core simulator\n return await simulateCore(configOrPath, event, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n });\n}\n\n// Re-export types and utilities for testing\nexport * from './types.js';\nexport * from './simulator.js';\nexport { executeInNode } from './node-executor.js';\n","import path from 'path';\nimport { JSDOM, VirtualConsole } from 'jsdom';\nimport fs from 'fs-extra';\nimport { getPlatform, type Elb } from '@walkeros/core';\nimport { schemas } from '@walkeros/core/dev';\nimport {\n createCommandLogger,\n createLogger,\n executeCommand,\n getErrorMessage,\n buildCommonDockerArgs,\n type Logger,\n} from '../../core/index.js';\nimport {\n loadJsonConfig,\n loadJsonFromSource,\n loadBundleConfig,\n} from '../../config/index.js';\nimport { bundleCore } from '../bundle/bundler.js';\nimport type { PushCommandOptions, PushResult } from './types.js';\n\n/**\n * CLI command handler for push command\n */\nexport async function pushCommand(options: PushCommandOptions): Promise<void> {\n const logger = createCommandLogger(options);\n\n // Build Docker args\n const dockerArgs = buildCommonDockerArgs(options);\n dockerArgs.push('--event', options.event);\n if (options.flow) dockerArgs.push('--flow', options.flow);\n\n await executeCommand(\n async () => {\n const startTime = Date.now();\n\n try {\n // Step 1: Load event\n logger.info('📥 Loading event...');\n const event = await loadJsonFromSource(options.event, {\n name: 'event',\n });\n\n // Validate event format using Zod schema\n const eventResult = schemas.PartialEventSchema.safeParse(event);\n if (!eventResult.success) {\n const errors = eventResult.error.issues\n .map((issue) => `${String(issue.path.join('.'))}: ${issue.message}`)\n .join(', ');\n throw new Error(`Invalid event: ${errors}`);\n }\n\n const parsedEvent = eventResult.data as {\n name?: string;\n data?: Record<string, unknown>;\n };\n if (!parsedEvent.name) {\n throw new Error('Invalid event: Missing required \"name\" property');\n }\n\n // Create typed event object for execution\n const validatedEvent: { name: string; data: Record<string, unknown> } =\n {\n name: parsedEvent.name,\n data: (parsedEvent.data || {}) as Record<string, unknown>,\n };\n\n // Warn about event naming format (walkerOS business logic)\n if (!validatedEvent.name.includes(' ')) {\n logger.warn(\n `Event name \"${validatedEvent.name}\" should follow \"ENTITY ACTION\" format (e.g., \"page view\")`,\n );\n }\n\n // Step 2: Load config\n logger.info('📦 Loading flow configuration...');\n const configPath = path.resolve(options.config);\n const rawConfig = await loadJsonConfig(configPath);\n const { flowConfig, buildOptions, flowName, isMultiFlow } =\n loadBundleConfig(rawConfig, {\n configPath: options.config,\n flowName: options.flow,\n logger,\n });\n\n const platform = getPlatform(flowConfig);\n\n // Step 3: Bundle to temp file in config directory (so Node.js can find node_modules)\n logger.info('🔨 Bundling flow configuration...');\n const configDir = path.dirname(configPath);\n const tempDir = path.join(\n configDir,\n '.tmp',\n `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n await fs.ensureDir(tempDir);\n const tempPath = path.join(\n tempDir,\n `bundle.${platform === 'web' ? 'js' : 'mjs'}`,\n );\n\n const pushBuildOptions = {\n ...buildOptions,\n output: tempPath,\n // Web uses IIFE for browser-like execution, server uses ESM\n format: platform === 'web' ? ('iife' as const) : ('esm' as const),\n platform:\n platform === 'web' ? ('browser' as const) : ('node' as const),\n ...(platform === 'web' && {\n windowCollector: 'collector',\n windowElb: 'elb',\n }),\n };\n\n await bundleCore(flowConfig, pushBuildOptions, logger, false);\n\n logger.debug(`Bundle created: ${tempPath}`);\n\n // Step 4: Execute based on platform\n let result: PushResult;\n\n if (platform === 'web') {\n logger.info('🌐 Executing in web environment (JSDOM)...');\n result = await executeWebPush(tempPath, validatedEvent, logger);\n } else if (platform === 'server') {\n logger.info('🖥️ Executing in server environment (Node.js)...');\n result = await executeServerPush(tempPath, validatedEvent, logger);\n } else {\n throw new Error(`Unsupported platform: ${platform}`);\n }\n\n // Step 5: Output results\n const duration = Date.now() - startTime;\n\n if (options.json) {\n // JSON output\n const outputLogger = createLogger({ silent: false, json: false });\n outputLogger.log(\n 'white',\n JSON.stringify(\n {\n success: result.success,\n event: result.elbResult,\n duration,\n },\n null,\n 2,\n ),\n );\n } else {\n // Standard output\n if (result.success) {\n logger.success('✅ Event pushed successfully');\n if (result.elbResult && typeof result.elbResult === 'object') {\n const pushResult = result.elbResult as unknown as Record<\n string,\n unknown\n >;\n if ('id' in pushResult && pushResult.id) {\n logger.info(` Event ID: ${pushResult.id}`);\n }\n if ('entity' in pushResult && pushResult.entity) {\n logger.info(` Entity: ${pushResult.entity}`);\n }\n if ('action' in pushResult && pushResult.action) {\n logger.info(` Action: ${pushResult.action}`);\n }\n }\n logger.info(` Duration: ${duration}ms`);\n } else {\n logger.error(`❌ Push failed: ${result.error}`);\n process.exit(1);\n }\n }\n\n // Cleanup temp directory\n try {\n await fs.remove(tempDir);\n } catch {\n // Ignore cleanup errors\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const outputLogger = createLogger({ silent: false, json: false });\n outputLogger.log(\n 'white',\n JSON.stringify(\n {\n success: false,\n error: errorMessage,\n duration,\n },\n null,\n 2,\n ),\n );\n } else {\n logger.error(`❌ Push command failed: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n },\n 'push',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * Typed event input for push command\n */\ninterface PushEventInput {\n name: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Execute push for web platform using JSDOM with real APIs\n */\nasync function executeWebPush(\n bundlePath: string,\n event: PushEventInput,\n logger: Logger,\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // Create JSDOM with silent console\n const virtualConsole = new VirtualConsole();\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n url: 'http://localhost',\n runScripts: 'dangerously',\n resources: 'usable',\n virtualConsole,\n });\n\n const { window } = dom;\n\n // JSDOM provides fetch natively, no need to inject node-fetch\n\n // Load and execute bundle\n logger.debug('Loading bundle...');\n const bundleCode = await fs.readFile(bundlePath, 'utf8');\n window.eval(bundleCode);\n\n // Wait for window.elb assignment\n logger.debug('Waiting for elb...');\n await waitForWindowProperty(\n window as unknown as Record<string, unknown>,\n 'elb',\n 5000,\n );\n\n const windowObj = window as unknown as Record<string, unknown>;\n const elb = windowObj.elb as unknown as (\n name: string,\n data: Record<string, unknown>,\n ) => Promise<Elb.PushResult>;\n\n // Push event\n logger.info(`Pushing event: ${event.name}`);\n const elbResult = await elb(event.name, event.data);\n\n return {\n success: true,\n elbResult,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Execute push for server platform using Node.js\n */\nasync function executeServerPush(\n bundlePath: string,\n event: PushEventInput,\n logger: Logger,\n timeout: number = 60000, // 60 second default timeout\n): Promise<PushResult> {\n const startTime = Date.now();\n\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Server push timeout after ${timeout}ms`)),\n timeout,\n );\n });\n\n // Execute with timeout\n const executePromise = (async () => {\n // Dynamic import of ESM bundle\n logger.debug('Importing bundle...');\n const flowModule = await import(bundlePath);\n\n if (!flowModule.default || typeof flowModule.default !== 'function') {\n throw new Error('Bundle does not export default factory function');\n }\n\n // Call factory function to start flow\n logger.debug('Calling factory function...');\n const result = await flowModule.default();\n\n if (!result || !result.elb || typeof result.elb !== 'function') {\n throw new Error(\n 'Factory function did not return valid result with elb',\n );\n }\n\n const { elb } = result;\n\n // Push event\n logger.info(`Pushing event: ${event.name}`);\n const elbResult = await (\n elb as (\n name: string,\n data: Record<string, unknown>,\n ) => Promise<Elb.PushResult>\n )(event.name, event.data);\n\n return {\n success: true,\n elbResult,\n duration: Date.now() - startTime,\n };\n })();\n\n // Race between execution and timeout\n return await Promise.race([executePromise, timeoutPromise]);\n } catch (error) {\n return {\n success: false,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n/**\n * Wait for window property to be assigned\n */\nfunction waitForWindowProperty(\n window: Record<string, unknown>,\n prop: string,\n timeout: number = 5000,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n\n const check = () => {\n if (window[prop] !== undefined) {\n resolve();\n } else if (Date.now() - start > timeout) {\n reject(\n new Error(\n `Timeout waiting for window.${prop}. IIFE may have failed to execute.`,\n ),\n );\n } else {\n setImmediate(check);\n }\n };\n\n check();\n });\n}\n\n// Export types\nexport type { PushCommandOptions, PushResult };\n","/**\n * Run Command\n *\n * Runs walkerOS flows using @walkeros/docker as a library\n * No Docker daemon required - runs directly in Node.js\n */\n\nimport path from 'path';\nimport {\n createCommandLogger,\n createTimer,\n getExecutionMode,\n getErrorMessage,\n executeRunInDocker,\n isDockerAvailable,\n} from '../../core/index.js';\nimport { validateMode, validateFlowFile, validatePort } from './validators.js';\nimport { prepareBundleForRun, isPreBuiltConfig } from './utils.js';\nimport { executeRunLocal } from './execution.js';\nimport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './types.js';\n\n/**\n * CLI command function for `walkeros run`\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Command options\n */\nexport async function runCommand(\n mode: string,\n options: RunCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createCommandLogger(options);\n\n try {\n // Step 1: Validate inputs\n validateMode(mode);\n const configPath = validateFlowFile(options.config);\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Step 2: Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(configPath);\n\n let flowPath: string | null = null;\n\n if (mode === 'collect') {\n if (isPreBuilt) {\n // Use pre-built bundle directly\n flowPath = path.resolve(configPath);\n if (!options.json && !options.silent) {\n logger.info(`📦 Using pre-built flow: ${path.basename(flowPath)}`);\n }\n } else {\n // Bundle JSON config first\n if (!options.json && !options.silent) {\n logger.info('🔨 Building flow bundle...');\n }\n\n flowPath = await prepareBundleForRun(configPath, {\n verbose: options.verbose,\n silent: options.json || options.silent,\n });\n\n if (!options.json && !options.silent) {\n logger.success('✅ Bundle ready');\n }\n }\n }\n\n // Step 3: Execute based on mode\n const executionMode = getExecutionMode(options);\n\n // Handle dry-run\n if (options.dryRun) {\n if (executionMode === 'docker') {\n logger.info(\n `[DRY-RUN] Would execute in Docker: run ${mode} with runtime image`,\n );\n } else {\n logger.info(`[DRY-RUN] Would execute locally: run ${mode}`);\n }\n return;\n }\n\n if (executionMode === 'docker') {\n // Docker mode: Use production runtime image\n const dockerAvailable = await isDockerAvailable();\n if (!dockerAvailable) {\n throw new Error(\n 'Docker is not available. Please install Docker or use --local flag to execute locally.',\n );\n }\n\n if (!options.json && !options.silent) {\n logger.info('🐳 Executing in production runtime container...');\n }\n\n await executeRunInDocker(mode as 'collect' | 'serve', flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n silent: options.silent,\n });\n } else {\n // Local mode: Use library functions\n if (!options.json && !options.silent) {\n const modeLabel = mode === 'collect' ? 'Collector' : 'Server';\n logger.info(`🖥️ Starting ${modeLabel} locally...`);\n }\n\n await executeRunLocal(mode as 'collect' | 'serve', flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n });\n }\n\n // Note: Both Docker and local modes run forever, so we won't reach here unless they fail\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = getErrorMessage(error);\n\n if (options.json) {\n const output = {\n success: false,\n mode,\n error: errorMessage,\n duration,\n };\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(output, null, 2));\n } else {\n logger.error('❌ Run failed:');\n logger.error(errorMessage);\n }\n process.exit(1);\n }\n}\n\n/**\n * Programmatic run function\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Run options\n * @returns Run result\n *\n * @example\n * ```typescript\n * // Run with JSON config (bundles automatically)\n * await run('collect', {\n * config: './flow.json',\n * port: 8080\n * });\n *\n * // Run with pre-built bundle\n * await run('collect', {\n * config: './flow.mjs',\n * port: 8080\n * });\n * ```\n */\nexport async function run(\n mode: RunMode,\n options: RunOptions,\n): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\n // Validate inputs\n validateMode(mode);\n\n let flowFile: string;\n if (typeof options.config === 'string') {\n flowFile = validateFlowFile(options.config);\n } else {\n throw new Error('Programmatic run() requires config file path');\n }\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Determine if config is pre-built or needs bundling\n const isPreBuilt = isPreBuiltConfig(flowFile);\n\n let flowPath: string;\n\n if (isPreBuilt) {\n flowPath = path.resolve(flowFile);\n } else {\n // Bundle JSON config\n flowPath = await prepareBundleForRun(flowFile, {\n verbose: options.verbose,\n silent: true,\n });\n }\n\n // Run the flow using Docker package\n await executeRunLocal(mode, flowPath, {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n });\n\n // Success (though runFlow runs forever, so we typically don't reach here)\n return {\n success: true,\n exitCode: 0,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n duration: Date.now() - startTime,\n error: getErrorMessage(error),\n };\n }\n}\n\n// Export types\nexport type { RunMode, RunCommandOptions, RunOptions, RunResult };\n","/**\n * Run Command Validators\n *\n * Validation logic for run command inputs.\n * Uses Zod schemas for type-safe validation.\n */\n\nimport { existsSync } from 'fs';\nimport { resolveAsset } from '../../core/asset-resolver.js';\nimport {\n RunModeSchema,\n PortSchema,\n type RunMode,\n} from '../../schemas/index.js';\n\n/**\n * Validates run mode using Zod schema.\n *\n * @param mode - Mode to validate\n * @throws Error if mode is invalid\n */\nexport function validateMode(mode: string): asserts mode is RunMode {\n const result = RunModeSchema.safeParse(mode);\n if (!result.success) {\n throw new Error(\n `Invalid mode: \"${mode}\"\\n` +\n ` Valid modes: collect, serve\\n` +\n ` Example: walkeros run collect ./flow.json`,\n );\n }\n}\n\n/**\n * Validates flow file exists.\n *\n * @remarks\n * File existence cannot be validated by Zod, so this remains a custom check.\n *\n * @param filePath - Path to flow configuration file (bare name, relative, or absolute)\n * @returns Absolute path to flow file\n * @throws Error if file doesn't exist\n */\nexport function validateFlowFile(filePath: string): string {\n // Use asset resolver to handle bare names, relative paths, and absolute paths\n const absolutePath = resolveAsset(filePath, 'bundle');\n\n if (!existsSync(absolutePath)) {\n throw new Error(\n `Flow file not found: ${filePath}\\n` +\n ` Resolved path: ${absolutePath}\\n` +\n ` Make sure the file exists and the path is correct`,\n );\n }\n\n return absolutePath;\n}\n\n/**\n * Validates port number using Zod schema.\n *\n * @param port - Port number to validate\n * @throws Error if port is invalid\n */\nexport function validatePort(port: number): void {\n const result = PortSchema.safeParse(port);\n if (!result.success) {\n throw new Error(\n `Invalid port: ${port}\\n` +\n ` Port must be an integer between 1 and 65535\\n` +\n ` Example: --port 8080`,\n );\n }\n}\n","/**\n * CLI Primitive Schemas\n *\n * Basic Zod schemas for CLI parameter validation.\n * Follows walkerOS patterns from @walkeros/core.\n */\n\nimport { z } from '@walkeros/core/dev';\n\n/**\n * Run mode schema.\n *\n * @remarks\n * Validates CLI run mode for the `run` command.\n * - `collect`: Run as event collector\n * - `serve`: Run as HTTP server\n */\nexport const RunModeSchema = z\n .enum(['collect', 'serve'])\n .describe('CLI run mode: collect events or serve HTTP');\n\nexport type RunMode = z.infer<typeof RunModeSchema>;\n\n/**\n * Port number schema.\n *\n * @remarks\n * Validates HTTP server port number.\n * Must be integer between 1-65535.\n */\nexport const PortSchema = z\n .number()\n .int('Port must be an integer')\n .min(1, 'Port must be at least 1')\n .max(65535, 'Port must be at most 65535')\n .describe('HTTP server port number');\n\n/**\n * File path schema.\n *\n * @remarks\n * Basic string validation for file paths.\n * File existence is checked separately (Zod can't check filesystem).\n */\nexport const FilePathSchema = z\n .string()\n .min(1, 'File path cannot be empty')\n .describe('Path to configuration file');\n","/**\n * Run Command Schemas\n *\n * Zod schemas for run command options validation.\n */\n\nimport { z } from '@walkeros/core/dev';\nimport { RunModeSchema, PortSchema, FilePathSchema } from './primitives';\n\n/**\n * Run command options schema.\n *\n * @remarks\n * Validates all options for the `walkeros run` command.\n */\nexport const RunOptionsSchema = z.object({\n mode: RunModeSchema,\n flow: FilePathSchema,\n port: PortSchema.default(8080),\n flowName: z.string().optional().describe('Specific flow name to run'),\n});\n\nexport type RunOptions = z.infer<typeof RunOptionsSchema>;\n","/**\n * Run Command Utilities\n *\n * Shared utilities for the run command\n */\n\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { bundle } from '../bundle/index.js';\n\n/**\n * Prepares a JSON config file for execution by bundling it to a temporary location.\n *\n * Creates bundle in .tmp/ directory relative to config file (not /tmp)\n * so Node.js module resolution finds node_modules.\n *\n * @param configPath - Path to the JSON configuration file\n * @param options - Bundle options\n * @param options.verbose - Enable verbose logging\n * @param options.silent - Suppress output\n * @returns Path to the bundled output file\n */\nexport async function prepareBundleForRun(\n configPath: string,\n options: {\n verbose?: boolean;\n silent?: boolean;\n },\n): Promise<string> {\n // Create temp directory relative to config (ensures node_modules is findable)\n const configDir = path.dirname(path.resolve(configPath));\n const tempDir = path.join(\n configDir,\n '.tmp',\n `run-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n );\n await fs.ensureDir(tempDir);\n\n // Generate output path in temp directory\n const tempPath = path.join(tempDir, 'bundle.mjs');\n\n // Bundle with proper output override\n await bundle(configPath, {\n cache: true,\n verbose: options.verbose,\n silent: options.silent,\n buildOverrides: {\n output: tempPath,\n format: 'esm',\n platform: 'node',\n },\n });\n\n return tempPath;\n}\n\n/**\n * Checks if a config file is pre-built or needs bundling\n *\n * @param configPath - Path to configuration file\n * @returns True if file is pre-built (js/mjs/cjs), false if needs bundling (json)\n */\nexport function isPreBuiltConfig(configPath: string): boolean {\n return (\n configPath.endsWith('.mjs') ||\n configPath.endsWith('.js') ||\n configPath.endsWith('.cjs')\n );\n}\n","import { createLogger, Level } from '@walkeros/core';\nimport type { RuntimeConfig, ServeConfig } from '@walkeros/docker';\nimport { runFlow, runServeMode } from '@walkeros/docker';\n\n// Create logger for local execution - DEBUG level when VERBOSE, otherwise INFO\nconst logLevel = process.env.VERBOSE === 'true' ? Level.DEBUG : Level.INFO;\nconst logger = createLogger({ level: logLevel });\n\n/**\n * Execute run command locally\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to flow bundle (required for collect, optional for serve)\n * @param options - Runtime options\n */\nexport async function executeRunLocal(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n serveName?: string;\n servePath?: string;\n },\n): Promise<void> {\n switch (mode) {\n case 'collect': {\n if (!flowPath) {\n throw new Error('Flow path is required for collect mode');\n }\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config, logger.scope('runner'));\n break;\n }\n\n case 'serve': {\n const config: ServeConfig = {\n port: options.port,\n host: options.host,\n serveName: options.serveName,\n servePath: options.servePath,\n file: flowPath || undefined,\n };\n await runServeMode(config, logger.scope('serve'));\n break;\n }\n\n default:\n throw new Error(`Unknown mode: ${mode}`);\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { Command } from 'commander';\n\nconst CACHE_DIR = path.join('.tmp', 'cache');\n\nexport function registerCacheCommand(program: Command): void {\n const cache = program.command('cache').description('Manage the CLI cache');\n\n cache\n .command('clear')\n .description('Clear all cached packages and builds')\n .option('--packages', 'Clear only package cache')\n .option('--builds', 'Clear only build cache')\n .action(async (options) => {\n if (options.packages) {\n await fs.remove(path.join(CACHE_DIR, 'packages'));\n console.log('Package cache cleared');\n } else if (options.builds) {\n await fs.remove(path.join(CACHE_DIR, 'builds'));\n console.log('Build cache cleared');\n } else {\n await fs.remove(CACHE_DIR);\n console.log('All caches cleared');\n }\n });\n\n cache\n .command('info')\n .description('Show cache statistics')\n .action(async () => {\n const packagesDir = path.join(CACHE_DIR, 'packages');\n const buildsDir = path.join(CACHE_DIR, 'builds');\n\n const packageCount = await countEntries(packagesDir);\n const buildCount = await countEntries(buildsDir);\n\n console.log(`Cache directory: ${CACHE_DIR}`);\n console.log(`Cached packages: ${packageCount}`);\n console.log(`Cached builds: ${buildCount}`);\n });\n}\n\nasync function countEntries(dir: string): Promise<number> {\n if (!(await fs.pathExists(dir))) return 0;\n const entries = await fs.readdir(dir);\n return entries.length;\n}\n"],"mappings":"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","names":["fileURLToPath","DOCKER_VERSION","path","path","path","path","logger","fs","path","path","path","fs","logger","path","path","fs","path","fs","path","fs","path","fs","getHashServer","input","path","fs","logger","packageJson","fs","path","path","fs","logger","path","fs","logger","logger","path","path","fs","getPlatform","path","fs","fs","logger","path","fs","getPlatform","logger","path","JSDOM","VirtualConsole","fs","getPlatform","schemas","logger","schemas","path","getPlatform","fs","VirtualConsole","JSDOM","waitForWindowProperty","path","existsSync","z","z","existsSync","path","fs","path","fs","createLogger","logger","path","fs","path","program","fileURLToPath","DOCKER_VERSION"]}