@myassis/gateway 1.0.18 → 1.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.js +27 -19
- package/dist/cli.js +18 -5
- package/dist/config/index.js +34 -11
- package/dist/index.js +1 -2
- package/dist/main.js +76 -71
- package/dist/middleware/auth.js +9 -5
- package/dist/middleware/errorHandler.js +9 -4
- package/dist/routes/agent.js +39 -37
- package/dist/routes/auth.js +32 -30
- package/dist/routes/chat.js +7 -5
- package/dist/routes/config.js +5 -3
- package/dist/routes/models.js +28 -23
- package/dist/routes/service.js +29 -24
- package/dist/routes/settings.js +26 -21
- package/dist/routes/skillHub.js +22 -17
- package/dist/routes/skills.js +25 -20
- package/dist/routes/tasks.js +24 -19
- package/dist/routes/upload.js +24 -17
- package/dist/routes/version.js +20 -19
- package/dist/services/HMSPushService.js +4 -1
- package/dist/services/LocalTaskService.js +12 -9
- package/dist/services/NotificationService.js +14 -11
- package/dist/services/ServiceManager.js +77 -65
- package/dist/services/TaskSchedulerService.js +33 -30
- package/dist/services/TaskService.js +27 -24
- package/dist/services/WebSocketService.js +14 -11
- package/dist/services/agent/Agent.js +13 -9
- package/dist/services/agent/AgentManager.js +32 -24
- package/dist/services/agent/AgentStore.js +7 -3
- package/dist/services/dataService.js +72 -69
- package/dist/services/index.js +25 -9
- package/dist/services/llm/LLMClient.js +17 -9
- package/dist/services/memory/MemoryManager.js +22 -18
- package/dist/services/model/ModelCapabilities.js +11 -7
- package/dist/services/model/index.js +17 -1
- package/dist/services/models.js +5 -1
- package/dist/services/session/MigrationManager.js +18 -11
- package/dist/services/session/Session.js +33 -29
- package/dist/services/session/SessionManager.js +26 -21
- package/dist/services/session/SessionStore.js +32 -25
- package/dist/services/session/index.js +8 -2
- package/dist/services/skills.js +4 -1
- package/dist/services/systemPrompt.js +23 -16
- package/dist/services/task/PushTokenStore.js +9 -5
- package/dist/services/task/TaskStore.js +10 -6
- package/dist/services/tools/calculator.js +4 -1
- package/dist/services/tools/edit.js +16 -10
- package/dist/services/tools/exec.js +25 -16
- package/dist/services/tools/fetch.js +30 -4
- package/dist/services/tools/file.js +41 -35
- package/dist/services/tools/index.js +44 -24
- package/dist/services/tools/keyboard.js +41 -38
- package/dist/services/tools/model.js +12 -9
- package/dist/services/tools/mouse.js +12 -9
- package/dist/services/tools/screenshot.js +9 -3
- package/dist/services/tools/search.js +34 -4
- package/dist/services/tools/sessionsSpawn.js +11 -8
- package/dist/services/tools/skill.js +19 -16
- package/dist/services/tools/task.js +12 -9
- package/dist/services/tools/types.js +2 -1
- package/dist/services/tools/webFetch.js +34 -4
- package/dist/stores/authStore.js +25 -19
- package/dist/stores/index.js +9 -3
- package/dist/stores/memoryStore.js +5 -2
- package/dist/stores/persistStore.js +20 -14
- package/package.json +11 -20
package/dist/api/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Gateway 统一 API 调用模块
|
|
3
4
|
* 负责与后端 Server 通信
|
|
@@ -8,19 +9,25 @@
|
|
|
8
9
|
* - /api/v1/data/* - 用户数据路由 (models, skills, tasks, settings)
|
|
9
10
|
* - /api/v1/skill-hubs/* - 技能库路由
|
|
10
11
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.settingsApi = exports.tasksApi = exports.modelsApi = exports.skillHubApi = exports.skillsApi = exports.authApi = exports.ApiError = exports.runWithToken = void 0;
|
|
17
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
18
|
+
const async_hooks_1 = require("async_hooks");
|
|
13
19
|
// 多用户模式请求上下文:存储当前请求的 token
|
|
14
|
-
const requestContext = new AsyncLocalStorage();
|
|
15
|
-
|
|
20
|
+
const requestContext = new async_hooks_1.AsyncLocalStorage();
|
|
21
|
+
function runWithToken(token, fn) {
|
|
16
22
|
return requestContext.run({ token }, fn);
|
|
17
23
|
}
|
|
24
|
+
exports.runWithToken = runWithToken;
|
|
18
25
|
// Server 服务地址(从环境变量读取)
|
|
19
26
|
const SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://localhost:3000';
|
|
20
27
|
// 签名密钥(用于请求签名)
|
|
21
28
|
const SIGN_KEY = process.env.API_SIGN_KEY || 'gateway-secret-key';
|
|
22
29
|
// API 响应错误类
|
|
23
|
-
|
|
30
|
+
class ApiError extends Error {
|
|
24
31
|
status;
|
|
25
32
|
code;
|
|
26
33
|
constructor(message, status = 500, code) {
|
|
@@ -30,6 +37,7 @@ export class ApiError extends Error {
|
|
|
30
37
|
this.code = code;
|
|
31
38
|
}
|
|
32
39
|
}
|
|
40
|
+
exports.ApiError = ApiError;
|
|
33
41
|
// 生成签名
|
|
34
42
|
function generateSignature(params, timestamp) {
|
|
35
43
|
const sortedParams = Object.keys(params)
|
|
@@ -37,7 +45,7 @@ function generateSignature(params, timestamp) {
|
|
|
37
45
|
.map(key => `${key}=${params[key]}`)
|
|
38
46
|
.join('&');
|
|
39
47
|
const signString = `${sortedParams}×tamp=${timestamp}&key=${SIGN_KEY}`;
|
|
40
|
-
return
|
|
48
|
+
return crypto_1.default.createHash('sha256').update(signString).digest('hex');
|
|
41
49
|
}
|
|
42
50
|
// 基础请求方法工厂
|
|
43
51
|
function createRequest(prefix) {
|
|
@@ -109,7 +117,7 @@ function skillHubRequest(path, options) {
|
|
|
109
117
|
return _skillHubRequest(path, options || {});
|
|
110
118
|
}
|
|
111
119
|
// ============ 认证 API ============
|
|
112
|
-
|
|
120
|
+
exports.authApi = {
|
|
113
121
|
login: (data) => authRequest('/login', { method: 'POST', body: data, skipAuth: true }),
|
|
114
122
|
register: (data) => authRequest('/register', { method: 'POST', body: data, skipAuth: true }),
|
|
115
123
|
logout: (token) => authRequest('/logout', { method: 'POST', body: {}, token }),
|
|
@@ -120,7 +128,7 @@ export const authApi = {
|
|
|
120
128
|
deleteAccount: (data, token) => authRequest('/account/delete', { method: 'POST', body: data, token }),
|
|
121
129
|
};
|
|
122
130
|
// ============ 技能 API (data) ============
|
|
123
|
-
|
|
131
|
+
exports.skillsApi = {
|
|
124
132
|
list: (token) => dataRequest('/skills?brief=true', { token }),
|
|
125
133
|
get: (skillId, token) => dataRequest(`/skills/${skillId}`, { token }),
|
|
126
134
|
install: (data, token) => dataRequest('/skills', { method: 'POST', body: data, token }),
|
|
@@ -132,7 +140,7 @@ export const skillsApi = {
|
|
|
132
140
|
parse: (data, token) => dataRequest('/skills/parse', { method: 'POST', body: data, token }),
|
|
133
141
|
};
|
|
134
142
|
// ============ 技能库 API (skill-hubs) ============
|
|
135
|
-
|
|
143
|
+
exports.skillHubApi = {
|
|
136
144
|
list: (params, token) => {
|
|
137
145
|
const queryParams = {};
|
|
138
146
|
if (params?.page)
|
|
@@ -156,7 +164,7 @@ export const skillHubApi = {
|
|
|
156
164
|
use: (hubId, token) => skillHubRequest(`/${hubId}/use`, { method: 'POST', body: {}, token }),
|
|
157
165
|
};
|
|
158
166
|
// ============ 模型 API (data) ============
|
|
159
|
-
|
|
167
|
+
exports.modelsApi = {
|
|
160
168
|
list: (token) => dataRequest('/models', { token }),
|
|
161
169
|
get: (modelId, token) => dataRequest(`/models/${modelId}`, { token }),
|
|
162
170
|
create: (data, token) => dataRequest('/models', { method: 'POST', body: data, token }),
|
|
@@ -165,7 +173,7 @@ export const modelsApi = {
|
|
|
165
173
|
setPrimary: (modelId, token) => dataRequest(`/models/${modelId}/primary`, { method: 'POST', body: {}, token }),
|
|
166
174
|
};
|
|
167
175
|
// ============ 任务 API (data) ============
|
|
168
|
-
|
|
176
|
+
exports.tasksApi = {
|
|
169
177
|
list: (params, token) => dataRequest('/tasks', { params, token }),
|
|
170
178
|
get: (taskId, token) => dataRequest(`/tasks/${taskId}`, { token }),
|
|
171
179
|
create: (data, token) => dataRequest('/tasks', { method: 'POST', body: data, token }),
|
|
@@ -178,15 +186,15 @@ export const tasksApi = {
|
|
|
178
186
|
resetSession: (token) => dataRequest('/reset-session', { method: 'POST', body: {}, token }),
|
|
179
187
|
};
|
|
180
188
|
// ============ 设置 API (data) ============
|
|
181
|
-
|
|
189
|
+
exports.settingsApi = {
|
|
182
190
|
get: (token) => dataRequest('/settings', { token }),
|
|
183
191
|
update: (data, token) => dataRequest('/settings', { method: 'PUT', body: data, token }),
|
|
184
192
|
};
|
|
185
|
-
|
|
186
|
-
authApi,
|
|
187
|
-
skillsApi,
|
|
188
|
-
skillHubApi,
|
|
189
|
-
modelsApi,
|
|
190
|
-
tasksApi,
|
|
191
|
-
settingsApi
|
|
193
|
+
exports.default = {
|
|
194
|
+
authApi: exports.authApi,
|
|
195
|
+
skillsApi: exports.skillsApi,
|
|
196
|
+
skillHubApi: exports.skillHubApi,
|
|
197
|
+
modelsApi: exports.modelsApi,
|
|
198
|
+
tasksApi: exports.tasksApi,
|
|
199
|
+
settingsApi: exports.settingsApi
|
|
192
200
|
};
|
package/dist/cli.js
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
7
|
// ─── CLI 快速入口(在导入任何模块之前处理参数)─────────────────
|
|
3
|
-
|
|
4
|
-
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
5
10
|
const args = process.argv.slice(2);
|
|
6
11
|
// 快速响应命令(无需加载任何模块)
|
|
7
12
|
if (args.includes('--version') || args.includes('-v')) {
|
|
8
13
|
try {
|
|
9
|
-
const pkgPath =
|
|
10
|
-
const pkg = JSON.parse(
|
|
14
|
+
const pkgPath = path_1.default.join(__dirname, '..', 'package.json');
|
|
15
|
+
const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath, 'utf-8'));
|
|
11
16
|
console.log(pkg.version);
|
|
12
17
|
}
|
|
13
18
|
catch {
|
|
@@ -37,8 +42,16 @@ CORS 管理命令:
|
|
|
37
42
|
其他:
|
|
38
43
|
--version, -v 显示版本号
|
|
39
44
|
--help, -h 显示本帮助信息
|
|
45
|
+
--verbose 显示运行时详细日志
|
|
40
46
|
`);
|
|
41
47
|
process.exit(0);
|
|
42
48
|
}
|
|
49
|
+
// 静默模式:非启动服务类命令(install/uninstall/status/start/stop/restart/update)
|
|
50
|
+
// 默认静默日志,除非传 --verbose
|
|
51
|
+
const quietCommands = ['install', 'uninstall', 'status', 'start', 'stop', 'restart', 'update'];
|
|
52
|
+
const command = args.find(a => !a.startsWith('-'));
|
|
53
|
+
if (command && quietCommands.includes(command) && !args.includes('--verbose')) {
|
|
54
|
+
process.env.LOG_LEVEL = 'error';
|
|
55
|
+
}
|
|
43
56
|
// 需要加载模块的命令,导入主程序
|
|
44
|
-
|
|
57
|
+
require('./main.js');
|
package/dist/config/index.js
CHANGED
|
@@ -1,11 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.appConfig = void 0;
|
|
27
|
+
const shared_1 = require("@myassis/shared");
|
|
28
|
+
const logger = (0, shared_1.getLogger)('GatewayConfig');
|
|
29
|
+
const dotenv_1 = require("dotenv");
|
|
30
|
+
const path = __importStar(require("path"));
|
|
31
|
+
const fs = __importStar(require("fs"));
|
|
9
32
|
/**
|
|
10
33
|
* 获取包安装根目录(npm install -g 后的包目录)
|
|
11
34
|
* dist/config/index.js → 上三级 = 包根目录
|
|
@@ -28,7 +51,7 @@ const getEnvPath = () => {
|
|
|
28
51
|
};
|
|
29
52
|
const envPath = getEnvPath();
|
|
30
53
|
if (envPath) {
|
|
31
|
-
|
|
54
|
+
(0, dotenv_1.config)({ path: envPath });
|
|
32
55
|
logger.info(`已加载环境变量文件: ${envPath}`);
|
|
33
56
|
}
|
|
34
57
|
else {
|
|
@@ -38,7 +61,7 @@ else {
|
|
|
38
61
|
const isPackaged = !!process.pkg;
|
|
39
62
|
const defaultEnv = isPackaged ? 'production' : 'development';
|
|
40
63
|
// 环境变量配置
|
|
41
|
-
|
|
64
|
+
exports.appConfig = {
|
|
42
65
|
serverBaseUrl: process.env.SERVER_BASE_URL || 'http://localhost:9091',
|
|
43
66
|
port: parseInt(process.env.PORT || '3001', 10),
|
|
44
67
|
clientUrl: process.env.CLIENT_URL || 'http://localhost:3000',
|
|
@@ -46,4 +69,4 @@ export const appConfig = {
|
|
|
46
69
|
messageKeep: 4,
|
|
47
70
|
appName: '我的助手'
|
|
48
71
|
};
|
|
49
|
-
|
|
72
|
+
exports.default = exports.appConfig;
|
package/dist/index.js
CHANGED
package/dist/main.js
CHANGED
|
@@ -1,30 +1,35 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
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
|
-
const
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const cors_1 = __importDefault(require("cors"));
|
|
9
|
+
const helmet_1 = __importDefault(require("helmet"));
|
|
10
|
+
const compression_1 = __importDefault(require("compression"));
|
|
11
|
+
const http_1 = __importDefault(require("http"));
|
|
12
|
+
const index_js_1 = require("./config/index.js");
|
|
13
|
+
const shared_1 = require("@myassis/shared");
|
|
14
|
+
const auth_js_1 = __importDefault(require("./routes/auth.js"));
|
|
15
|
+
const agent_js_1 = __importDefault(require("./routes/agent.js"));
|
|
16
|
+
const models_js_1 = __importDefault(require("./routes/models.js"));
|
|
17
|
+
const skills_js_1 = __importDefault(require("./routes/skills.js"));
|
|
18
|
+
const skillHub_js_1 = __importDefault(require("./routes/skillHub.js"));
|
|
19
|
+
const chat_js_1 = __importDefault(require("./routes/chat.js"));
|
|
20
|
+
const config_js_1 = __importDefault(require("./routes/config.js"));
|
|
21
|
+
const settings_js_1 = __importDefault(require("./routes/settings.js"));
|
|
22
|
+
const service_js_1 = __importDefault(require("./routes/service.js"));
|
|
23
|
+
const tasks_js_1 = __importDefault(require("./routes/tasks.js"));
|
|
24
|
+
const upload_js_1 = __importDefault(require("./routes/upload.js"));
|
|
25
|
+
const version_js_1 = __importDefault(require("./routes/version.js"));
|
|
26
|
+
const errorHandler_js_1 = require("./middleware/errorHandler.js");
|
|
27
|
+
const index_js_2 = require("./stores/index.js");
|
|
28
|
+
const persistStore_js_1 = require("./stores/persistStore.js");
|
|
29
|
+
const WebSocketService_js_1 = require("./services/WebSocketService.js");
|
|
30
|
+
const TaskSchedulerService_js_1 = require("./services/TaskSchedulerService.js");
|
|
31
|
+
const ServiceManager_js_1 = require("./services/ServiceManager.js");
|
|
32
|
+
const logger = (0, shared_1.getLogger)('index');
|
|
28
33
|
// ─── CLI 模式 ─────────────────────────────────────────
|
|
29
34
|
// gateway install | start | stop | uninstall | status | update
|
|
30
35
|
const cliCommand = process.argv[2];
|
|
@@ -33,7 +38,7 @@ if (cliCommand) {
|
|
|
33
38
|
try {
|
|
34
39
|
let exitCode = 0;
|
|
35
40
|
if (cliCommand === 'status') {
|
|
36
|
-
const info = await getServiceInfo();
|
|
41
|
+
const info = await (0, ServiceManager_js_1.getServiceInfo)();
|
|
37
42
|
console.log(`服务名称: ${info.displayName}`);
|
|
38
43
|
console.log(`平台: ${info.platform}`);
|
|
39
44
|
console.log(`已安装: ${info.installed ? '是' : '否'}`);
|
|
@@ -47,7 +52,7 @@ if (cliCommand) {
|
|
|
47
52
|
console.log('用法: gateway addCors <域名>');
|
|
48
53
|
process.exit(1);
|
|
49
54
|
}
|
|
50
|
-
const added = persistStore.addCorsDomain(domain);
|
|
55
|
+
const added = persistStore_js_1.persistStore.addCorsDomain(domain);
|
|
51
56
|
if (added) {
|
|
52
57
|
console.log(`✅ 已添加 CORS 域名: ${domain}`);
|
|
53
58
|
}
|
|
@@ -61,7 +66,7 @@ if (cliCommand) {
|
|
|
61
66
|
console.log('用法: gateway removeCors <域名>');
|
|
62
67
|
process.exit(1);
|
|
63
68
|
}
|
|
64
|
-
const removed = persistStore.removeCorsDomain(domain);
|
|
69
|
+
const removed = persistStore_js_1.persistStore.removeCorsDomain(domain);
|
|
65
70
|
if (removed) {
|
|
66
71
|
console.log(`✅ 已移除 CORS 域名: ${domain}`);
|
|
67
72
|
}
|
|
@@ -70,7 +75,7 @@ if (cliCommand) {
|
|
|
70
75
|
}
|
|
71
76
|
}
|
|
72
77
|
else if (cliCommand === 'listCors') {
|
|
73
|
-
const domains = persistStore.getCorsDomains();
|
|
78
|
+
const domains = persistStore_js_1.persistStore.getCorsDomains();
|
|
74
79
|
if (domains.length === 0) {
|
|
75
80
|
console.log('暂无自定义 CORS 域名(仅使用内置内网规则)');
|
|
76
81
|
}
|
|
@@ -101,7 +106,7 @@ CORS 管理命令:
|
|
|
101
106
|
其他:
|
|
102
107
|
--help, -h 显示本帮助信息
|
|
103
108
|
`);
|
|
104
|
-
const domains = persistStore.getCorsDomains();
|
|
109
|
+
const domains = persistStore_js_1.persistStore.getCorsDomains();
|
|
105
110
|
if (domains.length === 0) {
|
|
106
111
|
console.log('暂无自定义 CORS 域名(仅使用内置内网规则)');
|
|
107
112
|
}
|
|
@@ -112,12 +117,12 @@ CORS 管理命令:
|
|
|
112
117
|
}
|
|
113
118
|
else {
|
|
114
119
|
const fnMap = {
|
|
115
|
-
install: installService,
|
|
116
|
-
uninstall: uninstallService,
|
|
117
|
-
start: startService,
|
|
118
|
-
stop: stopService,
|
|
119
|
-
restart: restartService,
|
|
120
|
-
update: updateService,
|
|
120
|
+
install: ServiceManager_js_1.installService,
|
|
121
|
+
uninstall: ServiceManager_js_1.uninstallService,
|
|
122
|
+
start: ServiceManager_js_1.startService,
|
|
123
|
+
stop: ServiceManager_js_1.stopService,
|
|
124
|
+
restart: ServiceManager_js_1.restartService,
|
|
125
|
+
update: ServiceManager_js_1.updateService,
|
|
121
126
|
};
|
|
122
127
|
const handler = fnMap[cliCommand];
|
|
123
128
|
if (!handler) {
|
|
@@ -141,10 +146,10 @@ CORS 管理命令:
|
|
|
141
146
|
}
|
|
142
147
|
else {
|
|
143
148
|
// ─── HTTP Server 模式 ────────────────────────────────────
|
|
144
|
-
const app =
|
|
149
|
+
const app = (0, express_1.default)();
|
|
145
150
|
// Middleware
|
|
146
|
-
app.use(
|
|
147
|
-
app.use(
|
|
151
|
+
app.use((0, helmet_1.default)());
|
|
152
|
+
app.use((0, compression_1.default)());
|
|
148
153
|
// CORS 配置 - 允许所有内网地址
|
|
149
154
|
const corsOptions = {
|
|
150
155
|
origin: (origin, callback) => {
|
|
@@ -166,7 +171,7 @@ else {
|
|
|
166
171
|
return callback(null, true);
|
|
167
172
|
}
|
|
168
173
|
// 检查自定义域名(支持子域名匹配)
|
|
169
|
-
const customDomains = persistStore.getCorsDomains();
|
|
174
|
+
const customDomains = persistStore_js_1.persistStore.getCorsDomains();
|
|
170
175
|
const originLower = origin.toLowerCase();
|
|
171
176
|
if (customDomains.some(d => {
|
|
172
177
|
const dLower = d.toLowerCase();
|
|
@@ -178,53 +183,53 @@ else {
|
|
|
178
183
|
},
|
|
179
184
|
credentials: true,
|
|
180
185
|
};
|
|
181
|
-
app.use(
|
|
182
|
-
app.use(
|
|
186
|
+
app.use((0, cors_1.default)(corsOptions));
|
|
187
|
+
app.use(express_1.default.json({ limit: '10mb' }));
|
|
183
188
|
// Health check
|
|
184
189
|
app.get('/health', (req, res) => {
|
|
185
|
-
res.json({ status: 'ok', service: 'gateway', version: '2.0.0', wsOnline: webSocketService.getOnlineCount() });
|
|
190
|
+
res.json({ status: 'ok', service: 'gateway', version: '2.0.0', wsOnline: WebSocketService_js_1.webSocketService.getOnlineCount() });
|
|
186
191
|
});
|
|
187
192
|
// Routes
|
|
188
|
-
app.use('/api/v1/auth',
|
|
189
|
-
app.use('/api/v1/agent',
|
|
190
|
-
app.use('/api/v1/models',
|
|
191
|
-
app.use('/api/v1/skills',
|
|
192
|
-
app.use('/api/v1/skill-hubs',
|
|
193
|
-
app.use('/api/v1/chats',
|
|
194
|
-
app.use('/api/v1/config',
|
|
195
|
-
app.use('/api/v1/settings',
|
|
196
|
-
app.use('/api/v1/service',
|
|
197
|
-
app.use('/api/v1/tasks',
|
|
198
|
-
app.use('/api/v1/upload',
|
|
199
|
-
app.use('/api/v1/version',
|
|
193
|
+
app.use('/api/v1/auth', auth_js_1.default);
|
|
194
|
+
app.use('/api/v1/agent', agent_js_1.default);
|
|
195
|
+
app.use('/api/v1/models', models_js_1.default);
|
|
196
|
+
app.use('/api/v1/skills', skills_js_1.default);
|
|
197
|
+
app.use('/api/v1/skill-hubs', skillHub_js_1.default);
|
|
198
|
+
app.use('/api/v1/chats', chat_js_1.default);
|
|
199
|
+
app.use('/api/v1/config', config_js_1.default);
|
|
200
|
+
app.use('/api/v1/settings', settings_js_1.default);
|
|
201
|
+
app.use('/api/v1/service', service_js_1.default);
|
|
202
|
+
app.use('/api/v1/tasks', tasks_js_1.default);
|
|
203
|
+
app.use('/api/v1/upload', upload_js_1.default);
|
|
204
|
+
app.use('/api/v1/version', version_js_1.default);
|
|
200
205
|
// Load auth from persistent storage on startup
|
|
201
|
-
authStore.load();
|
|
206
|
+
index_js_2.authStore.load();
|
|
202
207
|
// Error handler
|
|
203
|
-
app.use(errorHandler);
|
|
208
|
+
app.use(errorHandler_js_1.errorHandler);
|
|
204
209
|
// 创建 HTTP Server(而非 app.listen,以便挂载 WebSocket)
|
|
205
|
-
const server =
|
|
210
|
+
const server = http_1.default.createServer(app);
|
|
206
211
|
// 初始化 WebSocket 服务
|
|
207
|
-
webSocketService.initialize(server);
|
|
212
|
+
WebSocketService_js_1.webSocketService.initialize(server);
|
|
208
213
|
// 启动任务调度器
|
|
209
|
-
taskSchedulerService.start();
|
|
214
|
+
TaskSchedulerService_js_1.taskSchedulerService.start();
|
|
210
215
|
// 端口自动顺延:被占用时自动尝试下一个端口
|
|
211
216
|
const startServer = (port) => {
|
|
212
217
|
server.listen(port, () => {
|
|
213
218
|
// 动态更新 appConfig.port(供 WebSocket 广播实际端口)
|
|
214
|
-
appConfig.port = port;
|
|
215
|
-
if (port !== appConfig.port) {
|
|
216
|
-
logger.info(`Port ${appConfig.port} is in use, fallback to port ${port}`);
|
|
219
|
+
index_js_1.appConfig.port = port;
|
|
220
|
+
if (port !== index_js_1.appConfig.port) {
|
|
221
|
+
logger.info(`Port ${index_js_1.appConfig.port} is in use, fallback to port ${port}`);
|
|
217
222
|
}
|
|
218
223
|
logger.info(`我的助手 Gateway Service running on port ${port}`);
|
|
219
224
|
}).on('error', (err) => {
|
|
220
225
|
if (err.code === 'EADDRINUSE') {
|
|
221
226
|
const nextPort = port + 1;
|
|
222
|
-
if (nextPort <= (appConfig.port + 10)) {
|
|
227
|
+
if (nextPort <= (index_js_1.appConfig.port + 10)) {
|
|
223
228
|
logger.warn(`Port ${port} is in use, trying ${nextPort}...`);
|
|
224
229
|
startServer(nextPort);
|
|
225
230
|
}
|
|
226
231
|
else {
|
|
227
|
-
logger.error(`All ports from ${appConfig.port} to ${appConfig.port + 10} are in use`);
|
|
232
|
+
logger.error(`All ports from ${index_js_1.appConfig.port} to ${index_js_1.appConfig.port + 10} are in use`);
|
|
228
233
|
process.exit(1);
|
|
229
234
|
}
|
|
230
235
|
}
|
|
@@ -234,12 +239,12 @@ else {
|
|
|
234
239
|
}
|
|
235
240
|
});
|
|
236
241
|
};
|
|
237
|
-
startServer(appConfig.port);
|
|
242
|
+
startServer(index_js_1.appConfig.port);
|
|
238
243
|
// 优雅关闭
|
|
239
244
|
process.on('SIGTERM', () => {
|
|
240
245
|
logger.info('收到 SIGTERM,正在关闭...');
|
|
241
|
-
webSocketService.shutdown();
|
|
242
|
-
taskSchedulerService.stop();
|
|
246
|
+
WebSocketService_js_1.webSocketService.shutdown();
|
|
247
|
+
TaskSchedulerService_js_1.taskSchedulerService.stop();
|
|
243
248
|
server.close(() => {
|
|
244
249
|
logger.info('服务已关闭');
|
|
245
250
|
process.exit(0);
|
|
@@ -247,8 +252,8 @@ else {
|
|
|
247
252
|
});
|
|
248
253
|
process.on('SIGINT', () => {
|
|
249
254
|
logger.info('收到 SIGINT,正在关闭...');
|
|
250
|
-
webSocketService.shutdown();
|
|
251
|
-
taskSchedulerService.stop();
|
|
255
|
+
WebSocketService_js_1.webSocketService.shutdown();
|
|
256
|
+
TaskSchedulerService_js_1.taskSchedulerService.stop();
|
|
252
257
|
server.close(() => {
|
|
253
258
|
logger.info('服务已关闭');
|
|
254
259
|
process.exit(0);
|
package/dist/middleware/auth.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requireAuth = void 0;
|
|
1
4
|
/**
|
|
2
5
|
* 认证中间件
|
|
3
6
|
* 从请求头 Authorization: Bearer <token> 解码 JWT,提取 userId
|
|
4
7
|
* 同时保留原始 token 供路由转发给 Server
|
|
5
8
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const logger = getLogger('middleware/auth');
|
|
9
|
+
const authStore_js_1 = require("../stores/authStore.js");
|
|
10
|
+
const shared_1 = require("@myassis/shared");
|
|
11
|
+
const logger = (0, shared_1.getLogger)('middleware/auth');
|
|
9
12
|
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key-change-in-production';
|
|
10
13
|
/**
|
|
11
14
|
* 从请求头提取 Bearer token
|
|
@@ -20,13 +23,13 @@ function extractToken(req) {
|
|
|
20
23
|
/**
|
|
21
24
|
* 需要认证:token 无效返回 401
|
|
22
25
|
*/
|
|
23
|
-
|
|
26
|
+
function requireAuth(req, res, next) {
|
|
24
27
|
const token = extractToken(req);
|
|
25
28
|
if (!token) {
|
|
26
29
|
res.status(401).json({ success: false, error: 'Unauthorized' });
|
|
27
30
|
return;
|
|
28
31
|
}
|
|
29
|
-
const userId = authStore.getUserId(token);
|
|
32
|
+
const userId = authStore_js_1.authStore.getUserId(token);
|
|
30
33
|
if (!userId) {
|
|
31
34
|
res.status(401).json({ success: false, error: 'Unauthorized' });
|
|
32
35
|
return;
|
|
@@ -35,3 +38,4 @@ export function requireAuth(req, res, next) {
|
|
|
35
38
|
req.token = token;
|
|
36
39
|
next();
|
|
37
40
|
}
|
|
41
|
+
exports.requireAuth = requireAuth;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createError = exports.errorHandler = void 0;
|
|
4
|
+
const shared_1 = require("@myassis/shared");
|
|
5
|
+
const logger = (0, shared_1.getLogger)('ErrorHandler');
|
|
6
|
+
const errorHandler = (err, req, res, next) => {
|
|
4
7
|
logger.error('[Gateway Error]', err.message, err.stack);
|
|
5
8
|
const statusCode = err.statusCode || 500;
|
|
6
9
|
const message = err.message || 'Internal Server Error';
|
|
@@ -12,9 +15,11 @@ export const errorHandler = (err, req, res, next) => {
|
|
|
12
15
|
}
|
|
13
16
|
});
|
|
14
17
|
};
|
|
15
|
-
|
|
18
|
+
exports.errorHandler = errorHandler;
|
|
19
|
+
const createError = (message, statusCode, code) => {
|
|
16
20
|
const error = new Error(message);
|
|
17
21
|
error.statusCode = statusCode;
|
|
18
22
|
error.code = code;
|
|
19
23
|
return error;
|
|
20
24
|
};
|
|
25
|
+
exports.createError = createError;
|