@inline-openclaw/inline 0.0.52 → 0.0.54

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/README.md CHANGED
@@ -39,11 +39,11 @@ Requires OpenClaw `2026.6.11` or newer.
39
39
 
40
40
  | Plugin version | OpenClaw host | Inline realtime SDK | Status | Notes |
41
41
  | --- | --- | --- | --- | --- |
42
- | `0.0.52` | `>=2026.6.11` | `0.0.13` | Current | Patch release for the SDK protocol dependency. Publish protocol and SDK first. |
43
- | `0.0.51` | `>=2026.6.11` | `0.0.12` | Superseded | Added follow-mode mention gating for eligible reply/fresh Inline threads. Prefer `0.0.52`. |
44
- | `0.0.50` | `>=2026.6.11` | `0.0.11` | Superseded | Supported line for current stable OpenClaw. Uses focused plugin SDK entrypoints and canonical ClawHub install metadata. |
45
- | `0.0.48` - `0.0.49` | `>=2026.6.11` | `0.0.11` | Superseded | Transitional 2026.6.11 compatibility releases. Prefer `0.0.52`; `0.0.49` fixed metadata shape but still used the non-canonical ClawHub spec. |
46
- | `0.0.47` and earlier | `>=2026.5.18`, tested before the `2026.6.11` floor | `0.0.11` | Legacy | Use only when an older OpenClaw host cannot be upgraded yet. Keeps the previous broad SDK compatibility path. |
42
+ | `0.0.54` | `>=2026.6.11` | `0.0.13` | Current | Keeps recovered WebSocket and best-effort cursor warnings out of healthy channel status. |
43
+ | `0.0.53` | `>=2026.6.11` | `0.0.13` | Stable | Clears recovered Inline WebSocket errors from channel status after reconnect. |
44
+ | `0.0.52` | `>=2026.6.11` | `0.0.13` | Stable | Patch release for the SDK protocol dependency. |
45
+ | `0.0.51` | `>=2026.6.11` | `0.0.12` | Stable | Added follow-mode mention gating for eligible reply/fresh Inline threads. |
46
+ | `0.0.50` | `>=2026.6.11` | `0.0.11` | Stable | Supported line for current stable OpenClaw. Uses focused plugin SDK entrypoints and canonical ClawHub install metadata. |
47
47
 
48
48
  From npm:
49
49
 
@@ -46406,6 +46406,25 @@ function formatSdkLogLine(message, meta3) {
46406
46406
  return message;
46407
46407
  return `${message} ${detail}`;
46408
46408
  }
