@openclaw/irc 2026.9.8 → 2026.10.1-beta.1

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.
@@ -1,6 +1,6 @@
1
1
  import { t as IrcChannelConfigSchema } from "./config-schema-Cy9tItsu.mjs";
2
- import { t as getIrcRuntime } from "./runtime-xy-FcjJC.mjs";
3
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-D_DC3YWj.mjs";
2
+ import { n as getOptionalIrcRuntime } from "./runtime-C_V9tmpk.mjs";
3
+ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-C5i-29Hz.mjs";
4
4
  import { createAccountListHelpers, describeAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
5
5
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id";
6
6
  import { formatNormalizedAllowFromEntries } from "openclaw/plugin-sdk/allow-from";
@@ -26,11 +26,12 @@ import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-run
26
26
  import { requireRuntimeConfig } from "openclaw/plugin-sdk/plugin-config-runtime";
27
27
  import net from "node:net";
28
28
  import tls from "node:tls";
29
+ import { createDeferred } from "openclaw/plugin-sdk/extension-shared";
29
30
  import { withTimeout } from "openclaw/plugin-sdk/security-runtime";
30
31
  import { assertSecretOwnerAvailable } from "openclaw/plugin-sdk/channel-secret-owner-runtime";
31
32
  import { defineChannelSetupContract } from "openclaw/plugin-sdk/channel-setup";
32
33
  import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1, normalizeAccountId as normalizeAccountId$1 } from "openclaw/plugin-sdk/routing";
33
- import { applyAccountNameToChannelSection, createAllowFromSection, createPromptParsedAllowFromForAccount, createSetupInputPresenceValidator, createSetupTranslator, createStandardChannelSetupStatus, createTopLevelChannelAllowFromSetter, createTopLevelChannelDmPolicySetter, formatDocsLink, patchScopedAccountConfig, setSetupChannelEnabled } from "openclaw/plugin-sdk/setup";
34
+ import { applyAccountNameToChannelSection, createAllowFromSection, createPromptParsedAllowFromForAccount, createSetupInputPresenceValidator, createSetupTranslator, createStandardChannelSetupStatus, createTopLevelChannelAllowFromSetter, createTopLevelChannelDmPolicySetter, formatDocsLink, patchScopedAccountConfig, setSetupChannelEnabled, splitSetupEntries } from "openclaw/plugin-sdk/setup";
34
35
  //#region extensions/irc/src/accounts.ts
35
36
  const { listAccountIds: listIrcAccountIds, resolveDefaultAccountId: resolveDefaultIrcAccountId, resolveAccountConfig: mergeIrcAccountConfig } = createAccountListHelpers("irc", {
36
37
  normalizeAccountId,
@@ -196,7 +197,7 @@ const collectIrcMutableAllowlistWarnings = createDangerousNameMatchingMutableAll
196
197
  });
197
198
  //#endregion
198
199
  //#region extensions/irc/src/gateway.ts
