From 4ed8460418e604b1cefbbe825d65daf7cb11ec5d Mon Sep 17 00:00:00 2001 From: Vincent Koc <25068+vincentkoc@users.noreply.github.com> Date: Fri, 10 Jul 2026 06:27:08 -0700 Subject: [PATCH] fix(telegram): break spool retry import cycle --- .../src/spooled-update-retry-policy.ts | 2 +- .../telegram/src/telegram-ingress-spool.ts | 32 ++++++------------- .../src/telegram-ingress-spool.types.ts | 23 +++++++++++++ 3 files changed, 34 insertions(+), 23 deletions(-) create mode 100644 extensions/telegram/src/telegram-ingress-spool.types.ts diff --git a/extensions/telegram/src/spooled-update-retry-policy.ts b/extensions/telegram/src/spooled-update-retry-policy.ts index 1c29c7bb065a..1ec5d280cf07 100644 --- a/extensions/telegram/src/spooled-update-retry-policy.ts +++ b/extensions/telegram/src/spooled-update-retry-policy.ts @@ -7,7 +7,7 @@ import { import type { BackoffPolicy } from "openclaw/plugin-sdk/runtime-env"; import { computeBackoff } from "openclaw/plugin-sdk/runtime-env"; import { isTelegramMessageDispatchReplayForgetError } from "./message-dispatch-dedupe.js"; -import type { TelegramSpooledUpdate } from "./telegram-ingress-spool.js"; +import type { TelegramSpooledUpdate } from "./telegram-ingress-spool.types.js"; export const TELEGRAM_SPOOLED_RETRY_MAX_ATTEMPTS = 8; export const TELEGRAM_SPOOLED_RETRY_DEAD_LETTER_MIN_AGE_MS = 24 * 60 * 60 * 1000; diff --git a/extensions/telegram/src/telegram-ingress-spool.ts b/extensions/telegram/src/telegram-ingress-spool.ts index 4cf34296c5ca..37e544f27f9c 100644 --- a/extensions/telegram/src/telegram-ingress-spool.ts +++ b/extensions/telegram/src/telegram-ingress-spool.ts @@ -15,6 +15,16 @@ import { getTelegramRuntime } from "./runtime.js"; import { getTelegramSequentialKey } from "./sequential-key.js"; import { resolveSpooledUpdatePersistenceRetryDelayMs } from "./spooled-update-retry-policy.js"; import { normalizeTelegramStateAccountId } from "./state-account-id.js"; +import type { + ClaimedTelegramSpooledUpdate, + TelegramSpooledUpdate, + TelegramSpooledUpdateClaimOwner, +} from "./telegram-ingress-spool.types.js"; + +export type { + ClaimedTelegramSpooledUpdate, + TelegramSpooledUpdate, +} from "./telegram-ingress-spool.types.js"; const SPOOL_VERSION = 1; const TELEGRAM_INGRESS_SPOOL_PREFIX = "ingress-spool-"; @@ -26,13 +36,6 @@ const TELEGRAM_SPOOLED_UPDATE_COMPLETED_TTL_MS = 30 * 24 * 60 * 60 * 1000; const TELEGRAM_SPOOLED_UPDATE_COMPLETED_MAX_ENTRIES = 1000; const TELEGRAM_SPOOLED_UPDATE_PROCESS_ID = `${process.pid}:${randomUUID()}`; -type TelegramSpooledUpdateClaimOwner = { - processId: string; - processPid: number; - claimedAt: number; - claimToken?: string; -}; - type TelegramSpooledUpdatePayload = { version: number; updateId: number; @@ -40,21 +43,6 @@ type TelegramSpooledUpdatePayload = { update: unknown; }; -export type TelegramSpooledUpdate = { - updateId: number; - path: string; - update: unknown; - receivedAt: number; - attempts?: number; - lastAttemptAt?: number; - lastError?: string; - claim?: TelegramSpooledUpdateClaimOwner; -}; - -export type ClaimedTelegramSpooledUpdate = TelegramSpooledUpdate & { - pendingPath: string; -}; - export class TelegramSpooledUpdateCompletionOwnershipError extends Error { constructor(updateId: number) { super(`Telegram spooled update ${updateId} lost claim ownership before completion.`); diff --git a/extensions/telegram/src/telegram-ingress-spool.types.ts b/extensions/telegram/src/telegram-ingress-spool.types.ts new file mode 100644 index 000000000000..38903a7ac9aa --- /dev/null +++ b/extensions/telegram/src/telegram-ingress-spool.types.ts @@ -0,0 +1,23 @@ +// Telegram plugin module defines ingress spool record contracts. + +export type TelegramSpooledUpdateClaimOwner = { + processId: string; + processPid: number; + claimedAt: number; + claimToken?: string; +}; + +export type TelegramSpooledUpdate = { + updateId: number; + path: string; + update: unknown; + receivedAt: number; + attempts?: number; + lastAttemptAt?: number; + lastError?: string; + claim?: TelegramSpooledUpdateClaimOwner; +}; + +export type ClaimedTelegramSpooledUpdate = TelegramSpooledUpdate & { + pendingPath: string; +};