diff --git a/extensions/signal/src/monitor/event-handler.inbound-context.test.ts b/extensions/signal/src/monitor/event-handler.inbound-context.test.ts index 93b4f4a46cf..d9d20b5f0af 100644 --- a/extensions/signal/src/monitor/event-handler.inbound-context.test.ts +++ b/extensions/signal/src/monitor/event-handler.inbound-context.test.ts @@ -640,6 +640,13 @@ describe("signal createSignalEventHandler inbound context", () => { }, channels: { signal: { dmPolicy: "open", allowFrom: ["*"] } }, } as OpenClawConfig, + statusReactionTiming: { + debounceMs: 0, + doneHoldMs: 0, + errorHoldMs: 0, + stallSoftMs: 5_000, + stallHardMs: 15_000, + }, historyLimit: 0, }), ); @@ -715,6 +722,13 @@ describe("signal createSignalEventHandler inbound context", () => { }, channels: { signal: { dmPolicy: "open", allowFrom: ["*"] } }, } as OpenClawConfig, + statusReactionTiming: { + debounceMs: 0, + doneHoldMs: 0, + errorHoldMs: 0, + stallSoftMs: 5_000, + stallHardMs: 15_000, + }, historyLimit: 0, }), ); diff --git a/extensions/signal/src/monitor/event-handler.test-harness.ts b/extensions/signal/src/monitor/event-handler.test-harness.ts index 16888020bee..0c4fa5bb705 100644 --- a/extensions/signal/src/monitor/event-handler.test-harness.ts +++ b/extensions/signal/src/monitor/event-handler.test-harness.ts @@ -6,6 +6,13 @@ export function createBaseSignalEventHandlerDeps( ): SignalEventHandlerDeps { return { runtime: { log: () => {}, error: () => {} } as SignalEventHandlerDeps["runtime"], + statusReactionTiming: { + debounceMs: 0, + doneHoldMs: 0, + errorHoldMs: 0, + stallSoftMs: 60_000, + stallHardMs: 120_000, + }, cfg: {}, baseUrl: "http://localhost", accountId: "default", diff --git a/extensions/signal/src/monitor/event-handler.ts b/extensions/signal/src/monitor/event-handler.ts index f1b75d1a82f..afd4e1c8992 100644 --- a/extensions/signal/src/monitor/event-handler.ts +++ b/extensions/signal/src/monitor/event-handler.ts @@ -218,6 +218,7 @@ async function finalizeSignalStatusReaction(params: { } export function createSignalEventHandler(deps: SignalEventHandlerDeps) { + const statusReactionTiming = deps.statusReactionTiming ?? DEFAULT_TIMING; const activeEnqueueEntries = new WeakSet(); async function handleSignalInboundMessage(entry: SignalInboundEntry) { @@ -444,7 +445,7 @@ export function createSignalEventHandler(deps: SignalEventHandlerDeps) { }, initialEmoji: ackReaction, emojis: resolveSignalStatusReactionEmojis(statusReactionsConfig.emojis), - timing: DEFAULT_TIMING, + timing: statusReactionTiming, onError: (err) => { logAckFailure({ log: logVerbose, @@ -455,7 +456,6 @@ export function createSignalEventHandler(deps: SignalEventHandlerDeps) { }, }) : null; - const statusReactionTiming = DEFAULT_TIMING; if (statusReactionController) { void statusReactionController.setQueued(); } diff --git a/extensions/signal/src/monitor/event-handler.types.ts b/extensions/signal/src/monitor/event-handler.types.ts index f06ad25b5f2..e35991037cd 100644 --- a/extensions/signal/src/monitor/event-handler.types.ts +++ b/extensions/signal/src/monitor/event-handler.types.ts @@ -1,3 +1,4 @@ +import type { StatusReactionTiming } from "openclaw/plugin-sdk/channel-feedback"; // Signal type declarations define plugin contracts. import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts"; import type { @@ -91,6 +92,7 @@ export type SignalNativeReplyContext = { export type SignalEventHandlerDeps = { runtime: RuntimeEnv; + statusReactionTiming?: Required; abortSignal?: AbortSignal; runTrackedTask?: (task: () => Promise) => void; cfg: OpenClawConfig;