| |
| |
| |
| |
| |
| |
| import * as moduleAlias from 'module-alias'; |
| import path from 'path'; |
|
|
| |
| 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(); |
|
|
| |
| app.use(helmet()); |
| app.use(cors({ origin: process.env['WORKER_ORIGIN'] ?? '*' })); |
| app.use(express.json({ limit: '4mb' })); |
|
|
| |
| app.use('/process', internalAuthMiddleware); |
|
|
| |
| app.use('/process/generate', generateRoute); |
| app.use('/process/validate', validateRoute); |
| app.use('/process/simulate', simulateRoute); |
|
|
| |
| 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']), |
| }, |
| }); |
| }); |
|
|
| |
| 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; |
|
|