@openclaw/irc 2026.11.3 → 2026.11.5-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-Bi4lj8N2.mjs → channel-DgvKz42q.mjs} +254 -299
- package/dist/.setup/channel-plugin-api-WXJUjGsf.mjs +2 -0
- package/dist/.setup/channel-runtime-D4vKt7TE.mjs +582 -0
- package/dist/.setup/{config-schema-Cy9tItsu.mjs → config-schema-CHwjI_aV.mjs} +1 -3
- package/dist/.setup/secret-contract-api-4IT9_EK6.mjs +2 -0
- package/dist/.source-module-urls/4751df78f545ae971ceb22b6e4bff6086f63313240899a1d9884b970424a305e.json +1 -0
- package/dist/api.js +1 -1
- package/dist/channel-config-api.js +1 -2
- package/dist/channel-plugin-api.js +1 -2
- package/dist/runtime-api.js +1 -2
- package/dist/secret-contract-api.js +1 -2
- package/dist/setup-entry.js +2 -2
- package/node_modules/zod/package.json +1 -1
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +7 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +6 -0
- package/node_modules/zod/src/v4/core/compile.ts +9 -0
- package/node_modules/zod/src/v4/core/schemas.ts +35 -1
- package/node_modules/zod/src/v4/core/util.ts +13 -0
- package/node_modules/zod/src/v4/core/versions.ts +1 -1
- package/node_modules/zod/v4/core/compile.cjs +8 -0
- package/node_modules/zod/v4/core/compile.js +8 -0
- package/node_modules/zod/v4/core/schemas.cjs +30 -0
- package/node_modules/zod/v4/core/schemas.d.cts +3 -1
- package/node_modules/zod/v4/core/schemas.d.ts +3 -1
- package/node_modules/zod/v4/core/schemas.js +30 -0
- package/node_modules/zod/v4/core/util.cjs +15 -0
- package/node_modules/zod/v4/core/util.d.cts +2 -0
- package/node_modules/zod/v4/core/util.d.ts +2 -0
- package/node_modules/zod/v4/core/util.js +14 -0
- package/node_modules/zod/v4/core/versions.cjs +1 -1
- package/node_modules/zod/v4/core/versions.js +1 -1
- package/package.json +5 -5
- package/dist/.setup/channel-plugin-api-U3Pg1KLp.mjs +0 -3
- package/dist/.setup/channel-runtime-B4OMtNnX.mjs +0 -652
- package/dist/.setup/secret-contract-api-ClqD0Rpm.mjs +0 -3
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
import { a as buildIrcConnectOptions, c as parseIrcPrefix, d as sanitizeIrcAssistantText, f as createIrcIngressSubject, h as normalizeIrcAllowEntry, i as sendMessageIrc, l as resolveIrcGroupMatch, m as isChannelTarget, o as connectIrcClient, p as ircIngressIdentity, s as parseIrcLine, u as resolveIrcGroupRequireMention, y as resolveIrcAccount } from "./channel-DgvKz42q.mjs";
|
|
2
|
+
import { t as getIrcRuntime } from "./runtime-C_V9tmpk.mjs";
|
|
3
|
+
import { channelIngressRoutes } from "openclaw/plugin-sdk/channel-ingress-runtime";
|
|
4
|
+
import { bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-outbound";
|
|
5
|
+
import { computeBackoff } from "openclaw/plugin-sdk/runtime-env";
|
|
6
|
+
import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
7
|
+
import { createChannelInboundEnvelopeBuilderAsync, logInboundDrop } from "openclaw/plugin-sdk/channel-inbound";
|
|
8
|
+
import { resolveLoggerBackedRuntime } from "openclaw/plugin-sdk/extension-shared";
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
10
|
+
import { resolveAgentRoute } from "openclaw/plugin-sdk/routing";
|
|
11
|
+
import { createChannelPairingController } from "openclaw/plugin-sdk/channel-pairing";
|
|
12
|
+
import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/dangerous-name-runtime";
|
|
13
|
+
import { channelReadyPatch } from "openclaw/plugin-sdk/gateway-runtime";
|
|
14
|
+
import { deliverFormattedTextWithAttachments } from "openclaw/plugin-sdk/reply-payload";
|
|
15
|
+
import { GROUP_POLICY_BLOCKED_LABEL, resolveAllowlistProviderRuntimeGroupPolicy, resolveDefaultGroupPolicy, warnMissingProviderGroupPolicyFallbackOnce } from "openclaw/plugin-sdk/runtime-group-policy";
|
|
16
|
+
import { escapeRegExp } from "openclaw/plugin-sdk/text-utility-runtime";
|
|
17
|
+
//#region extensions/irc/src/irc-ingress.ts
|
|
18
|
+
const IRC_INGRESS_PAYLOAD_VERSION = 1;
|
|
19
|
+
const IRC_INGRESS_POLL_INTERVAL_MS = 1e3;
|
|
20
|
+
const IrcIngressPayloadError = createChannelIngressError("IrcIngressPayloadError");
|
|
21
|
+
function inspectRawPrivmsg(rawLine) {
|
|
22
|
+
const line = parseIrcLine(rawLine);
|
|
23
|
+
if (!line || line.command !== "PRIVMSG") throw new IrcIngressPayloadError("IRC ingress row is not a PRIVMSG line.");
|
|
24
|
+
const rawTarget = line.params[0]?.trim() ?? "";
|
|
25
|
+
const text = line.trailing ?? line.params[1] ?? "";
|
|
26
|
+
const prefix = parseIrcPrefix(line.prefix);
|
|
27
|
+
const senderNick = prefix.nick?.trim() ?? "";
|
|
28
|
+
if (!rawTarget || !senderNick || !text.trim()) throw new IrcIngressPayloadError("IRC PRIVMSG line is missing target, sender, or text.");
|
|
29
|
+
const isGroup = isChannelTarget(rawTarget);
|
|
30
|
+
const target = isGroup ? rawTarget : senderNick;
|
|
31
|
+
const lanePeer = normalizeLowercaseStringOrEmpty(target);
|
|
32
|
+
return {
|
|
33
|
+
laneKey: `${isGroup ? "channel" : "direct"}:${lanePeer}`,
|
|
34
|
+
message: {
|
|
35
|
+
target,
|
|
36
|
+
rawTarget,
|
|
37
|
+
senderNick,
|
|
38
|
+
senderUser: prefix.user?.trim() || void 0,
|
|
39
|
+
senderHost: prefix.host?.trim() || void 0,
|
|
40
|
+
text,
|
|
41
|
+
isGroup
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function decodeIrcIngressPayload(payload, claimedId) {
|
|
46
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload) || typeof payload.eventId !== "string" || !Number.isSafeInteger(payload.receivedAt) || (payload.receivedAt ?? 0) <= 0 || typeof payload.connectionEpoch !== "string" || !payload.connectionEpoch?.trim() || typeof payload.connectedNick !== "string" || !payload.connectedNick?.trim() || typeof payload.rawLine !== "string") throw new IrcIngressPayloadError(`IRC ingress row ${claimedId} has invalid metadata.`);
|
|
47
|
+
const validPayload = payload;
|
|
48
|
+
return {
|
|
49
|
+
version: validPayload.version,
|
|
50
|
+
body: {
|
|
51
|
+
eventId: validPayload.eventId,
|
|
52
|
+
receivedAt: validPayload.receivedAt,
|
|
53
|
+
connectionEpoch: validPayload.connectionEpoch,
|
|
54
|
+
connectedNick: validPayload.connectedNick,
|
|
55
|
+
rawLine: validPayload.rawLine
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function inspectIrcIngress(raw, phase) {
|
|
60
|
+
try {
|
|
61
|
+
const projection = inspectRawPrivmsg(raw.body.rawLine);
|
|
62
|
+
if (phase === "claim") raw.claimedProjection = projection;
|
|
63
|
+
return {
|
|
64
|
+
eventId: raw.body.eventId,
|
|
65
|
+
laneKey: projection.laneKey
|
|
66
|
+
};
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (phase === "admission" && error instanceof IrcIngressPayloadError) return {
|
|
69
|
+
eventId: raw.body.eventId,
|
|
70
|
+
laneKey: `invalid:${raw.body.eventId}`
|
|
71
|
+
};
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function resolveIrcIngressNonRetryableFailure(error) {
|
|
76
|
+
return error instanceof IrcIngressPayloadError ? {
|
|
77
|
+
reason: "invalid-event",
|
|
78
|
+
message: error.message
|
|
79
|
+
} : null;
|
|
80
|
+
}
|
|
81
|
+
function createIrcIngressMonitor(options) {
|
|
82
|
+
const monitor = createChannelIngressMonitor({
|
|
83
|
+
queue: () => getIrcRuntime().state.openChannelIngressQueue({ accountId: options.accountId }),
|
|
84
|
+
inspect: (raw, context) => inspectIrcIngress(raw, context.phase),
|
|
85
|
+
payload: {
|
|
86
|
+
version: IRC_INGRESS_PAYLOAD_VERSION,
|
|
87
|
+
serialize: (raw) => raw.body,
|
|
88
|
+
deserialize: (body) => ({ body }),
|
|
89
|
+
encode: ({ body }) => ({
|
|
90
|
+
version: IRC_INGRESS_PAYLOAD_VERSION,
|
|
91
|
+
...body
|
|
92
|
+
}),
|
|
93
|
+
decode: (payload, { claim }) => decodeIrcIngressPayload(payload, claim.id),
|
|
94
|
+
createClaimError: (_kind, claim) => new IrcIngressPayloadError(`IRC ingress row ${claim.id} has invalid metadata.`)
|
|
95
|
+
},
|
|
96
|
+
deliver: (raw, lifecycle, claim) => {
|
|
97
|
+
const message = {
|
|
98
|
+
...raw.claimedProjection.message,
|
|
99
|
+
messageId: claim.id,
|
|
100
|
+
timestamp: raw.body.receivedAt
|
|
101
|
+
};
|
|
102
|
+
return options.dispatch(message, lifecycle, {
|
|
103
|
+
connectedNick: raw.body.connectedNick.trim(),
|
|
104
|
+
connectionEpoch: raw.body.connectionEpoch.trim()
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
pollIntervalMs: IRC_INGRESS_POLL_INTERVAL_MS,
|
|
108
|
+
retention: {
|
|
109
|
+
completedMaxEntries: 1e3,
|
|
110
|
+
failedMaxEntries: 1e3
|
|
111
|
+
},
|
|
112
|
+
drain: {
|
|
113
|
+
resolveNonRetryableFailure: resolveIrcIngressNonRetryableFailure,
|
|
114
|
+
onLog: (message) => options.runtime.log?.(`irc ${message}`)
|
|
115
|
+
},
|
|
116
|
+
createStoppedError: () => /* @__PURE__ */ new Error("IRC ingress is stopped."),
|
|
117
|
+
onError: (error) => options.runtime.error?.(`irc ingress drain failed: ${String(error)}`)
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
openConnection: (connectionEpoch = randomUUID()) => {
|
|
121
|
+
const epoch = connectionEpoch.trim();
|
|
122
|
+
if (!epoch) throw new Error("IRC ingress connection epoch is required.");
|
|
123
|
+
let sequence = 0;
|
|
124
|
+
return {
|
|
125
|
+
connectionEpoch: epoch,
|
|
126
|
+
accept: (rawLine, connectedNick) => {
|
|
127
|
+
if (monitor.isStopped()) return Promise.reject(/* @__PURE__ */ new Error("IRC ingress is stopped."));
|
|
128
|
+
sequence += 1;
|
|
129
|
+
const eventId = `local:${epoch}:${String(sequence).padStart(12, "0")}`;
|
|
130
|
+
const receivedAt = Date.now();
|
|
131
|
+
const normalizedNick = connectedNick.trim();
|
|
132
|
+
if (!normalizedNick) return Promise.reject(/* @__PURE__ */ new Error("IRC ingress connected nickname is required."));
|
|
133
|
+
return monitor.admit({ body: {
|
|
134
|
+
eventId,
|
|
135
|
+
rawLine,
|
|
136
|
+
receivedAt,
|
|
137
|
+
connectionEpoch: epoch,
|
|
138
|
+
connectedNick: normalizedNick
|
|
139
|
+
} }, { receivedAt }).then(() => void 0);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
},
|
|
143
|
+
start: monitor.start,
|
|
144
|
+
pause: monitor.pause,
|
|
145
|
+
stop: monitor.stop,
|
|
146
|
+
waitForIdle: monitor.waitForIdle
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//#endregion
|
|
150
|
+
//#region extensions/irc/src/reconnect-backoff.ts
|
|
151
|
+
const IRC_RECONNECT_BACKOFF = {
|
|
152
|
+
initialMs: 1e3,
|
|
153
|
+
maxMs: 3e4,
|
|
154
|
+
factor: 2,
|
|
155
|
+
jitter: .2
|
|
156
|
+
};
|
|
157
|
+
const IRC_RECONNECT_STABLE_MS = 6e4;
|
|
158
|
+
function createIrcReconnectBackoff() {
|
|
159
|
+
let attempt = 0;
|
|
160
|
+
let connectedAt;
|
|
161
|
+
return {
|
|
162
|
+
markConnected: () => {
|
|
163
|
+
connectedAt = Date.now();
|
|
164
|
+
},
|
|
165
|
+
nextDelayMs: () => {
|
|
166
|
+
if (connectedAt !== void 0 && Date.now() - connectedAt >= IRC_RECONNECT_STABLE_MS) attempt = 0;
|
|
167
|
+
connectedAt = void 0;
|
|
168
|
+
attempt += 1;
|
|
169
|
+
return computeBackoff(IRC_RECONNECT_BACKOFF, attempt);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//#endregion
|
|
174
|
+
//#region extensions/irc/src/monitor.ts
|
|
175
|
+
const CHANNEL_ID = "irc";
|
|
176
|
+
const IRC_NICK_CHARACTER = String.raw`[A-Za-z0-9_\-\[\]\\\x60^{}|~]`;
|
|
177
|
+
const IRC_RFC1459_CASE_EQUIVALENTS = /* @__PURE__ */ new Map([
|
|
178
|
+
["[", "{"],
|
|
179
|
+
["{", "["],
|
|
180
|
+
["]", "}"],
|
|
181
|
+
["}", "]"],
|
|
182
|
+
["\\", "|"],
|
|
183
|
+
["|", "\\"],
|
|
184
|
+
["^", "~"],
|
|
185
|
+
["~", "^"]
|
|
186
|
+
]);
|
|
187
|
+
function buildIrcNickMentionPattern(value) {
|
|
188
|
+
return Array.from(value, (character) => {
|
|
189
|
+
const equivalent = IRC_RFC1459_CASE_EQUIVALENTS.get(character);
|
|
190
|
+
return equivalent ? `[${escapeRegExp(character)}${escapeRegExp(equivalent)}]` : escapeRegExp(character);
|
|
191
|
+
}).join("");
|
|
192
|
+
}
|
|
193
|
+
function hasEntries(entries) {
|
|
194
|
+
return normalizeStringEntries(entries).some((entry) => normalizeIrcAllowEntry(entry));
|
|
195
|
+
}
|
|
196
|
+
async function monitorIrcProvider(opts) {
|
|
197
|
+
const core = getIrcRuntime();
|
|
198
|
+
const cfg = opts.config ?? core.config.current();
|
|
199
|
+
const account = resolveIrcAccount({
|
|
200
|
+
cfg,
|
|
201
|
+
accountId: opts.accountId
|
|
202
|
+
});
|
|
203
|
+
const runtime = resolveLoggerBackedRuntime(opts.runtime, core.logging.getChildLogger());
|
|
204
|
+
if (!account.configured) throw new Error(`IRC is not configured for account "${account.accountId}" (need host and nick in channels.irc).`);
|
|
205
|
+
const logger = core.logging.getChildLogger({
|
|
206
|
+
channel: "irc",
|
|
207
|
+
accountId: account.accountId
|
|
208
|
+
});
|
|
209
|
+
let client = null;
|
|
210
|
+
let activeConnectionEpoch = null;
|
|
211
|
+
let ingressPause = Promise.resolve();
|
|
212
|
+
let reconnectTimer = null;
|
|
213
|
+
const reconnectBackoff = createIrcReconnectBackoff();
|
|
214
|
+
let stopped = false;
|
|
215
|
+
const monitorAbort = new AbortController();
|
|
216
|
+
const abortSignal = opts.abortSignal ? AbortSignal.any([opts.abortSignal, monitorAbort.signal]) : monitorAbort.signal;
|
|
217
|
+
const ingress = createIrcIngressMonitor({
|
|
218
|
+
accountId: account.accountId,
|
|
219
|
+
runtime,
|
|
220
|
+
dispatch: async (message, turnAdoptionLifecycle, context) => {
|
|
221
|
+
if (!client || stopped || abortSignal.aborted) return {
|
|
222
|
+
kind: "failed-retryable",
|
|
223
|
+
error: /* @__PURE__ */ new Error("IRC transport disconnected before ingress dispatch.")
|
|
224
|
+
};
|
|
225
|
+
if (normalizeLowercaseStringOrEmpty(message.senderNick) === normalizeLowercaseStringOrEmpty(context.connectedNick)) return { kind: "completed" };
|
|
226
|
+
if (!message.isGroup && context.connectionEpoch !== activeConnectionEpoch) {
|
|
227
|
+
logger.warn?.(`[${account.accountId}] dropping replayed IRC DM after the connection changed`);
|
|
228
|
+
return { kind: "completed" };
|
|
229
|
+
}
|
|
230
|
+
const deliverReply = async (target, payload) => {
|
|
231
|
+
await deliverFormattedTextWithAttachments({
|
|
232
|
+
payload: {
|
|
233
|
+
...payload,
|
|
234
|
+
text: sanitizeIrcAssistantText(payload.text ?? "")
|
|
235
|
+
},
|
|
236
|
+
send: async ({ text }) => {
|
|
237
|
+
const replyClient = client;
|
|
238
|
+
if (!replyClient || !replyClient.isReady() || stopped || abortSignal.aborted) throw new Error("IRC transport disconnected before reply send.");
|
|
239
|
+
if (!message.isGroup && context.connectionEpoch !== activeConnectionEpoch) throw new Error("IRC connection changed before private reply send.");
|
|
240
|
+
await replyClient.sendPrivmsg(target, text);
|
|
241
|
+
opts.statusSink?.({ lastOutboundAt: Date.now() });
|
|
242
|
+
core.channel.activity.record({
|
|
243
|
+
channel: "irc",
|
|
244
|
+
accountId: account.accountId,
|
|
245
|
+
direction: "outbound"
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
const pairing = createChannelPairingController({
|
|
251
|
+
core,
|
|
252
|
+
channel: CHANNEL_ID,
|
|
253
|
+
accountId: account.accountId
|
|
254
|
+
});
|
|
255
|
+
const rawBody = message.text?.trim() ?? "";
|
|
256
|
+
if (!rawBody) return { kind: "completed" };
|
|
257
|
+
if (turnAdoptionLifecycle?.abortSignal.aborted) return {
|
|
258
|
+
kind: "failed-retryable",
|
|
259
|
+
error: turnAdoptionLifecycle.abortSignal.reason
|
|
260
|
+
};
|
|
261
|
+
opts.statusSink?.({ lastInboundAt: message.timestamp });
|
|
262
|
+
const senderDisplay = message.senderHost ? `${message.senderNick}!${message.senderUser ?? "?"}@${message.senderHost}` : message.senderNick;
|
|
263
|
+
const allowNameMatching = isDangerousNameMatchingEnabled(account.config);
|
|
264
|
+
const dmPolicy = account.config.dmPolicy ?? "pairing";
|
|
265
|
+
const defaultGroupPolicy = resolveDefaultGroupPolicy(cfg);
|
|
266
|
+
const { groupPolicy, providerMissingFallbackApplied } = resolveAllowlistProviderRuntimeGroupPolicy({
|
|
267
|
+
providerConfigPresent: cfg.channels?.irc !== void 0,
|
|
268
|
+
groupPolicy: account.config.groupPolicy,
|
|
269
|
+
defaultGroupPolicy
|
|
270
|
+
});
|
|
271
|
+
warnMissingProviderGroupPolicyFallbackOnce({
|
|
272
|
+
providerMissingFallbackApplied,
|
|
273
|
+
providerKey: "irc",
|
|
274
|
+
accountId: account.accountId,
|
|
275
|
+
blockedLabel: GROUP_POLICY_BLOCKED_LABEL.channel,
|
|
276
|
+
log: (messageLocal) => runtime.log?.(messageLocal)
|
|
277
|
+
});
|
|
278
|
+
const groupMatch = resolveIrcGroupMatch({
|
|
279
|
+
groups: account.config.groups,
|
|
280
|
+
target: message.target
|
|
281
|
+
});
|
|
282
|
+
const allowTextCommands = core.channel.commands.shouldHandleTextCommands({
|
|
283
|
+
cfg,
|
|
284
|
+
surface: CHANNEL_ID
|
|
285
|
+
});
|
|
286
|
+
const hasControlCommand = core.channel.text.hasControlCommand(rawBody, cfg);
|
|
287
|
+
const mentionRegexes = core.channel.mentions.buildMentionRegexes(cfg);
|
|
288
|
+
const mentionNick = context.connectedNick.trim() || account.nick;
|
|
289
|
+
const explicitMentionRegex = mentionNick ? new RegExp(`(?<!${IRC_NICK_CHARACTER})${buildIrcNickMentionPattern(mentionNick)}(?!${IRC_NICK_CHARACTER})[:,]?`, "i") : null;
|
|
290
|
+
const wasMentioned = core.channel.mentions.matchesMentionPatterns(rawBody, mentionRegexes) || (explicitMentionRegex ? explicitMentionRegex.test(rawBody) : false);
|
|
291
|
+
const requireMention = message.isGroup ? resolveIrcGroupRequireMention({
|
|
292
|
+
groups: account.config.groups,
|
|
293
|
+
target: message.target
|
|
294
|
+
}) : false;
|
|
295
|
+
const routeGroupAllowFrom = normalizeStringEntries(groupMatch.groupConfig?.allowFrom?.length ? groupMatch.groupConfig.allowFrom : groupMatch.wildcardConfig?.allowFrom);
|
|
296
|
+
const accessGroupPolicy = groupPolicy === "open" && (hasEntries(account.config.groupAllowFrom) || hasEntries(routeGroupAllowFrom)) ? "allowlist" : groupPolicy;
|
|
297
|
+
const channelTarget = message.target.startsWith("#") || message.target.startsWith("&") ? message.target : `#${message.target}`;
|
|
298
|
+
const peerId = message.isGroup ? channelTarget : message.senderNick;
|
|
299
|
+
const route = resolveAgentRoute({
|
|
300
|
+
cfg,
|
|
301
|
+
channel: CHANNEL_ID,
|
|
302
|
+
accountId: account.accountId,
|
|
303
|
+
peer: {
|
|
304
|
+
kind: message.isGroup ? "group" : "direct",
|
|
305
|
+
id: peerId
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
const access = await core.channel.inbound.ingress.createResolver({
|
|
309
|
+
channelId: CHANNEL_ID,
|
|
310
|
+
accountId: account.accountId,
|
|
311
|
+
identity: ircIngressIdentity,
|
|
312
|
+
cfg,
|
|
313
|
+
readStoreAllowFrom: async () => await pairing.readAllowFromStore()
|
|
314
|
+
}).message({
|
|
315
|
+
subject: createIrcIngressSubject(message),
|
|
316
|
+
conversation: {
|
|
317
|
+
kind: message.isGroup ? "group" : "direct",
|
|
318
|
+
id: message.target
|
|
319
|
+
},
|
|
320
|
+
contextBinding: {
|
|
321
|
+
agentId: route.agentId,
|
|
322
|
+
sessionKey: route.sessionKey,
|
|
323
|
+
...message.messageId ? { messageId: message.messageId } : {},
|
|
324
|
+
inboundEventKind: "user_request"
|
|
325
|
+
},
|
|
326
|
+
route: message.isGroup ? channelIngressRoutes(groupPolicy === "allowlist" && {
|
|
327
|
+
id: "irc:channel",
|
|
328
|
+
allowed: groupMatch.hasConfiguredGroups && groupMatch.allowed,
|
|
329
|
+
precedence: 0,
|
|
330
|
+
matchId: "irc-channel",
|
|
331
|
+
blockReason: "channel_not_allowlisted"
|
|
332
|
+
}, (groupMatch.groupConfig?.enabled === false || groupMatch.wildcardConfig?.enabled === false) && {
|
|
333
|
+
id: "irc:channel-enabled",
|
|
334
|
+
enabled: false,
|
|
335
|
+
precedence: 10,
|
|
336
|
+
blockReason: "channel_disabled"
|
|
337
|
+
}, hasEntries(routeGroupAllowFrom) && {
|
|
338
|
+
id: "irc:channel-sender",
|
|
339
|
+
precedence: 20,
|
|
340
|
+
senderPolicy: "replace",
|
|
341
|
+
senderAllowFrom: routeGroupAllowFrom
|
|
342
|
+
}) : [],
|
|
343
|
+
mentionFacts: message.isGroup ? {
|
|
344
|
+
canDetectMention: true,
|
|
345
|
+
wasMentioned,
|
|
346
|
+
hasAnyMention: wasMentioned
|
|
347
|
+
} : void 0,
|
|
348
|
+
dmPolicy,
|
|
349
|
+
groupPolicy: accessGroupPolicy,
|
|
350
|
+
policy: {
|
|
351
|
+
groupAllowFromFallbackToAllowFrom: false,
|
|
352
|
+
mutableIdentifierMatching: allowNameMatching ? "enabled" : "disabled",
|
|
353
|
+
activation: {
|
|
354
|
+
requireMention: message.isGroup && requireMention,
|
|
355
|
+
allowTextCommands
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
allowFrom: account.config.allowFrom,
|
|
359
|
+
groupAllowFrom: account.config.groupAllowFrom,
|
|
360
|
+
command: {
|
|
361
|
+
allowTextCommands,
|
|
362
|
+
hasControlCommand
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
const commandAuthorized = access.commandAccess.authorized;
|
|
366
|
+
if (access.ingress.admission === "pairing-required") {
|
|
367
|
+
await pairing.issueChallenge({
|
|
368
|
+
senderId: normalizeLowercaseStringOrEmpty(senderDisplay),
|
|
369
|
+
senderIdLine: `Your IRC id: ${senderDisplay}`,
|
|
370
|
+
meta: { name: message.senderNick || void 0 },
|
|
371
|
+
sendPairingReply: async (text) => {
|
|
372
|
+
await deliverReply(message.senderNick, { text });
|
|
373
|
+
},
|
|
374
|
+
onReplyError: (err) => {
|
|
375
|
+
runtime.error?.(`irc: pairing reply failed for ${senderDisplay}: ${String(err)}`);
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
runtime.log?.(`irc: drop DM sender ${senderDisplay} (dmPolicy=${dmPolicy})`);
|
|
379
|
+
return { kind: "completed" };
|
|
380
|
+
}
|
|
381
|
+
if (access.ingress.admission === "skip") {
|
|
382
|
+
runtime.log?.(`irc: drop channel ${message.target} (missing-mention)`);
|
|
383
|
+
return { kind: "completed" };
|
|
384
|
+
}
|
|
385
|
+
if (access.ingress.admission !== "dispatch") {
|
|
386
|
+
if (message.isGroup && access.ingress.decisiveGateId === "command" && access.commandAccess.shouldBlockControlCommand) {
|
|
387
|
+
logInboundDrop({
|
|
388
|
+
log: (line) => runtime.log?.(line),
|
|
389
|
+
channel: CHANNEL_ID,
|
|
390
|
+
reason: "control command (unauthorized)",
|
|
391
|
+
target: senderDisplay
|
|
392
|
+
});
|
|
393
|
+
return { kind: "completed" };
|
|
394
|
+
}
|
|
395
|
+
if (message.isGroup) {
|
|
396
|
+
if (access.routeAccess.reason === "channel_not_allowlisted") runtime.log?.(`irc: drop channel ${message.target} (not allowlisted)`);
|
|
397
|
+
else if (access.routeAccess.reason === "channel_disabled") runtime.log?.(`irc: drop channel ${message.target} (disabled)`);
|
|
398
|
+
else runtime.log?.(`irc: drop group sender ${senderDisplay} (policy=${groupPolicy})`);
|
|
399
|
+
} else runtime.log?.(`irc: drop DM sender ${senderDisplay} (dmPolicy=${dmPolicy})`);
|
|
400
|
+
return { kind: "completed" };
|
|
401
|
+
}
|
|
402
|
+
if (turnAdoptionLifecycle?.abortSignal.aborted) return {
|
|
403
|
+
kind: "failed-retryable",
|
|
404
|
+
error: turnAdoptionLifecycle.abortSignal.reason
|
|
405
|
+
};
|
|
406
|
+
const fromLabel = message.isGroup ? message.target : senderDisplay;
|
|
407
|
+
const body = (await createChannelInboundEnvelopeBuilderAsync({
|
|
408
|
+
cfg,
|
|
409
|
+
route
|
|
410
|
+
}))({
|
|
411
|
+
channel: "IRC",
|
|
412
|
+
from: fromLabel,
|
|
413
|
+
timestamp: message.timestamp,
|
|
414
|
+
body: rawBody
|
|
415
|
+
});
|
|
416
|
+
const groupSystemPrompt = normalizeOptionalString(groupMatch.groupConfig?.systemPrompt);
|
|
417
|
+
const blockStreamingEnabled = resolveChannelStreamingBlockEnabled(account.config);
|
|
418
|
+
const ctxPayload = core.channel.inbound.buildContext({
|
|
419
|
+
channelIngress: access,
|
|
420
|
+
channel: CHANNEL_ID,
|
|
421
|
+
accountId: route.accountId,
|
|
422
|
+
messageId: message.messageId,
|
|
423
|
+
timestamp: message.timestamp,
|
|
424
|
+
from: message.isGroup ? `channel:${channelTarget}` : `irc:${senderDisplay}`,
|
|
425
|
+
sender: {
|
|
426
|
+
id: senderDisplay,
|
|
427
|
+
name: message.senderNick || void 0
|
|
428
|
+
},
|
|
429
|
+
conversation: {
|
|
430
|
+
kind: message.isGroup ? "group" : "direct",
|
|
431
|
+
id: peerId,
|
|
432
|
+
label: fromLabel
|
|
433
|
+
},
|
|
434
|
+
route: {
|
|
435
|
+
agentId: route.agentId,
|
|
436
|
+
dmScope: route.dmScope,
|
|
437
|
+
accountId: route.accountId,
|
|
438
|
+
routeSessionKey: route.sessionKey
|
|
439
|
+
},
|
|
440
|
+
reply: {
|
|
441
|
+
to: message.isGroup ? `channel:${channelTarget}` : `irc:${peerId}`,
|
|
442
|
+
originatingTo: message.isGroup ? `channel:${channelTarget}` : `irc:${peerId}`
|
|
443
|
+
},
|
|
444
|
+
message: {
|
|
445
|
+
body,
|
|
446
|
+
bodyForAgent: rawBody,
|
|
447
|
+
rawBody,
|
|
448
|
+
commandBody: rawBody
|
|
449
|
+
},
|
|
450
|
+
access: {
|
|
451
|
+
commands: { authorized: commandAuthorized },
|
|
452
|
+
mentions: {
|
|
453
|
+
canDetectMention: message.isGroup,
|
|
454
|
+
wasMentioned
|
|
455
|
+
}
|
|
456
|
+
},
|
|
457
|
+
extra: {
|
|
458
|
+
GroupSubject: message.isGroup ? message.target : void 0,
|
|
459
|
+
GroupSystemPrompt: message.isGroup ? groupSystemPrompt : void 0
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
await core.channel.inbound.dispatch({
|
|
463
|
+
cfg,
|
|
464
|
+
channel: CHANNEL_ID,
|
|
465
|
+
accountId: account.accountId,
|
|
466
|
+
route: {
|
|
467
|
+
agentId: route.agentId,
|
|
468
|
+
sessionKey: route.sessionKey
|
|
469
|
+
},
|
|
470
|
+
ctxPayload,
|
|
471
|
+
delivery: {
|
|
472
|
+
deliver: async (payload) => {
|
|
473
|
+
await deliverReply(peerId, payload);
|
|
474
|
+
},
|
|
475
|
+
onError: (err, info) => {
|
|
476
|
+
runtime.error?.(`irc ${info.kind} reply failed: ${String(err)}`);
|
|
477
|
+
}
|
|
478
|
+
},
|
|
479
|
+
replyPipeline: {},
|
|
480
|
+
replyOptions: {
|
|
481
|
+
...bindIngressLifecycleToReplyOptions(turnAdoptionLifecycle),
|
|
482
|
+
skillFilter: groupMatch.groupConfig?.skills,
|
|
483
|
+
disableBlockStreaming: typeof blockStreamingEnabled === "boolean" ? !blockStreamingEnabled : void 0
|
|
484
|
+
},
|
|
485
|
+
record: { onRecordError: (err) => {
|
|
486
|
+
runtime.error?.(`irc: failed updating session meta: ${String(err)}`);
|
|
487
|
+
} }
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
function scheduleReconnect() {
|
|
492
|
+
if (stopped || abortSignal.aborted || reconnectTimer) return;
|
|
493
|
+
opts.statusSink?.({
|
|
494
|
+
connected: false,
|
|
495
|
+
lifecycle: "recovering"
|
|
496
|
+
});
|
|
497
|
+
const delayMs = reconnectBackoff.nextDelayMs();
|
|
498
|
+
reconnectTimer = setTimeout(() => {
|
|
499
|
+
reconnectTimer = null;
|
|
500
|
+
connect().catch((error) => {
|
|
501
|
+
if (stopped || abortSignal.aborted) return;
|
|
502
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
503
|
+
logger.error(`[${account.accountId}] IRC reconnect failed: ${message}`);
|
|
504
|
+
opts.statusSink?.({ lastError: message });
|
|
505
|
+
scheduleReconnect();
|
|
506
|
+
});
|
|
507
|
+
}, delayMs);
|
|
508
|
+
return delayMs;
|
|
509
|
+
}
|
|
510
|
+
async function connect() {
|
|
511
|
+
if (stopped || abortSignal.aborted) return;
|
|
512
|
+
const ingressConnection = ingress.openConnection();
|
|
513
|
+
const nextClient = await connectIrcClient(buildIrcConnectOptions(account, {
|
|
514
|
+
channels: account.config.channels,
|
|
515
|
+
abortSignal,
|
|
516
|
+
onNotice: (text, target) => {
|
|
517
|
+
if (core.logging.shouldLogVerbose()) logger.debug?.(`[${account.accountId}] notice ${target ?? ""} len=${text.length}`);
|
|
518
|
+
},
|
|
519
|
+
onError: (error) => {
|
|
520
|
+
logger.error(`[${account.accountId}] IRC error: ${error.message}`);
|
|
521
|
+
},
|
|
522
|
+
onDisconnect: () => {
|
|
523
|
+
if (stopped || abortSignal.aborted) return;
|
|
524
|
+
ingressPause = ingress.pause();
|
|
525
|
+
if (activeConnectionEpoch === ingressConnection.connectionEpoch) activeConnectionEpoch = null;
|
|
526
|
+
client = null;
|
|
527
|
+
opts.statusSink?.({ lastDisconnect: { at: Date.now() } });
|
|
528
|
+
const delayMs = scheduleReconnect();
|
|
529
|
+
if (delayMs !== void 0) logger.warn?.(`[${account.accountId}] IRC connection closed; reconnecting in ${delayMs}ms`);
|
|
530
|
+
},
|
|
531
|
+
onPrivmsg: async (event) => {
|
|
532
|
+
await ingressConnection.accept(event.rawLine, event.connectedNick);
|
|
533
|
+
if (normalizeLowercaseStringOrEmpty(event.senderNick) === normalizeLowercaseStringOrEmpty(event.connectedNick)) return;
|
|
534
|
+
core.channel.activity.record({
|
|
535
|
+
channel: "irc",
|
|
536
|
+
accountId: account.accountId,
|
|
537
|
+
direction: "inbound",
|
|
538
|
+
at: Date.now()
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
}));
|
|
542
|
+
if (stopped || abortSignal.aborted) {
|
|
543
|
+
nextClient.quit("shutdown");
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
client = nextClient;
|
|
547
|
+
activeConnectionEpoch = ingressConnection.connectionEpoch;
|
|
548
|
+
await ingressPause;
|
|
549
|
+
if (client !== nextClient || !nextClient.isReady()) {
|
|
550
|
+
if (activeConnectionEpoch === ingressConnection.connectionEpoch) activeConnectionEpoch = null;
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
ingress.start();
|
|
554
|
+
reconnectBackoff.markConnected();
|
|
555
|
+
opts.statusSink?.(channelReadyPatch());
|
|
556
|
+
logger.info(`[${account.accountId}] connected to ${account.host}:${account.port}${account.tls ? " (tls)" : ""} as ${nextClient.nick}`);
|
|
557
|
+
}
|
|
558
|
+
try {
|
|
559
|
+
await connect();
|
|
560
|
+
} catch (error) {
|
|
561
|
+
await ingress.stop();
|
|
562
|
+
throw error;
|
|
563
|
+
}
|
|
564
|
+
let stopTask;
|
|
565
|
+
return { stop: () => {
|
|
566
|
+
stopTask ??= (async () => {
|
|
567
|
+
stopped = true;
|
|
568
|
+
if (!abortSignal.aborted) monitorAbort.abort();
|
|
569
|
+
if (reconnectTimer) {
|
|
570
|
+
clearTimeout(reconnectTimer);
|
|
571
|
+
reconnectTimer = null;
|
|
572
|
+
}
|
|
573
|
+
client?.quit("shutdown");
|
|
574
|
+
client = null;
|
|
575
|
+
activeConnectionEpoch = null;
|
|
576
|
+
await ingress.stop();
|
|
577
|
+
})();
|
|
578
|
+
return stopTask;
|
|
579
|
+
} };
|
|
580
|
+
}
|
|
581
|
+
//#endregion
|
|
582
|
+
export { monitorIrcProvider, sendMessageIrc };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createChannelConfigUiHints } from "openclaw/plugin-sdk/channel-core";
|
|
2
2
|
import { ChannelGroupEntrySchema, DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, ReplyRuntimeConfigSchemaShape, ReplyToModeSchema, buildChannelConfigSchema, buildMultiAccountChannelSchema, requireOpenAllowFrom } from "openclaw/plugin-sdk/channel-config-schema";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
//#region extensions/irc/src/config-
|
|
4
|
+
//#region extensions/irc/src/config-schema.ts
|
|
5
5
|
const ircChannelConfigUiHints = {
|
|
6
6
|
"": {
|
|
7
7
|
label: "IRC",
|
|
@@ -40,8 +40,6 @@ const ircChannelConfigUiHints = {
|
|
|
40
40
|
configWrites: true
|
|
41
41
|
})
|
|
42
42
|
};
|
|
43
|
-
//#endregion
|
|
44
|
-
//#region extensions/irc/src/config-schema.ts
|
|
45
43
|
const IrcNickServSchema = z.object({
|
|
46
44
|
enabled: z.boolean().optional(),
|
|
47
45
|
service: z.string().optional(),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"entries":[{"output":"api.js","source":"extensions/irc/api.ts"},{"output":"channel-config-api.js","source":"extensions/irc/channel-config-api.ts"},{"output":"channel-plugin-api.js","source":"extensions/irc/channel-plugin-api.ts"},{"output":"doctor-contract-api.js","source":"extensions/irc/doctor-contract-api.ts"},{"output":"index.js","source":"extensions/irc/index.ts"},{"output":"runtime-api.js","source":"extensions/irc/runtime-api.ts"},{"output":"secret-contract-api.js","source":"extensions/irc/secret-contract-api.ts"},{"output":"setup-entry.js","source":"extensions/irc/setup-entry.ts"}],"chunks":[{"output":".setup/channel-DgvKz42q.mjs","sha256":"25591c4dd4dd69f60fa4ec7fb6dfb02cf282ba5be0799468d473d702a3b8f3cd","facadeSource":null,"sources":["extensions/irc/src/accounts.ts","extensions/irc/src/channel.ts","extensions/irc/src/client.ts","extensions/irc/src/connect-options.ts","extensions/irc/src/control-chars.ts","extensions/irc/src/ingress-identity.ts","extensions/irc/src/normalize.ts","extensions/irc/src/outbound-base.ts","extensions/irc/src/policy.ts","extensions/irc/src/probe.ts","extensions/irc/src/protocol.ts","extensions/irc/src/send.ts","extensions/irc/src/setup-core.ts","extensions/irc/src/setup-surface.ts","packages/normalization-core/src/grapheme.ts","packages/normalization-core/src/utf16-slice.ts"]},{"output":".setup/channel-plugin-api-WXJUjGsf.mjs","sha256":"ca1568fb3e79aaa3202eb330be13621927d7bd736cc66a5411dcdbc2d5685f86","facadeSource":"extensions/irc/channel-plugin-api.ts","sources":[]},{"output":".setup/channel-runtime-D4vKt7TE.mjs","sha256":"5b95ec28cfc745c4e41e4b77e218ab7d7fc0faac6f5f8c363e1ca8469eccc789","facadeSource":"extensions/irc/src/channel-runtime.ts","sources":["extensions/irc/src/irc-ingress.ts","extensions/irc/src/monitor.ts","extensions/irc/src/reconnect-backoff.ts"]},{"output":".setup/config-schema-CHwjI_aV.mjs","sha256":"283bc2145f0751e110cc8e2c2657c6ee4a408fe856cc321f42d5d5773db2cabf","facadeSource":null,"sources":["extensions/irc/src/config-schema.ts"]},{"output":".setup/runtime-C_V9tmpk.mjs","sha256":"3f1f1b4d7ee63152a339b6a4614a28f57972bf655c73e0e7083c837370bc094c","facadeSource":null,"sources":["extensions/irc/src/runtime.ts"]},{"output":".setup/secret-contract-api-4IT9_EK6.mjs","sha256":"8d9275ff824f6c76b94e80dc043be8a12df9c8b3dc7203faa58bd2fc1bf3c244","facadeSource":"extensions/irc/secret-contract-api.ts","sources":[]},{"output":".setup/secret-contract-C5i-29Hz.mjs","sha256":"2eb99571f8fac572bc6d2a7cafe7bf7f2d864101256eb7b5aa6876fd031ee914","facadeSource":null,"sources":["extensions/irc/src/secret-contract.ts"]},{"output":"api.js","sha256":"4b63dc79a62e56af35b35dc398424d255aa86619e69c90baf657f8d3ec4ff666","facadeSource":"extensions/irc/api.ts","sources":[]},{"output":"channel-config-api.js","sha256":"3aa7303e9a7129099c9a8f9d644213f440902cd4748ce379f54484a9b523f544","facadeSource":"extensions/irc/channel-config-api.ts","sources":[]},{"output":"channel-plugin-api.js","sha256":"301f596faba5b2ec8be4314e9cf464f8f32c4eb9cf7639c1994cf77c9758aff5","facadeSource":"extensions/irc/channel-plugin-api.ts","sources":[]},{"output":"doctor-contract-api.js","sha256":"de1a30eb327e6de2799b8b84a8b4bd0f607d90051a2ab67f6a08ed3d29a54505","facadeSource":"extensions/irc/doctor-contract-api.ts","sources":["extensions/irc/config-doctor-api.ts","packages/normalization-core/src/record-coerce.ts","src/config/channel-config-normalization.ts","src/plugin-sdk/legacy-webhook-listener-migration.ts"]},{"output":"index.js","sha256":"26465ab4a608138b3cec93e4593f91f076be42b0fea9edad110953d71ec2e78c","facadeSource":"extensions/irc/index.ts","sources":["extensions/irc/index.ts"]},{"output":"runtime-api.js","sha256":"52b1074caae3be2b4f35e6ab34f26576c94d3a970587212b24eb8d9ac501720c","facadeSource":"extensions/irc/runtime-api.ts","sources":[]},{"output":"secret-contract-api.js","sha256":"ba5440395ed290e6115b9fa94429ffd9302dad0a9077f89307928fdc106fa4f0","facadeSource":"extensions/irc/secret-contract-api.ts","sources":[]},{"output":"setup-entry.js","sha256":"06a83942b5b52847b2f5dd9b0a5a9edcbc52a39457309b49c31e02986c7f63d2","facadeSource":"extensions/irc/setup-entry.ts","sources":["extensions/irc/setup-entry.ts"]}],"unrenderedSources":["extensions/irc/api.ts","extensions/irc/channel-config-api.ts","extensions/irc/channel-plugin-api.ts","extensions/irc/doctor-contract-api.ts","extensions/irc/runtime-api.ts","extensions/irc/secret-contract-api.ts","extensions/irc/src/channel-runtime.ts","src/plugin-sdk/text-grapheme.ts"]}
|
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-
|
|
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-DgvKz42q.mjs";
|
|
2
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 @@
|
|
|
1
|
-
|
|
2
|
-
export { IrcChannelConfigSchema };
|
|
1
|
+
export { t as IrcChannelConfigSchema } from "./.setup/config-schema-CHwjI_aV.mjs";
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { ircPlugin };
|
|
1
|
+
export { t as ircPlugin } from "./.setup/channel-DgvKz42q.mjs";
|
package/dist/runtime-api.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { setIrcRuntime };
|
|
1
|
+
export { r as setIrcRuntime } from "./.setup/runtime-C_V9tmpk.mjs";
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
|
|
1
|
+
export { t as channelSecrets, n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./.setup/secret-contract-C5i-29Hz.mjs";
|
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-WXJUjGsf.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-4IT9_EK6.mjs", import.meta.url).href),
|
|
12
12
|
exportName: "channelSecrets"
|
|
13
13
|
}
|
|
14
14
|
});
|