import { imessageOutbound } from "../channels/plugins/outbound/imessage.js"; import type { ChannelCapabilities, ChannelId, ChannelOutboundAdapter, ChannelPlugin, } from "../channels/plugins/types.js"; import type { PluginRegistry } from "../plugins/registry.js"; import { normalizeIMessageHandle } from "../imessage/targets.js"; export const createTestRegistry = (channels: PluginRegistry["channels"] = []): PluginRegistry => ({ plugins: [], tools: [], hooks: [], typedHooks: [], channels, providers: [], gatewayHandlers: {}, httpHandlers: [], cliRegistrars: [], services: [], commands: [], diagnostics: [], }); export const createIMessageTestPlugin = (params?: { outbound?: ChannelOutboundAdapter; }): ChannelPlugin => ({ id: "imessage", meta: { id: "imessage", label: "iMessage", selectionLabel: "iMessage (imsg)", docsPath: "/channels/imessage", blurb: "iMessage test stub.", aliases: ["imsg"], }, capabilities: { chatTypes: ["direct", "group"], media: true }, config: { listAccountIds: () => [], resolveAccount: () => ({}), }, status: { collectStatusIssues: (accounts) => accounts.flatMap((account) => { const lastError = typeof account.lastError === "string" ? account.lastError.trim() : ""; if (!lastError) return []; return [ { channel: "imessage", accountId: account.accountId, kind: "runtime", message: `Channel error: ${lastError}`, }, ]; }), }, outbound: params?.outbound ?? imessageOutbound, messaging: { targetResolver: { looksLikeId: (raw) => { const trimmed = raw.trim(); if (!trimmed) return false; if (/^(imessage:|sms:|auto:|chat_id:|chat_guid:|chat_identifier:)/i.test(trimmed)) { return true; } if (trimmed.includes("@")) return true; return /^\+?\d{3,}$/.test(trimmed); }, hint: "", }, normalizeTarget: (raw) => normalizeIMessageHandle(raw), }, }); export const createOutboundTestPlugin = (params: { id: ChannelId; outbound: ChannelOutboundAdapter; label?: string; docsPath?: string; capabilities?: ChannelCapabilities; }): ChannelPlugin => ({ id: params.id, meta: { id: params.id, label: params.label ?? String(params.id), selectionLabel: params.label ?? String(params.id), docsPath: params.docsPath ?? `/channels/${params.id}`, blurb: "test stub.", }, capabilities: params.capabilities ?? { chatTypes: ["direct"] }, config: { listAccountIds: () => [], resolveAccount: () => ({}), }, outbound: params.outbound, });