acp-ts 1.2.2 → 1.2.4
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/agentcp.js +40 -33
- package/dist/agentws.d.ts +8 -2
- package/dist/agentws.js +22 -4
- package/dist/api.js +8 -8
- package/dist/cert.js +3 -2
- package/dist/cli.js +16 -15
- package/dist/datamanager.js +27 -11
- package/dist/filesync.js +11 -10
- package/dist/group/client.js +44 -36
- package/dist/group/cursor_store.d.ts +4 -9
- package/dist/group/cursor_store.js +12 -40
- package/dist/group/events.d.ts +2 -1
- package/dist/group/events.js +7 -3
- package/dist/group/index.d.ts +1 -1
- package/dist/group/index.js +2 -1
- package/dist/group/message_store.d.ts +5 -6
- package/dist/group/message_store.js +64 -72
- package/dist/group/operations.d.ts +24 -6
- package/dist/group/operations.js +55 -6
- package/dist/group/types.d.ts +30 -1
- package/dist/group/types.js +11 -1
- package/dist/heartbeat.js +24 -24
- package/dist/messagestore.js +9 -8
- package/dist/server.js +2288 -1661
- package/dist/utils.d.ts +6 -0
- package/dist/utils.js +19 -2
- package/dist/websocket.d.ts +12 -1
- package/dist/websocket.js +61 -28
- package/package.json +1 -1
package/dist/heartbeat.js
CHANGED
|
@@ -106,12 +106,12 @@ class HeartbeatClient {
|
|
|
106
106
|
try {
|
|
107
107
|
const privateKey = await (0, utils_1.getDecryptKey)(this.agentId, this.seedPassword);
|
|
108
108
|
if (!privateKey) {
|
|
109
|
-
|
|
109
|
+
utils_1.logger.error('[Heartbeat] 获取私钥失败');
|
|
110
110
|
return false;
|
|
111
111
|
}
|
|
112
112
|
const { publicKeyPem, certPem } = await (0, cert_1.getPublicKeyPem)(this.agentId);
|
|
113
113
|
if (!certPem) {
|
|
114
|
-
|
|
114
|
+
utils_1.logger.error('[Heartbeat] 获取证书失败');
|
|
115
115
|
return false;
|
|
116
116
|
}
|
|
117
117
|
// 确保使用 HTTPS
|
|
@@ -121,23 +121,23 @@ class HeartbeatClient {
|
|
|
121
121
|
}
|
|
122
122
|
const result = await (0, api_1.signIn)(this.agentId, serverUrl, privateKey, publicKeyPem, certPem);
|
|
123
123
|
if (!result || !result.signData) {
|
|
124
|
-
|
|
124
|
+
utils_1.logger.error('[Heartbeat] signIn 失败');
|
|
125
125
|
return false;
|
|
126
126
|
}
|
|
127
127
|
const { server_ip, port, sign_cookie, signature } = result.signData;
|
|
128
128
|
if (!server_ip || !port || sign_cookie === undefined) {
|
|
129
|
-
|
|
129
|
+
utils_1.logger.error('[Heartbeat] signIn 返回数据不完整');
|
|
130
130
|
return false;
|
|
131
131
|
}
|
|
132
132
|
this.serverIp = server_ip;
|
|
133
133
|
this.port = parseInt(port, 10);
|
|
134
134
|
this.signCookie = parseInt(sign_cookie, 10);
|
|
135
135
|
this.signature = signature || '';
|
|
136
|
-
|
|
136
|
+
utils_1.logger.log(`[Heartbeat] signIn 成功: ${this.serverIp}:${this.port}`);
|
|
137
137
|
return true;
|
|
138
138
|
}
|
|
139
139
|
catch (error) {
|
|
140
|
-
|
|
140
|
+
utils_1.logger.error('[Heartbeat] signIn 异常:', error);
|
|
141
141
|
return false;
|
|
142
142
|
}
|
|
143
143
|
}
|
|
@@ -151,7 +151,7 @@ class HeartbeatClient {
|
|
|
151
151
|
this.handleMessage(msg);
|
|
152
152
|
});
|
|
153
153
|
this.udpSocket.on('error', (err) => {
|
|
154
|
-
|
|
154
|
+
utils_1.logger.error('[Heartbeat] Socket 错误:', err);
|
|
155
155
|
this.recvFailures++;
|
|
156
156
|
if (this.recvFailures >= HeartbeatClient.MAX_RECV_FAILURES) {
|
|
157
157
|
this.reconnect('recv_failures_threshold');
|
|
@@ -192,7 +192,7 @@ class HeartbeatClient {
|
|
|
192
192
|
this.recvFailures = 0;
|
|
193
193
|
// 检查是否需要重新认证
|
|
194
194
|
if (resp.NextBeat === 401) {
|
|
195
|
-
|
|
195
|
+
utils_1.logger.warn('[Heartbeat] 收到 401,需要重新认证');
|
|
196
196
|
this.reconnect('401_auth_failed');
|
|
197
197
|
return;
|
|
198
198
|
}
|
|
@@ -204,7 +204,7 @@ class HeartbeatClient {
|
|
|
204
204
|
else if (header.MessageType === message_serialize_1.MessageType.INVITE_REQ) {
|
|
205
205
|
// 邀请请求
|
|
206
206
|
const { req } = message_serialize_1.InviteMessageReq.deserialize(data, 0);
|
|
207
|
-
|
|
207
|
+
utils_1.logger.log(`[Heartbeat] 收到邀请请求: inviter=${req.InviterAgentId}, session=${req.SessionId}`);
|
|
208
208
|
// 发送邀请响应
|
|
209
209
|
this.sendInviteResponse(req);
|
|
210
210
|
// 触发回调
|
|
@@ -219,7 +219,7 @@ class HeartbeatClient {
|
|
|
219
219
|
}
|
|
220
220
|
}
|
|
221
221
|
catch (error) {
|
|
222
|
-
|
|
222
|
+
utils_1.logger.error('[Heartbeat] 处理消息异常:', error);
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
/**
|
|
@@ -242,15 +242,15 @@ class HeartbeatClient {
|
|
|
242
242
|
const data = resp.serialize();
|
|
243
243
|
this.udpSocket.send(data, this.port, this.serverIp, (err) => {
|
|
244
244
|
if (err) {
|
|
245
|
-
|
|
245
|
+
utils_1.logger.error('[Heartbeat] 发送邀请响应失败:', err);
|
|
246
246
|
}
|
|
247
247
|
else {
|
|
248
|
-
|
|
248
|
+
utils_1.logger.log('[Heartbeat] 邀请响应已发送');
|
|
249
249
|
}
|
|
250
250
|
});
|
|
251
251
|
}
|
|
252
252
|
catch (error) {
|
|
253
|
-
|
|
253
|
+
utils_1.logger.error('[Heartbeat] 发送邀请响应异常:', error);
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
/**
|
|
@@ -265,7 +265,7 @@ class HeartbeatClient {
|
|
|
265
265
|
if (this.lastHbRecv > 0) {
|
|
266
266
|
const timeoutThreshold = HeartbeatClient.MAX_MISSED_HEARTBEATS * this.heartbeatInterval;
|
|
267
267
|
if (now - this.lastHbRecv > timeoutThreshold) {
|
|
268
|
-
|
|
268
|
+
utils_1.logger.warn(`[Heartbeat] 心跳响应超时: ${now - this.lastHbRecv}ms > ${timeoutThreshold}ms`);
|
|
269
269
|
this.reconnect('heartbeat_response_timeout');
|
|
270
270
|
return;
|
|
271
271
|
}
|
|
@@ -287,7 +287,7 @@ class HeartbeatClient {
|
|
|
287
287
|
const data = req.serialize();
|
|
288
288
|
this.udpSocket.send(data, this.port, this.serverIp, (err) => {
|
|
289
289
|
if (err) {
|
|
290
|
-
|
|
290
|
+
utils_1.logger.error('[Heartbeat] 发送心跳失败:', err);
|
|
291
291
|
this.sendFailures++;
|
|
292
292
|
if (this.sendFailures >= HeartbeatClient.MAX_SEND_FAILURES) {
|
|
293
293
|
this.reconnect('send_failures_threshold');
|
|
@@ -299,7 +299,7 @@ class HeartbeatClient {
|
|
|
299
299
|
});
|
|
300
300
|
}
|
|
301
301
|
catch (error) {
|
|
302
|
-
|
|
302
|
+
utils_1.logger.error('[Heartbeat] 发送心跳异常:', error);
|
|
303
303
|
this.sendFailures++;
|
|
304
304
|
}
|
|
305
305
|
}
|
|
@@ -318,14 +318,14 @@ class HeartbeatClient {
|
|
|
318
318
|
// 限流:至少间隔 5 秒
|
|
319
319
|
if (elapsed < 5000) {
|
|
320
320
|
const backoff = Math.min(5000 - elapsed, HeartbeatClient.RECONNECT_BACKOFF_MAX);
|
|
321
|
-
|
|
321
|
+
utils_1.logger.log(`[Heartbeat] 重连退避: ${backoff}ms`);
|
|
322
322
|
await new Promise(resolve => setTimeout(resolve, backoff));
|
|
323
323
|
}
|
|
324
|
-
|
|
324
|
+
utils_1.logger.log(`[Heartbeat] 开始重连,原因: ${reason}`);
|
|
325
325
|
this.lastReconnectTs = Date.now();
|
|
326
326
|
// 重新登录
|
|
327
327
|
if (!await this.signIn()) {
|
|
328
|
-
|
|
328
|
+
utils_1.logger.error('[Heartbeat] 重连失败: signIn 返回 false');
|
|
329
329
|
this.updateStatus('error');
|
|
330
330
|
// 重置 lastHbRecv 避免下次 tick 立即再次触发重连
|
|
331
331
|
this.lastHbRecv = Date.now();
|
|
@@ -337,7 +337,7 @@ class HeartbeatClient {
|
|
|
337
337
|
this.sendFailures = 0;
|
|
338
338
|
this.recvFailures = 0;
|
|
339
339
|
this.lastHbRecv = Date.now();
|
|
340
|
-
|
|
340
|
+
utils_1.logger.log('[Heartbeat] 重连成功');
|
|
341
341
|
this.updateStatus('online');
|
|
342
342
|
// 通知外部组件(如 WebSocket)进行重连
|
|
343
343
|
if (this.onReconnectCallback) {
|
|
@@ -345,13 +345,13 @@ class HeartbeatClient {
|
|
|
345
345
|
this.onReconnectCallback();
|
|
346
346
|
}
|
|
347
347
|
catch (e) {
|
|
348
|
-
|
|
348
|
+
utils_1.logger.error('[Heartbeat] onReconnect 回调异常:', e);
|
|
349
349
|
}
|
|
350
350
|
}
|
|
351
351
|
return true;
|
|
352
352
|
}
|
|
353
353
|
catch (error) {
|
|
354
|
-
|
|
354
|
+
utils_1.logger.error('[Heartbeat] 重连异常:', error);
|
|
355
355
|
this.updateStatus('error');
|
|
356
356
|
return false;
|
|
357
357
|
}
|
|
@@ -364,7 +364,7 @@ class HeartbeatClient {
|
|
|
364
364
|
*/
|
|
365
365
|
async online() {
|
|
366
366
|
if (this.isRunning) {
|
|
367
|
-
|
|
367
|
+
utils_1.logger.log('[Heartbeat] 已经在线');
|
|
368
368
|
return true;
|
|
369
369
|
}
|
|
370
370
|
this.updateStatus('connecting');
|
|
@@ -422,7 +422,7 @@ class HeartbeatClient {
|
|
|
422
422
|
return [];
|
|
423
423
|
}
|
|
424
424
|
catch (error) {
|
|
425
|
-
|
|
425
|
+
utils_1.logger.error('[Heartbeat] 查询在线状态异常:', error);
|
|
426
426
|
return [];
|
|
427
427
|
}
|
|
428
428
|
}
|
package/dist/messagestore.js
CHANGED
|
@@ -37,6 +37,7 @@ exports.MessageStore = void 0;
|
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const datamanager_1 = require("./datamanager");
|
|
40
|
+
const utils_1 = require("./utils");
|
|
40
41
|
// ---- MessageStore 类 ----
|
|
41
42
|
class MessageStore {
|
|
42
43
|
constructor(options) {
|
|
@@ -90,7 +91,7 @@ class MessageStore {
|
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
catch (e) {
|
|
93
|
-
|
|
94
|
+
utils_1.logger.error('[MessageStore] 加载索引失败:', e);
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
}
|
|
@@ -119,7 +120,7 @@ class MessageStore {
|
|
|
119
120
|
msgs.push(JSON.parse(l));
|
|
120
121
|
}
|
|
121
122
|
catch (e) {
|
|
122
|
-
|
|
123
|
+
utils_1.logger.error('[MessageStore] 解析消息行失败:', e);
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
126
|
return msgs;
|
|
@@ -141,10 +142,10 @@ class MessageStore {
|
|
|
141
142
|
}
|
|
142
143
|
// 写入新文件夹结构
|
|
143
144
|
await this.flush(ownerAid);
|
|
144
|
-
|
|
145
|
+
utils_1.logger.log(`[MessageStore] 已从旧格式迁移 ${records.length} 个会话 (AID: ${ownerAid})`);
|
|
145
146
|
}
|
|
146
147
|
catch (e) {
|
|
147
|
-
|
|
148
|
+
utils_1.logger.error('[MessageStore] 迁移旧数据失败:', e);
|
|
148
149
|
}
|
|
149
150
|
}
|
|
150
151
|
getOrCreateSession(sessionId, identifyingCode, peerAid, type, ownerAid) {
|
|
@@ -247,7 +248,7 @@ class MessageStore {
|
|
|
247
248
|
fs.writeFileSync(indexPath, JSON.stringify(records, null, 2));
|
|
248
249
|
}
|
|
249
250
|
catch (e) {
|
|
250
|
-
|
|
251
|
+
utils_1.logger.error('[MessageStore] 写入索引失败:', e);
|
|
251
252
|
}
|
|
252
253
|
}
|
|
253
254
|
/** 全量重写单个会话的消息文件(JSONL 格式) */
|
|
@@ -265,7 +266,7 @@ class MessageStore {
|
|
|
265
266
|
fs.writeFileSync(msgPath, lines ? lines + '\n' : '');
|
|
266
267
|
}
|
|
267
268
|
catch (e) {
|
|
268
|
-
|
|
269
|
+
utils_1.logger.error(`[MessageStore] 写入会话文件失败 (${sessionId}):`, e);
|
|
269
270
|
}
|
|
270
271
|
}
|
|
271
272
|
/** 追加单条消息到 JSONL 文件 */
|
|
@@ -279,7 +280,7 @@ class MessageStore {
|
|
|
279
280
|
fs.appendFileSync(msgPath, JSON.stringify(msg) + '\n');
|
|
280
281
|
}
|
|
281
282
|
catch (e) {
|
|
282
|
-
|
|
283
|
+
utils_1.logger.error(`[MessageStore] 追加消息失败 (${sessionId}):`, e);
|
|
283
284
|
}
|
|
284
285
|
}
|
|
285
286
|
/** 全量写入指定 AID 的索引 + 所有会话消息文件 */
|
|
@@ -316,7 +317,7 @@ class MessageStore {
|
|
|
316
317
|
fs.unlinkSync(msgPath);
|
|
317
318
|
}
|
|
318
319
|
catch (e) {
|
|
319
|
-
|
|
320
|
+
utils_1.logger.error('删除会话文件失败:', e);
|
|
320
321
|
}
|
|
321
322
|
}
|
|
322
323
|
await this.flushIndex(session.ownerAid);
|