mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-03 13:14:06 +00:00
* refactor: share talk event metric extraction * refactor: reuse shared coercion helpers * refactor: reuse shared primitive guards * refactor: reuse shared record guard * refactor: reuse shared primitive helpers * refactor: reuse shared string guards * refactor: reuse shared non-empty string guard * refactor: share plugin primitive coercion helpers * refactor: reuse plugin coercion helpers * refactor: reuse plugin coercion helpers in more plugins * refactor: reuse channel coercion helpers * refactor: reuse monitor coercion helpers * refactor: reuse provider coercion helpers * refactor: reuse core coercion helpers * refactor: reuse runtime coercion helpers * refactor: reuse helper coercion in codex paths * refactor: reuse helper coercion in runtime paths * refactor: reuse codex app-server coercion helpers * refactor: reuse codex record helpers * refactor: reuse migration and qa record helpers * refactor: reuse feishu and core helper guards * refactor: reuse browser and policy coercion helpers * refactor: reuse memory wiki record helper * refactor: share boolean coercion helpers * refactor: reuse finite number coercion * refactor: reuse trimmed string list helpers * refactor: reuse string list normalization * refactor: reuse remaining string list helpers * refactor: reuse string entry normalizer * refactor: share sorted string helpers * refactor: share string list normalization * test: preserve command registry browser imports * refactor: reuse trimmed list helpers * refactor: reuse string dedupe helpers * refactor: reuse local dedupe helpers * refactor: reuse more string dedupe helpers * refactor: reuse command string dedupe helpers * refactor: dedupe memory path lists with helper * refactor: expose string dedupe helpers to plugins * refactor: reuse core string dedupe helpers * refactor: reuse shared unique value helpers * refactor: reuse unique helpers in agent utilities * refactor: reuse unique helpers in config plumbing * refactor: reuse unique helpers in extensions * refactor: reuse unique helpers in core utilities * refactor: reuse unique helpers in qa plugins * refactor: reuse unique helpers in memory plugins * refactor: reuse unique helpers in channel plugins * refactor: reuse unique helpers in core tails * refactor: reuse unique helper in comfy workflow * refactor: reuse unique helpers in test utilities * refactor: expose unique value helper to plugins * refactor: reuse unique helpers for numeric lists * refactor: replace index dedupe filters * refactor: reuse string entry normalization * refactor: reuse string normalization in plugin helpers * refactor: reuse string normalization in extension helpers * refactor: reuse string normalization in channel parsers * refactor: reuse string normalization in memory search * refactor: reuse string normalization in provider parsers * refactor: reuse string normalization in qa helpers * refactor: reuse string normalization in infra parsers * refactor: reuse string normalization in messaging parsers * refactor: reuse string normalization in core parsers * refactor: reuse string normalization in extension parsers * refactor: reuse string normalization in remaining parsers * refactor: reuse string normalization in final parser spots * refactor: reuse string normalization in qa media helpers * refactor: reuse normalization in provider and media lists * refactor: reuse normalization for remaining set filters * refactor: reuse normalization in policy allowlists * refactor: reuse normalization in session and owner lists * refactor: centralize primitive string lists * refactor: reuse lowercase entry helpers * refactor: reuse sorted string helpers * refactor: reuse unique trimmed helpers * refactor: reuse string normalization helpers * refactor: reuse catalog string helpers * refactor: reuse remaining string helpers * refactor: simplify remaining list normalization * refactor: reuse codex auth order normalization * chore: refresh plugin sdk api baseline * fix: make shared string sorting deterministic * chore: refresh plugin sdk api baseline * fix: align host env security ordering
140 lines
4.1 KiB
TypeScript
140 lines
4.1 KiB
TypeScript
import type { ChannelSetupAdapter, ChannelSetupInput } from "openclaw/plugin-sdk/channel-setup";
|
|
import type { DmPolicy } from "openclaw/plugin-sdk/config-contracts";
|
|
import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
|
|
import {
|
|
applyAccountNameToChannelSection,
|
|
createSetupInputPresenceValidator,
|
|
createTopLevelChannelAllowFromSetter,
|
|
createTopLevelChannelDmPolicySetter,
|
|
patchScopedAccountConfig,
|
|
} from "openclaw/plugin-sdk/setup";
|
|
import type { CoreConfig, IrcAccountConfig, IrcNickServConfig } from "./types.js";
|
|
|
|
const channel = "irc" as const;
|
|
const setIrcTopLevelDmPolicy = createTopLevelChannelDmPolicySetter({
|
|
channel,
|
|
});
|
|
const setIrcTopLevelAllowFrom = createTopLevelChannelAllowFromSetter({
|
|
channel,
|
|
});
|
|
|
|
type IrcSetupInput = ChannelSetupInput & {
|
|
host?: string;
|
|
port?: number | string;
|
|
tls?: boolean;
|
|
nick?: string;
|
|
username?: string;
|
|
realname?: string;
|
|
channels?: string[];
|
|
password?: string;
|
|
};
|
|
|
|
export function parsePort(raw: string, fallback: number): number {
|
|
const trimmed = raw.trim();
|
|
if (!trimmed) {
|
|
return fallback;
|
|
}
|
|
const parsed = Number.parseInt(trimmed, 10);
|
|
if (!Number.isFinite(parsed) || parsed < 1 || parsed > 65535) {
|
|
return fallback;
|
|
}
|
|
return parsed;
|
|
}
|
|
|
|
export function updateIrcAccountConfig(
|
|
cfg: CoreConfig,
|
|
accountId: string,
|
|
patch: Partial<IrcAccountConfig>,
|
|
): CoreConfig {
|
|
return patchScopedAccountConfig({
|
|
cfg,
|
|
channelKey: channel,
|
|
accountId,
|
|
patch,
|
|
ensureChannelEnabled: false,
|
|
ensureAccountEnabled: false,
|
|
}) as CoreConfig;
|
|
}
|
|
|
|
export function setIrcDmPolicy(cfg: CoreConfig, dmPolicy: DmPolicy): CoreConfig {
|
|
return setIrcTopLevelDmPolicy(cfg, dmPolicy) as CoreConfig;
|
|
}
|
|
|
|
export function setIrcAllowFrom(cfg: CoreConfig, allowFrom: string[]): CoreConfig {
|
|
return setIrcTopLevelAllowFrom(cfg, allowFrom) as CoreConfig;
|
|
}
|
|
|
|
export function setIrcNickServ(
|
|
cfg: CoreConfig,
|
|
accountId: string,
|
|
nickserv?: IrcNickServConfig,
|
|
): CoreConfig {
|
|
return updateIrcAccountConfig(cfg, accountId, { nickserv });
|
|
}
|
|
|
|
export function setIrcGroupAccess(
|
|
cfg: CoreConfig,
|
|
accountId: string,
|
|
policy: "open" | "allowlist" | "disabled",
|
|
entries: string[],
|
|
normalizeGroupEntry: (raw: string) => string | null,
|
|
): CoreConfig {
|
|
if (policy !== "allowlist") {
|
|
return updateIrcAccountConfig(cfg, accountId, { enabled: true, groupPolicy: policy });
|
|
}
|
|
const normalizedEntries = [
|
|
...new Set(entries.flatMap((entry) => normalizeGroupEntry(entry) ?? [])),
|
|
];
|
|
const groups = Object.fromEntries(normalizedEntries.map((entry) => [entry, {}]));
|
|
return updateIrcAccountConfig(cfg, accountId, {
|
|
enabled: true,
|
|
groupPolicy: "allowlist",
|
|
groups,
|
|
});
|
|
}
|
|
|
|
export const ircSetupAdapter: ChannelSetupAdapter = {
|
|
resolveAccountId: ({ accountId }) => normalizeAccountId(accountId),
|
|
applyAccountName: ({ cfg, accountId, name }) =>
|
|
applyAccountNameToChannelSection({
|
|
cfg,
|
|
channelKey: channel,
|
|
accountId,
|
|
name,
|
|
}),
|
|
validateInput: createSetupInputPresenceValidator({
|
|
whenNotUseEnv: [
|
|
{ someOf: ["host"], message: "IRC requires host." },
|
|
{ someOf: ["nick"], message: "IRC requires nick." },
|
|
],
|
|
}),
|
|
applyAccountConfig: ({ cfg, accountId, input }) => {
|
|
const setupInput = input as IrcSetupInput;
|
|
const namedConfig = applyAccountNameToChannelSection({
|
|
cfg,
|
|
channelKey: channel,
|
|
accountId,
|
|
name: setupInput.name,
|
|
});
|
|
const portInput =
|
|
typeof setupInput.port === "number" ? String(setupInput.port) : (setupInput.port ?? "");
|
|
const patch: Partial<IrcAccountConfig> = {
|
|
enabled: true,
|
|
host: setupInput.host?.trim(),
|
|
port: portInput ? parsePort(portInput, setupInput.tls === false ? 6667 : 6697) : undefined,
|
|
tls: setupInput.tls,
|
|
nick: setupInput.nick?.trim(),
|
|
username: setupInput.username?.trim(),
|
|
realname: setupInput.realname?.trim(),
|
|
password: setupInput.password?.trim(),
|
|
channels: setupInput.channels,
|
|
};
|
|
return patchScopedAccountConfig({
|
|
cfg: namedConfig,
|
|
channelKey: channel,
|
|
accountId,
|
|
patch,
|
|
}) as CoreConfig;
|
|
},
|
|
};
|