claw-subagent-service 0.0.170 → 0.0.172
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/package.json +1 -1
- package/service/worker.js +31 -16
package/package.json
CHANGED
package/service/worker.js
CHANGED
|
@@ -135,7 +135,7 @@ try {
|
|
|
135
135
|
process.cwd();
|
|
136
136
|
} catch (e) {
|
|
137
137
|
if (e.code === 'ENOENT') {
|
|
138
|
-
try { process.chdir(os.tmpdir()); } catch {}
|
|
138
|
+
try { process.chdir(os.tmpdir()); } catch { }
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
|
|
@@ -224,7 +224,6 @@ function loadRongCloudConfig() {
|
|
|
224
224
|
|
|
225
225
|
if (!config.appKey) {
|
|
226
226
|
config.appKey = process.env.DM_APP_KEY || 'bmdehs6pbyyks';
|
|
227
|
-
log.info(`[WORKER] 使用默认 appKey: ${config.appKey}`);
|
|
228
227
|
}
|
|
229
228
|
|
|
230
229
|
// 设置默认心跳间隔为20秒
|
|
@@ -232,7 +231,7 @@ function loadRongCloudConfig() {
|
|
|
232
231
|
config.heartbeatInterval = 20;
|
|
233
232
|
}
|
|
234
233
|
|
|
235
|
-
log.info(`[WORKER] 最终 apiBaseUrl: ${config.apiBaseUrl}`);
|
|
234
|
+
// log.info(`[WORKER] 最终 apiBaseUrl: ${config.apiBaseUrl}`);
|
|
236
235
|
|
|
237
236
|
if (config.token && config.accountId) {
|
|
238
237
|
return config;
|
|
@@ -263,6 +262,7 @@ async function refreshRongCloudToken() {
|
|
|
263
262
|
const resp = await axios.get(`${serverUrl}/api/claw/token/${nodeId}`, { timeout: 15000 });
|
|
264
263
|
if (resp.data?.code === 200) {
|
|
265
264
|
const newToken = resp.data.data?.token || resp.data.token || '';
|
|
265
|
+
const newAppKey = resp.data.data?.app_key || resp.data.app_key || '';
|
|
266
266
|
if (!newToken) {
|
|
267
267
|
log.error('[WORKER] 服务端返回了空 token');
|
|
268
268
|
return false;
|
|
@@ -271,12 +271,19 @@ async function refreshRongCloudToken() {
|
|
|
271
271
|
|
|
272
272
|
// 更新内存配置
|
|
273
273
|
rongcloudConfig.token = newToken;
|
|
274
|
+
if (newAppKey) {
|
|
275
|
+
rongcloudConfig.appKey = newAppKey;
|
|
276
|
+
log.info(`[WORKER] appKey 已更新: ${newAppKey}`);
|
|
277
|
+
}
|
|
274
278
|
|
|
275
279
|
// 保存到 config.json
|
|
276
280
|
try {
|
|
277
281
|
if (fs.existsSync(clawBridgeConfigPath)) {
|
|
278
282
|
const clawConfig = JSON.parse(fs.readFileSync(clawBridgeConfigPath, 'utf8'));
|
|
279
283
|
clawConfig.token = newToken;
|
|
284
|
+
if (newAppKey) {
|
|
285
|
+
clawConfig.appKey = newAppKey;
|
|
286
|
+
}
|
|
280
287
|
clawConfig.expiresAt = Date.now() + 7 * 24 * 60 * 60 * 1000; // 7天
|
|
281
288
|
fs.writeFileSync(clawBridgeConfigPath, JSON.stringify(clawConfig, null, 2));
|
|
282
289
|
log.info('[WORKER] 新 token 已保存到 config.json');
|
|
@@ -289,7 +296,7 @@ async function refreshRongCloudToken() {
|
|
|
289
296
|
log.error(`[WORKER] 刷新 token 失败: ${resp.data?.message || '未知错误'}`);
|
|
290
297
|
return false;
|
|
291
298
|
} catch (err) {
|
|
292
|
-
|
|
299
|
+
log.error(`[WORKER] 刷新 token 异常: ${err.message}`);
|
|
293
300
|
return false;
|
|
294
301
|
}
|
|
295
302
|
}
|
|
@@ -341,12 +348,17 @@ async function syncCustomerServiceAccountId() {
|
|
|
341
348
|
|
|
342
349
|
if (tokenResp.data?.code === 200) {
|
|
343
350
|
const newToken = tokenResp.data.data?.token || tokenResp.data.token || '';
|
|
351
|
+
const newAppKey = tokenResp.data.data?.app_key || tokenResp.data.app_key || '';
|
|
344
352
|
if (newToken) {
|
|
345
353
|
log.info(`[WORKER] 获取客服账号 token 成功: ${csAccountId}`);
|
|
346
354
|
|
|
347
355
|
// 更新内存配置(影响后续融云连接)
|
|
348
356
|
rongcloudConfig.accountId = csAccountId;
|
|
349
357
|
rongcloudConfig.token = newToken;
|
|
358
|
+
if (newAppKey) {
|
|
359
|
+
rongcloudConfig.appKey = newAppKey;
|
|
360
|
+
log.info(`[WORKER] 客服账号 appKey 已更新: ${newAppKey}`);
|
|
361
|
+
}
|
|
350
362
|
|
|
351
363
|
// 持久化到本地 config.json(确保重启后仍使用新配置)
|
|
352
364
|
try {
|
|
@@ -354,6 +366,9 @@ async function syncCustomerServiceAccountId() {
|
|
|
354
366
|
const clawConfig = JSON.parse(fs.readFileSync(clawBridgeConfigPath, 'utf8'));
|
|
355
367
|
clawConfig.nodeId = csAccountId;
|
|
356
368
|
clawConfig.token = newToken;
|
|
369
|
+
if (newAppKey) {
|
|
370
|
+
clawConfig.appKey = newAppKey;
|
|
371
|
+
}
|
|
357
372
|
clawConfig.expiresAt = Date.now() + 7 * 24 * 60 * 60 * 1000; // 7天
|
|
358
373
|
fs.writeFileSync(clawBridgeConfigPath, JSON.stringify(clawConfig, null, 2));
|
|
359
374
|
log.info(`[WORKER] 客服账号已持久化到 config.json: ${csAccountId}`);
|
|
@@ -402,7 +417,7 @@ async function initRongCloud() {
|
|
|
402
417
|
const configChanged = await syncCustomerServiceAccountId();
|
|
403
418
|
if (configChanged) {
|
|
404
419
|
log.info('[WORKER] 客服账号已切换到数据库配置的 ID,将使用新配置连接融云');
|
|
405
|
-
}
|
|
420
|
+
}
|
|
406
421
|
log.info(`[WORKER] 代码版本特征: isOffLineMessage-pass-through, messageDirection-log, addEventListener-exclusive`);
|
|
407
422
|
|
|
408
423
|
// 启动 opencode 服务(与桌面客户端对齐)
|
|
@@ -443,7 +458,7 @@ async function initRongCloud() {
|
|
|
443
458
|
// 融云 SDK 对自定义消息可能直接返回对象而非 JSON 字符串
|
|
444
459
|
if (msg.content) {
|
|
445
460
|
let parsed = null;
|
|
446
|
-
|
|
461
|
+
|
|
447
462
|
if (typeof msg.content === 'string') {
|
|
448
463
|
// 字符串类型:尝试 JSON 解析
|
|
449
464
|
try {
|
|
@@ -568,7 +583,7 @@ async function shutdownRongCloud() {
|
|
|
568
583
|
if (global.dashboardReporter) {
|
|
569
584
|
global.dashboardReporter.stop();
|
|
570
585
|
}
|
|
571
|
-
|
|
586
|
+
|
|
572
587
|
if (rongcloudClient) {
|
|
573
588
|
// 发送 CLIENT_DISCONNECTED
|
|
574
589
|
try {
|
|
@@ -578,11 +593,11 @@ async function shutdownRongCloud() {
|
|
|
578
593
|
} catch (err) {
|
|
579
594
|
log.error(`[WORKER] 发送 CLIENT_DISCONNECTED 失败: ${err.message}`);
|
|
580
595
|
}
|
|
581
|
-
|
|
596
|
+
|
|
582
597
|
await rongcloudClient.disconnect();
|
|
583
598
|
log.info('[WORKER] 融云已断开');
|
|
584
599
|
}
|
|
585
|
-
|
|
600
|
+
|
|
586
601
|
// 停止 opencode 服务
|
|
587
602
|
stopOpencodeService(log);
|
|
588
603
|
}
|
|
@@ -644,7 +659,7 @@ server.on('error', (err) => {
|
|
|
644
659
|
// 延迟 3 秒后重试,给进程退出和端口释放留出足够时间
|
|
645
660
|
setTimeout(() => {
|
|
646
661
|
log.info(`[WORKER] 重新尝试监听端口 ${PORT}...`);
|
|
647
|
-
server.close(() => {});
|
|
662
|
+
server.close(() => { });
|
|
648
663
|
server.listen(PORT, HOST);
|
|
649
664
|
}, 3000);
|
|
650
665
|
return;
|
|
@@ -681,20 +696,20 @@ async function gracefulShutdown(signal) {
|
|
|
681
696
|
return;
|
|
682
697
|
}
|
|
683
698
|
isShuttingDown = true;
|
|
684
|
-
|
|
699
|
+
|
|
685
700
|
log.info(`[WORKER] 收到 ${signal} 信号,开始优雅退出...`);
|
|
686
|
-
|
|
701
|
+
|
|
687
702
|
try {
|
|
688
703
|
await shutdownRongCloud();
|
|
689
704
|
} catch (err) {
|
|
690
705
|
log.error(`[WORKER] 关闭融云异常: ${err.message}`);
|
|
691
706
|
}
|
|
692
|
-
|
|
707
|
+
|
|
693
708
|
// 关闭 HTTP 服务
|
|
694
709
|
server.close(() => {
|
|
695
710
|
log.info('[WORKER] HTTP 服务已关闭');
|
|
696
711
|
});
|
|
697
|
-
|
|
712
|
+
|
|
698
713
|
// 给 3 秒时间完成关闭操作
|
|
699
714
|
setTimeout(() => {
|
|
700
715
|
log.info('[WORKER] 退出进程');
|
|
@@ -739,7 +754,7 @@ process.on('unhandledRejection', async (reason) => {
|
|
|
739
754
|
|
|
740
755
|
// 拦截 process.exit 以定位调用来源
|
|
741
756
|
const originalExit = process.exit;
|
|
742
|
-
process.exit = function(code) {
|
|
757
|
+
process.exit = function (code) {
|
|
743
758
|
const stack = new Error('process.exit called from:').stack;
|
|
744
759
|
log.error(`[WORKER] process.exit(${code}) 被调用:\n${stack}`);
|
|
745
760
|
originalExit.call(process, code);
|
|
@@ -752,7 +767,7 @@ process.on('exit', (code) => {
|
|
|
752
767
|
// 同步发送,因为 exit 事件不支持异步
|
|
753
768
|
try {
|
|
754
769
|
const messageSender = new RongyunMessageSender(rongcloudClient, rongcloudConfig, log);
|
|
755
|
-
messageSender.sendClientDisconnected().catch(() => {});
|
|
770
|
+
messageSender.sendClientDisconnected().catch(() => { });
|
|
756
771
|
} catch (e) {
|
|
757
772
|
// 忽略错误
|
|
758
773
|
}
|