@open-mercato/cli 0.6.6-develop.5523.1.e223ca1915 → 0.6.6-develop.5531.1.ab1959dfae

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.
@@ -1,4 +1,4 @@
1
- [build:cli] found 88 entry points
1
+ [build:cli] found 89 entry points
2
2
  Copied create-app/agentic/ → dist/agentic/
3
3
  Discovered 16 standalone guides → dist/agentic/guides/
4
4
  [build:cli] built successfully
@@ -39,7 +39,7 @@ When the developer reports a problem, follow this order:
39
39
 
40
40
  ### Step 2: Check Generated Files
41
41
 
42
- Run these commands first they fix 60%+ of issues:
42
+ These commands fix 60%+ of issues, so they are usually the first fix to propose (they are mutating — propose, then run after confirmation per [Step 4](#step-4-propose-before-fixing)):
43
43
 
44
44
  ```bash
45
45
  yarn generate # Regenerate module discovery files
@@ -61,6 +61,28 @@ ls .mercato/generated/
61
61
  yarn typecheck
62
62
  ```
63
63
 
64
+ ### Step 4: Propose Before Fixing
65
+
66
+ Once you have diagnosed the root cause, **do not apply the fix immediately**. First present:
67
+
68
+ 1. The **root cause** — what is actually broken and why.
69
+ 2. The **proposed fix** — the exact commands and/or code changes you intend to apply.
70
+
71
+ Then **wait for explicit user confirmation** before applying any **mutating** change. This keeps the developer in control and avoids surprise edits, migrations, or restarts.
72
+
73
+ **Read-only diagnostics may run without asking** — they only gather information and change nothing:
74
+
75
+ | Allowed without confirmation (read-only) | Requires confirmation (mutating) |
76
+ |------------------------------------------|----------------------------------|
77
+ | `yarn typecheck` | `yarn generate` |
78
+ | `grep` / file reads / `ls` | `yarn db:generate` |
79
+ | log / browser-console inspection | `yarn db:migrate` |
80
+ | `docker compose ps` | editing files |
81
+ | `curl` against a running endpoint (GET) | restarting the dev server (`yarn dev`) |
82
+ | | `docker compose up` |
83
+
84
+ When in doubt about whether an action mutates state, treat it as mutating and ask first. Once the user confirms, apply the fix and verify it.
85
+
64
86
  ---
65
87
 
66
88
  ## 2. Module Issues
@@ -76,24 +98,24 @@ yarn typecheck
76
98
  // Must have this entry:
77
99
  { id: '<module_id>', from: '@app' }
78
100
  ```
79
- Fix: Add the entry and run `yarn generate`.
101
+ Proposed fix: Add the entry and run `yarn generate`.
80
102
 
81
103
  2. **Did you run `yarn generate`?**
82
104
  Check if `.mercato/generated/` contains your module's entries.
83
- Fix: Run `yarn generate`.
105
+ Proposed fix: Run `yarn generate`.
84
106
 
85
107
  3. **Is the module folder named correctly?**
86
108
  Must be plural, snake_case: `src/modules/<module_id>/`
87
- Fix: Rename folder to match module ID.
109
+ Proposed fix: Rename folder to match module ID.
88
110
 
89
111
  4. **Does `index.ts` export `metadata`?**
90
112
  ```typescript
91
113
  export const metadata: ModuleInfo = { name: '<module_id>', ... }
92
114
  ```
93
- Fix: Add the metadata export.
115
+ Proposed fix: Add the metadata export.
94
116
 
95
117
  5. **Is the dev server running with latest changes?**
96
- Fix: Restart with `yarn dev`.
118
+ Proposed fix: Restart with `yarn dev`.
97
119
 
98
120
  ### Module loads but pages 404
99
121
 
@@ -104,17 +126,17 @@ yarn typecheck
104
126
  1. **Are backend page files in the right location?**
105
127
  - List page: `backend/page.tsx` (not `backend/index.tsx`)
106
128
  - Detail page: `backend/<entities>/[id].tsx` (bracket notation)
107
- Fix: Rename to match auto-discovery convention.
129
+ Proposed fix: Rename to match auto-discovery convention.
108
130
 
109
131
  2. **Do pages export `metadata` with `requireAuth`?**
110
132
  ```typescript
111
133
  export const metadata = { requireAuth: true, features: ['<module_id>.view'] }
112
134
  ```
113
- Fix: Add metadata export.
135
+ Proposed fix: Add metadata export.
114
136
 
115
137
  3. **Does the user have the required ACL features?**
116
138
  Check `setup.ts` has `defaultRoleFeatures` for the user's role.
117
- Fix: Add features to role defaults, re-run setup.
139
+ Proposed fix: Add features to role defaults, re-run setup.
118
140
 
119
141
  ---
120
142
 
@@ -130,22 +152,22 @@ yarn typecheck
130
152
  ```bash
131
153
  yarn db:generate # Probes/creates migration file
132
154
  ```
133
- Fix: Run `yarn db:generate` to inspect the required migration, then keep only the scoped SQL for your module and update `src/modules/<module_id>/migrations/.snapshot-open-mercato.json`.
155
+ Proposed fix: Run `yarn db:generate` to inspect the required migration, then keep only the scoped SQL for your module and update `src/modules/<module_id>/migrations/.snapshot-open-mercato.json`.
134
156
 
135
157
  2. **Is the entity declared in the right file with the right imports?**
136
158
  Entity classes belong in `src/modules/<module_id>/data/entities.ts` and decorators must come from `@mikro-orm/decorators/legacy`.
137
- Fix: move stale `entities/<Entity>.ts` patterns into `data/entities.ts` and fix the imports before regenerating the migration.
159
+ Proposed fix: move stale `entities/<Entity>.ts` patterns into `data/entities.ts` and fix the imports before regenerating the migration.
138
160
 
139
161
  3. **Did you apply the migration?**
140
162
  ```bash
141
163
  yarn db:migrate # Applies pending migrations
142
164
  ```
143
- Fix: Run `yarn db:migrate`.
165
+ Proposed fix: Run `yarn db:migrate`.
144
166
 
145
167
  4. **Is the migration file correct?**
146
168
  Check `src/modules/<module_id>/migrations/` for the latest migration.
147
169
  Verify it has the expected columns and types.
148
- Fix: If wrong, delete the migration file, fix the entity, and regenerate.
170
+ Proposed fix: If wrong, delete the migration file, fix the entity, and regenerate.
149
171
 
150
172
  ### Migration generation creates unexpected changes
151
173
 
@@ -160,11 +182,11 @@ yarn typecheck
160
182
 
161
183
  2. **Did you modify a core module entity without ejecting?**
162
184
  Never edit `node_modules/@open-mercato/*`.
163
- Fix: Revert changes to node_modules. Use UMES extensions instead, or eject the module.
185
+ Proposed fix: Revert changes to node_modules. Use UMES extensions instead, or eject the module.
164
186
 
165
187
  3. **Is a module snapshot stale?**
166
188
  Check whether the generated SQL recreates a table or column that already has a committed migration.
167
- Fix: update that module's `migrations/.snapshot-open-mercato.json` to include the already-migrated schema, then re-run `yarn db:generate` and expect `no changes`.
189
+ Proposed fix: update that module's `migrations/.snapshot-open-mercato.json` to include the already-migrated schema, then re-run `yarn db:generate` and expect `no changes`.
168
190
 
169
191
  ### Entity changes not reflected
170
192
 
@@ -443,9 +465,10 @@ yarn dev # 5. Restart dev server
443
465
 
444
466
  ## Rules
445
467
 
446
- - **ALWAYS** run `yarn generate` as first diagnostic step
468
+ - **ALWAYS** present the diagnosed root cause and the proposed fix (commands/code), then **wait for explicit user confirmation before applying any mutating change** (see [Step 4](#step-4-propose-before-fixing)). Only read-only diagnostics may run without asking.
447
469
  - **ALWAYS** check server logs / browser console for actual error messages
448
470
  - **NEVER** edit files in `.mercato/generated/` or `node_modules/`
449
471
  - **NEVER** assume the issue — verify with actual error output
472
+ - Treat `yarn generate` as the most likely first fix, but propose it before running — it regenerates files and is a mutating action
450
473
  - Fix the root cause, not the symptom — temporary workarounds become permanent bugs
451
- - When suggesting a fix, include the exact command or code change needed
474
+ - When proposing a fix, include the exact command or code change needed
@@ -0,0 +1,20 @@
1
+ function createPerJobWorkerHandler(workers, createContainer) {
2
+ return async (job, ctx) => {
3
+ const container = await createContainer();
4
+ try {
5
+ for (const worker of workers) {
6
+ await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) });
7
+ }
8
+ } finally {
9
+ try {
10
+ const em = container.resolve("em");
11
+ em?.clear?.();
12
+ } catch {
13
+ }
14
+ }
15
+ };
16
+ }
17
+ export {
18
+ createPerJobWorkerHandler
19
+ };
20
+ //# sourceMappingURL=worker-job-handler.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/worker-job-handler.ts"],
4
+ "sourcesContent": ["import type { JobContext, JobHandler } from '@open-mercato/queue'\nimport type { ModuleWorker } from '@open-mercato/shared/modules/registry'\n\nexport type WorkerJobContainer = {\n resolve: <T = unknown>(name: string) => T\n}\n\nexport type WorkerJobContainerFactory = () => Promise<WorkerJobContainer>\n\ntype ClearableEntityManager = {\n clear?: () => void\n}\n\n/**\n * Builds a queue job handler that isolates every job in its own request\n * container, instead of sharing a single process-wide `EntityManager` fork\n * across all concurrent jobs.\n *\n * Under the async (BullMQ) strategy jobs run with real concurrency, so a\n * shared EM would interleave unit-of-work flushes between unrelated jobs and\n * never release its identity map. Creating one container per job removes both\n * the cross-job flush race and the unbounded identity-map growth, while\n * keeping the `ctx.resolve` contract and DI keys unchanged. See issue #2970.\n */\nexport function createPerJobWorkerHandler(\n workers: ModuleWorker[],\n createContainer: WorkerJobContainerFactory,\n): JobHandler {\n return async (job, ctx: JobContext) => {\n const container = await createContainer()\n try {\n for (const worker of workers) {\n await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })\n }\n } finally {\n try {\n const em = container.resolve('em') as ClearableEntityManager | null\n em?.clear?.()\n } catch {\n // Best-effort: clearing the identity map is a memory optimization and\n // must never mask a job's own outcome.\n }\n }\n }\n}\n"],
5
+ "mappings": "AAwBO,SAAS,0BACd,SACA,iBACY;AACZ,SAAO,OAAO,KAAK,QAAoB;AACrC,UAAM,YAAY,MAAM,gBAAgB;AACxC,QAAI;AACF,iBAAW,UAAU,SAAS;AAC5B,cAAM,OAAO,QAAQ,KAAK,EAAE,GAAG,KAAK,SAAS,UAAU,QAAQ,KAAK,SAAS,EAAE,CAAC;AAAA,MAClF;AAAA,IACF,UAAE;AACA,UAAI;AACF,cAAM,KAAK,UAAU,QAAQ,IAAI;AACjC,YAAI,QAAQ;AAAA,MACd,QAAQ;AAAA,MAGR;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
package/dist/mercato.js CHANGED
@@ -10,6 +10,7 @@ import {
10
10
  resolveLazyRestart
11
11
  } from "./lib/auto-spawn-workers.js";
12
12
  import { startLazyWorkerSupervisor } from "./lib/queue-worker-supervisor.js";
13
+ import { createPerJobWorkerHandler } from "./lib/worker-job-handler.js";
13
14
  import {
14
15
  resolveAutoSpawnSchedulerMode,
15
16
  resolveLazySchedulerPollMs,
@@ -1225,7 +1226,6 @@ async function run(argv = process.argv) {
1225
1226
  return;
1226
1227
  }
1227
1228
  const { createRequestContainer } = await import("@open-mercato/shared/lib/di/container");
1228
- const container = await createRequestContainer();
1229
1229
  console.log(`[worker] Starting workers for all queues: ${discoveredQueues.join(", ")}`);
1230
1230
  const workerPromises = discoveredQueues.map(async (queue) => {
1231
1231
  const queueWorkers = allWorkers.filter((w) => w.queue === queue);
@@ -1237,11 +1237,7 @@ async function run(argv = process.argv) {
1237
1237
  connection: queueRedisUrl ? { url: queueRedisUrl } : void 0,
1238
1238
  concurrency,
1239
1239
  background: true,
1240
- handler: async (job, ctx) => {
1241
- for (const worker of queueWorkers) {
1242
- await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) });
1243
- }
1244
- }
1240
+ handler: createPerJobWorkerHandler(queueWorkers, createRequestContainer)
1245
1241
  });
1246
1242
  });
1247
1243
  await Promise.all(workerPromises);
@@ -1252,7 +1248,6 @@ async function run(argv = process.argv) {
1252
1248
  const queueWorkers = allWorkers.filter((w) => w.queue === queueName);
1253
1249
  if (queueWorkers.length > 0) {
1254
1250
  const { createRequestContainer } = await import("@open-mercato/shared/lib/di/container");
1255
- const container = await createRequestContainer();
1256
1251
  const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1);
1257
1252
  console.log(`[worker] Found ${queueWorkers.length} worker(s) for queue "${queueName}"`);
1258
1253
  const queueRedisUrl = getRedisUrl("QUEUE");
@@ -1260,11 +1255,7 @@ async function run(argv = process.argv) {
1260
1255
  queueName,
1261
1256
  connection: queueRedisUrl ? { url: queueRedisUrl } : void 0,
1262
1257
  concurrency,
1263
- handler: async (job, ctx) => {
1264
- for (const worker of queueWorkers) {
1265
- await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) });
1266
- }
1267
- }
1258
+ handler: createPerJobWorkerHandler(queueWorkers, createRequestContainer)
1268
1259
  });
