@myassis/gateway 1.0.71 → 1.0.73

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.
@@ -100,10 +100,28 @@ router.post('/refresh', async (req, res) => {
100
100
  res.status(400).json({ success: false, error: 'Missing refresh token' });
101
101
  return;
102
102
  }
103
+ // 刷新前先找到持有该 refreshToken 的旧 accessToken,用于定位记录
104
+ const oldToken = Array.from(index_js_2.authStore.getAll()?.values() ?? [])
105
+ .find(x => x.refreshToken === refreshToken)?.accessToken;
103
106
  const response = await index_js_1.authApi.refresh(refreshToken);
104
- if (response.success && response.accessToken) {
105
- index_js_2.authStore.updateToken(response.accessToken, response.refreshToken);
106
- res.json({ success: true });
107
+ // server 可能返回 {accessToken} {data:{accessToken}},两种都兼容
108
+ const accessToken = response.data?.accessToken ?? response.accessToken;
109
+ const newRefreshToken = response.data?.refreshToken ?? response.refreshToken;
110
+ const expiresIn = response.data?.expiresIn ?? response.expiresIn;
111
+ if (response.success && accessToken) {
112
+ index_js_2.authStore.updateToken(oldToken ?? accessToken, accessToken, newRefreshToken, expiresIn);
113
+ // 必须将新 token 回传给客户端,否则客户端无法更新本地 token
114
+ res.json({
115
+ success: true,
116
+ data: {
117
+ accessToken,
118
+ refreshToken: newRefreshToken,
119
+ expiresIn,
120
+ },
121
+ accessToken,
122
+ refreshToken: newRefreshToken,
123
+ expiresIn,
124
+ });
107
125
  }
108
126
  else {
109
127
  res.status(401).json({ success: false, error: response.error || 'Invalid refresh token' });
@@ -75,9 +75,15 @@ exports.authService = {
75
75
  getUser: (token) => index_js_2.authStore.get(token)?.user || null,
76
76
  // 刷新 Token
77
77
  refresh: async (refreshToken) => {
78
+ // 刷新前先定位旧 accessToken
79
+ const oldToken = Array.from(index_js_2.authStore.getAll()?.values() ?? [])
80
+ .find(x => x.refreshToken === refreshToken)?.accessToken;
78
81
  const response = await index_js_1.authApi.refresh(refreshToken);
79
- if (response.success && response.accessToken) {
80
- index_js_2.authStore.updateToken(response.accessToken, response.refreshToken);
82
+ const accessToken = response.data?.accessToken ?? response.accessToken;
83
+ const newRefreshToken = response.data?.refreshToken ?? response.refreshToken;
84
+ const expiresIn = response.data?.expiresIn ?? response.expiresIn;
85
+ if (response.success && accessToken) {
86
+ index_js_2.authStore.updateToken(oldToken ?? accessToken, accessToken, newRefreshToken, expiresIn);
81
87
  }
82
88
  return response;
83
89
  }
@@ -1,4 +1,27 @@
1
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
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.MemoryManager = void 0;
4
27
  const shared_1 = require("@myassis/shared");
@@ -210,6 +233,10 @@ ${conversation}
210
233
  const summaryPrompt = this.buildSummaryPrompt(messages, lastSummary);
211
234
  const token = index_js_1.authStore.get(this.session.userId).accessToken;
212
235
  const llmClient = new LLMClient_js_1.LLMClient((await dataService_js_1.modelsService.list(token)).data.map((x) => (0, models_js_1.toModel)(x)), [{ role: 'user', content: summaryPrompt }], this.signal, [], 600000);
236
+ if (this.session.useSystemMode) {
237
+ const { getRequestToken, getServerBaseUrl } = await Promise.resolve().then(() => __importStar(require('../../api/index.js')));
238
+ llmClient.setSystemMode(true, this.session.selectModelId, getServerBaseUrl(), getRequestToken());
239
+ }
213
240
  const response = await llmClient.Chat();
214
241
  const content = (response.content || '').trim();
215
242
  if (!content) {
@@ -234,6 +261,10 @@ ${conversation}
234
261
  const batchPrompt = `请简洁总结以下对话片段的关键信息,特别关注:项目结构、关键决策、错误及修复。\n\n${batch.join('\n\n')}`;
235
262
  const token = index_js_1.authStore.get(this.session.userId).accessToken;
236
263
  const llmClient = new LLMClient_js_1.LLMClient((await dataService_js_1.modelsService.list(token)).data.map((x) => (0, models_js_1.toModel)(x)), [{ role: 'user', content: batchPrompt }], this.signal, [], 600000);
264
+ if (this.session.useSystemMode) {
265
+ const { getRequestToken, getServerBaseUrl } = await Promise.resolve().then(() => __importStar(require('../../api/index.js')));
266
+ llmClient.setSystemMode(true, this.session.selectModelId, getServerBaseUrl(), getRequestToken());
267
+ }
237
268
  const response = await llmClient.Chat();
238
269
  const subContent = (response.content || '').trim();
239
270
  if (subContent) {
@@ -251,6 +282,10 @@ ${conversation}
251
282
  const mergePrompt = this.buildMergePrompt(subSummaries, lastSummary);
252
283
  const token = index_js_1.authStore.get(this.session.userId).accessToken;
253
284
  const mergeLlmClient = new LLMClient_js_1.LLMClient((await dataService_js_1.modelsService.list(token)).data.map((x) => (0, models_js_1.toModel)(x)), [{ role: 'user', content: mergePrompt }], this.signal, [], 600000);
285
+ if (this.session.useSystemMode) {
286
+ const { getRequestToken, getServerBaseUrl } = await Promise.resolve().then(() => __importStar(require('../../api/index.js')));
287
+ mergeLlmClient.setSystemMode(true, this.session.selectModelId, getServerBaseUrl(), getRequestToken());
288
+ }
254
289
  const mergeResponse = await mergeLlmClient.Chat();
255
290
  const mergedContent = (mergeResponse.content || '').trim();
256
291
  return mergedContent || subSummaries.join('\n\n');
@@ -123,19 +123,38 @@ exports.authStore = {
123
123
  },
124
124
  /**
125
125
  * 更新 Token
126
+ * @param oldToken 刷新前的旧 accessToken,用于定位记录
127
+ * @param newToken 刷新后的新 accessToken
128
+ * @param refreshToken 新的 refreshToken(可选)
129
+ * @param expiresIn 有效期秒数(可选)
130
+ * @returns 是否更新成功
126
131
  */
127
- updateToken(token, expiresIn, refreshToken) {
128
- if (authMap) {
129
- const auth = Array.from(authMap.values()).find(x => x.accessToken === token);
130
- if (auth) {
131
- auth.accessToken = token;
132
- if (refreshToken) {
133
- auth.refreshToken = refreshToken;
134
- }
135
- saveAuthToFile(authMap);
136
- logger.debug('Token updated');
137
- }
132
+ updateToken(oldToken, newToken, refreshToken, expiresIn) {
133
+ if (!authMap) {
134
+ this.load();
135
+ }
136
+ if (!newToken) {
137
+ logger.warn('updateToken called without newToken');
138
+ return false;
138
139
  }
140
+ // 按旧 token 定位记录;若传入的旧 token 已被替换过,则回退用新 token 匹配(幂等)
141
+ const auth = Array.from(authMap.values()).find(x => x.accessToken === oldToken)
142
+ || Array.from(authMap.values()).find(x => x.accessToken === newToken);
143
+ if (!auth) {
144
+ logger.warn('updateToken: no auth record matched the given token');
145
+ return false;
146
+ }
147
+ auth.accessToken = newToken;
148
+ if (refreshToken) {
149
+ auth.refreshToken = refreshToken;
150
+ }
151
+ if (expiresIn) {
152
+ auth.expiresIn = expiresIn;
153
+ auth.expiresAt = Date.now() + expiresIn * 1000;
154
+ }
155
+ saveAuthToFile(authMap);
156
+ logger.debug('Token updated for user:', auth.user?.nickname || auth.user?.account);
157
+ return true;
139
158
  },
140
159
  /**
141
160
  * 获取用户 ID
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myassis/gateway",
3
- "version": "1.0.71",
3
+ "version": "1.0.73",
4
4
  "description": "我的助手 Gateway Service - 本地 AI 网关服务,支持认证、WebSocket 实时通信和任务调度",
5
5
  "main": "dist/index.js",
6
6
  "bin": {