@openclaw/irc 2026.7.1 → 2026.7.2-beta.2

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 { g as resolveIrcAccount, h as resolveDefaultIrcAccountId, m as listIrcAccountIds, n as ircSetupWizard, p as listEnabledIrcAccounts, r as ircSetupAdapter, t as ircPlugin } from "./channel-C-P2GolT.js";
2
- import { n as setIrcRuntime } from "./runtime-DZfYm3vY.js";
1
+ import { g as resolveIrcAccount, h as resolveDefaultIrcAccountId, m as listIrcAccountIds, n as ircSetupWizard, p as listEnabledIrcAccounts, r as ircSetupAdapter, t as ircPlugin } from "./channel-DivPJINh.js";
2
+ import { n as setIrcRuntime } from "./runtime-xy-FcjJC.js";
3
3
  export { ircPlugin, ircSetupAdapter, ircSetupWizard, listEnabledIrcAccounts, listIrcAccountIds, resolveDefaultIrcAccountId, resolveIrcAccount, setIrcRuntime };
@@ -1,11 +1,11 @@
1
- import { t as IrcChannelConfigSchema } from "./config-schema-BPKZaah-.js";
2
- import { t as getIrcRuntime } from "./runtime-DZfYm3vY.js";
3
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-DdKIs_mx.js";
1
+ import { t as IrcChannelConfigSchema } from "./config-schema-BPoye3--.js";
2
+ import { t as getIrcRuntime } from "./runtime-xy-FcjJC.js";
3
+ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-PJHaoTSe.js";
4
4
  import { createAccountListHelpers, describeAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
5
5
  import { formatNormalizedAllowFromEntries } from "openclaw/plugin-sdk/allow-from";
6
6
  import { adaptScopedAccountAccessor, createScopedChannelConfigAdapter, createScopedDmSecurityResolver } from "openclaw/plugin-sdk/channel-config-helpers";
7
7
  import { buildChannelOutboundSessionRoute, createChatChannelPlugin, parseOptionalDelimitedEntries, tryReadSecretFileSync } from "openclaw/plugin-sdk/channel-core";
8
- import { composeAccountWarningCollectors, createAllowlistProviderOpenWarningCollector, createDangerousNameMatchingMutableAllowlistWarningCollector } from "openclaw/plugin-sdk/channel-policy";
8
+ import { buildMutableAllowEntryDetector, collectStandardAllowlistLists, composeAccountWarningCollectors, createAllowlistProviderOpenWarningCollector, createDangerousNameMatchingMutableAllowlistWarningCollector, resolveScopeKeyCaseInsensitive, resolveScopeRequireMention, resolveScopeToolsPolicy } from "openclaw/plugin-sdk/channel-policy";
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";
@@ -162,42 +162,17 @@ function listEnabledIrcAccounts(cfg) {
162
162
  accountId
163
163
  })).filter((account) => account.enabled);
164
164
  }
165
- //#endregion
166
- //#region extensions/irc/src/doctor.ts
167
- function asObjectRecord(value) {
168
- return value && typeof value === "object" && !Array.isArray(value) ? value : null;
169
- }
170
- function isIrcMutableAllowEntry(raw) {
171
- const text = normalizeLowercaseStringOrEmpty(raw);
172
- if (!text || text === "*") return false;
173
- return !text.replace(/^irc:/, "").replace(/^user:/, "").trim().includes("@");
174
- }
175
165
  const collectIrcMutableAllowlistWarnings = createDangerousNameMatchingMutableAllowlistWarningCollector({
176
166
  channel: "irc",
177
- detector: isIrcMutableAllowEntry,
178
- collectLists: (scope) => {
179
- const lists = [{
180
- pathLabel: `${scope.prefix}.allowFrom`,
181
- list: scope.account.allowFrom
182
- }, {
183
- pathLabel: `${scope.prefix}.groupAllowFrom`,
184
- list: scope.account.groupAllowFrom
185
- }];
186
- const groups = asObjectRecord(scope.account.groups);
187
- if (groups) for (const [groupKey, groupRaw] of Object.entries(groups)) {
188
- const group = asObjectRecord(groupRaw);
189
- if (!group) continue;
190
- lists.push({
191
- pathLabel: `${scope.prefix}.groups.${groupKey}.allowFrom`,
192
- list: group.allowFrom
193
- });
194
- }
195
- return lists;
196
- }
167
+ detector: buildMutableAllowEntryDetector({ stableIdPattern: /^(?:(?:irc|user):)*[^@]*@/i }),
168
+ collectLists: (scope) => collectStandardAllowlistLists(scope, {
169
+ includeGroups: true,
170
+ groupField: "allowFrom"
171
+ })
197
172
  });