1269
1260
  } else {
1270
1261
  console.error(`No workers found for queue "${queueName}"`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/mercato.ts"],
4
- "sourcesContent": ["// Note: Generated files and DI container are imported statically to avoid ESM/CJS interop issues.\n// Commands that need to run before generation (e.g., `init`) handle missing modules gracefully.\n\nimport { runWorker } from '@open-mercato/queue/worker'\nimport type { Module, ModuleWorker } from '@open-mercato/shared/modules/registry'\nimport { getCliModules, hasCliModules, registerCliModules } from './registry'\nexport { getCliModules, hasCliModules, registerCliModules }\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport { getSslConfig } from '@open-mercato/shared/lib/db/ssl'\nimport { getRedisUrl, getRedisUrlOrThrow } from '@open-mercato/shared/lib/redis/connection'\nimport { resolveInitDerivedSecrets } from './lib/init-secrets'\nimport {\n resolveAutoSpawnWorkersMode,\n resolveLazyPollMs,\n resolveLazyRestart,\n} from './lib/auto-spawn-workers'\nimport { startLazyWorkerSupervisor } from './lib/queue-worker-supervisor'\nimport {\n resolveAutoSpawnSchedulerMode,\n resolveLazySchedulerPollMs,\n resolveLazySchedulerRestart,\n} from './lib/auto-spawn-scheduler'\nimport { startLazySchedulerSupervisor } from './lib/scheduler-supervisor'\nimport {\n startInProcessGenerateWatcher,\n type GenerateWatcherHandle,\n} from './lib/in-process-generate-watcher'\nimport {\n resolveGenerateWatcherMode,\n type GenerateWatcherMode,\n} from './lib/in-process-generate-watcher-mode'\nimport { parseModuleInstallArgs } from './lib/module-install-args'\nimport { resolveNextBuildIdCandidate } from './lib/next-build-id'\nimport { acquireServerStartLock } from './lib/server-start-lock'\nimport { assertSingleInstanceStrategies } from './lib/single-instance-strategy-guard'\nimport { createDevEnvReloader, watchDevEnvFiles } from './lib/dev-env-reload'\n// Lazy-imported to avoid pulling in `testcontainers` (devDependency) at startup\nconst lazyIntegration = () => import('./lib/testing/integration')\nimport type { ChildProcess } from 'node:child_process'\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nlet envLoaded = false\nconst initialProcessEnvironmentEntries = Object.entries(process.env)\n\nasync function runWithCapturedExitCode(action: () => Promise<void>): Promise<number> {\n const previousExitCode = process.exitCode\n process.exitCode = undefined\n\n try {\n await action()\n return process.exitCode ?? 0\n } finally {\n process.exitCode = previousExitCode\n }\n}\n\nfunction getRegisteredCliWorkers(modules: Module[] = getCliModules()): ModuleWorker[] {\n const allWorkers: ModuleWorker[] = []\n for (const mod of modules) {\n if (mod.workers) {\n allWorkers.push(...mod.workers)\n }\n }\n return allWorkers\n}\n\nexport function padByCodePointWidth(value: string, targetWidth: number): string {\n const valueWidth = [...value].length\n if (valueWidth >= targetWidth) return value\n return `${value}${' '.repeat(targetWidth - valueWidth)}`\n}\n\ntype ErrorWithCause = {\n message?: string\n code?: string\n cause?: unknown\n errors?: unknown[]\n}\n\nconst TURBOPACK_CORRUPTION_PATTERNS = [\n 'Failed to restore task data (corrupted database or bug)',\n 'Unable to open static sorted file',\n 'TurbopackInternalError',\n]\n\nconst BUILTIN_CLI_MODULE_IDS = new Set(['queue', 'generate', 'deploy', 'db', 'server', 'test'])\n\nfunction collectNestedErrors(error: unknown, seen = new Set<unknown>()): ErrorWithCause[] {\n if (!error || seen.has(error)) {\n return []\n }\n\n seen.add(error)\n\n if (typeof error !== 'object') {\n return [{ message: String(error) }]\n }\n\n const current = error as ErrorWithCause\n const nested: ErrorWithCause[] = [current]\n\n if (Array.isArray(current.errors)) {\n for (const item of current.errors) {\n nested.push(...collectNestedErrors(item, seen))\n }\n }\n\n if (current.cause) {\n nested.push(...collectNestedErrors(current.cause, seen))\n }\n\n return nested\n}\n\nfunction getDatabaseTargetLabel(): string {\n const rawUrl = process.env.DATABASE_URL?.trim()\n if (!rawUrl) {\n return 'the database configured by DATABASE_URL'\n }\n\n try {\n const parsed = new URL(rawUrl)\n const host = parsed.hostname || 'localhost'\n const port = parsed.port || '5432'\n const database = parsed.pathname.replace(/^\\/+/, '') || '(default database)'\n return `PostgreSQL at ${host}:${port}/${database}`\n } catch {\n return 'the database configured by DATABASE_URL'\n }\n}\n\nfunction getFallbackErrorMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error)\n const nestedErrors = collectNestedErrors(error)\n\n return nestedErrors\n .map((item) => item.message?.trim() ?? '')\n .find((item) => item.length > 0)\n ?? (typeof message === 'string' && message.trim().length > 0 ? message : 'Unknown error')\n}\n\nfunction detectDatabaseConnectionIssue(\n error: unknown,\n): { target: string; reason: 'refused the connection' | 'could not be resolved' } | null {\n const nestedErrors = collectNestedErrors(error)\n const hasConnectionRefused = nestedErrors.some((item) =>\n item.code === 'ECONNREFUSED' || /ECONNREFUSED|Connection refused|connect ECONNREFUSED/i.test(item.message || ''),\n )\n const hasDnsFailure = nestedErrors.some((item) =>\n item.code === 'ENOTFOUND'\n || item.code === 'EAI_AGAIN'\n || /ENOTFOUND|EAI_AGAIN|getaddrinfo/i.test(item.message || ''),\n )\n\n if (!hasConnectionRefused && !hasDnsFailure) {\n return null\n }\n\n return {\n target: getDatabaseTargetLabel(),\n reason: hasConnectionRefused ? 'refused the connection' : 'could not be resolved',\n }\n}\n\nfunction formatCliFailureMessage(modName: string, cmdName: string, error: unknown): string {\n const fallbackMessage = getFallbackErrorMessage(error)\n const databaseIssue = detectDatabaseConnectionIssue(error)\n\n const isDatabaseCommand = modName === 'db' && ['migrate', 'generate', 'greenfield'].includes(cmdName)\n const isDatabaseBackedRuntimeCommand =\n (modName === 'queue' && ['worker', 'status', 'clear'].includes(cmdName)) ||\n (modName === 'scheduler' && ['start'].includes(cmdName)) ||\n (modName === 'configs' && ['cache'].includes(cmdName))\n\n if (isDatabaseCommand && databaseIssue) {\n return `${databaseIssue.target} is not reachable: it ${databaseIssue.reason}. Start the database service or fix DATABASE_URL in .env, then retry \\`yarn db:${cmdName}\\`.`\n }\n\n if (isDatabaseBackedRuntimeCommand && databaseIssue) {\n return `${databaseIssue.target} is not reachable: it ${databaseIssue.reason}. This command needs PostgreSQL. Start the database service or fix DATABASE_URL in .env, then retry \\`yarn mercato ${modName} ${cmdName}\\`.`\n }\n\n return fallbackMessage\n}\n\nfunction formatInitFailureMessage(error: unknown): string {\n const fallbackMessage = getFallbackErrorMessage(error)\n const databaseIssue = detectDatabaseConnectionIssue(error)\n\n if (databaseIssue) {\n return `${databaseIssue.target} is not reachable: it ${databaseIssue.reason}. Start PostgreSQL or fix DATABASE_URL in .env, then retry \\`yarn initialize\\`.`\n }\n\n return fallbackMessage\n}\n\nasync function ensureDatabaseExists(dbUrl: string): Promise<boolean> {\n let parsed: URL\n try {\n parsed = new URL(dbUrl)\n } catch {\n return true\n }\n\n const dbName = parsed.pathname.replace(/^\\/+/, '')\n if (!dbName) return true\n\n const maintenanceUrl = new URL(dbUrl)\n maintenanceUrl.pathname = '/postgres'\n\n const { Client } = await import('pg')\n const adminClient = new Client({ connectionString: maintenanceUrl.toString(), ssl: getSslConfig() })\n\n try {\n await adminClient.connect()\n\n const result = await adminClient.query('SELECT 1 FROM pg_database WHERE datname = $1', [dbName])\n if (result.rows.length > 0) return true\n\n console.log(` Database \"${dbName}\" does not exist. Attempting to create it...`)\n try {\n await adminClient.query(`CREATE DATABASE \"${dbName.replace(/\"/g, '')}\"`)\n console.log(` Database \"${dbName}\" created successfully.`)\n return true\n } catch (createError: unknown) {\n const msg = createError instanceof Error ? createError.message : String(createError)\n console.error(` Failed to create database \"${dbName}\": ${msg}`)\n console.error(``)\n console.error(` To create the database manually, connect to PostgreSQL and run:`)\n console.error(``)\n console.error(` CREATE DATABASE \"${dbName}\";`)\n console.error(``)\n console.error(` Or from the command line (as a superuser or the owner):`)\n console.error(``)\n console.error(` createdb \"${dbName}\"`)\n console.error(``)\n console.error(` On Windows with the default postgres user:`)\n console.error(``)\n console.error(` psql -U postgres -c \"CREATE DATABASE \\\\\"${dbName}\\\\\";\"`)\n return false\n }\n } catch {\n return true\n } finally {\n try { await adminClient.end() } catch {}\n }\n}\n\nfunction isTurbopackCacheCorruption(output: string): boolean {\n return TURBOPACK_CORRUPTION_PATTERNS.every((pattern) => output.includes(pattern))\n}\n\nfunction removeTurbopackDevCache(appDir: string): void {\n fs.rmSync(path.join(appDir, '.mercato', 'next', 'dev'), { recursive: true, force: true })\n}\n\nasync function ensureEnvLoaded(options: { createIfMissing?: boolean; quiet?: boolean } = {}) {\n if (envLoaded) return\n envLoaded = true\n const quietDotenv =\n options.quiet === true ||\n process.env.DOTENV_CONFIG_QUIET === '1' ||\n process.env.DOTENV_CONFIG_QUIET === 'true'\n\n // Try to find and load .env from the app directory\n // First, try to find the app directory via resolver\n try {\n const { createResolver } = await import('./lib/resolver.js')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n\n // Load .env from app directory if it exists\n const envPath = path.join(appDir, '.env')\n if (\n options.createIfMissing !== false &&\n !fs.existsSync(envPath) &&\n process.env.NODE_ENV !== 'production'\n ) {\n const examplePath = path.join(appDir, '.env.example')\n if (fs.existsSync(examplePath)) {\n fs.copyFileSync(examplePath, envPath)\n console.log(`\uD83D\uDCCB Copied .env.example \u2192 .env (edit ${envPath} to customize)`)\n }\n }\n if (fs.existsSync(envPath)) {\n const dotenv = await import('dotenv')\n dotenv.config({ path: envPath, quiet: quietDotenv })\n return\n }\n } catch {\n // Resolver might fail during early init, fall back to default behavior\n }\n\n // Fall back to default dotenv behavior (loads from cwd)\n try {\n await import('dotenv/config')\n } catch {}\n}\n\nfunction resolveInstalledBinary(baseDirs: string[], relativeBinPath: string): string {\n const checked = new Set<string>()\n for (const baseDir of baseDirs) {\n const candidate = path.join(baseDir, 'node_modules', relativeBinPath)\n checked.add(candidate)\n if (fs.existsSync(candidate)) return candidate\n }\n throw new Error(\n `Could not find installed binary \"${relativeBinPath}\". Checked: ${Array.from(checked).join(', ')}`,\n )\n}\n\nfunction buildServerProcessEnvironment(environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const runtimeEnv = { ...environment }\n runtimeEnv.NODE_ENV = 'production'\n const normalizedNodeOptions = (runtimeEnv.NODE_OPTIONS ?? '')\n .replace(/(?:^|\\s)--require=newrelic(?=\\s|$)/g, ' ')\n .replace(/(?:^|\\s)-r\\s+newrelic(?=\\s|$)/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n\n if (runtimeEnv.NEW_RELIC_LICENSE_KEY?.trim()) {\n runtimeEnv.NODE_OPTIONS = normalizedNodeOptions.length > 0\n ? `${normalizedNodeOptions} -r newrelic`\n : '-r newrelic'\n return runtimeEnv\n }\n\n if (normalizedNodeOptions.length > 0) {\n runtimeEnv.NODE_OPTIONS = normalizedNodeOptions\n } else {\n delete runtimeEnv.NODE_OPTIONS\n }\n\n return runtimeEnv\n}\n\ntype ManagedProcessExitResult = {\n label: string\n code: number | null\n signal: NodeJS.Signals | null\n}\n\ntype DevServerRestartResult = {\n label: string\n restart: true\n filePath: string\n}\n\ntype DevServerExitResult = ManagedProcessExitResult | DevServerRestartResult\n\nfunction resolveDevRuntimeBaseUrl(environment: NodeJS.ProcessEnv = process.env): string {\n const configured =\n environment.APP_URL\n ?? environment.NEXT_PUBLIC_APP_URL\n ?? environment.NEXTAUTH_URL\n if (configured?.trim()) {\n return configured.trim().replace(/\\/+$/, '')\n }\n return `http://localhost:${environment.PORT?.trim() || '3000'}`\n}\n\nfunction writeDevSplashChildState(state: Record<string, unknown>): void {\n if (process.env.OM_DEV_SPLASH_RUNTIME_WRAPPER === '1') return\n const stateFile = process.env.OM_DEV_SPLASH_CHILD_STATE_FILE\n if (!stateFile?.trim()) return\n\n try {\n fs.mkdirSync(path.dirname(stateFile), { recursive: true })\n fs.writeFileSync(stateFile, `${JSON.stringify({\n mode: process.env.OM_DEV_SPLASH_MODE || 'dev',\n failed: false,\n failureLines: [],\n failureCommand: null,\n ...state,\n }, null, 2)}\\n`)\n } catch {\n // Splash state is best-effort; terminal logs remain authoritative.\n }\n}\n\nfunction writeDevSplashRuntimeStarting(detail = 'Starting Next.js dev server'): void {\n writeDevSplashChildState({\n phase: 'Preparing app runtime',\n detail,\n ready: false,\n readyUrl: null,\n loginUrl: null,\n progressLabel: 'Launching app runtime',\n activity: detail,\n })\n}\n\nfunction resolveSplashProgressFallback(): { current: number; total: number } {\n const current = Number.parseInt(process.env.OM_DEV_SPLASH_STAGE_CURRENT ?? '', 10)\n const total = Number.parseInt(process.env.OM_DEV_SPLASH_STAGE_TOTAL ?? '', 10)\n if (Number.isFinite(current) && Number.isFinite(total) && total > 0) {\n return { current, total }\n }\n if (process.env.OM_DEV_SPLASH_MODE === 'greenfield' || process.env.OM_DEV_SPLASH_MODE === 'setup') {\n return { current: 5, total: 5 }\n }\n return { current: 3, total: 3 }\n}\n\nfunction writeDevSplashRuntimeRestarting(reason: string): void {\n const progress = resolveSplashProgressFallback()\n writeDevSplashChildState({\n phase: 'App runtime is restarting',\n detail: `Reason: ${reason}`,\n ready: false,\n readyUrl: null,\n loginUrl: null,\n progressCurrent: progress.current,\n progressTotal: progress.total,\n progressLabel: 'Restarting app runtime',\n activity: `App runtime restart: ${reason}`,\n })\n}\n\nfunction writeDevSplashRuntimeReady(reason?: string): void {\n const readyUrl = resolveDevRuntimeBaseUrl()\n const progress = resolveSplashProgressFallback()\n writeDevSplashChildState({\n phase: 'App is ready',\n detail: reason ? `Restart completed after ${reason}` : 'Next.js dev server is ready',\n ready: true,\n readyUrl,\n loginUrl: `${readyUrl}/login`,\n progressCurrent: progress.current,\n progressTotal: progress.total,\n progressPercent: 100,\n progressLabel: 'App is ready',\n activity: reason ? `Restart completed after ${reason}` : 'App runtime is ready',\n })\n}\n\nfunction resolveDevWarmupReadyTimeoutMs(environment: NodeJS.ProcessEnv = process.env): number {\n const parsed = Number.parseInt(environment.OM_DEV_WARMUP_READY_TIMEOUT_MS ?? '', 10)\n if (Number.isFinite(parsed) && parsed >= 0) return parsed\n return 300_000\n}\n\nasync function waitForDevWarmupReadyFile(\n filePath: string | undefined,\n options: {\n timeoutMs?: number\n signal?: AbortSignal\n } = {},\n): Promise<'ready' | 'timeout' | 'aborted'> {\n const normalized = filePath?.trim()\n if (!normalized) return 'ready'\n const timeoutMs = options.timeoutMs ?? resolveDevWarmupReadyTimeoutMs()\n const startedAt = Date.now()\n\n while (true) {\n if (options.signal?.aborted) return 'aborted'\n try {\n if (fs.existsSync(normalized)) return 'ready'\n } catch {\n // Keep polling; the runtime wrapper owns this best-effort marker.\n }\n if (timeoutMs >= 0 && Date.now() - startedAt >= timeoutMs) return 'timeout'\n await new Promise((resolve) => setTimeout(resolve, 250))\n }\n}\n\ntype ModuleCommandLookupResult =\n | {\n status: 'ok'\n module: Module\n command: NonNullable<Module['cli']>[number]\n }\n | {\n status: 'missing-module' | 'missing-cli' | 'missing-command'\n }\n\nfunction waitForManagedProcessExit(proc: ChildProcess, label: string): Promise<ManagedProcessExitResult> {\n return new Promise((resolve) => {\n proc.on('exit', (code, signal) => {\n resolve({ label, code, signal })\n })\n })\n}\n\nfunction isExpectedManagedExitSignal(signal: NodeJS.Signals | null): boolean {\n return signal === 'SIGINT' || signal === 'SIGTERM'\n}\n\nfunction isExpectedManagedExit(\n result: ManagedProcessExitResult,\n options: { stopping?: boolean } = {},\n): boolean {\n if (isExpectedManagedExitSignal(result.signal)) return true\n\n // Queue workers handle SIGINT/SIGTERM themselves so they can close queue\n // resources before exiting. That graceful path calls process.exit(0), which\n // reports as { code: 0, signal: null } to the supervising server process.\n return options.stopping === true && result.code === 0\n}\n\nfunction formatManagedProcessExitStatus(result: ManagedProcessExitResult): string {\n if (typeof result.code === 'number') {\n return `exit code ${result.code}`\n }\n if (result.signal) {\n return `signal ${result.signal}`\n }\n return 'an unknown status'\n}\n\nfunction createManagedProcessExitError(result: ManagedProcessExitResult): Error {\n return new Error(`[server] ${result.label} exited unexpectedly with ${formatManagedProcessExitStatus(result)}.`)\n}\n\nfunction isDevServerRestartResult(result: DevServerExitResult): result is DevServerRestartResult {\n return 'restart' in result && result.restart === true\n}\n\nfunction formatQueueWorkerLabel(queueNames: string[]): string {\n if (queueNames.length === 0) return 'Queue worker'\n const sorted = [...queueNames].sort((a, b) => a.localeCompare(b))\n const preview = sorted.length > 4 ? `${sorted.slice(0, 4).join(', ')}, +${sorted.length - 4} more` : sorted.join(', ')\n return `Queue worker (${preview})`\n}\n\nfunction lookupModuleCommand(\n allModules: Module[],\n moduleName: string,\n commandName: string,\n): ModuleCommandLookupResult {\n const mod = allModules.find((entry) => entry.id === moduleName)\n if (!mod) {\n return { status: 'missing-module' }\n }\n\n if (!mod.cli || mod.cli.length === 0) {\n return { status: 'missing-cli' }\n }\n\n const command = mod.cli.find((entry) => entry.command === commandName)\n if (!command) {\n return { status: 'missing-command' }\n }\n\n return {\n status: 'ok',\n module: mod,\n command,\n }\n}\n\nfunction describeMissingModuleCommand(result: Exclude<ModuleCommandLookupResult, { status: 'ok' }>): string {\n switch (result.status) {\n case 'missing-module':\n return 'module not enabled'\n case 'missing-cli':\n return 'module has no CLI commands'\n case 'missing-command':\n return 'command not found'\n }\n}\n\nfunction ensureNextBuildIdInConfiguredDistDir(appDir: string): void {\n const configuredDistDir = path.join(appDir, '.mercato', 'next')\n const configuredBuildIdPath = path.join(configuredDistDir, 'BUILD_ID')\n const configuredBuildId = resolveNextBuildIdCandidate(configuredDistDir)\n if (configuredBuildId) {\n if (!fs.existsSync(configuredBuildIdPath)) {\n fs.mkdirSync(path.dirname(configuredBuildIdPath), { recursive: true })\n fs.writeFileSync(configuredBuildIdPath, configuredBuildId, 'utf8')\n console.warn('[server] Reconstructed BUILD_ID inside .mercato/next from existing build artifacts.')\n }\n return\n }\n\n const fallbackDistDir = path.join(appDir, '.next')\n const fallbackBuildId = resolveNextBuildIdCandidate(fallbackDistDir)\n if (!fallbackBuildId) {\n return\n }\n\n fs.mkdirSync(path.dirname(configuredBuildIdPath), { recursive: true })\n fs.writeFileSync(configuredBuildIdPath, fallbackBuildId, 'utf8')\n console.warn(\n '[server] Recovered BUILD_ID from .next build artifacts into .mercato/next to match the configured distDir.',\n )\n}\n\nasync function handleDirectEjectCommand(args: string[]): Promise<number> {\n const { createResolver } = await import('./lib/resolver')\n const { listEjectableModules, ejectModule } = await import('./lib/eject')\n const resolver = createResolver()\n const commandArgs = args.filter(Boolean)\n const isList = commandArgs.includes('--list') || commandArgs.includes('-l')\n const moduleId = isList ? undefined : commandArgs.find((arg) => !arg.startsWith('-'))\n\n if (isList || !moduleId) {\n const ejectable = listEjectableModules(resolver)\n if (ejectable.length === 0) {\n console.log('No ejectable modules found.')\n } else {\n console.log('Ejectable modules:\\n')\n for (const mod of ejectable) {\n const desc = mod.description ? ` \u2014 ${mod.description}` : ''\n console.log(` ${mod.id} (from: ${mod.from})${desc}`)\n }\n console.log('\\nUsage: yarn mercato eject <moduleId>')\n }\n return 0\n }\n\n console.log(`Ejecting module \"${moduleId}\"...`)\n ejectModule(resolver, moduleId)\n console.log(`\\n\u2705 Module \"${moduleId}\" ejected successfully!\\n`)\n console.log('Next steps:')\n console.log(' 1. Run generators: yarn mercato generate all')\n console.log(` 2. Customize: edit src/modules/${moduleId}/`)\n console.log(' 3. Start dev: yarn dev')\n return 0\n}\n\n// Helper to run a CLI command directly (without spawning a process)\nasync function runModuleCommand(\n allModules: Module[],\n moduleName: string,\n commandName: string,\n args: string[] = [],\n options: { optional?: boolean; silentOptional?: boolean } = {},\n): Promise<boolean> {\n const resolved = lookupModuleCommand(allModules, moduleName, commandName)\n if (resolved.status !== 'ok') {\n if (options.optional) {\n if (!options.silentOptional) {\n console.log(`\u23ED\uFE0F Skipping \"${moduleName}:${commandName}\" \u2014 ${describeMissingModuleCommand(resolved)}`)\n }\n return false\n }\n switch (resolved.status) {\n case 'missing-module':\n throw new Error(`Module not found: \"${moduleName}\"`)\n case 'missing-cli':\n throw new Error(`Module \"${moduleName}\" has no CLI commands`)\n case 'missing-command':\n throw new Error(`Command \"${commandName}\" not found in module \"${moduleName}\"`)\n }\n }\n\n await resolved.command.run(args)\n return true\n}\n\nasync function runPostGenerateStructuralCachePurge(quiet: boolean): Promise<void> {\n try {\n const [{ bootstrapFromAppRoot }, { createResolver }] = await Promise.all([\n import('@open-mercato/shared/lib/bootstrap/dynamicLoader'),\n import('./lib/resolver'),\n ])\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n const data = await bootstrapFromAppRoot(appDir)\n registerCliModules(data.modules)\n const configsModule = data.modules.find((mod) => mod.id === 'configs')\n const hasCacheCommand = configsModule?.cli?.some((command) => command.command === 'cache') ?? false\n\n if (!hasCacheCommand) {\n if (!quiet) {\n console.log('[generate] Skipping structural cache purge: \"configs cache\" is not available in this app.')\n }\n return\n }\n\n if (!quiet) {\n console.log('[generate] Purging structural cache for all tenants...')\n }\n await runModuleCommand(data.modules, 'configs', 'cache', ['structural', '--all-tenants', '--quiet'], {\n optional: true,\n silentOptional: quiet,\n })\n if (!quiet) {\n console.log('[generate] Structural cache purge completed.')\n }\n } catch (error) {\n if (!quiet) {\n const message = formatCliFailureMessage('configs', 'cache', error)\n console.log(`[generate] Skipping structural cache purge: ${message}`)\n }\n }\n}\n\n/**\n * Generator suite invoked by both `mercato generate all` and the in-process\n * generate watcher embedded in `mercato server dev`. Hoisted to module scope\n * so the watcher embedded in the server lifecycle can reuse the same closure\n * without re-importing the closure-scoped version inside `buildBaseModules`.\n */\nasync function runGeneratorSuite(quiet: boolean): Promise<void> {\n const { createResolver } = await import('./lib/resolver')\n const {\n generateEntityIds,\n generateModuleRegistry,\n generateModuleRegistryApp,\n generateModuleRegistryCli,\n generateModuleEntities,\n generateModuleDi,\n generateModulePackageSources,\n generateOpenApi,\n } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet })\n await generateModuleRegistry({ resolver, quiet })\n await generateModuleRegistryApp({ resolver, quiet })\n await generateModuleRegistryCli({ resolver, quiet })\n await generateModuleEntities({ resolver, quiet })\n await generateModuleDi({ resolver, quiet })\n await generateModulePackageSources({ resolver, quiet })\n await generateOpenApi({ resolver, quiet })\n}\n\n/**\n * Builds the structural-fingerprint function used by the in-process generate\n * watcher. Walks the same module roots the legacy `mercato generate watch`\n * CLI command tracked, so the polling semantics are byte-for-byte identical.\n */\nfunction createGenerateWatchChecksumFn(): () => Promise<string> {\n return async () => {\n const { createResolver } = await import('./lib/resolver')\n const { calculateGenerateWatchStructureChecksum } = await import('./lib/generate-watch-structure')\n const resolver = createResolver()\n const moduleRoots = []\n for (const entry of resolver.loadEnabledModules()) {\n const roots = resolver.getModulePaths(entry)\n moduleRoots.push({ appBase: roots.appBase, pkgBase: roots.pkgBase })\n }\n return calculateGenerateWatchStructureChecksum({\n modulesFile: path.join(resolver.getAppDir(), 'src', 'modules.ts'),\n moduleRoots,\n })\n }\n}\n\n// Build all CLI modules (registered + built-in)\nasync function buildAllModules(): Promise<Module[]> {\n const modules = getCliModules()\n\n // Load optional app-level CLI commands\n let appCli: any[] = []\n try {\n const dynImport: any = (Function('return import') as any)()\n const app = await dynImport.then((f: any) => f('@/cli')).catch(() => null)\n if (app && Array.isArray(app?.default)) appCli = app.default\n } catch {}\n\n const all = modules.slice()\n\n if (appCli.length) all.push({ id: 'app', cli: appCli } as any)\n\n return all\n}\n\nexport async function run(argv = process.argv) {\n const [, , ...parts] = argv\n const [first, second, ...remaining] = parts\n await ensureEnvLoaded({ createIfMissing: first !== 'deploy', quiet: first === 'deploy' })\n \n // Handle init command directly\n if (first === 'init') {\n const { execSync } = await import('child_process')\n\n console.log('\uD83D\uDE80 Initializing Open Mercato app...\\n')\n\n try {\n const initArgs = parts.slice(1).filter(Boolean)\n const reinstall = initArgs.includes('--reinstall') || initArgs.includes('-r')\n process.env.OM_INIT_FLOW = 'true'\n if (reinstall) {\n process.env.OM_INIT_REINSTALL = 'true'\n } else if (process.env.OM_INIT_REINSTALL) {\n delete process.env.OM_INIT_REINSTALL\n }\n const skipExamples = initArgs.includes('--no-examples')\n const stressTestEnabled =\n initArgs.includes('--stresstest') || initArgs.includes('--stress-test')\n const stressTestLite =\n initArgs.includes('--lite') ||\n initArgs.includes('--stress-lite') ||\n initArgs.some((arg) => arg.startsWith('--payload=lite') || arg.startsWith('--mode=lite'))\n let stressTestCount = 6000\n for (let i = 0; i < initArgs.length; i += 1) {\n const arg = initArgs[i]\n const countPrefixes = ['--count=', '--stress-count=', '--stresstest-count=']\n const matchedPrefix = countPrefixes.find((prefix) => arg.startsWith(prefix))\n if (matchedPrefix) {\n const value = arg.slice(matchedPrefix.length)\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n if (arg === '--count' || arg === '--stress-count' || arg === '--stresstest-count' || arg === '-n') {\n const next = initArgs[i + 1]\n if (next && !next.startsWith('-')) {\n const parsed = Number.parseInt(next, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n }\n if (arg.startsWith('-n=')) {\n const value = arg.slice(3)\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n }\n console.log(`\uD83D\uDD04 Reinstall mode: ${reinstall ? 'enabled' : 'disabled'}`)\n console.log(`\uD83C\uDFA8 Example content: ${skipExamples ? 'skipped (--no-examples)' : 'enabled'}`)\n console.log(\n `\uD83C\uDFCB\uFE0F Stress test dataset: ${\n stressTestEnabled\n ? `enabled (target ${stressTestCount} contacts${stressTestLite ? ', lite payload' : ''})`\n : 'disabled'\n }`\n )\n\n if (reinstall) {\n // Load env variables so DATABASE_URL is available\n await ensureEnvLoaded()\n console.log('\u267B\uFE0F Reinstall mode enabled: dropping all database tables...')\n const { Client } = await import('pg')\n const dbUrl = process.env.DATABASE_URL\n if (!dbUrl) {\n console.error('DATABASE_URL is not set. Aborting reinstall.')\n return 1\n }\n const dbExists = await ensureDatabaseExists(dbUrl)\n if (!dbExists) return 1\n const client = new Client({ connectionString: dbUrl, ssl: getSslConfig() })\n try {\n await client.connect()\n // Collect all user tables in the configured schema (uses search_path from DATABASE_URL)\n const res = await client.query(`SELECT tablename FROM pg_tables WHERE schemaname = current_schema()`)\n const dropTargets = new Set<string>((res.rows || []).map((r: any) => String(r.tablename)))\n for (const forced of ['vector_search', 'vector_search_migrations']) {\n const exists = await client.query(\n `SELECT to_regclass(current_schema() || '.' || $1) AS regclass`,\n [forced],\n )\n const regclass = (exists as { rows?: Array<{ regclass: string | null }> }).rows?.[0]?.regclass ?? null\n if (regclass) {\n dropTargets.add(forced)\n }\n }\n if (dropTargets.size === 0) {\n console.log(` No tables found in current schema.`)\n } else {\n let dropped = 0\n await client.query('BEGIN')\n try {\n for (const t of dropTargets) {\n await client.query(`DROP TABLE IF EXISTS \"${t}\" CASCADE`)\n dropped += 1\n }\n await client.query('COMMIT')\n console.log(` Dropped ${dropped} tables.`)\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n }\n }\n } finally {\n try { await client.end() } catch {}\n }\n // Also flush Redis when configured. Skip silently if no URL is set \u2014\n // a stray ioredis client with auto-reconnect would otherwise spam\n // ETIMEDOUT errors for the rest of the process lifetime.\n const redisUrl = getRedisUrl()\n if (redisUrl) {\n const Redis = (await import('ioredis')).default\n const redis = new Redis(redisUrl, {\n lazyConnect: true,\n connectTimeout: 3000,\n maxRetriesPerRequest: 1,\n retryStrategy: () => null,\n enableOfflineQueue: false,\n })\n redis.on('error', () => {})\n try {\n await redis.connect()\n await redis.flushall()\n console.log(' Redis flushed.')\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.log(` Redis flush skipped (${message}).`)\n } finally {\n try { redis.disconnect() } catch {}\n }\n } else {\n console.log(' Redis flush skipped (REDIS_URL not configured).')\n }\n console.log('\u2705 Database cleared. Proceeding with fresh initialization...\\n')\n }\n\n if (!reinstall) {\n await ensureEnvLoaded()\n const dbUrl = process.env.DATABASE_URL\n if (!dbUrl) {\n console.error('DATABASE_URL is not set. Aborting initialization.')\n return 1\n }\n\n const { Client } = await import('pg')\n const dbExists = await ensureDatabaseExists(dbUrl)\n if (!dbExists) return 1\n const client = new Client({ connectionString: dbUrl, ssl: getSslConfig() })\n try {\n await client.connect()\n const tableCheck = await client.query<{ regclass: string | null }>(\n `SELECT to_regclass('public.users') AS regclass`,\n )\n const hasUsersTable = Boolean(tableCheck.rows?.[0]?.regclass)\n if (hasUsersTable) {\n const countResult = await client.query<{ count: string }>(\n 'SELECT COUNT(*)::text AS count FROM users',\n )\n const existingUsersCount = Number.parseInt(countResult.rows?.[0]?.count ?? '0', 10)\n if (Number.isFinite(existingUsersCount) && existingUsersCount > 0) {\n console.error(\n `\u274C Initialization aborted: found ${existingUsersCount} existing user(s) in the database.`,\n )\n console.error(\n ' To reset and initialize from scratch, run: yarn mercato init --reinstall',\n )\n console.error(' Standalone shortcut: yarn setup --reinstall')\n console.error(' Shortcut script: yarn reinstall')\n return 1\n }\n }\n } finally {\n try {\n await client.end()\n } catch {}\n }\n }\n\n // Step 1: Run generators directly (no process spawn)\n console.log('\uD83D\uDD27 Preparing modules (registry, entities, DI)...')\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds, generateModuleRegistry, generateModuleRegistryApp, generateModuleRegistryCli, generateModuleEntities, generateModuleDi, generateModulePackageSources, generateOpenApi } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet: true })\n await generateModuleRegistry({ resolver, quiet: true })\n await generateModuleRegistryApp({ resolver, quiet: true })\n await generateModuleRegistryCli({ resolver, quiet: true })\n await generateModuleEntities({ resolver, quiet: true })\n await generateModuleDi({ resolver, quiet: true })\n await generateModulePackageSources({ resolver, quiet: true })\n await generateOpenApi({ resolver, quiet: true })\n console.log('\u2705 Modules prepared\\n')\n\n // Step 3: Apply database migrations directly\n console.log('\uD83D\uDCCA Applying database migrations...')\n const { dbMigrate } = await import('./lib/db')\n await dbMigrate(resolver)\n console.log('\u2705 Migrations applied\\n')\n\n // Step 4: Bootstrap to register modules and entity IDs\n // Use the shared dynamicLoader which compiles TypeScript files on-the-fly\n console.log('\uD83D\uDD17 Bootstrapping application...')\n const { bootstrapFromAppRoot } = await import('@open-mercato/shared/lib/bootstrap/dynamicLoader')\n const bootstrapData = await bootstrapFromAppRoot(resolver.getAppDir())\n // Register CLI modules directly (bootstrapFromAppRoot returns the data for this purpose)\n registerCliModules(bootstrapData.modules)\n console.log('\u2705 Bootstrap complete\\n')\n\n // Step 5: Build all modules for CLI commands\n const allModules = await buildAllModules()\n\n // Step 6: Restore configuration defaults\n console.log('\u2699\uFE0F Restoring module defaults...')\n await runModuleCommand(allModules, 'configs', 'restore-defaults', [])\n console.log('\u2705 Module defaults restored\\n')\n\n // Step 7: Setup RBAC (tenant/org, users, ACLs)\n const findArgValue = (names: string[], fallback: string) => {\n for (const name of names) {\n const match = initArgs.find((arg) => arg.startsWith(name))\n if (match) {\n const value = match.slice(name.length)\n if (value) return value\n }\n }\n return fallback\n }\n const readEnvDefault = (key: string) => {\n const value = process.env[key]\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n return undefined\n }\n const defaultEmail = readEnvDefault('OM_INIT_SUPERADMIN_EMAIL') ?? 'superadmin@acme.com'\n const defaultPassword = readEnvDefault('OM_INIT_SUPERADMIN_PASSWORD') ?? 'secret'\n const orgName = findArgValue(['--org=', '--orgName='], 'Acme Corp')\n const email = findArgValue(['--email='], defaultEmail)\n const password = findArgValue(['--password='], defaultPassword)\n const derivedSecrets = resolveInitDerivedSecrets({ email, env: process.env })\n const adminEmailDerived = derivedSecrets.adminEmail\n const employeeEmailDerived = derivedSecrets.employeeEmail\n if (adminEmailDerived && derivedSecrets.adminPassword) {\n process.env.OM_INIT_ADMIN_PASSWORD = derivedSecrets.adminPassword\n }\n if (employeeEmailDerived && derivedSecrets.employeePassword) {\n process.env.OM_INIT_EMPLOYEE_PASSWORD = derivedSecrets.employeePassword\n }\n const roles = findArgValue(['--roles='], 'superadmin,admin,employee')\n const skipPasswordPolicyRaw = initArgs.find((arg) =>\n arg === '--skip-password-policy' ||\n arg.startsWith('--skip-password-policy=') ||\n arg === '--allow-weak-password' ||\n arg.startsWith('--allow-weak-password=')\n )\n const skipPasswordPolicy = skipPasswordPolicyRaw\n ? parseBooleanToken(skipPasswordPolicyRaw.split('=')[1] ?? 'true') ?? true\n : true\n\n console.log('\uD83D\uDD10 Setting up RBAC and users...')\n // Run auth setup command via CLI\n const setupArgs = [\n '--orgName', orgName,\n '--email', email,\n '--password', password,\n '--roles', roles,\n ]\n if (skipPasswordPolicy) {\n setupArgs.push('--skip-password-policy')\n }\n await runModuleCommand(allModules, 'auth', 'setup', setupArgs)\n // Query DB to get tenant/org IDs using pg directly\n const { Client } = await import('pg')\n const dbUrl = process.env.DATABASE_URL\n const pgClient = new Client({ connectionString: dbUrl, ssl: getSslConfig() })\n await pgClient.connect()\n const orgResult = await pgClient.query(\n `SELECT o.id as org_id, o.tenant_id FROM organizations o\n JOIN users u ON u.organization_id = o.id\n LIMIT 1`\n )\n await pgClient.end()\n const tenantId = orgResult?.rows?.[0]?.tenant_id ?? null\n const orgId = orgResult?.rows?.[0]?.org_id ?? null\n if (!tenantId || !orgId) {\n throw new Error('Auth setup failed to create a tenant/org. Aborting init.')\n }\n console.log('\u2705 RBAC setup complete:', { tenantId, organizationId: orgId }, '\\n')\n\n console.log('\uD83C\uDF9B\uFE0F Seeding feature toggle defaults...')\n if (await runModuleCommand(allModules, 'feature_toggles', 'seed-defaults', [], { optional: true })) {\n console.log('\uD83C\uDF9B\uFE0F \u2705 Feature toggle defaults seeded\\n')\n } else {\n console.log('')\n }\n\n if (tenantId) {\n console.log('\uD83D\uDC65 Seeding tenant-scoped roles...')\n await runModuleCommand(allModules, 'auth', 'seed-roles', ['--tenant', tenantId])\n console.log('\uD83D\uDEE1\uFE0F \u2705 Roles seeded\\n')\n } else {\n console.log('\u26A0\uFE0F Skipping role seeding because tenant ID was not available.\\n')\n }\n\n if (orgId && tenantId) {\n if (reinstall) {\n console.log('\uD83E\uDDE9 Reinstalling custom field definitions...')\n await runModuleCommand(allModules, 'entities', 'reinstall', ['--tenant', tenantId])\n console.log('\uD83E\uDDE9 \u2705 Custom field definitions reinstalled\\n')\n }\n\n const parsedEncryption = parseBooleanToken(process.env.TENANT_DATA_ENCRYPTION ?? 'yes')\n const encryptionEnabled = parsedEncryption === null ? true : parsedEncryption\n if (encryptionEnabled) {\n console.log('\uD83D\uDD12 Seeding encryption defaults...')\n await runModuleCommand(allModules, 'entities', 'seed-encryption', ['--tenant', tenantId, '--org', orgId])\n console.log('\uD83D\uDD12 \u2705 Encryption defaults seeded\\n')\n } else {\n console.log('\u26A0\uFE0F TENANT_DATA_ENCRYPTION disabled; skipping encryption defaults.\\n')\n }\n\n // Seed module defaults (structural data: dictionaries, tax rates, units, etc.)\n console.log('\uD83D\uDCDA Seeding module defaults...')\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const seedContainer = await createRequestContainer()\n const seedEm = seedContainer.resolve('em') as any\n const seedCtx = { em: seedEm, tenantId, organizationId: orgId, container: seedContainer }\n for (const mod of allModules) {\n if (mod.setup?.seedDefaults) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedDefaults(seedCtx)\n }\n }\n console.log('\u2705 Module defaults seeded\\n')\n\n // Seed ACLs for custom roles created by app modules in seedDefaults.\n // ensureDefaultRoleAcls runs before seedDefaults (in setupTenantAndPrimaryUser),\n // so custom roles don't exist yet at that point. This second pass picks them up.\n const { ensureCustomRoleAcls } = await import('@open-mercato/core/modules/auth/lib/setup-app')\n await ensureCustomRoleAcls(seedEm, tenantId, allModules)\n\n if (skipExamples) {\n console.log('\uD83D\uDEAB Example data seeding skipped (--no-examples)\\n')\n } else {\n // Seed example data (demo products, customers, orders, etc.)\n console.log('\uD83C\uDFA8 Seeding example data...')\n for (const mod of allModules) {\n if (mod.setup?.seedExamples) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedExamples(seedCtx)\n }\n }\n console.log('\u2705 Example data seeded\\n')\n }\n\n if (stressTestEnabled) {\n console.log(\n `\uD83C\uDFCB\uFE0F Seeding stress test customers${stressTestLite ? ' (lite payload)' : ''}...`\n )\n const stressArgs = ['--tenant', tenantId, '--org', orgId, '--count', String(stressTestCount)]\n if (stressTestLite) stressArgs.push('--lite')\n if (await runModuleCommand(allModules, 'customers', 'seed-stresstest', stressArgs, { optional: true })) {\n console.log(`\u2705 Stress test customers seeded (requested ${stressTestCount})\\n`)\n } else {\n console.log('')\n }\n }\n\n console.log('\uD83E\uDDE9 Enabling default dashboard widgets...')\n if (await runModuleCommand(allModules, 'dashboards', 'seed-defaults', ['--tenant', tenantId], { optional: true })) {\n console.log('\u2705 Dashboard widgets enabled\\n')\n } else {\n console.log('')\n }\n\n console.log('\uD83D\uDCCA Enabling analytics widgets for admin and employee roles...')\n if (await runModuleCommand(allModules, 'dashboards', 'enable-analytics-widgets', [\n '--tenant',\n tenantId,\n '--roles',\n 'admin,employee',\n ], { optional: true })) {\n console.log('\u2705 Analytics widgets enabled for roles\\n')\n } else {\n console.log('')\n }\n\n } else {\n console.log('\u26A0\uFE0F Could not get organization ID or tenant ID, skipping seeding steps\\n')\n }\n\n console.log('\uD83E\uDDE0 Building search indexes...')\n const vectorArgs = tenantId\n ? ['--tenant', tenantId, ...(orgId ? ['--org', orgId] : [])]\n : ['--purgeFirst=false']\n if (await runModuleCommand(allModules, 'search', 'reindex', vectorArgs, { optional: true })) {\n console.log('\u2705 Search indexes built\\n')\n } else {\n console.log('')\n }\n\n console.log('\uD83D\uDD0D Rebuilding query indexes...')\n const queryIndexArgs = ['--force', ...(tenantId ? ['--tenant', tenantId] : [])]\n if (await runModuleCommand(allModules, 'query_index', 'reindex', queryIndexArgs, { optional: true })) {\n console.log('\u2705 Query indexes rebuilt\\n')\n } else {\n console.log('')\n }\n\n const adminPasswordOverride = derivedSecrets.adminPassword\n const employeePasswordOverride = derivedSecrets.employeePassword\n const createdUsers: Array<{ label: string; icon: string; email: string }> = []\n const createdPasswords = new Map<string, string>()\n const pushUser = (label: string, icon: string, value: string | null, passwordValue: string) => {\n if (!value) return\n if (createdUsers.some((entry) => entry.email.toLowerCase() === value.toLowerCase())) return\n createdUsers.push({ label, icon, email: value })\n createdPasswords.set(value.toLowerCase(), passwordValue)\n }\n pushUser('Superadmin', '\uD83D\uDC51', email, password)\n pushUser('Admin', '\uD83E\uDDF0', adminEmailDerived, adminPasswordOverride ?? password)\n pushUser('Employee', '\uD83D\uDC77', employeeEmailDerived, employeePasswordOverride ?? password)\n // Simplified success message: we know which users were created\n console.log('\uD83C\uDF89 App initialization complete!\\n')\n console.log('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557')\n console.log('\u2551 \uD83D\uDE80 You\\'re now ready to start development! \u2551')\n console.log('\u2551 \u2551')\n console.log('\u2551 Start the dev server: \u2551')\n console.log('\u2551 yarn dev \u2551')\n console.log('\u2551 \u2551')\n console.log('\u2551 Users created: \u2551')\n for (const entry of createdUsers) {\n const label = `${entry.icon} ${entry.label}:`\n const labelPad = padByCodePointWidth(label, 13)\n const entryPassword = createdPasswords.get(entry.email.toLowerCase()) ?? password\n console.log(`\u2551 ${labelPad}${entry.email.padEnd(42)} \u2551`)\n console.log(`\u2551 Password: ${entryPassword.padEnd(44)} \u2551`)\n }\n console.log('\u2551 \u2551')\n console.log('\u2551 Happy coding! \u2551')\n console.log('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D')\n\n return 0\n } catch (error: unknown) {\n console.error('\u274C Initialization failed:', formatInitFailureMessage(error))\n return 1\n }\n }\n\n // Handle agentic:init command (bootstrap-free)\n if (first === 'agentic:init') {\n const { runAgenticInit } = await import('./lib/agentic-init')\n const exitCode = await runAgenticInit(parts.slice(1))\n return exitCode\n }\n\n if (first === 'module') {\n try {\n const subcommand = second\n const commandArgs = remaining.filter(Boolean)\n\n if (!subcommand || subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {\n console.log('Usage: yarn mercato module <add|enable|eject> ...')\n console.log(' yarn mercato module add <packageSpec> [--module <moduleId>] [--eject]')\n console.log(' yarn mercato module enable <packageName> [--module <moduleId>] [--eject]')\n console.log(' yarn mercato module eject <moduleId>')\n return 0\n }\n\n if (subcommand === 'add') {\n const { createResolver } = await import('./lib/resolver')\n const { addOfficialModule } = await import('./lib/module-install')\n const { packageSpec, eject, moduleId } = parseModuleInstallArgs(commandArgs)\n\n if (!packageSpec) {\n console.error('Usage: yarn mercato module add <packageSpec> [--module <moduleId>] [--eject]')\n return 1\n }\n\n const result = await addOfficialModule(createResolver(), packageSpec, eject, moduleId ?? undefined)\n console.log(`\\n\u2705 Module \"${result.moduleId}\" enabled from ${result.from}.\\n`)\n console.log('Next steps:')\n console.log(' 1. Review generated files if needed: .mercato/generated/')\n console.log(' 2. Start dev: yarn dev')\n return 0\n }\n\n if (subcommand === 'enable') {\n const packageName = commandArgs.find((arg) => !arg.startsWith('-'))\n if (!packageName) {\n console.error('Usage: yarn mercato module enable <packageName> [--module <moduleId>] [--eject]')\n return 1\n }\n\n const { createResolver } = await import('./lib/resolver')\n const { enableOfficialModule } = await import('./lib/module-install')\n const { moduleId, eject } = parseModuleInstallArgs(commandArgs)\n const result = await enableOfficialModule(createResolver(), packageName, moduleId ?? undefined, eject)\n console.log(`\\n\u2705 Module \"${result.moduleId}\" enabled from ${result.from}.\\n`)\n console.log('Next steps:')\n console.log(' 1. Review generated files if needed: .mercato/generated/')\n console.log(' 2. Start dev: yarn dev')\n return 0\n }\n\n if (subcommand === 'eject') {\n return handleDirectEjectCommand(commandArgs)\n }\n\n console.error(`Unknown module subcommand \"${subcommand}\".`)\n return 1\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\u274C Module command failed: ${message}`)\n return 1\n }\n }\n\n // Handle eject command directly (bootstrap-free)\n if (first === 'eject') {\n try {\n return handleDirectEjectCommand(parts.slice(1))\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\u274C Eject failed: ${message}`)\n return 1\n }\n }\n\n // Handle UMES commands (bootstrap-free)\n if (first === 'umes:list') {\n const { runUmesList } = await import('./lib/umes/list')\n await runUmesList()\n return 0\n }\n\n if (first === 'umes:inspect') {\n const moduleArg = second === '--module' ? remaining[0] : second\n if (!moduleArg) {\n console.error('Usage: yarn mercato umes:inspect --module <moduleId>')\n return 1\n }\n const { runUmesInspect } = await import('./lib/umes/inspect')\n return runWithCapturedExitCode(() => runUmesInspect(moduleArg))\n }\n\n if (first === 'umes:check') {\n const { runUmesCheck } = await import('./lib/umes/check')\n return runWithCapturedExitCode(() => runUmesCheck())\n }\n\n if (first === 'seed:defaults') {\n await ensureEnvLoaded()\n const moduleFilter = parts.includes('--module') ? parts[parts.indexOf('--module') + 1] : null\n\n try {\n const [{ bootstrapFromAppRoot }, { createResolver }] = await Promise.all([\n import('@open-mercato/shared/lib/bootstrap/dynamicLoader'),\n import('./lib/resolver'),\n ])\n const resolver = createResolver()\n const data = await bootstrapFromAppRoot(resolver.getAppDir())\n registerCliModules(data.modules)\n const allModules = data.modules\n\n const modulesToSeed = moduleFilter\n ? allModules.filter((mod) => mod.id === moduleFilter)\n : allModules\n\n if (moduleFilter && modulesToSeed.length === 0) {\n console.error(`\u274C Module \"${moduleFilter}\" not found.`)\n return 1\n }\n\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const seedContainer = await createRequestContainer()\n const seedEm = seedContainer.resolve('em') as any\n\n const { Organization } = await import('@open-mercato/core/modules/directory/data/entities')\n const orgs = await seedEm.find(Organization, { deletedAt: null }, { populate: ['tenant'] as const })\n\n if (orgs.length === 0) {\n console.error('\u274C No organizations found. Run yarn initialize first.')\n return 1\n }\n\n console.log(`\uD83D\uDCDA Running seed:defaults for ${orgs.length} org(s)...\\n`)\n for (const org of orgs) {\n const tenantId = String(org.tenant.id)\n const organizationId = String(org.id)\n const seedCtx = { em: seedEm, tenantId, organizationId, container: seedContainer }\n\n console.log(` \uD83C\uDFE2 org=${organizationId} tenant=${tenantId}`)\n for (const mod of modulesToSeed) {\n if (mod.setup?.seedDefaults) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedDefaults(seedCtx)\n }\n }\n\n const { ensureCustomRoleAcls } = await import('@open-mercato/core/modules/auth/lib/setup-app')\n await ensureCustomRoleAcls(seedEm, tenantId, allModules)\n }\n\n console.log('\\n\u2705 seed:defaults complete.')\n return 0\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\u274C seed:defaults failed: ${message}`)\n return 1\n }\n }\n\n let modName = first\n let cmdName = second\n let rest = remaining\n\n if (first === 'test:integration') {\n modName = 'test'\n cmdName = 'integration'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test:ephemeral') {\n modName = 'test'\n cmdName = 'ephemeral'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test:integration:interactive') {\n modName = 'test'\n cmdName = 'interactive'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test:integration:coverage') {\n modName = 'test'\n cmdName = 'coverage'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test:integration:spec-coverage') {\n modName = 'test'\n cmdName = 'spec-coverage'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test' && second === 'integration') {\n modName = 'test'\n cmdName = 'integration'\n rest = remaining\n }\n\n if (first === 'test' && second === 'ephemeral') {\n modName = 'test'\n cmdName = 'ephemeral'\n rest = remaining\n }\n\n if (first === 'test' && second === 'interactive') {\n modName = 'test'\n cmdName = 'interactive'\n rest = remaining\n }\n\n if (first === 'test' && second === 'coverage') {\n modName = 'test'\n cmdName = 'coverage'\n rest = remaining\n }\n\n if (first === 'test' && second === 'spec-coverage') {\n modName = 'test'\n cmdName = 'spec-coverage'\n rest = remaining\n }\n\n if (first === 'reindex') {\n modName = 'query_index'\n cmdName = 'reindex'\n rest = second !== undefined ? [second, ...remaining] : remaining\n }\n\n // Handle 'mercato generate' without subcommand - default to 'generate all'\n if (first === 'generate' && !second) {\n cmdName = 'all'\n rest = remaining\n }\n\n // Load modules from registered CLI modules\n const modules = getCliModules()\n \n // Load optional app-level CLI commands lazily without static import resolution\n let appCli: any[] = []\n if (!BUILTIN_CLI_MODULE_IDS.has(modName)) {\n try {\n const dynImport: any = (Function('return import') as any)()\n const app = await dynImport.then((f: any) => f('@/cli')).catch(() => null)\n if (app && Array.isArray(app?.default)) appCli = app.default\n } catch { /* @/cli may not exist in standalone apps \u2014 safe to ignore */ }\n }\n const all = modules.slice()\n\n all.push({\n id: 'deploy',\n cli: [\n {\n command: 'railway',\n run: async (args: string[]) => {\n const { runRailwayDeploy } = await import('./lib/deploy/railway/index')\n await runRailwayDeploy(args)\n },\n },\n ],\n } as Module)\n \n // Built-in CLI module: queue\n all.push({\n id: 'queue',\n cli: [\n {\n command: 'worker',\n run: async (args: string[]) => {\n const isAllQueues = args.includes('--all')\n const queueName = isAllQueues ? null : args[0]\n\n // Collect all discovered workers from modules\n const allWorkers = getRegisteredCliWorkers()\n const discoveredQueues = [...new Set(allWorkers.map((w) => w.queue))]\n\n if (!queueName && !isAllQueues) {\n console.error('Usage: mercato queue worker <queueName> | --all')\n console.error('Example: mercato queue worker events')\n console.error('Example: mercato queue worker --all')\n if (discoveredQueues.length > 0) {\n console.error(`Discovered queues: ${discoveredQueues.join(', ')}`)\n }\n return\n }\n\n const concurrencyArg = args.find((a) => a.startsWith('--concurrency='))\n const concurrencyOverride = concurrencyArg ? Number(concurrencyArg.split('=')[1]) : undefined\n\n if (isAllQueues) {\n // Run workers for all discovered queues\n if (discoveredQueues.length === 0) {\n console.error('[worker] No queues discovered from CLI modules.')\n console.error('[worker] Run `yarn generate` and verify `.mercato/generated/modules.cli.generated.ts` contains worker entries.')\n return\n }\n\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n console.log(`[worker] Starting workers for all queues: ${discoveredQueues.join(', ')}`)\n\n // Start all queue workers in background mode\n const workerPromises = discoveredQueues.map(async (queue) => {\n const queueWorkers = allWorkers.filter((w) => w.queue === queue)\n const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1)\n\n console.log(`[worker] Starting \"${queue}\" with ${queueWorkers.length} handler(s), concurrency: ${concurrency}`)\n\n const queueRedisUrl = getRedisUrl('QUEUE')\n await runWorker({\n queueName: queue,\n connection: queueRedisUrl ? { url: queueRedisUrl } : undefined,\n concurrency,\n background: true,\n handler: async (job, ctx) => {\n for (const worker of queueWorkers) {\n await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })\n }\n },\n })\n })\n\n await Promise.all(workerPromises)\n\n console.log('[worker] All workers started. Press Ctrl+C to stop')\n\n // Keep the process alive\n await new Promise(() => {})\n } else {\n // Find workers for this specific queue\n const queueWorkers = allWorkers.filter((w) => w.queue === queueName)\n\n if (queueWorkers.length > 0) {\n // Use discovered workers\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1)\n\n console.log(`[worker] Found ${queueWorkers.length} worker(s) for queue \"${queueName}\"`)\n\n const queueRedisUrl = getRedisUrl('QUEUE')\n await runWorker({\n queueName: queueName!,\n connection: queueRedisUrl ? { url: queueRedisUrl } : undefined,\n concurrency,\n handler: async (job, ctx) => {\n for (const worker of queueWorkers) {\n await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })\n }\n },\n })\n } else {\n console.error(`No workers found for queue \"${queueName}\"`)\n if (discoveredQueues.length > 0) {\n console.error(`Available queues: ${discoveredQueues.join(', ')}`)\n }\n }\n }\n },\n },\n {\n command: 'clear',\n run: async (args: string[]) => {\n const queueName = args[0]\n if (!queueName) {\n console.error('Usage: mercato queue clear <queueName>')\n return\n }\n\n const strategyEnv = process.env.QUEUE_STRATEGY || 'local'\n const { createQueue } = await import('@open-mercato/queue')\n\n const queue = strategyEnv === 'async'\n ? createQueue(queueName, 'async', {\n connection: { url: getRedisUrlOrThrow('QUEUE') },\n })\n : createQueue(queueName, 'local')\n\n const res = await queue.clear()\n await queue.close()\n console.log(`Cleared queue \"${queueName}\", removed ${res.removed} jobs`)\n },\n },\n {\n command: 'status',\n run: async (args: string[]) => {\n const queueName = args[0]\n if (!queueName) {\n console.error('Usage: mercato queue status <queueName>')\n return\n }\n\n const strategyEnv = process.env.QUEUE_STRATEGY || 'local'\n const { createQueue } = await import('@open-mercato/queue')\n\n const queue = strategyEnv === 'async'\n ? createQueue(queueName, 'async', {\n connection: { url: getRedisUrlOrThrow('QUEUE') },\n })\n : createQueue(queueName, 'local')\n\n const counts = await queue.getJobCounts()\n console.log(`Queue \"${queueName}\" status:`)\n console.log(` Waiting: ${counts.waiting}`)\n console.log(` Active: ${counts.active}`)\n console.log(` Completed: ${counts.completed}`)\n console.log(` Failed: ${counts.failed}`)\n await queue.close()\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: events\n all.push({\n id: 'events',\n cli: [\n {\n command: 'emit',\n run: async (args: string[]) => {\n const eventName = args[0]\n if (!eventName) {\n console.error('Usage: mercato events emit <event> [jsonPayload] [--persistent|-p]')\n return\n }\n const persistent = args.includes('--persistent') || args.includes('-p')\n const payloadArg = args[1] && !args[1].startsWith('--') ? args[1] : undefined\n let payload: any = {}\n if (payloadArg) {\n try { payload = JSON.parse(payloadArg) } catch { payload = payloadArg }\n }\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const bus = (container.resolve('eventBus') as any)\n await bus.emit(eventName, payload, { persistent })\n console.log(`Emitted \"${eventName}\"${persistent ? ' (persistent)' : ''}`)\n },\n },\n {\n command: 'clear',\n run: async () => {\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const bus = (container.resolve('eventBus') as any)\n const res = await bus.clearQueue()\n console.log(`Cleared events queue, removed ${res.removed} events`)\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: generate\n all.push({\n id: 'generate',\n cli: [\n {\n command: 'all',\n run: async (args: string[]) => {\n const quiet = args.includes('--quiet') || args.includes('-q')\n\n console.log('Running all generators...')\n await runGeneratorSuite(quiet)\n await runPostGenerateStructuralCachePurge(quiet)\n console.log('All generators completed.')\n },\n },\n {\n command: 'watch',\n run: async (args: string[]) => {\n const quiet = args.includes('--quiet') || args.includes('-q')\n const skipInitial = args.includes('--skip-initial')\n const intervalArg = args.find((arg) => arg.startsWith('--interval='))\n const parsedInterval = intervalArg ? Number.parseInt(intervalArg.split('=')[1] ?? '', 10) : NaN\n const intervalMs = Number.isFinite(parsedInterval) && parsedInterval >= 250 ? parsedInterval : 1000\n\n const watcher = startInProcessGenerateWatcher({\n pollMs: intervalMs,\n skipInitial,\n quiet,\n computeStructureChecksum: createGenerateWatchChecksumFn(),\n runGenerators: async () => {\n await runGeneratorSuite(true)\n await runPostGenerateStructuralCachePurge(true)\n },\n })\n\n const shutdownSignals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM']\n let shuttingDown = false\n const handleSignal = () => {\n if (shuttingDown) return\n shuttingDown = true\n void watcher.close()\n }\n for (const signal of shutdownSignals) {\n process.once(signal, handleSignal)\n }\n\n // The watcher's polling timer is `unref()`-ed so the event loop\n // would otherwise exit immediately for a standalone CLI invocation.\n // `keepAlive` holds the loop open until a shutdown signal calls\n // `watcher.close()`, which resolves `watcher.done`.\n const keepAlive = setInterval(() => {}, 1 << 30)\n try {\n await watcher.done\n } finally {\n clearInterval(keepAlive)\n for (const signal of shutdownSignals) {\n process.removeListener(signal, handleSignal)\n }\n }\n },\n },\n {\n command: 'entity-ids',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'registry',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModulePackageSources, generateModuleRegistry, generateModuleRegistryApp, generateModuleRegistryCli } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleRegistry({ resolver, quiet: args.includes('--quiet') })\n await generateModuleRegistryApp({ resolver, quiet: args.includes('--quiet') })\n await generateModuleRegistryCli({ resolver, quiet: args.includes('--quiet') })\n await generateModulePackageSources({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'entities',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleEntities } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleEntities({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'di',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleDi } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleDi({ resolver, quiet: args.includes('--quiet') })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: db\n all.push({\n id: 'db',\n cli: [\n {\n command: 'generate',\n run: async () => {\n const { createResolver } = await import('./lib/resolver')\n const { dbGenerate } = await import('./lib/db')\n const resolver = createResolver()\n await dbGenerate(resolver)\n },\n },\n {\n command: 'migrate',\n run: async () => {\n const { createResolver } = await import('./lib/resolver')\n const { dbMigrate } = await import('./lib/db')\n const resolver = createResolver()\n await dbMigrate(resolver)\n },\n },\n {\n command: 'greenfield',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { dbGreenfield } = await import('./lib/db')\n const resolver = createResolver()\n const yes = args.includes('--yes') || args.includes('-y')\n await dbGreenfield(resolver, { yes })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: server (runs Next.js + workers)\n all.push({\n id: 'server',\n cli: [\n {\n command: 'dev',\n run: async () => {\n const { spawn } = await import('child_process')\n const { resolveEnvironment } = await import('./lib/resolver')\n const env = resolveEnvironment()\n const appDir = env.appDir\n const nodeModulesBases = Array.from(new Set([env.rootDir, appDir]))\n\n let processes: ChildProcess[] = []\n let didRetryCorruptedTurbopackCache = false\n let stopping = false\n let devRestartPromiseResolve: ((result: DevServerRestartResult) => void) | null = null\n let activeLazySupervisor: ReturnType<typeof startLazyWorkerSupervisor> | null = null\n let activeLazySchedulerSupervisor: ReturnType<typeof startLazySchedulerSupervisor> | null = null\n let activeGenerateWatcher: GenerateWatcherHandle | null = null\n let lastRestartReason: string | null = null\n const generateWatcherMode: GenerateWatcherMode = resolveGenerateWatcherMode(process.env)\n const envReloader = createDevEnvReloader(appDir, process.env, initialProcessEnvironmentEntries)\n\n function cleanup() {\n console.log('[server] Shutting down...')\n for (const proc of processes) {\n if (!proc.killed && proc.exitCode === null && proc.signalCode === null) {\n proc.kill('SIGTERM')\n }\n }\n if (activeLazySupervisor) {\n void activeLazySupervisor.close().catch(() => undefined)\n }\n if (activeLazySchedulerSupervisor) {\n void activeLazySchedulerSupervisor.close().catch(() => undefined)\n }\n if (activeGenerateWatcher) {\n void activeGenerateWatcher.close().catch(() => undefined)\n }\n }\n\n async function cleanupAndWait() {\n cleanup()\n // Wait for all child processes to fully exit so they can release lock files\n await Promise.all(\n processes.map(\n (proc) =>\n new Promise<void>((resolve) => {\n if (proc.exitCode !== null || proc.signalCode !== null) return resolve()\n proc.on('exit', () => resolve())\n })\n )\n )\n if (activeLazySupervisor) {\n try {\n await activeLazySupervisor.close()\n } catch {\n // Supervisor close errors should not block dev runtime cleanup.\n }\n activeLazySupervisor = null\n }\n if (activeLazySchedulerSupervisor) {\n try {\n await activeLazySchedulerSupervisor.close()\n } catch {\n // Scheduler supervisor close errors should not block dev runtime cleanup.\n }\n activeLazySchedulerSupervisor = null\n }\n if (activeGenerateWatcher) {\n try {\n await activeGenerateWatcher.close()\n } catch {\n // In-process generate watcher close errors must never block dev shutdown.\n }\n activeGenerateWatcher = null\n }\n // Safety net: remove Next.js dev lock file in case the child didn't clean up\n const lockFile = path.join(appDir, '.mercato', 'next', 'dev', 'lock')\n try {\n fs.unlinkSync(lockFile)\n } catch {\n // Lock file may already be removed by Next.js \u2014 ignore\n }\n processes = []\n }\n\n process.on('SIGTERM', () => {\n stopping = true\n cleanup()\n })\n process.on('SIGINT', () => {\n stopping = true\n cleanup()\n })\n\n console.log('[server] Starting Open Mercato in dev mode...')\n\n // Ensure module-package-sources.css exists before Next.js starts\n const { createResolver: createResolverForSources } = await import('./lib/resolver')\n const { generateModulePackageSources } = await import('./lib/generators')\n await generateModulePackageSources({ resolver: createResolverForSources(), quiet: true })\n\n const nextBin = resolveInstalledBinary(nodeModulesBases, 'next/dist/bin/next')\n const mercatoBin = resolveInstalledBinary(nodeModulesBases, '@open-mercato/cli/bin/mercato')\n\n const stopEnvWatcher = watchDevEnvFiles(appDir, (filePath) => {\n devRestartPromiseResolve?.({\n label: 'Environment file change',\n restart: true,\n filePath,\n })\n })\n const waitForDevRestart = (): Promise<DevServerRestartResult> =>\n new Promise((resolve) => {\n devRestartPromiseResolve = resolve\n })\n\n const startNextDev = (runtimeEnv: NodeJS.ProcessEnv): {\n exitPromise: Promise<ManagedProcessExitResult>\n readyPromise: Promise<void>\n } => {\n let readyResolve: () => void = () => undefined\n const readyPromise = new Promise<void>((resolve) => {\n readyResolve = resolve\n })\n const exitPromise = new Promise<ManagedProcessExitResult>((resolve) => {\n writeDevSplashRuntimeStarting(\n lastRestartReason\n ? `Restarting Next.js dev server. Reason: ${lastRestartReason}`\n : 'Starting Next.js dev server',\n )\n const nextProcess = spawn('node', [nextBin, 'dev', '--turbopack'], {\n stdio: ['inherit', 'pipe', 'pipe'],\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(nextProcess)\n\n let combinedOutput = ''\n let reportedReady = false\n const appendOutput = (chunk: string) => {\n combinedOutput += chunk\n if (combinedOutput.length > 32_768) {\n combinedOutput = combinedOutput.slice(-32_768)\n }\n if (!reportedReady && /\\bready in\\b/i.test(chunk)) {\n reportedReady = true\n writeDevSplashRuntimeReady(lastRestartReason ?? undefined)\n lastRestartReason = null\n readyResolve()\n }\n }\n\n nextProcess.stdout?.on('data', (chunk: Buffer | string) => {\n const text = typeof chunk === 'string' ? chunk : chunk.toString()\n process.stdout.write(text)\n appendOutput(text)\n })\n nextProcess.stderr?.on('data', (chunk: Buffer | string) => {\n const text = typeof chunk === 'string' ? chunk : chunk.toString()\n process.stderr.write(text)\n appendOutput(text)\n })\n\n nextProcess.on('exit', async (code, signal) => {\n if (!didRetryCorruptedTurbopackCache && isTurbopackCacheCorruption(combinedOutput)) {\n didRetryCorruptedTurbopackCache = true\n lastRestartReason = 'corrupted Turbopack dev cache'\n writeDevSplashRuntimeRestarting(lastRestartReason)\n console.log('[server] Detected corrupted Turbopack dev cache. Clearing .mercato/next/dev and restarting Next.js once...')\n removeTurbopackDevCache(appDir)\n const restarted = startNextDev(runtimeEnv)\n restarted.readyPromise.then(readyResolve)\n return resolve(await restarted.exitPromise)\n }\n resolve({\n label: 'Next.js dev server',\n code,\n signal,\n })\n })\n })\n return { exitPromise, readyPromise }\n }\n\n try {\n while (!stopping) {\n envReloader.reload()\n const runtimeEnv = buildServerProcessEnvironment(process.env)\n const autoSpawnWorkersMode = resolveAutoSpawnWorkersMode(process.env)\n const autoSpawnSchedulerMode = resolveAutoSpawnSchedulerMode(process.env)\n const queueStrategy = process.env.QUEUE_STRATEGY || 'local'\n const schedulerCommand = lookupModuleCommand(getCliModules(), 'scheduler', 'start')\n const nextRuntime = startNextDev(runtimeEnv)\n const restartPromise = waitForDevRestart()\n const backgroundStartAbort = new AbortController()\n const cancelBackgroundStart = () => backgroundStartAbort.abort()\n nextRuntime.exitPromise.finally(cancelBackgroundStart)\n restartPromise.then(cancelBackgroundStart)\n let backgroundExitResolve: (result: ManagedProcessExitResult) => void = () => undefined\n const backgroundExitPromise = new Promise<ManagedProcessExitResult>((resolve) => {\n backgroundExitResolve = resolve\n })\n const managedExitPromises: Promise<DevServerExitResult>[] = [\n nextRuntime.exitPromise,\n restartPromise,\n backgroundExitPromise,\n ]\n\n const startBackgroundServices = async () => {\n if (stopping || backgroundStartAbort.signal.aborted) return\n\n // Keep first-route compilation responsive: greenfield setup can\n // leave vector/fulltext jobs ready. When the dev wrapper is\n // active, wait for its /login + /backend warmup marker before\n // workers and scheduler begin consuming CPU and database I/O.\n const warmupReady = await waitForDevWarmupReadyFile(process.env.OM_DEV_WARMUP_READY_FILE, {\n timeoutMs: resolveDevWarmupReadyTimeoutMs(process.env),\n signal: backgroundStartAbort.signal,\n })\n if (warmupReady === 'aborted' || stopping || backgroundStartAbort.signal.aborted) return\n if (warmupReady === 'timeout') {\n console.warn('[server] Timed out waiting for dev warmup marker; starting background services anyway.')\n }\n\n if (autoSpawnWorkersMode !== 'off') {\n const discoveredWorkers = getRegisteredCliWorkers()\n const discoveredWorkerQueues = [...new Set(discoveredWorkers.map((worker) => worker.queue))]\n if (discoveredWorkerQueues.length === 0) {\n console.error('[server] AUTO_SPAWN_WORKERS is enabled, but no queues were discovered from CLI modules. Run `yarn generate` and verify `.mercato/generated/modules.cli.generated.ts` contains worker entries. Continuing without auto-spawned workers.')\n } else if (autoSpawnWorkersMode === 'lazy') {\n console.log(`[server] Lazy worker auto-spawn enabled \u2014 workers will start on first job (${discoveredWorkerQueues.length} queue(s) watched).`)\n activeLazySupervisor = startLazyWorkerSupervisor({\n mercatoBin,\n appDir,\n runtimeEnv,\n workers: discoveredWorkers,\n pollMs: resolveLazyPollMs(process.env),\n restartOnUnexpectedExit: resolveLazyRestart(process.env),\n })\n } else {\n console.log('[server] Eager worker auto-spawn enabled - starting workers for all queues...')\n const workerProcess = spawn('node', [mercatoBin, 'queue', 'worker', '--all'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(workerProcess)\n waitForManagedProcessExit(workerProcess, formatQueueWorkerLabel(discoveredWorkerQueues)).then(backgroundExitResolve)\n }\n }\n\n if (autoSpawnSchedulerMode !== 'off' && queueStrategy === 'local') {\n if (schedulerCommand.status !== 'ok') {\n console.log(`[server] Skipping scheduler auto-start \u2014 ${describeMissingModuleCommand(schedulerCommand)}`)\n } else if (autoSpawnSchedulerMode === 'lazy') {\n console.log('[server] Lazy scheduler auto-spawn enabled - scheduler will start when an enabled schedule exists.')\n activeLazySchedulerSupervisor = startLazySchedulerSupervisor({\n mercatoBin,\n appDir,\n runtimeEnv,\n pollMs: resolveLazySchedulerPollMs(process.env),\n restartOnUnexpectedExit: resolveLazySchedulerRestart(process.env),\n })\n } else {\n console.log('[server] Eager scheduler auto-spawn enabled - starting scheduler polling engine...')\n const schedulerProcess = spawn('node', [mercatoBin, 'scheduler', 'start'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(schedulerProcess)\n waitForManagedProcessExit(schedulerProcess, 'Scheduler polling engine').then(backgroundExitResolve)\n }\n }\n }\n nextRuntime.readyPromise.then(() => {\n void startBackgroundServices()\n })\n\n if (generateWatcherMode === 'in-process') {\n // Run the structural regeneration watcher inside this process\n // instead of spawning a dedicated `mercato generate watch --skip-initial`\n // sidecar. Saves ~190 MB of resident RSS on a typical dev box\n // (measured against the legacy sidecar). Opt back into the\n // sidecar with `OM_DEV_GENERATE_WATCH_MODE=legacy` if needed.\n console.log('[server] In-process generate watcher enabled \u2014 structural changes will regenerate without a sidecar process.')\n activeGenerateWatcher = startInProcessGenerateWatcher({\n // `--skip-initial` equivalent: `yarn dev` always runs an\n // initial `mercato generate` before reaching the server\n // command, so the watcher must not re-run generators at\n // boot time. Otherwise dev startup pays a generator pass\n // twice in a row.\n skipInitial: true,\n quiet: false,\n computeStructureChecksum: createGenerateWatchChecksumFn(),\n runGenerators: async () => {\n await runGeneratorSuite(true)\n await runPostGenerateStructuralCachePurge(true)\n },\n })\n } else {\n console.log('[server] Legacy out-of-process generate watcher selected via OM_DEV_GENERATE_WATCH_MODE=legacy \u2014 expect the dev orchestrator to spawn `mercato generate watch --skip-initial`.')\n }\n\n const firstExit = await Promise.race(managedExitPromises)\n if (isDevServerRestartResult(firstExit)) {\n lastRestartReason = `${firstExit.label.toLowerCase()} (${path.basename(firstExit.filePath)})`\n writeDevSplashRuntimeRestarting(lastRestartReason)\n }\n await cleanupAndWait()\n devRestartPromiseResolve = null\n\n if (isDevServerRestartResult(firstExit)) {\n console.log(`[server] Detected ${firstExit.label.toLowerCase()} (${path.basename(firstExit.filePath)}). Restarting app runtime...`)\n continue\n }\n\n if (!isExpectedManagedExit(firstExit, { stopping })) {\n throw createManagedProcessExitError(firstExit)\n }\n\n stopping = true\n }\n } finally {\n stopEnvWatcher()\n }\n },\n },\n {\n command: 'start',\n run: async () => {\n const { spawn } = await import('child_process')\n const { resolveEnvironment } = await import('./lib/resolver')\n const env = resolveEnvironment()\n const appDir = env.appDir\n const nodeModulesBases = Array.from(new Set([env.rootDir, appDir]))\n\n const processes: ChildProcess[] = []\n const autoSpawnWorkersMode = resolveAutoSpawnWorkersMode(process.env)\n const autoSpawnSchedulerMode = resolveAutoSpawnSchedulerMode(process.env)\n const queueStrategy = process.env.QUEUE_STRATEGY || 'local'\n const runtimeEnv = buildServerProcessEnvironment(process.env)\n // Throws on single-instance strategies under a multi-instance topology,\n // aborting before the start lock is acquired or any process is spawned.\n assertSingleInstanceStrategies(runtimeEnv)\n const schedulerCommand = lookupModuleCommand(getCliModules(), 'scheduler', 'start')\n const serverStartLock = acquireServerStartLock(appDir, {\n port: runtimeEnv.PORT ?? process.env.PORT ?? null,\n })\n let activeLazySupervisor: ReturnType<typeof startLazyWorkerSupervisor> | null = null\n let activeLazySchedulerSupervisor: ReturnType<typeof startLazySchedulerSupervisor> | null = null\n let stopping = false\n\n function cleanup() {\n console.log('[server] Shutting down...')\n for (const proc of processes) {\n if (!proc.killed && proc.exitCode === null && proc.signalCode === null) {\n proc.kill('SIGTERM')\n }\n }\n if (activeLazySupervisor) {\n void activeLazySupervisor.close().catch(() => undefined)\n }\n if (activeLazySchedulerSupervisor) {\n void activeLazySchedulerSupervisor.close().catch(() => undefined)\n }\n }\n\n async function cleanupAndWait() {\n cleanup()\n await Promise.all(\n processes.map(\n (proc) =>\n new Promise<void>((resolve) => {\n if (proc.exitCode !== null || proc.signalCode !== null) return resolve()\n proc.on('exit', () => resolve())\n })\n )\n )\n if (activeLazySupervisor) {\n try {\n await activeLazySupervisor.close()\n } catch {\n // Supervisor close errors should not block server shutdown.\n }\n activeLazySupervisor = null\n }\n if (activeLazySchedulerSupervisor) {\n try {\n await activeLazySchedulerSupervisor.close()\n } catch {\n // Scheduler supervisor close errors should not block server shutdown.\n }\n activeLazySchedulerSupervisor = null\n }\n }\n\n process.on('SIGTERM', () => {\n stopping = true\n cleanup()\n })\n process.on('SIGINT', () => {\n stopping = true\n cleanup()\n })\n\n console.log('[server] Starting Open Mercato in production mode...')\n\n const nextBin = resolveInstalledBinary(nodeModulesBases, 'next/dist/bin/next')\n const mercatoBin = resolveInstalledBinary(nodeModulesBases, '@open-mercato/cli/bin/mercato')\n ensureNextBuildIdInConfiguredDistDir(appDir)\n\n try {\n // Start Next.js production server\n const nextProcess = spawn('node', [nextBin, 'start'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(nextProcess)\n const managedExitPromises: Promise<ManagedProcessExitResult>[] = [\n waitForManagedProcessExit(nextProcess, 'Next.js production server'),\n ]\n\n // Start workers if enabled\n if (autoSpawnWorkersMode !== 'off') {\n const discoveredWorkers = getRegisteredCliWorkers()\n const discoveredWorkerQueues = [...new Set(discoveredWorkers.map((worker) => worker.queue))]\n if (discoveredWorkerQueues.length === 0) {\n console.error('[server] AUTO_SPAWN_WORKERS is enabled, but no queues were discovered from CLI modules. Run `yarn generate` and verify `.mercato/generated/modules.cli.generated.ts` contains worker entries. Continuing without auto-spawned workers.')\n } else if (autoSpawnWorkersMode === 'lazy') {\n console.log(`[server] Lazy worker auto-spawn enabled \u2014 workers will start on first job (${discoveredWorkerQueues.length} queue(s) watched).`)\n activeLazySupervisor = startLazyWorkerSupervisor({\n mercatoBin,\n appDir,\n runtimeEnv,\n workers: discoveredWorkers,\n pollMs: resolveLazyPollMs(process.env),\n restartOnUnexpectedExit: resolveLazyRestart(process.env),\n })\n } else {\n console.log('[server] Eager worker auto-spawn enabled - starting workers for all queues...')\n const workerProcess = spawn('node', [mercatoBin, 'queue', 'worker', '--all'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(workerProcess)\n managedExitPromises.push(waitForManagedProcessExit(workerProcess, formatQueueWorkerLabel(discoveredWorkerQueues)))\n }\n }\n\n if (autoSpawnSchedulerMode !== 'off' && queueStrategy === 'local') {\n if (schedulerCommand.status !== 'ok') {\n console.log(`[server] Skipping scheduler auto-start \u2014 ${describeMissingModuleCommand(schedulerCommand)}`)\n } else if (autoSpawnSchedulerMode === 'lazy') {\n console.log('[server] Lazy scheduler auto-spawn enabled - scheduler will start when an enabled schedule exists.')\n activeLazySchedulerSupervisor = startLazySchedulerSupervisor({\n mercatoBin,\n appDir,\n runtimeEnv,\n pollMs: resolveLazySchedulerPollMs(process.env),\n restartOnUnexpectedExit: resolveLazySchedulerRestart(process.env),\n })\n } else {\n console.log('[server] Eager scheduler auto-spawn enabled - starting scheduler polling engine...')\n const schedulerProcess = spawn('node', [mercatoBin, 'scheduler', 'start'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(schedulerProcess)\n managedExitPromises.push(waitForManagedProcessExit(schedulerProcess, 'Scheduler polling engine'))\n }\n }\n\n const firstExit = await Promise.race(managedExitPromises)\n\n await cleanupAndWait()\n\n if (!isExpectedManagedExit(firstExit, { stopping })) {\n throw createManagedProcessExitError(firstExit)\n }\n } finally {\n serverStartLock.release()\n }\n },\n },\n ],\n } as any)\n\n all.push({\n id: 'test',\n cli: [\n {\n command: 'integration',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runIntegrationTestsInEphemeralEnvironment(args)\n },\n },\n {\n command: 'ephemeral',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runEphemeralAppForQa(args)\n },\n },\n {\n command: 'interactive',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runInteractiveIntegrationInEphemeralEnvironment(args)\n },\n },\n {\n command: 'coverage',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runIntegrationCoverageReport(args)\n },\n },\n {\n command: 'spec-coverage',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runIntegrationSpecCoverageReport(args)\n },\n },\n ],\n } as any)\n\n if (appCli.length) all.push({ id: 'app', cli: appCli } as any)\n\n const quietBanner = process.env.OM_CLI_QUIET === '1'\n const banner = '\uD83E\uDDE9 Open Mercato CLI'\n if (!quietBanner) {\n const header = [\n '\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557',\n `\u2551 ${banner.padEnd(21)}\u2551`,\n '\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D',\n ].join('\\n')\n console.log(header)\n }\n const pad = (s: string) => ` ${s}`\n\n if (!modName || modName === 'help' || modName === '--help' || modName === '-h') {\n console.log(pad('Usage: \u2728 mercato <module> <command> [args]'))\n const list = all\n .filter((m) => m.cli && m.cli.length)\n .map((m) => `\u2022 ${m.id}: ${m.cli!.map((c) => `\"${c.command}\"`).join(', ')}`)\n if (list.length) {\n console.log('\\n' + pad('Available:'))\n console.log(list.map(pad).join('\\n'))\n } else {\n console.log(pad('\uD83C\uDF00 No CLI commands available'))\n }\n return 0\n }\n\n const mod = all.find((m) => m.id === modName)\n if (!mod) {\n console.error(`\u274C Module not found: \"${modName}\"`)\n return 1\n }\n if (!mod.cli || mod.cli.length === 0) {\n console.error(`\uD83D\uDEAB Module \"${modName}\" has no CLI commands`)\n return 1\n }\n if (!cmdName) {\n console.log(pad(`Commands for \"${modName}\": ${mod.cli.map((c) => c.command).join(', ')}`))\n return 1\n }\n const cmd = mod.cli.find((c) => c.command === cmdName)\n if (!cmd) {\n console.error(`\uD83E\uDD14 Unknown command \"${cmdName}\". Available: ${mod.cli.map((c) => c.command).join(', ')}`)\n return 1\n }\n\n console.log('')\n const started = Date.now()\n const loggedArgs = modName === 'deploy' && cmdName === 'railway'\n ? (await import('./lib/deploy/railway/options')).redactRailwayCliArgs(rest)\n : rest\n console.log(`\uD83D\uDE80 Running ${modName}:${cmdName} ${loggedArgs.join(' ')}`)\n try {\n await cmd.run(rest)\n if (modName !== 'deploy' || cmdName !== 'railway') {\n const ms = Date.now() - started\n console.log(`\u23F1\uFE0F Done in ${ms}ms`)\n }\n return 0\n } catch (e: any) {\n console.error(`\uD83D\uDCA5 Failed: ${formatCliFailureMessage(modName, cmdName, e)}`)\n return 1\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Note: Generated files and DI container are imported statically to avoid ESM/CJS interop issues.\n// Commands that need to run before generation (e.g., `init`) handle missing modules gracefully.\n\nimport { runWorker } from '@open-mercato/queue/worker'\nimport type { Module, ModuleWorker } from '@open-mercato/shared/modules/registry'\nimport { getCliModules, hasCliModules, registerCliModules } from './registry'\nexport { getCliModules, hasCliModules, registerCliModules }\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport { getSslConfig } from '@open-mercato/shared/lib/db/ssl'\nimport { getRedisUrl, getRedisUrlOrThrow } from '@open-mercato/shared/lib/redis/connection'\nimport { resolveInitDerivedSecrets } from './lib/init-secrets'\nimport {\n resolveAutoSpawnWorkersMode,\n resolveLazyPollMs,\n resolveLazyRestart,\n} from './lib/auto-spawn-workers'\nimport { startLazyWorkerSupervisor } from './lib/queue-worker-supervisor'\nimport { createPerJobWorkerHandler } from './lib/worker-job-handler'\nimport {\n resolveAutoSpawnSchedulerMode,\n resolveLazySchedulerPollMs,\n resolveLazySchedulerRestart,\n} from './lib/auto-spawn-scheduler'\nimport { startLazySchedulerSupervisor } from './lib/scheduler-supervisor'\nimport {\n startInProcessGenerateWatcher,\n type GenerateWatcherHandle,\n} from './lib/in-process-generate-watcher'\nimport {\n resolveGenerateWatcherMode,\n type GenerateWatcherMode,\n} from './lib/in-process-generate-watcher-mode'\nimport { parseModuleInstallArgs } from './lib/module-install-args'\nimport { resolveNextBuildIdCandidate } from './lib/next-build-id'\nimport { acquireServerStartLock } from './lib/server-start-lock'\nimport { assertSingleInstanceStrategies } from './lib/single-instance-strategy-guard'\nimport { createDevEnvReloader, watchDevEnvFiles } from './lib/dev-env-reload'\n// Lazy-imported to avoid pulling in `testcontainers` (devDependency) at startup\nconst lazyIntegration = () => import('./lib/testing/integration')\nimport type { ChildProcess } from 'node:child_process'\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nlet envLoaded = false\nconst initialProcessEnvironmentEntries = Object.entries(process.env)\n\nasync function runWithCapturedExitCode(action: () => Promise<void>): Promise<number> {\n const previousExitCode = process.exitCode\n process.exitCode = undefined\n\n try {\n await action()\n return process.exitCode ?? 0\n } finally {\n process.exitCode = previousExitCode\n }\n}\n\nfunction getRegisteredCliWorkers(modules: Module[] = getCliModules()): ModuleWorker[] {\n const allWorkers: ModuleWorker[] = []\n for (const mod of modules) {\n if (mod.workers) {\n allWorkers.push(...mod.workers)\n }\n }\n return allWorkers\n}\n\nexport function padByCodePointWidth(value: string, targetWidth: number): string {\n const valueWidth = [...value].length\n if (valueWidth >= targetWidth) return value\n return `${value}${' '.repeat(targetWidth - valueWidth)}`\n}\n\ntype ErrorWithCause = {\n message?: string\n code?: string\n cause?: unknown\n errors?: unknown[]\n}\n\nconst TURBOPACK_CORRUPTION_PATTERNS = [\n 'Failed to restore task data (corrupted database or bug)',\n 'Unable to open static sorted file',\n 'TurbopackInternalError',\n]\n\nconst BUILTIN_CLI_MODULE_IDS = new Set(['queue', 'generate', 'deploy', 'db', 'server', 'test'])\n\nfunction collectNestedErrors(error: unknown, seen = new Set<unknown>()): ErrorWithCause[] {\n if (!error || seen.has(error)) {\n return []\n }\n\n seen.add(error)\n\n if (typeof error !== 'object') {\n return [{ message: String(error) }]\n }\n\n const current = error as ErrorWithCause\n const nested: ErrorWithCause[] = [current]\n\n if (Array.isArray(current.errors)) {\n for (const item of current.errors) {\n nested.push(...collectNestedErrors(item, seen))\n }\n }\n\n if (current.cause) {\n nested.push(...collectNestedErrors(current.cause, seen))\n }\n\n return nested\n}\n\nfunction getDatabaseTargetLabel(): string {\n const rawUrl = process.env.DATABASE_URL?.trim()\n if (!rawUrl) {\n return 'the database configured by DATABASE_URL'\n }\n\n try {\n const parsed = new URL(rawUrl)\n const host = parsed.hostname || 'localhost'\n const port = parsed.port || '5432'\n const database = parsed.pathname.replace(/^\\/+/, '') || '(default database)'\n return `PostgreSQL at ${host}:${port}/${database}`\n } catch {\n return 'the database configured by DATABASE_URL'\n }\n}\n\nfunction getFallbackErrorMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error)\n const nestedErrors = collectNestedErrors(error)\n\n return nestedErrors\n .map((item) => item.message?.trim() ?? '')\n .find((item) => item.length > 0)\n ?? (typeof message === 'string' && message.trim().length > 0 ? message : 'Unknown error')\n}\n\nfunction detectDatabaseConnectionIssue(\n error: unknown,\n): { target: string; reason: 'refused the connection' | 'could not be resolved' } | null {\n const nestedErrors = collectNestedErrors(error)\n const hasConnectionRefused = nestedErrors.some((item) =>\n item.code === 'ECONNREFUSED' || /ECONNREFUSED|Connection refused|connect ECONNREFUSED/i.test(item.message || ''),\n )\n const hasDnsFailure = nestedErrors.some((item) =>\n item.code === 'ENOTFOUND'\n || item.code === 'EAI_AGAIN'\n || /ENOTFOUND|EAI_AGAIN|getaddrinfo/i.test(item.message || ''),\n )\n\n if (!hasConnectionRefused && !hasDnsFailure) {\n return null\n }\n\n return {\n target: getDatabaseTargetLabel(),\n reason: hasConnectionRefused ? 'refused the connection' : 'could not be resolved',\n }\n}\n\nfunction formatCliFailureMessage(modName: string, cmdName: string, error: unknown): string {\n const fallbackMessage = getFallbackErrorMessage(error)\n const databaseIssue = detectDatabaseConnectionIssue(error)\n\n const isDatabaseCommand = modName === 'db' && ['migrate', 'generate', 'greenfield'].includes(cmdName)\n const isDatabaseBackedRuntimeCommand =\n (modName === 'queue' && ['worker', 'status', 'clear'].includes(cmdName)) ||\n (modName === 'scheduler' && ['start'].includes(cmdName)) ||\n (modName === 'configs' && ['cache'].includes(cmdName))\n\n if (isDatabaseCommand && databaseIssue) {\n return `${databaseIssue.target} is not reachable: it ${databaseIssue.reason}. Start the database service or fix DATABASE_URL in .env, then retry \\`yarn db:${cmdName}\\`.`\n }\n\n if (isDatabaseBackedRuntimeCommand && databaseIssue) {\n return `${databaseIssue.target} is not reachable: it ${databaseIssue.reason}. This command needs PostgreSQL. Start the database service or fix DATABASE_URL in .env, then retry \\`yarn mercato ${modName} ${cmdName}\\`.`\n }\n\n return fallbackMessage\n}\n\nfunction formatInitFailureMessage(error: unknown): string {\n const fallbackMessage = getFallbackErrorMessage(error)\n const databaseIssue = detectDatabaseConnectionIssue(error)\n\n if (databaseIssue) {\n return `${databaseIssue.target} is not reachable: it ${databaseIssue.reason}. Start PostgreSQL or fix DATABASE_URL in .env, then retry \\`yarn initialize\\`.`\n }\n\n return fallbackMessage\n}\n\nasync function ensureDatabaseExists(dbUrl: string): Promise<boolean> {\n let parsed: URL\n try {\n parsed = new URL(dbUrl)\n } catch {\n return true\n }\n\n const dbName = parsed.pathname.replace(/^\\/+/, '')\n if (!dbName) return true\n\n const maintenanceUrl = new URL(dbUrl)\n maintenanceUrl.pathname = '/postgres'\n\n const { Client } = await import('pg')\n const adminClient = new Client({ connectionString: maintenanceUrl.toString(), ssl: getSslConfig() })\n\n try {\n await adminClient.connect()\n\n const result = await adminClient.query('SELECT 1 FROM pg_database WHERE datname = $1', [dbName])\n if (result.rows.length > 0) return true\n\n console.log(` Database \"${dbName}\" does not exist. Attempting to create it...`)\n try {\n await adminClient.query(`CREATE DATABASE \"${dbName.replace(/\"/g, '')}\"`)\n console.log(` Database \"${dbName}\" created successfully.`)\n return true\n } catch (createError: unknown) {\n const msg = createError instanceof Error ? createError.message : String(createError)\n console.error(` Failed to create database \"${dbName}\": ${msg}`)\n console.error(``)\n console.error(` To create the database manually, connect to PostgreSQL and run:`)\n console.error(``)\n console.error(` CREATE DATABASE \"${dbName}\";`)\n console.error(``)\n console.error(` Or from the command line (as a superuser or the owner):`)\n console.error(``)\n console.error(` createdb \"${dbName}\"`)\n console.error(``)\n console.error(` On Windows with the default postgres user:`)\n console.error(``)\n console.error(` psql -U postgres -c \"CREATE DATABASE \\\\\"${dbName}\\\\\";\"`)\n return false\n }\n } catch {\n return true\n } finally {\n try { await adminClient.end() } catch {}\n }\n}\n\nfunction isTurbopackCacheCorruption(output: string): boolean {\n return TURBOPACK_CORRUPTION_PATTERNS.every((pattern) => output.includes(pattern))\n}\n\nfunction removeTurbopackDevCache(appDir: string): void {\n fs.rmSync(path.join(appDir, '.mercato', 'next', 'dev'), { recursive: true, force: true })\n}\n\nasync function ensureEnvLoaded(options: { createIfMissing?: boolean; quiet?: boolean } = {}) {\n if (envLoaded) return\n envLoaded = true\n const quietDotenv =\n options.quiet === true ||\n process.env.DOTENV_CONFIG_QUIET === '1' ||\n process.env.DOTENV_CONFIG_QUIET === 'true'\n\n // Try to find and load .env from the app directory\n // First, try to find the app directory via resolver\n try {\n const { createResolver } = await import('./lib/resolver.js')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n\n // Load .env from app directory if it exists\n const envPath = path.join(appDir, '.env')\n if (\n options.createIfMissing !== false &&\n !fs.existsSync(envPath) &&\n process.env.NODE_ENV !== 'production'\n ) {\n const examplePath = path.join(appDir, '.env.example')\n if (fs.existsSync(examplePath)) {\n fs.copyFileSync(examplePath, envPath)\n console.log(`\uD83D\uDCCB Copied .env.example \u2192 .env (edit ${envPath} to customize)`)\n }\n }\n if (fs.existsSync(envPath)) {\n const dotenv = await import('dotenv')\n dotenv.config({ path: envPath, quiet: quietDotenv })\n return\n }\n } catch {\n // Resolver might fail during early init, fall back to default behavior\n }\n\n // Fall back to default dotenv behavior (loads from cwd)\n try {\n await import('dotenv/config')\n } catch {}\n}\n\nfunction resolveInstalledBinary(baseDirs: string[], relativeBinPath: string): string {\n const checked = new Set<string>()\n for (const baseDir of baseDirs) {\n const candidate = path.join(baseDir, 'node_modules', relativeBinPath)\n checked.add(candidate)\n if (fs.existsSync(candidate)) return candidate\n }\n throw new Error(\n `Could not find installed binary \"${relativeBinPath}\". Checked: ${Array.from(checked).join(', ')}`,\n )\n}\n\nfunction buildServerProcessEnvironment(environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const runtimeEnv = { ...environment }\n runtimeEnv.NODE_ENV = 'production'\n const normalizedNodeOptions = (runtimeEnv.NODE_OPTIONS ?? '')\n .replace(/(?:^|\\s)--require=newrelic(?=\\s|$)/g, ' ')\n .replace(/(?:^|\\s)-r\\s+newrelic(?=\\s|$)/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n\n if (runtimeEnv.NEW_RELIC_LICENSE_KEY?.trim()) {\n runtimeEnv.NODE_OPTIONS = normalizedNodeOptions.length > 0\n ? `${normalizedNodeOptions} -r newrelic`\n : '-r newrelic'\n return runtimeEnv\n }\n\n if (normalizedNodeOptions.length > 0) {\n runtimeEnv.NODE_OPTIONS = normalizedNodeOptions\n } else {\n delete runtimeEnv.NODE_OPTIONS\n }\n\n return runtimeEnv\n}\n\ntype ManagedProcessExitResult = {\n label: string\n code: number | null\n signal: NodeJS.Signals | null\n}\n\ntype DevServerRestartResult = {\n label: string\n restart: true\n filePath: string\n}\n\ntype DevServerExitResult = ManagedProcessExitResult | DevServerRestartResult\n\nfunction resolveDevRuntimeBaseUrl(environment: NodeJS.ProcessEnv = process.env): string {\n const configured =\n environment.APP_URL\n ?? environment.NEXT_PUBLIC_APP_URL\n ?? environment.NEXTAUTH_URL\n if (configured?.trim()) {\n return configured.trim().replace(/\\/+$/, '')\n }\n return `http://localhost:${environment.PORT?.trim() || '3000'}`\n}\n\nfunction writeDevSplashChildState(state: Record<string, unknown>): void {\n if (process.env.OM_DEV_SPLASH_RUNTIME_WRAPPER === '1') return\n const stateFile = process.env.OM_DEV_SPLASH_CHILD_STATE_FILE\n if (!stateFile?.trim()) return\n\n try {\n fs.mkdirSync(path.dirname(stateFile), { recursive: true })\n fs.writeFileSync(stateFile, `${JSON.stringify({\n mode: process.env.OM_DEV_SPLASH_MODE || 'dev',\n failed: false,\n failureLines: [],\n failureCommand: null,\n ...state,\n }, null, 2)}\\n`)\n } catch {\n // Splash state is best-effort; terminal logs remain authoritative.\n }\n}\n\nfunction writeDevSplashRuntimeStarting(detail = 'Starting Next.js dev server'): void {\n writeDevSplashChildState({\n phase: 'Preparing app runtime',\n detail,\n ready: false,\n readyUrl: null,\n loginUrl: null,\n progressLabel: 'Launching app runtime',\n activity: detail,\n })\n}\n\nfunction resolveSplashProgressFallback(): { current: number; total: number } {\n const current = Number.parseInt(process.env.OM_DEV_SPLASH_STAGE_CURRENT ?? '', 10)\n const total = Number.parseInt(process.env.OM_DEV_SPLASH_STAGE_TOTAL ?? '', 10)\n if (Number.isFinite(current) && Number.isFinite(total) && total > 0) {\n return { current, total }\n }\n if (process.env.OM_DEV_SPLASH_MODE === 'greenfield' || process.env.OM_DEV_SPLASH_MODE === 'setup') {\n return { current: 5, total: 5 }\n }\n return { current: 3, total: 3 }\n}\n\nfunction writeDevSplashRuntimeRestarting(reason: string): void {\n const progress = resolveSplashProgressFallback()\n writeDevSplashChildState({\n phase: 'App runtime is restarting',\n detail: `Reason: ${reason}`,\n ready: false,\n readyUrl: null,\n loginUrl: null,\n progressCurrent: progress.current,\n progressTotal: progress.total,\n progressLabel: 'Restarting app runtime',\n activity: `App runtime restart: ${reason}`,\n })\n}\n\nfunction writeDevSplashRuntimeReady(reason?: string): void {\n const readyUrl = resolveDevRuntimeBaseUrl()\n const progress = resolveSplashProgressFallback()\n writeDevSplashChildState({\n phase: 'App is ready',\n detail: reason ? `Restart completed after ${reason}` : 'Next.js dev server is ready',\n ready: true,\n readyUrl,\n loginUrl: `${readyUrl}/login`,\n progressCurrent: progress.current,\n progressTotal: progress.total,\n progressPercent: 100,\n progressLabel: 'App is ready',\n activity: reason ? `Restart completed after ${reason}` : 'App runtime is ready',\n })\n}\n\nfunction resolveDevWarmupReadyTimeoutMs(environment: NodeJS.ProcessEnv = process.env): number {\n const parsed = Number.parseInt(environment.OM_DEV_WARMUP_READY_TIMEOUT_MS ?? '', 10)\n if (Number.isFinite(parsed) && parsed >= 0) return parsed\n return 300_000\n}\n\nasync function waitForDevWarmupReadyFile(\n filePath: string | undefined,\n options: {\n timeoutMs?: number\n signal?: AbortSignal\n } = {},\n): Promise<'ready' | 'timeout' | 'aborted'> {\n const normalized = filePath?.trim()\n if (!normalized) return 'ready'\n const timeoutMs = options.timeoutMs ?? resolveDevWarmupReadyTimeoutMs()\n const startedAt = Date.now()\n\n while (true) {\n if (options.signal?.aborted) return 'aborted'\n try {\n if (fs.existsSync(normalized)) return 'ready'\n } catch {\n // Keep polling; the runtime wrapper owns this best-effort marker.\n }\n if (timeoutMs >= 0 && Date.now() - startedAt >= timeoutMs) return 'timeout'\n await new Promise((resolve) => setTimeout(resolve, 250))\n }\n}\n\ntype ModuleCommandLookupResult =\n | {\n status: 'ok'\n module: Module\n command: NonNullable<Module['cli']>[number]\n }\n | {\n status: 'missing-module' | 'missing-cli' | 'missing-command'\n }\n\nfunction waitForManagedProcessExit(proc: ChildProcess, label: string): Promise<ManagedProcessExitResult> {\n return new Promise((resolve) => {\n proc.on('exit', (code, signal) => {\n resolve({ label, code, signal })\n })\n })\n}\n\nfunction isExpectedManagedExitSignal(signal: NodeJS.Signals | null): boolean {\n return signal === 'SIGINT' || signal === 'SIGTERM'\n}\n\nfunction isExpectedManagedExit(\n result: ManagedProcessExitResult,\n options: { stopping?: boolean } = {},\n): boolean {\n if (isExpectedManagedExitSignal(result.signal)) return true\n\n // Queue workers handle SIGINT/SIGTERM themselves so they can close queue\n // resources before exiting. That graceful path calls process.exit(0), which\n // reports as { code: 0, signal: null } to the supervising server process.\n return options.stopping === true && result.code === 0\n}\n\nfunction formatManagedProcessExitStatus(result: ManagedProcessExitResult): string {\n if (typeof result.code === 'number') {\n return `exit code ${result.code}`\n }\n if (result.signal) {\n return `signal ${result.signal}`\n }\n return 'an unknown status'\n}\n\nfunction createManagedProcessExitError(result: ManagedProcessExitResult): Error {\n return new Error(`[server] ${result.label} exited unexpectedly with ${formatManagedProcessExitStatus(result)}.`)\n}\n\nfunction isDevServerRestartResult(result: DevServerExitResult): result is DevServerRestartResult {\n return 'restart' in result && result.restart === true\n}\n\nfunction formatQueueWorkerLabel(queueNames: string[]): string {\n if (queueNames.length === 0) return 'Queue worker'\n const sorted = [...queueNames].sort((a, b) => a.localeCompare(b))\n const preview = sorted.length > 4 ? `${sorted.slice(0, 4).join(', ')}, +${sorted.length - 4} more` : sorted.join(', ')\n return `Queue worker (${preview})`\n}\n\nfunction lookupModuleCommand(\n allModules: Module[],\n moduleName: string,\n commandName: string,\n): ModuleCommandLookupResult {\n const mod = allModules.find((entry) => entry.id === moduleName)\n if (!mod) {\n return { status: 'missing-module' }\n }\n\n if (!mod.cli || mod.cli.length === 0) {\n return { status: 'missing-cli' }\n }\n\n const command = mod.cli.find((entry) => entry.command === commandName)\n if (!command) {\n return { status: 'missing-command' }\n }\n\n return {\n status: 'ok',\n module: mod,\n command,\n }\n}\n\nfunction describeMissingModuleCommand(result: Exclude<ModuleCommandLookupResult, { status: 'ok' }>): string {\n switch (result.status) {\n case 'missing-module':\n return 'module not enabled'\n case 'missing-cli':\n return 'module has no CLI commands'\n case 'missing-command':\n return 'command not found'\n }\n}\n\nfunction ensureNextBuildIdInConfiguredDistDir(appDir: string): void {\n const configuredDistDir = path.join(appDir, '.mercato', 'next')\n const configuredBuildIdPath = path.join(configuredDistDir, 'BUILD_ID')\n const configuredBuildId = resolveNextBuildIdCandidate(configuredDistDir)\n if (configuredBuildId) {\n if (!fs.existsSync(configuredBuildIdPath)) {\n fs.mkdirSync(path.dirname(configuredBuildIdPath), { recursive: true })\n fs.writeFileSync(configuredBuildIdPath, configuredBuildId, 'utf8')\n console.warn('[server] Reconstructed BUILD_ID inside .mercato/next from existing build artifacts.')\n }\n return\n }\n\n const fallbackDistDir = path.join(appDir, '.next')\n const fallbackBuildId = resolveNextBuildIdCandidate(fallbackDistDir)\n if (!fallbackBuildId) {\n return\n }\n\n fs.mkdirSync(path.dirname(configuredBuildIdPath), { recursive: true })\n fs.writeFileSync(configuredBuildIdPath, fallbackBuildId, 'utf8')\n console.warn(\n '[server] Recovered BUILD_ID from .next build artifacts into .mercato/next to match the configured distDir.',\n )\n}\n\nasync function handleDirectEjectCommand(args: string[]): Promise<number> {\n const { createResolver } = await import('./lib/resolver')\n const { listEjectableModules, ejectModule } = await import('./lib/eject')\n const resolver = createResolver()\n const commandArgs = args.filter(Boolean)\n const isList = commandArgs.includes('--list') || commandArgs.includes('-l')\n const moduleId = isList ? undefined : commandArgs.find((arg) => !arg.startsWith('-'))\n\n if (isList || !moduleId) {\n const ejectable = listEjectableModules(resolver)\n if (ejectable.length === 0) {\n console.log('No ejectable modules found.')\n } else {\n console.log('Ejectable modules:\\n')\n for (const mod of ejectable) {\n const desc = mod.description ? ` \u2014 ${mod.description}` : ''\n console.log(` ${mod.id} (from: ${mod.from})${desc}`)\n }\n console.log('\\nUsage: yarn mercato eject <moduleId>')\n }\n return 0\n }\n\n console.log(`Ejecting module \"${moduleId}\"...`)\n ejectModule(resolver, moduleId)\n console.log(`\\n\u2705 Module \"${moduleId}\" ejected successfully!\\n`)\n console.log('Next steps:')\n console.log(' 1. Run generators: yarn mercato generate all')\n console.log(` 2. Customize: edit src/modules/${moduleId}/`)\n console.log(' 3. Start dev: yarn dev')\n return 0\n}\n\n// Helper to run a CLI command directly (without spawning a process)\nasync function runModuleCommand(\n allModules: Module[],\n moduleName: string,\n commandName: string,\n args: string[] = [],\n options: { optional?: boolean; silentOptional?: boolean } = {},\n): Promise<boolean> {\n const resolved = lookupModuleCommand(allModules, moduleName, commandName)\n if (resolved.status !== 'ok') {\n if (options.optional) {\n if (!options.silentOptional) {\n console.log(`\u23ED\uFE0F Skipping \"${moduleName}:${commandName}\" \u2014 ${describeMissingModuleCommand(resolved)}`)\n }\n return false\n }\n switch (resolved.status) {\n case 'missing-module':\n throw new Error(`Module not found: \"${moduleName}\"`)\n case 'missing-cli':\n throw new Error(`Module \"${moduleName}\" has no CLI commands`)\n case 'missing-command':\n throw new Error(`Command \"${commandName}\" not found in module \"${moduleName}\"`)\n }\n }\n\n await resolved.command.run(args)\n return true\n}\n\nasync function runPostGenerateStructuralCachePurge(quiet: boolean): Promise<void> {\n try {\n const [{ bootstrapFromAppRoot }, { createResolver }] = await Promise.all([\n import('@open-mercato/shared/lib/bootstrap/dynamicLoader'),\n import('./lib/resolver'),\n ])\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n const data = await bootstrapFromAppRoot(appDir)\n registerCliModules(data.modules)\n const configsModule = data.modules.find((mod) => mod.id === 'configs')\n const hasCacheCommand = configsModule?.cli?.some((command) => command.command === 'cache') ?? false\n\n if (!hasCacheCommand) {\n if (!quiet) {\n console.log('[generate] Skipping structural cache purge: \"configs cache\" is not available in this app.')\n }\n return\n }\n\n if (!quiet) {\n console.log('[generate] Purging structural cache for all tenants...')\n }\n await runModuleCommand(data.modules, 'configs', 'cache', ['structural', '--all-tenants', '--quiet'], {\n optional: true,\n silentOptional: quiet,\n })\n if (!quiet) {\n console.log('[generate] Structural cache purge completed.')\n }\n } catch (error) {\n if (!quiet) {\n const message = formatCliFailureMessage('configs', 'cache', error)\n console.log(`[generate] Skipping structural cache purge: ${message}`)\n }\n }\n}\n\n/**\n * Generator suite invoked by both `mercato generate all` and the in-process\n * generate watcher embedded in `mercato server dev`. Hoisted to module scope\n * so the watcher embedded in the server lifecycle can reuse the same closure\n * without re-importing the closure-scoped version inside `buildBaseModules`.\n */\nasync function runGeneratorSuite(quiet: boolean): Promise<void> {\n const { createResolver } = await import('./lib/resolver')\n const {\n generateEntityIds,\n generateModuleRegistry,\n generateModuleRegistryApp,\n generateModuleRegistryCli,\n generateModuleEntities,\n generateModuleDi,\n generateModulePackageSources,\n generateOpenApi,\n } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet })\n await generateModuleRegistry({ resolver, quiet })\n await generateModuleRegistryApp({ resolver, quiet })\n await generateModuleRegistryCli({ resolver, quiet })\n await generateModuleEntities({ resolver, quiet })\n await generateModuleDi({ resolver, quiet })\n await generateModulePackageSources({ resolver, quiet })\n await generateOpenApi({ resolver, quiet })\n}\n\n/**\n * Builds the structural-fingerprint function used by the in-process generate\n * watcher. Walks the same module roots the legacy `mercato generate watch`\n * CLI command tracked, so the polling semantics are byte-for-byte identical.\n */\nfunction createGenerateWatchChecksumFn(): () => Promise<string> {\n return async () => {\n const { createResolver } = await import('./lib/resolver')\n const { calculateGenerateWatchStructureChecksum } = await import('./lib/generate-watch-structure')\n const resolver = createResolver()\n const moduleRoots = []\n for (const entry of resolver.loadEnabledModules()) {\n const roots = resolver.getModulePaths(entry)\n moduleRoots.push({ appBase: roots.appBase, pkgBase: roots.pkgBase })\n }\n return calculateGenerateWatchStructureChecksum({\n modulesFile: path.join(resolver.getAppDir(), 'src', 'modules.ts'),\n moduleRoots,\n })\n }\n}\n\n// Build all CLI modules (registered + built-in)\nasync function buildAllModules(): Promise<Module[]> {\n const modules = getCliModules()\n\n // Load optional app-level CLI commands\n let appCli: any[] = []\n try {\n const dynImport: any = (Function('return import') as any)()\n const app = await dynImport.then((f: any) => f('@/cli')).catch(() => null)\n if (app && Array.isArray(app?.default)) appCli = app.default\n } catch {}\n\n const all = modules.slice()\n\n if (appCli.length) all.push({ id: 'app', cli: appCli } as any)\n\n return all\n}\n\nexport async function run(argv = process.argv) {\n const [, , ...parts] = argv\n const [first, second, ...remaining] = parts\n await ensureEnvLoaded({ createIfMissing: first !== 'deploy', quiet: first === 'deploy' })\n \n // Handle init command directly\n if (first === 'init') {\n const { execSync } = await import('child_process')\n\n console.log('\uD83D\uDE80 Initializing Open Mercato app...\\n')\n\n try {\n const initArgs = parts.slice(1).filter(Boolean)\n const reinstall = initArgs.includes('--reinstall') || initArgs.includes('-r')\n process.env.OM_INIT_FLOW = 'true'\n if (reinstall) {\n process.env.OM_INIT_REINSTALL = 'true'\n } else if (process.env.OM_INIT_REINSTALL) {\n delete process.env.OM_INIT_REINSTALL\n }\n const skipExamples = initArgs.includes('--no-examples')\n const stressTestEnabled =\n initArgs.includes('--stresstest') || initArgs.includes('--stress-test')\n const stressTestLite =\n initArgs.includes('--lite') ||\n initArgs.includes('--stress-lite') ||\n initArgs.some((arg) => arg.startsWith('--payload=lite') || arg.startsWith('--mode=lite'))\n let stressTestCount = 6000\n for (let i = 0; i < initArgs.length; i += 1) {\n const arg = initArgs[i]\n const countPrefixes = ['--count=', '--stress-count=', '--stresstest-count=']\n const matchedPrefix = countPrefixes.find((prefix) => arg.startsWith(prefix))\n if (matchedPrefix) {\n const value = arg.slice(matchedPrefix.length)\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n if (arg === '--count' || arg === '--stress-count' || arg === '--stresstest-count' || arg === '-n') {\n const next = initArgs[i + 1]\n if (next && !next.startsWith('-')) {\n const parsed = Number.parseInt(next, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n }\n if (arg.startsWith('-n=')) {\n const value = arg.slice(3)\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n }\n console.log(`\uD83D\uDD04 Reinstall mode: ${reinstall ? 'enabled' : 'disabled'}`)\n console.log(`\uD83C\uDFA8 Example content: ${skipExamples ? 'skipped (--no-examples)' : 'enabled'}`)\n console.log(\n `\uD83C\uDFCB\uFE0F Stress test dataset: ${\n stressTestEnabled\n ? `enabled (target ${stressTestCount} contacts${stressTestLite ? ', lite payload' : ''})`\n : 'disabled'\n }`\n )\n\n if (reinstall) {\n // Load env variables so DATABASE_URL is available\n await ensureEnvLoaded()\n console.log('\u267B\uFE0F Reinstall mode enabled: dropping all database tables...')\n const { Client } = await import('pg')\n const dbUrl = process.env.DATABASE_URL\n if (!dbUrl) {\n console.error('DATABASE_URL is not set. Aborting reinstall.')\n return 1\n }\n const dbExists = await ensureDatabaseExists(dbUrl)\n if (!dbExists) return 1\n const client = new Client({ connectionString: dbUrl, ssl: getSslConfig() })\n try {\n await client.connect()\n // Collect all user tables in the configured schema (uses search_path from DATABASE_URL)\n const res = await client.query(`SELECT tablename FROM pg_tables WHERE schemaname = current_schema()`)\n const dropTargets = new Set<string>((res.rows || []).map((r: any) => String(r.tablename)))\n for (const forced of ['vector_search', 'vector_search_migrations']) {\n const exists = await client.query(\n `SELECT to_regclass(current_schema() || '.' || $1) AS regclass`,\n [forced],\n )\n const regclass = (exists as { rows?: Array<{ regclass: string | null }> }).rows?.[0]?.regclass ?? null\n if (regclass) {\n dropTargets.add(forced)\n }\n }\n if (dropTargets.size === 0) {\n console.log(` No tables found in current schema.`)\n } else {\n let dropped = 0\n await client.query('BEGIN')\n try {\n for (const t of dropTargets) {\n await client.query(`DROP TABLE IF EXISTS \"${t}\" CASCADE`)\n dropped += 1\n }\n await client.query('COMMIT')\n console.log(` Dropped ${dropped} tables.`)\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n }\n }\n } finally {\n try { await client.end() } catch {}\n }\n // Also flush Redis when configured. Skip silently if no URL is set \u2014\n // a stray ioredis client with auto-reconnect would otherwise spam\n // ETIMEDOUT errors for the rest of the process lifetime.\n const redisUrl = getRedisUrl()\n if (redisUrl) {\n const Redis = (await import('ioredis')).default\n const redis = new Redis(redisUrl, {\n lazyConnect: true,\n connectTimeout: 3000,\n maxRetriesPerRequest: 1,\n retryStrategy: () => null,\n enableOfflineQueue: false,\n })\n redis.on('error', () => {})\n try {\n await redis.connect()\n await redis.flushall()\n console.log(' Redis flushed.')\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.log(` Redis flush skipped (${message}).`)\n } finally {\n try { redis.disconnect() } catch {}\n }\n } else {\n console.log(' Redis flush skipped (REDIS_URL not configured).')\n }\n console.log('\u2705 Database cleared. Proceeding with fresh initialization...\\n')\n }\n\n if (!reinstall) {\n await ensureEnvLoaded()\n const dbUrl = process.env.DATABASE_URL\n if (!dbUrl) {\n console.error('DATABASE_URL is not set. Aborting initialization.')\n return 1\n }\n\n const { Client } = await import('pg')\n const dbExists = await ensureDatabaseExists(dbUrl)\n if (!dbExists) return 1\n const client = new Client({ connectionString: dbUrl, ssl: getSslConfig() })\n try {\n await client.connect()\n const tableCheck = await client.query<{ regclass: string | null }>(\n `SELECT to_regclass('public.users') AS regclass`,\n )\n const hasUsersTable = Boolean(tableCheck.rows?.[0]?.regclass)\n if (hasUsersTable) {\n const countResult = await client.query<{ count: string }>(\n 'SELECT COUNT(*)::text AS count FROM users',\n )\n const existingUsersCount = Number.parseInt(countResult.rows?.[0]?.count ?? '0', 10)\n if (Number.isFinite(existingUsersCount) && existingUsersCount > 0) {\n console.error(\n `\u274C Initialization aborted: found ${existingUsersCount} existing user(s) in the database.`,\n )\n console.error(\n ' To reset and initialize from scratch, run: yarn mercato init --reinstall',\n )\n console.error(' Standalone shortcut: yarn setup --reinstall')\n console.error(' Shortcut script: yarn reinstall')\n return 1\n }\n }\n } finally {\n try {\n await client.end()\n } catch {}\n }\n }\n\n // Step 1: Run generators directly (no process spawn)\n console.log('\uD83D\uDD27 Preparing modules (registry, entities, DI)...')\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds, generateModuleRegistry, generateModuleRegistryApp, generateModuleRegistryCli, generateModuleEntities, generateModuleDi, generateModulePackageSources, generateOpenApi } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet: true })\n await generateModuleRegistry({ resolver, quiet: true })\n await generateModuleRegistryApp({ resolver, quiet: true })\n await generateModuleRegistryCli({ resolver, quiet: true })\n await generateModuleEntities({ resolver, quiet: true })\n await generateModuleDi({ resolver, quiet: true })\n await generateModulePackageSources({ resolver, quiet: true })\n await generateOpenApi({ resolver, quiet: true })\n console.log('\u2705 Modules prepared\\n')\n\n // Step 3: Apply database migrations directly\n console.log('\uD83D\uDCCA Applying database migrations...')\n const { dbMigrate } = await import('./lib/db')\n await dbMigrate(resolver)\n console.log('\u2705 Migrations applied\\n')\n\n // Step 4: Bootstrap to register modules and entity IDs\n // Use the shared dynamicLoader which compiles TypeScript files on-the-fly\n console.log('\uD83D\uDD17 Bootstrapping application...')\n const { bootstrapFromAppRoot } = await import('@open-mercato/shared/lib/bootstrap/dynamicLoader')\n const bootstrapData = await bootstrapFromAppRoot(resolver.getAppDir())\n // Register CLI modules directly (bootstrapFromAppRoot returns the data for this purpose)\n registerCliModules(bootstrapData.modules)\n console.log('\u2705 Bootstrap complete\\n')\n\n // Step 5: Build all modules for CLI commands\n const allModules = await buildAllModules()\n\n // Step 6: Restore configuration defaults\n console.log('\u2699\uFE0F Restoring module defaults...')\n await runModuleCommand(allModules, 'configs', 'restore-defaults', [])\n console.log('\u2705 Module defaults restored\\n')\n\n // Step 7: Setup RBAC (tenant/org, users, ACLs)\n const findArgValue = (names: string[], fallback: string) => {\n for (const name of names) {\n const match = initArgs.find((arg) => arg.startsWith(name))\n if (match) {\n const value = match.slice(name.length)\n if (value) return value\n }\n }\n return fallback\n }\n const readEnvDefault = (key: string) => {\n const value = process.env[key]\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n return undefined\n }\n const defaultEmail = readEnvDefault('OM_INIT_SUPERADMIN_EMAIL') ?? 'superadmin@acme.com'\n const defaultPassword = readEnvDefault('OM_INIT_SUPERADMIN_PASSWORD') ?? 'secret'\n const orgName = findArgValue(['--org=', '--orgName='], 'Acme Corp')\n const email = findArgValue(['--email='], defaultEmail)\n const password = findArgValue(['--password='], defaultPassword)\n const derivedSecrets = resolveInitDerivedSecrets({ email, env: process.env })\n const adminEmailDerived = derivedSecrets.adminEmail\n const employeeEmailDerived = derivedSecrets.employeeEmail\n if (adminEmailDerived && derivedSecrets.adminPassword) {\n process.env.OM_INIT_ADMIN_PASSWORD = derivedSecrets.adminPassword\n }\n if (employeeEmailDerived && derivedSecrets.employeePassword) {\n process.env.OM_INIT_EMPLOYEE_PASSWORD = derivedSecrets.employeePassword\n }\n const roles = findArgValue(['--roles='], 'superadmin,admin,employee')\n const skipPasswordPolicyRaw = initArgs.find((arg) =>\n arg === '--skip-password-policy' ||\n arg.startsWith('--skip-password-policy=') ||\n arg === '--allow-weak-password' ||\n arg.startsWith('--allow-weak-password=')\n )\n const skipPasswordPolicy = skipPasswordPolicyRaw\n ? parseBooleanToken(skipPasswordPolicyRaw.split('=')[1] ?? 'true') ?? true\n : true\n\n console.log('\uD83D\uDD10 Setting up RBAC and users...')\n // Run auth setup command via CLI\n const setupArgs = [\n '--orgName', orgName,\n '--email', email,\n '--password', password,\n '--roles', roles,\n ]\n if (skipPasswordPolicy) {\n setupArgs.push('--skip-password-policy')\n }\n await runModuleCommand(allModules, 'auth', 'setup', setupArgs)\n // Query DB to get tenant/org IDs using pg directly\n const { Client } = await import('pg')\n const dbUrl = process.env.DATABASE_URL\n const pgClient = new Client({ connectionString: dbUrl, ssl: getSslConfig() })\n await pgClient.connect()\n const orgResult = await pgClient.query(\n `SELECT o.id as org_id, o.tenant_id FROM organizations o\n JOIN users u ON u.organization_id = o.id\n LIMIT 1`\n )\n await pgClient.end()\n const tenantId = orgResult?.rows?.[0]?.tenant_id ?? null\n const orgId = orgResult?.rows?.[0]?.org_id ?? null\n if (!tenantId || !orgId) {\n throw new Error('Auth setup failed to create a tenant/org. Aborting init.')\n }\n console.log('\u2705 RBAC setup complete:', { tenantId, organizationId: orgId }, '\\n')\n\n console.log('\uD83C\uDF9B\uFE0F Seeding feature toggle defaults...')\n if (await runModuleCommand(allModules, 'feature_toggles', 'seed-defaults', [], { optional: true })) {\n console.log('\uD83C\uDF9B\uFE0F \u2705 Feature toggle defaults seeded\\n')\n } else {\n console.log('')\n }\n\n if (tenantId) {\n console.log('\uD83D\uDC65 Seeding tenant-scoped roles...')\n await runModuleCommand(allModules, 'auth', 'seed-roles', ['--tenant', tenantId])\n console.log('\uD83D\uDEE1\uFE0F \u2705 Roles seeded\\n')\n } else {\n console.log('\u26A0\uFE0F Skipping role seeding because tenant ID was not available.\\n')\n }\n\n if (orgId && tenantId) {\n if (reinstall) {\n console.log('\uD83E\uDDE9 Reinstalling custom field definitions...')\n await runModuleCommand(allModules, 'entities', 'reinstall', ['--tenant', tenantId])\n console.log('\uD83E\uDDE9 \u2705 Custom field definitions reinstalled\\n')\n }\n\n const parsedEncryption = parseBooleanToken(process.env.TENANT_DATA_ENCRYPTION ?? 'yes')\n const encryptionEnabled = parsedEncryption === null ? true : parsedEncryption\n if (encryptionEnabled) {\n console.log('\uD83D\uDD12 Seeding encryption defaults...')\n await runModuleCommand(allModules, 'entities', 'seed-encryption', ['--tenant', tenantId, '--org', orgId])\n console.log('\uD83D\uDD12 \u2705 Encryption defaults seeded\\n')\n } else {\n console.log('\u26A0\uFE0F TENANT_DATA_ENCRYPTION disabled; skipping encryption defaults.\\n')\n }\n\n // Seed module defaults (structural data: dictionaries, tax rates, units, etc.)\n console.log('\uD83D\uDCDA Seeding module defaults...')\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const seedContainer = await createRequestContainer()\n const seedEm = seedContainer.resolve('em') as any\n const seedCtx = { em: seedEm, tenantId, organizationId: orgId, container: seedContainer }\n for (const mod of allModules) {\n if (mod.setup?.seedDefaults) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedDefaults(seedCtx)\n }\n }\n console.log('\u2705 Module defaults seeded\\n')\n\n // Seed ACLs for custom roles created by app modules in seedDefaults.\n // ensureDefaultRoleAcls runs before seedDefaults (in setupTenantAndPrimaryUser),\n // so custom roles don't exist yet at that point. This second pass picks them up.\n const { ensureCustomRoleAcls } = await import('@open-mercato/core/modules/auth/lib/setup-app')\n await ensureCustomRoleAcls(seedEm, tenantId, allModules)\n\n if (skipExamples) {\n console.log('\uD83D\uDEAB Example data seeding skipped (--no-examples)\\n')\n } else {\n // Seed example data (demo products, customers, orders, etc.)\n console.log('\uD83C\uDFA8 Seeding example data...')\n for (const mod of allModules) {\n if (mod.setup?.seedExamples) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedExamples(seedCtx)\n }\n }\n console.log('\u2705 Example data seeded\\n')\n }\n\n if (stressTestEnabled) {\n console.log(\n `\uD83C\uDFCB\uFE0F Seeding stress test customers${stressTestLite ? ' (lite payload)' : ''}...`\n )\n const stressArgs = ['--tenant', tenantId, '--org', orgId, '--count', String(stressTestCount)]\n if (stressTestLite) stressArgs.push('--lite')\n if (await runModuleCommand(allModules, 'customers', 'seed-stresstest', stressArgs, { optional: true })) {\n console.log(`\u2705 Stress test customers seeded (requested ${stressTestCount})\\n`)\n } else {\n console.log('')\n }\n }\n\n console.log('\uD83E\uDDE9 Enabling default dashboard widgets...')\n if (await runModuleCommand(allModules, 'dashboards', 'seed-defaults', ['--tenant', tenantId], { optional: true })) {\n console.log('\u2705 Dashboard widgets enabled\\n')\n } else {\n console.log('')\n }\n\n console.log('\uD83D\uDCCA Enabling analytics widgets for admin and employee roles...')\n if (await runModuleCommand(allModules, 'dashboards', 'enable-analytics-widgets', [\n '--tenant',\n tenantId,\n '--roles',\n 'admin,employee',\n ], { optional: true })) {\n console.log('\u2705 Analytics widgets enabled for roles\\n')\n } else {\n console.log('')\n }\n\n } else {\n console.log('\u26A0\uFE0F Could not get organization ID or tenant ID, skipping seeding steps\\n')\n }\n\n console.log('\uD83E\uDDE0 Building search indexes...')\n const vectorArgs = tenantId\n ? ['--tenant', tenantId, ...(orgId ? ['--org', orgId] : [])]\n : ['--purgeFirst=false']\n if (await runModuleCommand(allModules, 'search', 'reindex', vectorArgs, { optional: true })) {\n console.log('\u2705 Search indexes built\\n')\n } else {\n console.log('')\n }\n\n console.log('\uD83D\uDD0D Rebuilding query indexes...')\n const queryIndexArgs = ['--force', ...(tenantId ? ['--tenant', tenantId] : [])]\n if (await runModuleCommand(allModules, 'query_index', 'reindex', queryIndexArgs, { optional: true })) {\n console.log('\u2705 Query indexes rebuilt\\n')\n } else {\n console.log('')\n }\n\n const adminPasswordOverride = derivedSecrets.adminPassword\n const employeePasswordOverride = derivedSecrets.employeePassword\n const createdUsers: Array<{ label: string; icon: string; email: string }> = []\n const createdPasswords = new Map<string, string>()\n const pushUser = (label: string, icon: string, value: string | null, passwordValue: string) => {\n if (!value) return\n if (createdUsers.some((entry) => entry.email.toLowerCase() === value.toLowerCase())) return\n createdUsers.push({ label, icon, email: value })\n createdPasswords.set(value.toLowerCase(), passwordValue)\n }\n pushUser('Superadmin', '\uD83D\uDC51', email, password)\n pushUser('Admin', '\uD83E\uDDF0', adminEmailDerived, adminPasswordOverride ?? password)\n pushUser('Employee', '\uD83D\uDC77', employeeEmailDerived, employeePasswordOverride ?? password)\n // Simplified success message: we know which users were created\n console.log('\uD83C\uDF89 App initialization complete!\\n')\n console.log('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557')\n console.log('\u2551 \uD83D\uDE80 You\\'re now ready to start development! \u2551')\n console.log('\u2551 \u2551')\n console.log('\u2551 Start the dev server: \u2551')\n console.log('\u2551 yarn dev \u2551')\n console.log('\u2551 \u2551')\n console.log('\u2551 Users created: \u2551')\n for (const entry of createdUsers) {\n const label = `${entry.icon} ${entry.label}:`\n const labelPad = padByCodePointWidth(label, 13)\n const entryPassword = createdPasswords.get(entry.email.toLowerCase()) ?? password\n console.log(`\u2551 ${labelPad}${entry.email.padEnd(42)} \u2551`)\n console.log(`\u2551 Password: ${entryPassword.padEnd(44)} \u2551`)\n }\n console.log('\u2551 \u2551')\n console.log('\u2551 Happy coding! \u2551')\n console.log('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D')\n\n return 0\n } catch (error: unknown) {\n console.error('\u274C Initialization failed:', formatInitFailureMessage(error))\n return 1\n }\n }\n\n // Handle agentic:init command (bootstrap-free)\n if (first === 'agentic:init') {\n const { runAgenticInit } = await import('./lib/agentic-init')\n const exitCode = await runAgenticInit(parts.slice(1))\n return exitCode\n }\n\n if (first === 'module') {\n try {\n const subcommand = second\n const commandArgs = remaining.filter(Boolean)\n\n if (!subcommand || subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {\n console.log('Usage: yarn mercato module <add|enable|eject> ...')\n console.log(' yarn mercato module add <packageSpec> [--module <moduleId>] [--eject]')\n console.log(' yarn mercato module enable <packageName> [--module <moduleId>] [--eject]')\n console.log(' yarn mercato module eject <moduleId>')\n return 0\n }\n\n if (subcommand === 'add') {\n const { createResolver } = await import('./lib/resolver')\n const { addOfficialModule } = await import('./lib/module-install')\n const { packageSpec, eject, moduleId } = parseModuleInstallArgs(commandArgs)\n\n if (!packageSpec) {\n console.error('Usage: yarn mercato module add <packageSpec> [--module <moduleId>] [--eject]')\n return 1\n }\n\n const result = await addOfficialModule(createResolver(), packageSpec, eject, moduleId ?? undefined)\n console.log(`\\n\u2705 Module \"${result.moduleId}\" enabled from ${result.from}.\\n`)\n console.log('Next steps:')\n console.log(' 1. Review generated files if needed: .mercato/generated/')\n console.log(' 2. Start dev: yarn dev')\n return 0\n }\n\n if (subcommand === 'enable') {\n const packageName = commandArgs.find((arg) => !arg.startsWith('-'))\n if (!packageName) {\n console.error('Usage: yarn mercato module enable <packageName> [--module <moduleId>] [--eject]')\n return 1\n }\n\n const { createResolver } = await import('./lib/resolver')\n const { enableOfficialModule } = await import('./lib/module-install')\n const { moduleId, eject } = parseModuleInstallArgs(commandArgs)\n const result = await enableOfficialModule(createResolver(), packageName, moduleId ?? undefined, eject)\n console.log(`\\n\u2705 Module \"${result.moduleId}\" enabled from ${result.from}.\\n`)\n console.log('Next steps:')\n console.log(' 1. Review generated files if needed: .mercato/generated/')\n console.log(' 2. Start dev: yarn dev')\n return 0\n }\n\n if (subcommand === 'eject') {\n return handleDirectEjectCommand(commandArgs)\n }\n\n console.error(`Unknown module subcommand \"${subcommand}\".`)\n return 1\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\u274C Module command failed: ${message}`)\n return 1\n }\n }\n\n // Handle eject command directly (bootstrap-free)\n if (first === 'eject') {\n try {\n return handleDirectEjectCommand(parts.slice(1))\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\u274C Eject failed: ${message}`)\n return 1\n }\n }\n\n // Handle UMES commands (bootstrap-free)\n if (first === 'umes:list') {\n const { runUmesList } = await import('./lib/umes/list')\n await runUmesList()\n return 0\n }\n\n if (first === 'umes:inspect') {\n const moduleArg = second === '--module' ? remaining[0] : second\n if (!moduleArg) {\n console.error('Usage: yarn mercato umes:inspect --module <moduleId>')\n return 1\n }\n const { runUmesInspect } = await import('./lib/umes/inspect')\n return runWithCapturedExitCode(() => runUmesInspect(moduleArg))\n }\n\n if (first === 'umes:check') {\n const { runUmesCheck } = await import('./lib/umes/check')\n return runWithCapturedExitCode(() => runUmesCheck())\n }\n\n if (first === 'seed:defaults') {\n await ensureEnvLoaded()\n const moduleFilter = parts.includes('--module') ? parts[parts.indexOf('--module') + 1] : null\n\n try {\n const [{ bootstrapFromAppRoot }, { createResolver }] = await Promise.all([\n import('@open-mercato/shared/lib/bootstrap/dynamicLoader'),\n import('./lib/resolver'),\n ])\n const resolver = createResolver()\n const data = await bootstrapFromAppRoot(resolver.getAppDir())\n registerCliModules(data.modules)\n const allModules = data.modules\n\n const modulesToSeed = moduleFilter\n ? allModules.filter((mod) => mod.id === moduleFilter)\n : allModules\n\n if (moduleFilter && modulesToSeed.length === 0) {\n console.error(`\u274C Module \"${moduleFilter}\" not found.`)\n return 1\n }\n\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const seedContainer = await createRequestContainer()\n const seedEm = seedContainer.resolve('em') as any\n\n const { Organization } = await import('@open-mercato/core/modules/directory/data/entities')\n const orgs = await seedEm.find(Organization, { deletedAt: null }, { populate: ['tenant'] as const })\n\n if (orgs.length === 0) {\n console.error('\u274C No organizations found. Run yarn initialize first.')\n return 1\n }\n\n console.log(`\uD83D\uDCDA Running seed:defaults for ${orgs.length} org(s)...\\n`)\n for (const org of orgs) {\n const tenantId = String(org.tenant.id)\n const organizationId = String(org.id)\n const seedCtx = { em: seedEm, tenantId, organizationId, container: seedContainer }\n\n console.log(` \uD83C\uDFE2 org=${organizationId} tenant=${tenantId}`)\n for (const mod of modulesToSeed) {\n if (mod.setup?.seedDefaults) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedDefaults(seedCtx)\n }\n }\n\n const { ensureCustomRoleAcls } = await import('@open-mercato/core/modules/auth/lib/setup-app')\n await ensureCustomRoleAcls(seedEm, tenantId, allModules)\n }\n\n console.log('\\n\u2705 seed:defaults complete.')\n return 0\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\u274C seed:defaults failed: ${message}`)\n return 1\n }\n }\n\n let modName = first\n let cmdName = second\n let rest = remaining\n\n if (first === 'test:integration') {\n modName = 'test'\n cmdName = 'integration'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test:ephemeral') {\n modName = 'test'\n cmdName = 'ephemeral'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test:integration:interactive') {\n modName = 'test'\n cmdName = 'interactive'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test:integration:coverage') {\n modName = 'test'\n cmdName = 'coverage'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test:integration:spec-coverage') {\n modName = 'test'\n cmdName = 'spec-coverage'\n rest = second !== undefined ? [second, ...remaining] : []\n }\n\n if (first === 'test' && second === 'integration') {\n modName = 'test'\n cmdName = 'integration'\n rest = remaining\n }\n\n if (first === 'test' && second === 'ephemeral') {\n modName = 'test'\n cmdName = 'ephemeral'\n rest = remaining\n }\n\n if (first === 'test' && second === 'interactive') {\n modName = 'test'\n cmdName = 'interactive'\n rest = remaining\n }\n\n if (first === 'test' && second === 'coverage') {\n modName = 'test'\n cmdName = 'coverage'\n rest = remaining\n }\n\n if (first === 'test' && second === 'spec-coverage') {\n modName = 'test'\n cmdName = 'spec-coverage'\n rest = remaining\n }\n\n if (first === 'reindex') {\n modName = 'query_index'\n cmdName = 'reindex'\n rest = second !== undefined ? [second, ...remaining] : remaining\n }\n\n // Handle 'mercato generate' without subcommand - default to 'generate all'\n if (first === 'generate' && !second) {\n cmdName = 'all'\n rest = remaining\n }\n\n // Load modules from registered CLI modules\n const modules = getCliModules()\n \n // Load optional app-level CLI commands lazily without static import resolution\n let appCli: any[] = []\n if (!BUILTIN_CLI_MODULE_IDS.has(modName)) {\n try {\n const dynImport: any = (Function('return import') as any)()\n const app = await dynImport.then((f: any) => f('@/cli')).catch(() => null)\n if (app && Array.isArray(app?.default)) appCli = app.default\n } catch { /* @/cli may not exist in standalone apps \u2014 safe to ignore */ }\n }\n const all = modules.slice()\n\n all.push({\n id: 'deploy',\n cli: [\n {\n command: 'railway',\n run: async (args: string[]) => {\n const { runRailwayDeploy } = await import('./lib/deploy/railway/index')\n await runRailwayDeploy(args)\n },\n },\n ],\n } as Module)\n \n // Built-in CLI module: queue\n all.push({\n id: 'queue',\n cli: [\n {\n command: 'worker',\n run: async (args: string[]) => {\n const isAllQueues = args.includes('--all')\n const queueName = isAllQueues ? null : args[0]\n\n // Collect all discovered workers from modules\n const allWorkers = getRegisteredCliWorkers()\n const discoveredQueues = [...new Set(allWorkers.map((w) => w.queue))]\n\n if (!queueName && !isAllQueues) {\n console.error('Usage: mercato queue worker <queueName> | --all')\n console.error('Example: mercato queue worker events')\n console.error('Example: mercato queue worker --all')\n if (discoveredQueues.length > 0) {\n console.error(`Discovered queues: ${discoveredQueues.join(', ')}`)\n }\n return\n }\n\n const concurrencyArg = args.find((a) => a.startsWith('--concurrency='))\n const concurrencyOverride = concurrencyArg ? Number(concurrencyArg.split('=')[1]) : undefined\n\n if (isAllQueues) {\n // Run workers for all discovered queues\n if (discoveredQueues.length === 0) {\n console.error('[worker] No queues discovered from CLI modules.')\n console.error('[worker] Run `yarn generate` and verify `.mercato/generated/modules.cli.generated.ts` contains worker entries.')\n return\n }\n\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n console.log(`[worker] Starting workers for all queues: ${discoveredQueues.join(', ')}`)\n\n // Start all queue workers in background mode\n const workerPromises = discoveredQueues.map(async (queue) => {\n const queueWorkers = allWorkers.filter((w) => w.queue === queue)\n const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1)\n\n console.log(`[worker] Starting \"${queue}\" with ${queueWorkers.length} handler(s), concurrency: ${concurrency}`)\n\n const queueRedisUrl = getRedisUrl('QUEUE')\n await runWorker({\n queueName: queue,\n connection: queueRedisUrl ? { url: queueRedisUrl } : undefined,\n concurrency,\n background: true,\n handler: createPerJobWorkerHandler(queueWorkers, createRequestContainer),\n })\n })\n\n await Promise.all(workerPromises)\n\n console.log('[worker] All workers started. Press Ctrl+C to stop')\n\n // Keep the process alive\n await new Promise(() => {})\n } else {\n // Find workers for this specific queue\n const queueWorkers = allWorkers.filter((w) => w.queue === queueName)\n\n if (queueWorkers.length > 0) {\n // Use discovered workers\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1)\n\n console.log(`[worker] Found ${queueWorkers.length} worker(s) for queue \"${queueName}\"`)\n\n const queueRedisUrl = getRedisUrl('QUEUE')\n await runWorker({\n queueName: queueName!,\n connection: queueRedisUrl ? { url: queueRedisUrl } : undefined,\n concurrency,\n handler: createPerJobWorkerHandler(queueWorkers, createRequestContainer),\n })\n } else {\n console.error(`No workers found for queue \"${queueName}\"`)\n if (discoveredQueues.length > 0) {\n console.error(`Available queues: ${discoveredQueues.join(', ')}`)\n }\n }\n }\n },\n },\n {\n command: 'clear',\n run: async (args: string[]) => {\n const queueName = args[0]\n if (!queueName) {\n console.error('Usage: mercato queue clear <queueName>')\n return\n }\n\n const strategyEnv = process.env.QUEUE_STRATEGY || 'local'\n const { createQueue } = await import('@open-mercato/queue')\n\n const queue = strategyEnv === 'async'\n ? createQueue(queueName, 'async', {\n connection: { url: getRedisUrlOrThrow('QUEUE') },\n })\n : createQueue(queueName, 'local')\n\n const res = await queue.clear()\n await queue.close()\n console.log(`Cleared queue \"${queueName}\", removed ${res.removed} jobs`)\n },\n },\n {\n command: 'status',\n run: async (args: string[]) => {\n const queueName = args[0]\n if (!queueName) {\n console.error('Usage: mercato queue status <queueName>')\n return\n }\n\n const strategyEnv = process.env.QUEUE_STRATEGY || 'local'\n const { createQueue } = await import('@open-mercato/queue')\n\n const queue = strategyEnv === 'async'\n ? createQueue(queueName, 'async', {\n connection: { url: getRedisUrlOrThrow('QUEUE') },\n })\n : createQueue(queueName, 'local')\n\n const counts = await queue.getJobCounts()\n console.log(`Queue \"${queueName}\" status:`)\n console.log(` Waiting: ${counts.waiting}`)\n console.log(` Active: ${counts.active}`)\n console.log(` Completed: ${counts.completed}`)\n console.log(` Failed: ${counts.failed}`)\n await queue.close()\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: events\n all.push({\n id: 'events',\n cli: [\n {\n command: 'emit',\n run: async (args: string[]) => {\n const eventName = args[0]\n if (!eventName) {\n console.error('Usage: mercato events emit <event> [jsonPayload] [--persistent|-p]')\n return\n }\n const persistent = args.includes('--persistent') || args.includes('-p')\n const payloadArg = args[1] && !args[1].startsWith('--') ? args[1] : undefined\n let payload: any = {}\n if (payloadArg) {\n try { payload = JSON.parse(payloadArg) } catch { payload = payloadArg }\n }\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const bus = (container.resolve('eventBus') as any)\n await bus.emit(eventName, payload, { persistent })\n console.log(`Emitted \"${eventName}\"${persistent ? ' (persistent)' : ''}`)\n },\n },\n {\n command: 'clear',\n run: async () => {\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const bus = (container.resolve('eventBus') as any)\n const res = await bus.clearQueue()\n console.log(`Cleared events queue, removed ${res.removed} events`)\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: generate\n all.push({\n id: 'generate',\n cli: [\n {\n command: 'all',\n run: async (args: string[]) => {\n const quiet = args.includes('--quiet') || args.includes('-q')\n\n console.log('Running all generators...')\n await runGeneratorSuite(quiet)\n await runPostGenerateStructuralCachePurge(quiet)\n console.log('All generators completed.')\n },\n },\n {\n command: 'watch',\n run: async (args: string[]) => {\n const quiet = args.includes('--quiet') || args.includes('-q')\n const skipInitial = args.includes('--skip-initial')\n const intervalArg = args.find((arg) => arg.startsWith('--interval='))\n const parsedInterval = intervalArg ? Number.parseInt(intervalArg.split('=')[1] ?? '', 10) : NaN\n const intervalMs = Number.isFinite(parsedInterval) && parsedInterval >= 250 ? parsedInterval : 1000\n\n const watcher = startInProcessGenerateWatcher({\n pollMs: intervalMs,\n skipInitial,\n quiet,\n computeStructureChecksum: createGenerateWatchChecksumFn(),\n runGenerators: async () => {\n await runGeneratorSuite(true)\n await runPostGenerateStructuralCachePurge(true)\n },\n })\n\n const shutdownSignals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM']\n let shuttingDown = false\n const handleSignal = () => {\n if (shuttingDown) return\n shuttingDown = true\n void watcher.close()\n }\n for (const signal of shutdownSignals) {\n process.once(signal, handleSignal)\n }\n\n // The watcher's polling timer is `unref()`-ed so the event loop\n // would otherwise exit immediately for a standalone CLI invocation.\n // `keepAlive` holds the loop open until a shutdown signal calls\n // `watcher.close()`, which resolves `watcher.done`.\n const keepAlive = setInterval(() => {}, 1 << 30)\n try {\n await watcher.done\n } finally {\n clearInterval(keepAlive)\n for (const signal of shutdownSignals) {\n process.removeListener(signal, handleSignal)\n }\n }\n },\n },\n {\n command: 'entity-ids',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'registry',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModulePackageSources, generateModuleRegistry, generateModuleRegistryApp, generateModuleRegistryCli } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleRegistry({ resolver, quiet: args.includes('--quiet') })\n await generateModuleRegistryApp({ resolver, quiet: args.includes('--quiet') })\n await generateModuleRegistryCli({ resolver, quiet: args.includes('--quiet') })\n await generateModulePackageSources({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'entities',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleEntities } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleEntities({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'di',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleDi } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleDi({ resolver, quiet: args.includes('--quiet') })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: db\n all.push({\n id: 'db',\n cli: [\n {\n command: 'generate',\n run: async () => {\n const { createResolver } = await import('./lib/resolver')\n const { dbGenerate } = await import('./lib/db')\n const resolver = createResolver()\n await dbGenerate(resolver)\n },\n },\n {\n command: 'migrate',\n run: async () => {\n const { createResolver } = await import('./lib/resolver')\n const { dbMigrate } = await import('./lib/db')\n const resolver = createResolver()\n await dbMigrate(resolver)\n },\n },\n {\n command: 'greenfield',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { dbGreenfield } = await import('./lib/db')\n const resolver = createResolver()\n const yes = args.includes('--yes') || args.includes('-y')\n await dbGreenfield(resolver, { yes })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: server (runs Next.js + workers)\n all.push({\n id: 'server',\n cli: [\n {\n command: 'dev',\n run: async () => {\n const { spawn } = await import('child_process')\n const { resolveEnvironment } = await import('./lib/resolver')\n const env = resolveEnvironment()\n const appDir = env.appDir\n const nodeModulesBases = Array.from(new Set([env.rootDir, appDir]))\n\n let processes: ChildProcess[] = []\n let didRetryCorruptedTurbopackCache = false\n let stopping = false\n let devRestartPromiseResolve: ((result: DevServerRestartResult) => void) | null = null\n let activeLazySupervisor: ReturnType<typeof startLazyWorkerSupervisor> | null = null\n let activeLazySchedulerSupervisor: ReturnType<typeof startLazySchedulerSupervisor> | null = null\n let activeGenerateWatcher: GenerateWatcherHandle | null = null\n let lastRestartReason: string | null = null\n const generateWatcherMode: GenerateWatcherMode = resolveGenerateWatcherMode(process.env)\n const envReloader = createDevEnvReloader(appDir, process.env, initialProcessEnvironmentEntries)\n\n function cleanup() {\n console.log('[server] Shutting down...')\n for (const proc of processes) {\n if (!proc.killed && proc.exitCode === null && proc.signalCode === null) {\n proc.kill('SIGTERM')\n }\n }\n if (activeLazySupervisor) {\n void activeLazySupervisor.close().catch(() => undefined)\n }\n if (activeLazySchedulerSupervisor) {\n void activeLazySchedulerSupervisor.close().catch(() => undefined)\n }\n if (activeGenerateWatcher) {\n void activeGenerateWatcher.close().catch(() => undefined)\n }\n }\n\n async function cleanupAndWait() {\n cleanup()\n // Wait for all child processes to fully exit so they can release lock files\n await Promise.all(\n processes.map(\n (proc) =>\n new Promise<void>((resolve) => {\n if (proc.exitCode !== null || proc.signalCode !== null) return resolve()\n proc.on('exit', () => resolve())\n })\n )\n )\n if (activeLazySupervisor) {\n try {\n await activeLazySupervisor.close()\n } catch {\n // Supervisor close errors should not block dev runtime cleanup.\n }\n activeLazySupervisor = null\n }\n if (activeLazySchedulerSupervisor) {\n try {\n await activeLazySchedulerSupervisor.close()\n } catch {\n // Scheduler supervisor close errors should not block dev runtime cleanup.\n }\n activeLazySchedulerSupervisor = null\n }\n if (activeGenerateWatcher) {\n try {\n await activeGenerateWatcher.close()\n } catch {\n // In-process generate watcher close errors must never block dev shutdown.\n }\n activeGenerateWatcher = null\n }\n // Safety net: remove Next.js dev lock file in case the child didn't clean up\n const lockFile = path.join(appDir, '.mercato', 'next', 'dev', 'lock')\n try {\n fs.unlinkSync(lockFile)\n } catch {\n // Lock file may already be removed by Next.js \u2014 ignore\n }\n processes = []\n }\n\n process.on('SIGTERM', () => {\n stopping = true\n cleanup()\n })\n process.on('SIGINT', () => {\n stopping = true\n cleanup()\n })\n\n console.log('[server] Starting Open Mercato in dev mode...')\n\n // Ensure module-package-sources.css exists before Next.js starts\n const { createResolver: createResolverForSources } = await import('./lib/resolver')\n const { generateModulePackageSources } = await import('./lib/generators')\n await generateModulePackageSources({ resolver: createResolverForSources(), quiet: true })\n\n const nextBin = resolveInstalledBinary(nodeModulesBases, 'next/dist/bin/next')\n const mercatoBin = resolveInstalledBinary(nodeModulesBases, '@open-mercato/cli/bin/mercato')\n\n const stopEnvWatcher = watchDevEnvFiles(appDir, (filePath) => {\n devRestartPromiseResolve?.({\n label: 'Environment file change',\n restart: true,\n filePath,\n })\n })\n const waitForDevRestart = (): Promise<DevServerRestartResult> =>\n new Promise((resolve) => {\n devRestartPromiseResolve = resolve\n })\n\n const startNextDev = (runtimeEnv: NodeJS.ProcessEnv): {\n exitPromise: Promise<ManagedProcessExitResult>\n readyPromise: Promise<void>\n } => {\n let readyResolve: () => void = () => undefined\n const readyPromise = new Promise<void>((resolve) => {\n readyResolve = resolve\n })\n const exitPromise = new Promise<ManagedProcessExitResult>((resolve) => {\n writeDevSplashRuntimeStarting(\n lastRestartReason\n ? `Restarting Next.js dev server. Reason: ${lastRestartReason}`\n : 'Starting Next.js dev server',\n )\n const nextProcess = spawn('node', [nextBin, 'dev', '--turbopack'], {\n stdio: ['inherit', 'pipe', 'pipe'],\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(nextProcess)\n\n let combinedOutput = ''\n let reportedReady = false\n const appendOutput = (chunk: string) => {\n combinedOutput += chunk\n if (combinedOutput.length > 32_768) {\n combinedOutput = combinedOutput.slice(-32_768)\n }\n if (!reportedReady && /\\bready in\\b/i.test(chunk)) {\n reportedReady = true\n writeDevSplashRuntimeReady(lastRestartReason ?? undefined)\n lastRestartReason = null\n readyResolve()\n }\n }\n\n nextProcess.stdout?.on('data', (chunk: Buffer | string) => {\n const text = typeof chunk === 'string' ? chunk : chunk.toString()\n process.stdout.write(text)\n appendOutput(text)\n })\n nextProcess.stderr?.on('data', (chunk: Buffer | string) => {\n const text = typeof chunk === 'string' ? chunk : chunk.toString()\n process.stderr.write(text)\n appendOutput(text)\n })\n\n nextProcess.on('exit', async (code, signal) => {\n if (!didRetryCorruptedTurbopackCache && isTurbopackCacheCorruption(combinedOutput)) {\n didRetryCorruptedTurbopackCache = true\n lastRestartReason = 'corrupted Turbopack dev cache'\n writeDevSplashRuntimeRestarting(lastRestartReason)\n console.log('[server] Detected corrupted Turbopack dev cache. Clearing .mercato/next/dev and restarting Next.js once...')\n removeTurbopackDevCache(appDir)\n const restarted = startNextDev(runtimeEnv)\n restarted.readyPromise.then(readyResolve)\n return resolve(await restarted.exitPromise)\n }\n resolve({\n label: 'Next.js dev server',\n code,\n signal,\n })\n })\n })\n return { exitPromise, readyPromise }\n }\n\n try {\n while (!stopping) {\n envReloader.reload()\n const runtimeEnv = buildServerProcessEnvironment(process.env)\n const autoSpawnWorkersMode = resolveAutoSpawnWorkersMode(process.env)\n const autoSpawnSchedulerMode = resolveAutoSpawnSchedulerMode(process.env)\n const queueStrategy = process.env.QUEUE_STRATEGY || 'local'\n const schedulerCommand = lookupModuleCommand(getCliModules(), 'scheduler', 'start')\n const nextRuntime = startNextDev(runtimeEnv)\n const restartPromise = waitForDevRestart()\n const backgroundStartAbort = new AbortController()\n const cancelBackgroundStart = () => backgroundStartAbort.abort()\n nextRuntime.exitPromise.finally(cancelBackgroundStart)\n restartPromise.then(cancelBackgroundStart)\n let backgroundExitResolve: (result: ManagedProcessExitResult) => void = () => undefined\n const backgroundExitPromise = new Promise<ManagedProcessExitResult>((resolve) => {\n backgroundExitResolve = resolve\n })\n const managedExitPromises: Promise<DevServerExitResult>[] = [\n nextRuntime.exitPromise,\n restartPromise,\n backgroundExitPromise,\n ]\n\n const startBackgroundServices = async () => {\n if (stopping || backgroundStartAbort.signal.aborted) return\n\n // Keep first-route compilation responsive: greenfield setup can\n // leave vector/fulltext jobs ready. When the dev wrapper is\n // active, wait for its /login + /backend warmup marker before\n // workers and scheduler begin consuming CPU and database I/O.\n const warmupReady = await waitForDevWarmupReadyFile(process.env.OM_DEV_WARMUP_READY_FILE, {\n timeoutMs: resolveDevWarmupReadyTimeoutMs(process.env),\n signal: backgroundStartAbort.signal,\n })\n if (warmupReady === 'aborted' || stopping || backgroundStartAbort.signal.aborted) return\n if (warmupReady === 'timeout') {\n console.warn('[server] Timed out waiting for dev warmup marker; starting background services anyway.')\n }\n\n if (autoSpawnWorkersMode !== 'off') {\n const discoveredWorkers = getRegisteredCliWorkers()\n const discoveredWorkerQueues = [...new Set(discoveredWorkers.map((worker) => worker.queue))]\n if (discoveredWorkerQueues.length === 0) {\n console.error('[server] AUTO_SPAWN_WORKERS is enabled, but no queues were discovered from CLI modules. Run `yarn generate` and verify `.mercato/generated/modules.cli.generated.ts` contains worker entries. Continuing without auto-spawned workers.')\n } else if (autoSpawnWorkersMode === 'lazy') {\n console.log(`[server] Lazy worker auto-spawn enabled \u2014 workers will start on first job (${discoveredWorkerQueues.length} queue(s) watched).`)\n activeLazySupervisor = startLazyWorkerSupervisor({\n mercatoBin,\n appDir,\n runtimeEnv,\n workers: discoveredWorkers,\n pollMs: resolveLazyPollMs(process.env),\n restartOnUnexpectedExit: resolveLazyRestart(process.env),\n })\n } else {\n console.log('[server] Eager worker auto-spawn enabled - starting workers for all queues...')\n const workerProcess = spawn('node', [mercatoBin, 'queue', 'worker', '--all'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(workerProcess)\n waitForManagedProcessExit(workerProcess, formatQueueWorkerLabel(discoveredWorkerQueues)).then(backgroundExitResolve)\n }\n }\n\n if (autoSpawnSchedulerMode !== 'off' && queueStrategy === 'local') {\n if (schedulerCommand.status !== 'ok') {\n console.log(`[server] Skipping scheduler auto-start \u2014 ${describeMissingModuleCommand(schedulerCommand)}`)\n } else if (autoSpawnSchedulerMode === 'lazy') {\n console.log('[server] Lazy scheduler auto-spawn enabled - scheduler will start when an enabled schedule exists.')\n activeLazySchedulerSupervisor = startLazySchedulerSupervisor({\n mercatoBin,\n appDir,\n runtimeEnv,\n pollMs: resolveLazySchedulerPollMs(process.env),\n restartOnUnexpectedExit: resolveLazySchedulerRestart(process.env),\n })\n } else {\n console.log('[server] Eager scheduler auto-spawn enabled - starting scheduler polling engine...')\n const schedulerProcess = spawn('node', [mercatoBin, 'scheduler', 'start'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(schedulerProcess)\n waitForManagedProcessExit(schedulerProcess, 'Scheduler polling engine').then(backgroundExitResolve)\n }\n }\n }\n nextRuntime.readyPromise.then(() => {\n void startBackgroundServices()\n })\n\n if (generateWatcherMode === 'in-process') {\n // Run the structural regeneration watcher inside this process\n // instead of spawning a dedicated `mercato generate watch --skip-initial`\n // sidecar. Saves ~190 MB of resident RSS on a typical dev box\n // (measured against the legacy sidecar). Opt back into the\n // sidecar with `OM_DEV_GENERATE_WATCH_MODE=legacy` if needed.\n console.log('[server] In-process generate watcher enabled \u2014 structural changes will regenerate without a sidecar process.')\n activeGenerateWatcher = startInProcessGenerateWatcher({\n // `--skip-initial` equivalent: `yarn dev` always runs an\n // initial `mercato generate` before reaching the server\n // command, so the watcher must not re-run generators at\n // boot time. Otherwise dev startup pays a generator pass\n // twice in a row.\n skipInitial: true,\n quiet: false,\n computeStructureChecksum: createGenerateWatchChecksumFn(),\n runGenerators: async () => {\n await runGeneratorSuite(true)\n await runPostGenerateStructuralCachePurge(true)\n },\n })\n } else {\n console.log('[server] Legacy out-of-process generate watcher selected via OM_DEV_GENERATE_WATCH_MODE=legacy \u2014 expect the dev orchestrator to spawn `mercato generate watch --skip-initial`.')\n }\n\n const firstExit = await Promise.race(managedExitPromises)\n if (isDevServerRestartResult(firstExit)) {\n lastRestartReason = `${firstExit.label.toLowerCase()} (${path.basename(firstExit.filePath)})`\n writeDevSplashRuntimeRestarting(lastRestartReason)\n }\n await cleanupAndWait()\n devRestartPromiseResolve = null\n\n if (isDevServerRestartResult(firstExit)) {\n console.log(`[server] Detected ${firstExit.label.toLowerCase()} (${path.basename(firstExit.filePath)}). Restarting app runtime...`)\n continue\n }\n\n if (!isExpectedManagedExit(firstExit, { stopping })) {\n throw createManagedProcessExitError(firstExit)\n }\n\n stopping = true\n }\n } finally {\n stopEnvWatcher()\n }\n },\n },\n {\n command: 'start',\n run: async () => {\n const { spawn } = await import('child_process')\n const { resolveEnvironment } = await import('./lib/resolver')\n const env = resolveEnvironment()\n const appDir = env.appDir\n const nodeModulesBases = Array.from(new Set([env.rootDir, appDir]))\n\n const processes: ChildProcess[] = []\n const autoSpawnWorkersMode = resolveAutoSpawnWorkersMode(process.env)\n const autoSpawnSchedulerMode = resolveAutoSpawnSchedulerMode(process.env)\n const queueStrategy = process.env.QUEUE_STRATEGY || 'local'\n const runtimeEnv = buildServerProcessEnvironment(process.env)\n // Throws on single-instance strategies under a multi-instance topology,\n // aborting before the start lock is acquired or any process is spawned.\n assertSingleInstanceStrategies(runtimeEnv)\n const schedulerCommand = lookupModuleCommand(getCliModules(), 'scheduler', 'start')\n const serverStartLock = acquireServerStartLock(appDir, {\n port: runtimeEnv.PORT ?? process.env.PORT ?? null,\n })\n let activeLazySupervisor: ReturnType<typeof startLazyWorkerSupervisor> | null = null\n let activeLazySchedulerSupervisor: ReturnType<typeof startLazySchedulerSupervisor> | null = null\n let stopping = false\n\n function cleanup() {\n console.log('[server] Shutting down...')\n for (const proc of processes) {\n if (!proc.killed && proc.exitCode === null && proc.signalCode === null) {\n proc.kill('SIGTERM')\n }\n }\n if (activeLazySupervisor) {\n void activeLazySupervisor.close().catch(() => undefined)\n }\n if (activeLazySchedulerSupervisor) {\n void activeLazySchedulerSupervisor.close().catch(() => undefined)\n }\n }\n\n async function cleanupAndWait() {\n cleanup()\n await Promise.all(\n processes.map(\n (proc) =>\n new Promise<void>((resolve) => {\n if (proc.exitCode !== null || proc.signalCode !== null) return resolve()\n proc.on('exit', () => resolve())\n })\n )\n )\n if (activeLazySupervisor) {\n try {\n await activeLazySupervisor.close()\n } catch {\n // Supervisor close errors should not block server shutdown.\n }\n activeLazySupervisor = null\n }\n if (activeLazySchedulerSupervisor) {\n try {\n await activeLazySchedulerSupervisor.close()\n } catch {\n // Scheduler supervisor close errors should not block server shutdown.\n }\n activeLazySchedulerSupervisor = null\n }\n }\n\n process.on('SIGTERM', () => {\n stopping = true\n cleanup()\n })\n process.on('SIGINT', () => {\n stopping = true\n cleanup()\n })\n\n console.log('[server] Starting Open Mercato in production mode...')\n\n const nextBin = resolveInstalledBinary(nodeModulesBases, 'next/dist/bin/next')\n const mercatoBin = resolveInstalledBinary(nodeModulesBases, '@open-mercato/cli/bin/mercato')\n ensureNextBuildIdInConfiguredDistDir(appDir)\n\n try {\n // Start Next.js production server\n const nextProcess = spawn('node', [nextBin, 'start'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(nextProcess)\n const managedExitPromises: Promise<ManagedProcessExitResult>[] = [\n waitForManagedProcessExit(nextProcess, 'Next.js production server'),\n ]\n\n // Start workers if enabled\n if (autoSpawnWorkersMode !== 'off') {\n const discoveredWorkers = getRegisteredCliWorkers()\n const discoveredWorkerQueues = [...new Set(discoveredWorkers.map((worker) => worker.queue))]\n if (discoveredWorkerQueues.length === 0) {\n console.error('[server] AUTO_SPAWN_WORKERS is enabled, but no queues were discovered from CLI modules. Run `yarn generate` and verify `.mercato/generated/modules.cli.generated.ts` contains worker entries. Continuing without auto-spawned workers.')\n } else if (autoSpawnWorkersMode === 'lazy') {\n console.log(`[server] Lazy worker auto-spawn enabled \u2014 workers will start on first job (${discoveredWorkerQueues.length} queue(s) watched).`)\n activeLazySupervisor = startLazyWorkerSupervisor({\n mercatoBin,\n appDir,\n runtimeEnv,\n workers: discoveredWorkers,\n pollMs: resolveLazyPollMs(process.env),\n restartOnUnexpectedExit: resolveLazyRestart(process.env),\n })\n } else {\n console.log('[server] Eager worker auto-spawn enabled - starting workers for all queues...')\n const workerProcess = spawn('node', [mercatoBin, 'queue', 'worker', '--all'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(workerProcess)\n managedExitPromises.push(waitForManagedProcessExit(workerProcess, formatQueueWorkerLabel(discoveredWorkerQueues)))\n }\n }\n\n if (autoSpawnSchedulerMode !== 'off' && queueStrategy === 'local') {\n if (schedulerCommand.status !== 'ok') {\n console.log(`[server] Skipping scheduler auto-start \u2014 ${describeMissingModuleCommand(schedulerCommand)}`)\n } else if (autoSpawnSchedulerMode === 'lazy') {\n console.log('[server] Lazy scheduler auto-spawn enabled - scheduler will start when an enabled schedule exists.')\n activeLazySchedulerSupervisor = startLazySchedulerSupervisor({\n mercatoBin,\n appDir,\n runtimeEnv,\n pollMs: resolveLazySchedulerPollMs(process.env),\n restartOnUnexpectedExit: resolveLazySchedulerRestart(process.env),\n })\n } else {\n console.log('[server] Eager scheduler auto-spawn enabled - starting scheduler polling engine...')\n const schedulerProcess = spawn('node', [mercatoBin, 'scheduler', 'start'], {\n stdio: 'inherit',\n env: runtimeEnv,\n cwd: appDir,\n })\n processes.push(schedulerProcess)\n managedExitPromises.push(waitForManagedProcessExit(schedulerProcess, 'Scheduler polling engine'))\n }\n }\n\n const firstExit = await Promise.race(managedExitPromises)\n\n await cleanupAndWait()\n\n if (!isExpectedManagedExit(firstExit, { stopping })) {\n throw createManagedProcessExitError(firstExit)\n }\n } finally {\n serverStartLock.release()\n }\n },\n },\n ],\n } as any)\n\n all.push({\n id: 'test',\n cli: [\n {\n command: 'integration',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runIntegrationTestsInEphemeralEnvironment(args)\n },\n },\n {\n command: 'ephemeral',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runEphemeralAppForQa(args)\n },\n },\n {\n command: 'interactive',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runInteractiveIntegrationInEphemeralEnvironment(args)\n },\n },\n {\n command: 'coverage',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runIntegrationCoverageReport(args)\n },\n },\n {\n command: 'spec-coverage',\n run: async (args: string[]) => {\n await (await lazyIntegration()).runIntegrationSpecCoverageReport(args)\n },\n },\n ],\n } as any)\n\n if (appCli.length) all.push({ id: 'app', cli: appCli } as any)\n\n const quietBanner = process.env.OM_CLI_QUIET === '1'\n const banner = '\uD83E\uDDE9 Open Mercato CLI'\n if (!quietBanner) {\n const header = [\n '\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557',\n `\u2551 ${banner.padEnd(21)}\u2551`,\n '\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D',\n ].join('\\n')\n console.log(header)\n }\n const pad = (s: string) => ` ${s}`\n\n if (!modName || modName === 'help' || modName === '--help' || modName === '-h') {\n console.log(pad('Usage: \u2728 mercato <module> <command> [args]'))\n const list = all\n .filter((m) => m.cli && m.cli.length)\n .map((m) => `\u2022 ${m.id}: ${m.cli!.map((c) => `\"${c.command}\"`).join(', ')}`)\n if (list.length) {\n console.log('\\n' + pad('Available:'))\n console.log(list.map(pad).join('\\n'))\n } else {\n console.log(pad('\uD83C\uDF00 No CLI commands available'))\n }\n return 0\n }\n\n const mod = all.find((m) => m.id === modName)\n if (!mod) {\n console.error(`\u274C Module not found: \"${modName}\"`)\n return 1\n }\n if (!mod.cli || mod.cli.length === 0) {\n console.error(`\uD83D\uDEAB Module \"${modName}\" has no CLI commands`)\n return 1\n }\n if (!cmdName) {\n console.log(pad(`Commands for \"${modName}\": ${mod.cli.map((c) => c.command).join(', ')}`))\n return 1\n }\n const cmd = mod.cli.find((c) => c.command === cmdName)\n if (!cmd) {\n console.error(`\uD83E\uDD14 Unknown command \"${cmdName}\". Available: ${mod.cli.map((c) => c.command).join(', ')}`)\n return 1\n }\n\n console.log('')\n const started = Date.now()\n const loggedArgs = modName === 'deploy' && cmdName === 'railway'\n ? (await import('./lib/deploy/railway/options')).redactRailwayCliArgs(rest)\n : rest\n console.log(`\uD83D\uDE80 Running ${modName}:${cmdName} ${loggedArgs.join(' ')}`)\n try {\n await cmd.run(rest)\n if (modName !== 'deploy' || cmdName !== 'railway') {\n const ms = Date.now() - started\n console.log(`\u23F1\uFE0F Done in ${ms}ms`)\n }\n return 0\n } catch (e: any) {\n console.error(`\uD83D\uDCA5 Failed: ${formatCliFailureMessage(modName, cmdName, e)}`)\n return 1\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["Client", "dbUrl", "mod"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/cli",
3
- "version": "0.6.6-develop.5523.1.e223ca1915",
3
+ "version": "0.6.6-develop.5531.1.ab1959dfae",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -59,8 +59,8 @@
59
59
  "@mikro-orm/decorators": "^7.1.4",
60
60
  "@mikro-orm/migrations": "^7.1.4",
61
61
  "@mikro-orm/postgresql": "^7.1.4",
62
- "@open-mercato/queue": "0.6.6-develop.5523.1.e223ca1915",
63
- "@open-mercato/shared": "0.6.6-develop.5523.1.e223ca1915",
62
+ "@open-mercato/queue": "0.6.6-develop.5531.1.ab1959dfae",
63
+ "@open-mercato/shared": "0.6.6-develop.5531.1.ab1959dfae",
64
64
  "cross-spawn": "^7.0.6",
65
65
  "pg": "8.21.0",
66
66
  "semver": "^7.8.3",
@@ -70,10 +70,10 @@
70
70
  "typescript": "^6.0.3"
71
71
  },
72
72
  "peerDependencies": {
73
- "@open-mercato/shared": "0.6.6-develop.5523.1.e223ca1915"
73
+ "@open-mercato/shared": "0.6.6-develop.5531.1.ab1959dfae"
74
74
  },
75
75
  "devDependencies": {
76
- "@open-mercato/shared": "0.6.6-develop.5523.1.e223ca1915",
76
+ "@open-mercato/shared": "0.6.6-develop.5531.1.ab1959dfae",
77
77
  "@types/jest": "^30.0.0",
78
78
  "jest": "^30.4.2",
79
79
  "ts-jest": "^29.4.11"
@@ -0,0 +1,135 @@
1
+ import type { ModuleWorker } from '@open-mercato/shared/modules/registry'
2
+ import { createPerJobWorkerHandler, type WorkerJobContainer } from '../worker-job-handler'
3
+
4
+ type FakeContainer = WorkerJobContainer & {
5
+ id: number
6
+ em: { clear: jest.Mock }
7
+ }
8
+
9
+ function makeContainerFactory() {
10
+ const containers: FakeContainer[] = []
11
+ let nextId = 0
12
+ const factory = jest.fn(async (): Promise<WorkerJobContainer> => {
13
+ const em = { clear: jest.fn() }
14
+ const container: FakeContainer = {
15
+ id: nextId++,
16
+ em,
17
+ resolve: <T = unknown>(name: string): T => {
18
+ if (name === 'em') return em as unknown as T
19
+ return undefined as unknown as T
20
+ },
21
+ }
22
+ containers.push(container)
23
+ return container
24
+ })
25
+ return { factory, containers }
26
+ }
27
+
28
+ function makeWorker(id: string, handler: ModuleWorker['handler']): ModuleWorker {
29
+ return { id, queue: 'test', concurrency: 1, handler }
30
+ }
31
+
32
+ const baseCtx = { jobId: 'job-1', attemptNumber: 1, queueName: 'test' }
33
+
34
+ describe('createPerJobWorkerHandler', () => {
35
+ it('creates a fresh container for every job invocation', async () => {
36
+ const { factory } = makeContainerFactory()
37
+ const worker = makeWorker('w', jest.fn())
38
+ const handler = createPerJobWorkerHandler([worker], factory)
39
+
40
+ await handler({ id: 'a' }, { ...baseCtx, jobId: 'a' })
41
+ await handler({ id: 'b' }, { ...baseCtx, jobId: 'b' })
42
+
43
+ expect(factory).toHaveBeenCalledTimes(2)
44
+ })
45
+
46
+ it('passes each worker a resolve bound to that job container', async () => {
47
+ const { factory, containers } = makeContainerFactory()
48
+ const seenEms: unknown[] = []
49
+ const worker = makeWorker('w', (_job, ctx) => {
50
+ const resolve = (ctx as { resolve: (name: string) => unknown }).resolve
51
+ seenEms.push(resolve('em'))
52
+ })
53
+ const handler = createPerJobWorkerHandler([worker], factory)
54
+
55
+ await handler({ id: 'a' }, { ...baseCtx, jobId: 'a' })
56
+ await handler({ id: 'b' }, { ...baseCtx, jobId: 'b' })
57
+
58
+ expect(seenEms).toHaveLength(2)
59
+ expect(seenEms[0]).toBe(containers[0].em)
60
+ expect(seenEms[1]).toBe(containers[1].em)
61
+ expect(seenEms[0]).not.toBe(seenEms[1])
62
+ })
63
+
64
+ it('isolates concurrent jobs in distinct containers (no shared EntityManager)', async () => {
65
+ const { factory, containers } = makeContainerFactory()
66
+ let release: (() => void) | null = null
67
+ const gate = new Promise<void>((resolve) => {
68
+ release = resolve
69
+ })
70
+ const resolvedEms: unknown[] = []
71
+ let firstEntered = false
72
+ const worker = makeWorker('w', async (_job, ctx) => {
73
+ const resolve = (ctx as { resolve: (name: string) => unknown }).resolve
74
+ resolvedEms.push(resolve('em'))
75
+ if (!firstEntered) {
76
+ firstEntered = true
77
+ // Hold the first job open so the second job starts concurrently.
78
+ await gate
79
+ }
80
+ })
81
+ const handler = createPerJobWorkerHandler([worker], factory)
82
+
83
+ const first = handler({ id: 'a' }, { ...baseCtx, jobId: 'a' })
84
+ const second = handler({ id: 'b' }, { ...baseCtx, jobId: 'b' })
85
+ release?.()
86
+ await Promise.all([first, second])
87
+
88
+ expect(factory).toHaveBeenCalledTimes(2)
89
+ expect(resolvedEms[0]).toBe(containers[0].em)
90
+ expect(resolvedEms[1]).toBe(containers[1].em)
91
+ expect(resolvedEms[0]).not.toBe(resolvedEms[1])
92
+ })
93
+
94
+ it('runs every worker for the queue against the same per-job container', async () => {
95
+ const { factory, containers } = makeContainerFactory()
96
+ const seen: unknown[] = []
97
+ const record = (_job: unknown, ctx: unknown) => {
98
+ seen.push((ctx as { resolve: (name: string) => unknown }).resolve('em'))
99
+ }
100
+ const handler = createPerJobWorkerHandler(
101
+ [makeWorker('w1', record), makeWorker('w2', record)],
102
+ factory,
103
+ )
104
+
105
+ await handler({ id: 'a' }, baseCtx)
106
+
107
+ expect(factory).toHaveBeenCalledTimes(1)
108
+ expect(seen).toHaveLength(2)
109
+ expect(seen[0]).toBe(containers[0].em)
110
+ expect(seen[1]).toBe(containers[0].em)
111
+ })
112
+
113
+ it('clears the job container EntityManager after the job completes', async () => {
114
+ const { factory, containers } = makeContainerFactory()
115
+ const handler = createPerJobWorkerHandler([makeWorker('w', jest.fn())], factory)
116
+
117
+ await handler({ id: 'a' }, baseCtx)
118
+
119
+ expect(containers[0].em.clear).toHaveBeenCalledTimes(1)
120
+ })
121
+
122
+ it('clears the EntityManager and rethrows when a worker fails', async () => {
123
+ const { factory, containers } = makeContainerFactory()
124
+ const boom = new Error('worker failed')
125
+ const handler = createPerJobWorkerHandler(
126
+ [makeWorker('w', () => {
127
+ throw boom
128
+ })],
129
+ factory,
130
+ )
131
+
132
+ await expect(handler({ id: 'a' }, baseCtx)).rejects.toBe(boom)
133
+ expect(containers[0].em.clear).toHaveBeenCalledTimes(1)
134
+ })
135
+ })
@@ -0,0 +1,45 @@
1
+ import type { JobContext, JobHandler } from '@open-mercato/queue'
2
+ import type { ModuleWorker } from '@open-mercato/shared/modules/registry'
3
+
4
+ export type WorkerJobContainer = {
5
+ resolve: <T = unknown>(name: string) => T
6
+ }
7
+
8
+ export type WorkerJobContainerFactory = () => Promise<WorkerJobContainer>
9
+
10
+ type ClearableEntityManager = {
11
+ clear?: () => void
12
+ }
13
+
14
+ /**
15
+ * Builds a queue job handler that isolates every job in its own request
16
+ * container, instead of sharing a single process-wide `EntityManager` fork
17
+ * across all concurrent jobs.
18
+ *
19
+ * Under the async (BullMQ) strategy jobs run with real concurrency, so a
20
+ * shared EM would interleave unit-of-work flushes between unrelated jobs and
21
+ * never release its identity map. Creating one container per job removes both
22
+ * the cross-job flush race and the unbounded identity-map growth, while
23
+ * keeping the `ctx.resolve` contract and DI keys unchanged. See issue #2970.
24
+ */
25
+ export function createPerJobWorkerHandler(
26
+ workers: ModuleWorker[],
27
+ createContainer: WorkerJobContainerFactory,
28
+ ): JobHandler {
29
+ return async (job, ctx: JobContext) => {
30
+ const container = await createContainer()
31
+ try {
32
+ for (const worker of workers) {
33
+ await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })
34
+ }
35
+ } finally {
36
+ try {
37
+ const em = container.resolve('em') as ClearableEntityManager | null
38
+ em?.clear?.()
39
+ } catch {
40
+ // Best-effort: clearing the identity map is a memory optimization and
41
+ // must never mask a job's own outcome.
42
+ }
43
+ }
44
+ }
45
+ }
package/src/mercato.ts CHANGED
@@ -15,6 +15,7 @@ import {
15
15
  resolveLazyRestart,
16
16
  } from './lib/auto-spawn-workers'
17
17
  import { startLazyWorkerSupervisor } from './lib/queue-worker-supervisor'
18
+ import { createPerJobWorkerHandler } from './lib/worker-job-handler'
18
19
  import {
19
20
  resolveAutoSpawnSchedulerMode,
20
21
  resolveLazySchedulerPollMs,
@@ -1519,7 +1520,6 @@ export async function run(argv = process.argv) {
1519
1520
  }
1520
1521
 
1521
1522
  const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')
1522
- const container = await createRequestContainer()
1523
1523
  console.log(`[worker] Starting workers for all queues: ${discoveredQueues.join(', ')}`)
1524
1524
 
1525
1525
  // Start all queue workers in background mode
@@ -1535,11 +1535,7 @@ export async function run(argv = process.argv) {
1535
1535
  connection: queueRedisUrl ? { url: queueRedisUrl } : undefined,
1536
1536
  concurrency,
1537
1537
  background: true,
1538
- handler: async (job, ctx) => {
1539
- for (const worker of queueWorkers) {
1540
- await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })
1541
- }
1542
- },
1538
+ handler: createPerJobWorkerHandler(queueWorkers, createRequestContainer),
1543
1539
  })
1544
1540
  })
1545
1541
 
@@ -1556,7 +1552,6 @@ export async function run(argv = process.argv) {
1556
1552
  if (queueWorkers.length > 0) {
1557
1553
  // Use discovered workers
1558
1554
  const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')
1559
- const container = await createRequestContainer()
1560
1555
  const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1)
1561
1556
 
1562
1557
  console.log(`[worker] Found ${queueWorkers.length} worker(s) for queue "${queueName}"`)
@@ -1566,11 +1561,7 @@ export async function run(argv = process.argv) {
1566
1561
  queueName: queueName!,
1567
1562
  connection: queueRedisUrl ? { url: queueRedisUrl } : undefined,
1568
1563
  concurrency,
1569
- handler: async (job, ctx) => {
1570
- for (const worker of queueWorkers) {
1571
- await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })
1572
- }
1573
- },
1564
+ handler: createPerJobWorkerHandler(queueWorkers, createRequestContainer),
1574
1565
  })
1575
1566
  } else {
1576
1567
  console.error(`No workers found for queue "${queueName}"`)