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