@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.
Files changed (66) hide show
  1. package/dist/api/index.js +27 -19
  2. package/dist/cli.js +18 -5
  3. package/dist/config/index.js +34 -11
  4. package/dist/index.js +1 -2
  5. package/dist/main.js +76 -71
  6. package/dist/middleware/auth.js +9 -5
  7. package/dist/middleware/errorHandler.js +9 -4
  8. package/dist/routes/agent.js +39 -37
  9. package/dist/routes/auth.js +32 -30
  10. package/dist/routes/chat.js +7 -5
  11. package/dist/routes/config.js +5 -3
  12. package/dist/routes/models.js +28 -23
  13. package/dist/routes/service.js +29 -24
  14. package/dist/routes/settings.js +26 -21
  15. package/dist/routes/skillHub.js +22 -17
  16. package/dist/routes/skills.js +25 -20
  17. package/dist/routes/tasks.js +24 -19
  18. package/dist/routes/upload.js +24 -17
  19. package/dist/routes/version.js +20 -19
  20. package/dist/services/HMSPushService.js +4 -1
  21. package/dist/services/LocalTaskService.js +12 -9
  22. package/dist/services/NotificationService.js +14 -11
  23. package/dist/services/ServiceManager.js +77 -65
  24. package/dist/services/TaskSchedulerService.js +33 -30
  25. package/dist/services/TaskService.js +27 -24
  26. package/dist/services/WebSocketService.js +14 -11
  27. package/dist/services/agent/Agent.js +13 -9
  28. package/dist/services/agent/AgentManager.js +32 -24
  29. package/dist/services/agent/AgentStore.js +7 -3
  30. package/dist/services/dataService.js +72 -69
  31. package/dist/services/index.js +25 -9
  32. package/dist/services/llm/LLMClient.js +17 -9
  33. package/dist/services/memory/MemoryManager.js +22 -18
  34. package/dist/services/model/ModelCapabilities.js +11 -7
  35. package/dist/services/model/index.js +17 -1
  36. package/dist/services/models.js +5 -1
  37. package/dist/services/session/MigrationManager.js +18 -11
  38. package/dist/services/session/Session.js +33 -29
  39. package/dist/services/session/SessionManager.js +26 -21
  40. package/dist/services/session/SessionStore.js +32 -25
  41. package/dist/services/session/index.js +8 -2
  42. package/dist/services/skills.js +4 -1
  43. package/dist/services/systemPrompt.js +23 -16
  44. package/dist/services/task/PushTokenStore.js +9 -5
  45. package/dist/services/task/TaskStore.js +10 -6
  46. package/dist/services/tools/calculator.js +4 -1
  47. package/dist/services/tools/edit.js +16 -10
  48. package/dist/services/tools/exec.js +25 -16
  49. package/dist/services/tools/fetch.js +30 -4
  50. package/dist/services/tools/file.js +41 -35
  51. package/dist/services/tools/index.js +44 -24
  52. package/dist/services/tools/keyboard.js +41 -38
  53. package/dist/services/tools/model.js +12 -9
  54. package/dist/services/tools/mouse.js +12 -9
  55. package/dist/services/tools/screenshot.js +9 -3
  56. package/dist/services/tools/search.js +34 -4
  57. package/dist/services/tools/sessionsSpawn.js +11 -8
  58. package/dist/services/tools/skill.js +19 -16
  59. package/dist/services/tools/task.js +12 -9
  60. package/dist/services/tools/types.js +2 -1
  61. package/dist/services/tools/webFetch.js +34 -4
  62. package/dist/stores/authStore.js +25 -19
  63. package/dist/stores/index.js +9 -3
  64. package/dist/stores/memoryStore.js +5 -2
  65. package/dist/stores/persistStore.js +20 -14
  66. 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