46409
+ function isRecoverableInlineConnectionError(line) {
46410
+ return /^(WebSocket (?:closed|error|reconnect scheduled)|Protocol reconnect scheduled|Ping timeout, reconnecting|Failed to send RPC request; waiting for reconnect)/.test(line);
46411
+ }
46412
+ function isNonStickyInlineSdkWarning(line) {
46413
+ return line.startsWith("GET_UPDATES_STATE failed (continuing without date cursor)");
46414
+ }
46415
+ function isInlineConnectionRecovered(diagnostics) {
46416
+ const snapshot = diagnostics;
46417
+ const protocol2 = snapshot.protocol;
46418
+ if (protocol2?.state !== "open")
46419
+ return false;
46420
+ const transport = protocol2.transport;
46421
+ if (transport?.state != null && transport.state !== "connected")
46422
+ return false;
46423
+ if (transport?.socketReadyState != null && transport.socketReadyState !== 1)
46424
+ return false;
46425
+ const pendingCount = protocol2.ping?.pendingCount;
46426
+ return typeof pendingCount !== "number" || pendingCount === 0;
46427
+ }
46409
46428
  function formatInlineOperationError(operation, error51) {
46410
46429
  const detail = summarizeSdkMeta(error51) || String(error51);
46411
46430
  return `${operation} failed: ${detail}`;
@@ -48071,10 +48090,26 @@ async function monitorInlineProvider(params) {
48071
48090
  const hasExistingState = await stat(statePath).then(() => true).catch(() => false);
48072
48091
  await mkdir2(path4.dirname(statePath), { recursive: true });
48073
48092
  let client = null;
48093
+ let currentLastError = null;
48094
+ let recoverableConnectionError = null;
48095
+ const publishStatus = (patch) => {
48096
+ if (Object.prototype.hasOwnProperty.call(patch, "lastError")) {
48097
+ currentLastError = typeof patch.lastError === "string" ? patch.lastError : null;
48098
+ if (currentLastError == null) {
48099
+ recoverableConnectionError = null;
48100
+ }
48101
+ }
48102
+ statusSink?.(patch);
48103
+ };
48074
48104
  const pushDiagnostics = (patch) => {
48075
- statusSink?.({
48076
- ...patch,
48077
- ...client ? { diagnostics: client.getDiagnostics() } : {}
48105
+ const diagnostics = client?.getDiagnostics();
48106
+ const nextPatch = { ...patch };
48107
+ if (diagnostics && !Object.prototype.hasOwnProperty.call(nextPatch, "lastError") && currentLastError != null && currentLastError === recoverableConnectionError && isInlineConnectionRecovered(diagnostics)) {
48108
+ nextPatch.lastError = null;
48109
+ }
48110
+ publishStatus({
48111
+ ...nextPatch,
48112
+ ...diagnostics ? { diagnostics } : {}
48078
48113
  });
48079
48114
  };
48080
48115
  const sdkLog = {
@@ -48083,11 +48118,24 @@ async function monitorInlineProvider(params) {
48083
48118
  warn: (msg, meta3) => {
48084
48119
  const line = formatSdkLogLine(msg, meta3);
48085
48120
  log?.warn(line);
48121
+ if (isRecoverableInlineConnectionError(line)) {
48122
+ recoverableConnectionError = line;
48123
+ } else if (isNonStickyInlineSdkWarning(line)) {
48124
+ pushDiagnostics();
48125
+ return;
48126
+ } else {
48127
+ recoverableConnectionError = null;
48128
+ }
48086
48129
  pushDiagnostics({ lastError: line });
48087
48130
  },
48088
48131
  error: (msg, meta3) => {
48089
48132
  const line = formatSdkLogLine(msg, meta3);
48090
48133
  log?.error(line);
48134
+ if (isRecoverableInlineConnectionError(line)) {
48135
+ recoverableConnectionError = line;
48136
+ } else {
48137
+ recoverableConnectionError = null;
48138
+ }
48091
48139
  pushDiagnostics({ lastError: line });
48092
48140
  }
48093
48141
  };
@@ -48173,7 +48221,7 @@ async function monitorInlineProvider(params) {
48173
48221
  }
48174
48222
  hydratedParticipantChats.add(chatKey);
48175
48223
  })().catch((err) => {
48176
- statusSink?.({ lastError: `getChatParticipants failed: ${String(err)}` });
48224
+ publishStatus({ lastError: `getChatParticipants failed: ${String(err)}` });
48177
48225
  }).finally(() => {
48178
48226
  participantFetches.delete(chatKey);
48179
48227
  });
@@ -48197,7 +48245,7 @@ async function monitorInlineProvider(params) {
48197
48245
  }
48198
48246
  cachedDirectoryUserProfilesHydrated = true;
48199
48247
  })().catch((err) => {
48200
- statusSink?.({ lastError: `getChats failed: ${String(err)}` });
48248
+ publishStatus({ lastError: `getChats failed: ${String(err)}` });
48201
48249
  }).finally(() => {
48202
48250
  cachedDirectoryUserProfilesFetch = null;
48203
48251
  });
@@ -48210,7 +48258,7 @@ async function monitorInlineProvider(params) {
48210
48258
  chatInfo = await resolveChatInfo(client, chatCache, params2.chatId);
48211
48259
  } catch (err) {
48212
48260
  chatInfo = { kind: "group", title: null };
48213
- statusSink?.({ lastError: `getChat failed: ${String(err)}` });
48261
+ publishStatus({ lastError: `getChat failed: ${String(err)}` });
48214
48262
  }
48215
48263
  const isGroup = chatInfo.kind !== "direct";
48216
48264
  const replyThreadsEnabled = isInlineReplyThreadsEnabled({ cfg, accountId: account.accountId });
@@ -48221,7 +48269,7 @@ async function monitorInlineProvider(params) {
48221
48269
  chatInfo,
48222
48270
  chatCache
48223
48271
  }).catch((err) => {
48224
- statusSink?.({ lastError: `getChat (system event reply thread) failed: ${String(err)}` });
48272
+ publishStatus({ lastError: `getChat (system event reply thread) failed: ${String(err)}` });
48225
48273
  return null;
48226
48274
  });