198
173
  //#endregion
199
174
  //#region extensions/irc/src/gateway.ts
200
- const loadIrcChannelRuntime$1 = createLazyRuntimeModule(() => import("./channel-runtime-CLTE89ol.js"));
175
+ const loadIrcChannelRuntime$1 = createLazyRuntimeModule(() => import("./channel-runtime-Dg0LFlsh.js"));
201
176
  async function startIrcGatewayAccount(ctx) {
202
177
  const account = ctx.account;
203
178
  const statusSink = createAccountStatusSink({
@@ -796,42 +771,47 @@ const ircOutboundBaseAdapter = {
796
771
  };
797
772
  //#endregion
798
773
  //#region extensions/irc/src/policy.ts
799
- function resolveIrcGroupMatch(params) {
800
- const groups = params.groups ?? {};
801
- const hasConfiguredGroups = Object.keys(groups).length > 0;
802
- const direct = groups[params.target];
803
- if (direct) return {
804
- allowed: true,
805
- groupConfig: direct,
806
- wildcardConfig: groups["*"],
807
- hasConfiguredGroups
774
+ function resolveIrcGroupScope(params) {
775
+ const { "*": wildcard, ...groups } = params.groups ?? {};
776
+ const project = (entry) => ({
777
+ requireMention: entry.requireMention,
778
+ tools: entry.tools
779
+ });
780
+ const tree = {
781
+ defaults: wildcard ? project(wildcard) : void 0,
782
+ scopes: Object.fromEntries(Object.entries(groups).map(([key, entry]) => [key, project(entry)]))
808
783
  };
809
- const targetLower = normalizeLowercaseStringOrEmpty(params.target);
810
- const directKey = Object.keys(groups).find((key) => normalizeLowercaseStringOrEmpty(key) === targetLower);
811
- if (directKey) {
812
- const matched = groups[directKey];
813
- if (matched) return {
814
- allowed: true,
815
- groupConfig: matched,
816
- wildcardConfig: groups["*"],
817
- hasConfiguredGroups
818
- };
819
- }
820
- const wildcard = groups["*"];
821
- if (wildcard) return {
822
- allowed: true,
823
- wildcardConfig: wildcard,
824
- hasConfiguredGroups
784
+ const key = resolveScopeKeyCaseInsensitive(tree, params.target);
785
+ return {
786
+ tree,
787
+ path: key ? [key] : []
825
788
  };
789
+ }
790
+ function resolveIrcGroupMatch(params) {
791
+ const { path } = resolveIrcGroupScope(params);
792
+ const key = path[0];
793
+ const groupConfig = key ? params.groups?.[key] : void 0;
794
+ const wildcardConfig = params.groups?.["*"];
826
795
  return {
827
- allowed: false,
828
- hasConfiguredGroups
796
+ allowed: Boolean(groupConfig ?? wildcardConfig),
797
+ groupConfig,
798
+ wildcardConfig,
799
+ hasConfiguredGroups: Object.keys(params.groups ?? {}).length > 0
829
800
  };
830
801
  }
831
- function resolveIrcRequireMention(params) {
832
- if (params.groupConfig?.requireMention !== void 0) return params.groupConfig.requireMention;
833
- if (params.wildcardConfig?.requireMention !== void 0) return params.wildcardConfig.requireMention;
834
- return true;
802
+ function resolveIrcGroupRequireMention(params) {
803
+ const { tree, path } = resolveIrcGroupScope(params);
804
+ return resolveScopeRequireMention({
805
+ tree,
806
+ path
807
+ });
808
+ }
809
+ function resolveIrcGroupToolPolicy(params) {
810
+ const { tree, path } = resolveIrcGroupScope(params);
811
+ return resolveScopeToolsPolicy({
812
+ tree,
813
+ path
814
+ });
835
815
  }
836
816
  //#endregion
837
817
  //#region extensions/irc/src/probe.ts
@@ -1330,7 +1310,7 @@ const meta = {
1330
1310
  systemImage: "number",
1331
1311
  markdownCapable: true
1332
1312
  };
1333
- const loadIrcChannelRuntime = createLazyRuntimeModule(() => import("./channel-runtime-CLTE89ol.js"));
1313
+ const loadIrcChannelRuntime = createLazyRuntimeModule(() => import("./channel-runtime-Dg0LFlsh.js"));
1334
1314
  function normalizePairingTarget(raw) {
1335
1315
  const normalized = normalizeIrcAllowEntry(raw);
1336
1316
  if (!normalized) return "";
@@ -1442,14 +1422,10 @@ const ircPlugin = createChatChannelPlugin({
1442
1422
  accountId
1443
1423
  });
1444
1424
  if (!groupId) return true;
1445
- const match = resolveIrcGroupMatch({
1425
+ return resolveIrcGroupRequireMention({
1446
1426
  groups: account.config.groups,
1447
1427
  target: groupId
1448
1428
  });
1449
- return resolveIrcRequireMention({
1450
- groupConfig: match.groupConfig,
1451
- wildcardConfig: match.wildcardConfig
1452
- });
1453
1429
  },
1454
1430
  resolveToolPolicy: ({ cfg, accountId, groupId }) => {
1455
1431
  const account = resolveIrcAccount({
@@ -1457,11 +1433,10 @@ const ircPlugin = createChatChannelPlugin({
1457
1433
  accountId
1458
1434
  });
1459
1435
  if (!groupId) return;
1460
- const match = resolveIrcGroupMatch({
1436
+ return resolveIrcGroupToolPolicy({
1461
1437
  groups: account.config.groups,
1462
1438
  target: groupId
1463
1439
  });
1464
- return match.groupConfig?.tools ?? match.wildcardConfig?.tools;
1465
1440
  }
1466
1441
  },
1467
1442
  messaging: {
@@ -1583,4 +1558,4 @@ const ircPlugin = createChatChannelPlugin({
1583
1558
  }
1584
1559
  });
1585
1560
  //#endregion
1586
- export { resolveIrcRequireMention as a, isChannelTarget as c, connectIrcClient as d, makeIrcMessageId as f, resolveIrcAccount as g, resolveDefaultIrcAccountId as h, resolveIrcGroupMatch as i, normalizeIrcAllowEntry as l, listIrcAccountIds as m, ircSetupWizard as n, sendMessageIrc as o, listEnabledIrcAccounts as p, ircSetupAdapter as r, buildIrcAllowlistCandidates as s, ircPlugin as t, buildIrcConnectOptions as u };
1561
+ export { resolveIrcGroupRequireMention as a, isChannelTarget as c, connectIrcClient as d, makeIrcMessageId as f, resolveIrcAccount as g, resolveDefaultIrcAccountId as h, resolveIrcGroupMatch as i, normalizeIrcAllowEntry as l, listIrcAccountIds as m, ircSetupWizard as n, sendMessageIrc as o, listEnabledIrcAccounts as p, ircSetupAdapter as r, buildIrcAllowlistCandidates as s, ircPlugin as t, buildIrcConnectOptions as u };
@@ -1,2 +1,2 @@
1
- import { t as IrcChannelConfigSchema } from "./config-schema-BPKZaah-.js";
1
+ import { t as IrcChannelConfigSchema } from "./config-schema-BPoye3--.js";
2
2
  export { IrcChannelConfigSchema };
@@ -1,2 +1,2 @@
1
- import { t as ircPlugin } from "./channel-C-P2GolT.js";
1
+ import { t as ircPlugin } from "./channel-DivPJINh.js";
2
2
  export { ircPlugin };
@@ -1,6 +1,7 @@
1
- import { a as resolveIrcRequireMention, c as isChannelTarget, d as connectIrcClient, f as makeIrcMessageId, g as resolveIrcAccount, i as resolveIrcGroupMatch, l as normalizeIrcAllowEntry, o as sendMessageIrc, s as buildIrcAllowlistCandidates, u as buildIrcConnectOptions } from "./channel-C-P2GolT.js";
2
- import { t as getIrcRuntime } from "./runtime-DZfYm3vY.js";
1
+ import { a as resolveIrcGroupRequireMention, c as isChannelTarget, d as connectIrcClient, f as makeIrcMessageId, g as resolveIrcAccount, i as resolveIrcGroupMatch, l as normalizeIrcAllowEntry, o as sendMessageIrc, s as buildIrcAllowlistCandidates, u as buildIrcConnectOptions } from "./channel-DivPJINh.js";
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 { resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-outbound";
4
5
  import { resolveLoggerBackedRuntime } from "openclaw/plugin-sdk/extension-shared";
5
6
  import { logInboundDrop } from "openclaw/plugin-sdk/channel-inbound";
6
7
  import { channelIngressRoutes, createChannelIngressResolver, defineStableChannelIngressIdentity } from "openclaw/plugin-sdk/channel-ingress-runtime";
@@ -159,9 +160,9 @@ async function handleIrcInbound(params) {
159
160
  const mentionNick = connectedNick?.trim() || account.nick;
160
161
  const explicitMentionRegex = mentionNick ? new RegExp(`\\b${escapeIrcRegexLiteral(mentionNick)}\\b[:,]?`, "i") : null;
161
162
  const wasMentioned = core.channel.mentions.matchesMentionPatterns(rawBody, mentionRegexes) || (explicitMentionRegex ? explicitMentionRegex.test(rawBody) : false);
162
- const requireMention = message.isGroup ? resolveIrcRequireMention({
163
- groupConfig: groupMatch.groupConfig,
164
- wildcardConfig: groupMatch.wildcardConfig
163
+ const requireMention = message.isGroup ? resolveIrcGroupRequireMention({
164
+ groups: account.config.groups,
165
+ target: message.target
165
166
  }) : false;
166
167
  const routeGroupAllowFrom = normalizeStringEntries(groupMatch.groupConfig?.allowFrom?.length ? groupMatch.groupConfig.allowFrom : groupMatch.wildcardConfig?.allowFrom);
167
168
  const accessGroupPolicy = groupPolicy === "open" && (hasEntries(account.config.groupAllowFrom) || hasEntries(routeGroupAllowFrom)) ? "allowlist" : groupPolicy;
@@ -271,6 +272,7 @@ async function handleIrcInbound(params) {
271
272
  body: rawBody
272
273
  });
273
274
  const groupSystemPrompt = normalizeOptionalString(groupMatch.groupConfig?.systemPrompt);
275
+ const blockStreamingEnabled = resolveChannelStreamingBlockEnabled(account.config);
274
276
  const ctxPayload = core.channel.reply.finalizeInboundContext({
275
277
  Body: body,
276
278
  RawBody: rawBody,
@@ -322,7 +324,7 @@ async function handleIrcInbound(params) {
322
324
  replyPipeline: {},
323
325
  replyOptions: {
324
326
  skillFilter: groupMatch.groupConfig?.skills,
325
- disableBlockStreaming: typeof account.config.blockStreaming === "boolean" ? !account.config.blockStreaming : void 0
327
+ disableBlockStreaming: typeof blockStreamingEnabled === "boolean" ? !blockStreamingEnabled : void 0
326
328
  },
327
329
  record: { onRecordError: (err) => {
328
330
  runtime.error?.(`irc: failed updating session meta: ${String(err)}`);
@@ -1,4 +1,5 @@
1
- import { DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, ReplyRuntimeConfigSchemaShape, ToolPolicySchema, buildChannelConfigSchema, requireOpenAllowFrom } from "openclaw/plugin-sdk/channel-config-schema";
1
+ import { createChannelConfigUiHints } from "openclaw/plugin-sdk/channel-core";
2
+ import { ChannelGroupEntrySchema, DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, ReplyRuntimeConfigSchemaShape, buildChannelConfigSchema, buildMultiAccountChannelSchema, requireOpenAllowFrom } from "openclaw/plugin-sdk/channel-config-schema";
2
3
  import { z } from "zod";
3
4
  //#region extensions/irc/src/config-ui-hints.ts
4
5
  const ircChannelConfigUiHints = {
@@ -6,10 +7,10 @@ const ircChannelConfigUiHints = {
6
7
  label: "IRC",
7
8
  help: "IRC channel provider configuration and compatibility settings for classic IRC transport workflows. Use this section when bridging legacy chat infrastructure into OpenClaw."
8
9
  },
9
- dmPolicy: {
10
- label: "IRC DM Policy",
11
- help: "Direct message access control (\"pairing\" recommended). \"open\" requires channels.irc.allowFrom=[\"*\"]."
12
- },
10
+ ...createChannelConfigUiHints({
11
+ channelLabel: "IRC",
12
+ dmPolicy: { channelKey: "irc" }
13
+ }),
13
14
  "nickserv.enabled": {
14
15
  label: "IRC NickServ Enabled",
15
16
  help: "Enable NickServ identify/register after connect (defaults to enabled when password is configured)."
@@ -34,22 +35,13 @@ const ircChannelConfigUiHints = {
34
35
  label: "IRC NickServ Register Email",
35
36
  help: "Email used with NickServ REGISTER (required when register=true)."
36
37
  },
37
- configWrites: {
38
- label: "IRC Config Writes",
39
- help: "Allow IRC to write config in response to channel events/commands (default: true)."
40
- }
38
+ ...createChannelConfigUiHints({
39
+ channelLabel: "IRC",
40
+ configWrites: true
41
+ })
41
42
  };
42
43
  //#endregion
43
44
  //#region extensions/irc/src/config-schema.ts
44
- const IrcGroupSchema = z.object({
45
- requireMention: z.boolean().optional(),
46
- tools: ToolPolicySchema,
47
- toolsBySender: z.record(z.string(), ToolPolicySchema).optional(),
48
- skills: z.array(z.string()).optional(),
49
- enabled: z.boolean().optional(),
50
- allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
51
- systemPrompt: z.string().optional()
52
- }).strict();
53
45
  const IrcNickServSchema = z.object({
54
46
  enabled: z.boolean().optional(),
55
47
  service: z.string().optional(),
@@ -64,7 +56,7 @@ const IrcNickServSchema = z.object({
64
56
  message: "channels.irc.nickserv.register=true requires channels.irc.nickserv.registerEmail"
65
57
  });
66
58
  });
67
- const IrcAccountSchemaBase = z.object({
59
+ const IrcChannelConfigSchema = buildChannelConfigSchema(buildMultiAccountChannelSchema(z.object({
68
60
  name: z.string().optional(),
69
61
  enabled: z.boolean().optional(),
70
62
  dangerouslyAllowNameMatching: z.boolean().optional(),
@@ -81,32 +73,22 @@ const IrcAccountSchemaBase = z.object({
81
73
  allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
82
74
  groupPolicy: GroupPolicySchema.optional().default("allowlist"),
83
75
  groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),
84
- groups: z.record(z.string(), IrcGroupSchema.optional()).optional(),
76
+ groups: z.record(z.string(), ChannelGroupEntrySchema.optional()).optional(),
85
77
  channels: z.array(z.string()).optional(),
86
78
  mentionPatterns: z.array(z.string()).optional(),
87
79
  markdown: MarkdownConfigSchema,
88
80
  ...ReplyRuntimeConfigSchemaShape
89
- }).strict();
90
- const IrcAccountSchema = IrcAccountSchemaBase.superRefine((value, ctx) => {
91
- requireOpenAllowFrom({
92
- policy: value.dmPolicy,
93
- allowFrom: value.allowFrom,
94
- ctx,
95
- path: ["allowFrom"],
96
- message: "channels.irc.dmPolicy=\"open\" requires channels.irc.allowFrom to include \"*\""
97
- });
98
- });
99
- const IrcChannelConfigSchema = buildChannelConfigSchema(IrcAccountSchemaBase.extend({
100
- accounts: z.record(z.string(), IrcAccountSchema.optional()).optional(),
101
- defaultAccount: z.string().optional()
102
- }).superRefine((value, ctx) => {
103
- requireOpenAllowFrom({
104
- policy: value.dmPolicy,
105
- allowFrom: value.allowFrom,
106
- ctx,
107
- path: ["allowFrom"],
108
- message: "channels.irc.dmPolicy=\"open\" requires channels.irc.allowFrom to include \"*\""
109
- });
81
+ }).strict(), {
82
+ optionalAccount: true,
83
+ refine: (value, ctx) => {
84
+ requireOpenAllowFrom({
85
+ policy: value.dmPolicy,
86
+ allowFrom: value.allowFrom,
87
+ ctx,
88
+ path: ["allowFrom"],
89
+ message: "channels.irc.dmPolicy=\"open\" requires channels.irc.allowFrom to include \"*\""
90
+ });
91
+ }
110
92
  }), { uiHints: ircChannelConfigUiHints });
111
93
  //#endregion
112
94
  export { IrcChannelConfigSchema as t };
@@ -0,0 +1,16 @@
1
+ import { defineChannelAliasMigration } from "openclaw/plugin-sdk/runtime-doctor";
2
+ //#region extensions/irc/doctor-contract-api.ts
3
+ const streamingAliasMigration = defineChannelAliasMigration({
4
+ channelId: "irc",
5
+ streaming: {
6
+ defaultMode: "partial",
7
+ deliveryOnly: true
8
+ },
9
+ accountStreamingReplacesRoot: true
10
+ });
11
+ const legacyConfigRules = streamingAliasMigration.legacyConfigRules;
12
+ function normalizeCompatibilityConfig({ cfg }) {
13
+ return streamingAliasMigration.normalizeChannelConfig({ cfg });
14
+ }
15
+ //#endregion
16
+ export { legacyConfigRules, normalizeCompatibilityConfig };
@@ -1,2 +1,2 @@
1
- import { n as setIrcRuntime } from "./runtime-DZfYm3vY.js";
1
+ import { n as setIrcRuntime } from "./runtime-xy-FcjJC.js";
2
2
  export { setIrcRuntime };
@@ -1,6 +1,6 @@
1
1
  import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
2
2
  //#region extensions/irc/src/runtime.ts
3
- const { setRuntime: setIrcRuntime, clearRuntime: clearStoredIrcRuntime, getRuntime: getIrcRuntime } = createPluginRuntimeStore({
3
+ const { setRuntime: setIrcRuntime, getRuntime: getIrcRuntime } = createPluginRuntimeStore({
4
4
  pluginId: "irc",
5
5
  errorMessage: "IRC runtime not initialized"
6
6
  });
@@ -0,0 +1,41 @@
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
+ topInactiveReason: "no enabled account inherits this top-level IRC nickserv config or NickServ is disabled.",
32
+ accountActive: ({ account, enabled }) => enabled && isRecord(account.nickserv) && isEnabledFlag(account.nickserv),
33
+ accountInactiveReason: "IRC account is disabled or NickServ is disabled for this account."
34
+ });
35
+ }
36
+ const channelSecrets = {
37
+ secretTargetRegistryEntries,
38
+ collectRuntimeConfigAssignments
39
+ };
40
+ //#endregion
41
+ export { collectRuntimeConfigAssignments as n, secretTargetRegistryEntries as r, channelSecrets as t };
@@ -1,2 +1,2 @@
1
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./secret-contract-DdKIs_mx.js";
1
+ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./secret-contract-PJHaoTSe.js";
2
2
  export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@openclaw/irc",
3
- "version": "2026.7.1",
3
+ "version": "2026.7.2-beta.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@openclaw/irc",
9
- "version": "2026.7.1",
9
+ "version": "2026.7.2-beta.2",
10
10
  "dependencies": {
11
11
  "zod": "4.4.3"
12
12
  }
@@ -296,33 +296,45 @@
296
296
  "exclusiveMinimum": 0,
297
297
  "maximum": 9007199254740991
298
298
  },
299
- "chunkMode": {
300
- "type": "string",
301
- "enum": [
302
- "length",
303
- "newline"
304
- ]
305
- },
306
- "blockStreaming": {
307
- "type": "boolean"
308
- },
309
- "blockStreamingCoalesce": {
299
+ "streaming": {
310
300
  "type": "object",
311
301
  "properties": {
312
- "minChars": {
313
- "type": "integer",
314
- "exclusiveMinimum": 0,
315
- "maximum": 9007199254740991
316
- },
317
- "maxChars": {
318
- "type": "integer",
319
- "exclusiveMinimum": 0,
320
- "maximum": 9007199254740991
302
+ "chunkMode": {
303
+ "type": "string",
304
+ "enum": [
305
+ "length",
306
+ "newline"
307
+ ]
321
308
  },
322
- "idleMs": {
323
- "type": "integer",
324
- "minimum": 0,
325
- "maximum": 9007199254740991
309
+ "block": {
310
+ "type": "object",
311
+ "properties": {
312
+ "enabled": {
313
+ "type": "boolean"
314
+ },
315
+ "coalesce": {
316
+ "type": "object",
317
+ "properties": {
318
+ "minChars": {
319
+ "type": "integer",
320
+ "exclusiveMinimum": 0,
321
+ "maximum": 9007199254740991
322
+ },
323
+ "maxChars": {
324
+ "type": "integer",
325
+ "exclusiveMinimum": 0,
326
+ "maximum": 9007199254740991
327
+ },
328
+ "idleMs": {
329
+ "type": "integer",
330
+ "minimum": 0,
331
+ "maximum": 9007199254740991
332
+ }
333
+ },
334
+ "additionalProperties": false
335
+ }
336
+ },
337
+ "additionalProperties": false
326
338
  }
327
339
  },
328
340
  "additionalProperties": false
@@ -607,33 +619,45 @@
607
619
  "exclusiveMinimum": 0,
608
620
  "maximum": 9007199254740991
609
621
  },
610
- "chunkMode": {
611
- "type": "string",
612
- "enum": [
613
- "length",
614
- "newline"
615
- ]
616
- },
617
- "blockStreaming": {
618
- "type": "boolean"
619
- },
620
- "blockStreamingCoalesce": {
622
+ "streaming": {
621
623
  "type": "object",
622
624
  "properties": {
623
- "minChars": {
624
- "type": "integer",
625
- "exclusiveMinimum": 0,
626
- "maximum": 9007199254740991
627
- },
628
- "maxChars": {
629
- "type": "integer",
630
- "exclusiveMinimum": 0,
631
- "maximum": 9007199254740991
625
+ "chunkMode": {
626
+ "type": "string",
627
+ "enum": [
628
+ "length",
629
+ "newline"
630
+ ]
632
631
  },
633
- "idleMs": {
634
- "type": "integer",
635
- "minimum": 0,
636
- "maximum": 9007199254740991
632
+ "block": {
633
+ "type": "object",
634
+ "properties": {
635
+ "enabled": {
636
+ "type": "boolean"
637
+ },
638
+ "coalesce": {
639
+ "type": "object",
640
+ "properties": {
641
+ "minChars": {
642
+ "type": "integer",
643
+ "exclusiveMinimum": 0,
644
+ "maximum": 9007199254740991
645
+ },
646
+ "maxChars": {
647
+ "type": "integer",
648
+ "exclusiveMinimum": 0,
649
+ "maximum": 9007199254740991
650
+ },
651
+ "idleMs": {
652
+ "type": "integer",
653
+ "minimum": 0,
654
+ "maximum": 9007199254740991
655
+ }
656
+ },
657
+ "additionalProperties": false
658
+ }
659
+ },
660
+ "additionalProperties": false
637
661
  }
638
662
  },
639
663
  "additionalProperties": false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/irc",
3
- "version": "2026.7.1",
3
+ "version": "2026.7.2-beta.2",
4
4
  "description": "OpenClaw IRC channel plugin",
5
5
  "type": "module",
6
6
  "openclaw": {
@@ -33,16 +33,14 @@
33
33
  "IRC_HOST",
34
34
  "IRC_NICK"
35
35
  ]
36
- },
37
- "specifier": "./configured-state",
38
- "exportName": "hasIrcConfiguredState"
36
+ }
39
37
  }
40
38
  },
41
39
  "compat": {
42
- "pluginApi": ">=2026.7.1"
40
+ "pluginApi": ">=2026.7.2-beta.2"
43
41
  },
44
42
  "build": {
45
- "openclawVersion": "2026.7.1",
43
+ "openclawVersion": "2026.7.2-beta.2",
46
44
  "bundledDist": false
47
45
  },
48
46
  "release": {
@@ -68,7 +66,7 @@
68
66
  "README.md"
69
67
  ],
70
68
  "peerDependencies": {
71
- "openclaw": ">=2026.7.1"
69
+ "openclaw": ">=2026.7.2-beta.2"
72
70
  },
73
71
  "peerDependenciesMeta": {
74
72
  "openclaw": {
@@ -1,6 +0,0 @@
1
- //#region extensions/irc/configured-state.ts
2
- function hasIrcConfiguredState(params) {
3
- return typeof params.env?.IRC_HOST === "string" && params.env.IRC_HOST.trim().length > 0 && typeof params.env?.IRC_NICK === "string" && params.env.IRC_NICK.trim().length > 0;
4
- }
5
- //#endregion
6
- export { hasIrcConfiguredState };
@@ -1,82 +0,0 @@
1
- import { collectNestedChannelFieldAssignments, collectSimpleChannelFieldAssignments, getChannelSurface, isBaseFieldActiveForChannelSurface, isEnabledFlag, isRecord } from "openclaw/plugin-sdk/channel-secret-basic-runtime";
2
- //#region extensions/irc/src/secret-contract.ts
3
- const secretTargetRegistryEntries = [
4
- {
5
- id: "channels.irc.accounts.*.nickserv.password",
6
- targetType: "channels.irc.accounts.*.nickserv.password",
7
- configFile: "openclaw.json",
8
- pathPattern: "channels.irc.accounts.*.nickserv.password",
9
- secretShape: "secret_input",
10
- expectedResolvedValue: "string",
11
- includeInPlan: true,
12
- includeInConfigure: true,
13
- includeInAudit: true
14
- },
15
- {
16
- id: "channels.irc.accounts.*.password",
17
- targetType: "channels.irc.accounts.*.password",
18
- configFile: "openclaw.json",
19
- pathPattern: "channels.irc.accounts.*.password",
20
- secretShape: "secret_input",
21
- expectedResolvedValue: "string",
22
- includeInPlan: true,
23
- includeInConfigure: true,
24
- includeInAudit: true
25
- },
26
- {
27
- id: "channels.irc.nickserv.password",
28
- targetType: "channels.irc.nickserv.password",
29
- configFile: "openclaw.json",
30
- pathPattern: "channels.irc.nickserv.password",
31
- secretShape: "secret_input",
32
- expectedResolvedValue: "string",
33
- includeInPlan: true,
34
- includeInConfigure: true,
35
- includeInAudit: true
36
- },
37
- {
38
- id: "channels.irc.password",
39
- targetType: "channels.irc.password",
40
- configFile: "openclaw.json",
41
- pathPattern: "channels.irc.password",
42
- secretShape: "secret_input",
43
- expectedResolvedValue: "string",
44
- includeInPlan: true,
45
- includeInConfigure: true,
46
- includeInAudit: true
47
- }
48
- ];
49
- function collectRuntimeConfigAssignments(params) {
50
- const resolved = getChannelSurface(params.config, "irc");
51
- if (!resolved) return;
52
- const { channel: irc, surface } = resolved;
53
- collectSimpleChannelFieldAssignments({
54
- channelKey: "irc",
55
- field: "password",
56
- channel: irc,
57
- surface,
58
- defaults: params.defaults,
59
- context: params.context,
60
- topInactiveReason: "no enabled account inherits this top-level IRC password.",
61
- accountInactiveReason: "IRC account is disabled."
62
- });
63
- collectNestedChannelFieldAssignments({
64
- channelKey: "irc",
65
- nestedKey: "nickserv",
66
- field: "password",
67
- channel: irc,
68
- surface,
69
- defaults: params.defaults,
70
- context: params.context,
71
- topLevelActive: isBaseFieldActiveForChannelSurface(surface, "nickserv") && isRecord(irc.nickserv) && isEnabledFlag(irc.nickserv),
72
- topInactiveReason: "no enabled account inherits this top-level IRC nickserv config or NickServ is disabled.",
73
- accountActive: ({ account, enabled }) => enabled && isRecord(account.nickserv) && isEnabledFlag(account.nickserv),
74
- accountInactiveReason: "IRC account is disabled or NickServ is disabled for this account."
75
- });
76
- }
77
- const channelSecrets = {
78
- secretTargetRegistryEntries,
79
- collectRuntimeConfigAssignments
80
- };
81
- //#endregion
82
- export { collectRuntimeConfigAssignments as n, secretTargetRegistryEntries as r, channelSecrets as t };