guanghulab/server/app/server.js

112 lines
3.4 KiB
JavaScript

#!/usr/bin/env node
/**
* ═══════════════════════════════════════════════════════════
* 🏛️ 铸渊主权服务器 · Zhuyuan Sovereign Server
* ═══════════════════════════════════════════════════════════
*
* 编号: ZY-SVR-002
* 端口: 3800
* 守护: 铸渊 · ICE-GL-ZY001
* 版权: 国作登字-2026-A-00037559
*
* 新增Agent训练API
*/
'use strict';
const express = require('express');
const cors = require('cors');
const fs = require('fs');
const path = require('path');
const os = require('os');
const https = require('https');
const { execSync } = require('child_process');
const emailAuth = require('./modules/email-auth');
const oauth = require('./modules/oauth-providers');
const agentHandshake = require('./modules/agent-handshake');
const agentTraining = require('./modules/agent-training');
// ─── 常量 ───
const PORT = process.env.PORT || 3800;
const IS_DEV = process.env.NODE_ENV !== 'production';
const ZY_BASE_URL = process.env.ZY_BASE_URL || `http://localhost:${PORT}`;
// ─── Express 应用 ───
const app = express();
app.use(cors({
origin: IS_DEV ? '*' : ZY_BASE_URL,
credentials: true
}));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// ─── 健康检查 ───
app.get('/api/health', (req, res) => {
res.json({
status: 'healthy',
version: '1.0.0',
server: os.hostname(),
timestamp: new Date().toISOString()
});
});
// ─── 原有路由保持不变 ───
// ─── 新增Agent训练API ───
app.post('/api/agent/training/start', async (req, res) => {
try {
const { agentId, token } = req.body;
if (!agentId || !token) {
return res.status(400).json({ error: true, message: '缺少必要参数' });
}
const result = agentTraining.startTraining(agentId, token);
res.json(result);
} catch (err) {
res.status(403).json({ error: true, message: err.message });
}
});
app.post('/api/agent/training/stop', async (req, res) => {
try {
const { agentId, token } = req.body;
if (!agentId || !token) {
return res.status(400).json({ error: true, message: '缺少必要参数' });
}
const result = agentTraining.stopTraining(agentId, token);
res.json(result);
} catch (err) {
res.status(403).json({ error: true, message: err.message });
}
});
app.get('/api/agent/training/status', async (req, res) => {
try {
const { agentId, token } = req.query;
if (!agentId || !token) {
return res.status(400).json({ error: true, message: '缺少必要参数' });
}
if (!emailAuth.validateSession(token).valid) {
return res.status(403).json({ error: true, message: '无效的会话令牌' });
}
// 从COS获取训练状态
const { Body } = await cos.getObject({
Bucket: 'agent-models-1250000000',
Region: 'ap-guangzhou',
Key: `status/${agentId}.json`
}).catch(() => ({}));
const status = Body ? JSON.parse(Body.toString()) : { training: false };
res.json({ success: true, ...status });
} catch (err) {
res.status(500).json({ error: true, message: err.message });
}
});
// 启动服务器
app.listen(PORT, () => {
console.log(`铸渊主权服务器运行中 · 端口 ${PORT} · ${new Date().toISOString()}`);
});