48227
48275
  const effectiveChatId = replyThreadContext?.parentChatId ?? params2.chatId;
@@ -48331,7 +48379,7 @@ async function monitorInlineProvider(params) {
48331
48379
  if (!messageIds.length)
48332
48380
  return;
48333
48381
  const inboundAt = Date.now();
48334
- statusSink?.({
48382
+ publishStatus({
48335
48383
  lastInboundAt: inboundAt,
48336
48384
  lastEventAt: inboundAt,
48337
48385
  ...createTransportActivityStatusPatch(inboundAt)
@@ -48358,7 +48406,7 @@ async function monitorInlineProvider(params) {
48358
48406
  };
48359
48407
  const queueInlineReactionSystemEvent = async (params2) => {
48360
48408
  const inboundAt = Date.now();
48361
- statusSink?.({
48409
+ publishStatus({
48362
48410
  lastInboundAt: inboundAt,
48363
48411
  lastEventAt: inboundAt,
48364
48412
  ...createTransportActivityStatusPatch(inboundAt)
@@ -48400,7 +48448,7 @@ async function monitorInlineProvider(params) {
48400
48448
  if (!participant || participant.userId !== meId)
48401
48449
  return;
48402
48450
  const inboundAt = Date.now();
48403
- statusSink?.({
48451
+ publishStatus({
48404
48452
  lastInboundAt: inboundAt,
48405
48453
  lastEventAt: inboundAt,
48406
48454
  ...createTransportActivityStatusPatch(inboundAt)
@@ -48418,7 +48466,7 @@ async function monitorInlineProvider(params) {
48418
48466
  chatId: params2.chatId,
48419
48467
  limit: 10
48420
48468
  }).catch((err) => {
48421
- statusSink?.({ lastError: `getChatHistory (participant add) failed: ${String(err)}` });
48469
+ publishStatus({ lastError: `getChatHistory (participant add) failed: ${String(err)}` });
48422
48470
  return null;
48423
48471
  });
48424
48472
  const freshness = resolveInlineThreadFreshness({
@@ -48478,7 +48526,7 @@ async function monitorInlineProvider(params) {
48478
48526
  meId,
48479
48527
  botMessageIdsByChat
48480
48528
  }).catch((err) => {
48481
- statusSink?.({ lastError: `getChatHistory (reaction target) failed: ${String(err)}` });
48529
+ publishStatus({ lastError: `getChatHistory (reaction target) failed: ${String(err)}` });
48482
48530
  return false;
48483
48531
  });
48484
48532
  };
@@ -48504,7 +48552,7 @@ async function monitorInlineProvider(params) {
48504
48552
  return;
48505
48553
  }
48506
48554
  const inboundAt = Date.now();
48507
- statusSink?.({
48555
+ publishStatus({
48508
48556
  lastInboundAt: inboundAt,
48509
48557
  lastEventAt: inboundAt,
48510
48558
  ...createTransportActivityStatusPatch(inboundAt)
@@ -48514,7 +48562,7 @@ async function monitorInlineProvider(params) {
48514
48562
  chatInfo = await resolveChatInfo(client, chatCache, chatId);
48515
48563
  } catch (err) {
48516
48564
  chatInfo = { kind: "group", title: null };
48517
- statusSink?.({ lastError: `getChat failed: ${String(err)}` });
48565
+ publishStatus({ lastError: `getChat failed: ${String(err)}` });
48518
48566
  }
48519
48567
  const isGroup = chatInfo.kind !== "direct";
48520
48568
  const inlineThreadDefaults = cfg.channels?.inline ?? {};
@@ -48526,7 +48574,7 @@ async function monitorInlineProvider(params) {
48526
48574
  chatInfo,
48527
48575
  chatCache
48528
48576
  }).catch((err) => {
48529
- statusSink?.({ lastError: `getChat (reply thread) failed: ${String(err)}` });
48577
+ publishStatus({ lastError: `getChat (reply thread) failed: ${String(err)}` });
48530
48578
  return null;
48531
48579
  });
48532
48580
  const effectiveChatId = replyThreadContext?.parentChatId ?? chatId;
@@ -48738,7 +48786,7 @@ async function monitorInlineProvider(params) {
48738
48786
  code
48739
48787
  })
48740
48788
  });
48741
- statusSink?.({ lastOutboundAt: Date.now() });
48789
+ publishStatus({ lastOutboundAt: Date.now() });
48742
48790
  } catch (err) {
48743
48791
  runtime.error?.(`inline: pairing reply failed for ${senderId}: ${String(err)}`);
48744
48792
  }
@@ -48792,7 +48840,7 @@ async function monitorInlineProvider(params) {
48792
48840
  historyLimit,
48793
48841
  botMessageIdsByChat
48794
48842
  }).catch((err) => {
48795
- statusSink?.({ lastError: `getChatHistory failed: ${String(err)}` });
48843
+ publishStatus({ lastError: `getChatHistory failed: ${String(err)}` });
48796
48844
  return {
48797
48845
  historyText: null,
48798
48846
  attachmentText: null,
@@ -48929,7 +48977,7 @@ async function monitorInlineProvider(params) {
48929
48977
  });
48930
48978
  rememberSentBotMessage({ chatId, messageId: sent.messageId, replyThreadContext });
48931
48979
  }
48932
- statusSink?.({ lastOutboundAt: Date.now() });
48980
+ publishStatus({ lastOutboundAt: Date.now() });
48933
48981
  }
48934
48982
  await answerCallbackIfNeeded().catch((error51) => {
48935
48983
  runtime.error?.(`inline callback answer failed: ${String(error51)}`);
@@ -48982,7 +49030,7 @@ async function monitorInlineProvider(params) {
48982
49030
  });
48983
49031
  rememberSentBotMessage({ chatId, messageId: sent.messageId, replyThreadContext });
48984
49032
  }
48985
- statusSink?.({ lastOutboundAt: Date.now() });
49033
+ publishStatus({ lastOutboundAt: Date.now() });
48986
49034
  return;
48987
49035
  }
48988
49036
  const nativeCommandMenu = resolveInlineNativeCommandMenu({
@@ -49029,7 +49077,7 @@ async function monitorInlineProvider(params) {
49029
49077
  });
49030
49078
  rememberSentBotMessage({ chatId, messageId: sent.messageId, replyThreadContext });
49031
49079
  }
49032
- statusSink?.({ lastOutboundAt: Date.now() });
49080
+ publishStatus({ lastOutboundAt: Date.now() });
49033
49081
  await answerCallbackIfNeeded().catch((error51) => {
49034
49082
  runtime.error?.(`inline callback answer failed: ${String(error51)}`);
49035
49083
  });
@@ -49132,7 +49180,7 @@ This model will be used for your next message.`, []);
49132
49180
  }
49133
49181
  }
49134
49182
  }
49135
- statusSink?.({ lastOutboundAt: Date.now() });
49183
+ publishStatus({ lastOutboundAt: Date.now() });
49136
49184
  await answerCallbackIfNeeded().catch((error51) => {
49137
49185
  runtime.error?.(`inline callback answer failed: ${String(error51)}`);
49138
49186
  });
@@ -49169,7 +49217,7 @@ This model will be used for your next message.`, []);
49169
49217
  parentMessageId: msg.id,
49170
49218
  agentId: route.agentId
49171
49219
  }).catch((error51) => {
49172
- statusSink?.({ lastError: `reply-thread route lookup failed: ${String(error51)}` });
49220
+ publishStatus({ lastError: `reply-thread route lookup failed: ${String(error51)}` });
49173
49221
  runtime.error?.(`inline reply-thread route lookup failed: ${String(error51)}`);
49174
49222
  return null;
49175
49223
  });
@@ -49180,7 +49228,7 @@ This model will be used for your next message.`, []);
49180
49228
  chatCache,
49181
49229
  fallbackParentChatTitle: effectiveGroupTitle
49182
49230
  }).catch((error51) => {
49183
- statusSink?.({ lastError: `reply-thread route restore failed: ${String(error51)}` });
49231
+ publishStatus({ lastError: `reply-thread route restore failed: ${String(error51)}` });
49184
49232
  runtime.error?.(`inline reply-thread route restore failed: ${String(error51)}`);
49185
49233
  return null;
49186
49234
  });
@@ -49192,7 +49240,7 @@ This model will be used for your next message.`, []);
49192
49240
  parentChatId: effectiveChatId,
49193
49241
  parentMessageId: msg.id
49194
49242
  }).catch((error51) => {
49195
- statusSink?.({ lastError: `createSubthread failed: ${String(error51)}` });
49243
+ publishStatus({ lastError: `createSubthread failed: ${String(error51)}` });
49196
49244
  runtime.error?.(`inline create reply thread failed: ${String(error51)}`);
49197
49245
  return null;
49198
49246
  });
@@ -49265,7 +49313,7 @@ This model will be used for your next message.`, []);
49265
49313
  meId,
49266
49314
  botMessageIdsByChat
49267
49315
  }).catch((err) => {
49268
- statusSink?.({ lastError: `getChatHistory (reply thread parent) failed: ${String(err)}` });
49316
+ publishStatus({ lastError: `getChatHistory (reply thread parent) failed: ${String(err)}` });
49269
49317
  return null;
49270
49318
  });
49271
49319
  if (parentHistoryContext) {
@@ -49544,7 +49592,7 @@ This model will be used for your next message.`, []);
49544
49592
  }
49545
49593
  }
49546
49594
  progressState.text = text;
49547
- statusSink?.({ lastOutboundAt: Date.now() });
49595
+ publishStatus({ lastOutboundAt: Date.now() });
49548
49596
  }).catch((error51) => {
49549
49597
  runtime.error?.(`inline progress placeholder failed: ${String(error51)}`);
49550
49598
  });
