@openclaw/irc 2026.10.10-beta.4 → 2026.10.10-beta.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.
@@ -207,7 +207,7 @@ async function startIrcGatewayAccount(ctx) {
207
207
  });
208
208
  if (!account.configured) throw new Error(`IRC is not configured for account "${account.accountId}" (need host and nick in channels.irc).`);
209
209
  ctx.log?.info?.(`[${account.accountId}] starting IRC provider (${account.host}:${account.port}${account.tls ? " tls" : ""})`);
210
- const { monitorIrcProvider } = await import("./channel-runtime-CxEHlDNB.mjs");
210
+ const { monitorIrcProvider } = await import("./channel-runtime-B4OMtNnX.mjs");
211
211
  await runPassiveAccountLifecycle({
212
212
  abortSignal: ctx.abortSignal,
213
213
  start: async () => await monitorIrcProvider({
@@ -507,6 +507,7 @@ const IRC_MAX_LINE_BYTES = 512;
507
507
  const IRC_MAX_RELAY_USER_BYTES = 11;
508
508
  const IRC_MAX_RELAY_HOST_BYTES = 63;
509
509
  const IRC_MAX_INBOUND_LINE_LENGTH = 16384;
510
+ const IRC_LIVENESS_TIMEOUT_MS = 24e4;
510
511
  function takeIrcPrivmsgChunk(text, maxChars, maxBytes) {
511
512
  let end = 0;
512
513
  let bytes = 0;
@@ -646,9 +647,20 @@ async function connectIrcClient(options) {
646
647
  throw error;
647
648
  });
648
649
  };
650
+ let lastReceivedAt = Date.now();
651
+ const livenessTimer = setInterval(() => {
652
+ if (!ready || closed) return;
653
+ const silentMs = Date.now() - lastReceivedAt;
654
+ if (silentMs >= IRC_LIVENESS_TIMEOUT_MS) {
655
+ fail(/* @__PURE__ */ new Error(`IRC server sent nothing for ${Math.round(silentMs / 1e3)}s; reconnecting`));
656
+ socket.destroy();
657
+ } else if (silentMs >= IRC_LIVENESS_TIMEOUT_MS / 2) sendRaw("PING :openclaw");
658
+ }, 3e4);
659
+ livenessTimer.unref();
649
660
  const quit = (reason) => {
650
661
  if (closed) return;
651
662
  closed = true;
663
+ clearInterval(livenessTimer);
652
664
  removeAbortListener?.();
653
665
  removeAbortListener = null;
654
666
  const safeReason = sanitizeIrcOutboundText(reason ?? "bye");
@@ -661,6 +673,7 @@ async function connectIrcClient(options) {
661
673
  const close = () => {
662
674
  if (closed) return;
663
675
  closed = true;
676
+ clearInterval(livenessTimer);
664
677
  removeAbortListener?.();
665
678
  removeAbortListener = null;
666
679
  socket.destroy();
@@ -675,6 +688,7 @@ async function connectIrcClient(options) {
675
688
  };
676
689
  socket.on("data", (chunk) => {
677
690
  if (receiveOverflowed) return;
691
+ lastReceivedAt = Date.now();
678
692
  buffer += chunk;
679
693
  let idx = buffer.indexOf("\n");
680
694
  while (idx !== -1) {
@@ -763,6 +777,7 @@ async function connectIrcClient(options) {
763
777
  fail(err);
764
778
  });
765
779
  socket.once("close", () => {
780
+ clearInterval(livenessTimer);
766
781
  if (!closed) {
767
782
  closed = true;
768
783
  removeAbortListener?.();
@@ -1775,7 +1790,7 @@ const ircPlugin = createChatChannelPlugin({
1775
1790
  notify: async ({ cfg, id, message, accountId }) => {
1776
1791
  const target = normalizePairingTarget(id);
1777
1792
  if (!target) throw new Error(`invalid IRC pairing id: ${id}`);
1778
- const { sendMessageIrc } = await import("./channel-runtime-CxEHlDNB.mjs");
1793
+ const { sendMessageIrc } = await import("./channel-runtime-B4OMtNnX.mjs");
1779
1794
  await sendMessageIrc(target, message, {
1780
1795
  cfg,
1781
1796
  accountId
@@ -0,0 +1,2 @@
1
+ export { t as ircPlugin } from "./channel-Bi4lj8N2.mjs";
2
+ import "../channel-plugin-api.js";
@@ -1,4 +1,4 @@
1
- import { a as resolveIrcGroupRequireMention, c as connectIrcClient, d as sanitizeIrcAssistantText, f as createIrcIngressSubject, h as normalizeIrcAllowEntry, i as resolveIrcGroupMatch, l as parseIrcLine, m as isChannelTarget, o as sendMessageIrc, p as ircIngressIdentity, s as buildIrcConnectOptions, u as parseIrcPrefix, y as resolveIrcAccount } from "./channel-BBSRLy1I.mjs";
1
+ import { a as resolveIrcGroupRequireMention, c as connectIrcClient, d as sanitizeIrcAssistantText, f as createIrcIngressSubject, h as normalizeIrcAllowEntry, i as resolveIrcGroupMatch, l as parseIrcLine, m as isChannelTarget, o as sendMessageIrc, p as ircIngressIdentity, s as buildIrcConnectOptions, u as parseIrcPrefix, y as resolveIrcAccount } from "./channel-Bi4lj8N2.mjs";
2
2
  import { t as getIrcRuntime } from "./runtime-C_V9tmpk.mjs";
3
3
  import { channelIngressRoutes } from "openclaw/plugin-sdk/channel-ingress-runtime";
4
4
  import { computeBackoff } from "openclaw/plugin-sdk/runtime-env";
@@ -1 +1 @@
1
- {"version":3,"entries":[{"output":"api.js","source":"extensions/irc/api.ts"},{"output":"channel-config-api.js","source":"extensions/irc/channel-config-api.ts"},{"output":"channel-plugin-api.js","source":"extensions/irc/channel-plugin-api.ts"},{"output":"doctor-contract-api.js","source":"extensions/irc/doctor-contract-api.ts"},{"output":"index.js","source":"extensions/irc/index.ts"},{"output":"runtime-api.js","source":"extensions/irc/runtime-api.ts"},{"output":"secret-contract-api.js","source":"extensions/irc/secret-contract-api.ts"},{"output":"setup-entry.js","source":"extensions/irc/setup-entry.ts"}],"chunks":[{"output":".setup/channel-BBSRLy1I.mjs","sha256":"66113137b8071a6d69d3618f90f2902ea83174c7e09e7f27ff08a7f6d468a820","facadeSource":null,"sources":["extensions/irc/src/accounts.ts","extensions/irc/src/channel.ts","extensions/irc/src/client.ts","extensions/irc/src/connect-options.ts","extensions/irc/src/control-chars.ts","extensions/irc/src/doctor.ts","extensions/irc/src/gateway.ts","extensions/irc/src/ingress-identity.ts","extensions/irc/src/message-adapter.ts","extensions/irc/src/normalize.ts","extensions/irc/src/outbound-base.ts","extensions/irc/src/policy.ts","extensions/irc/src/probe.ts","extensions/irc/src/protocol.ts","extensions/irc/src/send.ts","extensions/irc/src/setup-core.ts","extensions/irc/src/setup-surface.ts","packages/normalization-core/src/grapheme.ts","packages/normalization-core/src/utf16-slice.ts"]},{"output":".setup/channel-plugin-api-8bCK12Fl.mjs","sha256":"6e40b4c90f7ee656dfee19a760779ee8fb2fb01366af18220a95ef213caa9bf9","facadeSource":"extensions/irc/channel-plugin-api.ts","sources":[]},{"output":".setup/channel-runtime-CxEHlDNB.mjs","sha256":"bdec448d68b550dd66808bd226dd37382df2d3ed380c2565f422f5d9983876ac","facadeSource":"extensions/irc/src/channel-runtime.ts","sources":["extensions/irc/src/inbound.ts","extensions/irc/src/irc-ingress.ts","extensions/irc/src/monitor.ts","extensions/irc/src/reconnect-backoff.ts"]},{"output":".setup/config-schema-Cy9tItsu.mjs","sha256":"add8978c6443fac3c442d7d66449010bad9142b38ad2d4f127e048a27379424d","facadeSource":null,"sources":["extensions/irc/src/config-schema.ts","extensions/irc/src/config-ui-hints.ts"]},{"output":".setup/runtime-C_V9tmpk.mjs","sha256":"3f1f1b4d7ee63152a339b6a4614a28f57972bf655c73e0e7083c837370bc094c","facadeSource":null,"sources":["extensions/irc/src/runtime.ts"]},{"output":".setup/secret-contract-api-4IT9_EK6.mjs","sha256":"8d9275ff824f6c76b94e80dc043be8a12df9c8b3dc7203faa58bd2fc1bf3c244","facadeSource":"extensions/irc/secret-contract-api.ts","sources":[]},{"output":".setup/secret-contract-C5i-29Hz.mjs","sha256":"2eb99571f8fac572bc6d2a7cafe7bf7f2d864101256eb7b5aa6876fd031ee914","facadeSource":null,"sources":["extensions/irc/src/secret-contract.ts"]},{"output":"api.js","sha256":"f75224f9205bc3aa0786faf9b0291f1e5ccb89edf68c79e1ce447bfc56f6dba2","facadeSource":"extensions/irc/api.ts","sources":[]},{"output":"channel-config-api.js","sha256":"0992ef0872e2bb3dd21649d22af2bb491279f6f01d80466db2d38fed0c69f534","facadeSource":"extensions/irc/channel-config-api.ts","sources":[]},{"output":"channel-plugin-api.js","sha256":"4e99fdfcbd0cf7f6d36dcd322b2ae90ea143035ec1855fa239a888855a53a7d4","facadeSource":"extensions/irc/channel-plugin-api.ts","sources":[]},{"output":"doctor-contract-api.js","sha256":"de1a30eb327e6de2799b8b84a8b4bd0f607d90051a2ab67f6a08ed3d29a54505","facadeSource":"extensions/irc/doctor-contract-api.ts","sources":["extensions/irc/config-doctor-api.ts","packages/normalization-core/src/record-coerce.ts","src/config/channel-config-normalization.ts","src/plugin-sdk/legacy-webhook-listener-migration.ts"]},{"output":"index.js","sha256":"26465ab4a608138b3cec93e4593f91f076be42b0fea9edad110953d71ec2e78c","facadeSource":"extensions/irc/index.ts","sources":["extensions/irc/index.ts"]},{"output":"runtime-api.js","sha256":"52b1074caae3be2b4f35e6ab34f26576c94d3a970587212b24eb8d9ac501720c","facadeSource":"extensions/irc/runtime-api.ts","sources":[]},{"output":"secret-contract-api.js","sha256":"ba5440395ed290e6115b9fa94429ffd9302dad0a9077f89307928fdc106fa4f0","facadeSource":"extensions/irc/secret-contract-api.ts","sources":[]},{"output":"setup-entry.js","sha256":"21f17b4e33ba813ec6cbbd531fd6379ab9235eaaff5f4e15e25a3f2e099dea23","facadeSource":"extensions/irc/setup-entry.ts","sources":["extensions/irc/setup-entry.ts"]}],"unrenderedSources":["extensions/irc/api.ts","extensions/irc/channel-config-api.ts","extensions/irc/channel-plugin-api.ts","extensions/irc/doctor-contract-api.ts","extensions/irc/runtime-api.ts","extensions/irc/secret-contract-api.ts","extensions/irc/src/channel-runtime.ts","src/plugin-sdk/text-grapheme.ts"]}
1
+ {"version":3,"entries":[{"output":"api.js","source":"extensions/irc/api.ts"},{"output":"channel-config-api.js","source":"extensions/irc/channel-config-api.ts"},{"output":"channel-plugin-api.js","source":"extensions/irc/channel-plugin-api.ts"},{"output":"doctor-contract-api.js","source":"extensions/irc/doctor-contract-api.ts"},{"output":"index.js","source":"extensions/irc/index.ts"},{"output":"runtime-api.js","source":"extensions/irc/runtime-api.ts"},{"output":"secret-contract-api.js","source":"extensions/irc/secret-contract-api.ts"},{"output":"setup-entry.js","source":"extensions/irc/setup-entry.ts"}],"chunks":[{"output":".setup/channel-Bi4lj8N2.mjs","sha256":"d903c2aedb1d0f0d9431401fe002fa3b1ff025ed566eac44bebce48dfb082ac1","facadeSource":null,"sources":["extensions/irc/src/accounts.ts","extensions/irc/src/channel.ts","extensions/irc/src/client.ts","extensions/irc/src/connect-options.ts","extensions/irc/src/control-chars.ts","extensions/irc/src/doctor.ts","extensions/irc/src/gateway.ts","extensions/irc/src/ingress-identity.ts","extensions/irc/src/message-adapter.ts","extensions/irc/src/normalize.ts","extensions/irc/src/outbound-base.ts","extensions/irc/src/policy.ts","extensions/irc/src/probe.ts","extensions/irc/src/protocol.ts","extensions/irc/src/send.ts","extensions/irc/src/setup-core.ts","extensions/irc/src/setup-surface.ts","packages/normalization-core/src/grapheme.ts","packages/normalization-core/src/utf16-slice.ts"]},{"output":".setup/channel-plugin-api-1I8kWfv8.mjs","sha256":"1bcc3a6fc15d466011c3a9b76038b1bfe424ecbd24cb9560d9879a4812d1d8b8","facadeSource":"extensions/irc/channel-plugin-api.ts","sources":[]},{"output":".setup/channel-runtime-B4OMtNnX.mjs","sha256":"7b59600c948833eef4005e4e45fdddf50a094700be3ac4076c73c22c3f5e6e11","facadeSource":"extensions/irc/src/channel-runtime.ts","sources":["extensions/irc/src/inbound.ts","extensions/irc/src/irc-ingress.ts","extensions/irc/src/monitor.ts","extensions/irc/src/reconnect-backoff.ts"]},{"output":".setup/config-schema-Cy9tItsu.mjs","sha256":"add8978c6443fac3c442d7d66449010bad9142b38ad2d4f127e048a27379424d","facadeSource":null,"sources":["extensions/irc/src/config-schema.ts","extensions/irc/src/config-ui-hints.ts"]},{"output":".setup/runtime-C_V9tmpk.mjs","sha256":"3f1f1b4d7ee63152a339b6a4614a28f57972bf655c73e0e7083c837370bc094c","facadeSource":null,"sources":["extensions/irc/src/runtime.ts"]},{"output":".setup/secret-contract-api-4IT9_EK6.mjs","sha256":"8d9275ff824f6c76b94e80dc043be8a12df9c8b3dc7203faa58bd2fc1bf3c244","facadeSource":"extensions/irc/secret-contract-api.ts","sources":[]},{"output":".setup/secret-contract-C5i-29Hz.mjs","sha256":"2eb99571f8fac572bc6d2a7cafe7bf7f2d864101256eb7b5aa6876fd031ee914","facadeSource":null,"sources":["extensions/irc/src/secret-contract.ts"]},{"output":"api.js","sha256":"e39b0d10e678b0912ca1196b3b4df0993ba195f73e5ac5bd9e2569c06b91dcc8","facadeSource":"extensions/irc/api.ts","sources":[]},{"output":"channel-config-api.js","sha256":"0992ef0872e2bb3dd21649d22af2bb491279f6f01d80466db2d38fed0c69f534","facadeSource":"extensions/irc/channel-config-api.ts","sources":[]},{"output":"channel-plugin-api.js","sha256":"ebeefd0b6ec09b436ad8cca5df7aa3e194e436356d7c77c39529f86e866b650f","facadeSource":"extensions/irc/channel-plugin-api.ts","sources":[]},{"output":"doctor-contract-api.js","sha256":"de1a30eb327e6de2799b8b84a8b4bd0f607d90051a2ab67f6a08ed3d29a54505","facadeSource":"extensions/irc/doctor-contract-api.ts","sources":["extensions/irc/config-doctor-api.ts","packages/normalization-core/src/record-coerce.ts","src/config/channel-config-normalization.ts","src/plugin-sdk/legacy-webhook-listener-migration.ts"]},{"output":"index.js","sha256":"26465ab4a608138b3cec93e4593f91f076be42b0fea9edad110953d71ec2e78c","facadeSource":"extensions/irc/index.ts","sources":["extensions/irc/index.ts"]},{"output":"runtime-api.js","sha256":"52b1074caae3be2b4f35e6ab34f26576c94d3a970587212b24eb8d9ac501720c","facadeSource":"extensions/irc/runtime-api.ts","sources":[]},{"output":"secret-contract-api.js","sha256":"ba5440395ed290e6115b9fa94429ffd9302dad0a9077f89307928fdc106fa4f0","facadeSource":"extensions/irc/secret-contract-api.ts","sources":[]},{"output":"setup-entry.js","sha256":"bcd384958367c5d4a1805150fedb16ce1ffa687c29756609f199e35670d6d7d4","facadeSource":"extensions/irc/setup-entry.ts","sources":["extensions/irc/setup-entry.ts"]}],"unrenderedSources":["extensions/irc/api.ts","extensions/irc/channel-config-api.ts","extensions/irc/channel-plugin-api.ts","extensions/irc/doctor-contract-api.ts","extensions/irc/runtime-api.ts","extensions/irc/secret-contract-api.ts","extensions/irc/src/channel-runtime.ts","src/plugin-sdk/text-grapheme.ts"]}
package/dist/api.js CHANGED
@@ -1,3 +1,3 @@
1
- import { _ as listIrcAccountIds, g as listEnabledIrcAccounts, n as ircSetupWizard, r as ircSetupAdapter, t as ircPlugin, v as resolveDefaultIrcAccountId, y as resolveIrcAccount } from "./.setup/channel-BBSRLy1I.mjs";
1
+ import { _ as listIrcAccountIds, g as listEnabledIrcAccounts, n as ircSetupWizard, r as ircSetupAdapter, t as ircPlugin, v as resolveDefaultIrcAccountId, y as resolveIrcAccount } from "./.setup/channel-Bi4lj8N2.mjs";
2
2
  import { r as setIrcRuntime } from "./.setup/runtime-C_V9tmpk.mjs";
3
3
  export { ircPlugin, ircSetupAdapter, ircSetupWizard, listEnabledIrcAccounts, listIrcAccountIds, resolveDefaultIrcAccountId, resolveIrcAccount, setIrcRuntime };
@@ -1 +1 @@
1
- export { t as ircPlugin } from "./.setup/channel-BBSRLy1I.mjs";
1
+ export { t as ircPlugin } from "./.setup/channel-Bi4lj8N2.mjs";
@@ -4,7 +4,7 @@ import { fileURLToPath } from "node:url";
4
4
  var setup_entry_default = defineBundledChannelSetupEntry({
5
5
  importMetaUrl: import.meta.url,
6
6
  plugin: {
7
- specifier: fileURLToPath(new URL(".setup/channel-plugin-api-8bCK12Fl.mjs", import.meta.url).href),
7
+ specifier: fileURLToPath(new URL(".setup/channel-plugin-api-1I8kWfv8.mjs", import.meta.url).href),
8
8
  exportName: "ircPlugin"
9
9
  },
10
10
  secrets: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/irc",
3
- "version": "2026.10.10-beta.4",
3
+ "version": "2026.10.10-beta.5",
4
4
  "description": "OpenClaw IRC channel plugin",
5
5
  "type": "module",
6
6
  "openclaw": {
@@ -121,10 +121,10 @@
121
121
  }
122
122
  },
123
123
  "compat": {
124
- "pluginApi": ">=2026.10.10-beta.4"
124
+ "pluginApi": ">=2026.10.10-beta.5"
125
125
  },
126
126
  "build": {
127
- "openclawVersion": "2026.10.10-beta.4",
127
+ "openclawVersion": "2026.10.10-beta.5",
128
128
  "bundledDist": false
129
129
  },
130
130
  "release": {
@@ -151,7 +151,7 @@
151
151
  "assets/activity.svg"
152
152
  ],
153
153
  "peerDependencies": {
154
- "openclaw": ">=2026.10.10-beta.4"
154
+ "openclaw": ">=2026.10.10-beta.5"
155
155
  },
156
156
  "peerDependenciesMeta": {
157
157
  "openclaw": {
@@ -1,2 +0,0 @@
1
- export { t as ircPlugin } from "./channel-BBSRLy1I.mjs";
2
- import "../channel-plugin-api.js";