From d9a2666ee1097eb7945e224b4f35f477b54d34bf Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 22 Mar 2026 23:23:35 +0000 Subject: [PATCH] refactor: share more computed channel status adapters --- extensions/feishu/src/channel.ts | 30 +++++++++++++-------------- extensions/irc/src/channel.ts | 34 +++++++++++++++++-------------- extensions/msteams/src/channel.ts | 24 ++++++++++------------ extensions/zalo/src/channel.ts | 31 +++++++++++++--------------- 4 files changed, 58 insertions(+), 61 deletions(-) diff --git a/extensions/feishu/src/channel.ts b/extensions/feishu/src/channel.ts index e2707ebc6ff..efe75b65227 100644 --- a/extensions/feishu/src/channel.ts +++ b/extensions/feishu/src/channel.ts @@ -21,12 +21,12 @@ import { } from "openclaw/plugin-sdk/directory-runtime"; import { createLazyRuntimeNamedExport } from "openclaw/plugin-sdk/lazy-runtime"; import { createRuntimeOutboundDelegates } from "openclaw/plugin-sdk/outbound-runtime"; +import { createComputedAccountStatusAdapter } from "openclaw/plugin-sdk/status-helpers"; import type { ChannelMeta, ChannelPlugin, ClawdbotConfig } from "../runtime-api.js"; import { buildChannelConfigSchema, buildProbeChannelStatusSummary, createActionGate, - buildRuntimeAccountStatusSnapshot, createDefaultChannelRuntimeState, DEFAULT_ACCOUNT_ID, PAIRING_APPROVED_MESSAGE, @@ -924,7 +924,7 @@ export const feishuPlugin: ChannelPlugin({ defaultRuntime: createDefaultChannelRuntimeState(DEFAULT_ACCOUNT_ID, { port: null }), buildChannelSummary: ({ snapshot }) => buildProbeChannelStatusSummary(snapshot, { @@ -932,20 +932,18 @@ export const feishuPlugin: ChannelPlugin await (await loadFeishuChannelRuntime()).probeFeishu(account), - buildAccountSnapshot: ({ account, runtime, probe }) => - buildRuntimeAccountStatusSnapshot( - { runtime, probe }, - { - accountId: account.accountId, - enabled: account.enabled, - configured: account.configured, - name: account.name, - appId: account.appId, - domain: account.domain, - port: runtime?.port ?? null, - }, - ), - }, + resolveAccountSnapshot: ({ account, runtime }) => ({ + accountId: account.accountId, + enabled: account.enabled, + configured: account.configured, + name: account.name, + extra: { + appId: account.appId, + domain: account.domain, + port: runtime?.port ?? null, + }, + }), + }), gateway: { startAccount: async (ctx) => { const { monitorFeishuProvider } = await import("./monitor.js"); diff --git a/extensions/irc/src/channel.ts b/extensions/irc/src/channel.ts index 2c340630bb9..deaa32337cc 100644 --- a/extensions/irc/src/channel.ts +++ b/extensions/irc/src/channel.ts @@ -16,7 +16,10 @@ import { listResolvedDirectoryEntriesFromSources, } from "openclaw/plugin-sdk/directory-runtime"; import { runStoppablePassiveMonitor } from "openclaw/plugin-sdk/extension-shared"; -import { createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers"; +import { + createComputedAccountStatusAdapter, + createDefaultChannelRuntimeState, +} from "openclaw/plugin-sdk/status-helpers"; import { listIrcAccountIds, resolveDefaultIrcAccountId, @@ -34,7 +37,6 @@ import { import { resolveIrcGroupMatch, resolveIrcRequireMention } from "./policy.js"; import { probeIrc } from "./probe.js"; import { - buildBaseAccountStatusSnapshot, buildBaseChannelStatusSummary, buildChannelConfigSchema, createAccountStatusSink, @@ -253,7 +255,7 @@ export const ircPlugin: ChannelPlugin = createChat return entries.map((entry) => ({ ...entry, name: entry.id })); }, }), - status: { + status: createComputedAccountStatusAdapter({ defaultRuntime: createDefaultChannelRuntimeState(DEFAULT_ACCOUNT_ID), buildChannelSummary: ({ account, snapshot }) => ({ ...buildBaseChannelStatusSummary(snapshot), @@ -266,18 +268,20 @@ export const ircPlugin: ChannelPlugin = createChat }), probeAccount: async ({ cfg, account, timeoutMs }) => probeIrc(cfg as CoreConfig, { accountId: account.accountId, timeoutMs }), - buildAccountSnapshot: ({ account, runtime, probe }) => - buildBaseAccountStatusSnapshot( - { account, runtime, probe }, - { - host: account.host, - port: account.port, - tls: account.tls, - nick: account.nick, - passwordSource: account.passwordSource, - }, - ), - }, + resolveAccountSnapshot: ({ account }) => ({ + accountId: account.accountId, + name: account.name, + enabled: account.enabled, + configured: account.configured, + extra: { + host: account.host, + port: account.port, + tls: account.tls, + nick: account.nick, + passwordSource: account.passwordSource, + }, + }), + }), gateway: { startAccount: async (ctx) => { const account = ctx.account; diff --git a/extensions/msteams/src/channel.ts b/extensions/msteams/src/channel.ts index 571bf7085e0..1ab8ec811df 100644 --- a/extensions/msteams/src/channel.ts +++ b/extensions/msteams/src/channel.ts @@ -19,10 +19,10 @@ import { } from "openclaw/plugin-sdk/directory-runtime"; import { createLazyRuntimeNamedExport } from "openclaw/plugin-sdk/lazy-runtime"; import { createRuntimeOutboundDelegates } from "openclaw/plugin-sdk/outbound-runtime"; +import { createComputedAccountStatusAdapter } from "openclaw/plugin-sdk/status-helpers"; import type { ChannelMessageActionName, ChannelPlugin, OpenClawConfig } from "../runtime-api.js"; import { buildProbeChannelStatusSummary, - buildRuntimeAccountStatusSnapshot, buildChannelConfigSchema, createDefaultChannelRuntimeState, DEFAULT_ACCOUNT_ID, @@ -409,7 +409,7 @@ export const msteamsPlugin: ChannelPlugin({ defaultRuntime: createDefaultChannelRuntimeState(DEFAULT_ACCOUNT_ID, { port: null }), buildChannelSummary: ({ snapshot }) => buildProbeChannelStatusSummary(snapshot, { @@ -451,17 +451,15 @@ export const msteamsPlugin: ChannelPlugin - buildRuntimeAccountStatusSnapshot( - { runtime, probe }, - { - accountId: account.accountId, - enabled: account.enabled, - configured: account.configured, - port: runtime?.port ?? null, - }, - ), - }, + resolveAccountSnapshot: ({ account, runtime }) => ({ + accountId: account.accountId, + enabled: account.enabled, + configured: account.configured, + extra: { + port: runtime?.port ?? null, + }, + }), + }), gateway: { startAccount: async (ctx) => { const { monitorMSTeamsProvider } = await import("./index.js"); diff --git a/extensions/zalo/src/channel.ts b/extensions/zalo/src/channel.ts index 9e8a89d3f58..084936ad1bd 100644 --- a/extensions/zalo/src/channel.ts +++ b/extensions/zalo/src/channel.ts @@ -19,7 +19,10 @@ import { createChatChannelPlugin } from "openclaw/plugin-sdk/core"; import { createChannelDirectoryAdapter } from "openclaw/plugin-sdk/directory-runtime"; import { listResolvedDirectoryUserEntriesFromAllowFrom } from "openclaw/plugin-sdk/directory-runtime"; import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime"; -import { createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers"; +import { + createComputedAccountStatusAdapter, + createDefaultChannelRuntimeState, +} from "openclaw/plugin-sdk/status-helpers"; import { listZaloAccountIds, resolveDefaultZaloAccountId, @@ -30,7 +33,6 @@ import { zaloMessageActions } from "./actions.js"; import { ZaloConfigSchema } from "./config-schema.js"; import type { ZaloProbeResult } from "./probe.js"; import { - buildBaseAccountStatusSnapshot, buildChannelConfigSchema, buildTokenChannelStatusSummary, DEFAULT_ACCOUNT_ID, @@ -200,32 +202,27 @@ export const zaloPlugin: ChannelPlugin = }), listGroups: async () => [], }), - status: { + status: createComputedAccountStatusAdapter({ defaultRuntime: createDefaultChannelRuntimeState(DEFAULT_ACCOUNT_ID), collectStatusIssues: collectZaloStatusIssues, buildChannelSummary: ({ snapshot }) => buildTokenChannelStatusSummary(snapshot), probeAccount: async ({ account, timeoutMs }) => await (await loadZaloChannelRuntime()).probeZaloAccount({ account, timeoutMs }), - buildAccountSnapshot: ({ account, runtime }) => { + resolveAccountSnapshot: ({ account }) => { const configured = Boolean(account.token?.trim()); - return buildBaseAccountStatusSnapshot( - { - account: { - accountId: account.accountId, - name: account.name, - enabled: account.enabled, - configured, - }, - runtime, - }, - { + return { + accountId: account.accountId, + name: account.name, + enabled: account.enabled, + configured, + extra: { tokenSource: account.tokenSource, mode: account.config.webhookUrl ? "webhook" : "polling", dmPolicy: account.config.dmPolicy ?? "pairing", }, - ); + }; }, - }, + }), gateway: { startAccount: async (ctx) => await (await loadZaloChannelRuntime()).startZaloGatewayAccount(ctx),