@@ -49675,7 +49723,7 @@ This model will be used for your next message.`, []);
49675
49723
  }
49676
49724
  }
49677
49725
  editStreamState.accumulatedText = nextText;
49678
- statusSink?.({ lastOutboundAt: Date.now() });
49726
+ publishStatus({ lastOutboundAt: Date.now() });
49679
49727
  } catch (error51) {
49680
49728
  editStreamState.failed = true;
49681
49729
  runtime.error?.(`inline edit stream failed: ${String(error51)}`);
@@ -49912,7 +49960,7 @@ This model will be used for your next message.`, []);
49912
49960
  }
49913
49961
  await updateStreamedMessage(outboundText, callbackEditActions);
49914
49962
  delivered = true;
49915
- statusSink?.({ lastOutboundAt: Date.now() });
49963
+ publishStatus({ lastOutboundAt: Date.now() });
49916
49964
  return;
49917
49965
  }
49918
49966
  if (streamViaEditMessage && infoKind === "final" && finalDeliveredForCurrentAssistantMessage && editStreamState.messageId != null) {
@@ -49930,13 +49978,13 @@ This model will be used for your next message.`, []);
49930
49978
  if (infoKind === "final") {
49931
49979
  finalDeliveredForCurrentAssistantMessage = true;
49932
49980
  }
49933
- statusSink?.({ lastOutboundAt: Date.now() });
49981
+ publishStatus({ lastOutboundAt: Date.now() });
49934
49982
  return;
49935
49983
  }
49936
49984
  if (!outboundText.trim())
49937
49985
  return;
49938
49986
  await sendTextFallback(outboundText, true, true);
49939
- statusSink?.({ lastOutboundAt: Date.now() });
49987
+ publishStatus({ lastOutboundAt: Date.now() });
49940
49988
  return;
49941
49989
  }
49942
49990
  if (streamViaEditMessage && editStreamState.messageId != null && outboundText.trim()) {
@@ -49974,7 +50022,7 @@ Attachment: ${mediaUrl}` : `Attachment: ${mediaUrl}`;
49974
50022
  await sendTextFallback(fallbackText, isFirst, isFirst);
49975
50023
  }
