


























1+import {
2+asDateTimestampMs,
3+resolveExpiresAtMsFromDurationMs,
4+} from "openclaw/plugin-sdk/number-runtime";
15import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js";
26import { resolveFeishuRuntimeAccount } from "./accounts.js";
37import { handleFeishuMessage, type FeishuMessageEvent } from "./bot.js";
@@ -47,6 +51,7 @@ export class FeishuRetryableCardActionError extends Error {
47514852export function resetProcessedFeishuCardActionTokensForTests(): void {
4953processedCardActionTokens.clear();
54+resolvedChatTypeCache.clear();
5055}
51565257function pruneProcessedCardActionTokens(now: number): void {
@@ -185,8 +190,14 @@ const CHAT_TYPE_CACHE_TTL_MS = 30 * 60_000;
185190const CHAT_TYPE_CACHE_MAX_SIZE = 5_000;
186191187192function pruneChatTypeCache(now: number): void {
193+const validNow = asDateTimestampMs(now);
194+if (validNow === undefined) {
195+resolvedChatTypeCache.clear();
196+return;
197+}
188198for (const [key, entry] of resolvedChatTypeCache.entries()) {
189-if (entry.expiresAt <= now) {
199+const expiresAt = asDateTimestampMs(entry.expiresAt);
200+if (expiresAt === undefined || expiresAt <= validNow) {
190201resolvedChatTypeCache.delete(key);
191202}
192203}
@@ -206,6 +217,18 @@ function sanitizeLogValue(v: string): string {
206217return v.replace(/[\r\n]/g, " ").slice(0, 500);
207218}
208219220+function cacheResolvedCardActionChatType(
221+cacheKey: string,
222+value: "p2p" | "group",
223+now: number,
224+): void {
225+const expiresAt = resolveExpiresAtMsFromDurationMs(CHAT_TYPE_CACHE_TTL_MS, { nowMs: now });
226+resolvedChatTypeCache.delete(cacheKey);
227+if (expiresAt !== undefined) {
228+resolvedChatTypeCache.set(cacheKey, { value, expiresAt });
229+}
230+}
231+209232async function resolveCardActionChatType(params: {
210233event: FeishuCardActionEvent;
211234account: ReturnType<typeof resolveFeishuRuntimeAccount>;
@@ -226,9 +249,13 @@ async function resolveCardActionChatType(params: {
226249const now = Date.now();
227250pruneChatTypeCache(now);
228251const cached = resolvedChatTypeCache.get(cacheKey);
229-if (cached) {
252+const cachedExpiresAt = cached ? asDateTimestampMs(cached.expiresAt) : undefined;
253+if (cached && cachedExpiresAt !== undefined) {
230254return cached.value;
231255}
256+if (cached) {
257+resolvedChatTypeCache.delete(cacheKey);
258+}
232259233260try {
234261const response = (await createFeishuClient(params.account).im.chat.get({
@@ -239,10 +266,7 @@ async function resolveCardActionChatType(params: {
239266normalizeResolvedCardActionChatType(response.data?.chat_mode) ??
240267normalizeResolvedCardActionChatType(response.data?.chat_type);
241268if (resolvedChatType) {
242-resolvedChatTypeCache.set(cacheKey, {
243-value: resolvedChatType,
244-expiresAt: now + CHAT_TYPE_CACHE_TTL_MS,
245-});
269+cacheResolvedCardActionChatType(cacheKey, resolvedChatType, now);
246270return resolvedChatType;
247271}
248272params.log(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。