199
- const loadIrcChannelRuntime$1 = createLazyRuntimeModule(() => import("./channel-runtime-195XTdZC.mjs"));
200
+ const loadIrcChannelRuntime$1 = createLazyRuntimeModule(() => import("./channel-runtime-BvC0hwF1.mjs"));
200
201
  async function startIrcGatewayAccount(ctx) {
201
202
  const account = ctx.account;
202
203
  const statusSink = createAccountStatusSink({
@@ -401,7 +402,6 @@ function parseIrcLine(line) {
401
402
  if (!cursor) return null;
402
403
  const firstSpace = cursor.indexOf(" ");
403
404
  const command = (firstSpace === -1 ? cursor : cursor.slice(0, firstSpace)).trim();
404
- if (!command) return null;
405
405
  cursor = firstSpace === -1 ? "" : cursor.slice(firstSpace + 1);
406
406
  const params = [];
407
407
  let trailing;
@@ -463,9 +463,7 @@ function sanitizeIrcOutboundText(text) {
463
463
  function sanitizeIrcTarget(raw) {
464
464
  const decoded = decodeLiteralEscapes(raw);
465
465
  if (!decoded) throw new Error("IRC target is required");
466
- if (decoded !== decoded.trim()) throw new Error(`Invalid IRC target: ${raw}`);
467
- if (hasIrcControlChars(decoded)) throw new Error(`Invalid IRC target: ${raw}`);
468
- if (!IRC_TARGET_PATTERN.test(decoded)) throw new Error(`Invalid IRC target: ${raw}`);
466
+ if (decoded !== decoded.trim() || hasIrcControlChars(decoded) || !IRC_TARGET_PATTERN.test(decoded)) throw new Error(`Invalid IRC target: ${raw}`);
469
467
  return decoded;
470
468
  }
471
469
  //#endregion
@@ -541,20 +539,11 @@ async function connectIrcClient(options) {
541
539
  port: options.port
542
540
  });
543
541
  socket.setEncoding("utf8");
544
- let resolveReady = null;
545
- let rejectReady = null;
546
- const readyPromise = new Promise((resolve, reject) => {
547
- resolveReady = resolve;
548
- rejectReady = reject;
549
- });
542
+ const readyDeferred = createDeferred();
550
543
  const fail = (err) => {
551
544
  const error = toIrcError(err);
552
545
  options.onError?.(error);
553
- if (!ready && rejectReady) {
554
- rejectReady(error);
555
- rejectReady = null;
556
- resolveReady = null;
557
- }
546
+ if (!ready) readyDeferred.reject(error);
558
547
  };
559
548
  const failAndClose = (err) => {
560
549
  fail(err);
@@ -677,9 +666,7 @@ async function connectIrcClient(options) {
677
666
  fail(err);
678
667
  }
679
668
  }
680
- resolveReady?.();
681
- resolveReady = null;
682
- rejectReady = null;
669
+ readyDeferred.resolve();
683
670
  continue;
684
671
  }
685
672
  if (line.command === "NOTICE") {
@@ -689,16 +676,11 @@ async function connectIrcClient(options) {
689
676
  if (line.command === "PRIVMSG") {
690
677
  const target = line.params[0]?.trim() ?? "";
691
678
  const text = line.trailing ?? line.params[1] ?? "";
692
- const prefix = parseIrcPrefix(line.prefix);
693
- const senderNick = prefix.nick?.trim() ?? "";
679
+ const senderNick = parseIrcPrefix(line.prefix).nick?.trim() ?? "";
694
680
  if (!target || !senderNick || !text.trim()) continue;
695
681
  if (options.onPrivmsg) Promise.resolve(options.onPrivmsg({
696
682
  senderNick,
697
- senderUser: prefix.user ? prefix.user.trim() : void 0,
698
- senderHost: prefix.host ? prefix.host.trim() : void 0,
699
683
  connectedNick: currentNick,
700
- target,
701
- text,
702
684
  rawLine
703
685
  })).catch((error) => {
704
686
  fail(error);
@@ -742,7 +724,7 @@ async function connectIrcClient(options) {
742
724
  }
743
725
  }
744
726
  try {
745
- await withTimeout(readyPromise, timeoutMs, "IRC connect");
727
+ await withTimeout(readyDeferred.promise, timeoutMs, "IRC connect");
746
728
  } catch (error) {
747
729
  close();
748
730
  throw error;
@@ -784,17 +766,6 @@ function buildIrcConnectOptions(account, overrides = {}) {
784
766
  }
785
767
  //#endregion
786
768
  //#region extensions/irc/src/send.ts
787
- function recordIrcOutboundActivity(accountId) {
788
- try {
789
- getIrcRuntime().channel.activity.record({
790
- channel: "irc",
791
- accountId,
792
- direction: "outbound"
793
- });
794
- } catch (error) {
795
- if (!(error instanceof Error) || error.message !== "IRC runtime not initialized") throw error;
796
- }
797
- }
798
769
  async function sendIrcMessages(to, text, opts, planMessages = (preparedText) => [{
799
770
  text: preparedText,
800
771
  replyTo: opts.replyTo
@@ -833,7 +804,11 @@ async function sendIrcMessages(to, text, opts, planMessages = (preparedText) =>
833
804
  opts.abortSignal?.throwIfAborted();
834
805
  if (!client.isReady()) throw new Error("IRC connection closed before send");
835
806
  client.sendPrivmsg(target, message.text, message.replyTo);
836
- recordIrcOutboundActivity(account.accountId);
807
+ getOptionalIrcRuntime()?.channel.activity.record({
808
+ channel: "irc",
809
+ accountId: account.accountId,
810
+ direction: "outbound"
811
+ });
837
812
  const messageId = randomUUID();
838
813
  const result = {
839
814
  messageId,
@@ -1172,9 +1147,6 @@ function ircAccountTextInput(configKey, input) {
1172
1147
  })
1173
1148
  };
1174
1149
  }
1175
- function parseListInput(raw) {
1176
- return normalizeStringEntries(raw.split(/[\n,;]+/g));
1177
- }
1178
1150
  function normalizeGroupEntry(raw) {
1179
1151
  const trimmed = raw.trim();
1180
1152
  if (!trimmed) return null;
@@ -1195,7 +1167,7 @@ const promptIrcAllowFrom = createPromptParsedAllowFromForAccount({
1195
1167
  ],
1196
1168
  message: t("wizard.irc.allowFromPrompt"),
1197
1169
  placeholder: "alice, bob!ident@example.org",
1198
- parseEntries: (raw) => ({ entries: normalizeStringEntries(parseListInput(raw).map((entry) => normalizeIrcAllowEntry(entry))) }),
1170
+ parseEntries: (raw) => ({ entries: normalizeStringEntries(splitSetupEntries(raw).map(normalizeIrcAllowEntry)) }),
1199
1171
  getExistingAllowFrom: ({ cfg }) => cfg.channels?.irc?.allowFrom ?? [],
1200
1172
  applyAllowFrom: ({ cfg, allowFrom }) => setIrcAllowFrom(cfg, allowFrom)
1201
1173
  });
@@ -1388,9 +1360,9 @@ const ircSetupWizard = {
1388
1360
  accountId
1389
1361
  }).config.channels?.join(", "),
1390
1362
  shouldPrompt: ({ credentialValues }) => credentialValues[USE_ENV_FLAG] !== "1",
1391
- normalizeValue: ({ value }) => parseListInput(value).map((entry) => normalizeGroupEntry(entry)).filter((entry) => Boolean(entry && entry !== "*")).filter((entry) => isChannelTarget(entry)).join(", "),
1363
+ normalizeValue: ({ value }) => splitSetupEntries(value).map((entry) => normalizeGroupEntry(entry)).filter((entry) => Boolean(entry && entry !== "*")).filter((entry) => isChannelTarget(entry)).join(", "),
1392
1364
  applySet: async ({ cfg, accountId, value }) => {
1393
- const channels = parseListInput(value).map((entry) => normalizeGroupEntry(entry)).filter((entry) => Boolean(entry && entry !== "*")).filter((entry) => isChannelTarget(entry));
1365
+ const channels = splitSetupEntries(value).map((entry) => normalizeGroupEntry(entry)).filter((entry) => Boolean(entry && entry !== "*")).filter((entry) => isChannelTarget(entry));
1394
1366
  return updateIrcAccountConfig(cfg, accountId, {
1395
1367
  enabled: true,
1396
1368
  channels: channels.length > 0 ? channels : void 0
@@ -1487,7 +1459,7 @@ const meta = {
1487
1459
  systemImage: "number",
1488
1460
  markdownCapable: true
1489
1461
  };
1490
- const loadIrcChannelRuntime = createLazyRuntimeModule(() => import("./channel-runtime-195XTdZC.mjs"));
1462
+ const loadIrcChannelRuntime = createLazyRuntimeModule(() => import("./channel-runtime-BvC0hwF1.mjs"));
1491
1463
  function normalizePairingTarget(raw) {
1492
1464
  const normalized = normalizeIrcAllowEntry(raw);
1493
1465
  if (!normalized) return "";
@@ -1,3 +1,3 @@
1
- import { t as ircPlugin } from "./channel-CO6Iez9u.mjs";
1
+ import { t as ircPlugin } from "./channel-DP5YY5l3.mjs";
2
2
  import "../channel-plugin-api.js";
3
3
  export { ircPlugin };
@@ -1,5 +1,5 @@
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-CO6Iez9u.mjs";
2
- import { t as getIrcRuntime } from "./runtime-xy-FcjJC.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-DP5YY5l3.mjs";
2
+ import { t as getIrcRuntime } from "./runtime-C_V9tmpk.mjs";
3
3
  import { channelIngressRoutes } from "openclaw/plugin-sdk/channel-ingress-runtime";
4
4
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-outbound";
@@ -497,22 +497,14 @@ async function monitorIrcProvider(opts) {
497
497
  let reconnectTimer = null;
498
498
  let stopped = false;
499
499
  const monitorAbort = new AbortController();
500
- let removeAbortListener = null;
501
- if (opts.abortSignal) {
502
- const forwardAbort = () => monitorAbort.abort();
503
- if (opts.abortSignal.aborted) forwardAbort();
504
- else {
505
- opts.abortSignal.addEventListener("abort", forwardAbort, { once: true });
506
- removeAbortListener = () => opts.abortSignal?.removeEventListener("abort", forwardAbort);
507
- }
508
- }
500
+ const abortSignal = opts.abortSignal ? AbortSignal.any([opts.abortSignal, monitorAbort.signal]) : monitorAbort.signal;
509
501
  const ingress = createIrcIngressMonitor({
510
502
  accountId: account.accountId,
511
503
  runtime,
512
504
  ...opts.ingressQueue ? { queue: opts.ingressQueue } : {},
513
505
  dispatch: async (message, turnAdoptionLifecycle, context) => {
514
506
  const activeClient = client;
515
- if (!activeClient || stopped || monitorAbort.signal.aborted) return {
507
+ if (!activeClient || stopped || abortSignal.aborted) return {
516
508
  kind: "failed-retryable",
517
509
  error: /* @__PURE__ */ new Error("IRC transport disconnected before ingress dispatch.")
518
510
  };
@@ -534,7 +526,7 @@ async function monitorIrcProvider(opts) {
534
526
  turnAdoptionLifecycle,
535
527
  sendReply: async (target, text) => {
536
528
  const replyClient = client;
537
- if (!replyClient || !replyClient.isReady() || stopped || monitorAbort.signal.aborted) throw new Error("IRC transport disconnected before reply send.");
529
+ if (!replyClient || !replyClient.isReady() || stopped || abortSignal.aborted) throw new Error("IRC transport disconnected before reply send.");
538
530
  if (!message.isGroup && context.connectionEpoch !== activeConnectionEpoch) throw new Error("IRC connection changed before private reply send.");
539
531
  replyClient.sendPrivmsg(target, text);
540
532
  opts.statusSink?.({ lastOutboundAt: Date.now() });
@@ -549,12 +541,12 @@ async function monitorIrcProvider(opts) {
549
541
  }
550
542
  });
551
543
  function scheduleReconnect() {
552
- if (stopped || monitorAbort.signal.aborted || reconnectTimer) return;
544
+ if (stopped || abortSignal.aborted || reconnectTimer) return;
553
545
  opts.statusSink?.({ lifecycle: "recovering" });
554
546
  reconnectTimer = setTimeout(() => {
555
547
  reconnectTimer = null;
556
548
  connect().catch((error) => {
557
- if (stopped || monitorAbort.signal.aborted) return;
549
+ if (stopped || abortSignal.aborted) return;
558
550
  const message = error instanceof Error ? error.message : String(error);
559
551
  logger.error(`[${account.accountId}] IRC reconnect failed: ${message}`);
560
552
  scheduleReconnect();
@@ -562,11 +554,11 @@ async function monitorIrcProvider(opts) {
562
554
  }, IRC_MONITOR_RECONNECT_DELAY_MS);
563
555
  }
564
556
  async function connect() {
565
- if (stopped || monitorAbort.signal.aborted) return;
557
+ if (stopped || abortSignal.aborted) return;
566
558
  const ingressConnection = ingress.openConnection();
567
559
  const nextClient = await connectIrcClient(buildIrcConnectOptions(account, {
568
560
  channels: account.config.channels,
569
- abortSignal: monitorAbort.signal,
561
+ abortSignal,
570
562
  onLine: (line) => {
571
563
  if (core.logging.shouldLogVerbose()) logger.debug?.(`[${account.accountId}] << ${line}`);
572
564
  },
@@ -577,7 +569,7 @@ async function monitorIrcProvider(opts) {
577
569
  logger.error(`[${account.accountId}] IRC error: ${error.message}`);
578
570
  },
579
571
  onDisconnect: () => {
580
- if (stopped || monitorAbort.signal.aborted) return;
572
+ if (stopped || abortSignal.aborted) return;
581
573
  ingressPause = ingress.pause();
582
574
  if (activeConnectionEpoch === ingressConnection.connectionEpoch) activeConnectionEpoch = null;
583
575
  client = null;
@@ -595,7 +587,7 @@ async function monitorIrcProvider(opts) {
595
587
  });
596
588
  }
597
589
  }));
598
- if (stopped || monitorAbort.signal.aborted) {
590
+ if (stopped || abortSignal.aborted) {
599
591
  nextClient.quit("shutdown");
600
592
  return;
601
593
  }
@@ -613,8 +605,6 @@ async function monitorIrcProvider(opts) {
613
605
  try {
614
606
  await connect();
615
607
  } catch (error) {
616
- removeAbortListener?.();
617
- removeAbortListener = null;
618
608
  await ingress.stop();
619
609
  throw error;
620
610
  }
@@ -622,9 +612,7 @@ async function monitorIrcProvider(opts) {
622
612
  return { stop: () => {
623
613
  stopTask ??= (async () => {
624
614
  stopped = true;
625
- removeAbortListener?.();
626
- removeAbortListener = null;
627
- if (!monitorAbort.signal.aborted) monitorAbort.abort();
615
+ if (!abortSignal.aborted) monitorAbort.abort();
628
616
  if (reconnectTimer) {
629
617
  clearTimeout(reconnectTimer);
630
618
  reconnectTimer = null;
@@ -0,0 +1,8 @@
1
+ import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
2
+ //#region extensions/irc/src/runtime.ts
3
+ const { setRuntime: setIrcRuntime, getRuntime: getIrcRuntime, tryGetRuntime: getOptionalIrcRuntime } = createPluginRuntimeStore({
4
+ pluginId: "irc",
5
+ errorMessage: "IRC runtime not initialized"
6
+ });
7
+ //#endregion
8
+ export { getOptionalIrcRuntime as n, setIrcRuntime as r, getIrcRuntime as t };
@@ -0,0 +1,29 @@
1
+ import { collectNestedChannelFieldAssignments, collectSimpleChannelFieldAssignments, createChannelSecretContract, isBaseFieldActiveForChannelSurface, isEnabledFlag, isRecord } from "openclaw/plugin-sdk/channel-secret-basic-runtime";
2
+ //#region extensions/irc/src/secret-contract.ts
3
+ const channelSecrets = createChannelSecretContract({
4
+ channelKey: "irc",
5
+ account: ["nickserv.password", "password"],
6
+ channel: ["nickserv.password", "password"],
7
+ collect(params) {
8
+ const { channel: irc, surface } = params;
9
+ collectSimpleChannelFieldAssignments({
10
+ ...params,
11
+ field: "password",
12
+ topInactiveReason: "no enabled account inherits this top-level IRC password.",
13
+ accountInactiveReason: "IRC account is disabled."
14
+ });
15
+ collectNestedChannelFieldAssignments({
16
+ ...params,
17
+ nestedKey: "nickserv",
18
+ field: "password",
19
+ topLevelActive: isBaseFieldActiveForChannelSurface(surface, "nickserv") && isRecord(irc.nickserv) && isEnabledFlag(irc.nickserv),
20
+ topLevelInheritedAccountActive: ({ account, enabled }) => enabled && !Object.hasOwn(account, "nickserv") && isEnabledFlag(irc.nickserv),
21
+ topInactiveReason: "no enabled account inherits this top-level IRC nickserv config or NickServ is disabled.",
22
+ accountActive: ({ account, enabled }) => enabled && isRecord(account.nickserv) && isEnabledFlag(account.nickserv),
23
+ accountInactiveReason: "IRC account is disabled or NickServ is disabled for this account."
24
+ });
25
+ }
26
+ });
27
+ const { secretTargetRegistryEntries, collectRuntimeConfigAssignments } = channelSecrets;
28
+ //#endregion
29
+ export { collectRuntimeConfigAssignments as n, secretTargetRegistryEntries as r, channelSecrets as t };
@@ -1,3 +1,3 @@
1
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./secret-contract-D_DC3YWj.mjs";
1
+ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./secret-contract-C5i-29Hz.mjs";
2
2
  import "../secret-contract-api.js";
3
3
  export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
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-CO6Iez9u.mjs";
2
- import { n as setIrcRuntime } from "./.setup/runtime-xy-FcjJC.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-DP5YY5l3.mjs";
2
+ import { r as setIrcRuntime } from "./.setup/runtime-C_V9tmpk.mjs";
3
3
  export { ircPlugin, ircSetupAdapter, ircSetupWizard, listEnabledIrcAccounts, listIrcAccountIds, resolveDefaultIrcAccountId, resolveIrcAccount, setIrcRuntime };
@@ -1,2 +1,2 @@
1
- import { t as ircPlugin } from "./.setup/channel-CO6Iez9u.mjs";
1
+ import { t as ircPlugin } from "./.setup/channel-DP5YY5l3.mjs";
2
2
  export { ircPlugin };
@@ -124,6 +124,12 @@ function createLegacyWebhookListenerDoctorContract(params) {
124
124
  };
125
125
  const prefix = `channels.${params.channelKey}`;
126
126
  return {
127
+ historicalWebhookListener: {
128
+ channelId: params.channelKey,
129
+ port: params.defaultPort,
130
+ preserveAuthoredActivation: params.preserveAuthoredActivation,
131
+ ...params.defaultHost === void 0 ? {} : { host: params.defaultHost }
132
+ },
127
133
  legacyConfigRules: [{
128
134
  path: ["channels", params.channelKey],
129
135
  message: `${prefix} webhook listeners moved to Gateway routes. Run "openclaw doctor --fix" to preserve explicitly configured listener settings as legacyWebhook.`,
@@ -1,2 +1,2 @@
1
- import { n as setIrcRuntime } from "./.setup/runtime-xy-FcjJC.mjs";
1
+ import { r as setIrcRuntime } from "./.setup/runtime-C_V9tmpk.mjs";
2
2
  export { setIrcRuntime };
@@ -1,2 +1,2 @@
1
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./.setup/secret-contract-D_DC3YWj.mjs";
1
+ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./.setup/secret-contract-C5i-29Hz.mjs";
2
2
  export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
@@ -4,11 +4,11 @@ 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-DlMVsHyU.mjs", import.meta.url).href),
7
+ specifier: fileURLToPath(new URL(".setup/channel-plugin-api-tjqFvfGT.mjs", import.meta.url).href),
8
8
  exportName: "ircPlugin"
9
9
  },
10
10
  secrets: {
11
- specifier: fileURLToPath(new URL(".setup/secret-contract-api-ClCcrDAz.mjs", import.meta.url).href),
11
+ specifier: fileURLToPath(new URL(".setup/secret-contract-api-ClqD0Rpm.mjs", import.meta.url).href),
12
12
  exportName: "channelSecrets"
13
13
  }
14
14
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/irc",
3
- "version": "2026.9.8",
3
+ "version": "2026.10.1-beta.1",
4
4
  "description": "OpenClaw IRC channel plugin",
5
5
  "type": "module",
6
6
  "openclaw": {
@@ -11,7 +11,7 @@
11
11
  "clawhubSpec": "clawhub:@openclaw/irc",
12
12
  "npmSpec": "@openclaw/irc",
13
13
  "defaultChoice": "npm",
14
- "minHostVersion": ">=2026.6.9",
14
+ "minHostVersion": ">=2026.9.8",
15
15
  "allowInvalidConfigRecovery": true
16
16
  },
17
17
  "setupEntry": "./dist/setup-entry.js",
@@ -121,10 +121,10 @@
121
121
  }
122
122
  },
123
123
  "compat": {
124
- "pluginApi": ">=2026.9.8"
124
+ "pluginApi": ">=2026.10.1-beta.1"
125
125
  },
126
126
  "build": {
127
- "openclawVersion": "2026.9.8",
127
+ "openclawVersion": "2026.10.1-beta.1",
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.9.8"
154
+ "openclaw": ">=2026.10.1-beta.1"
155
155
  },
156
156
  "peerDependenciesMeta": {
157
157
  "openclaw": {
@@ -1,8 +0,0 @@
1
- import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
2
- //#region extensions/irc/src/runtime.ts
3
- const { setRuntime: setIrcRuntime, getRuntime: getIrcRuntime } = createPluginRuntimeStore({
4
- pluginId: "irc",
5
- errorMessage: "IRC runtime not initialized"
6
- });
7
- //#endregion
8
- export { setIrcRuntime as n, getIrcRuntime as t };
@@ -1,42 +0,0 @@
1
- import { collectNestedChannelFieldAssignments, collectSimpleChannelFieldAssignments, createChannelSecretTargetRegistryEntries, getChannelSurface, isBaseFieldActiveForChannelSurface, isEnabledFlag, isRecord } from "openclaw/plugin-sdk/channel-secret-basic-runtime";
2
- //#region extensions/irc/src/secret-contract.ts
3
- const secretTargetRegistryEntries = createChannelSecretTargetRegistryEntries({
4
- channelKey: "irc",
5
- account: ["nickserv.password", "password"],
6
- channel: ["nickserv.password", "password"]
7
- });
8
- function collectRuntimeConfigAssignments(params) {
9
- const resolved = getChannelSurface(params.config, "irc");
10
- if (!resolved) return;
11
- const { channel: irc, surface } = resolved;
12
- collectSimpleChannelFieldAssignments({
13
- channelKey: "irc",
14
- field: "password",
15
- channel: irc,
16
- surface,
17
- defaults: params.defaults,
18
- context: params.context,
19
- topInactiveReason: "no enabled account inherits this top-level IRC password.",
20
- accountInactiveReason: "IRC account is disabled."
21
- });
22
- collectNestedChannelFieldAssignments({
23
- channelKey: "irc",
24
- nestedKey: "nickserv",
25
- field: "password",
26
- channel: irc,
27
- surface,
28
- defaults: params.defaults,
29
- context: params.context,
30
- topLevelActive: isBaseFieldActiveForChannelSurface(surface, "nickserv") && isRecord(irc.nickserv) && isEnabledFlag(irc.nickserv),
31
- topLevelInheritedAccountActive: ({ account, enabled }) => enabled && !Object.hasOwn(account, "nickserv") && isEnabledFlag(irc.nickserv),
32
- topInactiveReason: "no enabled account inherits this top-level IRC nickserv config or NickServ is disabled.",
33
- accountActive: ({ account, enabled }) => enabled && isRecord(account.nickserv) && isEnabledFlag(account.nickserv),
34
- accountInactiveReason: "IRC account is disabled or NickServ is disabled for this account."
35
- });
36
- }
37
- const channelSecrets = {
38
- secretTargetRegistryEntries,
39
- collectRuntimeConfigAssignments
40
- };
41
- //#endregion
42
- export { collectRuntimeConfigAssignments as n, secretTargetRegistryEntries as r, channelSecrets as t };