@openclaw/irc 2026.7.2-beta.4 → 2026.7.2-beta.7

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/dist/api.js CHANGED
@@ -1,3 +1,3 @@
1
- import { _ as resolveIrcAccount, g as resolveDefaultIrcAccountId, h as listIrcAccountIds, m as listEnabledIrcAccounts, n as ircSetupWizard, r as ircSetupAdapter, t as ircPlugin } from "./channel-BuxKUEja.js";
1
+ import { _ as resolveDefaultIrcAccountId, g as listIrcAccountIds, h as listEnabledIrcAccounts, n as ircSetupWizard, r as ircSetupAdapter, t as ircPlugin, v as resolveIrcAccount } from "./channel-DoavT7vs.js";
2
2
  import { n as setIrcRuntime } from "./runtime-xy-FcjJC.js";
3
3
  export { ircPlugin, ircSetupAdapter, ircSetupWizard, listEnabledIrcAccounts, listIrcAccountIds, resolveDefaultIrcAccountId, resolveIrcAccount, setIrcRuntime };
@@ -9,9 +9,10 @@ import { buildMutableAllowEntryDetector, collectStandardAllowlistLists, composeA
9
9
  import { createChannelDirectoryAdapter, createResolvedDirectoryEntriesLister } from "openclaw/plugin-sdk/directory-runtime";
10
10
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
11
11
  import { buildBaseChannelStatusSummary, createComputedAccountStatusAdapter, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
12
+ import { resolveAccountWithDefaultFallback } from "openclaw/plugin-sdk/account-core";
12
13
  import { DEFAULT_ACCOUNT_ID, DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$2, normalizeAccountId } from "openclaw/plugin-sdk/account-id";
13
- import { resolveMergedAccountConfig } from "openclaw/plugin-sdk/account-resolution";
14
14
  import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
15
+ import { isTruthyEnvValue } from "openclaw/plugin-sdk/runtime-env";
15
16
  import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime";
16
17
  import { normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/secret-input";
17
18
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeStringEntries, normalizeStringifiedOptionalString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -28,36 +29,18 @@ import { defineChannelSetupContract } from "openclaw/plugin-sdk/channel-setup";
28
29
  import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1, normalizeAccountId as normalizeAccountId$1 } from "openclaw/plugin-sdk/routing";
29
30
  import { applyAccountNameToChannelSection, createAllowFromSection, createPromptParsedAllowFromForAccount, createSetupInputPresenceValidator, createSetupTranslator, createStandardChannelSetupStatus, createTopLevelChannelAllowFromSetter, createTopLevelChannelDmPolicySetter, formatDocsLink, patchScopedAccountConfig, setSetupChannelEnabled } from "openclaw/plugin-sdk/setup";
30
31
  //#region extensions/irc/src/accounts.ts
31
- const TRUTHY_ENV = /* @__PURE__ */ new Set([
32
- "true",
33
- "1",
34
- "yes",
35
- "on"
36
- ]);
37
- function parseTruthy(value) {
38
- if (!value) return false;
39
- return TRUTHY_ENV.has(normalizeLowercaseStringOrEmpty(value));
40
- }
41
32
  function parseIntEnv(value) {
42
33
  if (!value?.trim()) return;
43
34
  const parsed = parseStrictPositiveInteger(value);
44
35
  if (parsed === void 0 || parsed > 65535) return;
45
36
  return parsed;
46
37
  }
47
- const { listAccountIds: listIrcAccountIds, resolveDefaultAccountId: resolveDefaultIrcAccountId } = createAccountListHelpers("irc", {
38
+ const { listAccountIds: listIrcAccountIds, resolveDefaultAccountId: resolveDefaultIrcAccountId, resolveAccountConfig: mergeIrcAccountConfig } = createAccountListHelpers("irc", {
48
39
  normalizeAccountId,
40
+ omitKeys: ["defaultAccount"],
41
+ nestedObjectKeys: ["nickserv"],
49
42
  hasImplicitDefaultAccount: (cfg) => Boolean((cfg.channels?.irc?.host?.trim() || process.env.IRC_HOST?.trim()) && (cfg.channels?.irc?.nick?.trim() || process.env.IRC_NICK?.trim()))
50
43
  });
51
- function mergeIrcAccountConfig(cfg, accountId) {
52
- return resolveMergedAccountConfig({
53
- channelConfig: cfg.channels?.irc,
54
- accounts: cfg.channels?.irc?.accounts,
55
- accountId,
56
- omitKeys: ["defaultAccount"],
57
- normalizeAccountId,
58
- nestedObjectKeys: ["nickserv"]
59
- });
60
- }
61
44
  function resolvePassword(accountId, merged) {
62
45
  if (accountId === DEFAULT_ACCOUNT_ID) {
63
46
  const envPassword = process.env.IRC_PASSWORD?.trim();
@@ -131,13 +114,12 @@ function resolveNickServConfig(accountId, nickserv) {
131
114
  };
132
115
  }
133
116
  function resolveIrcAccount(params) {
134
- const hasExplicitAccountId = Boolean(params.accountId?.trim());
135
117
  const baseEnabled = params.cfg.channels?.irc?.enabled !== false;
136
118
  const resolve = (accountId) => {
137
119
  const merged = mergeIrcAccountConfig(params.cfg, accountId);
138
120
  const accountEnabled = merged.enabled !== false;
139
121
  const enabled = baseEnabled && accountEnabled;
140
- const tls = typeof merged.tls === "boolean" ? merged.tls : accountId === DEFAULT_ACCOUNT_ID && process.env.IRC_TLS ? parseTruthy(process.env.IRC_TLS) : true;
122
+ const tls = typeof merged.tls === "boolean" ? merged.tls : accountId === DEFAULT_ACCOUNT_ID && process.env.IRC_TLS ? isTruthyEnvValue(process.env.IRC_TLS) : true;
141
123
  const envPort = accountId === DEFAULT_ACCOUNT_ID ? parseIntEnv(process.env.IRC_PORT) : void 0;
142
124
  const port = merged.port ?? envPort ?? (tls ? 6697 : 6667);
143
125
  const envChannels = accountId === DEFAULT_ACCOUNT_ID ? parseOptionalDelimitedEntries(process.env.IRC_CHANNELS) : void 0;
@@ -177,14 +159,13 @@ function resolveIrcAccount(params) {
177
159
  config
178
160
  };
179
161
  };
180
- const primary = resolve(normalizeAccountId(params.accountId));
181
- if (hasExplicitAccountId) return primary;
182
- if (primary.configured) return primary;
183
- const fallbackId = resolveDefaultIrcAccountId(params.cfg);
184
- if (fallbackId === primary.accountId) return primary;
185
- const fallback = resolve(fallbackId);
186
- if (!fallback.configured) return primary;
187
- return fallback;
162
+ return resolveAccountWithDefaultFallback({
163
+ accountId: params.accountId,
164
+ normalizeAccountId,
165
+ resolvePrimary: resolve,
166
+ hasCredential: (account) => account.configured,
167
+ resolveDefaultAccountId: () => resolveDefaultIrcAccountId(params.cfg)
168
+ });
188
169
  }
189
170
  function listEnabledIrcAccounts(cfg) {
190
171
  return listIrcAccountIds(cfg).map((accountId) => resolveIrcAccount({
@@ -202,7 +183,7 @@ const collectIrcMutableAllowlistWarnings = createDangerousNameMatchingMutableAll
202
183
  });
203
184
  //#endregion
204
185
  //#region extensions/irc/src/gateway.ts
205
- const loadIrcChannelRuntime$1 = createLazyRuntimeModule(() => import("./channel-runtime-BrNJqIB_.js"));
186
+ const loadIrcChannelRuntime$1 = createLazyRuntimeModule(() => import("./channel-runtime-DsN_0hPp.js"));
206
187
  async function startIrcGatewayAccount(ctx) {
207
188
  const account = ctx.account;
208
189
  const statusSink = createAccountStatusSink({
@@ -796,12 +777,15 @@ const ircMessageAdapter = defineChannelMessageAdapter({
796
777
  });
797
778
  //#endregion
798
779
  //#region extensions/irc/src/outbound-base.ts
780
+ function sanitizeIrcAssistantText(text) {
781
+ return sanitizeForPlainText(sanitizeAssistantVisibleText(text));
782
+ }
799
783
  const ircOutboundBaseAdapter = {
800
784
  deliveryMode: "direct",
801
785
  chunker: chunkTextForOutbound,
802
786
  chunkerMode: "markdown",
803
787
  textChunkLimit: 350,
804
- sanitizeText: ({ text }) => sanitizeForPlainText(sanitizeAssistantVisibleText(text))
788
+ sanitizeText: ({ text }) => sanitizeIrcAssistantText(text)
805
789
  };
806
790
  //#endregion
807
791
  //#region extensions/irc/src/policy.ts
@@ -1414,7 +1398,7 @@ const meta = {
1414
1398
  systemImage: "number",
1415
1399
  markdownCapable: true
1416
1400
  };
1417
- const loadIrcChannelRuntime = createLazyRuntimeModule(() => import("./channel-runtime-BrNJqIB_.js"));
1401
+ const loadIrcChannelRuntime = createLazyRuntimeModule(() => import("./channel-runtime-DsN_0hPp.js"));
1418
1402
  function normalizePairingTarget(raw) {
1419
1403
  const normalized = normalizeIrcAllowEntry(raw);
1420
1404
  if (!normalized) return "";
@@ -1645,24 +1629,13 @@ const ircPlugin = createChatChannelPlugin({
1645
1629
  base: ircOutboundBaseAdapter,
1646
1630
  attachedResults: {
1647
1631
  channel: "irc",
1648
- sendText: async ({ cfg, to, text, accountId, replyToId }) => {
1649
- const { sendMessageIrc } = await loadIrcChannelRuntime();
1650
- return await sendMessageIrc(to, text, {
1651
- cfg,
1652
- accountId: accountId ?? void 0,
1653
- replyTo: replyToId ?? void 0
1654
- });
1655
- },
1656
- sendMedia: async ({ cfg, to, text, mediaUrl, accountId, replyToId }) => {
1657
- const { sendMessageIrc } = await loadIrcChannelRuntime();
1658
- return await sendMessageIrc(to, mediaUrl ? `${text}\n\nAttachment: ${mediaUrl}` : text, {
1659
- cfg,
1660
- accountId: accountId ?? void 0,
1661
- replyTo: replyToId ?? void 0
1662
- });
1663
- }
1632
+ sendText: ({ onDeliveryResult: _onDeliveryResult, ...ctx }) => ircMessageAdapter.send.text(ctx),
1633
+ sendMedia: ({ onDeliveryResult: _onDeliveryResult, mediaUrl, ...ctx }) => ircMessageAdapter.send.media({
1634
+ ...ctx,
1635
+ mediaUrl: mediaUrl ?? ""
1636
+ })
1664
1637
  }
1665
1638
  }
1666
1639
  });
1667
1640
  //#endregion
1668
- export { resolveIrcAccount as _, resolveIrcGroupRequireMention as a, isChannelTarget as c, connectIrcClient as d, parseIrcLine as f, resolveDefaultIrcAccountId as g, listIrcAccountIds as h, resolveIrcGroupMatch as i, normalizeIrcAllowEntry as l, listEnabledIrcAccounts as m, ircSetupWizard as n, sendMessageIrc as o, parseIrcPrefix as p, ircSetupAdapter as r, buildIrcAllowlistCandidates as s, ircPlugin as t, buildIrcConnectOptions as u };
1641
+ export { resolveDefaultIrcAccountId as _, resolveIrcGroupRequireMention as a, buildIrcAllowlistCandidates as c, buildIrcConnectOptions as d, connectIrcClient as f, listIrcAccountIds as g, listEnabledIrcAccounts as h, resolveIrcGroupMatch as i, isChannelTarget as l, parseIrcPrefix as m, ircSetupWizard as n, sanitizeIrcAssistantText as o, parseIrcLine as p, ircSetupAdapter as r, sendMessageIrc as s, ircPlugin as t, normalizeIrcAllowEntry as u, resolveIrcAccount as v };
@@ -1,2 +1,2 @@
1
- import { t as ircPlugin } from "./channel-BuxKUEja.js";
1
+ import { t as ircPlugin } from "./channel-DoavT7vs.js";
2
2
  export { ircPlugin };
@@ -1,7 +1,7 @@
1
- import { _ as resolveIrcAccount, a as resolveIrcGroupRequireMention, c as isChannelTarget, d as connectIrcClient, f as parseIrcLine, i as resolveIrcGroupMatch, l as normalizeIrcAllowEntry, o as sendMessageIrc, p as parseIrcPrefix, s as buildIrcAllowlistCandidates, u as buildIrcConnectOptions } from "./channel-BuxKUEja.js";
1
+ import { a as resolveIrcGroupRequireMention, c as buildIrcAllowlistCandidates, d as buildIrcConnectOptions, f as connectIrcClient, i as resolveIrcGroupMatch, l as isChannelTarget, m as parseIrcPrefix, o as sanitizeIrcAssistantText, p as parseIrcLine, s as sendMessageIrc, u as normalizeIrcAllowEntry, v as resolveIrcAccount } from "./channel-DoavT7vs.js";
2
2
  import { t as getIrcRuntime } from "./runtime-xy-FcjJC.js";
3
3
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
4
- import { bindIngressLifecycleToReplyOptions, createChannelIngressMonitor, resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-outbound";
4
+ import { bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-outbound";
5
5
  import { randomUUID } from "node:crypto";
6
6
  import { resolveLoggerBackedRuntime } from "openclaw/plugin-sdk/extension-shared";
7
7
  import { buildChannelInboundEventContext, logInboundDrop, resolveChannelInboundRouteEnvelope } from "openclaw/plugin-sdk/channel-inbound";
@@ -108,7 +108,10 @@ function routeDescriptorsForIrcGroup(params) {
108
108
  }
109
109
  async function deliverIrcReply(params) {
110
110
  await deliverFormattedTextWithAttachments({
111
- payload: params.payload,
111
+ payload: {
112
+ ...params.payload,
113
+ text: sanitizeIrcAssistantText(params.payload.text ?? "")
114
+ },
112
115
  send: async ({ text, replyToId }) => {
113
116
  if (params.sendReply) await params.sendReply(params.target, text, replyToId);
114
117
  else await sendMessageIrc(params.target, text, {
@@ -386,15 +389,7 @@ async function handleIrcInbound(params) {
386
389
  //#region extensions/irc/src/irc-ingress.ts
387
390
  const IRC_INGRESS_PAYLOAD_VERSION = 1;
388
391
  const IRC_INGRESS_POLL_INTERVAL_MS = 1e3;
389
- const IRC_INGRESS_PRUNE_INTERVAL_MS = 3600 * 1e3;
390
- const IRC_INGRESS_TOMBSTONE_TTL_MS = 720 * 60 * 60 * 1e3;
391
- const IRC_INGRESS_TOMBSTONE_MAX_ENTRIES = 1e3;
392
- var IrcIngressPayloadError = class extends Error {
393
- constructor(message) {
394
- super(message);
395
- this.name = "IrcIngressPayloadError";
396
- }
397
- };
392
+ const IrcIngressPayloadError = createChannelIngressError("IrcIngressPayloadError");
398
393
  function inspectRawPrivmsg(rawLine) {
399
394
  const line = parseIrcLine(rawLine);
400
395
  if (!line || line.command !== "PRIVMSG") throw new IrcIngressPayloadError("IRC ingress row is not a PRIVMSG line.");
@@ -481,11 +476,8 @@ function createIrcIngressMonitor(options) {
481
476
  },
482
477
  pollIntervalMs: options.pollIntervalMs ?? IRC_INGRESS_POLL_INTERVAL_MS,
483
478
  retention: {
484
- pruneIntervalMs: IRC_INGRESS_PRUNE_INTERVAL_MS,
485
- completedTtlMs: IRC_INGRESS_TOMBSTONE_TTL_MS,
486
- completedMaxEntries: IRC_INGRESS_TOMBSTONE_MAX_ENTRIES,
487
- failedTtlMs: IRC_INGRESS_TOMBSTONE_TTL_MS,
488
- failedMaxEntries: IRC_INGRESS_TOMBSTONE_MAX_ENTRIES
479
+ completedMaxEntries: 1e3,
480
+ failedMaxEntries: 1e3
489
481
  },
490
482
  drain: {
491
483
  resolveNonRetryableFailure: resolveIrcIngressNonRetryableFailure,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/irc",
3
- "version": "2026.7.2-beta.4",
3
+ "version": "2026.7.2-beta.7",
4
4
  "description": "OpenClaw IRC channel plugin",
5
5
  "type": "module",
6
6
  "openclaw": {
@@ -117,10 +117,10 @@
117
117
  }
118
118
  },
119
119
  "compat": {
120
- "pluginApi": ">=2026.7.2-beta.4"
120
+ "pluginApi": ">=2026.7.2-beta.7"
121
121
  },
122
122
  "build": {
123
- "openclawVersion": "2026.7.2-beta.4",
123
+ "openclawVersion": "2026.7.2-beta.7",
124
124
  "bundledDist": false
125
125
  },
126
126
  "release": {
@@ -142,11 +142,10 @@
142
142
  "files": [
143
143
  "dist/**",
144
144
  "openclaw.plugin.json",
145
- "npm-shrinkwrap.json",
146
145
  "README.md"
147
146
  ],
148
147
  "peerDependencies": {
149
- "openclaw": ">=2026.7.2-beta.4"
148
+ "openclaw": ">=2026.7.2-beta.7"
150
149
  },
151
150
  "peerDependenciesMeta": {
152
151
  "openclaw": {
@@ -1,24 +0,0 @@
1
- {
2
- "name": "@openclaw/irc",
3
- "version": "2026.7.2-beta.4",
4
- "lockfileVersion": 3,
5
- "requires": true,
6
- "packages": {
7
- "": {
8
- "name": "@openclaw/irc",
9
- "version": "2026.7.2-beta.4",
10
- "dependencies": {
11
- "zod": "4.4.3"
12
- }
13
- },
14
- "node_modules/zod": {
15
- "version": "4.4.3",
16
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
17
- "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
18
- "license": "MIT",
19
- "funding": {
20
- "url": "https://github.com/sponsors/colinhacks"
21
- }
22
- }
23
- }
24
- }