From 95fe282a17335ca140fec75b4c960abd69a03dea Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 7 Mar 2026 20:01:41 +0000 Subject: [PATCH] refactor: unify channel status snapshot base fields --- extensions/discord/src/channel.ts | 15 +++++------ extensions/googlechat/src/channel.ts | 39 ++++++++++++++-------------- extensions/mattermost/src/channel.ts | 37 +++++++++++++------------- extensions/slack/src/channel.ts | 15 +++++------ src/plugin-sdk/discord.ts | 5 +++- src/plugin-sdk/googlechat.ts | 1 + src/plugin-sdk/mattermost.ts | 1 + src/plugin-sdk/slack.ts | 1 + 8 files changed, 60 insertions(+), 54 deletions(-) diff --git a/extensions/discord/src/channel.ts b/extensions/discord/src/channel.ts index 04f8b5ab3a8..5744bb3d946 100644 --- a/extensions/discord/src/channel.ts +++ b/extensions/discord/src/channel.ts @@ -1,5 +1,6 @@ import { applyAccountNameToChannelSection, + buildComputedAccountStatusSnapshot, buildChannelConfigSchema, buildTokenChannelStatusSummary, collectDiscordAuditChannelIds, @@ -398,16 +399,17 @@ export const discordPlugin: ChannelPlugin = { resolveConfiguredFromCredentialStatuses(account) ?? Boolean(account.token?.trim()); const app = runtime?.application ?? (probe as { application?: unknown })?.application; const bot = runtime?.bot ?? (probe as { bot?: unknown })?.bot; - return { + const base = buildComputedAccountStatusSnapshot({ accountId: account.accountId, name: account.name, enabled: account.enabled, configured, + runtime, + probe, + }); + return { + ...base, ...projectCredentialSnapshotFields(account), - running: runtime?.running ?? false, - lastStartAt: runtime?.lastStartAt ?? null, - lastStopAt: runtime?.lastStopAt ?? null, - lastError: runtime?.lastError ?? null, connected: runtime?.connected ?? false, reconnectAttempts: runtime?.reconnectAttempts, lastConnectedAt: runtime?.lastConnectedAt ?? null, @@ -415,10 +417,7 @@ export const discordPlugin: ChannelPlugin = { lastEventAt: runtime?.lastEventAt ?? null, application: app ?? undefined, bot: bot ?? undefined, - probe, audit, - lastInboundAt: runtime?.lastInboundAt ?? null, - lastOutboundAt: runtime?.lastOutboundAt ?? null, }; }, }, diff --git a/extensions/googlechat/src/channel.ts b/extensions/googlechat/src/channel.ts index c7527652f55..8026334d21a 100644 --- a/extensions/googlechat/src/channel.ts +++ b/extensions/googlechat/src/channel.ts @@ -1,6 +1,7 @@ import { applyAccountNameToChannelSection, applySetupAccountConfigPatch, + buildComputedAccountStatusSnapshot, buildChannelConfigSchema, DEFAULT_ACCOUNT_ID, deleteAccountFromConfigSection, @@ -504,25 +505,25 @@ export const googlechatPlugin: ChannelPlugin = { lastProbeAt: snapshot.lastProbeAt ?? null, }), probeAccount: async ({ account }) => probeGoogleChat(account), - buildAccountSnapshot: ({ account, runtime, probe }) => ({ - accountId: account.accountId, - name: account.name, - enabled: account.enabled, - configured: account.credentialSource !== "none", - credentialSource: account.credentialSource, - audienceType: account.config.audienceType, - audience: account.config.audience, - webhookPath: account.config.webhookPath, - webhookUrl: account.config.webhookUrl, - running: runtime?.running ?? false, - lastStartAt: runtime?.lastStartAt ?? null, - lastStopAt: runtime?.lastStopAt ?? null, - lastError: runtime?.lastError ?? null, - lastInboundAt: runtime?.lastInboundAt ?? null, - lastOutboundAt: runtime?.lastOutboundAt ?? null, - dmPolicy: account.config.dm?.policy ?? "pairing", - probe, - }), + buildAccountSnapshot: ({ account, runtime, probe }) => { + const base = buildComputedAccountStatusSnapshot({ + accountId: account.accountId, + name: account.name, + enabled: account.enabled, + configured: account.credentialSource !== "none", + runtime, + probe, + }); + return { + ...base, + credentialSource: account.credentialSource, + audienceType: account.config.audienceType, + audience: account.config.audience, + webhookPath: account.config.webhookPath, + webhookUrl: account.config.webhookUrl, + dmPolicy: account.config.dm?.policy ?? "pairing", + }; + }, }, gateway: { startAccount: async (ctx) => { diff --git a/extensions/mattermost/src/channel.ts b/extensions/mattermost/src/channel.ts index c413e1790f9..d1a4135a92b 100644 --- a/extensions/mattermost/src/channel.ts +++ b/extensions/mattermost/src/channel.ts @@ -1,6 +1,7 @@ import { applyAccountNameToChannelSection, applySetupAccountConfigPatch, + buildComputedAccountStatusSnapshot, buildChannelConfigSchema, DEFAULT_ACCOUNT_ID, deleteAccountFromConfigSection, @@ -392,24 +393,24 @@ export const mattermostPlugin: ChannelPlugin = { } return await probeMattermost(baseUrl, token, timeoutMs); }, - buildAccountSnapshot: ({ account, runtime, probe }) => ({ - accountId: account.accountId, - name: account.name, - enabled: account.enabled, - configured: Boolean(account.botToken && account.baseUrl), - botTokenSource: account.botTokenSource, - baseUrl: account.baseUrl, - running: runtime?.running ?? false, - connected: runtime?.connected ?? false, - lastConnectedAt: runtime?.lastConnectedAt ?? null, - lastDisconnect: runtime?.lastDisconnect ?? null, - lastStartAt: runtime?.lastStartAt ?? null, - lastStopAt: runtime?.lastStopAt ?? null, - lastError: runtime?.lastError ?? null, - probe, - lastInboundAt: runtime?.lastInboundAt ?? null, - lastOutboundAt: runtime?.lastOutboundAt ?? null, - }), + buildAccountSnapshot: ({ account, runtime, probe }) => { + const base = buildComputedAccountStatusSnapshot({ + accountId: account.accountId, + name: account.name, + enabled: account.enabled, + configured: Boolean(account.botToken && account.baseUrl), + runtime, + probe, + }); + return { + ...base, + botTokenSource: account.botTokenSource, + baseUrl: account.baseUrl, + connected: runtime?.connected ?? false, + lastConnectedAt: runtime?.lastConnectedAt ?? null, + lastDisconnect: runtime?.lastDisconnect ?? null, + }; + }, }, setup: { resolveAccountId: ({ accountId }) => normalizeAccountId(accountId), diff --git a/extensions/slack/src/channel.ts b/extensions/slack/src/channel.ts index 2589a577689..39951538cf3 100644 --- a/extensions/slack/src/channel.ts +++ b/extensions/slack/src/channel.ts @@ -1,5 +1,6 @@ import { applyAccountNameToChannelSection, + buildComputedAccountStatusSnapshot, buildChannelConfigSchema, DEFAULT_ACCOUNT_ID, deleteAccountFromConfigSection, @@ -443,19 +444,17 @@ export const slackPlugin: ChannelPlugin = { "botTokenStatus", "appTokenStatus", ])) ?? isSlackAccountConfigured(account); - return { + const base = buildComputedAccountStatusSnapshot({ accountId: account.accountId, name: account.name, enabled: account.enabled, configured, - ...projectCredentialSnapshotFields(account), - running: runtime?.running ?? false, - lastStartAt: runtime?.lastStartAt ?? null, - lastStopAt: runtime?.lastStopAt ?? null, - lastError: runtime?.lastError ?? null, + runtime, probe, - lastInboundAt: runtime?.lastInboundAt ?? null, - lastOutboundAt: runtime?.lastOutboundAt ?? null, + }); + return { + ...base, + ...projectCredentialSnapshotFields(account), }; }, }, diff --git a/src/plugin-sdk/discord.ts b/src/plugin-sdk/discord.ts index d0408c604bf..458bebabdc5 100644 --- a/src/plugin-sdk/discord.ts +++ b/src/plugin-sdk/discord.ts @@ -43,4 +43,7 @@ export { unbindThreadBindingsBySessionKey, } from "../discord/monitor/thread-bindings.js"; -export { buildTokenChannelStatusSummary } from "./status-helpers.js"; +export { + buildComputedAccountStatusSnapshot, + buildTokenChannelStatusSummary, +} from "./status-helpers.js"; diff --git a/src/plugin-sdk/googlechat.ts b/src/plugin-sdk/googlechat.ts index 59bc1849119..7bdc7fb63f8 100644 --- a/src/plugin-sdk/googlechat.ts +++ b/src/plugin-sdk/googlechat.ts @@ -18,6 +18,7 @@ export { listDirectoryGroupEntriesFromMapKeys, listDirectoryUserEntriesFromAllowFrom, } from "../channels/plugins/directory-config-helpers.js"; +export { buildComputedAccountStatusSnapshot } from "./status-helpers.js"; export { buildChannelConfigSchema } from "../channels/plugins/config-schema.js"; export { resolveGoogleChatGroupRequireMention } from "../channels/plugins/group-mentions.js"; export { formatPairingApproveHint } from "../channels/plugins/helpers.js"; diff --git a/src/plugin-sdk/mattermost.ts b/src/plugin-sdk/mattermost.ts index 4df37da8dd8..88ecfa70571 100644 --- a/src/plugin-sdk/mattermost.ts +++ b/src/plugin-sdk/mattermost.ts @@ -38,6 +38,7 @@ export { applySetupAccountConfigPatch, migrateBaseNameToDefaultAccount, } from "../channels/plugins/setup-helpers.js"; +export { buildComputedAccountStatusSnapshot } from "./status-helpers.js"; export { createAccountListHelpers } from "../channels/plugins/account-helpers.js"; export type { BaseProbeResult, diff --git a/src/plugin-sdk/slack.ts b/src/plugin-sdk/slack.ts index debb4b75fea..18cf529ca45 100644 --- a/src/plugin-sdk/slack.ts +++ b/src/plugin-sdk/slack.ts @@ -24,6 +24,7 @@ export { } from "../channels/plugins/normalize/slack.js"; export { extractSlackToolSend, listSlackMessageActions } from "../slack/message-actions.js"; export { buildSlackThreadingToolContext } from "../slack/threading-tool-context.js"; +export { buildComputedAccountStatusSnapshot } from "./status-helpers.js"; export { resolveDefaultGroupPolicy,