/** * 入站 IM 消息终态投递:幂等、结构化日志、HTTP 兜底发送。 */ import type { Logger } from "./channel-log.js"; import { type InboundTrigger, type NoReplyCause, type TerminalState } from "./inbound-terminal-state.js"; import type { FirstReplyTimeoutCause } from "./user-facing-errors.js"; import type { SendMessageReply } from "./types.js"; export type TerminalSendFn = (text: string) => Promise; export declare class InboundTerminalController { private readonly messageId; private readonly groupId; private readonly sessionKey; private readonly trigger; private readonly log; private readonly logPrefix; private runId; private hasBusinessReply; private timeoutFired; private compactionShown; private compactionIncomplete; private runtimeErrorHint; private normalizerSilentSkip; private normalizerHeartbeatSkip; private normalizerSkipReasons; private localTerminalSent; private lastResolvedState; constructor(args: { messageId: string; groupId: string; sessionKey: string; trigger?: InboundTrigger; log: Logger; logPrefix: string; }); setRunId(runId: string): void; markBusinessReplySent(): void; markTimeoutFired(): void; /** OpenClaw reply normalizer 跳过 payload 时记录(onSkip reason)。 */ noteNormalizerSkip(reason: string): void; noteCompactionNotice(text: string): void; noteCompactionWsEvent(phase: "start" | "end"): void; noteRuntimeErrorFromPayload(text: string): void; noteRuntimeError(err: unknown): void; /** * 尝试发送终态 HTTP。返回是否已向 IM 发送(含此前已发送的幂等命中)。 * no_reply / timeout 等由 shouldSendTerminalHttpForState 拦截;文案为空亦不发。 */ trySendTerminal(state: TerminalState, sendFn: TerminalSendFn, extra?: { errorMessage?: string; noReplyCause?: NoReplyCause; deliverInvokeCount?: number; deliverCallCount?: number; timeoutCause?: FirstReplyTimeoutCause; }): Promise; finalizeAndDeliver(args: { sendFn: TerminalSendFn; dispatchThrew: boolean; dispatchError?: unknown; lastDeliverError?: unknown; beforeAgentRunBlocked?: boolean; deliverInvokeCount: number; deliverCallCount: number; }): Promise; getLastResolvedState(): TerminalState | undefined; getRunId(): string | undefined; didTimeoutFire(): boolean; wasTerminalDelivered(): boolean; private logTerminal; } export declare function buildTerminalSendFn(args: { sendText: (text: string, replyMeta?: SendMessageReply) => Promise; replyMeta?: SendMessageReply; isSingleChat: boolean; }): TerminalSendFn; /** cron / 工具主动推送前缀,避免与用户消息回复混淆。 */ export declare function prefixProactiveOutboundText(text: string, trigger?: "cron" | "tool"): string; //# sourceMappingURL=inbound-terminal-delivery.d.ts.map