@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
|
|
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 ?
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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-
|
|
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 }) =>
|
|
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-
|
|
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:
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
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 {
|
|
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-
|
|
1
|
+
import { t as ircPlugin } from "./channel-DoavT7vs.js";
|
|
2
2
|
export { ircPlugin };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
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:
|
|
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
|
|
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
|
-
|
|
485
|
-
|
|
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.
|
|
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.
|
|
120
|
+
"pluginApi": ">=2026.7.2-beta.7"
|
|
121
121
|
},
|
|
122
122
|
"build": {
|
|
123
|
-
"openclawVersion": "2026.7.2-beta.
|
|
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.
|
|
148
|
+
"openclaw": ">=2026.7.2-beta.7"
|
|
150
149
|
},
|
|
151
150
|
"peerDependenciesMeta": {
|
|
152
151
|
"openclaw": {
|
package/npm-shrinkwrap.json
DELETED
|
@@ -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
|
-
}
|