49976
50024
  }
49977
- statusSink?.({ lastOutboundAt: Date.now() });
50025
+ publishStatus({ lastOutboundAt: Date.now() });
49978
50026
  },
49979
50027
  onSkip: (_payload, info) => {
49980
50028
  if (info?.reason !== "silent") {
@@ -50012,7 +50060,7 @@ Attachment: ${mediaUrl}` : `Attachment: ${mediaUrl}`;
50012
50060
  messageId: sent.messageId,
50013
50061
  replyThreadContext: deliveryReplyThreadContext
50014
50062
  });
50015
- statusSink?.({ lastOutboundAt: Date.now() });
50063
+ publishStatus({ lastOutboundAt: Date.now() });
50016
50064
  }
50017
50065
  } finally {
50018
50066
  await setParentThreadCreationTyping(false);
@@ -50088,7 +50136,7 @@ Attachment: ${mediaUrl}` : `Attachment: ${mediaUrl}`;
50088
50136
  chatId,
50089
50137
  text: INLINE_DEBOUNCE_ERROR_FALLBACK
50090
50138
  }).then(() => {
50091
- statusSink?.({ lastOutboundAt: Date.now() });
50139
+ publishStatus({ lastOutboundAt: Date.now() });
50092
50140
  }).catch((sendErr) => {
50093
50141
  runtime.error?.(`inline debounce fallback send failed: ${String(sendErr)}`);
50094
50142
  });
