openclaw-lark-multi-agent 1.8.6 → 1.8.8

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.
@@ -1452,7 +1452,14 @@ export class FeishuBot {
1452
1452
  state = 'rejected'; // prior explicit backend refusal; never silently move it to a successor
1453
1453
  if (state === 'unavailable' || state === 'capability_blocked')
1454
1454
  state = 'pending';
1455
- const record = { ...item, attempted: valid ? (receipt.attempted ?? true) : true, sessionId: item.sessionId, reason: receipt.reason };
1455
+ // Unknown is the NORMAL transient state right after a steer attempt
1456
+ // (the backend acceptance receipt has not landed yet); surfacing it on
1457
+ // every insertion spams the chat (user report 2026-10-16: "每次插入消
1458
+ // 息都发个这个"). Stay silent until it persists through several
1459
+ // re-checks (~45s), then notify exactly once.
1460
+ const unknownChecks = state === 'unknown' ? (Number(item.unknownChecks) || 0) + 1 : 0;
1461
+ const unknownNotified = Boolean(item.unknownNotified) || (state === 'unknown' && unknownChecks >= 3);
1462
+ const record = { ...item, attempted: valid ? (receipt.attempted ?? true) : true, sessionId: item.sessionId, reason: receipt.reason, unknownChecks, unknownNotified };
1456
1463
  this.store.saveInsertion(this.config.name, chatId, item.rowId, item.insertionId, state, record, Date.now() + (state === 'unknown' ? 15_000 : 5000));
1457
1464
  if (state === 'ordinary') {
1458
1465
  void this.enqueueAndDispatchDelivery(chatId, 'insertion_status', `insertion:${item.insertionId}:ordinary`, 'ℹ️ 原 run 已明确结束,且这条消息确定未被插入;现已交回普通队列,只执行一次。', [], item.messageId, `insertion:${item.insertionId}:ordinary`).catch(() => { });
@@ -1475,10 +1482,13 @@ export class FeishuBot {
1475
1482
  this.admittedSteerAcks.set(chatId, list);
1476
1483
  }
1477
1484
  }
1478
- else if (state === 'unknown' || state === 'target_changed' || state === 'rejected') {
1485
+ else if (state === 'target_changed' || state === 'rejected') {
1479
1486
  if (item.state !== state)
1480
1487
  void this.enqueueAndDispatchDelivery(chatId, 'insertion_status', `insertion:${item.insertionId}:${state}`, `ℹ️ 这条插入消息的状态为 ${state},仍保留本地记录,未确认接收前不会显示 Get,也不会自动重复执行。${receipt.reason || ''}`, [], item.messageId, `insertion:${item.insertionId}:${state}`).catch(() => { });
1481
1488
  }
1489
+ else if (state === 'unknown' && unknownNotified && !item.unknownNotified) {
1490
+ void this.enqueueAndDispatchDelivery(chatId, 'insertion_status', `insertion:${item.insertionId}:unknown-prolonged`, `ℹ️ 这条插入消息约 45 秒仍未确认接收:本地记录保留中,不会自动重复执行;确认后会自动显示 Get。`, [], item.messageId, `insertion:${item.insertionId}:unknown-prolonged`).catch(() => { });
1491
+ }
1482
1492
  }
1483
1493
  }
1484
1494
  finally {
@@ -1340,8 +1340,27 @@ export class OpenClawClient {
1340
1340
  }
1341
1341
  }
1342
1342
  else if (toolName === "message" && (tphase === "end" || tphase === "error")) {
1343
- const out = String(JSON.stringify(tdata.output ?? tdata.result ?? tdata.error ?? ""));
1344
- if (/"?terminate"?\s*[:=]\s*true/i.test(out) && !terminatingSendTimer) {
1343
+ // Top-level check ONLY: a read/reaction result whose content
1344
+ // merely mentions "terminate=true" (e.g. quoting this very
1345
+ // bug report in chat) must never be mistaken for a
1346
+ // terminating send.
1347
+ const rawOut = tdata.output ?? tdata.result ?? tdata.error ?? null;
1348
+ let terminating = false;
1349
+ try {
1350
+ if (rawOut && typeof rawOut === "object")
1351
+ terminating = rawOut.terminate === true;
1352
+ else if (typeof rawOut === "string") {
1353
+ const trimmed = rawOut.trim();
1354
+ if (trimmed.startsWith("{")) {
1355
+ const parsed = JSON.parse(trimmed);
1356
+ terminating = parsed && typeof parsed === "object" && parsed.terminate === true;
1357
+ }
1358
+ else
1359
+ terminating = /^terminate\s*=\s*true$/i.test(trimmed);
1360
+ }
1361
+ }
1362
+ catch { /* unparseable output is not evidence */ }
1363
+ if (terminating && !terminatingSendTimer) {
1345
1364
  terminatingSendTimer = setTimeout(() => {
1346
1365
  terminatingSendTimer = null;
1347
1366
  if (observationClosed)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-lark-multi-agent",
3
- "version": "1.8.6",
3
+ "version": "1.8.8",
4
4
  "description": "Multi-bot Lark/Feishu bridge for OpenClaw, with per-bot model routing and isolated sessions",
5
5
  "type": "module",
6
6
  "scripts": {