File size: 4,480 Bytes
dd480ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**
 * 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;