From dba1763c8143ac200f4632c1dde057f41257c7f7 Mon Sep 17 00:00:00 2001 From: John Lin Date: Wed, 28 Jan 2026 10:35:52 +0800 Subject: [PATCH] refactor(ringcentral): remove obsolete webhook-related code Removed webhook configuration and API methods since WebSocket is now used: - Remove webhookPath and webhookVerificationToken from config/types - Remove createRingCentralWebhookSubscription/deleteRingCentralWebhookSubscription APIs - Remove resolveRingCentralWebhookPath helper - Update blurb to say 'WebSocket' instead of 'webhooks' - Fix dmPolicy default to 'allowlist' in buildAccountSnapshot Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- extensions/ringcentral/src/api.ts | 35 --------------------- extensions/ringcentral/src/channel.ts | 16 +++------- extensions/ringcentral/src/config-schema.ts | 2 -- extensions/ringcentral/src/monitor.ts | 7 ----- extensions/ringcentral/src/types.ts | 2 -- 5 files changed, 4 insertions(+), 58 deletions(-) diff --git a/extensions/ringcentral/src/api.ts b/extensions/ringcentral/src/api.ts index 6b2311740..851642c64 100644 --- a/extensions/ringcentral/src/api.ts +++ b/extensions/ringcentral/src/api.ts @@ -163,41 +163,6 @@ export async function downloadRingCentralAttachment(params: { }; } -export async function createRingCentralWebhookSubscription(params: { - account: ResolvedRingCentralAccount; - webhookUrl: string; - eventFilters: string[]; - expiresIn?: number; -}): Promise<{ subscriptionId?: string; expiresIn?: number }> { - const { account, webhookUrl, eventFilters, expiresIn = 604799 } = params; - const platform = await getRingCentralPlatform(account); - - const body = { - eventFilters, - deliveryMode: { - transportType: "WebHook", - address: webhookUrl, - }, - expiresIn, - }; - - const response = await platform.post("/restapi/v1.0/subscription", body); - const result = (await response.json()) as { id?: string; expiresIn?: number }; - return { - subscriptionId: result.id, - expiresIn: result.expiresIn, - }; -} - -export async function deleteRingCentralWebhookSubscription(params: { - account: ResolvedRingCentralAccount; - subscriptionId: string; -}): Promise { - const { account, subscriptionId } = params; - const platform = await getRingCentralPlatform(account); - await platform.delete(`/restapi/v1.0/subscription/${subscriptionId}`); -} - export async function probeRingCentral( account: ResolvedRingCentralAccount, ): Promise<{ ok: boolean; error?: string; elapsedMs: number }> { diff --git a/extensions/ringcentral/src/channel.ts b/extensions/ringcentral/src/channel.ts index 6b9fd05b4..73709fcc2 100644 --- a/extensions/ringcentral/src/channel.ts +++ b/extensions/ringcentral/src/channel.ts @@ -29,7 +29,7 @@ import { probeRingCentral, } from "./api.js"; import { getRingCentralRuntime } from "./runtime.js"; -import { resolveRingCentralWebhookPath, startRingCentralMonitor } from "./monitor.js"; +import { startRingCentralMonitor } from "./monitor.js"; import { normalizeRingCentralTarget, isRingCentralChatTarget, @@ -90,7 +90,7 @@ export const ringcentralPlugin: ChannelPlugin = { ...meta, label: "RingCentral", selectionLabel: "RingCentral Team Messaging", - blurb: "RingCentral Team Messaging via REST API and webhooks.", + blurb: "RingCentral Team Messaging via REST API and WebSocket.", order: 56, }, pairing: { @@ -149,8 +149,6 @@ export const ringcentralPlugin: ChannelPlugin = { "clientSecret", "jwt", "server", - "webhookPath", - "webhookVerificationToken", "name", ], }), @@ -328,11 +326,9 @@ export const ringcentralPlugin: ChannelPlugin = { ...(input.jwt ? { jwt: input.jwt } : {}), }; const server = input.server?.trim(); - const webhookPath = input.webhookPath?.trim(); const configPatch = { ...patch, ...(server ? { server } : {}), - ...(webhookPath ? { webhookPath } : {}), }; if (accountId === DEFAULT_ACCOUNT_ID) { return { @@ -495,7 +491,6 @@ export const ringcentralPlugin: ChannelPlugin = { configured: snapshot.configured ?? false, credentialSource: snapshot.credentialSource ?? "none", server: snapshot.server ?? null, - webhookPath: snapshot.webhookPath ?? null, running: snapshot.running ?? false, lastStartAt: snapshot.lastStartAt ?? null, lastStopAt: snapshot.lastStopAt ?? null, @@ -512,26 +507,24 @@ export const ringcentralPlugin: ChannelPlugin = { credentialSource: account.credentialSource, server: account.server, clientId: account.clientId ? `${account.clientId.slice(0, 8)}...` : undefined, - webhookPath: account.config.webhookPath, 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", + dmPolicy: account.config.dm?.policy ?? "allowlist", probe, }), }, gateway: { startAccount: async (ctx) => { const account = ctx.account; - ctx.log?.info(`[${account.accountId}] starting RingCentral webhook`); + ctx.log?.info(`[${account.accountId}] starting RingCentral WebSocket`); ctx.setStatus({ accountId: account.accountId, running: true, lastStartAt: Date.now(), - webhookPath: resolveRingCentralWebhookPath({ account }), server: account.server, }); const unregister = await startRingCentralMonitor({ @@ -539,7 +532,6 @@ export const ringcentralPlugin: ChannelPlugin = { config: ctx.cfg as ClawdbotConfig, runtime: ctx.runtime, abortSignal: ctx.abortSignal, - webhookPath: account.config.webhookPath, statusSink: (patch) => ctx.setStatus({ accountId: account.accountId, ...patch }), }); return () => { diff --git a/extensions/ringcentral/src/config-schema.ts b/extensions/ringcentral/src/config-schema.ts index dec0854f8..6205ff557 100644 --- a/extensions/ringcentral/src/config-schema.ts +++ b/extensions/ringcentral/src/config-schema.ts @@ -27,8 +27,6 @@ const RingCentralAccountSchemaBase = z clientSecret: z.string().optional(), jwt: z.string().optional(), server: z.string().optional(), - webhookPath: z.string().optional(), - webhookVerificationToken: z.string().optional(), markdown: MarkdownConfigSchema, dmPolicy: DmPolicySchema.optional().default("allowlist"), allowFrom: z.array(z.union([z.string(), z.number()])).optional(), diff --git a/extensions/ringcentral/src/monitor.ts b/extensions/ringcentral/src/monitor.ts index 97d728ecc..2ab05556f 100644 --- a/extensions/ringcentral/src/monitor.ts +++ b/extensions/ringcentral/src/monitor.ts @@ -739,10 +739,3 @@ export async function startRingCentralMonitor( return cleanup; } - -// Keep the webhook path resolver for status display -export function resolveRingCentralWebhookPath(_params: { - account: ResolvedRingCentralAccount; -}): string { - return "(WebSocket)"; -} diff --git a/extensions/ringcentral/src/types.ts b/extensions/ringcentral/src/types.ts index 847269c70..591340b09 100644 --- a/extensions/ringcentral/src/types.ts +++ b/extensions/ringcentral/src/types.ts @@ -96,8 +96,6 @@ export type RingCentralAccountConfig = { clientSecret?: string; jwt?: string; server?: string; - webhookPath?: string; - webhookVerificationToken?: string; markdown?: MarkdownConfig; dmPolicy?: DmPolicy; allowFrom?: Array;