UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

121 lines (120 loc) • 5.28 kB
import { l as normalizeOptionalString } from "./string-coerce-6kR-86XC.mjs"; import { a as asOptionalRecord } from "./record-coerce-TIsquoVR.mjs"; import { y as uniqueStrings } from "./string-normalization-YMwDjufr.mjs"; import { r as setGatewayDedupeEntry } from "./agent-job-DphPgXjG.mjs"; //#region src/gateway/agent-turn/agent-dedupe.ts var AgentRequestReservationEndedError = class extends Error { constructor() { super("Agent request reservation is no longer active."); } }; function resolveAgentDedupeKeys(params) { const keys = [`agent:${params.idempotencyKey}`]; const approvalId = params.execApprovalFollowupApprovalId?.trim(); if (approvalId) keys.push(`agent:exec-approval-followup:${approvalId}`); return uniqueStrings(keys); } function readGatewayDedupeEntry(params) { for (const key of params.keys) { const entry = params.dedupe.get(key); if (entry) return entry; } } function isAcceptedAgentDedupePayload(payload) { return typeof payload === "object" && payload !== null && payload.status === "accepted"; } function resolveAgentWaitSource(context, runId) { const activeChatEntry = context.chatAbortControllers.get(runId); if (activeChatEntry) return activeChatEntry.kind === "agent" ? "agent" : "chat"; return isAcceptedAgentDedupePayload(context.dedupe.get(`agent:${runId}`)?.payload) ? "agent" : void 0; } function isPreRegistrationAbortedAgentDedupePayload(payload) { const stopReason = payload?.stopReason; return typeof payload === "object" && payload !== null && payload.status === "timeout" && (stopReason === "rpc" || stopReason === "stop"); } function isPreRegistrationAbortedAgentDedupeEntryForSession(params) { if (!params.entry?.ok || !isPreRegistrationAbortedAgentDedupePayload(params.entry.payload)) return false; const payload = params.entry.payload; const payloadRunId = typeof payload.runId === "string" ? payload.runId.trim() : ""; if (payloadRunId && payloadRunId !== params.runId) return false; const payloadSessionKey = typeof payload.sessionKey === "string" && payload.sessionKey.trim() ? payload.sessionKey.trim() : void 0; const payloadAgentId = typeof payload.agentId === "string" && payload.agentId.trim() ? payload.agentId.trim() : void 0; if (params.agentId && payloadAgentId !== params.agentId) return false; const expectedSessionKeys = new Set([params.sessionKey, ...params.alternateSessionKeys ?? []].filter((value) => Boolean(value?.trim()))); return !payloadSessionKey || expectedSessionKeys.size === 0 || expectedSessionKeys.has(payloadSessionKey); } function setGatewayDedupeEntries(params) { for (const key of params.keys) setGatewayDedupeEntry({ dedupe: params.dedupe, key, entry: params.entry, startNewAttempt: params.startNewAttempt, session: params.session }); } function buildAbortedAgentPayload(runId, stopReason, session) { return { runId, ...session?.agentId ? { agentId: session.agentId } : {}, ...session?.sessionKey ? { sessionKey: session.sessionKey } : {}, status: "timeout", summary: "aborted", stopReason, timeoutPhase: "queue", providerStarted: false }; } function setAbortedAgentDedupeEntries(params) { setGatewayDedupeEntries({ dedupe: params.dedupe, keys: params.keys, session: params.session, entry: { ts: Date.now(), ok: true, payload: buildAbortedAgentPayload(params.runId, params.stopReason, params) } }); } function replayAgentTurnIfCached(params) { const { agentDedupeKeys, runId } = params.preflight; const cached = readGatewayDedupeEntry({ dedupe: params.context.dedupe, keys: agentDedupeKeys }); if (!cached) return false; if (params.acceptedOnly && !(cached.ok && isAcceptedAgentDedupePayload(cached.payload))) return false; if (params.acceptedOnly && isAcceptedAgentDedupePayload(cached.payload) && !cached.payload.reservationId && !params.context.chatAbortControllers.has(runId)) return false; if (cached.ok && isAcceptedAgentDedupePayload(cached.payload)) { const cachedRunId = normalizeOptionalString(cached.payload.runId) ?? runId; const cachedSessionKey = normalizeOptionalString(cached.payload.sessionKey); const cachedAgentId = normalizeOptionalString(cached.payload.agentId); const cachedRuntime = asOptionalRecord(cached.payload.runtime); const admissionPending = typeof cached.payload.reservationId === "string"; params.io.emitAcceptance([ true, { runId: cachedRunId, status: "in_flight", ...cachedSessionKey ? { sessionKey: cachedSessionKey } : {}, ...cachedAgentId ? { agentId: cachedAgentId } : {}, ...cachedRuntime ? { runtime: cachedRuntime } : {}, ...admissionPending ? { admissionPending: true } : {} }, void 0 ], { cached: true, runId: cachedRunId }); } else params.io.emitAcceptance([ cached.ok, cached.payload, cached.error ], { cached: true, ...cached.incognito && cached.error ? { errorMessage: "Incognito agent error." } : {} }); return true; } //#endregion export { readGatewayDedupeEntry as a, resolveAgentWaitSource as c, isPreRegistrationAbortedAgentDedupeEntryForSession as i, setAbortedAgentDedupeEntries as l, buildAbortedAgentPayload as n, replayAgentTurnIfCached as o, isAcceptedAgentDedupePayload as r, resolveAgentDedupeKeys as s, AgentRequestReservationEndedError as t, setGatewayDedupeEntries as u };