@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 +2 -2
- package/dist/{channel-C-P2GolT.js → channel-DivPJINh.js} +50 -75
- package/dist/channel-config-api.js +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/{channel-runtime-CLTE89ol.js → channel-runtime-Dg0LFlsh.js} +8 -6
- package/dist/{config-schema-BPKZaah-.js → config-schema-BPoye3--.js} +23 -41
- package/dist/doctor-contract-api.js +16 -0
- package/dist/runtime-api.js +1 -1
- package/dist/{runtime-DZfYm3vY.js → runtime-xy-FcjJC.js} +1 -1
- package/dist/secret-contract-PJHaoTSe.js +41 -0
- package/dist/secret-contract-api.js +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/openclaw.plugin.json +72 -48
- package/package.json +5 -7
- package/dist/configured-state.js +0 -6
- package/dist/secret-contract-DdKIs_mx.js +0 -82
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-
|
|
2
|
-
import { n as setIrcRuntime } from "./runtime-
|
|
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-
|
|
2
|
-
import { t as getIrcRuntime } from "./runtime-
|
|
3
|
-
import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-
|
|
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:
|
|
178
|
-
collectLists: (scope) => {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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-
|
|
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
|
|
800
|
-
const groups = params.groups ?? {};
|
|
801
|
-
const
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
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
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
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:
|
|
828
|
-
|
|
796
|
+
allowed: Boolean(groupConfig ?? wildcardConfig),
|
|
797
|
+
groupConfig,
|
|
798
|
+
wildcardConfig,
|
|
799
|
+
hasConfiguredGroups: Object.keys(params.groups ?? {}).length > 0
|
|
829
800
|
};
|
|
830
801
|
}
|
|
831
|
-
function
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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-
|
|
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-
|
|
1
|
+
import { t as ircPlugin } from "./channel-DivPJINh.js";
|
|
2
2
|
export { ircPlugin };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
import { t as getIrcRuntime } from "./runtime-
|
|
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 ?
|
|
163
|
-
|
|
164
|
-
|
|
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
|
|
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 {
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
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(),
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
});
|
|
99
|
-
|
|
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 };
|
package/dist/runtime-api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as setIrcRuntime } from "./runtime-
|
|
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,
|
|
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-
|
|
1
|
+
import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./secret-contract-PJHaoTSe.js";
|
|
2
2
|
export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/irc",
|
|
3
|
-
"version": "2026.7.
|
|
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.
|
|
9
|
+
"version": "2026.7.2-beta.2",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"zod": "4.4.3"
|
|
12
12
|
}
|
package/openclaw.plugin.json
CHANGED
|
@@ -296,33 +296,45 @@
|
|
|
296
296
|
"exclusiveMinimum": 0,
|
|
297
297
|
"maximum": 9007199254740991
|
|
298
298
|
},
|
|
299
|
-
"
|
|
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
|
-
"
|
|
313
|
-
"type": "
|
|
314
|
-
"
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
"type": "integer",
|
|
319
|
-
"exclusiveMinimum": 0,
|
|
320
|
-
"maximum": 9007199254740991
|
|
302
|
+
"chunkMode": {
|
|
303
|
+
"type": "string",
|
|
304
|
+
"enum": [
|
|
305
|
+
"length",
|
|
306
|
+
"newline"
|
|
307
|
+
]
|
|
321
308
|
},
|
|
322
|
-
"
|
|
323
|
-
"type": "
|
|
324
|
-
"
|
|
325
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
624
|
-
"type": "
|
|
625
|
-
"
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
"type": "integer",
|
|
630
|
-
"exclusiveMinimum": 0,
|
|
631
|
-
"maximum": 9007199254740991
|
|
625
|
+
"chunkMode": {
|
|
626
|
+
"type": "string",
|
|
627
|
+
"enum": [
|
|
628
|
+
"length",
|
|
629
|
+
"newline"
|
|
630
|
+
]
|
|
632
631
|
},
|
|
633
|
-
"
|
|
634
|
-
"type": "
|
|
635
|
-
"
|
|
636
|
-
|
|
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.
|
|
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.
|
|
40
|
+
"pluginApi": ">=2026.7.2-beta.2"
|
|
43
41
|
},
|
|
44
42
|
"build": {
|
|
45
|
-
"openclawVersion": "2026.7.
|
|
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.
|
|
69
|
+
"openclaw": ">=2026.7.2-beta.2"
|
|
72
70
|
},
|
|
73
71
|
"peerDependenciesMeta": {
|
|
74
72
|
"openclaw": {
|
package/dist/configured-state.js
DELETED
|
@@ -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 };
|