PYAE1994's picture
Upload folder using huggingface_hub
dd480ef verified
/**
* 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;