/** * Simulator Service - Main Entry Point — UPGRADED * External Node.js compute service (Express.js) * Handles all CPU-intensive AI orchestration logic offloaded from Cloudflare Worker * Provider-agnostic LLM Gateway — NO direct OpenAI SDK dependency */ import * as moduleAlias from 'module-alias'; import path from 'path'; // Register module aliases for production moduleAlias.addAliases({ '@wfo/core': path.join(__dirname, '../../../core'), '@wfo/integrations': path.join(__dirname, '../../../integrations'), '@wfo/validation': path.join(__dirname, '../../../validation'), '@wfo/observability': path.join(__dirname, '../../../observability'), '@wfo/knowledge': path.join(__dirname, '../../../knowledge'), '@wfo/config': path.join(__dirname, '../../../config'), '@wfo/apps/worker': path.join(__dirname, '../../../apps/worker'), }); import express from 'express'; import helmet from 'helmet'; import cors from 'cors'; import { pino } from 'pino'; import 'dotenv/config'; import { internalAuthMiddleware } from './middleware/internalAuth'; import { generateRoute } from './routes/generate'; import { validateRoute } from './routes/validate'; import { simulateRoute } from './routes/simulate'; export const logger = pino({ transport: { target: 'pino-pretty', options: { colorize: true }, }, level: process.env['LOG_LEVEL'] ?? 'info', }); const app: express.Application = express(); // ─── Security Middleware ────────────────────────────────────────────────────── app.use(helmet()); app.use(cors({ origin: process.env['WORKER_ORIGIN'] ?? '*' })); app.use(express.json({ limit: '4mb' })); // ─── Internal Auth (shared secret with CF Worker) ──────────────────────────── app.use('/process', internalAuthMiddleware); // ─── Routes ─────────────────────────────────────────────────────────────────── app.use('/process/generate', generateRoute); app.use('/process/validate', validateRoute); app.use('/process/simulate', simulateRoute); // ─── Health (public) ────────────────────────────────────────────────────────── app.get('/health', (_req, res) => { res.json({ status: 'ok', service: 'wfo-simulator', version: '2.0.0', uptime: process.uptime(), capabilities: { llmGateway: 'provider-agnostic (openai | anthropic | openai-compatible | custom)', swarmOrchestration: 'parallel multi-agent workflow design (up to 5 candidates)', selfHealing: 'automatic validation fix + AI-assisted healing', webhookAutoBind: 'auto trigger detection and configuration', memorySystem: 'in-process pattern learning and anti-pattern prevention', nodeRegistry: `strict — ${Object.keys(require('./knowledge/nodeRegistry').N8N_NODE_REGISTRY).length} verified node types`, }, config: { llmProvider: process.env['LLM_PROVIDER'] ?? 'openai', llmModel: process.env['LLM_MODEL'] ?? 'gpt-4o', llmGatewayUrl: process.env['LLM_GATEWAY_URL'] ?? 'https://api.openai.com/v1', hasFallback: !!(process.env['LLM_FALLBACK_URL'] && process.env['LLM_FALLBACK_KEY']), }, }); }); // ─── Global Error Handler ───────────────────────────────────────────────────── app.use((err: Error, _req: express.Request, res: express.Response, _next: express.NextFunction) => { logger.error({ err }, 'Unhandled error'); res.status(500).json({ success: false, error: err.message }); }); const PORT = Number(process.env["PORT"] ?? 7860); app.listen(PORT, () => { logger.info(`[Simulator v2.0] Running on port ${PORT}`); logger.info(`[Simulator] LLM provider: ${process.env['LLM_PROVIDER'] ?? 'openai'}`); logger.info(`[Simulator] LLM model: ${process.env['LLM_MODEL'] ?? 'gpt-4o'}`); logger.info(`[Simulator] Swarm: enabled (up to 5 parallel designs)`); logger.info(`[Simulator] Self-Healing: enabled`); logger.info(`[Simulator] Memory: enabled`); logger.info(`[Simulator] Webhook Auto-Bind: enabled`); }); export default app;