- import crypto from 'crypto';
12
- import { AsyncLocalStorage } from 'async_hooks';
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
- export function runWithToken(token, fn) {
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
- export class ApiError extends Error {
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}&timestamp=${timestamp}&key=${SIGN_KEY}`;
40
- return crypto.createHash('sha256').update(signString).digest('hex');
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
- export const authApi = {
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
- export const skillsApi = {
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
- export const skillHubApi = {
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
- export const modelsApi = {
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
- export const tasksApi = {
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
- export const settingsApi = {
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
- export default {
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
- import path from 'path';
4
- import fs from 'fs';
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 = path.join(__dirname, '..', 'package.json');
10
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
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
- import('./main.js');
57
+ require('./main.js');
@@ -1,11 +1,34 @@
1
- import { getLogger } from '@myassis/shared';
2
- const logger = getLogger('GatewayConfig');
3
- import { config as dotenvConfig } from 'dotenv';
4
- import * as path from 'path';
5
- import * as fs from 'fs';
6
- import { fileURLToPath } from 'url';
7
- const __filename = fileURLToPath(import.meta.url);
8
- const __dirname = path.dirname(__filename);
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
- dotenvConfig({ path: envPath });
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
- export const appConfig = {
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
- export default appConfig;
72
+ exports.default = exports.appConfig;
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  // 入口文件 - 委托给 CLI 处理器
3
- import('./cli.js');
4
- export {};
3
+ require('./cli.js');
package/dist/main.js CHANGED
@@ -1,30 +1,35 @@
1
1
  #!/usr/bin/env node
2
- import express from 'express';
3
- import cors from 'cors';
4
- import helmet from 'helmet';
5
- import compression from 'compression';
6
- import http from 'http';
7
- import { appConfig } from './config/index.js';
8
- import { getLogger } from '@myassis/shared';
9
- import authRoutes from './routes/auth.js';
10
- import agentRoutes from './routes/agent.js';
11
- import modelsRoutes from './routes/models.js';
12
- import skillsRoutes from './routes/skills.js';
13
- import skillHubRoutes from './routes/skillHub.js';
14
- import chatRoutes from './routes/chat.js';
15
- import configRoutes from './routes/config.js';
16
- import settingsRoutes from './routes/settings.js';
17
- import serviceRoutes from './routes/service.js';
18
- import tasksRoutes from './routes/tasks.js';
19
- import uploadRoutes from './routes/upload.js';
20
- import versionRoutes from './routes/version.js';
21
- import { errorHandler } from './middleware/errorHandler.js';
22
- import { authStore } from './stores/index.js';
23
- import { persistStore } from './stores/persistStore.js';
24
- import { webSocketService } from './services/WebSocketService.js';
25
- import { taskSchedulerService } from './services/TaskSchedulerService.js';
26
- import { getServiceInfo, installService, uninstallService, startService, stopService, restartService, updateService, } from './services/ServiceManager.js';
27
- const logger = getLogger('index');
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 = express();
149
+ const app = (0, express_1.default)();
145
150
  // Middleware
146
- app.use(helmet());
147
- app.use(compression());
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(cors(corsOptions));
182
- app.use(express.json({ limit: '10mb' }));
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', authRoutes);
189
- app.use('/api/v1/agent', agentRoutes);
190
- app.use('/api/v1/models', modelsRoutes);
191
- app.use('/api/v1/skills', skillsRoutes);
192
- app.use('/api/v1/skill-hubs', skillHubRoutes);
193
- app.use('/api/v1/chats', chatRoutes);
194
- app.use('/api/v1/config', configRoutes);
195
- app.use('/api/v1/settings', settingsRoutes);
196
- app.use('/api/v1/service', serviceRoutes);
197
- app.use('/api/v1/tasks', tasksRoutes);
198
- app.use('/api/v1/upload', uploadRoutes);
199
- app.use('/api/v1/version', versionRoutes);
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 = http.createServer(app);
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);
@@ -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
- import { authStore } from '../stores/authStore.js';
7
- import { getLogger } from '@myassis/shared';
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
- export function requireAuth(req, res, next) {
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
- import { getLogger } from '@myassis/shared';
2
- const logger = getLogger('ErrorHandler');
3
- export const errorHandler = (err, req, res, next) => {
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
- export const createError = (message, statusCode, code) => {
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;