claw-subagent-service 0.0.47 → 0.0.49

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/cli.js CHANGED
@@ -26,6 +26,8 @@ const command = args[0] || '--run';
26
26
 
27
27
  function runDaemon() {
28
28
  console.log('[CLI] 启动 Daemon...');
29
+ console.log(`[CLI] CLI 路径: ${__filename}`);
30
+ console.log(`[CLI] Daemon 路径: ${DAEMON_PATH}`);
29
31
 
30
32
  const daemon = spawn('node', [DAEMON_PATH], {
31
33
  stdio: 'inherit',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claw-subagent-service",
3
- "version": "0.0.47",
3
+ "version": "0.0.49",
4
4
  "description": "虾说智能助手",
5
5
  "main": "cli.js",
6
6
  "bin": {
package/service/daemon.js CHANGED
@@ -177,6 +177,8 @@ function startWorker(isAfterUpdate = false, backupDirForRollback = null) {
177
177
  if (stopping || isRollingBack) return;
178
178
 
179
179
  log.info(`[DAEMON] 启动 Worker,daemon PID: ${process.pid},更新后重启: ${isAfterUpdate}`);
180
+ log.info(`[DAEMON] Daemon 目录: ${__dirname}`);
181
+ log.info(`[DAEMON] Worker 路径: ${WORKER_PATH}`);
180
182
 
181
183
  // 启动前释放旧端口,防止旧 worker 残留占用
182
184
  freePortIfNeeded(PORT);
@@ -42,14 +42,15 @@ class RongCloudClient {
42
42
  this.log?.info(`[RongCloudClient] has sendReadReceiptResponseV2: ${typeof RongIMLib.sendReadReceiptResponseV2 === 'function'}`);
43
43
  this.log?.info(`[RongCloudClient] has sendReadReceiptResponseV5: ${typeof RongIMLib.sendReadReceiptResponseV5 === 'function'}`);
44
44
 
45
- // 同时注册新版 addEventListener 和旧版 setOnReceiveMessageListener
46
- // 某些场景下(如群聊消息)SDK 可能只通过旧版监听器分发
45
+ // 优先使用新版 addEventListener;与旧版 setOnReceiveMessageListener 互斥
46
+ // 避免同时注册导致 SDK 内部回调冲突或覆盖
47
47
  if (RongIMLib.addEventListener) {
48
- this.log?.info('[RongCloudClient] 注册 addEventListener 事件');
48
+ this.log?.info('[RongCloudClient] 使用 addEventListener 模式');
49
49
 
50
50
  RongIMLib.addEventListener(RongIMLib.Events?.MESSAGES || 'MESSAGES', (event) => {
51
51
  this.log?.info(`[RongCloudClient] MESSAGES 事件触发, messages长度=${event?.messages?.length || 0}`);
52
52
  event.messages?.forEach(msg => {
53
+ this.log?.info(`[RongCloudClient] MESSAGES 单条消息: messageType=${msg.messageType}, senderUserId=${msg.senderUserId}, conversationType=${msg.conversationType}, isOffLineMessage=${msg.isOffLineMessage}, messageDirection=${msg.messageDirection}`);
53
54
  this.handleReceivedMessage(msg);
54
55
  });
55
56
  });
@@ -68,26 +69,21 @@ class RongCloudClient {
68
69
  this.log?.warn(`[RongCloudClient] 断开连接, code: ${code}`);
69
70
  this.isConnected = false;
70
71
  });
71
- }
72
-
73
- // 兜底:旧版监听器,防止群聊消息漏收
74
- if (RongIMLib.setOnReceiveMessageListener) {
75
- this.log?.info('[RongCloudClient] 注册 setOnReceiveMessageListener 兜底');
76
- RongIMLib.setOnReceiveMessageListener({
77
- onReceived: (message) => {
78
- this.log?.info(`[RongCloudClient] setOnReceiveMessageListener 收到消息: messageType=${message.messageType}, senderUserId=${message.senderUserId}, conversationType=${message.conversationType}`);
79
- this.handleReceivedMessage(message);
80
- }
81
- });
82
- }
83
-
84
- if (RongIMLib.setConnectionStatusListener && !RongIMLib.addEventListener) {
72
+ } else if (RongIMLib.setOnReceiveMessageListener) {
73
+ this.log?.info('[RongCloudClient] 使用 setOnReceiveMessageListener 模式');
85
74
  RongIMLib.setConnectionStatusListener({
86
75
  onChanged: (status) => {
87
76
  this.log?.info(`[RongCloudClient] 连接状态变化: ${status}`);
88
77
  this.isConnected = status === 3 || status === 'Connected';
89
78
  }
90
79
  });
80
+
81
+ RongIMLib.setOnReceiveMessageListener({
82
+ onReceived: (message) => {
83
+ this.log?.info(`[RongCloudClient] onReceived: messageType=${message.messageType}, senderUserId=${message.senderUserId}, conversationType=${message.conversationType}, isOffLineMessage=${message.isOffLineMessage}, messageDirection=${message.messageDirection}`);
84
+ this.handleReceivedMessage(message);
85
+ }
86
+ });
91
87
  }
92
88
 
93
89
  try {
@@ -111,6 +107,9 @@ class RongCloudClient {
111
107
  }
112
108
 
113
109
  handleReceivedMessage(message) {
110
+ // 最外层日志:确保任何消息到达都能留下痕迹(在过滤之前)
111
+ this.log?.info(`[RongCloudClient] handleReceivedMessage 入口: messageType=${message.messageType}, senderUserId=${message.senderUserId}, conversationType=${message.conversationType}, isOffLineMessage=${message.isOffLineMessage}, messageDirection=${message.messageDirection}, messageUId=${message.messageUId}`);
112
+
114
113
  // 1. 不再静默过滤离线消息:Docker 中每次启动都是新连接,
115
114
  // 群聊@消息常以离线消息形式推送,过滤会导致消息丢失
116
115
  if (message.isOffLineMessage) {
@@ -120,15 +119,18 @@ class RongCloudClient {
120
119
  // 2. 过滤自己发送的消息(融云 SDK 可能将发送消息回传)
121
120
  // messageDirection: 1=发送, 2=接收
122
121
  if (message.messageDirection === 1) {
122
+ this.log?.info('[RongCloudClient] 过滤自己发送的消息 (messageDirection=1)');
123
123
  return;
124
124
  }
125
125
  if (message.senderUserId === this.config.accountId) {
126
+ this.log?.info(`[RongCloudClient] 过滤自己发送的消息 (senderUserId=${message.senderUserId} === accountId=${this.config.accountId})`);
126
127
  return;
127
128
  }
128
129
 
129
130
  // 3. 消息去重:防止同一条消息被多次触发(融云重推或多端同步)
130
131
  const dedupKey = message.messageUId || `${message.senderUserId}-${message.sentTime}-${message.messageType}`;
131
132
  if (this.processedMessageUIds.has(dedupKey)) {
133
+ this.log?.info(`[RongCloudClient] 消息去重过滤: dedupKey=${dedupKey}`);
132
134
  return;
133
135
  }
134
136
  this.processedMessageUIds.add(dedupKey);
package/service/worker.js CHANGED
@@ -260,6 +260,9 @@ async function refreshRongCloudToken() {
260
260
  async function initRongCloud() {
261
261
  if (!rongcloudConfig) return;
262
262
 
263
+ log.info(`[WORKER] Worker 启动,目录: ${__dirname}`);
264
+ log.info(`[WORKER] 代码版本特征: isOffLineMessage-pass-through, messageDirection-log, addEventListener-exclusive`);
265
+
263
266
  // 启动 opencode 服务(与桌面客户端对齐)
264
267
  log.info('[WORKER] 启动 opencode 服务...');
265
268
  try {