acp-ts 1.2.3 → 1.2.5
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 +49 -42
- 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.d.ts +2 -0
- package/dist/datamanager.js +34 -14
- 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 -2
- package/dist/group/events.js +7 -27
- package/dist/group/index.d.ts +1 -1
- package/dist/group/index.js +2 -2
- package/dist/group/message_store.d.ts +5 -6
- package/dist/group/message_store.js +66 -72
- package/dist/group/operations.d.ts +1 -5
- package/dist/group/operations.js +13 -18
- package/dist/group/types.d.ts +3 -29
- package/dist/group/types.js +2 -6
- package/dist/heartbeat.js +24 -24
- package/dist/messagestore.js +9 -8
- package/dist/server.js +2210 -1708
- 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/agentcp.js
CHANGED
|
@@ -77,7 +77,7 @@ class AgentCP {
|
|
|
77
77
|
}
|
|
78
78
|
const baseUrl = `https://acp3.${apiUrl}`;
|
|
79
79
|
this.seedPassword = seedPassword;
|
|
80
|
-
this._basePath = basePath ||
|
|
80
|
+
this._basePath = basePath || datamanager_1.DEFAULT_ACP_DIR;
|
|
81
81
|
this.apUrl = `${baseUrl}/api/accesspoint`;
|
|
82
82
|
this.msgUrl = `${baseUrl}/api/message`;
|
|
83
83
|
this._persistGroupMessages = (_a = options === null || options === void 0 ? void 0 : options.persistGroupMessages) !== null && _a !== void 0 ? _a : true;
|
|
@@ -96,7 +96,7 @@ class AgentCP {
|
|
|
96
96
|
await (0, cert_1.preloadCrypto)();
|
|
97
97
|
}
|
|
98
98
|
catch (error) {
|
|
99
|
-
|
|
99
|
+
utils_1.logger.warn('AgentCP 加密模块预热失败:', error);
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
/// 导入本地用户信息
|
|
@@ -226,11 +226,11 @@ class AgentCP {
|
|
|
226
226
|
this.agentMdUploaded = true;
|
|
227
227
|
}
|
|
228
228
|
else {
|
|
229
|
-
|
|
229
|
+
utils_1.logger.warn('agent.md 上传失败:', result.error);
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
232
|
catch (err) {
|
|
233
|
-
|
|
233
|
+
utils_1.logger.warn('agent.md 上传异常:', err);
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
236
|
// 自动生成并上传 agent.md(仅当未设置自定义路径且启用了自动生成时)
|
|
@@ -245,14 +245,14 @@ class AgentCP {
|
|
|
245
245
|
const result = await fileSync.uploadAgentMd(content);
|
|
246
246
|
if (result.success) {
|
|
247
247
|
this.saveAgentMdMarker(aid);
|
|
248
|
-
|
|
248
|
+
utils_1.logger.log(`agent.md 自动生成并上传成功: ${aid}`);
|
|
249
249
|
}
|
|
250
250
|
else {
|
|
251
|
-
|
|
251
|
+
utils_1.logger.warn('agent.md 自动上传失败:', result.error);
|
|
252
252
|
}
|
|
253
253
|
}
|
|
254
254
|
catch (err) {
|
|
255
|
-
|
|
255
|
+
utils_1.logger.warn('agent.md 自动生成异常:', err);
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
258
|
return {
|
|
@@ -304,7 +304,7 @@ class AgentCP {
|
|
|
304
304
|
fs.writeFileSync(this.getAgentMdMarkerPath(aid), new Date().toISOString(), 'utf-8');
|
|
305
305
|
}
|
|
306
306
|
catch (err) {
|
|
307
|
-
|
|
307
|
+
utils_1.logger.warn('保存 agent.md 标记文件失败:', err);
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
310
|
// ============================================================
|
|
@@ -368,7 +368,7 @@ class AgentCP {
|
|
|
368
368
|
handleGroupMessage(message) {
|
|
369
369
|
var _a, _b;
|
|
370
370
|
if (this.groupClient == null || !this._groupTargetAid) {
|
|
371
|
-
|
|
371
|
+
utils_1.logger.log(`[Group] handleGroupMessage skipped: groupClient=${this.groupClient != null}, targetAid=${this._groupTargetAid}`);
|
|
372
372
|
return false;
|
|
373
373
|
}
|
|
374
374
|
const data = message.data || message;
|
|
@@ -377,15 +377,16 @@ class AgentCP {
|
|
|
377
377
|
try {
|
|
378
378
|
const rawMsg = (_b = data.message) !== null && _b !== void 0 ? _b : "";
|
|
379
379
|
if (typeof rawMsg === 'string' && rawMsg) {
|
|
380
|
+
utils_1.logger.log(`[Group] handleGroupMessage: routing to groupClient, sender=${sender} msgLen=${rawMsg.length}`);
|
|
380
381
|
this.groupClient.handleIncoming(rawMsg);
|
|
381
382
|
}
|
|
382
383
|
else {
|
|
383
|
-
|
|
384
|
+
utils_1.logger.warn(`[Group] rawMsg is not a non-empty string, skipping handleIncoming. type=${typeof rawMsg}`);
|
|
384
385
|
}
|
|
385
386
|
return true;
|
|
386
387
|
}
|
|
387
388
|
catch (e) {
|
|
388
|
-
|
|
389
|
+
utils_1.logger.error("[Group] handleIncoming error:", e);
|
|
389
390
|
return true;
|
|
390
391
|
}
|
|
391
392
|
}
|
|
@@ -408,20 +409,20 @@ class AgentCP {
|
|
|
408
409
|
_createDefaultGroupEventHandler() {
|
|
409
410
|
return {
|
|
410
411
|
onNewMessage(groupId, latestMsgId, sender, preview) {
|
|
411
|
-
|
|
412
|
+
utils_1.logger.log(`[Group][DefaultHandler] onNewMessage: group=${groupId} msgId=${latestMsgId} sender=${sender} preview=${preview}`);
|
|
412
413
|
},
|
|
413
414
|
onNewEvent(groupId, latestEventId, eventType, summary) {
|
|
414
|
-
|
|
415
|
+
utils_1.logger.log(`[Group][DefaultHandler] onNewEvent: group=${groupId} eventId=${latestEventId} type=${eventType}`);
|
|
415
416
|
},
|
|
416
417
|
onGroupInvite(groupId, groupAddress, invitedBy) {
|
|
417
|
-
|
|
418
|
+
utils_1.logger.log(`[Group][DefaultHandler] onGroupInvite: group=${groupId} address=${groupAddress} invitedBy=${invitedBy}`);
|
|
418
419
|
},
|
|
419
420
|
onJoinApproved: (groupId, groupAddress) => {
|
|
420
|
-
|
|
421
|
+
utils_1.logger.log(`[Group][DefaultHandler] onJoinApproved: group=${groupId} address=${groupAddress}`);
|
|
421
422
|
(async () => {
|
|
422
423
|
try {
|
|
423
424
|
if (!this.groupOps || !this._groupTargetAid) {
|
|
424
|
-
|
|
425
|
+
utils_1.logger.warn(`[Group][DefaultHandler] onJoinApproved skipped: groupOps or targetAid not available`);
|
|
425
426
|
return;
|
|
426
427
|
}
|
|
427
428
|
let groupName = groupId;
|
|
@@ -433,27 +434,24 @@ class AgentCP {
|
|
|
433
434
|
this.addGroupToStore(groupId, groupName);
|
|
434
435
|
}
|
|
435
436
|
catch (e) {
|
|
436
|
-
|
|
437
|
+
utils_1.logger.error(`[Group][DefaultHandler] onJoinApproved processing failed: group=${groupId}`, e.message);
|
|
437
438
|
}
|
|
438
439
|
})();
|
|
439
440
|
},
|
|
440
441
|
onJoinRejected(groupId, reason) {
|
|
441
|
-
|
|
442
|
+
utils_1.logger.log(`[Group][DefaultHandler] onJoinRejected: group=${groupId} reason=${reason}`);
|
|
442
443
|
},
|
|
443
444
|
onJoinRequestReceived(groupId, agentId, message) {
|
|
444
|
-
|
|
445
|
+
utils_1.logger.log(`[Group][DefaultHandler] onJoinRequestReceived: group=${groupId} agent=${agentId}`);
|
|
445
446
|
},
|
|
446
447
|
onGroupMessageBatch: (groupId, batch) => {
|
|
447
|
-
|
|
448
|
+
utils_1.logger.log(`[Group][DefaultHandler] onGroupMessageBatch: group=${groupId} count=${batch.count} range=[${batch.start_msg_id}, ${batch.latest_msg_id}]`);
|
|
448
449
|
this.processAndAckBatch(groupId, batch).catch(e => {
|
|
449
|
-
|
|
450
|
+
utils_1.logger.error(`[Group][DefaultHandler] processAndAckBatch failed: group=${groupId}`, e);
|
|
450
451
|
});
|
|
451
452
|
},
|
|
452
453
|
onGroupEvent(groupId, evt) {
|
|
453
|
-
|
|
454
|
-
},
|
|
455
|
-
onDutyDispatch(groupId, context) {
|
|
456
|
-
console.log(`[Group][DefaultHandler] onDutyDispatch: group=${groupId} original_msg_id=${context.original_msg_id} sender=${context.sender_id}`);
|
|
454
|
+
utils_1.logger.log(`[Group][DefaultHandler] onGroupEvent: group=${groupId} event=${evt.event_type}`);
|
|
457
455
|
},
|
|
458
456
|
};
|
|
459
457
|
}
|
|
@@ -462,7 +460,12 @@ class AgentCP {
|
|
|
462
460
|
* 返回排序后的消息列表,供上层使用(如推送给浏览器)。
|
|
463
461
|
*/
|
|
464
462
|
async processAndAckBatch(groupId, batch) {
|
|
465
|
-
const
|
|
463
|
+
const batchMessages = batch.messages || [];
|
|
464
|
+
const sorted = [...batchMessages].sort((a, b) => a.msg_id - b.msg_id);
|
|
465
|
+
utils_1.logger.log(`[AgentCP] processAndAckBatch: group=${groupId} batchCount=${batchMessages.length} sortedCount=${sorted.length} msgIds=[${sorted.map(m => m.msg_id).join(',')}]`);
|
|
466
|
+
const storeExists = !!this.groupMessageStore;
|
|
467
|
+
const storeGroupExists = storeExists ? !!this.groupMessageStore.getGroup(groupId) : false;
|
|
468
|
+
utils_1.logger.log(`[AgentCP] processAndAckBatch: storeExists=${storeExists} storeGroupExists=${storeGroupExists} lastMsgId=${this.getGroupLastMsgId(groupId)}`);
|
|
466
469
|
await this.addGroupMessagesToStore(groupId, sorted);
|
|
467
470
|
// ACK batch 中最后一条消息
|
|
468
471
|
if (sorted.length > 0) {
|
|
@@ -478,7 +481,7 @@ class AgentCP {
|
|
|
478
481
|
if (!this.groupOps || !this._groupTargetAid)
|
|
479
482
|
return;
|
|
480
483
|
this.groupOps.ackMessages(this._groupTargetAid, groupId, msgId).catch(e => {
|
|
481
|
-
|
|
484
|
+
utils_1.logger.warn(`[Group] ack failed: group=${groupId} msgId=${msgId}`, e.message || e);
|
|
482
485
|
});
|
|
483
486
|
}
|
|
484
487
|
/**
|
|
@@ -501,7 +504,7 @@ class AgentCP {
|
|
|
501
504
|
this.groupClient.close();
|
|
502
505
|
}
|
|
503
506
|
catch (e) {
|
|
504
|
-
|
|
507
|
+
utils_1.logger.error("[Group] group_client close error:", e);
|
|
505
508
|
}
|
|
506
509
|
this.groupClient = null;
|
|
507
510
|
this.groupOps = null;
|
|
@@ -522,7 +525,7 @@ class AgentCP {
|
|
|
522
525
|
await this.groupMessageStore.loadGroupsForAid(this.activeAid);
|
|
523
526
|
}
|
|
524
527
|
catch (e) {
|
|
525
|
-
|
|
528
|
+
utils_1.logger.warn('[AgentCP] 加载群消息存储失败:', e);
|
|
526
529
|
}
|
|
527
530
|
}
|
|
528
531
|
}
|
|
@@ -573,7 +576,7 @@ class AgentCP {
|
|
|
573
576
|
for (const local of localGroups) {
|
|
574
577
|
if (!serverGroupIds.has(local.groupId)) {
|
|
575
578
|
await this.groupMessageStore.deleteGroup(local.groupId);
|
|
576
|
-
|
|
579
|
+
utils_1.logger.log(`[Group] syncGroupList: 清理本地已退出群组 ${local.groupId}`);
|
|
577
580
|
}
|
|
578
581
|
}
|
|
579
582
|
}
|
|
@@ -630,8 +633,10 @@ class AgentCP {
|
|
|
630
633
|
* 批量添加群消息到本地存储
|
|
631
634
|
*/
|
|
632
635
|
async addGroupMessagesToStore(groupId, msgs) {
|
|
633
|
-
if (!this.groupMessageStore)
|
|
636
|
+
if (!this.groupMessageStore) {
|
|
637
|
+
utils_1.logger.warn(`[AgentCP] addGroupMessagesToStore: groupMessageStore is NULL! group=${groupId} msgs=${msgs.length} — 消息将丢失!`);
|
|
634
638
|
return;
|
|
639
|
+
}
|
|
635
640
|
await this.groupMessageStore.addMessages(groupId, msgs);
|
|
636
641
|
}
|
|
637
642
|
/**
|
|
@@ -677,17 +682,19 @@ class AgentCP {
|
|
|
677
682
|
});
|
|
678
683
|
await this.addGroupMessagesToStore(groupId, msgs);
|
|
679
684
|
// ACK 这批消息中的最后一条
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
685
|
+
if (msgs.length > 0) {
|
|
686
|
+
const lastMsgId = msgs[msgs.length - 1].msg_id;
|
|
687
|
+
await this.groupOps.ackMessages(this._groupTargetAid, groupId, lastMsgId);
|
|
688
|
+
// 更新 after 用于下一轮拉取
|
|
689
|
+
after = lastMsgId;
|
|
690
|
+
}
|
|
684
691
|
if (!pulled.has_more) {
|
|
685
692
|
break;
|
|
686
693
|
}
|
|
687
694
|
}
|
|
688
695
|
}
|
|
689
696
|
catch (e) {
|
|
690
|
-
|
|
697
|
+
utils_1.logger.warn('[AgentCP] pullAndStoreGroupMessages error:', e.message);
|
|
691
698
|
}
|
|
692
699
|
return this.getLocalGroupMessages(groupId);
|
|
693
700
|
}
|
|
@@ -707,14 +714,14 @@ class AgentCP {
|
|
|
707
714
|
// Step 1: register_online(仅通知 group.ap 在线,不再返回游标)
|
|
708
715
|
await this.groupOps.registerOnline(this._groupTargetAid);
|
|
709
716
|
this._onlineGroups.add(groupId);
|
|
710
|
-
|
|
717
|
+
utils_1.logger.log(`[Group] joinGroupSession: group=${groupId}`);
|
|
711
718
|
// Step 2: 冷启动同步 — 拉取历史消息对齐,再进入批推送接收
|
|
712
719
|
try {
|
|
713
720
|
const lastMsgId = this.getGroupLastMsgId(groupId);
|
|
714
721
|
await this.pullAndStoreGroupMessages(groupId, lastMsgId, 50);
|
|
715
722
|
}
|
|
716
723
|
catch (e) {
|
|
717
|
-
|
|
724
|
+
utils_1.logger.warn(`[Group] cold-start sync failed: group=${groupId}`, e.message || e);
|
|
718
725
|
}
|
|
719
726
|
// Step 3: 启动心跳定时器(首次加入群组时启动)
|
|
720
727
|
this._ensureHeartbeat();
|
|
@@ -734,7 +741,7 @@ class AgentCP {
|
|
|
734
741
|
await this.groupOps.unregisterOnline(this._groupTargetAid);
|
|
735
742
|
}
|
|
736
743
|
catch (e) {
|
|
737
|
-
|
|
744
|
+
utils_1.logger.warn(`[Group] unregisterOnline failed`, e.message || e);
|
|
738
745
|
}
|
|
739
746
|
this._stopHeartbeat();
|
|
740
747
|
}
|
|
@@ -776,7 +783,7 @@ class AgentCP {
|
|
|
776
783
|
this._heartbeatTimer = setInterval(() => {
|
|
777
784
|
this._sendHeartbeats();
|
|
778
785
|
}, this._heartbeatIntervalMs);
|
|
779
|
-
|
|
786
|
+
utils_1.logger.log(`[Group] heartbeat started: interval=${this._heartbeatIntervalMs}ms`);
|
|
780
787
|
}
|
|
781
788
|
/**
|
|
782
789
|
* 停止心跳定时器
|
|
@@ -785,7 +792,7 @@ class AgentCP {
|
|
|
785
792
|
if (this._heartbeatTimer) {
|
|
786
793
|
clearInterval(this._heartbeatTimer);
|
|
787
794
|
this._heartbeatTimer = null;
|
|
788
|
-
|
|
795
|
+
utils_1.logger.log(`[Group] heartbeat stopped`);
|
|
789
796
|
}
|
|
790
797
|
}
|
|
791
798
|
/**
|
|
@@ -795,7 +802,7 @@ class AgentCP {
|
|
|
795
802
|
if (!this.groupOps || !this._groupTargetAid)
|
|
796
803
|
return;
|
|
797
804
|
this.groupOps.heartbeat(this._groupTargetAid).catch(e => {
|
|
798
|
-
|
|
805
|
+
utils_1.logger.warn(`[Group] heartbeat failed`, e.message || e);
|
|
799
806
|
});
|
|
800
807
|
}
|
|
801
808
|
/**
|
package/dist/agentws.d.ts
CHANGED
|
@@ -85,9 +85,15 @@ declare class AgentWS implements IAgentWS {
|
|
|
85
85
|
*/
|
|
86
86
|
disconnect(): void;
|
|
87
87
|
/**
|
|
88
|
-
*
|
|
88
|
+
* 注册"快速重连全部失败"回调,透传 WSClient 的回调
|
|
89
89
|
*/
|
|
90
|
-
|
|
90
|
+
onReconnectNeeded(cb: () => void): void;
|
|
91
|
+
/**
|
|
92
|
+
* 重连 WebSocket
|
|
93
|
+
* @param newServer 新的消息服务器地址(可选,重新鉴权后传入)
|
|
94
|
+
* @param newSignature 新的签名(可选,重新鉴权后传入)
|
|
95
|
+
*/
|
|
96
|
+
reconnect(newServer?: string, newSignature?: string): Promise<void>;
|
|
91
97
|
/**
|
|
92
98
|
* 接受来自心跳通道的邀请
|
|
93
99
|
* 当心跳客户端收到邀请时,调用此方法通过 WebSocket 加入会话
|
package/dist/agentws.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AgentWS = void 0;
|
|
4
4
|
const websocket_1 = require("./websocket");
|
|
5
|
+
const utils_1 = require("./utils");
|
|
5
6
|
/**
|
|
6
7
|
* AgentWS类
|
|
7
8
|
* 提供基于WebSocket的智能体通信功能,封装了WebSocket连接、会话创建和消息传递等操作
|
|
@@ -69,7 +70,7 @@ class AgentWS {
|
|
|
69
70
|
this.invite(receiver, sessionRes.sessionId, sessionRes.identifyingCode, onInviteStatus);
|
|
70
71
|
}
|
|
71
72
|
else {
|
|
72
|
-
|
|
73
|
+
utils_1.logger.error("会话创建成功但未返回sessionId或identifyingCode");
|
|
73
74
|
}
|
|
74
75
|
});
|
|
75
76
|
}
|
|
@@ -145,10 +146,27 @@ class AgentWS {
|
|
|
145
146
|
this.msgClient.disconnect();
|
|
146
147
|
}
|
|
147
148
|
/**
|
|
148
|
-
*
|
|
149
|
+
* 注册"快速重连全部失败"回调,透传 WSClient 的回调
|
|
149
150
|
*/
|
|
150
|
-
|
|
151
|
-
|
|
151
|
+
onReconnectNeeded(cb) {
|
|
152
|
+
this.msgClient.onReconnectNeeded(cb);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 重连 WebSocket
|
|
156
|
+
* @param newServer 新的消息服务器地址(可选,重新鉴权后传入)
|
|
157
|
+
* @param newSignature 新的签名(可选,重新鉴权后传入)
|
|
158
|
+
*/
|
|
159
|
+
async reconnect(newServer, newSignature) {
|
|
160
|
+
let newUrl;
|
|
161
|
+
if (newServer && newSignature) {
|
|
162
|
+
this.messageServer = newServer;
|
|
163
|
+
this.messageSignature = newSignature;
|
|
164
|
+
let url = newServer.replace("https://", "wss://").replace("http://", "ws://");
|
|
165
|
+
const encodedAid = encodeURIComponent(this.aid);
|
|
166
|
+
const encodedSignature = encodeURIComponent(newSignature);
|
|
167
|
+
newUrl = `${url}/session?agent_id=${encodedAid}&signature=${encodedSignature}`;
|
|
168
|
+
}
|
|
169
|
+
await this.msgClient.reconnect(newUrl);
|
|
152
170
|
}
|
|
153
171
|
/**
|
|
154
172
|
* 接受来自心跳通道的邀请
|
package/dist/api.js
CHANGED
|
@@ -35,7 +35,7 @@ async function getGuestAid(apiUrl, seedPassword) {
|
|
|
35
35
|
return null;
|
|
36
36
|
}
|
|
37
37
|
catch (error) {
|
|
38
|
-
|
|
38
|
+
utils_1.logger.error('获取访客证书失败:', error);
|
|
39
39
|
return null;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -57,7 +57,7 @@ async function getEntryPointConfig(aid, apiUrl) {
|
|
|
57
57
|
return null;
|
|
58
58
|
}
|
|
59
59
|
catch (error) {
|
|
60
|
-
|
|
60
|
+
utils_1.logger.error('获取接入点配置失败:', error);
|
|
61
61
|
return null;
|
|
62
62
|
}
|
|
63
63
|
}
|
|
@@ -78,7 +78,7 @@ async function signCert(agentId, apiUrl, csr) {
|
|
|
78
78
|
return null;
|
|
79
79
|
}
|
|
80
80
|
catch (error) {
|
|
81
|
-
|
|
81
|
+
utils_1.logger.error('sign_cert接口异常:', error, data);
|
|
82
82
|
return null;
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -107,7 +107,7 @@ async function signIn(agentId, apiUrl, privateKey, publicKeyPem, certPem) {
|
|
|
107
107
|
certificate = certificate || keyInfo.certPem;
|
|
108
108
|
}
|
|
109
109
|
if (!publicKey || !certificate) {
|
|
110
|
-
|
|
110
|
+
utils_1.logger.error('signIn 失败: 无法获取公钥或证书');
|
|
111
111
|
return null;
|
|
112
112
|
}
|
|
113
113
|
const signatureHex = await (0, cert_1.signPrivate)(nonce, privateKey);
|
|
@@ -128,15 +128,15 @@ async function signIn(agentId, apiUrl, privateKey, publicKeyPem, certPem) {
|
|
|
128
128
|
signData
|
|
129
129
|
};
|
|
130
130
|
}
|
|
131
|
-
|
|
131
|
+
utils_1.logger.error('signIn 第二步失败:', res.status, res.data);
|
|
132
132
|
return null;
|
|
133
133
|
}
|
|
134
|
-
|
|
134
|
+
utils_1.logger.error('signIn 第一步失败:', response.status, response.data);
|
|
135
135
|
return null;
|
|
136
136
|
}
|
|
137
137
|
catch (error) {
|
|
138
138
|
const errMsg = ((_b = (_a = error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) || error.message || error;
|
|
139
|
-
|
|
139
|
+
utils_1.logger.error('登录异常:', errMsg);
|
|
140
140
|
return null;
|
|
141
141
|
}
|
|
142
142
|
}
|
|
@@ -158,7 +158,7 @@ async function signOut(agentId, apiUrl) {
|
|
|
158
158
|
return false;
|
|
159
159
|
}
|
|
160
160
|
catch (error) {
|
|
161
|
-
|
|
161
|
+
utils_1.logger.error('退出登录异常:', error);
|
|
162
162
|
return false;
|
|
163
163
|
}
|
|
164
164
|
}
|
package/dist/cert.js
CHANGED
|
@@ -8,6 +8,7 @@ exports.signPrivate = signPrivate;
|
|
|
8
8
|
exports.preloadCrypto = preloadCrypto;
|
|
9
9
|
const jsrsasign_1 = require("jsrsasign");
|
|
10
10
|
const datamanager_1 = require("./datamanager");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
11
12
|
function createSignedCertificate(aid = '') {
|
|
12
13
|
const { pubKeyObj, prvKeyObj } = jsrsasign_1.KEYUTIL.generateKeypair("EC", "secp384r1");
|
|
13
14
|
const prvKeyPEM = jsrsasign_1.KEYUTIL.getPEM(prvKeyObj, "PKCS8PRV");
|
|
@@ -61,7 +62,7 @@ async function getPublicKeyPem(agentId) {
|
|
|
61
62
|
};
|
|
62
63
|
}
|
|
63
64
|
catch (error) {
|
|
64
|
-
|
|
65
|
+
utils_1.logger.error('获取公钥 PEM 格式失败:', error);
|
|
65
66
|
throw new Error('获取公钥失败');
|
|
66
67
|
}
|
|
67
68
|
}
|
|
@@ -215,7 +216,7 @@ async function preloadCrypto() {
|
|
|
215
216
|
require('jsrsasign');
|
|
216
217
|
}
|
|
217
218
|
catch (error) {
|
|
218
|
-
|
|
219
|
+
utils_1.logger.warn('Crypto preload failed:', error);
|
|
219
220
|
}
|
|
220
221
|
}
|
|
221
222
|
function createCSR(commonName, prvKeyPEM, pubKeyPEM) {
|
package/dist/cli.js
CHANGED
|
@@ -38,6 +38,7 @@ const server_1 = require("./server");
|
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const fs = __importStar(require("fs"));
|
|
40
40
|
const child_process_1 = require("child_process");
|
|
41
|
+
const utils_1 = require("./utils");
|
|
41
42
|
// 判断是否为 Windows 平台
|
|
42
43
|
const isWindows = process.platform === 'win32';
|
|
43
44
|
// 获取 npm 命令(Windows 需要使用 npm.cmd)
|
|
@@ -57,7 +58,7 @@ function getVersion() {
|
|
|
57
58
|
}
|
|
58
59
|
// 更新到最新版本
|
|
59
60
|
function update() {
|
|
60
|
-
|
|
61
|
+
utils_1.logger.log('正在检查更新...');
|
|
61
62
|
const npm = getNpmCommand();
|
|
62
63
|
try {
|
|
63
64
|
// 获取最新版本号
|
|
@@ -74,33 +75,33 @@ function update() {
|
|
|
74
75
|
const latestVersion = result.stdout.trim();
|
|
75
76
|
const currentVersion = getVersion();
|
|
76
77
|
if (latestVersion === currentVersion) {
|
|
77
|
-
|
|
78
|
+
utils_1.logger.log(`当前已是最新版本 v${currentVersion}`);
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
utils_1.logger.log(`发现新版本 v${latestVersion},当前版本 v${currentVersion}`);
|
|
82
|
+
utils_1.logger.log('正在更新...');
|
|
82
83
|
// 执行全局更新
|
|
83
84
|
const installResult = (0, child_process_1.spawnSync)(npm, ['install', '-g', 'acp-ts@latest'], {
|
|
84
85
|
stdio: 'inherit',
|
|
85
86
|
shell: true
|
|
86
87
|
});
|
|
87
88
|
if (installResult.status === 0) {
|
|
88
|
-
|
|
89
|
+
utils_1.logger.log(`更新成功!已更新到 v${latestVersion}`);
|
|
89
90
|
}
|
|
90
91
|
else {
|
|
91
92
|
// 可能是权限问题
|
|
92
93
|
if (!isWindows) {
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
utils_1.logger.log('\n更新失败,可能需要管理员权限,请尝试运行:');
|
|
95
|
+
utils_1.logger.log(' sudo npm install -g acp-ts@latest');
|
|
95
96
|
}
|
|
96
97
|
else {
|
|
97
|
-
|
|
98
|
+
utils_1.logger.log('\n更新失败,请尝试以管理员身份运行命令提示符后重试');
|
|
98
99
|
}
|
|
99
100
|
process.exit(1);
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
103
|
catch (error) {
|
|
103
|
-
|
|
104
|
+
utils_1.logger.error('更新失败:', error.message);
|
|
104
105
|
process.exit(1);
|
|
105
106
|
}
|
|
106
107
|
}
|
|
@@ -115,18 +116,18 @@ for (let i = 0; i < args.length; i++) {
|
|
|
115
116
|
process.exit(0);
|
|
116
117
|
}
|
|
117
118
|
else if (args[i] === '-v' || args[i] === '--version') {
|
|
118
|
-
|
|
119
|
+
utils_1.logger.log(`acp-ts v${getVersion()}`);
|
|
119
120
|
process.exit(0);
|
|
120
121
|
}
|
|
121
122
|
else if (args[i] === '-p' || args[i] === '--port') {
|
|
122
123
|
const portArg = args[i + 1];
|
|
123
124
|
if (!portArg || portArg.startsWith('-')) {
|
|
124
|
-
|
|
125
|
+
utils_1.logger.error('错误: -p 参数需要指定端口号');
|
|
125
126
|
process.exit(1);
|
|
126
127
|
}
|
|
127
128
|
const parsedPort = parseInt(portArg, 10);
|
|
128
129
|
if (isNaN(parsedPort) || parsedPort < 1 || parsedPort > 65535) {
|
|
129
|
-
|
|
130
|
+
utils_1.logger.error('错误: 端口号必须是 1-65535 之间的数字');
|
|
130
131
|
process.exit(1);
|
|
131
132
|
}
|
|
132
133
|
port = parsedPort;
|
|
@@ -135,7 +136,7 @@ for (let i = 0; i < args.length; i++) {
|
|
|
135
136
|
else if (args[i] === '-u' || args[i] === '--url') {
|
|
136
137
|
const urlArg = args[i + 1];
|
|
137
138
|
if (!urlArg || urlArg.startsWith('-')) {
|
|
138
|
-
|
|
139
|
+
utils_1.logger.error('错误: -u 参数需要指定 URL');
|
|
139
140
|
process.exit(1);
|
|
140
141
|
}
|
|
141
142
|
apiUrl = urlArg;
|
|
@@ -144,14 +145,14 @@ for (let i = 0; i < args.length; i++) {
|
|
|
144
145
|
else if (args[i] === '-d' || args[i] === '--data-dir') {
|
|
145
146
|
const dirArg = args[i + 1];
|
|
146
147
|
if (!dirArg || dirArg.startsWith('-')) {
|
|
147
|
-
|
|
148
|
+
utils_1.logger.error('错误: -d 参数需要指定数据目录路径');
|
|
148
149
|
process.exit(1);
|
|
149
150
|
}
|
|
150
151
|
dataDir = dirArg;
|
|
151
152
|
i++;
|
|
152
153
|
}
|
|
153
154
|
else if (args[i] === '-h' || args[i] === '--help') {
|
|
154
|
-
|
|
155
|
+
utils_1.logger.log(`
|
|
155
156
|
acp-ts - 智能体通信调试工具 v${getVersion()}
|
|
156
157
|
|
|
157
158
|
用法:
|