@@ -50110,7 +50158,7 @@ Attachment: ${mediaUrl}` : `Attachment: ${mediaUrl}`;
50110
50158
  chatInfo = await resolveChatInfo(client, chatCache, entry.chatId);
50111
50159
  } catch (err) {
50112
50160
  chatInfo = { kind: "group", title: null };
50113
- statusSink?.({ lastError: `getChat failed: ${String(err)}` });
50161
+ publishStatus({ lastError: `getChat failed: ${String(err)}` });
50114
50162
  }
50115
50163
  const isGroup = chatInfo.kind !== "direct";
50116
50164
  const replyThreadsEnabled = isInlineReplyThreadsEnabled({ cfg, accountId: account.accountId });
@@ -50121,7 +50169,7 @@ Attachment: ${mediaUrl}` : `Attachment: ${mediaUrl}`;
50121
50169
  chatInfo,
50122
50170
  chatCache
50123
50171
  }).catch((err) => {
50124
- statusSink?.({ lastError: `getChat (abort reply thread) failed: ${String(err)}` });
50172
+ publishStatus({ lastError: `getChat (abort reply thread) failed: ${String(err)}` });
50125
50173
  return null;
50126
50174
  });
50127
50175
  const effectiveChatId = replyThreadContext?.parentChatId ?? entry.chatId;
@@ -50224,13 +50272,13 @@ Attachment: ${mediaUrl}` : `Attachment: ${mediaUrl}`;
50224
50272
  }
50225
50273
  } catch (error51) {
50226
50274
  const message = String(error51);
50227
- statusSink?.({ lastError: message });
50275
+ publishStatus({ lastError: message });
50228
50276
  runtime.error?.(`inline ${label} failed: ${message}`);
50229
50277
  return;
50230
50278
  }
50231
50279
  const tracked = task.catch((error51) => {
50232
50280
  const message = String(error51);
50233
- statusSink?.({ lastError: message });
50281
+ publishStatus({ lastError: message });
50234
50282
  runtime.error?.(`inline ${label} failed: ${message}`);
50235
50283
  }).finally(() => {
50236
50284
  pendingInboundTasks.delete(tracked);
@@ -50506,7 +50554,7 @@ Attachment: ${mediaUrl}` : `Attachment: ${mediaUrl}`;
50506
50554
  }
50507
50555
  }
50508
50556
  } catch (err) {
50509
- statusSink?.({ lastError: String(err) });
50557
+ publishStatus({ lastError: String(err) });
50510
50558
  runtime.error?.(`inline monitor loop crashed: ${String(err)}`);
50511
50559
  }
50512
50560
  })();
@@ -53233,5 +53281,5 @@ export {
53233
53281
  inlineChannelPlugin
53234
53282
  };
53235
53283
 
53236
- //# debugId=02F10208EE86F71264756E2164756E21
53284
+ //# debugId=B0FC90E7FD8F9EE064756E2164756E21
53237
53285
  //# sourceMappingURL=channel-plugin-api.js.map