UNPKG

@gguf/claw

Version:

Multi-channel AI gateway with extensible messaging integrations

89 lines (78 loc) 2.34 kB
import { resolveIrcAccount } from "./accounts.js"; import type { IrcClient } from "./client.js"; import { connectIrcClient } from "./client.js"; import { buildIrcConnectOptions } from "./connect-options.js"; import { normalizeIrcMessagingTarget } from "./normalize.js"; import { makeIrcMessageId } from "./protocol.js"; import { getIrcRuntime } from "./runtime.js"; import type { CoreConfig } from "./types.js"; type SendIrcOptions = { accountId?: string; replyTo?: string; target?: string; client?: IrcClient; }; export type SendIrcResult = { messageId: string; target: string; }; function resolveTarget(to: string, opts?: SendIrcOptions): string { const fromArg = normalizeIrcMessagingTarget(to); if (fromArg) { return fromArg; } const fromOpt = normalizeIrcMessagingTarget(opts?.target ?? ""); if (fromOpt) { return fromOpt; } throw new Error(`Invalid IRC target: ${to}`); } export async function sendMessageIrc( to: string, text: string, opts: SendIrcOptions = {}, ): Promise<SendIrcResult> { const runtime = getIrcRuntime(); const cfg = runtime.config.loadConfig() as CoreConfig; const account = resolveIrcAccount({ cfg, accountId: opts.accountId, }); if (!account.configured) { throw new Error( `IRC is not configured for account "${account.accountId}" (need host and nick in channels.irc).`, ); } const target = resolveTarget(to, opts); const tableMode = runtime.channel.text.resolveMarkdownTableMode({ cfg, channel: "irc", accountId: account.accountId, }); const prepared = runtime.channel.text.convertMarkdownTables(text.trim(), tableMode); const payload = opts.replyTo ? `${prepared}\n\n[reply:${opts.replyTo}]` : prepared; if (!payload.trim()) { throw new Error("Message must be non-empty for IRC sends"); } const client = opts.client; if (client?.isReady()) { client.sendPrivmsg(target, payload); } else { const transient = await connectIrcClient( buildIrcConnectOptions(account, { connectTimeoutMs: 12000, }), ); transient.sendPrivmsg(target, payload); transient.quit("sent"); } runtime.channel.activity.record({ channel: "irc", accountId: account.accountId, direction: "outbound", }); return { messageId: makeIrcMessageId(), target, }; }