diff --git a/extensions/signal/src/channel.setup.ts b/extensions/signal/src/channel.setup.ts index b81d10cc99d..f3f8ea9bef2 100644 --- a/extensions/signal/src/channel.setup.ts +++ b/extensions/signal/src/channel.setup.ts @@ -2,70 +2,16 @@ import { buildAccountScopedDmSecurityPolicy, collectAllowlistProviderRestrictSendersWarnings, } from "openclaw/plugin-sdk/channel-config-helpers"; -import { - buildChannelConfigSchema, - DEFAULT_ACCOUNT_ID, - deleteAccountFromConfigSection, - getChatChannelMeta, - normalizeE164, - setAccountEnabledInConfigSection, - SignalConfigSchema, - type ChannelPlugin, -} from "openclaw/plugin-sdk/signal"; -import { - listSignalAccountIds, - resolveDefaultSignalAccountId, - resolveSignalAccount, - type ResolvedSignalAccount, -} from "./accounts.js"; -import { signalConfigAccessors, signalSetupWizard } from "./plugin-shared.js"; +import { DEFAULT_ACCOUNT_ID, normalizeE164, type ChannelPlugin } from "openclaw/plugin-sdk/signal"; +import { resolveSignalAccount, type ResolvedSignalAccount } from "./accounts.js"; import { signalSetupAdapter } from "./setup-core.js"; +import { createSignalPluginBase, signalSetupWizard } from "./shared.js"; export const signalSetupPlugin: ChannelPlugin = { - id: "signal", - meta: { - ...getChatChannelMeta("signal"), - }, - setupWizard: signalSetupWizard, - capabilities: { - chatTypes: ["direct", "group"], - media: true, - reactions: true, - }, - streaming: { - blockStreamingCoalesceDefaults: { minChars: 1500, idleMs: 1000 }, - }, - reload: { configPrefixes: ["channels.signal"] }, - configSchema: buildChannelConfigSchema(SignalConfigSchema), - config: { - listAccountIds: (cfg) => listSignalAccountIds(cfg), - resolveAccount: (cfg, accountId) => resolveSignalAccount({ cfg, accountId }), - defaultAccountId: (cfg) => resolveDefaultSignalAccountId(cfg), - setAccountEnabled: ({ cfg, accountId, enabled }) => - setAccountEnabledInConfigSection({ - cfg, - sectionKey: "signal", - accountId, - enabled, - allowTopLevel: true, - }), - deleteAccount: ({ cfg, accountId }) => - deleteAccountFromConfigSection({ - cfg, - sectionKey: "signal", - accountId, - clearBaseFields: ["account", "httpUrl", "httpHost", "httpPort", "cliPath", "name"], - }), - isConfigured: (account) => account.configured, - describeAccount: (account) => ({ - accountId: account.accountId, - name: account.name, - enabled: account.enabled, - configured: account.configured, - baseUrl: account.baseUrl, - }), - ...signalConfigAccessors, - }, + ...createSignalPluginBase({ + setupWizard: signalSetupWizard, + setup: signalSetupAdapter, + }), security: { resolveDmPolicy: ({ cfg, accountId, account }) => buildAccountScopedDmSecurityPolicy({ @@ -90,5 +36,4 @@ export const signalSetupPlugin: ChannelPlugin = { mentionGated: false, }), }, - setup: signalSetupAdapter, }; diff --git a/extensions/signal/src/channel.ts b/extensions/signal/src/channel.ts index aba60d3e29a..bd0085e9dfd 100644 --- a/extensions/signal/src/channel.ts +++ b/extensions/signal/src/channel.ts @@ -10,28 +10,18 @@ import { resolveTextChunkLimit } from "openclaw/plugin-sdk/reply-runtime"; import { buildBaseAccountStatusSnapshot, buildBaseChannelStatusSummary, - buildChannelConfigSchema, collectStatusIssuesFromLastError, createDefaultChannelRuntimeState, DEFAULT_ACCOUNT_ID, - deleteAccountFromConfigSection, - getChatChannelMeta, looksLikeSignalTargetId, normalizeE164, normalizeSignalMessagingTarget, PAIRING_APPROVED_MESSAGE, resolveChannelMediaMaxBytes, - setAccountEnabledInConfigSection, - SignalConfigSchema, type ChannelMessageActionAdapter, type ChannelPlugin, } from "openclaw/plugin-sdk/signal"; -import { - listSignalAccountIds, - resolveDefaultSignalAccountId, - resolveSignalAccount, - type ResolvedSignalAccount, -} from "./accounts.js"; +import { resolveSignalAccount, type ResolvedSignalAccount } from "./accounts.js"; import { markdownToSignalTextChunks } from "./format.js"; import { looksLikeUuid, @@ -39,10 +29,10 @@ import { resolveSignalRecipient, resolveSignalSender, } from "./identity.js"; -import { signalConfigAccessors, signalSetupWizard } from "./plugin-shared.js"; import type { SignalProbe } from "./probe.js"; import { getSignalRuntime } from "./runtime.js"; import { signalSetupAdapter } from "./setup-core.js"; +import { createSignalPluginBase, signalConfigAccessors, signalSetupWizard } from "./shared.js"; const signalMessageActions: ChannelMessageActionAdapter = { listActions: (ctx) => getSignalRuntime().channel.signal.messageActions?.listActions?.(ctx) ?? [], @@ -292,11 +282,10 @@ async function sendFormattedSignalMedia(ctx: { } export const signalPlugin: ChannelPlugin = { - id: "signal", - meta: { - ...getChatChannelMeta("signal"), - }, - setupWizard: signalSetupWizard, + ...createSignalPluginBase({ + setupWizard: signalSetupWizard, + setup: signalSetupAdapter, + }), pairing: { idLabel: "signalNumber", normalizeAllowEntry: (entry) => entry.replace(/^signal:/i, ""), @@ -304,46 +293,7 @@ export const signalPlugin: ChannelPlugin = { await getSignalRuntime().channel.signal.sendMessageSignal(id, PAIRING_APPROVED_MESSAGE); }, }, - capabilities: { - chatTypes: ["direct", "group"], - media: true, - reactions: true, - }, actions: signalMessageActions, - streaming: { - blockStreamingCoalesceDefaults: { minChars: 1500, idleMs: 1000 }, - }, - reload: { configPrefixes: ["channels.signal"] }, - configSchema: buildChannelConfigSchema(SignalConfigSchema), - config: { - listAccountIds: (cfg) => listSignalAccountIds(cfg), - resolveAccount: (cfg, accountId) => resolveSignalAccount({ cfg, accountId }), - defaultAccountId: (cfg) => resolveDefaultSignalAccountId(cfg), - setAccountEnabled: ({ cfg, accountId, enabled }) => - setAccountEnabledInConfigSection({ - cfg, - sectionKey: "signal", - accountId, - enabled, - allowTopLevel: true, - }), - deleteAccount: ({ cfg, accountId }) => - deleteAccountFromConfigSection({ - cfg, - sectionKey: "signal", - accountId, - clearBaseFields: ["account", "httpUrl", "httpHost", "httpPort", "cliPath", "name"], - }), - isConfigured: (account) => account.configured, - describeAccount: (account) => ({ - accountId: account.accountId, - name: account.name, - enabled: account.enabled, - configured: account.configured, - baseUrl: account.baseUrl, - }), - ...signalConfigAccessors, - }, allowlist: { supportsScope: ({ scope }) => scope === "dm" || scope === "group" || scope === "all", readConfig: ({ cfg, accountId }) => {